Dashboard › craft › Distillation
5b2c2755-83e7-4784-83b3-af35caaacf6b["lore_tm_v1_xOxoEpuceWJX0FNDsRPJcAaDCqLn5QuAlHRjj5zPh_s","lore_tm_v1_186YBcXdLh8YQ2qImF9L1RDIrRjlRlnifQLzmYUfTDg","lore_tm_v1_RRVdpczwvzcgerE2zaVOne1q6jiirnO8L-MdrkDRF80","lore_tm_v1_tvwMuZN722MRQ6bQ0z-P4GW2YtKI7NXItSVDSTOpUhs","lore_tm_v1_DSgTxtQAo2XgcrZZEh7mqDe022wEfC5MYDd3fcVYlY0","lore_tm_v1_xe44YgtT08QJf0gZTCeeE_40iDl0Rn7bo0nCBHtwfq8","lore_tm_v1_CmAC9CzZtAlVDIxruvAU23XeAlujzJVz34-HLvO2QKY","lore_tm_v1_Pp75PEojZAfmY41YKwRkBgpWWGOwN2D6ECjYwiJU7H4","lore_tm_v1_S7gGTsrdCNpS3owemvz3KYg8d8IpwfUftFEmXzx-iIQ","lore_tm_v1_GHnQ2lwE3JsACUyyytIsNMowua4bsxDkN8R-yZKLSwc","lore_tm_v1_4G1dllvxw4WjHwTFOY-iRdhRMbndXCol2voKiJfxTGE","lore_tm_v1__OGCUxRlNtHI_wov8RqHxAPlYmDWRj1-p3zSQ-wEWK0","lore_tm_v1_dSOpzxCayi7_pBgb53bL66WLdywUymJNh9OhO6-WekU","lore_tm_v1_YYZehyx-X2hSDxcL8EF4GWcfl-5lnvUOjt3RcJHs2qM","lore_tm_v1_-hMlc9j4AibmITUqyakIZUsd4vybVlrDjPgmB3NYPew","lore_tm_v1_asaTxXKfzRJCGRYzO1OdM4x3dBDUEOCJIj1gbToaWEs","lore_tm_v1_zBC1SMRlZH1Ee63WpEvjlWc6QWV7EbCG_GXpDopkfJg","lore_tm_v1_bIT_5x9Ub33zNJ5h9As43lC0EjJMYldwZYnvhmvvOe4"]
Date: Sep 3, 2026
../craft-workspace-action-propagation/src/config.ts./home/byk/Code/getsentry/craft-workspace-action-propagation/src/config.ts failed because expected context ending in const workspace = workspaces[workspaceName]; was not found.../craft-workspace-action-propagation/src/config.ts.../craft-workspace-action-propagation/src/config.ts.src/config.ts lines 200–259: added pure isVersionGteMinVersion(minVersionRaw, requiredVersion) that parses versions and compares versions after withoutBuildMetadata; checkWorkspacesMinVersion(config) throws ConfigurationError unless config.minVersion >= WORKSPACES_MIN_VERSION; withoutBuildMetadata(version) removes SemVer build metadata because versionGreaterOrEqualThan rejects it. applyWorkspaceSelection(config) identifies nonempty workspaces, rejects selected workspace when none are configured, requires explicit workspace selection when workspaces exist, checks the version gate, then calls resolveWorkspaceConfig(config, _activeWorkspaceName).applyWorkspaceSelection() error behavior in src/config.ts: a supplied workspace with no defined workspaces errors --workspace "<name>" was given but no "workspaces" are defined in the configuration file.; defined workspaces without selection error with --workspace <name> (or the CRAFT_WORKSPACE env var) and the available workspace names; workspace feature gating occurs before config resolution.../craft-workspace-action-propagation/src/config.ts.src/__tests__/action.test.ts (248 lines). Action-test harness creates temporary craft, git, and gh executable stubs; records Craft calls, Git calls, GitHub issue titles, and $GITHUB_OUTPUT. craft targets emits ["github"]; gh issue list emits []; gh issue create --title records its title and emits https://github.com/getsentry/publish/issues/1.runRequestPublish(workspace, environment) executes Action step Request publish with WORKSPACE, RELEASE_BRANCH=release/1.2.3, RELEASE_PREVIOUS_TAG=1.2.2, RELEASE_SHA=abc123, RESOLVED_VERSION=1.2.3, GITHUB_REPOSITORY=getsentry/toolkit, and PUBLISH_REPO=getsentry/publish; runActionStep(stepName, workspace, environment, pathInput='.', locale='C') executes named Action steps with PATH_INPUT, WORKSPACE, and test stubs.Validate workspace; it receives PATH_INPUT=${{ inputs.path }}; Craft Prepare and Read Craft Targets receive WORKSPACE=${{ inputs.workspace }}. Validation rejects control characters (cli\tnext), bidi format character (cli\u202enext), Unicode line separator (cli\u2028next), paragraph separator (cli\u2029next), and non-ASCII (cli-é) before Git/Craft side effects; non-ASCII is also rejected under en_US.utf8.'' and cli-v2; rejects simultaneous workspace=cli and path=packages/cli before side effects; rejects cli/v2; rejects unsafe names ., .., __proto__, -foo, and --config. Existing publish-title test expects root title publish: getsentry/toolkit@1.2.3 and workspace cli title publish: getsentry/toolkit/cli@1.2.3.../craft-workspace-action-propagation/action.yml and ../craft-workspace-action-propagation/src/__tests__/action.test.ts.packages/cli, not glob patterns; Craft will perform directory-only, deterministic glob expansion and reject ambiguous matches.../craft-workspace-action-propagation/src/config.ts, ../craft-workspace-action-propagation/action.yml, and ../craft-workspace-action-propagation/src/__tests__/action.test.ts.src/__tests__/config.test.ts at line 444, in the comment for the publish-builder workspace-target contract.src/__tests__/config.test.ts: setActiveWorkspace('cli') then loadConfigurationFromString(WS_CONFIG) yields Git tag prefix cli@; switching to setActiveWorkspace('mcp') yields mcp@. Publish-builder regression verifies selected cli workspace resolves config.targets to [{ name: 'github', tagPrefix: 'cli@' }] rather than throwing the required-selection error. A workspace-only GitHub owner/repo configuration resolves config.github to { owner: 'getsentry', repo: 'toolkit' }.../craft-workspace-action-propagation/src/__tests__/config.test.ts.src/config.ts workspace glob resolution. globSync and hasMagic are imported from glob. resolveWorkspaceConfig(base, workspaceName) calls getWorkspaceConfig(workspaces, workspaceName) rather than direct key access; missing matches retain unknown-workspace errors listing getWorkspaceNamesFromConfig(base).getWorkspaceConfig() behavior in src/config.ts: rejects requested workspace values that themselves are glob patterns via isWorkspacePattern(workspaceName) returning undefined; evaluates every configured key through workspaceKeyMatches; returns the workspace only for exactly 1 matching key; throws ConfigurationError when a concrete requested path matches multiple configured workspace patterns, naming the requested path and matching keys.workspaceKeyMatches(key, workspaceName): literal configured keys require exact equality; glob-configured keys match only when getWorkspaceGlobMatches(key).includes(workspaceName). getWorkspaceNamesFromConfig(config) expands glob keys, combines literal keys, deduplicates with Set, and sorts names.getWorkspaceGlobMatches(workspaceGlob): uses config-file directory path.dirname(getConfigFilePath()) as cwd; calls globSync(workspaceGlob, { absolute: false, cwd: configDirectory, dot: true, ignore: ['**/node_modules/**'] }); retains only matches whose resolved paths pass lstatSync(...).isDirectory(); sorts results deterministically. isWorkspacePattern(name) calls hasMagic(name, { magicalBraces: true }).