Dashboard › craft › Distillation
d1e5defc-08f6-4c1f-a310-010404390712["lore_tm_v1_Qra2oFCxVh6MXxh8Rmz0PqCct8Spq252ABPLhSYaYzU","lore_tm_v1_-OVy9Q9b2F2NDzaAgt9Y5SlroOBt28NsFPtSt-SW9tE","lore_tm_v1_4IaCMqj3VJeLrfSvPsZD3r-FnhLMZGKxR2vWdLKb734","lore_tm_v1_XUbSqXAH4SSqqp4oQCuXCak8ghUVLKM5GrbB_lm7nHE","lore_tm_v1_2N4G5CNfCARQQwxTy1YK6pRzQyTPpGq7cD5K-uUgqII","lore_tm_v1_02WVjLxdoueIWF0GJAZJVjMAwBkPR4nDKC-ddIhXOUE","lore_tm_v1_x54lTaDMzO8I18Sp6idOeXbB6N7en-n7O5u_-SC7AOM","lore_tm_v1_9bCHcw9HEN5XSMvvHS2TDh7FOjg1ew2Pyb_GF5SPSv0","lore_tm_v1_b6YTtjylyB24NKEaU1itbi1E-UuekqdpR4ESy9cCwd8","lore_tm_v1_SmwylOV-aJs4hhBaPmJG8PzojYA0sxVetFbrD2lBNIo","lore_tm_v1__MMR0ZLI8LXGoZyXQW0MpwcYaX8WV8kpc98yhpJCiRw","lore_tm_v1_gy1YkgfX64GqfShRC58nPjiPq0gAMe5SYhwO-ct1t0s","lore_tm_v1_ad2ldoSV8NvTThy4M0EczrF2ycIELLG8rKCqyegLGvY","lore_tm_v1_tv5rU33ISqk1i0v6t9O16F7utG8rUIYJpWsjssnpJK4","lore_tm_v1_ivtSqPqsBJsdDFZh31F5S4JsnfSAm3BjtWhONvk76BU","lore_tm_v1_8SzCEMXwTtWf91gpo98C1ppjPqo7yzwBHwokMMKwh_Q","lore_tm_v1_e4dIoMNs2T6iOPJV1gQJuzZZUuwoBS7kSCbx2soIK7A","lore_tm_v1_HNjgy-yQw0n6I-xZasrJ0SLJWu9JXYekVNgFrbU-2vc","lore_tm_v1_7Yk0VWcmds-4QbN12kRylC4DaRTz0Ba23PRK1kI6keA","lore_tm_v1_aREQuJ7BK7VOxl7YTp95oLPyIWU9WGjeDx-3_leRO9g","lore_tm_v1_wV4Vu-Oc48Y0QR8BoAjbszo57bPsJmG353OlfzpaCiw","lore_tm_v1_wqNI_g8SwGkHkLg4cHZ1ISExEzg-tdEo3b1MprGfZJs","lore_tm_v1_ejRsXLXLe5NlHVYMkIEenPY7GVMkr4UTOps1bBISvjU","lore_tm_v1_-dnOnbgxyz8cxAWI0Y9GYIeBPbMCGtGrYP9viaYMGjI","lore_tm_v1_ZhuSo-iMepqjXuu57nrn2pqIiRMh9sxmwmNaB65EGrE"]
Date: Sep 3, 2026
package.json for @sentry/craft version 2.31.0-dev.0. Dev dependency glob is ^11.0.0; scripts include test: vitest run, typecheck: tsc --noEmit, lint: eslint --cache --cache-strategy content; Volta pins Node 24.18.0 and pnpm 10.27.0.src/commands/workspace_cmds/__tests__/list.test.ts: workspace list command mocks getWorkspaceNames() and formatJson(), tests exact configured names ['cli', 'mcp.v2'] printing ["cli","mcp.v2"], and no workspaces printing [].src/config.ts lines 270–304: getConfigFilePath() throws ConfigurationError when .craft.yml cannot be found; getConfigFileDir() returns the configuration file’s containing directory or undefined.pnpm install reported lockfile up to date and dependencies already up to date using pnpm v10.28.0; warned that build scripts for @sentry/cli@2.39.1 and esbuild@0.28.1 were ignored unless approved with pnpm approve-builds. pnpm update available: 10.28.0 → 11.25.0.src/logger.ts and src/instrument.ts.glob showed only hasMagic from the queried export and evaluated hasMagic results as true false.glob showed exports: Glob, Ignore, escape, glob, globIterate, globIterateSync, globStream, globStreamSync, globSync, hasMagic, iterate, iterateSync, stream, streamSync, sync, and unescape.src/__tests__/action.test.ts, including tests that forward ${{ inputs.workspace }} to Craft commands, reject unsafe workspace inputs before side effects, reject simultaneous path and workspace values, and use a compact workspace path in publish request titles.src/__tests__/action.test.ts lines 130–248. Action validation receives PATH_INPUT and WORKSPACE; Craft Prepare and Read Craft Targets receive WORKSPACE: ${{ inputs.workspace }}. Before side effects it rejects workspace strings containing tab, U+202E, U+2028, U+2029, and non-ASCII cli-é, including in locale en_US.utf8; accepts '' and cli-v2; rejects path packages/cli combined with workspace cli; rejects cli/v2, ., .., __proto__, -foo, and --config. Publish titles are expected as publish: getsentry/toolkit@1.2.3 for root and publish: getsentry/toolkit/cli@1.2.3 for workspace cli.src/* and ./src/* match directories src/utils, src/types, src/targets, and src/status_providers; src/**/*.ts matches src/logger.ts, src/instrument.ts, src/index.ts, and src/config.ts.src/__tests__/config.test.ts lines 1–110. Tests cover validateConfiguration() for minimal GitHub config, targets, changelog object/string, CalVer versioning (offset: 14, format: '%y.%-m'), and invalid GitHub/minVersion/changelog cases; imports workspace APIs setActiveWorkspace, getActiveWorkspace, getWorkspaceNames, and WORKSPACES_MIN_VERSION.src/__tests__/config.test.ts lines 289–414, including getWorkspaceNames() expected to return ['cli', 'mcp'].src/__tests__/config.test.ts lines 280–414. WS_CONFIG uses minVersion: ${WORKSPACES_MIN_VERSION}, top-level GitHub getsentry/toolkit, changelog CHANGELOG.md, and exact workspaces cli/mcp; cli overrides releaseBranchPrefix: release/cli and GitHub tag prefix cli@; mcp overrides releaseBranchPrefix: release/mcp, versioning calver, and tag prefix mcp@. Tests verify inherited top-level fields, stripping workspaces from resolved config, requiring a selection when workspaces exist, raw-name listing without selection, minVersion gate enforcement, unknown workspace errors, prototype-named selection rejection (constructor, toString, __proto__), and rejection of selected workspaces when no workspaces are configured.src/modules/publish-issue-title.peggy: canonical title form is publish: + optional getsentry/ + repository + optional slash-separated path + optional legacy JSON workspace suffix + @ version. PathSegment and repository characters permit [A-Za-z0-9_.-]; title parsing returns { repo, path: path || "", version, ...(workspace ? { workspace } : {}) }. Comment states path suffix is syntactic only and the controller resolves a single segment as a workspace after checkout of the CI-approved revision; legacy suffix is [workspace: <JsonString>].packages: packages/* and packages/*/ match packages/cli; packages/** and packages/**/ match both packages and packages/cli.src/utils/workspaces.ts lines 1–210. Existing workspace discovery already imports glob from glob; resolveWorkspaceGlobs(rootDir, patterns) asynchronously expands each pattern with { cwd: rootDir, absolute: true, ignore: ['**/node_modules/**'] }, reads each match’s package.json, and produces packages with absolute location, name, privacy/public-access metadata, and workspace dependency names. npm/Yarn discovery gets patterns from root package.json workspaces; Yarn is identified by yarn.lock, otherwise npm.src/schemas/project_config.ts lines 205–262. WorkspaceSchema accepts release-unit fields plus optional partial github, rejects workspace github.projectPath, and WorkspaceNameSchema rejects __proto__, ., and ... CraftProjectConfigSchema.workspaces is z.record(WorkspaceNameSchema, WorkspaceSchema); when workspaces are nonempty, top-level github.projectPath is prohibited. Existing comments describe workspace selection as --workspace <name>/CRAFT_WORKSPACE.src/config.ts lines 1–180. WORKSPACES_MIN_VERSION = '2.29.0'; active workspace is _activeWorkspaceName; setActiveWorkspace(name) sets selection and clears _configCache plus _globalGitHubConfigCache. Existing resolveWorkspaceConfig(base, workspaceName) requires an exact own key with Object.hasOwn(workspaces, workspaceName), otherwise reports available configured keys; workspace fields shallowly override base fields, github shallow-merges owner/repo, and workspaces is stripped from the resolved config.src/config.ts lines 180–271. checkWorkspacesMinVersion() requires config minVersion >= 2.29.0; build metadata is stripped before semantic-version comparison. applyWorkspaceSelection() treats nonempty workspaces as requiring an explicit active selection, errors if selection exists without configured workspaces, performs the version gate, then resolves the selected workspace. Its current diagnostic instructs --workspace <name> or CRAFT_WORKSPACE and lists exact configured workspace keys.