Dashboard › craft › Distillation
25c224b7-8698-4ab0-9ea8-a08b0581c071["lore_tm_v1_Hu9bKetXqMeqerDXJFERfzjWkiyzCIQCoGllNrpF2tw","lore_tm_v1_iiW5IGSc2ZEZ-suG84QRAiRCjsNGSYMwzZiSejH2Jv4","lore_tm_v1_PxPdTIj4nYuPnAWTkXUf4FWhwk4USZPwwa78JIH3DZQ","lore_tm_v1_E6oeULKl5lNDfsdzxdZv1SgMcIfgCEx_5MFUzxb6R_g","lore_tm_v1_afvI-dQouR7iV4LTpAiSQ682ZAnEM7jddU1U1IXPfL0","lore_tm_v1_uHl80NM9-VSFoIeG3GLWAFEp_2mdvZ07W8IWTjuigEo","lore_tm_v1_AH5x81WNU5WmmPWf5JL6CGWNGFwYNaFP-1w7Aa_5Rv4"]
Date: Aug 28, 2026
AGENTS.md: always use pnpm for package management; never use npm or yarn. Node.js is managed by Volta at v22.12.0; dependencies install via pnpm install --frozen-lockfile.pnpm build (outputs dist/craft), pnpm test, pnpm lint, and pnpm fix; manual testing command is pnpm build && ./dist/craft..prettierrc.yml; ESLint 9.x uses flat config eslint.config.mjs with typescript-eslint; unused variables prefixed _ are permitted.src/__tests__/ with *.test.ts; mocking uses vi.fn(), vi.mock(), and vi.spyOn(). Main branch is master; CI tests Node.js 20 and 22..craft.yml is the root project configuration and schemas are in src/schemas/. Dry-run destructive operations must use getGitClient()/createGitClient(directory) for Git, getGitHubClient() for GitHub, safeFs for file writes, and safeExec()/safeExecSync() for other actions; direct simple-git imports and new Octokit() are ESLint-restricted except designated wrappers.src/commands/workspace.ts: it imports Argv and CommandBuilder from yargs plus * as list from ./workspace_cmds/list; exports command = ['workspace <command>'], description 'Manage release workspaces', a builder that calls yargs.demandCommand().command(list), and a no-op handler.src/commands/workspace_cmds/, containing __tests__/ and list.ts.src/commands/workspace_cmds/list.ts: the workspace list subcommand imports getWorkspaceNames from ../../config and formatJson from ../../utils/strings; exports command = ['list'], description 'List defined release workspaces as a JSON array', and handler() that logs formatJson(getWorkspaceNames()).src/commands/workspace_cmds/__tests__/, containing list.test.ts.src/commands/workspace_cmds/__tests__/list.test.ts: Vitest mocks ../../../config (getWorkspaceNames) and ../../../utils/strings (formatJson implemented as JSON.stringify(value)). Test “prints exact configured workspace names” returns ['cli', 'mcp.v2'], invokes handler(), and expects console.log to receive '["cli","mcp.v2"]'; test “prints an empty array when no workspaces are configured” returns [] and expects '[]'.action.yml; visible validation emits ::error::The path and workspace inputs cannot be used together. and checks workspace input for Unicode control, format, line-separator, and paragraph-separator characters via /[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u. Visible later sections include workspace-conditional behavior, CRAFT_ARGS=(--config-from "$MERGE_TARGET"), a comment that issue lookup filters open issues by exact title match, target parsing for markdown lines matching - [x] targetName or - [X] targetName, and MERGE_TARGET: ${{ inputs.merge_target || '(default)' }}.minVersion.src/config.ts; visible comments/documentation state workspace application strips minVersion and workspaces from the resulting config, special-cases merging workspace GitHub settings with (base.github as GitHubGlobalConfig | undefined), validates config.minVersion against WORKSPACES_MIN_VERSION using isVersionGteMinVersion, and documents selection errors when a workspace is selected but configuration has no workspaces.src/config.ts; visible compatibility logic/comment says values such as 2.29.0+linux remain valid, throws Cannot parse the minimal version: "${minVersionRaw}" for unparsable configured minimum versions, and states the one-sided prerelease relaxation exists to allow dogfooding a new feature before its release is cut.