Dashboard › craft › Distillation
a6f246a4-b9b3-4336-82d4-2bbe29729449["lore_tm_v1_bxbw2LBicYbrSq-URSxYqqJPGUvGWJ4EbFCi-ByGJ2k","lore_tm_v1_FKm9Kap8WhKjsKqerXzEFdWW7SDMzrhZ2iwjoJJIJ6M","lore_tm_v1_tAYdzaMJ1zd8WMBag0h15o-YRzmhg07Qw6UjnR7RErk","lore_tm_v1_fQcyOG5M_pYRoe7xTCBQWPaG76OY00gHpm8fFGs_rpg","lore_tm_v1_MXySmOKA1Q_yqUWmeEvryVNg3kbd9YhvjdLifESUwBM","lore_tm_v1_5VSMEPGhGPh4SIwlfZzvJsNXiIWAMqKcimfkw66b2Mw","lore_tm_v1_dnoICcXgnY2zYM3G1khmi04MU_b89XNKXhcOQqKcf5A","lore_tm_v1_OhvdX8IeUkqgKnHdiaN9xnqELapbt4XktbJ0dn-TwA8","lore_tm_v1_BVEuGqyG1FLHsitEDWERhS_nv9HDjkPqG5W6phdnWXo","lore_tm_v1_Mkf2xNqSJGmvE6dSR-2NNn_1sTzZMksPCtLJKV448ek","lore_tm_v1_7zQ9Qg0aZSd54XbGjImuFIuUc5H-4RV8z42o0_p00wY"]
Date: Sep 3, 2026
src/modules/publish-location.js (45 lines). needsWorkspaceDiscovery({ path, workspace }) returns true only when no explicit workspace and path matches ^\.\/[A-Za-z0-9_.-]+$. resolvePublishLocation({ path, workspace, workspaceNames }) requires explicit workspaces to use root path ".", otherwise preserves paths unless compact discovery applies; it validates every discovered name with isWorkspaceName(), and transforms a matching compact ./<single-segment> path to { path: ".", workspace: <segment> }. Valid workspace names are strings other than __proto__, ., .., matching ^[A-Za-z0-9_.-]+$.action.yml lines 130–284 in craft-workspace-action-propagation. Craft install first tries /tmp/craft-artifact/dist/craft; otherwise resolves CRAFT_VERSION from CRAFT_VERSION_INPUT then ACTION_REF, downloads either GitHub latest or https://github.com/getsentry/craft/releases/download/${CRAFT_VERSION}/craft, falls back to latest if the specified release is absent, installs at /usr/local/bin/craft, and rejects an empty/missing binary. Craft Prepare and Read Craft Targets run in ${{ inputs.path }} and append --workspace=$WORKSPACE only when nonempty. Publish title construction is publish: ${GITHUB_REPOSITORY}${SUBDIRECTORY}${WORKSPACE:+/$WORKSPACE}@${RESOLVED_VERSION}, where SUBDIRECTORY is /${{ inputs.path }} unless path is ..action.yml lines 1–130. Composite action Craft Prepare Release declares optional path (default '.') and workspace (“Named Craft release workspace to prepare and publish”). Validate workspace rejects simultaneous nonempty WORKSPACE and non-root PATH_INPUT; workspace validation rejects ., .., __proto__, leading -, and non-ASCII/characters outside [A-Za-z0-9_.-], with error text requiring ASCII letters, digits, periods, underscores, and hyphens. The action downloads a dogfood artifact only for getsentry/craft using actions/download-artifact@v8 to /tmp/craft-artifact.getsentry/publish#9339 review thread 3863759773: Sentry bot identified that the prior regex accepted arbitrary escapes in legacy JSON workspace suffixes while JSON.parse(workspaceJson) accepts only valid JSON escapes; e.g. [workspace: "cli\qnext"] could throw unhandled SyntaxError. The thread says this was resolved in commit b658ffa0299fedf78c9dd9a2121cd740691ca157.getsentry/publish#9339 review thread 3916354008: Cursor Bugbot flagged high severity that one-segment path publishes would invoke craft workspace list whenever root .craft.yml exists, potentially breaking existing path-qualified releases if Publish deployed before Craft supports that command.workspace list and --rev; Publish always uses getsentry/craft:latest, and root .craft.yml compact classification must fail closed to avoid silently misrouting a compact workspace request.actions/checkout@v5 with latest actions/checkout@v7 in .github/workflows/ci-poller.yml.node -e JavaScript used by .github/workflows/publish.yml “Resolve publish location” into a file, preferably a runnable Node script, to avoid passing JavaScript through YAML and Bash.src/modules/publish-issue-title.peggy and the code block in docs/publish-issue-format.md be generated from one another so the publish-issue format has only one source of truth.src/modules/release-revision.js functionality, beginning with CHECK_RUNS_LINK, could be incorporated into the Peggy parser/language./home/byk/Code/getsentry/craft-workspace-action-propagation/node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/index.js./home/byk/Code/getsentry/craft-workspace-action-propagation/node_modules/.pnpm/glob@11.1.0/node_modules/glob/package.json.glob package manifest: version 11.1.0, ESM package with CommonJS main at ./dist/commonjs/index.js, types at ./dist/commonjs/index.d.ts, import entry ./dist/esm/index.js, and require entry ./dist/commonjs/index.js; package describes itself as “the most correct and second fastest glob implementation in JavaScript.”glob@11.1.0 CommonJS typings at node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/index.d.ts. glob() asynchronously returns Promise<string[]> by default or Promise<Path[]> with withFileTypes; globSync(), streaming, and sync/async iterators are available. The callable glob export also exposes globSync, globStream, globIterate, Glob, hasMagic, escape, and unescape.glob@11.1.0 GlobOptions.absolute documentation: setting absolute: true always receives absolute matched-file paths; setting absolute: false always returns relative paths; when unset, absolute patterns return absolute paths and other patterns are relative to cwd. This performs string path resolution only, not a realpath system call, and conflicts with withFileTypes.glob@11.1.0 GlobOptions.dot documentation: dot: true always matches dot files in normal and globstar matches; an explicit dot in a pattern portion always matches dot files.glob@11.1.0 GlobOptions typings at node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/glob.d.ts: cwd defaults to process.cwd() and accepts a string path or file:// URL; dotRelative prefixes returned relative paths with ./ (except ../ patterns); ignore patterns always operate with dot:true; follow may traverse symlinked directories for **; mark appends / to directory matches; nodir excludes directories; nocase defaults true on macOS/Windows and false elsewhere.