Dashboard › craft › Distillation
8c1c6e5f-f3ae-435d-b3ac-042be30f6bac["lore_tm_v1_fLopWaH6hZEYz-yOZUxcmlZU3CviGywl5b_rWop4AgI","lore_tm_v1_uEM3RqVDCh3oasjstG7UwtsAoCAUSgG8hJt7FvcyPlc","lore_tm_v1_PewMVgir3pjFn3QHOC4kiuwmv0xZwKAm4zQhrUq_XFc","lore_tm_v1_HIkoaVkXbGBIgp6K3LASbcuBgNG3ovWdOwrFbse01p8"]
Date: Sep 5, 2026
action.yml lines 277-367 implement publish-request issue reuse in /home/byk/Code/getsentry/craft-workspace-action-propagation/action.yml: construct title publish: ${GITHUB_REPOSITORY}${SUBDIRECTORY}${WORKSPACE:+/$WORKSPACE}@${RESOLVED_VERSION}; use gh -R "$PUBLISH_REPO" issue list --json title,url,number,body and jq exact-title filtering rather than GitHub Search API, specifically to avoid indexing delays and query-syntax edge cases; because results are newest-first, select the first duplicate-title match.action.yml preserves checked release targets when refreshing an existing publish issue: extracts only the ### Targets section through Checked targets will be skipped, recognizes markdown - [x] targetName/- [X] targetName, stores target names in associative array checked_targets for O(1) lookup, then converts matching new - [ ] targetName entries to [x]; checked targets mean already published or user-requested skip and can be unchecked to retry.action.yml builds issue body with requester @${GITHUB_ACTOR}, Merge target: ${MERGE_TARGET}, compare link https://github.com/${GITHUB_REPOSITORY}/compare/${RELEASE_PREVIOUS_TAG}...${RELEASE_BRANCH}, check-runs link https://github.com/${GITHUB_REPOSITORY}/commit/${RELEASE_SHA}/checks/, acceptance instruction for the accepted label, targets, and optional open <details> changelog section. Existing issues are updated via gh issue edit "$existing_issue_number" -R "$PUBLISH_REPO" --body "$body"; permission failure warns and retains the existing issue; otherwise new issue creation uses gh issue create -R "$PUBLISH_REPO" --title "$title" --body "$body". Both paths write issue_url to $GITHUB_OUTPUT.src/config.ts defines CONFIG_FILE_NAME = '.craft.yml', DEFAULT_RELEASE_BRANCH_NAME = 'release', and WORKSPACES_MIN_VERSION = '2.29.0'; a 2.29.0-dev.0 prerelease satisfies this workspace gate through checkMinimalConfigVersion prerelease relaxation.src/config.ts workspace-selection state uses _activeWorkspaceName; setActiveWorkspace(name) sets it and invalidates _configCache, _globalGitHubConfigCache, and _configPathCache; getActiveWorkspace() returns the active workspace name or undefined.resolveWorkspaceConfig() in src/config.ts shallowly overlays all defined selected Workspace release fields on the top-level CraftProjectConfig; arrays/objects are inherited or fully replaced rather than deep-merged. It strips workspaces from resolved output, shallow-merges github owner/repo, retains resolved.github only if both owner and repo are complete, otherwise deletes it so getGlobalGitHubConfig() may fall back to git-remote detection.src/config.ts supports literal names and glob-pattern keys (hasMagic(..., { magicalBraces: true })). getWorkspaceConfig() rejects selecting a glob expression itself, resolves a concrete workspace only if exactly one key matches, and throws ConfigurationError if multiple patterns match. getWorkspaceNamesFromConfig() expands glob keys, detects the same ambiguity across all names, and returns workspace names sorted.getWorkspaceGlobMatches() in src/config.ts validates glob safety before calling globSync(workspaceGlob, { absolute: false, cwd: root, dot: true, ignore: ['**/node_modules/**'], posix: true }); it only retains directory matches that are safe relative paths, lexically remain under repository root, resolve via realpathSync under the real repository root, and satisfy lstatSync(resolvedMatch).isDirectory().src/config.ts rejects absolute paths, backslashes, empty segments, ., .., __proto__, and segments beginning -. Literal segments require /^[A-Za-z0-9_.-]+$/; magic segments require /^[A-Za-z0-9_.?*[\]!^-]+$/. expandBraceAlternatives() and splitBraceAlternatives() recursively validate balanced, comma-separated nested brace alternatives; unbalanced braces or a brace expression with fewer than 2 choices is invalid.src/config.ts: isVersionGteMinVersion() parses configured and required versions, strips SemVer build metadata using withoutBuildMetadata() because build metadata does not affect precedence but the comparison helper rejects it, then uses versionGreaterOrEqualThan(). checkWorkspacesMinVersion() throws unless config minVersion >= 2.29.0.applyWorkspaceSelection() in src/config.ts behavior: no workspaces and no selection returns base config; selected workspace with no workspaces throws; defined workspaces with no --workspace/CRAFT_WORKSPACE selection throws and lists available workspaces; both selection and workspaces enforce WORKSPACES_MIN_VERSION then return merged selection.findConfigFile() in src/config.ts caches a found .craft.yml, searches current and parent directories up to MAX_DEPTH = 1024, accepts only paths for which existsSync(probePath) and lstatSync(probePath).isFile() are true, returns undefined at filesystem root, and logs findConfigFile: Reached maximum allowed directory depth if the bound is reached.src/schemas/project_config.ts defines WorkspaceSchema from optional releaseUnitFields; workspace github is GitHubGlobalConfigSchema.partial() but rejects github.projectPath with Workspace github.projectPath is not supported. Workspace overrides inherit omitted top-level fields, including independently overridable GitHub owner/repo.CraftProjectConfigSchema in src/schemas/project_config.ts accepts optional minVersion matching /^\d+\.\d+\.\d+.*$/ and optional workspaces: z.record(WorkspaceNameSchema, WorkspaceSchema). Its superRefine rejects any configuration combining nonempty workspaces with top-level github.projectPath, erroring Workspace configurations cannot use github.projectPath. at ['github', 'projectPath'].WorkspaceNameSchema in src/schemas/project_config.ts rejects key __proto__ because regular-object assignment would mutate its prototype instead of preserving an own entry; rejects . and ..; and requires safe ASCII workspace glob segments through isSafeWorkspaceGlob, erroring Workspace paths must use safe ASCII segments. on invalid names.