Dashboard › craft › Distillation
c98f9860-00bd-46c6-8319-0047cbddba29["lore_tm_v1_eOpuw3wgeS40KDfepsk9bnY4E6l19t9ksRlwJ9-e6sU","lore_tm_v1_HAttB3q-hbW7oMR8YV4RwB1HyhQ3dbITBQXxf2rka54","lore_tm_v1_kZEo0bGKHtHCsN0_ah-H0zLbjRtvgCSWoBlneQ_b6Uo","lore_tm_v1_mZDsHPHFeWu3Nym08cb9UOuAMQpSm2jwkqG55l94EX0","lore_tm_v1_uJIjfhzpouQnlXLcfJ_4mNcmBOcIwOKJ855n3hWHwfM","lore_tm_v1_Ml52nSXslFTBWKJBLDkdKXdp2OP32Nm5ynCO_Hu3mqs"]
Date: Sep 3, 2026
/home/byk/Code/getsentry: craft-workspace-action-propagation on branch feat/workspace-action-propagation with 5 modified files (action.yml, docs/src/content/docs/targets/github.md, src/__tests__/action.test.ts, src/__tests__/config.test.ts, src/config.ts; 187 insertions, 37 deletions), and publish-workspace-acceptance on branch feat/workspace-acceptance with 13 modified files (including .github/workflows/publish.yml, docs/publish-issue-format.md, workspace/publish modules and tests; 76 insertions, 555 deletions).action.yml workspace-input validation was changed from accepting one compact workspace name matching /^(?!\.{1,2}$)(?!__proto__$)(?!-)[A-Za-z0-9_.-]+$/ to accepting slash-delimited paths whose every segment matches /^[A-Za-z0-9_.-]+$/, is not ., .., or __proto__, and does not start with -. The validation error changed to: Workspace names must use ASCII path segments containing only letters, digits, periods, underscores, and hyphens.docs/src/content/docs/targets/github.md now defines workspace keys as literal paths or glob patterns expanded to concrete directories relative to .craft.yml; --workspace <path> / CRAFT_WORKSPACE must select one concrete path. Example keys changed from cli and mcp to packages/* and tools/mcp; craft workspace list now outputs concrete workspace paths as JSON; configured globs resolving to files and overlapping workspace keys are rejected; action publish titles carry the full concrete path.src/__tests__/action.test.ts changed action-input coverage: accepted workspace inputs are '', cli-v2, and packages/cli; rejected path-grammar inputs are cli\nnext and packages/*; rejected unsafe paths are ./packages/cli, packages/../cli, and packages/__proto__/cli. The publish-title test now runs packages/cli and expects publish: getsentry/toolkit/packages/cli@1.2.3\n rather than compact cli.src/__tests__/config.test.ts added glob-workspace coverage using temporary .craft.yml configuration with workspaces: packages/*, creating directories packages/cli and packages/mcp, expecting getWorkspaceNames() to return ['packages/cli', 'packages/mcp'], and verifying active packages/cli inherits releaseBranchPrefix: release/package.src/__tests__/config.test.ts added an overlap test for keys packages/* and packages/cli*, expecting both getWorkspaceNames() and getConfiguration(true) for active packages/cli to throw an error stating it matches multiple workspace patterns: packages/*, packages/cli*.src/config.ts now imports globSync and hasMagic from glob; workspace resolution uses getWorkspaceConfig() rather than direct key lookup. Concrete selected workspace names cannot themselves be glob patterns, literal keys match exactly, pattern keys match only if the concrete directory appears in getWorkspaceGlobMatches(), and multiple matching keys throw ConfigurationError.src/config.ts added getWorkspaceNamesFromConfig(): expands every glob workspace key, detects duplicate concrete paths matched by multiple keys, throws ConfigurationError on overlaps, and returns sorted concrete workspace names. getWorkspaceGlobMatches() runs globSync(workspaceGlob, { absolute: false, cwd: path.dirname(getConfigFilePath()), dot: true, ignore: ['**/node_modules/**'] }), filters matches using lstatSync(...).isDirectory(), and sorts results. isWorkspacePattern() uses hasMagic(name, { magicalBraces: true }).src/config.ts changed workspace-selection errors to list expanded concrete workspace names instead of raw config keys, and getWorkspaceNames() now returns expanded concrete names after validating configuration/minimum versions.src/config.ts cache behavior changed: setActiveWorkspace() also invalidates _configPathCache; findConfigFile() reuses _configPathCache only when existsSync(_configPathCache) is true, otherwise clears it before searching.