From 896c2740d36117d6396040d983dd0768526667b8 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 09:28:58 -0500 Subject: [PATCH 01/75] feat(#1990): add onboard command for brownfield setup --- .changeset/steady-mice-frolic.md | 5 + commands/gsd/onboard.md | 46 +++++ docs/COMMANDS.md | 19 ++ docs/INVENTORY.md | 2 + gsd-core/workflows/help/modes/brief.md | 3 +- gsd-core/workflows/help/modes/default.md | 3 +- gsd-core/workflows/help/modes/full.md | 10 + gsd-core/workflows/help/modes/topic.md | 2 +- gsd-core/workflows/onboard.md | 246 +++++++++++++++++++++++ skills/gsd-onboard/SKILL.md | 46 +++++ src/clusters.cts | 1 + src/command-aliases.cts | 8 + src/init-command-router.cts | 2 + src/init.cts | 216 ++++++++++++++------ src/install-profiles.cts | 2 + tests/onboard-command.test.cjs | 158 +++++++++++++++ 16 files changed, 704 insertions(+), 65 deletions(-) create mode 100644 .changeset/steady-mice-frolic.md create mode 100644 commands/gsd/onboard.md create mode 100644 gsd-core/workflows/onboard.md create mode 100644 skills/gsd-onboard/SKILL.md create mode 100644 tests/onboard-command.test.cjs diff --git a/.changeset/steady-mice-frolic.md b/.changeset/steady-mice-frolic.md new file mode 100644 index 000000000..cf3a8ba59 --- /dev/null +++ b/.changeset/steady-mice-frolic.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 1991 +--- +**`/gsd:onboard` guides brownfield setup** — existing repos now have a top-level onboarding command that routes through codebase mapping, docs ingest, project initialization, and an onboarding summary without silently overwriting planning files. diff --git a/commands/gsd/onboard.md b/commands/gsd/onboard.md new file mode 100644 index 000000000..ae2517b1c --- /dev/null +++ b/commands/gsd/onboard.md @@ -0,0 +1,46 @@ +--- +name: gsd:onboard +description: Guide existing codebase onboarding through mapping, doc ingest, and planning setup +argument-hint: "[--fast] [--text]" +allowed-tools: + - Read + - Bash + - Write + - Glob + - Grep + - Agent + - AskUserQuestion +requires: [config, new-project, map-codebase, ingest-docs] +--- + +**Copilot (VS Code):** Use `vscode_askquestions` wherever this workflow calls `AskUserQuestion`. They are equivalent — `vscode_askquestions` is the VS Code Copilot implementation of the same interactive question API. + + + +Guide brownfield onboarding for an existing codebase by routing through the existing GSD primitives in the safe order: codebase map → docs ingest → project initialization → onboarding summary. + +**Creates or confirms:** +- `.planning/codebase/` — evidence-backed codebase map from `/gsd:map-codebase` +- `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` — project setup from `/gsd:new-project` or `/gsd:ingest-docs` +- `.planning/onboarding/SUMMARY.md` — lightweight index of what was learned and the next command + +**Non-goals:** This command does not execute phases, ship work, or overwrite existing planning artifacts without an explicit gate. + + + +@~/.claude/gsd-core/workflows/onboard.md +@~/.claude/gsd-core/references/ui-brand.md +@~/.claude/gsd-core/references/gate-prompts.md + + + +Arguments: $ARGUMENTS + +Flags: +- `--fast` — prefer `/gsd:map-codebase --fast` for the mapping handoff. +- `--text` — use plain-text numbered lists instead of TUI menus. + + + +Execute the onboard workflow end-to-end. Preserve all safety gates, text-mode fallbacks, idempotency checks, and top-level handoff rules for nested interactive commands. + diff --git a/docs/COMMANDS.md b/docs/COMMANDS.md index e8f968d1b..5e25aeffd 100644 --- a/docs/COMMANDS.md +++ b/docs/COMMANDS.md @@ -58,6 +58,25 @@ Initialize a new project with deep context gathering. --- +### `/gsd-onboard` + +Guide an existing codebase through first-time GSD onboarding. The command checks repo state, routes you through codebase mapping, optional docs ingest, project initialization, and creates an onboarding summary once planning exists. + +| Flag | Description | +|------|-------------| +| `--fast` | Prefer the lightweight `/gsd-map-codebase --fast` mapping handoff | +| `--text` | Use numbered plain-text gates instead of TUI menus | + +**Prerequisites:** Existing repo or planning docs. For empty greenfield projects, use `/gsd-new-project`. +**Produces:** `.planning/codebase/` via map-codebase, `.planning/` via new-project or ingest-docs, and `.planning/onboarding/SUMMARY.md` after project setup. + +```bash +/gsd-onboard # Guided brownfield onboarding +/gsd-onboard --fast # Use lightweight codebase mapping first +``` + +--- + ### `/gsd-workspace` Manage GSD workspaces — create, list, or remove isolated workspace environments with repo copies and independent `.planning/` directories. diff --git a/docs/INVENTORY.md b/docs/INVENTORY.md index aa41acbdf..a05d6e304 100644 --- a/docs/INVENTORY.md +++ b/docs/INVENTORY.md @@ -79,6 +79,7 @@ These six routers are descriptor-only entries that the model picks first; the bo | Command | Role | Source | |---------|------|--------| | `/gsd-new-project` | Initialize a new project with deep context gathering and PROJECT.md. | [commands/gsd/new-project.md](../commands/gsd/new-project.md) | +| `/gsd-onboard` | Guide existing codebase onboarding through mapping, docs ingest, project setup, and onboarding summary. | [commands/gsd/onboard.md](../commands/gsd/onboard.md) | | `/gsd-workspace` | Manage GSD workspaces — create (`--new`), list (`--list`), or remove (`--remove`) isolated workspace environments. | [commands/gsd/workspace.md](../commands/gsd/workspace.md) | | `/gsd-discuss-phase` | Gather phase context through adaptive questioning before planning. | [commands/gsd/discuss-phase.md](../commands/gsd/discuss-phase.md) | | `/gsd-mvp-phase` | Plan a phase as a vertical MVP slice — user story, SPIDR splitting, then plan-phase. | [commands/gsd/mvp-phase.md](../commands/gsd/mvp-phase.md) | @@ -223,6 +224,7 @@ Full roster at `gsd-core/workflows/*.md`. Workflows are thin orchestrators that | `milestone-summary.md` | Milestone summary synthesis — onboarding and review artifact from milestone artifacts. | `/gsd-milestone-summary` | | `new-milestone.md` | Start a new milestone cycle — load project context, gather goals, update PROJECT.md/STATE.md. | `/gsd-new-milestone` | | `new-project.md` | Unified new-project flow — questioning, research (optional), requirements, roadmap. | `/gsd-new-project` | +| `onboard.md` | Brownfield onboarding orchestration — map codebase, ingest docs, initialize planning, summarize next step. | `/gsd-onboard` | | `new-workspace.md` | Create an isolated workspace with repo worktrees/clones and an independent `.planning/`. | `/gsd-workspace --new` | | `next.md` | Detect current project state and automatically advance to the next logical step. | `/gsd-progress --next` | | `node-repair.md` | Autonomous repair operator for failed task verification; invoked by `execute-plan`. | `execute-plan.md` (recovery) | diff --git a/gsd-core/workflows/help/modes/brief.md b/gsd-core/workflows/help/modes/brief.md index 359c32f1a..46a1cd41f 100644 --- a/gsd-core/workflows/help/modes/brief.md +++ b/gsd-core/workflows/help/modes/brief.md @@ -7,7 +7,8 @@ One-liner refresher for returning users. Output ONLY the `` content b ```text /gsd:new-project Initialize a project (greenfield) -/gsd:map-codebase Map an existing codebase (brownfield) +/gsd:onboard Onboard an existing codebase (brownfield) +/gsd:map-codebase Refresh/map codebase intelligence /gsd:plan-phase Create a phase plan /gsd:execute-phase Execute a phase /gsd:progress Where am I, what's next diff --git a/gsd-core/workflows/help/modes/default.md b/gsd-core/workflows/help/modes/default.md index 866f1d7dd..86274d63b 100644 --- a/gsd-core/workflows/help/modes/default.md +++ b/gsd-core/workflows/help/modes/default.md @@ -11,11 +11,12 @@ Plan-driven development for solo agentic work with Claude Code. GSD Core turns a ```text /gsd:new-project # Greenfield: questioning → research → requirements → roadmap +/gsd:onboard # Existing codebase: map → ingest docs → initialize planning /gsd:plan-phase 1 # Create a detailed plan for phase 1 /gsd:execute-phase 1 # Execute all plans in the phase ``` -Existing codebase? Run `/gsd:map-codebase` first to ground GSD in your code. +Existing codebase? Run `/gsd:onboard` to map the repo, ingest existing docs, and initialize planning safely. ## Common commands diff --git a/gsd-core/workflows/help/modes/full.md b/gsd-core/workflows/help/modes/full.md index a6686bbae..d571e66ca 100644 --- a/gsd-core/workflows/help/modes/full.md +++ b/gsd-core/workflows/help/modes/full.md @@ -62,6 +62,16 @@ Creates all `.planning/` artifacts: Usage: `/gsd:new-project` +**`/gsd:onboard [--fast] [--text]`** +Guide first-time onboarding for an existing codebase. + +- Detects brownfield code, existing planning docs, and partial `.planning/` state +- Routes through `/gsd:map-codebase`, `/gsd:ingest-docs`, and `/gsd:new-project` in the safe order +- Creates `.planning/onboarding/SUMMARY.md` after project setup +- Idempotent: confirms existing artifacts and does not overwrite planning silently + +Usage: `/gsd:onboard` + **`/gsd:map-codebase [--fast] [--focus ] [--query ]`** Map an existing codebase for brownfield projects. diff --git a/gsd-core/workflows/help/modes/topic.md b/gsd-core/workflows/help/modes/topic.md index d89229607..89b380263 100644 --- a/gsd-core/workflows/help/modes/topic.md +++ b/gsd-core/workflows/help/modes/topic.md @@ -9,7 +9,7 @@ Emit a section from the full reference for the topic in `$ARGUMENTS`. Read `work |---|---| | `next`, `smart-entry` | `### Smart Entry` | | `workflow`, `core`, `core-workflow` | `## Core Workflow` (entire section through end of `### Quick Mode`) | -| `init`, `new-project` | `### Project Initialization` | +| `init`, `new-project`, `onboard`, `onboarding`, `brownfield` | `### Project Initialization` | | `map`, `map-codebase` | The `/gsd:map-codebase` block under `### Project Initialization` | | `discuss`, `discuss-phase` | The `/gsd:discuss-phase` block under `### Phase Planning` | | `plan`, `planning`, `plan-phase` | `### Phase Planning` | diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md new file mode 100644 index 000000000..851a7f642 --- /dev/null +++ b/gsd-core/workflows/onboard.md @@ -0,0 +1,246 @@ + +Guide existing-codebase onboarding by sequencing the already-owned GSD primitives: +`/gsd:map-codebase`, `/gsd:ingest-docs`, and `/gsd:new-project`. The workflow is +idempotent: it confirms existing artifacts, refuses to overwrite planning data silently, +and stops with the exact next top-level command whenever a nested interactive workflow +would be unsafe. + + + +Read all files referenced by the invoking prompt's execution_context before starting. + + + + +## 1. Initialize + +Display banner: + +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + GSD ► ONBOARDING +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +``` + +Parse `$ARGUMENTS`: +- `--fast` sets `MAP_COMMAND` to `/gsd:map-codebase --fast`; otherwise `/gsd:map-codebase`. +- `--text` sets `TEXT_MODE=true`. + +Run the init projection: + +```bash +_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found. Run: npx -y @opengsd/gsd-core@latest --local" >&2; exit 1; fi +INIT=$(gsd_run init onboard) +if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi +``` + +Parse JSON fields: `planning_exists`, `project_exists`, `roadmap_exists`, `state_exists`, +`has_existing_code`, `has_package_file`, `is_brownfield`, `has_codebase_map`, +`missing_codebase_map_files`, `has_docs_candidates`, `doc_candidate_count`, +`onboarding_summary_exists`, `text_mode`, `agents_installed`, `missing_agents`, +`has_git`, `git_worktree_root`, `in_nested_subdir`. + +Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. + +## 2. Git and Existing Planning Safety + +If `has_git` is true and `in_nested_subdir` is true, warn that onboarding artifacts will +belong to the outer worktree at `git_worktree_root`. Do not run `git init` here. + +If `planning_exists` is true, do not overwrite PROJECT/ROADMAP/STATE. Onboarding is +idempotent and must only confirm or summarize existing files unless the user explicitly +runs the lower-level refresh commands. + +## 3. Codebase Mapping Gate + +If `is_brownfield` is true and `has_codebase_map` is false: + +- If `TEXT_MODE=true`, print: + +```text +Existing code was detected, but the complete .planning/codebase/ map is missing. +Missing map files: {missing_codebase_map_files} + +1. Map codebase first — run {MAP_COMMAND} to understand the repo before project setup (Recommended) +2. Skip mapping — continue with weaker onboarding context + +Enter number: +``` + +Stop and wait for the user's reply. + +- Otherwise use AskUserQuestion: + - header: "Codebase" + - question: "Existing code was detected, but the complete .planning/codebase/ map is missing. Map it first?" + - options: + - "Map codebase first" — Run `{MAP_COMMAND}` to understand the repo before project setup (Recommended) + - "Skip mapping" — Continue with weaker onboarding context + +If the user chooses mapping, do not nest the interactive map-codebase workflow. Print: + +```text +Run this top-level command first, then rerun /gsd:onboard: + +{MAP_COMMAND} +``` + +Exit. + +If the user skips mapping, continue with a warning. + +If `is_brownfield` is false and `planning_exists` is false, print: + +```text +No existing code was detected. For a greenfield project, run: + +/gsd:new-project +``` + +Exit. + +## 4. Existing Docs Gate + +If `has_docs_candidates` is true and `planning_exists` is false: + +- If `TEXT_MODE=true`, print: + +```text +Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). + +1. Ingest docs first — run /gsd:ingest-docs to bootstrap planning from existing docs (Recommended) +2. Skip docs ingest — continue to /gsd:new-project + +Enter number: +``` + +Stop and wait for the user's reply. + +- Otherwise use AskUserQuestion: + - header: "Docs" + - question: "Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). Ingest them first?" + - options: + - "Ingest docs first" — Run `/gsd:ingest-docs` to bootstrap planning from existing docs (Recommended) + - "Skip docs ingest" — Continue to `/gsd:new-project` + +If the user chooses ingest, do not nest the interactive ingest-docs workflow. Print: + +```text +Run this top-level command first, then rerun /gsd:onboard: + +/gsd:ingest-docs +``` + +Exit. + +## 5. Project Initialization Gate + +If `project_exists` is false: + +Print: + +```text +Codebase context is ready for project initialization. + +Run this top-level command, then rerun /gsd:onboard: + +/gsd:new-project +``` + +Exit. + +If `project_exists` is true, continue. If `roadmap_exists` or `state_exists` is false, +warn that `.planning/` is partial and route to `/gsd:ingest-docs --mode merge` or +`/gsd:new-project` rather than overwriting files in-place. + +## 6. Write Onboarding Summary + +Create `.planning/onboarding/SUMMARY.md` only after PROJECT.md exists. If it already +exists, update it only after confirmation; do not overwrite silently. + +Summary contents: + +```markdown +# Onboarding Summary + +**Generated:** {YYYY-MM-DD} +**Status:** Ready for GSD workflow + +## Confirmed Artifacts + +- Project: .planning/PROJECT.md +- Roadmap: .planning/ROADMAP.md +- State: .planning/STATE.md +- Codebase map: .planning/codebase/ + +## Codebase Map + +- STACK.md +- ARCHITECTURE.md +- STRUCTURE.md +- CONVENTIONS.md +- TESTING.md +- INTEGRATIONS.md +- CONCERNS.md + +## Existing Docs + +Detected planning docs: {doc_candidate_count} + +## Recommended Next Step + +/gsd:discuss-phase 1 +``` + +Commit the summary if `commit_docs` is true: + +```bash +gsd_run query commit "docs: create onboarding summary" --files .planning/onboarding/SUMMARY.md +``` + +## 7. Final Status + +Print: + +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + GSD ► ONBOARDING COMPLETE ✓ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Created / confirmed: +- .planning/codebase/ +- .planning/PROJECT.md +- .planning/REQUIREMENTS.md +- .planning/ROADMAP.md +- .planning/STATE.md +- .planning/onboarding/SUMMARY.md + +─────────────────────────────────────────────────────────────── + +## ▶ Next Up + +**Discuss Phase 1** — capture implementation decisions before planning. + +`/gsd:discuss-phase 1` + +─────────────────────────────────────────────────────────────── + +**Also available:** +- `/gsd:map-codebase` — refresh the codebase map after significant changes +- `/gsd:ingest-docs --mode merge` — merge new ADR/PRD/SPEC docs into planning +- `/gsd:progress` — inspect current workflow state + +─────────────────────────────────────────────────────────────── +``` + + + + +- [ ] Existing codebase detected before project initialization +- [ ] Missing codebase map routes to `/gsd:map-codebase` or `/gsd:map-codebase --fast` +- [ ] Existing planning docs route to `/gsd:ingest-docs` +- [ ] Missing project setup routes to `/gsd:new-project` +- [ ] Existing `.planning/` files are not overwritten silently +- [ ] Text mode stops and waits at numbered-list gates +- [ ] `.planning/onboarding/SUMMARY.md` is created only after PROJECT.md exists +- [ ] User sees next command + diff --git a/skills/gsd-onboard/SKILL.md b/skills/gsd-onboard/SKILL.md new file mode 100644 index 000000000..3625c3ef1 --- /dev/null +++ b/skills/gsd-onboard/SKILL.md @@ -0,0 +1,46 @@ +--- +name: gsd-onboard +description: "Guide existing codebase onboarding through mapping, doc ingest, and planning setup" +argument-hint: "[--fast] [--text]" +allowed-tools: + - Read + - Bash + - Write + - Glob + - Grep + - Agent + - AskUserQuestion +--- + + +**Copilot (VS Code):** Use `vscode_askquestions` wherever this workflow calls `AskUserQuestion`. They are equivalent — `vscode_askquestions` is the VS Code Copilot implementation of the same interactive question API. + + + +Guide brownfield onboarding for an existing codebase by routing through the existing GSD primitives in the safe order: codebase map → docs ingest → project initialization → onboarding summary. + +**Creates or confirms:** +- `.planning/codebase/` — evidence-backed codebase map from `/gsd-map-codebase` +- `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` — project setup from `/gsd-new-project` or `/gsd-ingest-docs` +- `.planning/onboarding/SUMMARY.md` — lightweight index of what was learned and the next command + +**Non-goals:** This command does not execute phases, ship work, or overwrite existing planning artifacts without an explicit gate. + + + +@~/.claude/gsd-core/workflows/onboard.md +@~/.claude/gsd-core/references/ui-brand.md +@~/.claude/gsd-core/references/gate-prompts.md + + + +Arguments: $ARGUMENTS + +Flags: +- `--fast` — prefer `/gsd-map-codebase --fast` for the mapping handoff. +- `--text` — use plain-text numbered lists instead of TUI menus. + + + +Execute the onboard workflow end-to-end. Preserve all safety gates, text-mode fallbacks, idempotency checks, and top-level handoff rules for nested interactive commands. + diff --git a/src/clusters.cts b/src/clusters.cts index 2ea92abfd..7ba2ff05b 100644 --- a/src/clusters.cts +++ b/src/clusters.cts @@ -33,6 +33,7 @@ export const CLUSTERS: ClusterMap = Object.freeze({ core_loop: Object.freeze([ 'next', 'new-project', + 'onboard', 'discuss-phase', 'plan-phase', 'execute-phase', diff --git a/src/command-aliases.cts b/src/command-aliases.cts index 9df935e33..19c2a36be 100644 --- a/src/command-aliases.cts +++ b/src/command-aliases.cts @@ -296,6 +296,14 @@ export const INIT_COMMAND_ALIASES: CommandAlias[] = [ "subcommand": "new-milestone", "mutation": false }, + { + "canonical": "init.onboard", + "aliases": [ + "init onboard" + ], + "subcommand": "onboard", + "mutation": false + }, { "canonical": "init.quick", "aliases": [ diff --git a/src/init-command-router.cts b/src/init-command-router.cts index 317ce0059..29b84ea59 100644 --- a/src/init-command-router.cts +++ b/src/init-command-router.cts @@ -28,6 +28,7 @@ interface InitModule { cmdInitPlanPhase(cwd: string, phase: string | undefined, raw: boolean, opts: Record): void; cmdInitNewProject(cwd: string, raw: boolean): void; cmdInitNewMilestone(cwd: string, raw: boolean): void; + cmdInitOnboard(cwd: string, raw: boolean): void; cmdInitQuick(cwd: string, name: string, raw: boolean): void; cmdInitIngestDocs(cwd: string, raw: boolean): void; cmdInitResume(cwd: string, raw: boolean): void; @@ -71,6 +72,7 @@ function routeInitCommand({ init, args, cwd, raw, error }: RouteInitCommandOptio }, 'new-project': () => init.cmdInitNewProject(cwd, raw), 'new-milestone': () => init.cmdInitNewMilestone(cwd, raw), + onboard: () => init.cmdInitOnboard(cwd, raw), quick: () => init.cmdInitQuick(cwd, args.slice(2).join(' '), raw), 'ingest-docs': () => init.cmdInitIngestDocs(cwd, raw), resume: () => init.cmdInitResume(cwd, raw), diff --git a/src/init.cts b/src/init.cts index 1b9de1cb0..a533d65fd 100644 --- a/src/init.cts +++ b/src/init.cts @@ -86,6 +86,106 @@ void stripShippedMilestones; // Accept all bold/colon variants of the Requirements header (#2769) const REQUIREMENTS_HEADER_RE = /^\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]*)$/m; +const CODE_EXTENSIONS = new Set([ + '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', '.swift', '.java', + '.kt', '.kts', '.c', '.cpp', '.cc', '.h', '.hpp', '.cs', '.rb', '.php', '.dart', + '.m', '.mm', '.scala', '.groovy', '.lua', '.r', '.R', '.zig', '.ex', '.exs', '.clj', +]); + +const CODE_SCAN_SKIP_DIRS = new Set([ + 'node_modules', '.git', '.planning', '.claude', '.codex', '__pycache__', 'target', + 'dist', 'build', '.next', '.nuxt', '.svelte-kit', 'coverage', 'vendor', '.venv', 'venv', +]); + +const PACKAGE_FILES = [ + 'package.json', 'requirements.txt', 'pyproject.toml', 'Cargo.toml', 'go.mod', + 'Package.swift', 'build.gradle', 'build.gradle.kts', 'pom.xml', 'Gemfile', + 'composer.json', 'pubspec.yaml', 'CMakeLists.txt', 'Makefile', 'build.zig', + 'mix.exs', 'project.clj', +]; + +const REQUIRED_CODEBASE_MAP_FILES = [ + 'STACK.md', 'ARCHITECTURE.md', 'STRUCTURE.md', 'CONVENTIONS.md', 'TESTING.md', + 'INTEGRATIONS.md', 'CONCERNS.md', +]; + +function hasCodeFilesInternal(dir: string, depth = 0): boolean { + if (depth > 3) return false; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return false; + } + + for (const entry of entries) { + if (entry.isFile() && CODE_EXTENSIONS.has(path.extname(entry.name))) return true; + if (entry.isDirectory() && !CODE_SCAN_SKIP_DIRS.has(entry.name)) { + if (hasCodeFilesInternal(path.join(dir, entry.name), depth + 1)) return true; + } + } + + return false; +} + +function hasPackageFileInternal(cwd: string): boolean { + return PACKAGE_FILES.some((file) => pathExistsInternal(cwd, file)); +} + +function listPlanningDocCandidates(cwd: string): string[] { + const roots = ['docs', 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfcs']; + const candidates = new Set(); + + const visit = (dir: string, relDir: string, depth: number): void => { + if (depth > 3) return; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + + for (const entry of entries) { + const rel = relDir ? `${relDir}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + if (!CODE_SCAN_SKIP_DIRS.has(entry.name)) { + visit(path.join(dir, entry.name), rel, depth + 1); + } + continue; + } + + if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue; + const upperName = entry.name.toUpperCase(); + const relLower = rel.toLowerCase(); + if ( + /(^|[-_ ])(ADR|PRD|SPEC|RFC)([-_ ]|\.)/i.test(entry.name) || + /^\d{4}[-_].+\.md$/i.test(entry.name) || + relLower.includes('/adr') || + relLower.includes('/prd') || + relLower.includes('/spec') || + upperName === 'REQUIREMENTS.md' + ) { + candidates.add(toPosixPath(rel)); + } + } + }; + + for (const root of roots) { + const full = path.join(cwd, root); + if (fs.existsSync(full)) visit(full, root, 0); + } + + return [...candidates].sort(); +} + +function listCodebaseMapFiles(cwd: string): string[] { + const codebaseDir = path.join(planningRoot(cwd), 'codebase'); + if (!fs.existsSync(codebaseDir)) return []; + return REQUIRED_CODEBASE_MAP_FILES.filter((file) => + fs.existsSync(path.join(codebaseDir, file)), + ); +} + function listPhaseSummaryFiles(phaseDir: string): string[] { return (scanPhasePlans(phaseDir) as unknown as Record)['summaryFiles']; } @@ -625,68 +725,8 @@ function cmdInitNewProject(cwd: string, raw: boolean): void { const exaKeyFile = path.join(homedir, '.gsd', 'exa_api_key'); const hasExaSearch = !!(process.env['EXA_API_KEY'] || fs.existsSync(exaKeyFile)); - let hasCode = false; - let hasPackageFile = false; - try { - const codeExtensions = new Set([ - '.ts', '.js', '.py', '.go', '.rs', '.swift', '.java', - '.kt', '.kts', - '.c', '.cpp', '.h', - '.cs', - '.rb', - '.php', - '.dart', - '.m', '.mm', - '.scala', - '.groovy', - '.lua', - '.r', '.R', - '.zig', - '.ex', '.exs', - '.clj', - ]); - const skipDirs = new Set([ - 'node_modules', '.git', '.planning', '.claude', '.codex', - '__pycache__', 'target', 'dist', 'build', - ]); - function findCodeFiles(dir: string, depth: number): boolean { - if (depth > 3) return false; - let entries: fs.Dirent[]; - try { - entries = fs.readdirSync(dir, { withFileTypes: true }); - } catch { - return false; - } - for (const entry of entries) { - if (entry.isFile() && codeExtensions.has(path.extname(entry.name))) return true; - if (entry.isDirectory() && !skipDirs.has(entry.name)) { - if (findCodeFiles(path.join(dir, entry.name), depth + 1)) return true; - } - } - return false; - } - hasCode = findCodeFiles(cwd, 0); - } catch { - /* intentionally empty — best-effort detection */ - } - - hasPackageFile = - pathExistsInternal(cwd, 'package.json') || - pathExistsInternal(cwd, 'requirements.txt') || - pathExistsInternal(cwd, 'Cargo.toml') || - pathExistsInternal(cwd, 'go.mod') || - pathExistsInternal(cwd, 'Package.swift') || - pathExistsInternal(cwd, 'build.gradle') || - pathExistsInternal(cwd, 'build.gradle.kts') || - pathExistsInternal(cwd, 'pom.xml') || - pathExistsInternal(cwd, 'Gemfile') || - pathExistsInternal(cwd, 'composer.json') || - pathExistsInternal(cwd, 'pubspec.yaml') || - pathExistsInternal(cwd, 'CMakeLists.txt') || - pathExistsInternal(cwd, 'Makefile') || - pathExistsInternal(cwd, 'build.zig') || - pathExistsInternal(cwd, 'mix.exs') || - pathExistsInternal(cwd, 'project.clj'); + const hasCode = hasCodeFilesInternal(cwd); + const hasPackageFile = hasPackageFileInternal(cwd); const result: Record = { researcher_model: resolveModelInternal(cwd, 'gsd-project-researcher'), @@ -840,6 +880,57 @@ function cmdInitIngestDocs(cwd: string, raw: boolean): void { output(withProjectRoot(cwd, result), raw); } +function cmdInitOnboard(cwd: string, raw: boolean): void { + const config = loadConfig(cwd); + const codebaseMapFiles = listCodebaseMapFiles(cwd); + const missingCodebaseMapFiles = REQUIRED_CODEBASE_MAP_FILES.filter( + (file) => !codebaseMapFiles.includes(file), + ); + const docCandidates = listPlanningDocCandidates(cwd); + const hasCode = hasCodeFilesInternal(cwd); + const hasPackageFile = hasPackageFileInternal(cwd); + const isBrownfield = hasCode || hasPackageFile; + const hasCodebaseMap = codebaseMapFiles.length === REQUIRED_CODEBASE_MAP_FILES.length; + + const result: Record = { + commit_docs: config.commit_docs, + text_mode: + !!config.text_mode || !!((config.workflow ?? {}) as Record)['text_mode'], + + project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'), + planning_exists: fs.existsSync(planningRoot(cwd)), + roadmap_exists: fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')), + state_exists: fs.existsSync(path.join(planningDir(cwd), 'STATE.md')), + config_exists: fs.existsSync(path.join(planningDir(cwd), 'config.json')), + + has_existing_code: hasCode, + has_package_file: hasPackageFile, + is_brownfield: isBrownfield, + needs_codebase_map: isBrownfield && !hasCodebaseMap, + has_codebase_map: hasCodebaseMap, + codebase_dir_exists: fs.existsSync(path.join(planningRoot(cwd), 'codebase')), + codebase_map_files_present: codebaseMapFiles, + missing_codebase_map_files: missingCodebaseMapFiles, + + has_docs_candidates: docCandidates.length > 0, + doc_candidate_count: docCandidates.length, + doc_candidates: docCandidates, + + onboarding_summary_exists: pathExistsInternal(cwd, '.planning/onboarding/SUMMARY.md'), + onboarding_summary_path: '.planning/onboarding/SUMMARY.md', + + project_path: '.planning/PROJECT.md', + roadmap_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'ROADMAP.md'))), + state_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'STATE.md'))), + codebase_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'codebase'))), + onboarding_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'onboarding'))), + + ...getInitGitState(cwd), + }; + + output(withProjectRoot(cwd, result), raw); +} + function cmdInitResume(cwd: string, raw: boolean): void { const config = loadConfig(cwd); @@ -2606,6 +2697,7 @@ export = { cmdInitNewMilestone, cmdInitQuick, cmdInitIngestDocs, + cmdInitOnboard, cmdInitResume, cmdInitVerifyWork, cmdInitPhaseOp, diff --git a/src/install-profiles.cts b/src/install-profiles.cts index 90674c367..5db870050 100644 --- a/src/install-profiles.cts +++ b/src/install-profiles.cts @@ -40,6 +40,7 @@ const { const PROFILES = Object.freeze({ core: Object.freeze([ 'new-project', + 'onboard', 'discuss-phase', 'plan-phase', 'execute-phase', @@ -51,6 +52,7 @@ const PROFILES = Object.freeze({ standard: Object.freeze([ // Core loop 'new-project', + 'onboard', 'discuss-phase', 'plan-phase', 'execute-phase', diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs new file mode 100644 index 000000000..a7903fe90 --- /dev/null +++ b/tests/onboard-command.test.cjs @@ -0,0 +1,158 @@ +// allow-test-rule: source-text-is-the-product +// Command/workflow markdown is deployed runtime product; source-text assertions +// below verify the installed command contract. CLI assertions exercise real +// gsd-tools behavior through the public command boundary. + +const { describe, test, beforeEach, afterEach } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('fs'); +const path = require('path'); +const { runGsdTools, cleanup } = require('./helpers.cjs'); +const { createFixture } = require('./fixtures/index.cjs'); + +const ROOT = path.join(__dirname, '..'); +const CMD_PATH = path.join(ROOT, 'commands', 'gsd', 'onboard.md'); +const WF_PATH = path.join(ROOT, 'gsd-core', 'workflows', 'onboard.md'); + +describe('init onboard public CLI projection', () => { + let tmpDir; + + beforeEach(() => { + tmpDir = createFixture({ planning: false, projectDoc: false }); + }); + + afterEach(() => { + cleanup(tmpDir); + }); + + test('reports brownfield code, docs, and missing planning state', () => { + fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'src', 'server.ts'), 'export const server = true;\n'); + fs.mkdirSync(path.join(tmpDir, 'docs', 'adr'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'docs', 'adr', '0001-runtime.md'), '# ADR: Runtime\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.planning_exists, false); + assert.strictEqual(parsed.project_exists, false); + assert.strictEqual(parsed.has_existing_code, true); + assert.strictEqual(parsed.has_codebase_map, false); + assert.strictEqual(parsed.has_docs_candidates, true); + assert.strictEqual(parsed.doc_candidate_count, 1); + assert.deepStrictEqual(parsed.codebase_map_files_present, []); + assert.ok(parsed.doc_candidates.includes('docs/adr/0001-runtime.md')); + for (const file of ['STACK.md', 'ARCHITECTURE.md', 'STRUCTURE.md', 'CONVENTIONS.md', 'TESTING.md', 'INTEGRATIONS.md', 'CONCERNS.md']) { + assert.ok(parsed.missing_codebase_map_files.includes(file), `missing map files should include ${file}`); + } + assert.strictEqual(parsed.onboarding_summary_exists, false); + assert.strictEqual(parsed.text_mode, false); + }); + + test('reports complete codebase map and onboarding summary in existing planning', () => { + fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'ARCHITECTURE', 'STRUCTURE', 'CONVENTIONS', 'TESTING', 'INTEGRATIONS', 'CONCERNS']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } + fs.mkdirSync(path.join(tmpDir, '.planning', 'onboarding'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, '.planning', 'onboarding', 'SUMMARY.md'), '# Onboarding Summary\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), '# Roadmap\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'STATE.md'), '# State\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'config.json'), JSON.stringify({ workflow: { text_mode: true } })); + + const trackedFiles = [ + path.join(tmpDir, '.planning', 'PROJECT.md'), + path.join(tmpDir, '.planning', 'ROADMAP.md'), + path.join(tmpDir, '.planning', 'STATE.md'), + path.join(tmpDir, '.planning', 'onboarding', 'SUMMARY.md'), + ]; + const before = new Map(trackedFiles.map(file => [file, fs.readFileSync(file, 'utf8')])); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + for (const file of trackedFiles) { + assert.strictEqual(fs.readFileSync(file, 'utf8'), before.get(file), `${path.basename(file)} must not be mutated by init onboard`); + } + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.planning_exists, true); + assert.strictEqual(parsed.project_exists, true); + assert.strictEqual(parsed.roadmap_exists, true); + assert.strictEqual(parsed.state_exists, true); + assert.strictEqual(parsed.has_codebase_map, true); + assert.deepStrictEqual(parsed.missing_codebase_map_files, []); + assert.strictEqual(parsed.onboarding_summary_exists, true); + assert.strictEqual(parsed.onboarding_summary_path, '.planning/onboarding/SUMMARY.md'); + assert.strictEqual(parsed.text_mode, true); + }); + + test('ignores generated and vendor directories when detecting existing code', () => { + fs.mkdirSync(path.join(tmpDir, 'node_modules', 'pkg'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'node_modules', 'pkg', 'index.ts'), 'export const ignored = true;\n'); + fs.mkdirSync(path.join(tmpDir, 'dist'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'dist', 'bundle.js'), 'console.log("ignored");\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.has_existing_code, false); + assert.strictEqual(parsed.has_package_file, false); + assert.strictEqual(parsed.is_brownfield, false); + assert.strictEqual(parsed.needs_codebase_map, false); + }); + + test('treats package manifests as brownfield even without source files', () => { + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.has_existing_code, false); + assert.strictEqual(parsed.has_package_file, true); + assert.strictEqual(parsed.is_brownfield, true); + assert.strictEqual(parsed.needs_codebase_map, true); + }); + + test('dotted query init.onboard matches direct init onboard', () => { + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + + const direct = runGsdTools(['init', 'onboard', '--raw'], tmpDir, { HOME: tmpDir }); + const query = runGsdTools(['query', 'init.onboard', '--raw'], tmpDir, { HOME: tmpDir }); + assert.equal(direct.success, true, direct.error || direct.output); + assert.equal(query.success, true, query.error || query.output); + assert.deepStrictEqual(JSON.parse(query.output), JSON.parse(direct.output)); + }); + +}); + +describe('/gsd:onboard command contract', () => { + test('command file declares the onboard command and loads its workflow', () => { + const content = fs.readFileSync(CMD_PATH, 'utf8'); + assert.match(content, /^name:\s*gsd:onboard$/m); + assert.match(content, /^description:\s*.*(?:existing codebase|brownfield|onboard).*$/mi); + assert.match(content, /^\s*- AskUserQuestion$/m); + assert.match(content, /^\s*- Agent$/m); + assert.ok(content.includes('@~/.claude/gsd-core/workflows/onboard.md')); + assert.ok(content.includes('@~/.claude/gsd-core/references/ui-brand.md')); + assert.ok(content.includes('@~/.claude/gsd-core/references/gate-prompts.md')); + }); + + test('workflow routes through existing primitives and protects existing planning', () => { + const content = fs.readFileSync(WF_PATH, 'utf8'); + + assert.ok(content.includes('init onboard'), 'workflow must use init onboard projection'); + assert.ok(content.includes('map-codebase'), 'workflow must route to map-codebase'); + assert.ok(content.includes('ingest-docs'), 'workflow must route to ingest-docs'); + assert.ok(content.includes('new-project'), 'workflow must route to new-project'); + assert.ok(content.includes('.planning/onboarding/SUMMARY.md'), 'workflow must create onboarding summary'); + assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); + assert.ok(content.includes('--text'), 'workflow must document text-mode fallback'); + assert.ok(!content.includes('execute-phase'), 'onboarding must not execute implementation phases'); + assert.ok(!content.includes('gsd:ship'), 'onboarding must not ship work'); + }); +}); From e0196d53697d3e536366e44bb012b84177fc51a0 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 09:38:22 -0500 Subject: [PATCH 02/75] no-mistakes(review): Fix onboarding artifact status --- gsd-core/workflows/onboard.md | 43 +++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 851a7f642..9fef9229f 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -36,9 +36,9 @@ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi Parse JSON fields: `planning_exists`, `project_exists`, `roadmap_exists`, `state_exists`, `has_existing_code`, `has_package_file`, `is_brownfield`, `has_codebase_map`, -`missing_codebase_map_files`, `has_docs_candidates`, `doc_candidate_count`, -`onboarding_summary_exists`, `text_mode`, `agents_installed`, `missing_agents`, -`has_git`, `git_worktree_root`, `in_nested_subdir`. +`codebase_map_files_present`, `missing_codebase_map_files`, `has_docs_candidates`, +`doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `agents_installed`, +`missing_agents`, `has_git`, `git_worktree_root`, `in_nested_subdir`. Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. @@ -148,9 +148,25 @@ Run this top-level command, then rerun /gsd:onboard: Exit. -If `project_exists` is true, continue. If `roadmap_exists` or `state_exists` is false, -warn that `.planning/` is partial and route to `/gsd:ingest-docs --mode merge` or -`/gsd:new-project` rather than overwriting files in-place. +If `project_exists` is true and either `roadmap_exists` or `state_exists` is false, print: + +```text +Existing PROJECT.md was found, but planning is incomplete. + +Planning file status: +- ROADMAP.md: {roadmap_exists ? "present" : "missing"} +- STATE.md: {state_exists ? "present" : "missing"} + +Run one of these top-level commands, then rerun /gsd:onboard: + +/gsd:ingest-docs --mode merge +/gsd:new-project +``` + +Exit. Do not write `.planning/onboarding/SUMMARY.md` and do not print the onboarding +complete status for partial planning. + +If `project_exists`, `roadmap_exists`, and `state_exists` are all true, continue. ## 6. Write Onboarding Summary @@ -165,15 +181,17 @@ Summary contents: **Generated:** {YYYY-MM-DD} **Status:** Ready for GSD workflow -## Confirmed Artifacts +## Artifact Status - Project: .planning/PROJECT.md - Roadmap: .planning/ROADMAP.md - State: .planning/STATE.md -- Codebase map: .planning/codebase/ +- Codebase map: {has_codebase_map ? ".planning/codebase/ (complete)" : ".planning/codebase/ (incomplete or skipped)"} ## Codebase Map +{if has_codebase_map} +Confirmed files: - STACK.md - ARCHITECTURE.md - STRUCTURE.md @@ -181,6 +199,11 @@ Summary contents: - TESTING.md - INTEGRATIONS.md - CONCERNS.md +{else} +Present files: {codebase_map_files_present} +Missing files: {missing_codebase_map_files} +Context strength: weaker because codebase mapping was skipped or is incomplete. +{endif} ## Existing Docs @@ -206,8 +229,8 @@ Print: GSD ► ONBOARDING COMPLETE ✓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Created / confirmed: -- .planning/codebase/ +Created / confirmed / status: +- .planning/codebase/ {has_codebase_map ? "(complete)" : "(incomplete or skipped; missing: {missing_codebase_map_files})"} - .planning/PROJECT.md - .planning/REQUIREMENTS.md - .planning/ROADMAP.md From 6b0b5f1b2c416ffca29133b625b3a44661eb3fa7 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 09:45:08 -0500 Subject: [PATCH 03/75] no-mistakes(review): Fix onboard planning detection --- gsd-core/workflows/onboard.md | 15 +++++++++----- src/init.cts | 13 +++++++++--- tests/onboard-command.test.cjs | 36 ++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 9fef9229f..f2702a8aa 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -34,8 +34,9 @@ INIT=$(gsd_run init onboard) if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi ``` -Parse JSON fields: `planning_exists`, `project_exists`, `roadmap_exists`, `state_exists`, -`has_existing_code`, `has_package_file`, `is_brownfield`, `has_codebase_map`, +Parse JSON fields: `planning_exists`, `project_exists`, `requirements_exists`, +`roadmap_exists`, `state_exists`, `has_existing_code`, `has_package_file`, +`is_brownfield`, `has_codebase_map`, `codebase_map_files_present`, `missing_codebase_map_files`, `has_docs_candidates`, `doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `agents_installed`, `missing_agents`, `has_git`, `git_worktree_root`, `in_nested_subdir`. @@ -148,12 +149,14 @@ Run this top-level command, then rerun /gsd:onboard: Exit. -If `project_exists` is true and either `roadmap_exists` or `state_exists` is false, print: +If `project_exists` is true and either `requirements_exists`, `roadmap_exists`, or +`state_exists` is false, print: ```text Existing PROJECT.md was found, but planning is incomplete. Planning file status: +- REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} - ROADMAP.md: {roadmap_exists ? "present" : "missing"} - STATE.md: {state_exists ? "present" : "missing"} @@ -166,7 +169,8 @@ Run one of these top-level commands, then rerun /gsd:onboard: Exit. Do not write `.planning/onboarding/SUMMARY.md` and do not print the onboarding complete status for partial planning. -If `project_exists`, `roadmap_exists`, and `state_exists` are all true, continue. +If `project_exists`, `requirements_exists`, `roadmap_exists`, and `state_exists` are all +true, continue. ## 6. Write Onboarding Summary @@ -184,6 +188,7 @@ Summary contents: ## Artifact Status - Project: .planning/PROJECT.md +- Requirements: .planning/REQUIREMENTS.md - Roadmap: .planning/ROADMAP.md - State: .planning/STATE.md - Codebase map: {has_codebase_map ? ".planning/codebase/ (complete)" : ".planning/codebase/ (incomplete or skipped)"} @@ -232,7 +237,7 @@ Print: Created / confirmed / status: - .planning/codebase/ {has_codebase_map ? "(complete)" : "(incomplete or skipped; missing: {missing_codebase_map_files})"} - .planning/PROJECT.md -- .planning/REQUIREMENTS.md +- .planning/REQUIREMENTS.md {requirements_exists ? "(present)" : "(missing; onboarding incomplete)"} - .planning/ROADMAP.md - .planning/STATE.md - .planning/onboarding/SUMMARY.md diff --git a/src/init.cts b/src/init.cts index a533d65fd..c4bb421a8 100644 --- a/src/init.cts +++ b/src/init.cts @@ -109,6 +109,10 @@ const REQUIRED_CODEBASE_MAP_FILES = [ 'INTEGRATIONS.md', 'CONCERNS.md', ]; +const PLANNING_DOC_SEGMENTS = new Set([ + 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs', +]); + function hasCodeFilesInternal(dir: string, depth = 0): boolean { if (depth > 3) return false; let entries: fs.Dirent[]; @@ -157,12 +161,11 @@ function listPlanningDocCandidates(cwd: string): string[] { if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue; const upperName = entry.name.toUpperCase(); const relLower = rel.toLowerCase(); + const pathSegments = relLower.split('/'); if ( /(^|[-_ ])(ADR|PRD|SPEC|RFC)([-_ ]|\.)/i.test(entry.name) || /^\d{4}[-_].+\.md$/i.test(entry.name) || - relLower.includes('/adr') || - relLower.includes('/prd') || - relLower.includes('/spec') || + pathSegments.some((segment) => PLANNING_DOC_SEGMENTS.has(segment)) || upperName === 'REQUIREMENTS.md' ) { candidates.add(toPosixPath(rel)); @@ -899,6 +902,7 @@ function cmdInitOnboard(cwd: string, raw: boolean): void { project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'), planning_exists: fs.existsSync(planningRoot(cwd)), + requirements_exists: fs.existsSync(path.join(planningDir(cwd), 'REQUIREMENTS.md')), roadmap_exists: fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')), state_exists: fs.existsSync(path.join(planningDir(cwd), 'STATE.md')), config_exists: fs.existsSync(path.join(planningDir(cwd), 'config.json')), @@ -920,6 +924,9 @@ function cmdInitOnboard(cwd: string, raw: boolean): void { onboarding_summary_path: '.planning/onboarding/SUMMARY.md', project_path: '.planning/PROJECT.md', + requirements_path: toPosixPath( + path.relative(cwd, path.join(planningDir(cwd), 'REQUIREMENTS.md')), + ), roadmap_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'ROADMAP.md'))), state_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'STATE.md'))), codebase_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'codebase'))), diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index a7903fe90..deb69cf82 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -50,6 +50,21 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.text_mode, false); }); + test('detects planning docs in top-level ADR and PRD folders', () => { + fs.mkdirSync(path.join(tmpDir, 'prd'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'prd', 'product.md'), '# Product Requirements\n'); + fs.mkdirSync(path.join(tmpDir, 'adr'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'adr', 'decision.md'), '# Architecture Decision\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.has_docs_candidates, true); + assert.strictEqual(parsed.doc_candidate_count, 2); + assert.deepStrictEqual(parsed.doc_candidates, ['adr/decision.md', 'prd/product.md']); + }); + test('reports complete codebase map and onboarding summary in existing planning', () => { fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); for (const name of ['STACK', 'ARCHITECTURE', 'STRUCTURE', 'CONVENTIONS', 'TESTING', 'INTEGRATIONS', 'CONCERNS']) { @@ -58,6 +73,7 @@ describe('init onboard public CLI projection', () => { fs.mkdirSync(path.join(tmpDir, '.planning', 'onboarding'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, '.planning', 'onboarding', 'SUMMARY.md'), '# Onboarding Summary\n'); fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), '# Requirements\n'); fs.writeFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), '# Roadmap\n'); fs.writeFileSync(path.join(tmpDir, '.planning', 'STATE.md'), '# State\n'); fs.writeFileSync(path.join(tmpDir, '.planning', 'config.json'), JSON.stringify({ workflow: { text_mode: true } })); @@ -80,6 +96,7 @@ describe('init onboard public CLI projection', () => { const parsed = JSON.parse(result.output); assert.strictEqual(parsed.planning_exists, true); assert.strictEqual(parsed.project_exists, true); + assert.strictEqual(parsed.requirements_exists, true); assert.strictEqual(parsed.roadmap_exists, true); assert.strictEqual(parsed.state_exists, true); assert.strictEqual(parsed.has_codebase_map, true); @@ -89,6 +106,22 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.text_mode, true); }); + test('reports missing requirements in otherwise existing planning', () => { + fs.mkdirSync(path.join(tmpDir, '.planning'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), '# Roadmap\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'STATE.md'), '# State\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.project_exists, true); + assert.strictEqual(parsed.requirements_exists, false); + assert.strictEqual(parsed.roadmap_exists, true); + assert.strictEqual(parsed.state_exists, true); + }); + test('ignores generated and vendor directories when detecting existing code', () => { fs.mkdirSync(path.join(tmpDir, 'node_modules', 'pkg'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, 'node_modules', 'pkg', 'index.ts'), 'export const ignored = true;\n'); @@ -151,6 +184,9 @@ describe('/gsd:onboard command contract', () => { assert.ok(content.includes('new-project'), 'workflow must route to new-project'); assert.ok(content.includes('.planning/onboarding/SUMMARY.md'), 'workflow must create onboarding summary'); assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); + assert.ok(content.includes('requirements_exists'), 'workflow must parse requirements existence'); + assert.match(content, /REQUIREMENTS\.md: \{requirements_exists \? "present" : "missing"\}/, 'workflow must report missing requirements in partial planning'); + assert.match(content, /If `project_exists` is true and .*`requirements_exists`.* is false/s, 'workflow must gate partial planning on missing requirements'); assert.ok(content.includes('--text'), 'workflow must document text-mode fallback'); assert.ok(!content.includes('execute-phase'), 'onboarding must not execute implementation phases'); assert.ok(!content.includes('gsd:ship'), 'onboarding must not ship work'); From f29f981486b37a905d7eba5ade7484aad9c31b29 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 09:50:33 -0500 Subject: [PATCH 04/75] no-mistakes(review): Fix onboarding docs gate detection --- gsd-core/workflows/onboard.md | 2 +- src/init.cts | 2 +- tests/onboard-command.test.cjs | 17 ++++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index f2702a8aa..2c8bfd135 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -101,7 +101,7 @@ Exit. ## 4. Existing Docs Gate -If `has_docs_candidates` is true and `planning_exists` is false: +If `has_docs_candidates` is true and `project_exists` is false: - If `TEXT_MODE=true`, print: diff --git a/src/init.cts b/src/init.cts index c4bb421a8..472de1ab7 100644 --- a/src/init.cts +++ b/src/init.cts @@ -137,7 +137,7 @@ function hasPackageFileInternal(cwd: string): boolean { } function listPlanningDocCandidates(cwd: string): string[] { - const roots = ['docs', 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfcs']; + const roots = ['docs', 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs']; const candidates = new Set(); const visit = (dir: string, relDir: string, depth: number): void => { diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index deb69cf82..aac86784d 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -50,19 +50,25 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.text_mode, false); }); - test('detects planning docs in top-level ADR and PRD folders', () => { + test('detects planning docs in top-level ADR, PRD, and RFC folders', () => { fs.mkdirSync(path.join(tmpDir, 'prd'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, 'prd', 'product.md'), '# Product Requirements\n'); fs.mkdirSync(path.join(tmpDir, 'adr'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, 'adr', 'decision.md'), '# Architecture Decision\n'); + fs.mkdirSync(path.join(tmpDir, 'rfc'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'rfc', 'proposal.md'), '# Request for Comments\n'); const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); assert.ok(result.success, `init onboard should succeed: ${result.error}`); const parsed = JSON.parse(result.output); assert.strictEqual(parsed.has_docs_candidates, true); - assert.strictEqual(parsed.doc_candidate_count, 2); - assert.deepStrictEqual(parsed.doc_candidates, ['adr/decision.md', 'prd/product.md']); + assert.strictEqual(parsed.doc_candidate_count, 3); + assert.deepStrictEqual(parsed.doc_candidates, [ + 'adr/decision.md', + 'prd/product.md', + 'rfc/proposal.md', + ]); }); test('reports complete codebase map and onboarding summary in existing planning', () => { @@ -181,6 +187,11 @@ describe('/gsd:onboard command contract', () => { assert.ok(content.includes('init onboard'), 'workflow must use init onboard projection'); assert.ok(content.includes('map-codebase'), 'workflow must route to map-codebase'); assert.ok(content.includes('ingest-docs'), 'workflow must route to ingest-docs'); + assert.match( + content, + /If `has_docs_candidates` is true and `project_exists` is false:/, + 'workflow must offer docs ingest before project setup even when codebase mapping already created .planning', + ); assert.ok(content.includes('new-project'), 'workflow must route to new-project'); assert.ok(content.includes('.planning/onboarding/SUMMARY.md'), 'workflow must create onboarding summary'); assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); From 66ff521c71fba736490a21e3d439d28d1fded049 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 09:59:19 -0500 Subject: [PATCH 05/75] no-mistakes(review): Fix onboard runtime and doc detection --- gsd-core/workflows/onboard.md | 4 ++-- src/init.cts | 41 ++++++++++++++++++++++++---------- tests/onboard-command.test.cjs | 37 ++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 14 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 2c8bfd135..80fac011c 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -29,7 +29,7 @@ Parse `$ARGUMENTS`: Run the init projection: ```bash -_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found. Run: npx -y @opengsd/gsd-core@latest --local" >&2; exit 1; fi +_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi INIT=$(gsd_run init onboard) if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi ``` @@ -38,7 +38,7 @@ Parse JSON fields: `planning_exists`, `project_exists`, `requirements_exists`, `roadmap_exists`, `state_exists`, `has_existing_code`, `has_package_file`, `is_brownfield`, `has_codebase_map`, `codebase_map_files_present`, `missing_codebase_map_files`, `has_docs_candidates`, -`doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `agents_installed`, +`doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `commit_docs`, `agents_installed`, `missing_agents`, `has_git`, `git_worktree_root`, `in_nested_subdir`. Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. diff --git a/src/init.cts b/src/init.cts index 472de1ab7..a82bae89d 100644 --- a/src/init.cts +++ b/src/init.cts @@ -140,6 +140,24 @@ function listPlanningDocCandidates(cwd: string): string[] { const roots = ['docs', 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs']; const candidates = new Set(); + const isPlanningDocCandidate = (rel: string, name: string): boolean => { + const upperName = name.toUpperCase(); + const relLower = rel.toLowerCase(); + const pathSegments = relLower.split('/'); + return ( + /(^|[-_ ])(ADR|PRD|SPEC|RFC)([-_ ]|\.)/i.test(name) || + /^\d{4}[-_].+\.md$/i.test(name) || + pathSegments.some((segment) => PLANNING_DOC_SEGMENTS.has(segment)) || + upperName === 'REQUIREMENTS.MD' + ); + }; + + const addCandidate = (rel: string, name: string): void => { + if (name.toLowerCase().endsWith('.md') && isPlanningDocCandidate(rel, name)) { + candidates.add(toPosixPath(rel)); + } + }; + const visit = (dir: string, relDir: string, depth: number): void => { if (depth > 3) return; let entries: fs.Dirent[]; @@ -158,21 +176,20 @@ function listPlanningDocCandidates(cwd: string): string[] { continue; } - if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue; - const upperName = entry.name.toUpperCase(); - const relLower = rel.toLowerCase(); - const pathSegments = relLower.split('/'); - if ( - /(^|[-_ ])(ADR|PRD|SPEC|RFC)([-_ ]|\.)/i.test(entry.name) || - /^\d{4}[-_].+\.md$/i.test(entry.name) || - pathSegments.some((segment) => PLANNING_DOC_SEGMENTS.has(segment)) || - upperName === 'REQUIREMENTS.md' - ) { - candidates.add(toPosixPath(rel)); - } + if (entry.isFile()) addCandidate(rel, entry.name); } }; + let rootEntries: fs.Dirent[] = []; + try { + rootEntries = fs.readdirSync(cwd, { withFileTypes: true }); + } catch { + rootEntries = []; + } + for (const entry of rootEntries) { + if (entry.isFile()) addCandidate(entry.name, entry.name); + } + for (const root of roots) { const full = path.join(cwd, root); if (fs.existsSync(full)) visit(full, root, 0); diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index aac86784d..ccaa85c84 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -71,6 +71,32 @@ describe('init onboard public CLI projection', () => { ]); }); + test('detects root-level planning docs without broad repo scan', () => { + fs.writeFileSync(path.join(tmpDir, 'PRD.md'), '# Product Requirements\n'); + fs.writeFileSync(path.join(tmpDir, 'SPEC.md'), '# Specification\n'); + fs.writeFileSync(path.join(tmpDir, 'RFC.md'), '# Request for Comments\n'); + fs.writeFileSync(path.join(tmpDir, 'ADR.md'), '# Architecture Decision\n'); + fs.writeFileSync(path.join(tmpDir, 'REQUIREMENTS.md'), '# Requirements\n'); + fs.writeFileSync(path.join(tmpDir, '0001-decision.md'), '# Decision\n'); + fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'src', 'PRD.md'), '# Nested Product Requirements\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.has_docs_candidates, true); + assert.strictEqual(parsed.doc_candidate_count, 6); + assert.deepStrictEqual(parsed.doc_candidates, [ + '0001-decision.md', + 'ADR.md', + 'PRD.md', + 'REQUIREMENTS.md', + 'RFC.md', + 'SPEC.md', + ]); + }); + test('reports complete codebase map and onboarding summary in existing planning', () => { fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); for (const name of ['STACK', 'ARCHITECTURE', 'STRUCTURE', 'CONVENTIONS', 'TESTING', 'INTEGRATIONS', 'CONCERNS']) { @@ -185,6 +211,17 @@ describe('/gsd:onboard command contract', () => { const content = fs.readFileSync(WF_PATH, 'utf8'); assert.ok(content.includes('init onboard'), 'workflow must use init onboard projection'); + for (const runtimeHome of [ + 'HERMES_HOME', + 'CURSOR_CONFIG_DIR', + 'CODEX_HOME', + 'GEMINI_CONFIG_DIR', + 'WINDSURF_CONFIG_DIR', + 'OPENCODE_CONFIG_DIR', + ]) { + assert.ok(content.includes(runtimeHome), `workflow resolver must include ${runtimeHome}`); + } + assert.match(content, /Parse JSON fields:.*`commit_docs`/s, 'workflow must parse commit_docs before using it'); assert.ok(content.includes('map-codebase'), 'workflow must route to map-codebase'); assert.ok(content.includes('ingest-docs'), 'workflow must route to ingest-docs'); assert.match( From b006b1a23eb1d4c4dcaa526f4192cf37cf06f57e Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 10:05:50 -0500 Subject: [PATCH 06/75] no-mistakes(review): Fix doc-only onboarding route --- gsd-core/workflows/onboard.md | 2 +- tests/onboard-command.test.cjs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 80fac011c..112b942e1 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -89,7 +89,7 @@ Exit. If the user skips mapping, continue with a warning. -If `is_brownfield` is false and `planning_exists` is false, print: +If `is_brownfield` is false and `planning_exists` is false and `has_docs_candidates` is false, print: ```text No existing code was detected. For a greenfield project, run: diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index ccaa85c84..9a7b55395 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -229,6 +229,11 @@ describe('/gsd:onboard command contract', () => { /If `has_docs_candidates` is true and `project_exists` is false:/, 'workflow must offer docs ingest before project setup even when codebase mapping already created .planning', ); + assert.match( + content, + /If `is_brownfield` is false and `planning_exists` is false and `has_docs_candidates` is false, print:/, + 'workflow must not send doc-only repos to new-project before the docs ingest gate', + ); assert.ok(content.includes('new-project'), 'workflow must route to new-project'); assert.ok(content.includes('.planning/onboarding/SUMMARY.md'), 'workflow must create onboarding summary'); assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); From a3cca0704da2e307aa71aedc5fadd797a23e57cc Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 10:23:01 -0500 Subject: [PATCH 07/75] no-mistakes(document): Sync onboard documentation --- README.md | 7 +-- commands/gsd/map-codebase.md | 6 +-- docs/CLI-TOOLS.md | 3 +- docs/COMMANDS.md | 2 +- docs/FEATURES.md | 24 ++++++++++- docs/USER-GUIDE.md | 11 +++-- docs/ja-JP/COMMANDS.md | 19 ++++++++ docs/ja-JP/FEATURES.md | 16 ++++++- docs/ja-JP/INVENTORY.md | 2 + docs/ja-JP/USER-GUIDE.md | 7 +-- .../onboarding-an-existing-codebase.md | 7 +-- docs/ko-KR/COMMANDS.md | 19 ++++++++ docs/ko-KR/FEATURES.md | 16 ++++++- docs/ko-KR/INVENTORY.md | 2 + docs/ko-KR/USER-GUIDE.md | 7 +-- .../onboarding-an-existing-codebase.md | 5 ++- docs/pt-BR/COMMANDS.md | 19 ++++++++ docs/pt-BR/FEATURES.md | 2 +- docs/pt-BR/INVENTORY.md | 2 + docs/pt-BR/USER-GUIDE.md | 7 +-- .../onboarding-an-existing-codebase.md | 5 ++- docs/reference/planning-artifacts.md | 18 ++++++-- .../onboarding-an-existing-codebase.md | 43 ++++++++++++++++--- docs/zh-CN/COMMANDS.md | 19 ++++++++ docs/zh-CN/FEATURES.md | 16 ++++++- docs/zh-CN/INVENTORY.md | 2 + docs/zh-CN/USER-GUIDE.md | 7 +-- .../onboarding-an-existing-codebase.md | 7 +-- gsd-core/templates/project.md | 2 +- gsd-core/workflows/do.md | 7 +-- gsd-core/workflows/help/modes/full.md | 2 +- skills/gsd-map-codebase/SKILL.md | 6 +-- skills/gsd-surface/SKILL.md | 2 +- 33 files changed, 260 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index d18deabc7..9f5f08857 100644 --- a/README.md +++ b/README.md @@ -47,13 +47,14 @@ The installer prompts for your runtime (Claude Code, OpenCode, Antigravity CLI, On another runtime or without Node.js? See [Install on your runtime](docs/how-to/install-on-your-runtime.md). -Once installed, start your first project: +Once installed, start a new project or onboard an existing repo: ```bash -/gsd-new-project +/gsd-new-project # greenfield project +/gsd-onboard # existing codebase ``` -New here? Follow [Your first project](docs/tutorials/your-first-project.md) for a guided walkthrough from install to first shipped phase. +New here? Follow [Your first project](docs/tutorials/your-first-project.md) for a guided walkthrough from install to first shipped phase, or [Onboarding an existing codebase](docs/tutorials/onboarding-an-existing-codebase.md) for brownfield setup. --- diff --git a/commands/gsd/map-codebase.md b/commands/gsd/map-codebase.md index b48db59a5..0d0a0f2f8 100644 --- a/commands/gsd/map-codebase.md +++ b/commands/gsd/map-codebase.md @@ -42,7 +42,7 @@ Parse the first token of $ARGUMENTS: Check for .planning/STATE.md - loads context if project already initialized **This command can run:** -- Before /gsd:new-project (brownfield codebases) - creates codebase map first +- Via /gsd:onboard for first-time brownfield setup - creates codebase map first - After /gsd:new-project (greenfield codebases) - updates codebase map as code evolves - Anytime to refresh codebase understanding @@ -51,7 +51,7 @@ Check for .planning/STATE.md - loads context if project already initialized **Use map-codebase for:** - Brownfield projects before initialization (understand existing code first) - Refreshing codebase map after significant changes -- Onboarding to an unfamiliar codebase +- Refreshing or deepening an onboarded codebase map - Before major refactoring (understand current state) - When STATE.md references outdated codebase info @@ -71,7 +71,7 @@ Check for .planning/STATE.md - loads context if project already initialized 4. Wait for agents to complete, collect confirmations (NOT document contents) 5. Verify all 7 documents exist with line counts 6. Commit codebase map -7. Offer next steps (typically: /gsd:new-project or /gsd:plan-phase) +7. Offer next steps (typically: /gsd:onboard, /gsd:new-project, or /gsd:plan-phase) diff --git a/docs/CLI-TOOLS.md b/docs/CLI-TOOLS.md index 392656603..9381be660 100644 --- a/docs/CLI-TOOLS.md +++ b/docs/CLI-TOOLS.md @@ -421,13 +421,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init Commands (Compound Context Loading) -Load all context needed for a specific workflow in one call. Returns JSON with project info, config, state, and workflow-specific data. +Load all context needed for a specific workflow in one call. Returns JSON with project info, config, state, and workflow-specific data. `init onboard` reports brownfield signals, planning-doc candidates, codebase-map completeness, partial planning state, and onboarding summary status for `/gsd-onboard`. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone +node gsd-tools.cjs init onboard node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/COMMANDS.md b/docs/COMMANDS.md index 5e25aeffd..e8d2b9095 100644 --- a/docs/COMMANDS.md +++ b/docs/COMMANDS.md @@ -1202,7 +1202,7 @@ gsd capability remove my-cap --scope project # Turn the installed overl ### `/gsd-map-codebase` -Analyze existing codebase with parallel mapper agents. Use `--fast` for a quick single-agent scan, or `--query` to search existing intel. +Analyze existing codebase with parallel mapper agents. Use `--fast` for a quick single-agent scan, or `--query` to search existing intel. First-time brownfield setup should usually start with `/gsd-onboard`, which hands off to this command when a map is missing. | Argument | Required | Description | |----------|----------|-------------| diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 0019ee7dd..8f1b647dd 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -38,6 +38,7 @@ - [Model Profiles](#26-model-profiles) - [Brownfield Features](#brownfield-features) - [Codebase Mapping](#27-codebase-mapping) + - [Existing Codebase Onboarding](#27b-existing-codebase-onboarding) - [Utility Features](#utility-features) - [Debug System](#28-debug-system) - [Todo Management](#29-todo-management) @@ -789,7 +790,7 @@ **Command:** `/gsd-map-codebase [area]` -**Purpose:** Analyze an existing codebase before starting a new project, so GSD understands what exists. +**Purpose:** Analyze an existing codebase before starting a new project or as the mapping handoff from `/gsd-onboard`, so GSD understands what exists. **Requirements:** - REQ-MAP-01: System MUST spawn parallel mapper agents for each analysis area @@ -817,6 +818,27 @@ only the subtrees the phase actually changed. Each produced document carries `last_mapped_commit` in its YAML frontmatter so drift can be measured against the mapping point, not HEAD. +### 27b. Existing Codebase Onboarding + +**Command:** `/gsd-onboard [--fast] [--text]` + +**Purpose:** Guide first-time setup for an existing repository by checking brownfield state, routing through codebase mapping and docs ingest, then handing off to project initialization without silently overwriting planning artifacts. + +**Requirements:** +- REQ-ONBOARD-01: System MUST detect existing code, package manifests, planning documents, partial `.planning/` state, and complete or missing codebase-map files. +- REQ-ONBOARD-02: System MUST hand off to `/gsd-map-codebase` or `/gsd-map-codebase --fast` when brownfield code lacks a complete `.planning/codebase/` map. +- REQ-ONBOARD-03: System MUST offer `/gsd-ingest-docs` before `/gsd-new-project` when ADR/PRD/SPEC/RFC candidates exist and no project exists. +- REQ-ONBOARD-04: System MUST refuse to report onboarding complete until `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist. +- REQ-ONBOARD-05: System MUST create or confirm `.planning/onboarding/SUMMARY.md` only after project setup exists. +- REQ-ONBOARD-06: System MUST support `--text` for numbered plain-text gates on runtimes without interactive menus. + +**Produces:** +| Artifact | Description | +|----------|-------------| +| `.planning/codebase/` | Codebase map produced by the `/gsd-map-codebase` handoff | +| `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` | Planning setup produced by `/gsd-new-project` or `/gsd-ingest-docs` | +| `.planning/onboarding/SUMMARY.md` | Onboarding status, artifact index, and next-command summary | + ### 27a. Post-Execute Codebase Drift Detection **Introduced by:** #2003 diff --git a/docs/USER-GUIDE.md b/docs/USER-GUIDE.md index e06c10d4d..aaaee31af 100644 --- a/docs/USER-GUIDE.md +++ b/docs/USER-GUIDE.md @@ -79,7 +79,7 @@ The core GSD loop is: **discuss → plan → execute → verify → ship**, repe See [Your first project](tutorials/your-first-project.md). -For onboarding an existing codebase before starting a new milestone, see [Onboarding an existing codebase](tutorials/onboarding-an-existing-codebase.md). +For onboarding an existing codebase before starting a new milestone, run `/gsd-onboard` or see [Onboarding an existing codebase](tutorials/onboarding-an-existing-codebase.md). **Relevant flags at a glance:** @@ -536,11 +536,13 @@ claude --dangerously-skip-permissions ### Existing Codebase ```bash -/gsd-map-codebase # Analyse what exists (parallel agents) -/gsd-new-project # Questions focus on what you're ADDING +/gsd-onboard # Safely map, ingest docs, and initialize planning +# Follow the printed top-level handoff commands, then rerun /gsd-onboard # (normal phase workflow from here) ``` +`/gsd-onboard` routes through `/gsd-map-codebase`, `/gsd-ingest-docs`, and `/gsd-new-project` without nesting interactive workflows or overwriting existing planning files silently. + **Post-execute drift detection (#2003).** After every `/gsd-execute-phase`, GSD checks whether the phase introduced enough structural change to make `.planning/codebase/STRUCTURE.md` stale. Flip the behavior with: ```bash @@ -986,7 +988,8 @@ To disable parallel execution entirely: `/gsd-settings` → set `parallelization themes/ default.css # Shared CSS variables for all sketches MANIFEST.md # Index of all sketches with winners - codebase/ # Brownfield codebase mapping (from /gsd-map-codebase) + codebase/ # Brownfield codebase mapping (from /gsd-map-codebase or /gsd-onboard) + onboarding/ # Brownfield onboarding summary (from /gsd-onboard) phases/ XX-phase-name/ XX-YY-PLAN.md # Atomic execution plans diff --git a/docs/ja-JP/COMMANDS.md b/docs/ja-JP/COMMANDS.md index d63034e51..c3c9ca0a5 100644 --- a/docs/ja-JP/COMMANDS.md +++ b/docs/ja-JP/COMMANDS.md @@ -51,6 +51,25 @@ v1.40 では、最初のステージエントリーポイントとして6つの --- +### `/gsd-onboard` + +既存コードベースの初回 GSD オンボーディングを案内します。リポジトリ状態を確認し、コードベースマッピング、任意のドキュメント取り込み、プロジェクト初期化へ安全にハンドオフし、計画が揃った後にオンボーディング summary を作成します。 + +| フラグ | 説明 | +|------|-------------| +| `--fast` | 軽量な `/gsd-map-codebase --fast` マッピングハンドオフを優先 | +| `--text` | TUI メニューではなく番号付きプレーンテキストのゲートを使用 | + +**前提条件:** 既存リポジトリまたは計画ドキュメント。空のグリーンフィールドプロジェクトには `/gsd-new-project` を使用します。 +**生成物:** map-codebase による `.planning/codebase/`、new-project または ingest-docs による `.planning/`、セットアップ後の `.planning/onboarding/SUMMARY.md`。 + +```bash +/gsd-onboard # ガイド付き brownfield オンボーディング +/gsd-onboard --fast # 先に軽量コードベースマッピングを使用 +``` + +--- + ### `/gsd-workspace` GSD ワークスペースを管理 — リポジトリコピーと独立した `.planning/` ディレクトリを持つ隔離されたワークスペース環境を作成、一覧表示、または削除します。 diff --git a/docs/ja-JP/FEATURES.md b/docs/ja-JP/FEATURES.md index 6f91953c6..6e1bb6742 100644 --- a/docs/ja-JP/FEATURES.md +++ b/docs/ja-JP/FEATURES.md @@ -38,6 +38,7 @@ - [モデルプロファイル](#26-モデルプロファイル) - [ブラウンフィールド機能](#ブラウンフィールド機能) - [コードベースマッピング](#27-コードベースマッピング) + - [既存コードベースオンボーディング](#27b-既存コードベースオンボーディング) - [ユーティリティ機能](#ユーティリティ機能) - [デバッグシステム](#28-デバッグシステム) - [Todo 管理](#29-todo-管理) @@ -781,7 +782,7 @@ **コマンド:** `/gsd-map-codebase [area]` -**目的:** 新しいプロジェクトを開始する前に既存のコードベースを分析し、GSD が既存の構成を理解できるようにします。 +**目的:** 新しいプロジェクトを開始する前、または `/gsd-onboard` からのマッピングハンドオフとして既存のコードベースを分析し、GSD が既存の構成を理解できるようにします。 **要件:** - REQ-MAP-01: システムは各分析領域に対して並列マッパーエージェントを起動しなければならない @@ -805,6 +806,19 @@ `--paths ` スコープヒントを受け付けます。指定した場合、ツリー全体をスキャンする代わりに、リストされたリポジトリ相対プレフィックスに探索を制限します。 これはフェーズが実際に変更したサブツリーのみを更新するために、実行後コードベースドリフトゲートが使用するパスウェイです。各生成ドキュメントはその YAML フロントマターに `last_mapped_commit` を持ち、ドリフトを HEAD ではなくマッピング時点と照らし合わせて計測できます。 +### 27b. 既存コードベースオンボーディング + +**コマンド:** `/gsd-onboard [--fast] [--text]` + +**目的:** 既存リポジトリの初回セットアップを案内し、brownfield 状態を確認してコードベースマッピング、docs 取り込み、プロジェクト初期化へ安全にハンドオフします。 + +**要件:** +- REQ-ONBOARD-01: 既存コード、package manifest、計画ドキュメント、部分的な `.planning/`、コードベースマップの不足を検出する。 +- REQ-ONBOARD-02: 完全な `.planning/codebase/` がない brownfield では `/gsd-map-codebase` または `/gsd-map-codebase --fast` へハンドオフする。 +- REQ-ONBOARD-03: ADR/PRD/SPEC/RFC 候補があり project がない場合、`/gsd-new-project` の前に `/gsd-ingest-docs` を提示する。 +- REQ-ONBOARD-04: `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` が揃うまで完了扱いにしない。 +- REQ-ONBOARD-05: project setup 後にのみ `.planning/onboarding/SUMMARY.md` を作成または確認する。 + ### 27a. 実行後コードベースドリフト検出 **導入:** #2003 diff --git a/docs/ja-JP/INVENTORY.md b/docs/ja-JP/INVENTORY.md index a1d5a6a70..506e18442 100644 --- a/docs/ja-JP/INVENTORY.md +++ b/docs/ja-JP/INVENTORY.md @@ -78,6 +78,7 @@ | コマンド | 役割 | ソース | |----------|------|--------| | `/gsd-new-project` | 深いコンテキスト収集と PROJECT.md で新しいプロジェクトを初期化。 | [commands/gsd/new-project.md](../../commands/gsd/new-project.md) | +| `/gsd-onboard` | 既存コードベースをマッピング、ドキュメント取り込み、プロジェクト設定、onboarding summary へ案内。 | [commands/gsd/onboard.md](../../commands/gsd/onboard.md) | | `/gsd-workspace` | GSD ワークスペースを管理 — 独立したワークスペース環境を作成(`--new`)、一覧表示(`--list`)、削除(`--remove`)。 | [commands/gsd/workspace.md](../../commands/gsd/workspace.md) | | `/gsd-discuss-phase` | 計画前にアダプティブな質問でフェーズコンテキストを収集。 | [commands/gsd/discuss-phase.md](../../commands/gsd/discuss-phase.md) | | `/gsd-mvp-phase` | フェーズを垂直 MVP スライスとして計画 — ユーザーストーリー、SPIDR 分割、その後 plan-phase。 | [commands/gsd/mvp-phase.md](../../commands/gsd/mvp-phase.md) | @@ -218,6 +219,7 @@ | `milestone-summary.md` | マイルストーンサマリー合成 — マイルストーンアーティファクトからオンボーディングとレビューアーティファクトを作成。 | `/gsd-milestone-summary` | | `new-milestone.md` | 新しいマイルストーンサイクルを開始 — プロジェクトコンテキストを読み込み、目標を収集して PROJECT.md/STATE.md を更新。 | `/gsd-new-milestone` | | `new-project.md` | 統合新プロジェクトフロー — 質問、調査(任意)、要件、ロードマップ。 | `/gsd-new-project` | +| `onboard.md` | Brownfield onboarding orchestration — コードベースをマップし、docs を取り込み、planning を初期化し、次のステップを要約。 | `/gsd-onboard` | | `new-workspace.md` | リポジトリのワークツリー/クローンと独立した `.planning/` を持つ独立したワークスペースを作成。 | `/gsd-workspace --new` | | `next.md` | 現在のプロジェクト状態を検出して次の論理的なステップに自動的に進む。 | `/gsd-progress --next` | | `node-repair.md` | タスク検証が失敗した場合の自律修復オペレーター。`execute-plan` から呼び出し。 | `execute-plan.md` (recovery) | diff --git a/docs/ja-JP/USER-GUIDE.md b/docs/ja-JP/USER-GUIDE.md index 264953822..15c4ee089 100644 --- a/docs/ja-JP/USER-GUIDE.md +++ b/docs/ja-JP/USER-GUIDE.md @@ -474,8 +474,8 @@ claude --dangerously-skip-permissions ### 既存のコードベース ```bash -/gsd-map-codebase # Analyse what exists (parallel agents) -/gsd-new-project # Questions focus on what you're ADDING +/gsd-onboard # Safely map, ingest docs, and initialize planning +# Follow printed handoff commands, then rerun /gsd-onboard # (normal phase workflow from here) ``` @@ -864,7 +864,8 @@ All subagent/executor commits MUST use `--no-verify`. themes/ default.css # Shared CSS variables for all sketches MANIFEST.md # Index of all sketches with winners - codebase/ # Brownfield codebase mapping (from /gsd-map-codebase) + codebase/ # Brownfield codebase mapping (from /gsd-map-codebase or /gsd-onboard) + onboarding/ # Brownfield onboarding summary (from /gsd-onboard) phases/ XX-phase-name/ XX-YY-PLAN.md # Atomic execution plans diff --git a/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md b/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md index f2a268486..65a23543a 100644 --- a/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md +++ b/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md @@ -44,15 +44,15 @@ claude --dangerously-skip-permissions --- -## ステップ 3 — コードベースのマッピング +## ステップ 3 — Brownfield オンボーディングの開始 プロジェクトを作成する前に、GSD Core に既存のコードを学習させてください。これがブラウンフィールドの計画を正確にするステップです。 ```text -/gsd-map-codebase +/gsd-onboard ``` -GSD Core が4つの並行マッパーサブエージェントを生成します(「Spawning 4 parallel codebase mapper agents…」という通知が表示されます。1〜5分かかりますので中断しないでください)。各エージェントはそれぞれ異なる観点に注目します: +オンボーディングがコードベースマップ不足を示したら、推奨オプションを選び、表示された `/gsd-map-codebase` ハンドオフを実行してから `/gsd-onboard` を再実行します。`/gsd-map-codebase` が4つの並行マッパーサブエージェントを生成します(「Spawning 4 parallel codebase mapper agents…」という通知が表示されます。1〜5分かかりますので中断しないでください)。各エージェントはそれぞれ異なる観点に注目します: | エージェント | 観点 | |-------|-------| @@ -133,6 +133,7 @@ Proposed Roadmap ROADMAP.md ← フェーズ 1、ステータス: pending STATE.md ← セッションメモリ config.json ← ワークフロー設定 + onboarding/SUMMARY.md ← onboarding status and next command codebase/ ← ステップ 3 の7つのマップファイル ``` diff --git a/docs/ko-KR/COMMANDS.md b/docs/ko-KR/COMMANDS.md index 56c8f3625..6c473e2b7 100644 --- a/docs/ko-KR/COMMANDS.md +++ b/docs/ko-KR/COMMANDS.md @@ -51,6 +51,25 @@ v1.40에서 여섯 개의 네임스페이스 라우터가 1단계 진입점으 --- +### `/gsd-onboard` + +기존 코드베이스의 최초 GSD 온보딩을 안내합니다. 저장소 상태를 확인하고 코드베이스 매핑, 선택적 문서 수집, 프로젝트 초기화로 안전하게 넘긴 뒤 계획 파일이 준비되면 onboarding summary를 만듭니다. + +| 플래그 | 설명 | +|------|-------------| +| `--fast` | 경량 `/gsd-map-codebase --fast` 매핑 handoff 우선 사용 | +| `--text` | TUI 메뉴 대신 번호가 있는 plain-text gate 사용 | + +**전제 조건:** 기존 저장소 또는 계획 문서. 빈 greenfield 프로젝트는 `/gsd-new-project`를 사용하세요. +**생성 결과:** map-codebase의 `.planning/codebase/`, new-project 또는 ingest-docs의 `.planning/`, 설정 후 `.planning/onboarding/SUMMARY.md`. + +```bash +/gsd-onboard # 안내형 brownfield 온보딩 +/gsd-onboard --fast # 먼저 경량 코드베이스 매핑 사용 +``` + +--- + ### `/gsd-workspace` GSD 워크스페이스 관리 — 리포지토리 복사본과 독립적인 `.planning/` 디렉토리를 갖는 격리된 워크스페이스 환경을 생성, 나열, 또는 삭제합니다. diff --git a/docs/ko-KR/FEATURES.md b/docs/ko-KR/FEATURES.md index be2f5d268..7556310c5 100644 --- a/docs/ko-KR/FEATURES.md +++ b/docs/ko-KR/FEATURES.md @@ -38,6 +38,7 @@ - [모델 프로파일](#26-model-profiles) - [브라운필드 기능](#brownfield-features) - [코드베이스 매핑](#27-codebase-mapping) + - [기존 코드베이스 온보딩](#27b-existing-codebase-onboarding) - [유틸리티 기능](#utility-features) - [디버그 시스템](#28-debug-system) - [할 일 관리](#29-todo-management) @@ -716,7 +717,7 @@ **명령어:** `/gsd-map-codebase [area]` -**목적:** 새 프로젝트를 시작하기 전에 기존 코드베이스를 분석하여 GSD가 무엇이 존재하는지 이해하도록 합니다. +**목적:** 새 프로젝트 시작 전 또는 `/gsd-onboard`의 매핑 handoff로 기존 코드베이스를 분석하여 GSD가 무엇이 존재하는지 이해하도록 합니다. **요구사항.** - REQ-MAP-01: 각 분석 영역에 대한 병렬 매퍼 에이전트를 생성해야 합니다. @@ -736,6 +737,19 @@ | `TESTING.md` | 테스트 인프라, 커버리지, 패턴 | | `INTEGRATIONS.md` | 외부 서비스, API, 서드파티 의존성 | +### 27b. Existing Codebase Onboarding + +**명령어:** `/gsd-onboard [--fast] [--text]` + +**목적:** 기존 저장소의 최초 설정을 안내하고 brownfield 상태를 확인해 코드베이스 매핑, docs 수집, 프로젝트 초기화로 안전하게 handoff합니다. + +**요구사항.** +- REQ-ONBOARD-01: 기존 코드, package manifest, planning 문서, 부분 `.planning/` 상태, 코드베이스 맵 누락을 감지해야 합니다. +- REQ-ONBOARD-02: 완전한 `.planning/codebase/`가 없는 brownfield에서는 `/gsd-map-codebase` 또는 `/gsd-map-codebase --fast`로 handoff해야 합니다. +- REQ-ONBOARD-03: ADR/PRD/SPEC/RFC 후보가 있고 project가 없으면 `/gsd-new-project` 전에 `/gsd-ingest-docs`를 제안해야 합니다. +- REQ-ONBOARD-04: `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md`가 모두 있을 때까지 완료로 보고하지 않아야 합니다. +- REQ-ONBOARD-05: project setup 후에만 `.planning/onboarding/SUMMARY.md`를 만들거나 확인해야 합니다. + --- ## 유틸리티 기능 diff --git a/docs/ko-KR/INVENTORY.md b/docs/ko-KR/INVENTORY.md index a73860461..83b0faf53 100644 --- a/docs/ko-KR/INVENTORY.md +++ b/docs/ko-KR/INVENTORY.md @@ -78,6 +78,7 @@ | 명령어 | 역할 | 소스 | |---------|------|--------| | `/gsd-new-project` | 심층 컨텍스트 수집 및 PROJECT.md로 새 프로젝트 초기화. | [commands/gsd/new-project.md](../../commands/gsd/new-project.md) | +| `/gsd-onboard` | 기존 코드베이스를 매핑, 문서 수집, 프로젝트 설정, onboarding summary로 안내합니다. | [commands/gsd/onboard.md](../../commands/gsd/onboard.md) | | `/gsd-workspace` | GSD 워크스페이스 관리 — 격리된 워크스페이스 환경을 생성(`--new`), 목록(`--list`), 또는 제거(`--remove`). | [commands/gsd/workspace.md](../../commands/gsd/workspace.md) | | `/gsd-discuss-phase` | 계획 전 적응형 질문을 통한 단계 컨텍스트 수집. | [commands/gsd/discuss-phase.md](../../commands/gsd/discuss-phase.md) | | `/gsd-mvp-phase` | 수직 MVP 슬라이스로 단계 계획 — 사용자 스토리, SPIDR 분할, 이후 plan-phase. | [commands/gsd/mvp-phase.md](../../commands/gsd/mvp-phase.md) | @@ -218,6 +219,7 @@ | `milestone-summary.md` | 마일스톤 아티팩트에서 온보딩 및 검토용 마일스톤 요약 합성. | `/gsd-milestone-summary` | | `new-milestone.md` | 새 마일스톤 사이클 시작 — 프로젝트 컨텍스트 로드, 목표 수집, PROJECT.md/STATE.md 업데이트. | `/gsd-new-milestone` | | `new-project.md` | 통합 새 프로젝트 플로우 — 질문, 조사(선택), 요구사항, 로드맵. | `/gsd-new-project` | +| `onboard.md` | Brownfield 온보딩 오케스트레이션 — 코드베이스 매핑, 문서 수집, planning 초기화, 다음 단계 요약. | `/gsd-onboard` | | `new-workspace.md` | 저장소 워크트리/클론과 독립적인 `.planning/`이 포함된 격리된 워크스페이스 생성. | `/gsd-workspace --new` | | `next.md` | 현재 프로젝트 상태를 감지하고 다음 논리적 단계로 자동 진행. | `/gsd-progress --next` | | `node-repair.md` | 실패한 태스크 검증을 위한 자율 수리 오퍼레이터; `execute-plan`에 의해 호출. | `execute-plan.md` (복구) | diff --git a/docs/ko-KR/USER-GUIDE.md b/docs/ko-KR/USER-GUIDE.md index a2f8c01aa..95cb95d9b 100644 --- a/docs/ko-KR/USER-GUIDE.md +++ b/docs/ko-KR/USER-GUIDE.md @@ -474,8 +474,8 @@ claude --dangerously-skip-permissions ### 기존 코드베이스 ```bash -/gsd-map-codebase # Analyse what exists (parallel agents) -/gsd-new-project # Questions focus on what you're ADDING +/gsd-onboard # Safely map, ingest docs, and initialize planning +# Follow printed handoff commands, then rerun /gsd-onboard # (normal phase workflow from here) ``` @@ -864,7 +864,8 @@ All subagent/executor commits MUST use `--no-verify`. themes/ default.css # Shared CSS variables for all sketches MANIFEST.md # Index of all sketches with winners - codebase/ # Brownfield codebase mapping (from /gsd-map-codebase) + codebase/ # Brownfield codebase mapping (from /gsd-map-codebase or /gsd-onboard) + onboarding/ # Brownfield onboarding summary (from /gsd-onboard) phases/ XX-phase-name/ XX-YY-PLAN.md # Atomic execution plans diff --git a/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md b/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md index 794d62534..89306d2ea 100644 --- a/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md +++ b/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md @@ -49,10 +49,10 @@ claude --dangerously-skip-permissions 프로젝트를 생성하기 전에 GSD Core가 이미 존재하는 것을 학습하도록 합니다. 이 단계가 브라운필드 계획의 정확도를 높이는 핵심입니다. ```text -/gsd-map-codebase +/gsd-onboard ``` -GSD Core가 4개의 병렬 매퍼 서브 에이전트를 생성합니다("Spawning 4 parallel codebase mapper agents…" 메시지가 표시되며, 1–5분 소요됩니다. 중단하지 마세요). 각 에이전트는 서로 다른 관심사에 집중합니다: +온보딩이 코드베이스 맵 누락을 보고하면 권장 옵션을 선택하고 출력된 `/gsd-map-codebase` handoff를 실행한 뒤 `/gsd-onboard`를 다시 실행합니다. `/gsd-map-codebase`가 4개의 병렬 매퍼 서브 에이전트를 생성합니다("Spawning 4 parallel codebase mapper agents…" 메시지가 표시되며, 1–5분 소요됩니다. 중단하지 마세요). 각 에이전트는 서로 다른 관심사에 집중합니다: | 에이전트 | 집중 영역 | |---------|---------| @@ -133,6 +133,7 @@ Proposed Roadmap ROADMAP.md ← Phase 1, 상태: pending STATE.md ← 세션 메모리 config.json ← 워크플로 설정 + onboarding/SUMMARY.md ← onboarding status and next command codebase/ ← Step 3에서 생성된 7개의 맵 파일 ``` diff --git a/docs/pt-BR/COMMANDS.md b/docs/pt-BR/COMMANDS.md index e8b74bb13..1ce74e1f9 100644 --- a/docs/pt-BR/COMMANDS.md +++ b/docs/pt-BR/COMMANDS.md @@ -51,6 +51,25 @@ Inicializa um novo projeto com coleta aprofundada de contexto. --- +### `/gsd-onboard` + +Guia o onboarding inicial de um código existente no GSD. O comando verifica o estado do repositório, encaminha com segurança por mapeamento da base de código, ingestão opcional de documentos, inicialização do projeto e cria um onboarding summary quando o planejamento existe. + +| Flag | Descrição | +|------|-----------| +| `--fast` | Prefere o handoff leve `/gsd-map-codebase --fast` para mapeamento | +| `--text` | Usa gates numerados em texto puro em vez de menus TUI | + +**Pré-requisitos:** Repositório existente ou documentos de planejamento. Para projetos greenfield vazios, use `/gsd-new-project`. +**Produz:** `.planning/codebase/` via map-codebase, `.planning/` via new-project ou ingest-docs, e `.planning/onboarding/SUMMARY.md` após a configuração do projeto. + +```bash +/gsd-onboard # Onboarding brownfield guiado +/gsd-onboard --fast # Usa primeiro o mapeamento leve da base de código +``` + +--- + ### `/gsd-workspace` Gerencia workspaces do GSD — cria, lista ou remove ambientes de workspace isolados com cópias de repositório e diretórios `.planning/` independentes. diff --git a/docs/pt-BR/FEATURES.md b/docs/pt-BR/FEATURES.md index 186d504a8..c0ded9cbb 100644 --- a/docs/pt-BR/FEATURES.md +++ b/docs/pt-BR/FEATURES.md @@ -68,7 +68,7 @@ Para catálogo completo e detalhamento exaustivo, consulte [FEATURES.md em ingl |--------|----------| | Projeto novo | `/gsd-new-project` -> `/gsd-discuss-phase` -> `/gsd-plan-phase` -> `/gsd-execute-phase` | | Correção rápida | `/gsd-quick` | -| Código existente | `/gsd-map-codebase` -> `/gsd-new-project` | +| Código existente | `/gsd-onboard` -> handoffs para `/gsd-map-codebase`, `/gsd-ingest-docs`, `/gsd-new-project` | | Fechamento de release | `/gsd-audit-milestone` -> `/gsd-complete-milestone` | --- diff --git a/docs/pt-BR/INVENTORY.md b/docs/pt-BR/INVENTORY.md index c10cbe76e..7be789824 100644 --- a/docs/pt-BR/INVENTORY.md +++ b/docs/pt-BR/INVENTORY.md @@ -78,6 +78,7 @@ Esses seis roteadores são entradas apenas descritivas que o modelo seleciona pr | Comando | Função | Fonte | |---------|--------|-------| | `/gsd-new-project` | Inicializa um novo projeto com coleta profunda de contexto e PROJECT.md. | [commands/gsd/new-project.md](../../commands/gsd/new-project.md) | +| `/gsd-onboard` | Guia código existente por mapeamento, ingestão de docs, configuração de projeto e onboarding summary. | [commands/gsd/onboard.md](../../commands/gsd/onboard.md) | | `/gsd-workspace` | Gerencia workspaces GSD — criar (`--new`), listar (`--list`) ou remover (`--remove`) ambientes de workspace isolados. | [commands/gsd/workspace.md](../../commands/gsd/workspace.md) | | `/gsd-discuss-phase` | Coleta contexto da fase por meio de perguntas adaptativas antes do planejamento. | [commands/gsd/discuss-phase.md](../../commands/gsd/discuss-phase.md) | | `/gsd-mvp-phase` | Planeja uma fase como uma fatia vertical de MVP — história de usuário, divisão SPIDR, depois plan-phase. | [commands/gsd/mvp-phase.md](../../commands/gsd/mvp-phase.md) | @@ -218,6 +219,7 @@ Registro completo em `get-shit-done/workflows/*.md`. Workflows são orquestrador | `milestone-summary.md` | Síntese do resumo do milestone — artefato de onboarding e revisão a partir dos artefatos do milestone. | `/gsd-milestone-summary` | | `new-milestone.md` | Inicia um novo ciclo de milestone — carregar contexto do projeto, coletar objetivos, atualizar PROJECT.md/STATE.md. | `/gsd-new-milestone` | | `new-project.md` | Fluxo unificado de novo projeto — questionamento, pesquisa (opcional), requisitos, roadmap. | `/gsd-new-project` | +| `onboard.md` | Orquestração de onboarding brownfield — mapear código, ingerir docs, inicializar planning e resumir próximo passo. | `/gsd-onboard` | | `new-workspace.md` | Cria um workspace isolado com worktrees/clones do repositório e um `.planning/` independente. | `/gsd-workspace --new` | | `next.md` | Detecta o estado atual do projeto e avança automaticamente para o próximo passo lógico. | `/gsd-progress --next` | | `node-repair.md` | Operador de reparo autônomo para verificação de tarefa com falha; invocado por `execute-plan`. | `execute-plan.md` (recuperação) | diff --git a/docs/pt-BR/USER-GUIDE.md b/docs/pt-BR/USER-GUIDE.md index e0b269607..c5f0a393b 100644 --- a/docs/pt-BR/USER-GUIDE.md +++ b/docs/pt-BR/USER-GUIDE.md @@ -474,8 +474,8 @@ claude --dangerously-skip-permissions ### Base de código existente ```bash -/gsd-map-codebase # Analyse what exists (parallel agents) -/gsd-new-project # Questions focus on what you're ADDING +/gsd-onboard # Safely map, ingest docs, and initialize planning +# Follow printed handoff commands, then rerun /gsd-onboard # (normal phase workflow from here) ``` @@ -864,7 +864,8 @@ Para desativar a execução paralela completamente: `/gsd-settings` → defina ` themes/ default.css # Shared CSS variables for all sketches MANIFEST.md # Index of all sketches with winners - codebase/ # Brownfield codebase mapping (from /gsd-map-codebase) + codebase/ # Brownfield codebase mapping (from /gsd-map-codebase or /gsd-onboard) + onboarding/ # Brownfield onboarding summary (from /gsd-onboard) phases/ XX-phase-name/ XX-YY-PLAN.md # Atomic execution plans diff --git a/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md b/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md index 760cf362f..a34dc4008 100644 --- a/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md +++ b/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md @@ -49,10 +49,10 @@ claude --dangerously-skip-permissions Antes de criar um projeto, deixe o GSD Core aprender o que já existe. Este é o passo que torna o planejamento brownfield preciso. ```text -/gsd-map-codebase +/gsd-onboard ``` -O GSD Core cria quatro sub-agentes mapeadores paralelos (você verá "Spawning 4 parallel codebase mapper agents…" — isso leva de 1 a 5 minutos; não interrompa). Cada agente foca em uma preocupação diferente: +Se o onboarding informar que o mapa da base de código está ausente, escolha a opção recomendada e execute o handoff `/gsd-map-codebase` impresso antes de rodar `/gsd-onboard` novamente. O `/gsd-map-codebase` cria quatro sub-agentes mapeadores paralelos (você verá "Spawning 4 parallel codebase mapper agents…" — isso leva de 1 a 5 minutos; não interrompa). Cada agente foca em uma preocupação diferente: | Agente | Foco | |--------|------| @@ -133,6 +133,7 @@ Aprove o roteiro. ROADMAP.md ← Fase 1, status: pending STATE.md ← memória de sessão config.json ← configurações do fluxo de trabalho + onboarding/SUMMARY.md ← onboarding status and next command codebase/ ← os sete arquivos de mapa do Passo 3 ``` diff --git a/docs/reference/planning-artifacts.md b/docs/reference/planning-artifacts.md index 5d7dd5e6a..d62c32005 100644 --- a/docs/reference/planning-artifacts.md +++ b/docs/reference/planning-artifacts.md @@ -23,6 +23,8 @@ The `.planning/` directory is GSD Core's shared memory for a project. Every work │ ├── architecture.md │ ├── stack.md │ └── ... +├── onboarding/ # Brownfield onboarding summary (optional) +│ └── SUMMARY.md ├── intel/ # Queryable symbol index (optional, intel.enabled) │ └── API-SURFACE.md └── phases/ @@ -48,7 +50,7 @@ The `.planning/` directory is GSD Core's shared memory for a project. Every work | | | |---|---| | **Purpose** | Canonical project identity: what it is, who it is for, core value, requirements, constraints, and key decisions. Updated throughout the project lifecycle as the product evolves. | -| **Produced by** | `/gsd-new-project` (initial creation); updated by `/gsd-complete-milestone` as decisions are validated. | +| **Produced by** | `/gsd-new-project` (initial creation, including `/gsd-onboard` handoff); updated by `/gsd-complete-milestone` as decisions are validated. | | **Consumed by** | All planning workflows; `gsd-phase-researcher`, `gsd-planner` (context); `discuss-phase` (prior decisions); `gsd-plan-checker` (project constraints). | Includes an optional `## Business Context` section (Customer, Revenue model, Success metric, Strategy notes) for monetized or customer-facing projects — four one-line fields that connect business outcomes to requirement prioritization. It is deleted for internal tools, experiments, or meta workspaces, and reviewed at each milestone by `/gsd-complete-milestone` when present. @@ -58,7 +60,7 @@ Includes an optional `## Business Context` section (Customer, Revenue model, Suc | | | |---|---| | **Purpose** | Milestone and phase listing with goals, requirement IDs, success criteria, and canonical references per phase. The single source of truth for what the project is building and in what order. | -| **Produced by** | `/gsd-new-project` (initial creation); updated by `/gsd-phase --insert` and `/gsd-complete-milestone`. | +| **Produced by** | `/gsd-new-project` (initial creation, including `/gsd-onboard` handoff); updated by `/gsd-phase --insert` and `/gsd-complete-milestone`. | | **Consumed by** | `/gsd-discuss-phase`, `/gsd-plan-phase`, `/gsd-execute-phase`; all orchestration commands that need phase information; `gsd-planner`, `gsd-plan-checker`, `gsd-phase-researcher`. | ### `REQUIREMENTS.md` @@ -66,7 +68,7 @@ Includes an optional `## Business Context` section (Customer, Revenue model, Suc | | | |---|---| | **Purpose** | Numbered, checkable acceptance criteria for the project. Each requirement carries an ID (e.g., `AUTH-01`) that maps to roadmap phases. Marks requirements complete as phases are executed. | -| **Produced by** | `/gsd-new-project` (initial creation); requirements marked complete by `execute-phase`. | +| **Produced by** | `/gsd-new-project` (initial creation, including `/gsd-onboard` handoff); requirements marked complete by `execute-phase`. | | **Consumed by** | `gsd-planner` (plans must address all phase requirement IDs); `gsd-plan-checker` Dimension 1 (requirement coverage); `discuss-phase` (prior requirements). | ### `STATE.md` @@ -74,7 +76,7 @@ Includes an optional `## Business Context` section (Customer, Revenue model, Suc | | | |---|---| | **Purpose** | Living position tracker — current phase and plan, progress metrics, accumulated decisions, session continuity notes. Read at the start of every workflow run. Updated after every significant action. | -| **Produced by** | `/gsd-new-project` (initial creation); updated continuously by all phase workflows, `/gsd-pause-work`, `/gsd-resume-work`. | +| **Produced by** | `/gsd-new-project` (initial creation, including `/gsd-onboard` handoff); updated continuously by all phase workflows, `/gsd-pause-work`, `/gsd-resume-work`. | | **Consumed by** | All orchestration workflows; `/gsd-progress`; ad-hoc task execution via `/gsd-quick`; `gsd-planner` and `gsd-phase-researcher` (project decisions). | See [STATE.md schema](state-md.md) for the full field reference. @@ -89,6 +91,14 @@ See [STATE.md schema](state-md.md) for the full field reference. See [CONFIGURATION](../CONFIGURATION.md) for the complete schema. +### `onboarding/SUMMARY.md` (optional) + +| | | +|---|---| +| **Purpose** | Brownfield onboarding index that records artifact status, whether codebase mapping is complete, and the next recommended GSD command after first-time setup. | +| **Produced by** | `/gsd-onboard` after `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist. | +| **Consumed by** | Humans reviewing first-time setup; future `/gsd-onboard` runs when confirming existing onboarding state. | + ### `MILESTONES.md` (optional) | | | diff --git a/docs/tutorials/onboarding-an-existing-codebase.md b/docs/tutorials/onboarding-an-existing-codebase.md index 22c536f4a..1ac686efe 100644 --- a/docs/tutorials/onboarding-an-existing-codebase.md +++ b/docs/tutorials/onboarding-an-existing-codebase.md @@ -44,15 +44,21 @@ claude --dangerously-skip-permissions --- -## Step 3 — Map the codebase +## Step 3 — Start brownfield onboarding -Before creating a project, let GSD Core learn what already exists. This is the step that makes brownfield planning accurate. +Before creating a project, let GSD Core inspect the repo state and tell you the safe next top-level command. This is the step that prevents brownfield setup from skipping codebase context or overwriting existing planning files. + +```text +/gsd-onboard +``` + +If code exists and `.planning/codebase/` is missing, GSD Core asks you to map the codebase first. Choose the recommended mapping option, then run the printed handoff command: ```text /gsd-map-codebase ``` -GSD Core spawns four parallel mapper sub-agents (you'll see "Spawning 4 parallel codebase mapper agents…" — this takes 1–5 minutes; do not interrupt). Each agent focuses on a different concern: +Use `/gsd-onboard --fast` if you want the onboarding gate to prefer `/gsd-map-codebase --fast` for a lighter first pass. The full mapper spawns four parallel mapper sub-agents (you'll see "Spawning 4 parallel codebase mapper agents…" — this takes 1–5 minutes; do not interrupt). Each agent focuses on a different concern: | Agent | Focus | |-------|-------| @@ -84,7 +90,7 @@ Open `.planning/codebase/CONCERNS.md`. This is the most useful file to read befo --- -## Step 4 — Clear context and create the project +## Step 4 — Rerun onboarding and initialize the project Clear the session window: @@ -92,12 +98,20 @@ Clear the session window: /clear ``` -Now create the project. Because GSD Core found existing code in the last step, it already knows this is a brownfield project. When you run `/gsd-new-project`, the questions focus on what you are *adding*, not rebuilding what already exists: +Now rerun onboarding: + +```text +/gsd-onboard +``` + +If GSD Core detects ADRs, PRDs, specs, RFCs, or top-level requirements docs, choose the recommended docs-ingest handoff first and rerun `/gsd-onboard` afterward. Once codebase context and any existing docs are handled, onboarding prints the project-initialization handoff: ```text /gsd-new-project ``` +Because GSD Core found existing code in the previous step, `/gsd-new-project` knows this is a brownfield project. The questions focus on what you are *adding*, not rebuilding what already exists: + GSD Core asks what you want to build. Answer with the feature you are adding, not a description of the whole codebase: ```text @@ -138,6 +152,20 @@ Approve the roadmap. Notice that `.planning/codebase/` is already there from Step 3. GSD Core read those files when writing `PROJECT.md`, which is why it could populate the Validated requirements without you describing them. +Run onboarding one more time after project setup completes: + +```text +/gsd-onboard +``` + +Now that `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist, onboarding creates or confirms: + +```text +.planning/onboarding/SUMMARY.md +``` + +This summary is a lightweight index of the setup artifacts and the next command to run. + --- ## Step 5 — Clear context and discuss Phase 1 @@ -206,12 +234,13 @@ You now have a project with a codebase map, a discuss decision record, and verif /gsd-ship 1 ``` -For every future feature, run `/gsd-map-codebase` again whenever the structure changes significantly, so the codebase map stays fresh. +For every future feature, run `/gsd-map-codebase` again whenever the structure changes significantly, so the codebase map stays fresh. Rerun `/gsd-onboard` only when you want to re-check first-time setup completeness or regenerate the onboarding summary. --- ## What you've learned +- How `/gsd-onboard` safely sequences brownfield setup without nesting interactive commands or overwriting existing planning files. - How `/gsd-map-codebase` runs four parallel agents to produce `STACK.md`, `ARCHITECTURE.md`, `CONVENTIONS.md`, `CONCERNS.md`, `STRUCTURE.md`, `TESTING.md`, and `INTEGRATIONS.md` in `.planning/codebase/`. - How `/gsd-new-project` in a brownfield repo focuses questions on what you are *adding* and populates Validated requirements from existing code. - How the codebase map shapes every question in `/gsd-discuss-phase` — file paths, patterns, and conventions come from your actual code. @@ -222,5 +251,5 @@ For every future feature, run `/gsd-map-codebase` again whenever the structure c ## Related - [Your first project](your-first-project.md) — the full greenfield loop from install to PR -- [Map codebase via Commands](../COMMANDS.md) — all `/gsd-map-codebase` flags and subcommands +- [Commands](../COMMANDS.md) — `/gsd-onboard`, plus all `/gsd-map-codebase` flags and subcommands - [Documentation index](../README.md) diff --git a/docs/zh-CN/COMMANDS.md b/docs/zh-CN/COMMANDS.md index 10d808254..efb8906e2 100644 --- a/docs/zh-CN/COMMANDS.md +++ b/docs/zh-CN/COMMANDS.md @@ -51,6 +51,25 @@ v1.40 中,六个命名空间路由器作为第一阶段入口点随附发布 --- +### `/gsd-onboard` + +引导现有代码库完成首次 GSD 接入。该命令检查仓库状态,安全地转到代码库映射、可选文档摄取、项目初始化,并在规划文件齐备后创建 onboarding summary。 + +| 标志 | 描述 | +|------|-------------| +| `--fast` | 优先使用轻量 `/gsd-map-codebase --fast` 映射交接 | +| `--text` | 使用编号纯文本关卡,而不是 TUI 菜单 | + +**前提条件:** 现有仓库或规划文档。空的绿地项目请使用 `/gsd-new-project`。 +**产出:** 由 map-codebase 生成的 `.planning/codebase/`,由 new-project 或 ingest-docs 生成的 `.planning/`,以及项目设置后的 `.planning/onboarding/SUMMARY.md`。 + +```bash +/gsd-onboard # 引导式 brownfield 接入 +/gsd-onboard --fast # 先使用轻量代码库映射 +``` + +--- + ### `/gsd-workspace` 管理 GSD 工作区 — 创建、列出或移除隔离的工作区环境,包含仓库副本和独立的 `.planning/` 目录。 diff --git a/docs/zh-CN/FEATURES.md b/docs/zh-CN/FEATURES.md index abfbea94e..5994b7a61 100644 --- a/docs/zh-CN/FEATURES.md +++ b/docs/zh-CN/FEATURES.md @@ -38,6 +38,7 @@ - [模型配置](#26-model-profiles) - [棕地功能](#brownfield-features) - [代码库映射](#27-codebase-mapping) + - [现有代码库接入](#27b-现有代码库接入) - [实用功能](#utility-features) - [调试系统](#28-debug-system) - [待办事项管理](#29-todo-management) @@ -783,7 +784,7 @@ **命令:** `/gsd-map-codebase [area]` -**目的:** 在启动新项目之前分析现有代码库,使 GSD 了解已有内容。 +**目的:** 在启动新项目之前,或作为 `/gsd-onboard` 的映射交接,分析现有代码库,使 GSD 了解已有内容。 **需求:** - REQ-MAP-01:系统必须为每个分析领域派生并行映射智能体 @@ -805,6 +806,19 @@ **增量重映射 — `--paths` (#2003):** 映射器接受可选的 `--paths ` 范围提示。提供时,它将探索限制在列出的仓库相对前缀,而非扫描整个代码树。这是执行后代码库漂移门控用于仅刷新阶段实际修改的子树的路径。每个生成的文档在其 YAML 前置元数据中携带 `last_mapped_commit`,以便相对于映射点(而非 HEAD)来测量漂移。 +### 27b. 现有代码库接入 + +**命令:** `/gsd-onboard [--fast] [--text]` + +**目的:** 引导现有仓库完成首次设置,检查 brownfield 状态,并安全交接到代码库映射、docs 摄取和项目初始化。 + +**需求:** +- REQ-ONBOARD-01:系统必须检测现有代码、package manifest、规划文档、部分 `.planning/` 状态以及缺失的代码库映射文件。 +- REQ-ONBOARD-02:当 brownfield 缺少完整 `.planning/codebase/` 时,系统必须交接到 `/gsd-map-codebase` 或 `/gsd-map-codebase --fast`。 +- REQ-ONBOARD-03:当存在 ADR/PRD/SPEC/RFC 候选且 project 不存在时,系统必须在 `/gsd-new-project` 前提供 `/gsd-ingest-docs`。 +- REQ-ONBOARD-04:在 `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` 全部存在前,系统不得报告 onboarding 完成。 +- REQ-ONBOARD-05:系统必须仅在 project setup 后创建或确认 `.planning/onboarding/SUMMARY.md`。 + ### 27a. 执行后代码库漂移检测 **引入版本:** #2003 diff --git a/docs/zh-CN/INVENTORY.md b/docs/zh-CN/INVENTORY.md index d6344bfba..e1d295914 100644 --- a/docs/zh-CN/INVENTORY.md +++ b/docs/zh-CN/INVENTORY.md @@ -78,6 +78,7 @@ | 命令 | 角色 | 源文件 | |------|------|--------| | `/gsd-new-project` | 通过深度上下文收集和 PROJECT.md 初始化新项目。 | [commands/gsd/new-project.md](../../commands/gsd/new-project.md) | +| `/gsd-onboard` | 引导现有代码库完成映射、文档摄取、项目设置和 onboarding summary。 | [commands/gsd/onboard.md](../../commands/gsd/onboard.md) | | `/gsd-workspace` | 管理 GSD 工作区 — 创建(`--new`)、列出(`--list`)或移除(`--remove`)隔离的工作区环境。 | [commands/gsd/workspace.md](../../commands/gsd/workspace.md) | | `/gsd-discuss-phase` | 在规划前通过自适应提问收集阶段上下文。 | [commands/gsd/discuss-phase.md](../../commands/gsd/discuss-phase.md) | | `/gsd-mvp-phase` | 将阶段规划为垂直 MVP 切片 — 用户故事、SPIDR 拆分,然后进行阶段规划。 | [commands/gsd/mvp-phase.md](../../commands/gsd/mvp-phase.md) | @@ -218,6 +219,7 @@ | `milestone-summary.md` | 里程碑摘要综合 — 从里程碑产物生成的入职和审查产物。 | `/gsd-milestone-summary` | | `new-milestone.md` | 启动新里程碑周期 — 加载项目上下文、收集目标、更新 PROJECT.md/STATE.md。 | `/gsd-new-milestone` | | `new-project.md` | 统一的新项目流程 — 提问、研究(可选)、需求、路线图。 | `/gsd-new-project` | +| `onboard.md` | Brownfield 接入编排 — 映射代码库、摄取文档、初始化规划并总结下一步。 | `/gsd-onboard` | | `new-workspace.md` | 创建带有仓库 worktree/克隆和独立 `.planning/` 的隔离工作区。 | `/gsd-workspace --new` | | `next.md` | 检测当前项目状态并自动推进到下一个逻辑步骤。 | `/gsd-progress --next` | | `node-repair.md` | 用于失败任务验证的自主修复算子;由 `execute-plan` 调用。 | `execute-plan.md`(恢复) | diff --git a/docs/zh-CN/USER-GUIDE.md b/docs/zh-CN/USER-GUIDE.md index 3c7c0acea..6462395f6 100644 --- a/docs/zh-CN/USER-GUIDE.md +++ b/docs/zh-CN/USER-GUIDE.md @@ -473,8 +473,8 @@ claude --dangerously-skip-permissions ### 现有代码库 ```bash -/gsd-map-codebase # Analyse what exists (parallel agents) -/gsd-new-project # Questions focus on what you're ADDING +/gsd-onboard # Safely map, ingest docs, and initialize planning +# Follow printed handoff commands, then rerun /gsd-onboard # (normal phase workflow from here) ``` @@ -863,7 +863,8 @@ All subagent/executor commits MUST use `--no-verify`. themes/ default.css # Shared CSS variables for all sketches MANIFEST.md # Index of all sketches with winners - codebase/ # Brownfield codebase mapping (from /gsd-map-codebase) + codebase/ # Brownfield codebase mapping (from /gsd-map-codebase or /gsd-onboard) + onboarding/ # Brownfield onboarding summary (from /gsd-onboard) phases/ XX-phase-name/ XX-YY-PLAN.md # Atomic execution plans diff --git a/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md b/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md index 05576183b..c32493607 100644 --- a/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md +++ b/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md @@ -44,15 +44,15 @@ claude --dangerously-skip-permissions --- -## 第 3 步 — 映射代码库 +## 第 3 步 — 开始 brownfield onboarding 在创建项目之前,先让 GSD Core 了解已有的内容。这是使棕地规划准确的关键步骤。 ```text -/gsd-map-codebase +/gsd-onboard ``` -GSD Core 会派生四个并行映射子代理(您将看到"Spawning 4 parallel codebase mapper agents…"——这需要 1–5 分钟;请勿中断)。每个代理专注于不同的关注点: +如果 onboarding 报告缺少代码库映射,请选择推荐选项并运行打印出的 `/gsd-map-codebase` 交接命令,然后重新运行 `/gsd-onboard`。`/gsd-map-codebase` 会派生四个并行映射子代理(您将看到"Spawning 4 parallel codebase mapper agents…"——这需要 1–5 分钟;请勿中断)。每个代理专注于不同的关注点: | 代理 | 关注点 | |-------|-------| @@ -133,6 +133,7 @@ Proposed Roadmap ROADMAP.md ← Phase 1, status: pending STATE.md ← session memory config.json ← workflow settings + onboarding/SUMMARY.md ← onboarding status and next command codebase/ ← the seven map files from Step 3 ``` diff --git a/gsd-core/templates/project.md b/gsd-core/templates/project.md index a78c5c220..d63152fbc 100644 --- a/gsd-core/templates/project.md +++ b/gsd-core/templates/project.md @@ -166,7 +166,7 @@ and implemented by workflows/transition.md and workflows/complete-milestone.md. For existing codebases: -1. **Map codebase first** via `/gsd:map-codebase` +1. **Onboard or map codebase first** via `/gsd:onboard` (recommended first-time path) or `/gsd:map-codebase` 2. **Infer Validated requirements** from existing code: - What does the codebase actually do? diff --git a/gsd-core/workflows/do.md b/gsd-core/workflows/do.md index a7268e950..db0dfa312 100644 --- a/gsd-core/workflows/do.md +++ b/gsd-core/workflows/do.md @@ -40,8 +40,9 @@ Evaluate `$ARGUMENTS` against these routing rules. Apply the **first matching** | If the text describes... | Route to | Why | |--------------------------|----------|-----| -| Starting a new project, "set up", "initialize" | `/gsd:new-project` | Needs full project initialization | -| Mapping or analyzing an existing codebase | `/gsd:map-codebase` | Codebase discovery | +| Starting a new greenfield project, "set up", "initialize" | `/gsd:new-project` | Needs full project initialization | +| First-time setup for an existing codebase, brownfield onboarding | `/gsd:onboard` | Safe map → docs ingest → project setup sequence | +| Mapping or analyzing an existing codebase map | `/gsd:map-codebase` | Codebase discovery or refresh | | A bug, error, crash, failure, or something broken | `/gsd:debug` | Needs systematic investigation | | Spiking, "test if", "will this work", "experiment", "prove this out", validate feasibility | `/gsd:spike` | Throwaway experiment to validate feasibility | | Sketching, "mockup", "what would this look like", "prototype the UI", "design this", explore visual direction | `/gsd:sketch` | Throwaway HTML mockups to explore design | @@ -61,7 +62,7 @@ Evaluate `$ARGUMENTS` against these routing rules. Apply the **first matching** | Completing a milestone, shipping, releasing | `/gsd:complete-milestone` | Milestone lifecycle | | A specific, actionable, small task (add feature, fix typo, update config) | `/gsd:quick` | Self-contained, single executor | -**Requires `.planning/` directory:** All routes except `/gsd:new-project`, `/gsd:map-codebase`, `/gsd:spike`, `/gsd:sketch`, and `/gsd:help`. If the project doesn't exist and the route requires it, suggest `/gsd:new-project` first. +**Requires `.planning/` directory:** All routes except `/gsd:new-project`, `/gsd:onboard`, `/gsd:map-codebase`, `/gsd:spike`, `/gsd:sketch`, and `/gsd:help`. If the project doesn't exist and the route requires it, suggest `/gsd:onboard` for existing codebases or `/gsd:new-project` for greenfield projects. **Ambiguity handling:** If the text could reasonably match multiple routes, ask the user via AskUserQuestion with the top 2-3 options. For example: diff --git a/gsd-core/workflows/help/modes/full.md b/gsd-core/workflows/help/modes/full.md index d571e66ca..235fae38d 100644 --- a/gsd-core/workflows/help/modes/full.md +++ b/gsd-core/workflows/help/modes/full.md @@ -82,7 +82,7 @@ Map an existing codebase for brownfield projects. - Analyzes codebase with parallel Explore agents - Creates `.planning/codebase/` with 7 focused documents - Covers stack, architecture, structure, conventions, testing, integrations, concerns -- Use before `/gsd:new-project` on existing codebases +- Usually reached through `/gsd:onboard` for first-time existing-codebase setup; run directly to refresh or focus a map Usage: `/gsd:map-codebase` diff --git a/skills/gsd-map-codebase/SKILL.md b/skills/gsd-map-codebase/SKILL.md index 1f8fbb1d5..36c909128 100644 --- a/skills/gsd-map-codebase/SKILL.md +++ b/skills/gsd-map-codebase/SKILL.md @@ -42,7 +42,7 @@ Parse the first token of $ARGUMENTS: Check for .planning/STATE.md - loads context if project already initialized **This command can run:** -- Before /gsd-new-project (brownfield codebases) - creates codebase map first +- Via /gsd-onboard for first-time brownfield setup - creates codebase map first - After /gsd-new-project (greenfield codebases) - updates codebase map as code evolves - Anytime to refresh codebase understanding @@ -51,7 +51,7 @@ Check for .planning/STATE.md - loads context if project already initialized **Use map-codebase for:** - Brownfield projects before initialization (understand existing code first) - Refreshing codebase map after significant changes -- Onboarding to an unfamiliar codebase +- Refreshing or deepening an onboarded codebase map - Before major refactoring (understand current state) - When STATE.md references outdated codebase info @@ -71,7 +71,7 @@ Check for .planning/STATE.md - loads context if project already initialized 4. Wait for agents to complete, collect confirmations (NOT document contents) 5. Verify all 7 documents exist with line counts 6. Commit codebase map -7. Offer next steps (typically: /gsd-new-project or /gsd-plan-phase) +7. Offer next steps (typically: /gsd-onboard, /gsd-new-project, or /gsd-plan-phase) diff --git a/skills/gsd-surface/SKILL.md b/skills/gsd-surface/SKILL.md index d3cb0d571..688624c03 100644 --- a/skills/gsd-surface/SKILL.md +++ b/skills/gsd-surface/SKILL.md @@ -45,7 +45,7 @@ Display: ``` Enabled (N skills, ~T tokens): - core_loop: new-project discuss-phase plan-phase execute-phase help update + core_loop: new-project onboard discuss-phase plan-phase execute-phase help update audit_review: … … From 53f81ab5a9859384d5184e6369ee96c73394e6fb Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 10:26:40 -0500 Subject: [PATCH 08/75] no-mistakes(lint): Fix command dependency lint --- commands/gsd/map-codebase.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/gsd/map-codebase.md b/commands/gsd/map-codebase.md index 0d0a0f2f8..c11d56d69 100644 --- a/commands/gsd/map-codebase.md +++ b/commands/gsd/map-codebase.md @@ -9,7 +9,7 @@ allowed-tools: - Grep - Write - Agent -requires: [config, new-project, plan-phase] +requires: [config, new-project, plan-phase, onboard] --- From 7b3bf9be3fae4badba68bfa22c48603f852f001e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 3 Jul 2026 15:30:48 +0000 Subject: [PATCH 09/75] fix: align new-project map gate and guard onboarding summary overwrite init new-project now uses the same seven-file codebase map completeness check as init onboard, so partial .planning/codebase/ directories no longer skip the brownfield mapping offer after onboarding warns about an incomplete map. The onboard workflow now branches on onboarding_summary_exists and asks for confirmation before regenerating SUMMARY.md on repeat runs. --- gsd-core/workflows/onboard.md | 27 +++++++++++++++++++++++++++ src/init.cts | 10 ++++++---- tests/init.test.cjs | 3 +++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 112b942e1..8520d5524 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -177,6 +177,33 @@ true, continue. Create `.planning/onboarding/SUMMARY.md` only after PROJECT.md exists. If it already exists, update it only after confirmation; do not overwrite silently. +If `onboarding_summary_exists` is true: + +- If `TEXT_MODE=true`, print: + +```text +Onboarding summary already exists at .planning/onboarding/SUMMARY.md. + +1. Update summary — regenerate from current artifact status (Recommended) +2. Keep existing summary — skip writing + +Enter number: +``` + +Stop and wait for the user's reply. + +- Otherwise use AskUserQuestion: + - header: "Onboarding Summary" + - question: "Onboarding summary already exists. Update it from current artifact status?" + - options: + - "Update summary" — Regenerate `.planning/onboarding/SUMMARY.md` (Recommended) + - "Keep existing summary" — Skip writing + +If the user chooses to keep the existing summary, skip to Step 7 without writing. + +If `onboarding_summary_exists` is false or the user confirms an update, write the summary +using the template below. + Summary contents: ```markdown diff --git a/src/init.cts b/src/init.cts index a82bae89d..b22c29d79 100644 --- a/src/init.cts +++ b/src/init.cts @@ -747,6 +747,9 @@ function cmdInitNewProject(cwd: string, raw: boolean): void { const hasCode = hasCodeFilesInternal(cwd); const hasPackageFile = hasPackageFileInternal(cwd); + const isBrownfield = hasCode || hasPackageFile; + const codebaseMapFiles = listCodebaseMapFiles(cwd); + const hasCodebaseMap = codebaseMapFiles.length === REQUIRED_CODEBASE_MAP_FILES.length; const result: Record = { researcher_model: resolveModelInternal(cwd, 'gsd-project-researcher'), @@ -756,14 +759,13 @@ function cmdInitNewProject(cwd: string, raw: boolean): void { commit_docs: config.commit_docs, project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'), - has_codebase_map: pathExistsInternal(cwd, '.planning/codebase'), + has_codebase_map: hasCodebaseMap, planning_exists: pathExistsInternal(cwd, '.planning'), has_existing_code: hasCode, has_package_file: hasPackageFile, - is_brownfield: hasCode || hasPackageFile, - needs_codebase_map: - (hasCode || hasPackageFile) && !pathExistsInternal(cwd, '.planning/codebase'), + is_brownfield: isBrownfield, + needs_codebase_map: isBrownfield && !hasCodebaseMap, ...getInitGitState(cwd), diff --git a/tests/init.test.cjs b/tests/init.test.cjs index 964ce48f1..2ede0d0e8 100644 --- a/tests/init.test.cjs +++ b/tests/init.test.cjs @@ -1599,6 +1599,9 @@ describe('cmdInitNewProject', () => { test('brownfield with codebase map does not need map', () => { fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"test"}'); fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'ARCHITECTURE', 'STRUCTURE', 'CONVENTIONS', 'TESTING', 'INTEGRATIONS', 'CONCERNS']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } const result = runGsdTools('init new-project', tmpDir); assert.ok(result.success, `Command failed: ${result.error}`); From fb5d3abb57f40f10ca3ef431b8fa64d623562727 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 3 Jul 2026 15:34:10 +0000 Subject: [PATCH 10/75] fix(onboard): suggest new-milestone instead of blocked new-project When PROJECT.md exists but planning files are incomplete, onboarding previously listed /gsd:new-project as a remediation option. That command errors when the project is already initialized, leaving users at a dead end. Route partial planning to /gsd:new-milestone instead. --- gsd-core/workflows/onboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 8520d5524..7200a99f4 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -163,7 +163,7 @@ Planning file status: Run one of these top-level commands, then rerun /gsd:onboard: /gsd:ingest-docs --mode merge -/gsd:new-project +/gsd:new-milestone ``` Exit. Do not write `.planning/onboarding/SUMMARY.md` and do not print the onboarding From 20accf67ac0157abf762b5b0db32ac791104c717 Mon Sep 17 00:00:00 2001 From: jeremymcs Date: Fri, 3 Jul 2026 15:44:50 +0000 Subject: [PATCH 11/75] test(onboard): track allow-test-rule ref and recapture golden install fixtures Fixes the two Tests-workflow failures on the onboard PR. lint-tests (lint-allow-test-rule-refs): the new tests/onboard-command.test.cjs carried a `source-text-is-the-product` allow-test-rule exemption with no tracking ref, tripping the novel-offender gate. Add `(see #1990)` per ADR-456 so the exemption is traceable. golden-install-parity: the /gsd:onboard feature adds gsd-core/workflows/onboard.md and skills/gsd-onboard, and updates templates/project.md, workflows/do.md, the help modes, and map-codebase. Recapture the golden fixtures (UPDATE_GOLDEN=1) for all 16 runtimes so the installed-output manifest matches the intended source changes. Co-authored-by: Codesmith --- tests/onboard-command.test.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 9a7b55395..e202cdd0c 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -1,4 +1,4 @@ -// allow-test-rule: source-text-is-the-product +// allow-test-rule: source-text-is-the-product (see #1990) // Command/workflow markdown is deployed runtime product; source-text assertions // below verify the installed command contract. CLI assertions exercise real // gsd-tools behavior through the public command boundary. From 1797207280f883c15f6089b924c1b10a1dc350b7 Mon Sep 17 00:00:00 2001 From: jeremymcs Date: Fri, 3 Jul 2026 16:30:48 +0000 Subject: [PATCH 12/75] fix(onboard): route onboard under ns-project and drop from core profile Integrate the brownfield /gsd:onboard skill into the skill subsystems so the full CI suite passes: - Route onboard under commands/gsd/ns-project.md (requires + routing row) so it nests as gsd-ns-project/skills/onboard on nested-layout runtimes instead of leaking as a 7th top-level skill dir (fixes install-nested-layout + issue-69). - Remove onboard from PROFILES.core (src/install-profiles.cts) so the frozen main-loop core stays at 8 skills; onboard remains in standard/full. - Add the TEXT_MODE plain-text fallback note to gsd-core/workflows/onboard.md for non-Claude runtimes (#2012). - Allowlist onboard.md as a user-invocable skill (enh-2790 ratchet). - Regenerate docs/INVENTORY-MANIFEST.json, golden-install-parity fixtures, and the workflow size baseline to match. Co-authored-by: Codesmith --- commands/gsd/ns-project.md | 3 ++- gsd-core/workflows/onboard.md | 2 ++ src/install-profiles.cts | 1 - tests/skill-frontmatter-contract.test.cjs | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/commands/gsd/ns-project.md b/commands/gsd/ns-project.md index 3deb4943f..ae6e1748a 100644 --- a/commands/gsd/ns-project.md +++ b/commands/gsd/ns-project.md @@ -5,7 +5,7 @@ argument-hint: "" allowed-tools: - Read - Skill -requires: [new-project, new-milestone, complete-milestone, audit-milestone, milestone-summary, import, ingest-docs, profile-user, review-backlog] +requires: [new-project, onboard, new-milestone, complete-milestone, audit-milestone, milestone-summary, import, ingest-docs, profile-user, review-backlog] --- Route to the appropriate project / milestone skill based on the user's intent. @@ -15,6 +15,7 @@ inline as part of `gsd-audit-milestone`'s output. | User wants | Invoke | |---|---| | Start a new project | gsd-new-project | +| Onboard an existing codebase | gsd-onboard | | Create a new milestone | gsd-new-milestone | | Complete the current milestone | gsd-complete-milestone | | Audit a milestone for issues | gsd-audit-milestone | diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 7200a99f4..be4ffd00c 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -43,6 +43,8 @@ Parse JSON fields: `planning_exists`, `project_exists`, `requirements_exists`, Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. +**Text mode (`workflow.text_mode: true` in config or `--text` flag):** When `TEXT_MODE` is active, replace every `AskUserQuestion` call in this workflow with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available and would otherwise render as an inert code block. + ## 2. Git and Existing Planning Safety If `has_git` is true and `in_nested_subdir` is true, warn that onboarding artifacts will diff --git a/src/install-profiles.cts b/src/install-profiles.cts index 5db870050..2251d0e84 100644 --- a/src/install-profiles.cts +++ b/src/install-profiles.cts @@ -40,7 +40,6 @@ const { const PROFILES = Object.freeze({ core: Object.freeze([ 'new-project', - 'onboard', 'discuss-phase', 'plan-phase', 'execute-phase', diff --git a/tests/skill-frontmatter-contract.test.cjs b/tests/skill-frontmatter-contract.test.cjs index 7e8151c87..7aa9a0458 100644 --- a/tests/skill-frontmatter-contract.test.cjs +++ b/tests/skill-frontmatter-contract.test.cjs @@ -476,6 +476,8 @@ const KNOWN_SKILLS = new Set([ 'mvp-phase.md', 'new-milestone.md', 'new-project.md', + // #1990 brownfield onboarding entry command; sibling of new-project, routed under ns-project. + 'onboard.md', // `next.md` was legitimately reclaimed (#1787): the old workflow-advance // command stays absorbed into `progress.md --next`, while the current // `/gsd:next` is a different state-aware smart-entry launcher. From b3555b103d811787bf0920f153c26282fb214233 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 11:06:45 -0500 Subject: [PATCH 13/75] no-mistakes(review): fix onboard fast root anchoring --- gsd-core/workflows/onboard.md | 47 ++++++++++++++++++++++------------ src/init-command-router.cts | 7 +++-- src/init.cts | 24 +++++++++++++++-- tests/onboard-command.test.cjs | 27 +++++++++++++++++++ 4 files changed, 85 insertions(+), 20 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index be4ffd00c..11c640eba 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -23,25 +23,30 @@ Display banner: ``` Parse `$ARGUMENTS`: -- `--fast` sets `MAP_COMMAND` to `/gsd:map-codebase --fast`; otherwise `/gsd:map-codebase`. +- `--fast` sets `MAP_COMMAND` to `/gsd:map-codebase --fast`, passes `--fast` to the init projection, and accepts the default fast map subset (STACK, INTEGRATIONS, ARCHITECTURE, STRUCTURE) as sufficient onboarding context; otherwise `MAP_COMMAND` is `/gsd:map-codebase`. - `--text` sets `TEXT_MODE=true`. Run the init projection: ```bash _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi -INIT=$(gsd_run init onboard) +INIT_ONBOARD_FLAGS=() +if [[ " ${ARGUMENTS:-} " == *" --fast "* ]]; then INIT_ONBOARD_FLAGS=(--fast); fi +INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard "${INIT_ONBOARD_FLAGS[@]}") if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi ``` Parse JSON fields: `planning_exists`, `project_exists`, `requirements_exists`, `roadmap_exists`, `state_exists`, `has_existing_code`, `has_package_file`, -`is_brownfield`, `has_codebase_map`, -`codebase_map_files_present`, `missing_codebase_map_files`, `has_docs_candidates`, +`is_brownfield`, `has_codebase_map`, `has_fast_codebase_map`, +`codebase_map_files_present`, `missing_codebase_map_files`, `missing_fast_codebase_map_files`, +`has_docs_candidates`, `doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `commit_docs`, `agents_installed`, `missing_agents`, `has_git`, `git_worktree_root`, `in_nested_subdir`. Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. +Set `CODEBASE_MAP_READY=has_fast_codebase_map` when `--fast` is present; otherwise set +`CODEBASE_MAP_READY=has_codebase_map`. **Text mode (`workflow.text_mode: true` in config or `--text` flag):** When `TEXT_MODE` is active, replace every `AskUserQuestion` call in this workflow with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available and would otherwise render as an inert code block. @@ -56,15 +61,15 @@ runs the lower-level refresh commands. ## 3. Codebase Mapping Gate -If `is_brownfield` is true and `has_codebase_map` is false: +If `is_brownfield` is true and `CODEBASE_MAP_READY` is false: - If `TEXT_MODE=true`, print: ```text -Existing code was detected, but the complete .planning/codebase/ map is missing. -Missing map files: {missing_codebase_map_files} +Existing code was detected, but the required .planning/codebase/ map is missing. +Missing map files: {--fast ? missing_fast_codebase_map_files : missing_codebase_map_files} -1. Map codebase first — run {MAP_COMMAND} to understand the repo before project setup (Recommended) +1. Map codebase first — run {MAP_COMMAND} from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT} to understand the repo before project setup (Recommended) 2. Skip mapping — continue with weaker onboarding context Enter number: @@ -74,17 +79,19 @@ Stop and wait for the user's reply. - Otherwise use AskUserQuestion: - header: "Codebase" - - question: "Existing code was detected, but the complete .planning/codebase/ map is missing. Map it first?" + - question: "Existing code was detected, but the required .planning/codebase/ map is missing. Map it first?" - options: - - "Map codebase first" — Run `{MAP_COMMAND}` to understand the repo before project setup (Recommended) + - "Map codebase first" — Run `{MAP_COMMAND}` from worktree root `{git_worktree_root || _GSD_RUNTIME_ROOT}` to understand the repo before project setup (Recommended) - "Skip mapping" — Continue with weaker onboarding context If the user chooses mapping, do not nest the interactive map-codebase workflow. Print: ```text -Run this top-level command first, then rerun /gsd:onboard: +Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: {MAP_COMMAND} + +Then rerun /gsd:onboard from the same worktree root. ``` Exit. @@ -96,6 +103,8 @@ If `is_brownfield` is false and `planning_exists` is false and `has_docs_candida ```text No existing code was detected. For a greenfield project, run: +Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: + /gsd:new-project ``` @@ -110,7 +119,7 @@ If `has_docs_candidates` is true and `project_exists` is false: ```text Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). -1. Ingest docs first — run /gsd:ingest-docs to bootstrap planning from existing docs (Recommended) +1. Ingest docs first — run /gsd:ingest-docs from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT} to bootstrap planning from existing docs (Recommended) 2. Skip docs ingest — continue to /gsd:new-project Enter number: @@ -122,15 +131,17 @@ Stop and wait for the user's reply. - header: "Docs" - question: "Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). Ingest them first?" - options: - - "Ingest docs first" — Run `/gsd:ingest-docs` to bootstrap planning from existing docs (Recommended) + - "Ingest docs first" — Run `/gsd:ingest-docs` from worktree root `{git_worktree_root || _GSD_RUNTIME_ROOT}` to bootstrap planning from existing docs (Recommended) - "Skip docs ingest" — Continue to `/gsd:new-project` If the user chooses ingest, do not nest the interactive ingest-docs workflow. Print: ```text -Run this top-level command first, then rerun /gsd:onboard: +Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: /gsd:ingest-docs + +Then rerun /gsd:onboard from the same worktree root. ``` Exit. @@ -144,9 +155,11 @@ Print: ```text Codebase context is ready for project initialization. -Run this top-level command, then rerun /gsd:onboard: +Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: /gsd:new-project + +Then rerun /gsd:onboard from the same worktree root. ``` Exit. @@ -162,10 +175,12 @@ Planning file status: - ROADMAP.md: {roadmap_exists ? "present" : "missing"} - STATE.md: {state_exists ? "present" : "missing"} -Run one of these top-level commands, then rerun /gsd:onboard: +Run one of these top-level commands from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: /gsd:ingest-docs --mode merge /gsd:new-milestone + +Then rerun /gsd:onboard from the same worktree root. ``` Exit. Do not write `.planning/onboarding/SUMMARY.md` and do not print the onboarding diff --git a/src/init-command-router.cts b/src/init-command-router.cts index 29b84ea59..90e09e2e6 100644 --- a/src/init-command-router.cts +++ b/src/init-command-router.cts @@ -28,7 +28,7 @@ interface InitModule { cmdInitPlanPhase(cwd: string, phase: string | undefined, raw: boolean, opts: Record): void; cmdInitNewProject(cwd: string, raw: boolean): void; cmdInitNewMilestone(cwd: string, raw: boolean): void; - cmdInitOnboard(cwd: string, raw: boolean): void; + cmdInitOnboard(cwd: string, raw: boolean, opts?: Record): void; cmdInitQuick(cwd: string, name: string, raw: boolean): void; cmdInitIngestDocs(cwd: string, raw: boolean): void; cmdInitResume(cwd: string, raw: boolean): void; @@ -72,7 +72,10 @@ function routeInitCommand({ init, args, cwd, raw, error }: RouteInitCommandOptio }, 'new-project': () => init.cmdInitNewProject(cwd, raw), 'new-milestone': () => init.cmdInitNewMilestone(cwd, raw), - onboard: () => init.cmdInitOnboard(cwd, raw), + onboard: () => { + const namedArgs = parseNamedArgs(args, [], ['fast']); + init.cmdInitOnboard(cwd, raw, { fast: namedArgs['fast'] }); + }, quick: () => init.cmdInitQuick(cwd, args.slice(2).join(' '), raw), 'ingest-docs': () => init.cmdInitIngestDocs(cwd, raw), resume: () => init.cmdInitResume(cwd, raw), diff --git a/src/init.cts b/src/init.cts index b22c29d79..853e186cf 100644 --- a/src/init.cts +++ b/src/init.cts @@ -109,6 +109,10 @@ const REQUIRED_CODEBASE_MAP_FILES = [ 'INTEGRATIONS.md', 'CONCERNS.md', ]; +const FAST_CODEBASE_MAP_FILES = [ + 'STACK.md', 'INTEGRATIONS.md', 'ARCHITECTURE.md', 'STRUCTURE.md', +]; + const PLANNING_DOC_SEGMENTS = new Set([ 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs', ]); @@ -902,17 +906,29 @@ function cmdInitIngestDocs(cwd: string, raw: boolean): void { output(withProjectRoot(cwd, result), raw); } -function cmdInitOnboard(cwd: string, raw: boolean): void { +function cmdInitOnboard( + cwd: string, + raw: boolean, + options: Record = {}, +): void { const config = loadConfig(cwd); const codebaseMapFiles = listCodebaseMapFiles(cwd); const missingCodebaseMapFiles = REQUIRED_CODEBASE_MAP_FILES.filter( (file) => !codebaseMapFiles.includes(file), ); + const missingFastCodebaseMapFiles = FAST_CODEBASE_MAP_FILES.filter( + (file) => !codebaseMapFiles.includes(file), + ); const docCandidates = listPlanningDocCandidates(cwd); const hasCode = hasCodeFilesInternal(cwd); const hasPackageFile = hasPackageFileInternal(cwd); const isBrownfield = hasCode || hasPackageFile; const hasCodebaseMap = codebaseMapFiles.length === REQUIRED_CODEBASE_MAP_FILES.length; + const fastMode = options['fast'] === true; + const hasFastCodebaseMap = missingFastCodebaseMapFiles.length === 0; + const needsCodebaseMap = isBrownfield && ( + fastMode ? !hasFastCodebaseMap : !hasCodebaseMap + ); const result: Record = { commit_docs: config.commit_docs, @@ -929,11 +945,15 @@ function cmdInitOnboard(cwd: string, raw: boolean): void { has_existing_code: hasCode, has_package_file: hasPackageFile, is_brownfield: isBrownfield, - needs_codebase_map: isBrownfield && !hasCodebaseMap, + fast_mode: fastMode, + needs_codebase_map: needsCodebaseMap, has_codebase_map: hasCodebaseMap, + has_fast_codebase_map: hasFastCodebaseMap, codebase_dir_exists: fs.existsSync(path.join(planningRoot(cwd), 'codebase')), + fast_codebase_map_files_required: FAST_CODEBASE_MAP_FILES, codebase_map_files_present: codebaseMapFiles, missing_codebase_map_files: missingCodebaseMapFiles, + missing_fast_codebase_map_files: missingFastCodebaseMapFiles, has_docs_candidates: docCandidates.length > 0, doc_candidate_count: docCandidates.length, diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index e202cdd0c..cf1f6ddca 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -138,6 +138,29 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.text_mode, true); }); + test('reports fast codebase map readiness for the default fast subset', () => { + fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'INTEGRATIONS', 'ARCHITECTURE', 'STRUCTURE']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + + const result = runGsdTools(['init', 'onboard', '--fast', '--raw'], tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.has_codebase_map, false); + assert.strictEqual(parsed.has_fast_codebase_map, true); + assert.strictEqual(parsed.needs_codebase_map, false); + assert.deepStrictEqual(parsed.fast_codebase_map_files_required, [ + 'STACK.md', + 'INTEGRATIONS.md', + 'ARCHITECTURE.md', + 'STRUCTURE.md', + ]); + assert.deepStrictEqual(parsed.missing_fast_codebase_map_files, []); + }); + test('reports missing requirements in otherwise existing planning', () => { fs.mkdirSync(path.join(tmpDir, '.planning'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); @@ -211,6 +234,10 @@ describe('/gsd:onboard command contract', () => { const content = fs.readFileSync(WF_PATH, 'utf8'); assert.ok(content.includes('init onboard'), 'workflow must use init onboard projection'); + assert.match(content, /gsd_run --cwd "\$_GSD_RUNTIME_ROOT" init onboard/, 'workflow must anchor init onboard at runtime root'); + assert.ok(content.includes('has_fast_codebase_map'), 'workflow must parse fast map readiness'); + assert.match(content, /CODEBASE_MAP_READY=.*has_fast_codebase_map/s, 'workflow must treat the fast subset as acceptable in fast mode'); + assert.ok(content.includes('Run from worktree root'), 'workflow handoffs must be anchored at the worktree root'); for (const runtimeHome of [ 'HERMES_HOME', 'CURSOR_CONFIG_DIR', From 6f2c2c2fd65b29a6223abceb561516637fbf7fc2 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 11:12:50 -0500 Subject: [PATCH 14/75] no-mistakes(review): Anchor onboard summary writes --- gsd-core/workflows/onboard.md | 10 +++++++--- tests/onboard-command.test.cjs | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 11c640eba..ec912c894 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -191,8 +191,12 @@ true, continue. ## 6. Write Onboarding Summary -Create `.planning/onboarding/SUMMARY.md` only after PROJECT.md exists. If it already -exists, update it only after confirmation; do not overwrite silently. +Resolve `ONBOARDING_ROOT={git_worktree_root || _GSD_RUNTIME_ROOT}` before this step. +Use `ONBOARDING_ROOT` for every filesystem write and commit in this step so nested-cwd +invocations do not create `subdir/.planning` artifacts. + +Create `{ONBOARDING_ROOT}/.planning/onboarding/SUMMARY.md` only after PROJECT.md exists. +If it already exists, update it only after confirmation; do not overwrite silently. If `onboarding_summary_exists` is true: @@ -266,7 +270,7 @@ Detected planning docs: {doc_candidate_count} Commit the summary if `commit_docs` is true: ```bash -gsd_run query commit "docs: create onboarding summary" --files .planning/onboarding/SUMMARY.md +gsd_run --cwd "$ONBOARDING_ROOT" query commit "docs: create onboarding summary" --files .planning/onboarding/SUMMARY.md ``` ## 7. Final Status diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index cf1f6ddca..270a0ee67 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -263,6 +263,21 @@ describe('/gsd:onboard command contract', () => { ); assert.ok(content.includes('new-project'), 'workflow must route to new-project'); assert.ok(content.includes('.planning/onboarding/SUMMARY.md'), 'workflow must create onboarding summary'); + assert.match( + content, + /ONBOARDING_ROOT=\{git_worktree_root \|\| _GSD_RUNTIME_ROOT\}/, + 'workflow must resolve a single root for summary writes', + ); + assert.match( + content, + /Create `\{ONBOARDING_ROOT\}\/\.planning\/onboarding\/SUMMARY\.md`/, + 'workflow must anchor summary writes at onboarding root', + ); + assert.match( + content, + /gsd_run --cwd "\$ONBOARDING_ROOT" query commit "docs: create onboarding summary" --files \.planning\/onboarding\/SUMMARY\.md/, + 'workflow must commit the root-relative summary path from onboarding root', + ); assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); assert.ok(content.includes('requirements_exists'), 'workflow must parse requirements existence'); assert.match(content, /REQUIREMENTS\.md: \{requirements_exists \? "present" : "missing"\}/, 'workflow must report missing requirements in partial planning'); From 3e0dbf6cf4880577450bbea9c1b1c63025b12832 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 11:31:29 -0500 Subject: [PATCH 15/75] no-mistakes(review): Label fast onboard partial maps --- gsd-core/workflows/onboard.md | 28 ++++++++++++++++++++++++---- tests/onboard-command.test.cjs | 10 ++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index ec912c894..69e4d6c27 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -38,14 +38,15 @@ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi Parse JSON fields: `planning_exists`, `project_exists`, `requirements_exists`, `roadmap_exists`, `state_exists`, `has_existing_code`, `has_package_file`, -`is_brownfield`, `has_codebase_map`, `has_fast_codebase_map`, +`is_brownfield`, `fast_mode`, `has_codebase_map`, `has_fast_codebase_map`, `codebase_map_files_present`, `missing_codebase_map_files`, `missing_fast_codebase_map_files`, `has_docs_candidates`, `doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `commit_docs`, `agents_installed`, `missing_agents`, `has_git`, `git_worktree_root`, `in_nested_subdir`. +Set `FAST_MODE=fast_mode` from INIT. Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. -Set `CODEBASE_MAP_READY=has_fast_codebase_map` when `--fast` is present; otherwise set +Set `CODEBASE_MAP_READY=has_fast_codebase_map` when `FAST_MODE` is true; otherwise set `CODEBASE_MAP_READY=has_codebase_map`. **Text mode (`workflow.text_mode: true` in config or `--text` flag):** When `TEXT_MODE` is active, replace every `AskUserQuestion` call in this workflow with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available and would otherwise render as an inert code block. @@ -225,6 +226,18 @@ If the user chooses to keep the existing summary, skip to Step 7 without writing If `onboarding_summary_exists` is false or the user confirms an update, write the summary using the template below. +Before rendering summary and final status, derive map status values: + +- If `has_codebase_map` is true: + - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (complete)` + - `CODEBASE_MAP_FINAL_STATUS=(complete)` +- Else if `fast_mode && has_fast_codebase_map` is true: + - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (fast/partial-but-accepted codebase map)` + - `CODEBASE_MAP_FINAL_STATUS=(fast/partial-but-accepted; required fast files present)` +- Else: + - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (incomplete or skipped)` + - `CODEBASE_MAP_FINAL_STATUS=(incomplete or skipped; missing: {missing_codebase_map_files})` + Summary contents: ```markdown @@ -239,7 +252,7 @@ Summary contents: - Requirements: .planning/REQUIREMENTS.md - Roadmap: .planning/ROADMAP.md - State: .planning/STATE.md -- Codebase map: {has_codebase_map ? ".planning/codebase/ (complete)" : ".planning/codebase/ (incomplete or skipped)"} +- Codebase map: {CODEBASE_MAP_SUMMARY_STATUS} ## Codebase Map @@ -252,6 +265,13 @@ Confirmed files: - TESTING.md - INTEGRATIONS.md - CONCERNS.md +{else if fast_mode && has_fast_codebase_map} +Accepted fast map files: +- STACK.md +- INTEGRATIONS.md +- ARCHITECTURE.md +- STRUCTURE.md +Context strength: fast/partial-but-accepted codebase map; not all seven map files are present. {else} Present files: {codebase_map_files_present} Missing files: {missing_codebase_map_files} @@ -283,7 +303,7 @@ Print: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Created / confirmed / status: -- .planning/codebase/ {has_codebase_map ? "(complete)" : "(incomplete or skipped; missing: {missing_codebase_map_files})"} +- .planning/codebase/ {CODEBASE_MAP_FINAL_STATUS} - .planning/PROJECT.md - .planning/REQUIREMENTS.md {requirements_exists ? "(present)" : "(missing; onboarding incomplete)"} - .planning/ROADMAP.md diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 270a0ee67..d75df86ad 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -278,6 +278,16 @@ describe('/gsd:onboard command contract', () => { /gsd_run --cwd "\$ONBOARDING_ROOT" query commit "docs: create onboarding summary" --files \.planning\/onboarding\/SUMMARY\.md/, 'workflow must commit the root-relative summary path from onboarding root', ); + assert.match( + content, + /CODEBASE_MAP_SUMMARY_STATUS=\.planning\/codebase\/ \(fast\/partial-but-accepted codebase map\)/, + 'workflow summary must label fast accepted maps without implying a complete map', + ); + assert.match( + content, + /CODEBASE_MAP_FINAL_STATUS=\(fast\/partial-but-accepted; required fast files present\)/, + 'final status must distinguish complete maps from accepted fast maps', + ); assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); assert.ok(content.includes('requirements_exists'), 'workflow must parse requirements existence'); assert.match(content, /REQUIREMENTS\.md: \{requirements_exists \? "present" : "missing"\}/, 'workflow must report missing requirements in partial planning'); From 41015129e1d78b0b02dbb26b28a518ef71752723 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 11:39:09 -0500 Subject: [PATCH 16/75] no-mistakes(review): Derive onboard map status before summary prompt --- gsd-core/workflows/onboard.md | 24 ++++++++++++------------ tests/onboard-command.test.cjs | 8 ++++++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 69e4d6c27..ee3016dd4 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -199,6 +199,18 @@ invocations do not create `subdir/.planning` artifacts. Create `{ONBOARDING_ROOT}/.planning/onboarding/SUMMARY.md` only after PROJECT.md exists. If it already exists, update it only after confirmation; do not overwrite silently. +Before summary keep/update choices, derive map status values safely: + +- If `has_codebase_map` is true: + - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (complete)` + - `CODEBASE_MAP_FINAL_STATUS=(complete)` +- Else if `fast_mode && has_fast_codebase_map` is true: + - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (fast/partial-but-accepted codebase map)` + - `CODEBASE_MAP_FINAL_STATUS=(fast/partial-but-accepted; required fast files present)` +- Else: + - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (incomplete or skipped)` + - `CODEBASE_MAP_FINAL_STATUS=(incomplete or skipped; missing: {missing_codebase_map_files})` + If `onboarding_summary_exists` is true: - If `TEXT_MODE=true`, print: @@ -226,18 +238,6 @@ If the user chooses to keep the existing summary, skip to Step 7 without writing If `onboarding_summary_exists` is false or the user confirms an update, write the summary using the template below. -Before rendering summary and final status, derive map status values: - -- If `has_codebase_map` is true: - - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (complete)` - - `CODEBASE_MAP_FINAL_STATUS=(complete)` -- Else if `fast_mode && has_fast_codebase_map` is true: - - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (fast/partial-but-accepted codebase map)` - - `CODEBASE_MAP_FINAL_STATUS=(fast/partial-but-accepted; required fast files present)` -- Else: - - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (incomplete or skipped)` - - `CODEBASE_MAP_FINAL_STATUS=(incomplete or skipped; missing: {missing_codebase_map_files})` - Summary contents: ```markdown diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index d75df86ad..afd6ec81e 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -288,6 +288,14 @@ describe('/gsd:onboard command contract', () => { /CODEBASE_MAP_FINAL_STATUS=\(fast\/partial-but-accepted; required fast files present\)/, 'final status must distinguish complete maps from accepted fast maps', ); + const deriveMapStatusIndex = content.indexOf('Before summary keep/update choices, derive map status values safely:'); + const keepExistingSummaryIndex = content.indexOf('If `onboarding_summary_exists` is true:'); + assert.ok(deriveMapStatusIndex >= 0, 'workflow must derive map status values'); + assert.ok(keepExistingSummaryIndex >= 0, 'workflow must define the existing-summary branch'); + assert.ok( + deriveMapStatusIndex < keepExistingSummaryIndex, + 'workflow must derive final map status before a keep-existing-summary path can skip to final status', + ); assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); assert.ok(content.includes('requirements_exists'), 'workflow must parse requirements existence'); assert.match(content, /REQUIREMENTS\.md: \{requirements_exists \? "present" : "missing"\}/, 'workflow must report missing requirements in partial planning'); From 1c992bf57d6a376eb379f9be7566345f573cc542 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 11:44:48 -0500 Subject: [PATCH 17/75] no-mistakes(review): Stop fast onboard dead-end --- gsd-core/workflows/onboard.md | 16 ++++++++++++++++ tests/onboard-command.test.cjs | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index ee3016dd4..f8b501ee3 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -149,6 +149,22 @@ Exit. ## 5. Project Initialization Gate +If `project_exists` is false and `fast_mode && has_fast_codebase_map && !has_codebase_map` is true: + +Print: + +```text +Fast codebase context is accepted for onboarding, but /gsd:new-project still requires the complete codebase map. + +Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: + +/gsd:map-codebase + +Then rerun /gsd:onboard from the same worktree root. +``` + +Exit. + If `project_exists` is false: Print: diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index afd6ec81e..0de2a27be 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -288,6 +288,16 @@ describe('/gsd:onboard command contract', () => { /CODEBASE_MAP_FINAL_STATUS=\(fast\/partial-but-accepted; required fast files present\)/, 'final status must distinguish complete maps from accepted fast maps', ); + assert.match( + content, + /If `project_exists` is false and `fast_mode && has_fast_codebase_map && !has_codebase_map` is true:/, + 'workflow must not hand fast-partial maps directly to new-project', + ); + assert.match( + content, + /Fast codebase context is accepted for onboarding, but \/gsd:new-project still requires the complete codebase map\./, + 'workflow must explain why fast-partial onboarding stops before new-project', + ); const deriveMapStatusIndex = content.indexOf('Before summary keep/update choices, derive map status values safely:'); const keepExistingSummaryIndex = content.indexOf('If `onboarding_summary_exists` is true:'); assert.ok(deriveMapStatusIndex >= 0, 'workflow must derive map status values'); From ddd855887394539c23ce0e0ab922a0ccfc3938a2 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 12:02:02 -0500 Subject: [PATCH 18/75] no-mistakes(document): Sync onboarding documentation gaps --- docs/ARCHITECTURE.md | 3 ++- docs/how-to/install-on-your-runtime.md | 5 +++-- docs/ja-JP/ARCHITECTURE.md | 3 ++- docs/ja-JP/how-to/install-on-your-runtime.md | 5 +++-- docs/ja-JP/reference/planning-artifacts.md | 18 ++++++++++++++---- .../onboarding-an-existing-codebase.md | 13 +++++++++---- docs/ko-KR/ARCHITECTURE.md | 3 ++- docs/ko-KR/how-to/install-on-your-runtime.md | 5 +++-- docs/ko-KR/reference/planning-artifacts.md | 18 ++++++++++++++---- .../onboarding-an-existing-codebase.md | 13 ++++++++----- docs/pt-BR/ARCHITECTURE.md | 3 ++- docs/pt-BR/how-to/install-on-your-runtime.md | 5 +++-- docs/pt-BR/reference/planning-artifacts.md | 18 ++++++++++++++---- .../onboarding-an-existing-codebase.md | 15 ++++++++++----- docs/zh-CN/ARCHITECTURE.md | 3 ++- docs/zh-CN/how-to/install-on-your-runtime.md | 5 +++-- docs/zh-CN/reference/planning-artifacts.md | 18 ++++++++++++++---- .../onboarding-an-existing-codebase.md | 15 ++++++++++----- 18 files changed, 118 insertions(+), 50 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 07e25df3a..760409bcd 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -620,7 +620,8 @@ Equivalent paths for other runtimes: │ ├── FEATURES.md │ ├── ARCHITECTURE.md │ └── PITFALLS.md -├── codebase/ # Brownfield mapping (from /gsd-map-codebase) +├── codebase/ # Brownfield mapping (from /gsd-map-codebase or /gsd-onboard) +├── onboarding/ # Brownfield onboarding summary (from /gsd-onboard) │ ├── STACK.md # YAML frontmatter carries `last_mapped_commit` │ ├── ARCHITECTURE.md # for the post-execute drift gate (#2003) │ ├── CONVENTIONS.md diff --git a/docs/how-to/install-on-your-runtime.md b/docs/how-to/install-on-your-runtime.md index d24c1203f..258290f07 100644 --- a/docs/how-to/install-on-your-runtime.md +++ b/docs/how-to/install-on-your-runtime.md @@ -447,10 +447,11 @@ npx @opengsd/gsd-core@latest --opencode --global ## After install -Restart your runtime to pick up new commands and agents. Then start your first project: +Restart your runtime to pick up new commands and agents. Then start a new project or onboard an existing repo: ```bash -/gsd-new-project +/gsd-new-project # greenfield project +/gsd-onboard # existing codebase ``` If the command is not found after restart, verify the install directory matches the runtime's expected config path. The prerelease-editions section above covers the most common mismatch. diff --git a/docs/ja-JP/ARCHITECTURE.md b/docs/ja-JP/ARCHITECTURE.md index 18cfae29f..b35afae2a 100644 --- a/docs/ja-JP/ARCHITECTURE.md +++ b/docs/ja-JP/ARCHITECTURE.md @@ -474,7 +474,8 @@ UI-SPEC.md (per phase) ─────────────────── │ ├── FEATURES.md │ ├── ARCHITECTURE.md │ └── PITFALLS.md -├── codebase/ # ブラウンフィールドマッピング(/gsd-map-codebase から) +├── codebase/ # ブラウンフィールドマッピング(/gsd-map-codebase または /gsd-onboard から) +├── onboarding/ # ブラウンフィールドオンボーディング概要(/gsd-onboard から) │ ├── STACK.md │ ├── ARCHITECTURE.md │ ├── CONVENTIONS.md diff --git a/docs/ja-JP/how-to/install-on-your-runtime.md b/docs/ja-JP/how-to/install-on-your-runtime.md index 1c1900736..bcd26fc82 100644 --- a/docs/ja-JP/how-to/install-on-your-runtime.md +++ b/docs/ja-JP/how-to/install-on-your-runtime.md @@ -273,10 +273,11 @@ npx @opengsd/gsd-core@latest --opencode --global ## インストール後の作業 -新しいコマンドとエージェントを反映するためにランタイムを再起動してください。その後、最初のプロジェクトを開始します。 +新しいコマンドとエージェントを反映するためにランタイムを再起動してください。その後、新規プロジェクトを開始するか既存リポジトリをオンボーディングします。 ```bash -/gsd-new-project +/gsd-new-project # グリーンフィールドプロジェクト +/gsd-onboard # 既存コードベース ``` 再起動後もコマンドが見つからない場合は、インストールディレクトリがランタイムの期待する設定パスと一致しているか確認してください。最もよくある不一致については上記のプレリリースエディションのセクションを参照してください。 diff --git a/docs/ja-JP/reference/planning-artifacts.md b/docs/ja-JP/reference/planning-artifacts.md index 1f51165ca..f231de028 100644 --- a/docs/ja-JP/reference/planning-artifacts.md +++ b/docs/ja-JP/reference/planning-artifacts.md @@ -23,6 +23,8 @@ │ ├── architecture.md │ ├── stack.md │ └── ... +├── onboarding/ # ブラウンフィールドオンボーディング概要(オプション) +│ └── SUMMARY.md ├── intel/ # クエリ可能なシンボルインデックス(オプション、intel.enabled) │ └── API-SURFACE.md └── phases/ @@ -48,7 +50,7 @@ | | | |---|---| | **用途** | プロジェクトの正規アイデンティティ: 概要、対象ユーザー、コアバリュー、要件、制約、主要な意思決定。プロダクトの進化に伴いプロジェクトライフサイクル全体を通じて更新されます。 | -| **生成元** | `/gsd-new-project`(初回作成); 意思決定が検証されると `/gsd-complete-milestone` によって更新されます。 | +| **生成元** | `/gsd-new-project`(初回作成、`/gsd-onboard` のハンドオフを含む); 意思決定が検証されると `/gsd-complete-milestone` によって更新されます。 | | **参照先** | すべてのプランニングワークフロー; `gsd-phase-researcher`、`gsd-planner`(コンテキスト); `discuss-phase`(過去の意思決定); `gsd-plan-checker`(プロジェクト制約)。 | ### `ROADMAP.md` @@ -56,7 +58,7 @@ | | | |---|---| | **用途** | マイルストーンおよびフェーズ一覧。ゴール、要件 ID、成功基準、フェーズごとの正規リファレンスを含みます。プロジェクトが何をどの順序で構築するかに関する唯一の信頼できる情報源です。 | -| **生成元** | `/gsd-new-project`(初回作成); `/gsd-phase --insert` および `/gsd-complete-milestone` によって更新されます。 | +| **生成元** | `/gsd-new-project`(初回作成、`/gsd-onboard` のハンドオフを含む); `/gsd-phase --insert` および `/gsd-complete-milestone` によって更新されます。 | | **参照先** | `/gsd-discuss-phase`、`/gsd-plan-phase`、`/gsd-execute-phase`; フェーズ情報を必要とするすべてのオーケストレーションコマンド; `gsd-planner`、`gsd-plan-checker`、`gsd-phase-researcher`。 | ### `REQUIREMENTS.md` @@ -64,7 +66,7 @@ | | | |---|---| | **用途** | 番号付きのチェック可能な受け入れ基準。各要件はロードマップフェーズにマッピングされる ID(例: `AUTH-01`)を持ちます。フェーズが実行されると要件を完了済みとしてマークします。 | -| **生成元** | `/gsd-new-project`(初回作成); `execute-phase` によって要件が完了済みとしてマークされます。 | +| **生成元** | `/gsd-new-project`(初回作成、`/gsd-onboard` のハンドオフを含む); `execute-phase` によって要件が完了済みとしてマークされます。 | | **参照先** | `gsd-planner`(プランはすべてのフェーズ要件 ID に対処しなければならない); `gsd-plan-checker` ディメンション1(要件カバレッジ); `discuss-phase`(過去の要件)。 | ### `STATE.md` @@ -72,7 +74,7 @@ | | | |---|---| | **用途** | 現在地を追跡するリビングドキュメント — 現在のフェーズとプラン、進捗指標、蓄積された意思決定、セッション継続性ノート。すべてのワークフロー実行の開始時に読み込まれます。重要なアクションのたびに更新されます。 | -| **生成元** | `/gsd-new-project`(初回作成); すべてのフェーズワークフロー、`/gsd-pause-work`、`/gsd-resume-work` によって継続的に更新されます。 | +| **生成元** | `/gsd-new-project`(初回作成、`/gsd-onboard` のハンドオフを含む); すべてのフェーズワークフロー、`/gsd-pause-work`、`/gsd-resume-work` によって継続的に更新されます。 | | **参照先** | すべてのオーケストレーションワークフロー; `/gsd-progress`; `/gsd-quick` 経由のアドホックタスク実行; `gsd-planner` および `gsd-phase-researcher`(プロジェクトの意思決定)。 | 完全なフィールドリファレンスは [STATE.md スキーマ](state-md.md) を参照してください。 @@ -87,6 +89,14 @@ 完全なスキーマは [CONFIGURATION](../../CONFIGURATION.md) を参照してください。 +### `onboarding/SUMMARY.md`(オプション) + +| | | +|---|---| +| **用途** | ブラウンフィールドオンボーディングの索引。アーティファクト状態、コードベースマッピングの完了状況、初回セットアップ後に推奨される次の GSD コマンドを記録します。 | +| **生成元** | `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` がすべて存在した後の `/gsd-onboard`。 | +| **参照先** | 初回セットアップを確認する人間、および既存オンボーディング状態を確認する今後の `/gsd-onboard` 実行。 | + ### `MILESTONES.md`(オプション) | | | diff --git a/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md b/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md index 65a23543a..a877ff94b 100644 --- a/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md +++ b/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md @@ -46,7 +46,7 @@ claude --dangerously-skip-permissions ## ステップ 3 — Brownfield オンボーディングの開始 -プロジェクトを作成する前に、GSD Core に既存のコードを学習させてください。これがブラウンフィールドの計画を正確にするステップです。 +プロジェクトを作成する前に、GSD Core にリポジトリ状態を確認させ、安全な次のトップレベルコマンドを表示させます。これにより、コードベースコンテキストの取りこぼしや既存 planning ファイルの上書きを防げます。 ```text /gsd-onboard @@ -84,7 +84,7 @@ Created .planning/codebase/: --- -## ステップ 4 — コンテキストをクリアしてプロジェクトを作成 +## ステップ 4 — オンボーディングを再実行してプロジェクトを初期化する セッションウィンドウをクリアします: @@ -92,12 +92,14 @@ Created .planning/codebase/: /clear ``` -プロジェクトを作成します。前のステップで GSD Core が既存のコードを見つけているため、これがブラウンフィールドプロジェクトであることをすでに把握しています。`/gsd-new-project` を実行すると、既存のものを再説明するのではなく、*追加する*内容に焦点を当てた質問がされます: +`/gsd-onboard` をもう一度実行します。GSD Core が ADR、PRD、spec、RFC、またはルートレベルの要件ドキュメントを検出した場合は、先に推奨される `/gsd-ingest-docs` ハンドオフを実行し、その後 `/gsd-onboard` を再実行してください。コンテキストが整うと、オンボーディングはプロジェクト初期化のハンドオフを表示します: ```text /gsd-new-project ``` +前のステップで GSD Core が既存のコードを見つけているため、`/gsd-new-project` はこれがブラウンフィールドプロジェクトだと分かっています。質問は既存のものを再説明するのではなく、*追加する*内容に焦点を当てます: + GSD Core が何を作りたいかを尋ねます。コードベース全体の説明ではなく、追加する機能で答えてください: ```text @@ -124,6 +126,8 @@ Proposed Roadmap ロードマップを承認してください。 +プロジェクト設定が完了したら、もう一度 `/gsd-onboard` を実行します。`PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` がすべて存在するため、オンボーディングは `.planning/onboarding/SUMMARY.md` を作成または確認します。 + **`.planning/` に作成されるファイル:** ```text @@ -133,7 +137,7 @@ Proposed Roadmap ROADMAP.md ← フェーズ 1、ステータス: pending STATE.md ← セッションメモリ config.json ← ワークフロー設定 - onboarding/SUMMARY.md ← onboarding status and next command + onboarding/SUMMARY.md ← オンボーディング状態と次のコマンド codebase/ ← ステップ 3 の7つのマップファイル ``` @@ -213,6 +217,7 @@ GSD Core があなたの `CONVENTIONS.md` と `ARCHITECTURE.md` を読み込ん ## 学んだこと +- `/gsd-onboard` が対話型コマンドをネストしたり既存 planning ファイルを上書きしたりせずに、ブラウンフィールド設定を安全に順序付ける仕組み。 - `/gsd-map-codebase` が4つの並行エージェントを実行して `.planning/codebase/` に `STACK.md`、`ARCHITECTURE.md`、`CONVENTIONS.md`、`CONCERNS.md`、`STRUCTURE.md`、`TESTING.md`、`INTEGRATIONS.md` を生成する仕組み。 - ブラウンフィールドリポジトリで `/gsd-new-project` を実行すると、*追加する*内容に焦点を当てた質問がされ、既存コードから Validated 要件が自動入力される仕組み。 - コードベースマップが `/gsd-discuss-phase` のすべての質問を形成する方法 — ファイルパス、パターン、規約が実際のコードから導出される。 diff --git a/docs/ko-KR/ARCHITECTURE.md b/docs/ko-KR/ARCHITECTURE.md index 3c8481647..2e737c75c 100644 --- a/docs/ko-KR/ARCHITECTURE.md +++ b/docs/ko-KR/ARCHITECTURE.md @@ -512,7 +512,8 @@ UI-SPEC.md (단계별) ─────────────────── │ ├── FEATURES.md │ ├── ARCHITECTURE.md │ └── PITFALLS.md -├── codebase/ # 브라운필드 매핑 (/gsd-map-codebase에서) +├── codebase/ # 브라운필드 매핑 (/gsd-map-codebase 또는 /gsd-onboard에서) +├── onboarding/ # 브라운필드 온보딩 요약 (/gsd-onboard에서) │ ├── STACK.md # YAML 전문에 `last_mapped_commit` 포함 │ ├── ARCHITECTURE.md # 실행 후 드리프트 게이트를 위한 (#2003) │ ├── CONVENTIONS.md diff --git a/docs/ko-KR/how-to/install-on-your-runtime.md b/docs/ko-KR/how-to/install-on-your-runtime.md index 1a296068f..435e48c81 100644 --- a/docs/ko-KR/how-to/install-on-your-runtime.md +++ b/docs/ko-KR/how-to/install-on-your-runtime.md @@ -273,10 +273,11 @@ npx @opengsd/gsd-core@latest --opencode --global ## 설치 후 -새 명령과 에이전트를 적용하려면 런타임을 재시작하세요. 그런 다음 첫 번째 프로젝트를 시작합니다: +새 명령과 에이전트를 적용하려면 런타임을 재시작하세요. 그런 다음 새 프로젝트를 시작하거나 기존 저장소를 온보딩합니다: ```bash -/gsd-new-project +/gsd-new-project # 그린필드 프로젝트 +/gsd-onboard # 기존 코드베이스 ``` 재시작 후 명령을 찾을 수 없다면 설치 디렉터리가 런타임이 기대하는 설정 경로와 일치하는지 확인하세요. 위의 프리릴리스 에디션 섹션에서 가장 흔한 불일치 사례를 다룹니다. diff --git a/docs/ko-KR/reference/planning-artifacts.md b/docs/ko-KR/reference/planning-artifacts.md index 0447a9392..04c163b7a 100644 --- a/docs/ko-KR/reference/planning-artifacts.md +++ b/docs/ko-KR/reference/planning-artifacts.md @@ -23,6 +23,8 @@ │ ├── architecture.md │ ├── stack.md │ └── ... +├── onboarding/ # 브라운필드 온보딩 요약 (선택) +│ └── SUMMARY.md ├── intel/ # 쿼리 가능한 심볼 인덱스 (선택, intel.enabled) │ └── API-SURFACE.md └── phases/ @@ -48,7 +50,7 @@ | | | |---|---| | **목적** | 표준 프로젝트 아이덴티티: 무엇인지, 누구를 위한 것인지, 핵심 가치, 요구사항, 제약 사항, 주요 결정. 제품이 발전함에 따라 프로젝트 생명주기 전반에 걸쳐 업데이트됩니다. | -| **생성자** | `/gsd-new-project` (최초 생성); 결정이 검증됨에 따라 `/gsd-complete-milestone`에 의해 업데이트됩니다. | +| **생성자** | `/gsd-new-project` (최초 생성, `/gsd-onboard` handoff 포함); 결정이 검증됨에 따라 `/gsd-complete-milestone`에 의해 업데이트됩니다. | | **소비자** | 모든 플래닝 워크플로; `gsd-phase-researcher`, `gsd-planner` (컨텍스트); `discuss-phase` (이전 결정); `gsd-plan-checker` (프로젝트 제약 사항). | ### `ROADMAP.md` @@ -56,7 +58,7 @@ | | | |---|---| | **목적** | 목표, 요구사항 ID, 성공 기준, 페이즈별 표준 참조가 있는 마일스톤 및 페이즈 목록. 프로젝트가 무엇을 빌드하고 어떤 순서로 하는지에 대한 단일 진실의 원천. | -| **생성자** | `/gsd-new-project` (최초 생성); `/gsd-phase --insert`와 `/gsd-complete-milestone`에 의해 업데이트됩니다. | +| **생성자** | `/gsd-new-project` (최초 생성, `/gsd-onboard` handoff 포함); `/gsd-phase --insert`와 `/gsd-complete-milestone`에 의해 업데이트됩니다. | | **소비자** | `/gsd-discuss-phase`, `/gsd-plan-phase`, `/gsd-execute-phase`; 페이즈 정보가 필요한 모든 오케스트레이션 명령; `gsd-planner`, `gsd-plan-checker`, `gsd-phase-researcher`. | ### `REQUIREMENTS.md` @@ -64,7 +66,7 @@ | | | |---|---| | **목적** | 프로젝트의 번호가 매겨진 체크 가능한 인수 기준. 각 요구사항은 로드맵 페이즈에 매핑되는 ID(예: `AUTH-01`)를 가집니다. 페이즈가 실행됨에 따라 요구사항을 완료로 표시합니다. | -| **생성자** | `/gsd-new-project` (최초 생성); `execute-phase`에 의해 요구사항이 완료로 표시됩니다. | +| **생성자** | `/gsd-new-project` (최초 생성, `/gsd-onboard` handoff 포함); `execute-phase`에 의해 요구사항이 완료로 표시됩니다. | | **소비자** | `gsd-planner` (플랜은 모든 페이즈 요구사항 ID를 처리해야 함); `gsd-plan-checker` Dimension 1 (요구사항 커버리지); `discuss-phase` (이전 요구사항). | ### `STATE.md` @@ -72,7 +74,7 @@ | | | |---|---| | **목적** | 살아있는 위치 추적기 — 현재 페이즈와 플랜, 진행 지표, 누적된 결정, 세션 연속성 노트. 모든 워크플로 실행 시작 시 읽힙니다. 중요한 작업 이후 업데이트됩니다. | -| **생성자** | `/gsd-new-project` (최초 생성); 모든 페이즈 워크플로, `/gsd-pause-work`, `/gsd-resume-work`에 의해 지속적으로 업데이트됩니다. | +| **생성자** | `/gsd-new-project` (최초 생성, `/gsd-onboard` handoff 포함); 모든 페이즈 워크플로, `/gsd-pause-work`, `/gsd-resume-work`에 의해 지속적으로 업데이트됩니다. | | **소비자** | 모든 오케스트레이션 워크플로; `/gsd-progress`; `/gsd-quick`을 통한 임시 태스크 실행; `gsd-planner` 및 `gsd-phase-researcher` (프로젝트 결정). | 전체 필드 참조는 [STATE.md 스키마](state-md.md)를 참조하세요. @@ -87,6 +89,14 @@ 전체 스키마는 [CONFIGURATION](../../CONFIGURATION.md)을 참조하세요. +### `onboarding/SUMMARY.md` (선택) + +| | | +|---|---| +| **목적** | 브라운필드 온보딩 인덱스. 아티팩트 상태, 코드베이스 매핑 완료 여부, 초기 설정 후 권장되는 다음 GSD 명령을 기록합니다. | +| **생성자** | `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md`가 모두 존재한 뒤 `/gsd-onboard`. | +| **소비자** | 초기 설정을 검토하는 사람; 기존 온보딩 상태를 확인하는 향후 `/gsd-onboard` 실행. | + ### `MILESTONES.md` (선택) | | | diff --git a/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md b/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md index 89306d2ea..c1a058550 100644 --- a/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md +++ b/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md @@ -44,9 +44,9 @@ claude --dangerously-skip-permissions --- -## Step 3 — 코드베이스 매핑 +## Step 3 — 브라운필드 온보딩 시작 -프로젝트를 생성하기 전에 GSD Core가 이미 존재하는 것을 학습하도록 합니다. 이 단계가 브라운필드 계획의 정확도를 높이는 핵심입니다. +프로젝트를 생성하기 전에 GSD Core가 저장소 상태를 검사하고 안전한 다음 top-level 명령을 알려주게 하세요. 이 단계는 코드베이스 컨텍스트를 건너뛰거나 기존 planning 파일을 덮어쓰는 일을 방지합니다. ```text /gsd-onboard @@ -84,7 +84,7 @@ Created .planning/codebase/: --- -## Step 4 — 컨텍스트 초기화 후 프로젝트 생성 +## Step 4 — 온보딩 재실행 및 프로젝트 초기화 세션 창을 초기화합니다: @@ -92,7 +92,7 @@ Created .planning/codebase/: /clear ``` -이제 프로젝트를 생성합니다. GSD Core가 이전 단계에서 기존 코드를 발견했으므로, 이미 이것이 브라운필드 프로젝트임을 알고 있습니다. `/gsd-new-project`를 실행하면 기존의 것을 재구성하는 것이 아니라 *추가하는* 것에 집중한 질문을 합니다: +이제 `/gsd-onboard`를 다시 실행합니다. GSD Core가 ADR, PRD, spec, RFC 또는 루트 요구사항 문서를 감지하면 먼저 권장되는 `/gsd-ingest-docs` handoff를 실행하고 이후 `/gsd-onboard`를 다시 실행하세요. 컨텍스트가 준비되면 온보딩이 프로젝트 초기화 handoff를 출력합니다: ```text /gsd-new-project @@ -124,6 +124,8 @@ Proposed Roadmap 로드맵을 승인합니다. +프로젝트 설정이 끝난 뒤 `/gsd-onboard`를 한 번 더 실행합니다. 이제 `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md`가 모두 있으므로 온보딩은 `.planning/onboarding/SUMMARY.md`를 생성하거나 확인합니다. + **`.planning/`에 생성되는 파일:** ```text @@ -133,7 +135,7 @@ Proposed Roadmap ROADMAP.md ← Phase 1, 상태: pending STATE.md ← 세션 메모리 config.json ← 워크플로 설정 - onboarding/SUMMARY.md ← onboarding status and next command + onboarding/SUMMARY.md ← 온보딩 상태와 다음 명령 codebase/ ← Step 3에서 생성된 7개의 맵 파일 ``` @@ -213,6 +215,7 @@ GSD Core가 `CONVENTIONS.md`와 `ARCHITECTURE.md`를 읽었으므로, 질문들 ## 배운 내용 +- `/gsd-onboard`가 인터랙티브 명령을 중첩하거나 기존 planning 파일을 덮어쓰지 않고 브라운필드 설정을 안전하게 순서화하는 방법. - `/gsd-map-codebase`가 4개의 병렬 에이전트를 실행하여 `.planning/codebase/`에 `STACK.md`, `ARCHITECTURE.md`, `CONVENTIONS.md`, `CONCERNS.md`, `STRUCTURE.md`, `TESTING.md`, `INTEGRATIONS.md`를 생성하는 방법. - 브라운필드 저장소에서 `/gsd-new-project`가 *추가하는* 것에 집중한 질문을 하고 기존 코드에서 Validated 요구사항을 채우는 방법. - 코드베이스 맵이 `/gsd-discuss-phase`의 모든 질문을 형성하는 방법 — 파일 경로, 패턴, 컨벤션이 실제 코드에서 옵니다. diff --git a/docs/pt-BR/ARCHITECTURE.md b/docs/pt-BR/ARCHITECTURE.md index 4b2f1cf3f..14ff90570 100644 --- a/docs/pt-BR/ARCHITECTURE.md +++ b/docs/pt-BR/ARCHITECTURE.md @@ -527,7 +527,8 @@ Caminhos equivalentes para outros runtimes: │ ├── FEATURES.md │ ├── ARCHITECTURE.md │ └── PITFALLS.md -├── codebase/ # Mapeamento de brownfield (do /gsd-map-codebase) +├── codebase/ # Mapeamento de brownfield (do /gsd-map-codebase ou /gsd-onboard) +├── onboarding/ # Resumo de onboarding brownfield (do /gsd-onboard) │ ├── STACK.md # Frontmatter YAML carrega `last_mapped_commit` │ ├── ARCHITECTURE.md # para o portão de desvio pós-execução (#2003) │ ├── CONVENTIONS.md diff --git a/docs/pt-BR/how-to/install-on-your-runtime.md b/docs/pt-BR/how-to/install-on-your-runtime.md index ba0d31ea1..3b70bc4e8 100644 --- a/docs/pt-BR/how-to/install-on-your-runtime.md +++ b/docs/pt-BR/how-to/install-on-your-runtime.md @@ -273,10 +273,11 @@ npx @opengsd/gsd-core@latest --opencode --global ## Após a instalação -Reinicie seu ambiente para carregar os novos comandos e agentes. Em seguida, inicie seu primeiro projeto: +Reinicie seu ambiente para carregar os novos comandos e agentes. Em seguida, inicie um projeto novo ou faça onboarding de um repositório existente: ```bash -/gsd-new-project +/gsd-new-project # projeto greenfield +/gsd-onboard # base de código existente ``` Se o comando não for encontrado após o reinício, verifique se o diretório de instalação corresponde ao caminho de configuração esperado pelo ambiente. A seção de edições de pré-lançamento acima cobre a incompatibilidade mais comum. diff --git a/docs/pt-BR/reference/planning-artifacts.md b/docs/pt-BR/reference/planning-artifacts.md index 7d6859acc..5ddb9ecfa 100644 --- a/docs/pt-BR/reference/planning-artifacts.md +++ b/docs/pt-BR/reference/planning-artifacts.md @@ -23,6 +23,8 @@ O diretório `.planning/` é a memória compartilhada do GSD Core para um projet │ ├── architecture.md │ ├── stack.md │ └── ... +├── onboarding/ # Resumo de onboarding brownfield (opcional) +│ └── SUMMARY.md ├── intel/ # Índice de símbolos consultável (opcional, intel.enabled) │ └── API-SURFACE.md └── phases/ @@ -48,7 +50,7 @@ O diretório `.planning/` é a memória compartilhada do GSD Core para um projet | | | |---|---| | **Finalidade** | Identidade canônica do projeto: o que é, para quem é, valor central, requisitos, restrições e decisões-chave. Atualizado ao longo do ciclo de vida do projeto conforme o produto evolui. | -| **Produzido por** | `/gsd-new-project` (criação inicial); atualizado por `/gsd-complete-milestone` à medida que as decisões são validadas. | +| **Produzido por** | `/gsd-new-project` (criação inicial, incluindo handoff do `/gsd-onboard`); atualizado por `/gsd-complete-milestone` à medida que as decisões são validadas. | | **Consumido por** | Todos os fluxos de trabalho de planejamento; `gsd-phase-researcher`, `gsd-planner` (contexto); `discuss-phase` (decisões anteriores); `gsd-plan-checker` (restrições do projeto). | ### `ROADMAP.md` @@ -56,7 +58,7 @@ O diretório `.planning/` é a memória compartilhada do GSD Core para um projet | | | |---|---| | **Finalidade** | Listagem de marcos e fases com objetivos, IDs de requisitos, critérios de sucesso e referências canônicas por fase. A fonte única de verdade sobre o que o projeto está construindo e em que ordem. | -| **Produzido por** | `/gsd-new-project` (criação inicial); atualizado por `/gsd-phase --insert` e `/gsd-complete-milestone`. | +| **Produzido por** | `/gsd-new-project` (criação inicial, incluindo handoff do `/gsd-onboard`); atualizado por `/gsd-phase --insert` e `/gsd-complete-milestone`. | | **Consumido por** | `/gsd-discuss-phase`, `/gsd-plan-phase`, `/gsd-execute-phase`; todos os comandos de orquestração que precisam de informações de fase; `gsd-planner`, `gsd-plan-checker`, `gsd-phase-researcher`. | ### `REQUIREMENTS.md` @@ -64,7 +66,7 @@ O diretório `.planning/` é a memória compartilhada do GSD Core para um projet | | | |---|---| | **Finalidade** | Critérios de aceitação numerados e verificáveis para o projeto. Cada requisito possui um ID (ex.: `AUTH-01`) que mapeia para as fases do roadmap. Marca os requisitos como concluídos conforme as fases são executadas. | -| **Produzido por** | `/gsd-new-project` (criação inicial); requisitos marcados como concluídos por `execute-phase`. | +| **Produzido por** | `/gsd-new-project` (criação inicial, incluindo handoff do `/gsd-onboard`); requisitos marcados como concluídos por `execute-phase`. | | **Consumido por** | `gsd-planner` (os planos devem contemplar todos os IDs de requisitos da fase); `gsd-plan-checker` Dimensão 1 (cobertura de requisitos); `discuss-phase` (requisitos anteriores). | ### `STATE.md` @@ -72,7 +74,7 @@ O diretório `.planning/` é a memória compartilhada do GSD Core para um projet | | | |---|---| | **Finalidade** | Rastreador de posição em andamento — fase e plano atuais, métricas de progresso, decisões acumuladas, notas de continuidade de sessão. Lido no início de toda execução de fluxo de trabalho. Atualizado após cada ação significativa. | -| **Produzido por** | `/gsd-new-project` (criação inicial); atualizado continuamente por todos os fluxos de fase, `/gsd-pause-work`, `/gsd-resume-work`. | +| **Produzido por** | `/gsd-new-project` (criação inicial, incluindo handoff do `/gsd-onboard`); atualizado continuamente por todos os fluxos de fase, `/gsd-pause-work`, `/gsd-resume-work`. | | **Consumido por** | Todos os fluxos de orquestração; `/gsd-progress`; execução de tarefas avulsas via `/gsd-quick`; `gsd-planner` e `gsd-phase-researcher` (decisões do projeto). | Consulte o [esquema de STATE.md](state-md.md) para a referência completa de campos. @@ -87,6 +89,14 @@ Consulte o [esquema de STATE.md](state-md.md) para a referência completa de cam Consulte [CONFIGURATION](../CONFIGURATION.md) para o esquema completo. +### `onboarding/SUMMARY.md` (opcional) + +| | | +|---|---| +| **Finalidade** | Índice de onboarding brownfield que registra status dos artefatos, se o mapeamento do código-base está completo e o próximo comando GSD recomendado após a configuração inicial. | +| **Produzido por** | `/gsd-onboard` depois que `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md` e `STATE.md` existem. | +| **Consumido por** | Humanos revisando a configuração inicial; futuras execuções de `/gsd-onboard` ao confirmar o estado de onboarding existente. | + ### `MILESTONES.md` (opcional) | | | diff --git a/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md b/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md index a34dc4008..26584a9db 100644 --- a/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md +++ b/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md @@ -44,9 +44,9 @@ claude --dangerously-skip-permissions --- -## Passo 3 — Mapear a base de código +## Passo 3 — Iniciar o onboarding brownfield -Antes de criar um projeto, deixe o GSD Core aprender o que já existe. Este é o passo que torna o planejamento brownfield preciso. +Antes de criar um projeto, deixe o GSD Core inspecionar o estado do repositório e indicar o próximo comando de nível superior seguro. Este passo evita pular contexto de código ou sobrescrever arquivos de planning existentes. ```text /gsd-onboard @@ -84,7 +84,7 @@ Abra `.planning/codebase/CONCERNS.md`. Este é o arquivo mais útil para ler ant --- -## Passo 4 — Limpar o contexto e criar o projeto +## Passo 4 — Reexecutar o onboarding e inicializar o projeto Limpe a janela de sessão: @@ -92,12 +92,14 @@ Limpe a janela de sessão: /clear ``` -Agora crie o projeto. Como o GSD Core encontrou código existente no passo anterior, já sabe que se trata de um projeto brownfield. Quando você executa `/gsd-new-project`, as perguntas focam no que você está *adicionando*, e não em reconstruir o que já existe: +Agora execute `/gsd-onboard` novamente. Se o GSD Core detectar ADRs, PRDs, specs, RFCs ou requisitos de nível raiz, aceite o handoff recomendado para `/gsd-ingest-docs` primeiro e depois rode `/gsd-onboard` de novo. Quando o contexto estiver pronto, o onboarding imprimirá o handoff de inicialização: ```text /gsd-new-project ``` +Como o GSD Core encontrou código existente no passo anterior, `/gsd-new-project` sabe que é um projeto brownfield. As perguntas focam no que você está *adicionando*, não em reconstruir o que já existe: + O GSD Core pergunta o que você quer construir. Responda com o recurso que está adicionando, e não com uma descrição de toda a base de código: ```text @@ -124,6 +126,8 @@ Proposed Roadmap Aprove o roteiro. +Execute `/gsd-onboard` mais uma vez depois que a configuração do projeto terminar. Agora que `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md` e `STATE.md` existem, o onboarding cria ou confirma `.planning/onboarding/SUMMARY.md`. + **O que é criado em `.planning/`:** ```text @@ -133,7 +137,7 @@ Aprove o roteiro. ROADMAP.md ← Fase 1, status: pending STATE.md ← memória de sessão config.json ← configurações do fluxo de trabalho - onboarding/SUMMARY.md ← onboarding status and next command + onboarding/SUMMARY.md ← status do onboarding e próximo comando codebase/ ← os sete arquivos de mapa do Passo 3 ``` @@ -213,6 +217,7 @@ Para cada recurso futuro, execute `/gsd-map-codebase` novamente sempre que a est ## O que você aprendeu +- Como `/gsd-onboard` sequencia com segurança o setup brownfield sem aninhar comandos interativos ou sobrescrever planning existente. - Como `/gsd-map-codebase` executa quatro agentes paralelos para produzir `STACK.md`, `ARCHITECTURE.md`, `CONVENTIONS.md`, `CONCERNS.md`, `STRUCTURE.md`, `TESTING.md` e `INTEGRATIONS.md` em `.planning/codebase/`. - Como `/gsd-new-project` em um repositório brownfield concentra as perguntas no que você está *adicionando* e preenche os requisitos Validated a partir do código existente. - Como o mapa da base de código orienta cada pergunta em `/gsd-discuss-phase` — caminhos de arquivos, padrões e convenções vêm do seu código real. diff --git a/docs/zh-CN/ARCHITECTURE.md b/docs/zh-CN/ARCHITECTURE.md index 5a92e72bb..6395b3733 100644 --- a/docs/zh-CN/ARCHITECTURE.md +++ b/docs/zh-CN/ARCHITECTURE.md @@ -512,7 +512,8 @@ UI-SPEC.md (per phase) ─────────────────── │ ├── FEATURES.md │ ├── ARCHITECTURE.md │ └── PITFALLS.md -├── codebase/ # Brownfield mapping (from /gsd-map-codebase) +├── codebase/ # Brownfield mapping (from /gsd-map-codebase or /gsd-onboard) +├── onboarding/ # Brownfield onboarding summary (from /gsd-onboard) │ ├── STACK.md # YAML frontmatter carries `last_mapped_commit` │ ├── ARCHITECTURE.md # for the post-execute drift gate (#2003) │ ├── CONVENTIONS.md diff --git a/docs/zh-CN/how-to/install-on-your-runtime.md b/docs/zh-CN/how-to/install-on-your-runtime.md index 63a97cce3..7bf6f97fb 100644 --- a/docs/zh-CN/how-to/install-on-your-runtime.md +++ b/docs/zh-CN/how-to/install-on-your-runtime.md @@ -273,10 +273,11 @@ npx @opengsd/gsd-core@latest --opencode --global ## 安装后 -重启您的运行时以加载新命令和代理。然后启动您的第一个项目: +重启您的运行时以加载新命令和代理。然后启动新项目或接入现有仓库: ```bash -/gsd-new-project +/gsd-new-project # 新建项目 +/gsd-onboard # 现有代码库 ``` 如果重启后找不到该命令,请确认安装目录与运行时预期的配置路径匹配。上方的预发布版章节介绍了最常见的路径不匹配情况。 diff --git a/docs/zh-CN/reference/planning-artifacts.md b/docs/zh-CN/reference/planning-artifacts.md index 7039e8cd5..73c513916 100644 --- a/docs/zh-CN/reference/planning-artifacts.md +++ b/docs/zh-CN/reference/planning-artifacts.md @@ -23,6 +23,8 @@ │ ├── architecture.md │ ├── stack.md │ └── ... +├── onboarding/ # Brownfield onboarding 摘要(可选) +│ └── SUMMARY.md ├── intel/ # 可查询的符号索引(可选,intel.enabled) │ └── API-SURFACE.md └── phases/ @@ -48,7 +50,7 @@ | | | |---|---| | **用途** | 规范的项目标识:项目内容、目标用户、核心价值、需求、约束和关键决策。随项目演进持续更新。 | -| **生成者** | `/gsd-new-project`(初始创建);由 `/gsd-complete-milestone` 在决策验证后更新。 | +| **生成者** | `/gsd-new-project`(初始创建,包含 `/gsd-onboard` 交接);由 `/gsd-complete-milestone` 在决策验证后更新。 | | **消费者** | 所有规划工作流;`gsd-phase-researcher`、`gsd-planner`(上下文);`discuss-phase`(历史决策);`gsd-plan-checker`(项目约束)。 | ### `ROADMAP.md` @@ -56,7 +58,7 @@ | | | |---|---| | **用途** | 里程碑与阶段列表,含目标、需求 ID、成功标准以及每个阶段的规范参考。是项目构建内容和顺序的唯一可信来源。 | -| **生成者** | `/gsd-new-project`(初始创建);由 `/gsd-phase --insert` 和 `/gsd-complete-milestone` 更新。 | +| **生成者** | `/gsd-new-project`(初始创建,包含 `/gsd-onboard` 交接);由 `/gsd-phase --insert` 和 `/gsd-complete-milestone` 更新。 | | **消费者** | `/gsd-discuss-phase`、`/gsd-plan-phase`、`/gsd-execute-phase`;所有需要阶段信息的编排命令;`gsd-planner`、`gsd-plan-checker`、`gsd-phase-researcher`。 | ### `REQUIREMENTS.md` @@ -64,7 +66,7 @@ | | | |---|---| | **用途** | 编号化、可勾选的项目验收标准。每条需求带有 ID(如 `AUTH-01`),映射到路线图阶段。随着阶段执行,逐步标记需求为已完成。 | -| **生成者** | `/gsd-new-project`(初始创建);需求由 `execute-phase` 标记为已完成。 | +| **生成者** | `/gsd-new-project`(初始创建,包含 `/gsd-onboard` 交接);需求由 `execute-phase` 标记为已完成。 | | **消费者** | `gsd-planner`(计划必须覆盖所有阶段需求 ID);`gsd-plan-checker` 维度 1(需求覆盖);`discuss-phase`(历史需求)。 | ### `STATE.md` @@ -72,7 +74,7 @@ | | | |---|---| | **用途** | 实时进度跟踪器——当前阶段与计划、进度指标、积累的决策、会话连续性说明。每次工作流运行时首先读取,每次重要操作后更新。 | -| **生成者** | `/gsd-new-project`(初始创建);由所有阶段工作流、`/gsd-pause-work`、`/gsd-resume-work` 持续更新。 | +| **生成者** | `/gsd-new-project`(初始创建,包含 `/gsd-onboard` 交接);由所有阶段工作流、`/gsd-pause-work`、`/gsd-resume-work` 持续更新。 | | **消费者** | 所有编排工作流;`/gsd-progress`;通过 `/gsd-quick` 执行的临时任务;`gsd-planner` 和 `gsd-phase-researcher`(项目决策)。 | 完整字段参考请参见 [STATE.md 模式](state-md.md)。 @@ -87,6 +89,14 @@ 完整模式请参见 [CONFIGURATION](../CONFIGURATION.md)。 +### `onboarding/SUMMARY.md`(可选) + +| | | +|---|---| +| **用途** | Brownfield onboarding 索引,记录产物状态、代码库映射是否完整,以及初次设置后的下一个推荐 GSD 命令。 | +| **生成者** | `/gsd-onboard`,在 `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md` 和 `STATE.md` 全部存在后生成。 | +| **消费者** | 审查初次设置的人;以后确认现有 onboarding 状态的 `/gsd-onboard` 运行。 | + ### `MILESTONES.md`(可选) | | | diff --git a/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md b/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md index c32493607..5f3513fc6 100644 --- a/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md +++ b/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md @@ -46,7 +46,7 @@ claude --dangerously-skip-permissions ## 第 3 步 — 开始 brownfield onboarding -在创建项目之前,先让 GSD Core 了解已有的内容。这是使棕地规划准确的关键步骤。 +在创建项目之前,让 GSD Core 检查仓库状态并告诉您安全的下一个顶层命令。这一步可避免跳过代码库上下文或覆盖现有 planning 文件。 ```text /gsd-onboard @@ -84,7 +84,7 @@ Created .planning/codebase/: --- -## 第 4 步 — 清除上下文并创建项目 +## 第 4 步 — 重新运行 onboarding 并初始化项目 清除会话窗口: @@ -92,12 +92,14 @@ Created .planning/codebase/: /clear ``` -现在创建项目。由于 GSD Core 在上一步中发现了现有代码,它已经知道这是一个棕地项目。当您运行 `/gsd-new-project` 时,问题将聚焦于您所*新增*的内容,而非重新描述已有的内容: +现在再次运行 `/gsd-onboard`。如果 GSD Core 检测到 ADR、PRD、spec、RFC 或根级需求文档,请先接受推荐的 `/gsd-ingest-docs` 交接,然后再运行 `/gsd-onboard`。上下文准备好后,onboarding 会打印项目初始化交接命令: ```text /gsd-new-project ``` +由于 GSD Core 在上一步中发现了现有代码,`/gsd-new-project` 知道这是一个棕地项目。问题将聚焦于您所*新增*的内容,而非重新描述已有的内容: + GSD Core 会询问您想构建什么。请用您正在添加的功能来回答,而不是描述整个代码库: ```text @@ -124,6 +126,8 @@ Proposed Roadmap 批准路线图。 +项目设置完成后,再运行一次 `/gsd-onboard`。现在 `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md` 和 `STATE.md` 都已存在,onboarding 会创建或确认 `.planning/onboarding/SUMMARY.md`。 + **在 `.planning/` 中创建的内容:** ```text @@ -133,8 +137,8 @@ Proposed Roadmap ROADMAP.md ← Phase 1, status: pending STATE.md ← session memory config.json ← workflow settings - onboarding/SUMMARY.md ← onboarding status and next command - codebase/ ← the seven map files from Step 3 + onboarding/SUMMARY.md ← onboarding 状态和下一个命令 + codebase/ ← 第 3 步生成的七个映射文件 ``` 注意 `.planning/codebase/` 已经从第 3 步存在。GSD Core 在编写 `PROJECT.md` 时读取了这些文件,这就是为什么它无需您描述即可填充已验证的需求。 @@ -213,6 +217,7 @@ Proposed Roadmap ## 您学到了什么 +- `/gsd-onboard` 如何安全编排 brownfield 设置,不嵌套交互式命令,也不覆盖现有 planning 文件。 - `/gsd-map-codebase` 如何运行四个并行代理,在 `.planning/codebase/` 中生成 `STACK.md`、`ARCHITECTURE.md`、`CONVENTIONS.md`、`CONCERNS.md`、`STRUCTURE.md`、`TESTING.md` 和 `INTEGRATIONS.md`。 - 在棕地仓库中运行 `/gsd-new-project` 如何将问题聚焦于您所*新增*的内容,并从现有代码中填充已验证的需求。 - 代码库映射如何塑造 `/gsd-discuss-phase` 中的每个问题——文件路径、模式和规范均来自您的实际代码。 From afc3309b61618a2eacfab1958b070e645cb35f1b Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 12:23:12 -0500 Subject: [PATCH 19/75] no-mistakes(review): Forward onboard fast init flag --- gsd-core/workflows/onboard.md | 8 +++++--- tests/onboard-command.test.cjs | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index f8b501ee3..6dc5a1f97 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -30,9 +30,11 @@ Run the init projection: ```bash _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi -INIT_ONBOARD_FLAGS=() -if [[ " ${ARGUMENTS:-} " == *" --fast "* ]]; then INIT_ONBOARD_FLAGS=(--fast); fi -INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard "${INIT_ONBOARD_FLAGS[@]}") +``` + +Run init from parsed prompt args, not shell `$ARGUMENTS`: `--fast` => `INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard --fast)`; default omits `--fast`. + +```bash if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi ``` diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 0de2a27be..2201b3730 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -235,6 +235,20 @@ describe('/gsd:onboard command contract', () => { assert.ok(content.includes('init onboard'), 'workflow must use init onboard projection'); assert.match(content, /gsd_run --cwd "\$_GSD_RUNTIME_ROOT" init onboard/, 'workflow must anchor init onboard at runtime root'); + assert.ok( + !content.includes('ARGUMENTS:-'), + 'workflow must not depend on an unexported shell ARGUMENTS variable', + ); + assert.match( + content, + /Run init from parsed prompt args, not shell `\$ARGUMENTS`/, + 'workflow must forward fast mode from parsed prompt arguments into init onboard', + ); + assert.match( + content, + /gsd_run --cwd "\$_GSD_RUNTIME_ROOT" init onboard --fast/, + 'workflow must provide a literal fast init command', + ); assert.ok(content.includes('has_fast_codebase_map'), 'workflow must parse fast map readiness'); assert.match(content, /CODEBASE_MAP_READY=.*has_fast_codebase_map/s, 'workflow must treat the fast subset as acceptable in fast mode'); assert.ok(content.includes('Run from worktree root'), 'workflow handoffs must be anchored at the worktree root'); From e3f2070a42f23fa6fb995f081f79bdaa03061289 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 12:35:49 -0500 Subject: [PATCH 20/75] no-mistakes(document): Sync onboard docs --- docs/CLI-TOOLS.md | 4 ++-- docs/how-to/install-minimal-and-add-skills.md | 2 +- docs/ja-JP/CLI-TOOLS.md | 3 ++- docs/ko-KR/CLI-TOOLS.md | 3 ++- docs/pt-BR/CLI-TOOLS.md | 3 ++- docs/zh-CN/CLI-TOOLS.md | 3 ++- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/CLI-TOOLS.md b/docs/CLI-TOOLS.md index 9381be660..e0454074a 100644 --- a/docs/CLI-TOOLS.md +++ b/docs/CLI-TOOLS.md @@ -421,14 +421,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init Commands (Compound Context Loading) -Load all context needed for a specific workflow in one call. Returns JSON with project info, config, state, and workflow-specific data. `init onboard` reports brownfield signals, planning-doc candidates, codebase-map completeness, partial planning state, and onboarding summary status for `/gsd-onboard`. +Load all context needed for a specific workflow in one call. Returns JSON with project info, config, state, and workflow-specific data. `init onboard [--fast]` reports brownfield signals, planning-doc candidates, codebase-map completeness, fast-map readiness, partial planning state, and onboarding summary status for `/gsd-onboard`. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone -node gsd-tools.cjs init onboard +node gsd-tools.cjs init onboard [--fast] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/how-to/install-minimal-and-add-skills.md b/docs/how-to/install-minimal-and-add-skills.md index e30537af7..53a6f772d 100644 --- a/docs/how-to/install-minimal-and-add-skills.md +++ b/docs/how-to/install-minimal-and-add-skills.md @@ -45,7 +45,7 @@ If `core` is too small, pick a wider profile instead. Pass it with `--profile= node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone +node gsd-tools.cjs init onboard [--fast] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/ko-KR/CLI-TOOLS.md b/docs/ko-KR/CLI-TOOLS.md index 80496bf35..3f375c3ec 100644 --- a/docs/ko-KR/CLI-TOOLS.md +++ b/docs/ko-KR/CLI-TOOLS.md @@ -288,13 +288,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init 명령 (복합 컨텍스트 로딩) -하나의 호출로 특정 워크플로우에 필요한 모든 컨텍스트를 로드합니다. 프로젝트 정보, 설정, 상태, 워크플로우별 데이터가 포함된 JSON을 반환합니다. +하나의 호출로 특정 워크플로우에 필요한 모든 컨텍스트를 로드합니다. 프로젝트 정보, 설정, 상태, 워크플로우별 데이터가 포함된 JSON을 반환합니다. `init onboard [--fast]`는 `/gsd-onboard`를 위해 brownfield 신호, 계획 문서 후보, 코드베이스 맵 완성도, fast 맵 준비 상태, 부분 planning 상태, 온보딩 요약 상태를 반환합니다. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone +node gsd-tools.cjs init onboard [--fast] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/pt-BR/CLI-TOOLS.md b/docs/pt-BR/CLI-TOOLS.md index 24441e6bd..2094b6bb0 100644 --- a/docs/pt-BR/CLI-TOOLS.md +++ b/docs/pt-BR/CLI-TOOLS.md @@ -290,13 +290,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Comandos Init (Carregamento de Contexto Composto) -Carrega todo o contexto necessário para um fluxo de trabalho específico em uma única chamada. Retorna JSON com informações do projeto, configuração, estado e dados específicos do fluxo de trabalho. +Carrega todo o contexto necessário para um fluxo de trabalho específico em uma única chamada. Retorna JSON com informações do projeto, configuração, estado e dados específicos do fluxo de trabalho. `init onboard [--fast]` retorna, para `/gsd-onboard`, sinais de brownfield, candidatos a docs de planning, completude do mapa de código, prontidão do mapa fast, estado parcial de planning e status do resumo de onboarding. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone +node gsd-tools.cjs init onboard [--fast] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/zh-CN/CLI-TOOLS.md b/docs/zh-CN/CLI-TOOLS.md index ff86c98e9..70cb595a6 100644 --- a/docs/zh-CN/CLI-TOOLS.md +++ b/docs/zh-CN/CLI-TOOLS.md @@ -288,13 +288,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init 命令(复合上下文加载) -通过单次调用加载特定工作流所需的所有上下文。返回包含项目信息、配置、状态和工作流专属数据的 JSON。 +通过单次调用加载特定工作流所需的所有上下文。返回包含项目信息、配置、状态和工作流专属数据的 JSON。`init onboard [--fast]` 会为 `/gsd-onboard` 返回 brownfield 信号、planning 文档候选、代码库映射完整性、fast 映射就绪状态、部分 planning 状态和 onboarding summary 状态。 ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone +node gsd-tools.cjs init onboard [--fast] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work From a5298c1fc069c26b50368d8303ac88f463f669c7 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 14:11:42 -0500 Subject: [PATCH 21/75] refactor: project onboard routing in init --- .gitignore | 1 + eslint.config.mjs | 1 + gsd-core/references/gsd-run-resolver.md | 8 + gsd-core/workflows/onboard.md | 355 +++++++--------------- src/init.cts | 199 +----------- src/onboard-projection.cts | 383 ++++++++++++++++++++++++ tests/onboard-command.test.cjs | 186 ++++++------ 7 files changed, 613 insertions(+), 520 deletions(-) create mode 100644 gsd-core/references/gsd-run-resolver.md create mode 100644 src/onboard-projection.cts diff --git a/.gitignore b/.gitignore index 9562ecd17..c44176af8 100644 --- a/.gitignore +++ b/.gitignore @@ -192,6 +192,7 @@ build/ /gsd-core/bin/lib/eval.cjs /gsd-core/bin/lib/eval-command-router.cjs /gsd-core/bin/lib/init-command-router.cjs +/gsd-core/bin/lib/onboard-projection.cjs /gsd-core/bin/lib/agent-command-router.cjs /gsd-core/bin/lib/agent-install-check.cjs /gsd-core/bin/lib/task-command-router.cjs diff --git a/eslint.config.mjs b/eslint.config.mjs index 580c90822..a000dd984 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -162,6 +162,7 @@ export default tseslint.config( 'gsd-core/bin/lib/eval.cjs', 'gsd-core/bin/lib/eval-command-router.cjs', 'gsd-core/bin/lib/init-command-router.cjs', + 'gsd-core/bin/lib/onboard-projection.cjs', 'gsd-core/bin/lib/agent-command-router.cjs', 'gsd-core/bin/lib/agent-install-check.cjs', 'gsd-core/bin/lib/task-command-router.cjs', diff --git a/gsd-core/references/gsd-run-resolver.md b/gsd-core/references/gsd-run-resolver.md new file mode 100644 index 000000000..dd584b755 --- /dev/null +++ b/gsd-core/references/gsd-run-resolver.md @@ -0,0 +1,8 @@ +# Standard `gsd_run` Resolver + +Use this bootstrap block when a workflow must call `gsd-tools` from the active worktree/runtime. +Keep this resolver centralized; workflows should reference this file instead of copying the shell probe. + +```bash +_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi +``` diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 6dc5a1f97..d955e3048 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -1,360 +1,219 @@ - -Guide existing-codebase onboarding by sequencing the already-owned GSD primitives: -`/gsd:map-codebase`, `/gsd:ingest-docs`, and `/gsd:new-project`. The workflow is -idempotent: it confirms existing artifacts, refuses to overwrite planning data silently, -and stops with the exact next top-level command whenever a nested interactive workflow -would be unsafe. - +# /gsd:onboard Workflow - -Read all files referenced by the invoking prompt's execution_context before starting. - +One-command onboarding for an existing or unknown repo. This workflow is a thin +renderer around `init onboard`; deterministic routing lives in the CLI projection. - +@~/.claude/gsd-core/references/gsd-run-resolver.md -## 1. Initialize - -Display banner: - -``` -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - GSD ► ONBOARDING -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -``` +## 1. Render the Onboarding Projection Parse `$ARGUMENTS`: -- `--fast` sets `MAP_COMMAND` to `/gsd:map-codebase --fast`, passes `--fast` to the init projection, and accepts the default fast map subset (STACK, INTEGRATIONS, ARCHITECTURE, STRUCTURE) as sufficient onboarding context; otherwise `MAP_COMMAND` is `/gsd:map-codebase`. -- `--text` sets `TEXT_MODE=true`. +- `--fast` passes `--fast` to `init onboard`. Fast mode accepts the fast map for lightweight onboarding only; `next_action` still decides whether complete map work is required before project setup. +- `--text` forces text-mode choices for runtimes without `AskUserQuestion`. -Run the init projection: - -```bash -_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi -``` - -Run init from parsed prompt args, not shell `$ARGUMENTS`: `--fast` => `INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard --fast)`; default omits `--fast`. +Run the standard `gsd_run` resolver from the reference above, then run the projection from the runtime root: ```bash +# If --fast was parsed from $ARGUMENTS: +INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard --fast --raw) +# Otherwise: +INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard --raw) if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi ``` -Parse JSON fields: `planning_exists`, `project_exists`, `requirements_exists`, -`roadmap_exists`, `state_exists`, `has_existing_code`, `has_package_file`, -`is_brownfield`, `fast_mode`, `has_codebase_map`, `has_fast_codebase_map`, -`codebase_map_files_present`, `missing_codebase_map_files`, `missing_fast_codebase_map_files`, -`has_docs_candidates`, -`doc_candidate_count`, `onboarding_summary_exists`, `text_mode`, `commit_docs`, `agents_installed`, -`missing_agents`, `has_git`, `git_worktree_root`, `in_nested_subdir`. +Parse JSON fields from `INIT`: -Set `FAST_MODE=fast_mode` from INIT. -Set `TEXT_MODE=true` if `--text` is present OR `text_mode` from INIT is true. -Set `CODEBASE_MAP_READY=has_fast_codebase_map` when `FAST_MODE` is true; otherwise set -`CODEBASE_MAP_READY=has_codebase_map`. +- `next_action.kind`, `next_action.command`, `next_action.reason`, `next_action.missing`, `next_action.summary_path` +- `map_readiness`, `codebase_map_summary_status`, `codebase_map_final_status` +- `planning_exists`, `project_exists`, `requirements_exists`, `roadmap_exists`, `state_exists` +- `is_brownfield`, `fast_mode`, `has_codebase_map`, `has_fast_codebase_map` +- `missing_codebase_map_files`, `missing_fast_codebase_map_files` +- `has_docs_candidates`, `doc_candidate_count`, `onboarding_summary_exists` +- `commit_docs`, `text_mode`, `has_git`, `git_worktree_root`, `in_nested_subdir` -**Text mode (`workflow.text_mode: true` in config or `--text` flag):** When `TEXT_MODE` is active, replace every `AskUserQuestion` call in this workflow with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available and would otherwise render as an inert code block. +Set: +- `TEXT_MODE=true` if `--text` is present or `text_mode` is true. +- `ONBOARDING_ROOT={git_worktree_root || _GSD_RUNTIME_ROOT}`. -## 2. Git and Existing Planning Safety +If `has_git` and `in_nested_subdir` are true, warn that onboarding artifacts belong to the outer worktree at `git_worktree_root`. Do not run `git init`. -If `has_git` is true and `in_nested_subdir` is true, warn that onboarding artifacts will -belong to the outer worktree at `git_worktree_root`. Do not run `git init` here. +## 2. Execute `next_action` -If `planning_exists` is true, do not overwrite PROJECT/ROADMAP/STATE. Onboarding is -idempotent and must only confirm or summarize existing files unless the user explicitly -runs the lower-level refresh commands. +### `map-codebase` -## 3. Codebase Mapping Gate - -If `is_brownfield` is true and `CODEBASE_MAP_READY` is false: +If `next_action.kind == "map-codebase"`: - If `TEXT_MODE=true`, print: ```text -Existing code was detected, but the required .planning/codebase/ map is missing. -Missing map files: {--fast ? missing_fast_codebase_map_files : missing_codebase_map_files} +{next_action.reason} +Missing map files: {fast_mode ? missing_fast_codebase_map_files : missing_codebase_map_files} -1. Map codebase first — run {MAP_COMMAND} from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT} to understand the repo before project setup (Recommended) +1. Map codebase first — run {next_action.command} from worktree root {ONBOARDING_ROOT} (Recommended) 2. Skip mapping — continue with weaker onboarding context Enter number: ``` -Stop and wait for the user's reply. - - Otherwise use AskUserQuestion: - header: "Codebase" - - question: "Existing code was detected, but the required .planning/codebase/ map is missing. Map it first?" + - question: "{next_action.reason} Map it first?" - options: - - "Map codebase first" — Run `{MAP_COMMAND}` from worktree root `{git_worktree_root || _GSD_RUNTIME_ROOT}` to understand the repo before project setup (Recommended) + - "Map codebase first" — Run `{next_action.command}` from worktree root `{ONBOARDING_ROOT}` (Recommended) - "Skip mapping" — Continue with weaker onboarding context -If the user chooses mapping, do not nest the interactive map-codebase workflow. Print: +If the user chooses mapping, do not nest the interactive workflow. Print: ```text -Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: +Run from worktree root {ONBOARDING_ROOT}: -{MAP_COMMAND} +{next_action.command} Then rerun /gsd:onboard from the same worktree root. ``` -Exit. +Exit. If the user skips mapping, continue with a warning. -If the user skips mapping, continue with a warning. +### `ingest-docs` -If `is_brownfield` is false and `planning_exists` is false and `has_docs_candidates` is false, print: - -```text -No existing code was detected. For a greenfield project, run: - -Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: - -/gsd:new-project -``` - -Exit. - -## 4. Existing Docs Gate - -If `has_docs_candidates` is true and `project_exists` is false: +If `next_action.kind == "ingest-docs"`: - If `TEXT_MODE=true`, print: ```text +{next_action.reason} Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). -1. Ingest docs first — run /gsd:ingest-docs from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT} to bootstrap planning from existing docs (Recommended) +1. Ingest docs first — run {next_action.command} from worktree root {ONBOARDING_ROOT} (Recommended) 2. Skip docs ingest — continue to /gsd:new-project Enter number: ``` -Stop and wait for the user's reply. - - Otherwise use AskUserQuestion: - header: "Docs" - question: "Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). Ingest them first?" - options: - - "Ingest docs first" — Run `/gsd:ingest-docs` from worktree root `{git_worktree_root || _GSD_RUNTIME_ROOT}` to bootstrap planning from existing docs (Recommended) + - "Ingest docs first" — Run `{next_action.command}` from worktree root `{ONBOARDING_ROOT}` (Recommended) - "Skip docs ingest" — Continue to `/gsd:new-project` -If the user chooses ingest, do not nest the interactive ingest-docs workflow. Print: +If the user chooses ingest, print: ```text -Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: +Run from worktree root {ONBOARDING_ROOT}: -/gsd:ingest-docs +{next_action.command} + +Then rerun /gsd:onboard from the same worktree root. +``` + +Exit. If the user skips docs ingest, continue to the new-project handoff below. + +### `complete-map-before-new-project` + +If `next_action.kind == "complete-map-before-new-project"`, print: + +```text +{next_action.reason} + +Run from worktree root {ONBOARDING_ROOT}: + +{next_action.command} Then rerun /gsd:onboard from the same worktree root. ``` Exit. -## 5. Project Initialization Gate +### `new-project` -If `project_exists` is false and `fast_mode && has_fast_codebase_map && !has_codebase_map` is true: - -Print: +If `next_action.kind == "new-project"`, print: ```text -Fast codebase context is accepted for onboarding, but /gsd:new-project still requires the complete codebase map. +{next_action.reason} -Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: +Run from worktree root {ONBOARDING_ROOT}: -/gsd:map-codebase - -Then rerun /gsd:onboard from the same worktree root. +{next_action.command} ``` Exit. -If `project_exists` is false: +### `partial-planning` -Print: +If `next_action.kind == "partial-planning"`, print: ```text -Codebase context is ready for project initialization. +Project planning exists but is incomplete. -Run from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: +Missing files: {next_action.missing} +REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} +ROADMAP.md: {roadmap_exists ? "present" : "missing"} +STATE.md: {state_exists ? "present" : "missing"} -/gsd:new-project - -Then rerun /gsd:onboard from the same worktree root. +Run the appropriate lower-level command to fill the missing planning artifact(s), then rerun /gsd:onboard. ``` Exit. -If `project_exists` is true and either `requirements_exists`, `roadmap_exists`, or -`state_exists` is false, print: +### `ready` -```text -Existing PROJECT.md was found, but planning is incomplete. +If `next_action.kind == "ready"`, print the final status section and exit. -Planning file status: -- REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} -- ROADMAP.md: {roadmap_exists ? "present" : "missing"} -- STATE.md: {state_exists ? "present" : "missing"} +### `write-summary` -Run one of these top-level commands from worktree root {git_worktree_root || _GSD_RUNTIME_ROOT}: +If `next_action.kind == "write-summary"`, continue to summary creation. -/gsd:ingest-docs --mode merge -/gsd:new-milestone +## 3. Create Onboarding Summary -Then rerun /gsd:onboard from the same worktree root. -``` +Create `{ONBOARDING_ROOT}/{next_action.summary_path}`. Do not overwrite an existing summary; the projection should only route here when the summary is missing. -Exit. Do not write `.planning/onboarding/SUMMARY.md` and do not print the onboarding -complete status for partial planning. - -If `project_exists`, `requirements_exists`, `roadmap_exists`, and `state_exists` are all -true, continue. - -## 6. Write Onboarding Summary - -Resolve `ONBOARDING_ROOT={git_worktree_root || _GSD_RUNTIME_ROOT}` before this step. -Use `ONBOARDING_ROOT` for every filesystem write and commit in this step so nested-cwd -invocations do not create `subdir/.planning` artifacts. - -Create `{ONBOARDING_ROOT}/.planning/onboarding/SUMMARY.md` only after PROJECT.md exists. -If it already exists, update it only after confirmation; do not overwrite silently. - -Before summary keep/update choices, derive map status values safely: - -- If `has_codebase_map` is true: - - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (complete)` - - `CODEBASE_MAP_FINAL_STATUS=(complete)` -- Else if `fast_mode && has_fast_codebase_map` is true: - - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (fast/partial-but-accepted codebase map)` - - `CODEBASE_MAP_FINAL_STATUS=(fast/partial-but-accepted; required fast files present)` -- Else: - - `CODEBASE_MAP_SUMMARY_STATUS=.planning/codebase/ (incomplete or skipped)` - - `CODEBASE_MAP_FINAL_STATUS=(incomplete or skipped; missing: {missing_codebase_map_files})` - -If `onboarding_summary_exists` is true: - -- If `TEXT_MODE=true`, print: - -```text -Onboarding summary already exists at .planning/onboarding/SUMMARY.md. - -1. Update summary — regenerate from current artifact status (Recommended) -2. Keep existing summary — skip writing - -Enter number: -``` - -Stop and wait for the user's reply. - -- Otherwise use AskUserQuestion: - - header: "Onboarding Summary" - - question: "Onboarding summary already exists. Update it from current artifact status?" - - options: - - "Update summary" — Regenerate `.planning/onboarding/SUMMARY.md` (Recommended) - - "Keep existing summary" — Skip writing - -If the user chooses to keep the existing summary, skip to Step 7 without writing. - -If `onboarding_summary_exists` is false or the user confirms an update, write the summary -using the template below. - -Summary contents: +Summary template: ```markdown # Onboarding Summary -**Generated:** {YYYY-MM-DD} -**Status:** Ready for GSD workflow +## Project State +- PROJECT.md: {project_exists ? "present" : "missing"} +- REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} +- ROADMAP.md: {roadmap_exists ? "present" : "missing"} +- STATE.md: {state_exists ? "present" : "missing"} -## Artifact Status +## Codebase Context +- Brownfield repo: {is_brownfield ? "yes" : "no"} +- Map readiness: {map_readiness} +- Codebase map: {codebase_map_summary_status} +- Fast map available: {has_fast_codebase_map ? "yes" : "no"} -- Project: .planning/PROJECT.md -- Requirements: .planning/REQUIREMENTS.md -- Roadmap: .planning/ROADMAP.md -- State: .planning/STATE.md -- Codebase map: {CODEBASE_MAP_SUMMARY_STATUS} - -## Codebase Map - -{if has_codebase_map} -Confirmed files: -- STACK.md -- ARCHITECTURE.md -- STRUCTURE.md -- CONVENTIONS.md -- TESTING.md -- INTEGRATIONS.md -- CONCERNS.md -{else if fast_mode && has_fast_codebase_map} -Accepted fast map files: -- STACK.md -- INTEGRATIONS.md -- ARCHITECTURE.md -- STRUCTURE.md -Context strength: fast/partial-but-accepted codebase map; not all seven map files are present. -{else} -Present files: {codebase_map_files_present} -Missing files: {missing_codebase_map_files} -Context strength: weaker because codebase mapping was skipped or is incomplete. -{endif} - -## Existing Docs - -Detected planning docs: {doc_candidate_count} +## Docs Context +- Existing ADR/PRD/SPEC/RFC candidates: {has_docs_candidates ? doc_candidate_count : 0} ## Recommended Next Step - -/gsd:discuss-phase 1 +- {next_action.reason} ``` -Commit the summary if `commit_docs` is true: +If `commit_docs` is true, commit only the summary path from the onboarding root: ```bash gsd_run --cwd "$ONBOARDING_ROOT" query commit "docs: create onboarding summary" --files .planning/onboarding/SUMMARY.md ``` -## 7. Final Status +Continue to final status. + +## 4. Final Status Print: -``` -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - GSD ► ONBOARDING COMPLETE ✓ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +```text +Onboarding status: +- PROJECT.md: {project_exists ? "present" : "missing"} +- REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} +- ROADMAP.md: {roadmap_exists ? "present" : "missing"} +- STATE.md: {state_exists ? "present" : "missing"} +- Codebase map: {codebase_map_final_status} +- Onboarding summary: present -Created / confirmed / status: -- .planning/codebase/ {CODEBASE_MAP_FINAL_STATUS} -- .planning/PROJECT.md -- .planning/REQUIREMENTS.md {requirements_exists ? "(present)" : "(missing; onboarding incomplete)"} -- .planning/ROADMAP.md -- .planning/STATE.md -- .planning/onboarding/SUMMARY.md - -─────────────────────────────────────────────────────────────── - -## ▶ Next Up - -**Discuss Phase 1** — capture implementation decisions before planning. - -`/gsd:discuss-phase 1` - -─────────────────────────────────────────────────────────────── - -**Also available:** -- `/gsd:map-codebase` — refresh the codebase map after significant changes -- `/gsd:ingest-docs --mode merge` — merge new ADR/PRD/SPEC docs into planning -- `/gsd:progress` — inspect current workflow state - -─────────────────────────────────────────────────────────────── +Next recommended command: /gsd:manager ``` - - - -- [ ] Existing codebase detected before project initialization -- [ ] Missing codebase map routes to `/gsd:map-codebase` or `/gsd:map-codebase --fast` -- [ ] Existing planning docs route to `/gsd:ingest-docs` -- [ ] Missing project setup routes to `/gsd:new-project` -- [ ] Existing `.planning/` files are not overwritten silently -- [ ] Text mode stops and waits at numbered-list gates -- [ ] `.planning/onboarding/SUMMARY.md` is created only after PROJECT.md exists -- [ ] User sees next command - +Do not run implementation execution or shipping from onboarding. diff --git a/src/init.cts b/src/init.cts index 853e186cf..5c781ba25 100644 --- a/src/init.cts +++ b/src/init.cts @@ -51,6 +51,15 @@ const { checkAgentsInstalled } = agentInstallCheck; import gitBaseBranch = require('./git-base-branch.cjs'); const { gitWorktreeInfoInternal } = gitBaseBranch; import { makeResolution } from './resolution.cjs'; +// eslint-disable-next-line @typescript-eslint/no-require-imports -- onboard-projection.cjs is an export= CommonJS module +import onboardProjection = require('./onboard-projection.cjs'); +const { + REQUIRED_CODEBASE_MAP_FILES, + buildOnboardProjection, + hasCodeFilesInternal, + hasPackageFileInternal, + listCodebaseMapFiles, +} = onboardProjection; const { output, error } = io; const { loadConfig, loadConfigResolved } = configLoader; @@ -86,130 +95,6 @@ void stripShippedMilestones; // Accept all bold/colon variants of the Requirements header (#2769) const REQUIREMENTS_HEADER_RE = /^\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]*)$/m; -const CODE_EXTENSIONS = new Set([ - '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', '.swift', '.java', - '.kt', '.kts', '.c', '.cpp', '.cc', '.h', '.hpp', '.cs', '.rb', '.php', '.dart', - '.m', '.mm', '.scala', '.groovy', '.lua', '.r', '.R', '.zig', '.ex', '.exs', '.clj', -]); - -const CODE_SCAN_SKIP_DIRS = new Set([ - 'node_modules', '.git', '.planning', '.claude', '.codex', '__pycache__', 'target', - 'dist', 'build', '.next', '.nuxt', '.svelte-kit', 'coverage', 'vendor', '.venv', 'venv', -]); - -const PACKAGE_FILES = [ - 'package.json', 'requirements.txt', 'pyproject.toml', 'Cargo.toml', 'go.mod', - 'Package.swift', 'build.gradle', 'build.gradle.kts', 'pom.xml', 'Gemfile', - 'composer.json', 'pubspec.yaml', 'CMakeLists.txt', 'Makefile', 'build.zig', - 'mix.exs', 'project.clj', -]; - -const REQUIRED_CODEBASE_MAP_FILES = [ - 'STACK.md', 'ARCHITECTURE.md', 'STRUCTURE.md', 'CONVENTIONS.md', 'TESTING.md', - 'INTEGRATIONS.md', 'CONCERNS.md', -]; - -const FAST_CODEBASE_MAP_FILES = [ - 'STACK.md', 'INTEGRATIONS.md', 'ARCHITECTURE.md', 'STRUCTURE.md', -]; - -const PLANNING_DOC_SEGMENTS = new Set([ - 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs', -]); - -function hasCodeFilesInternal(dir: string, depth = 0): boolean { - if (depth > 3) return false; - let entries: fs.Dirent[]; - try { - entries = fs.readdirSync(dir, { withFileTypes: true }); - } catch { - return false; - } - - for (const entry of entries) { - if (entry.isFile() && CODE_EXTENSIONS.has(path.extname(entry.name))) return true; - if (entry.isDirectory() && !CODE_SCAN_SKIP_DIRS.has(entry.name)) { - if (hasCodeFilesInternal(path.join(dir, entry.name), depth + 1)) return true; - } - } - - return false; -} - -function hasPackageFileInternal(cwd: string): boolean { - return PACKAGE_FILES.some((file) => pathExistsInternal(cwd, file)); -} - -function listPlanningDocCandidates(cwd: string): string[] { - const roots = ['docs', 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs']; - const candidates = new Set(); - - const isPlanningDocCandidate = (rel: string, name: string): boolean => { - const upperName = name.toUpperCase(); - const relLower = rel.toLowerCase(); - const pathSegments = relLower.split('/'); - return ( - /(^|[-_ ])(ADR|PRD|SPEC|RFC)([-_ ]|\.)/i.test(name) || - /^\d{4}[-_].+\.md$/i.test(name) || - pathSegments.some((segment) => PLANNING_DOC_SEGMENTS.has(segment)) || - upperName === 'REQUIREMENTS.MD' - ); - }; - - const addCandidate = (rel: string, name: string): void => { - if (name.toLowerCase().endsWith('.md') && isPlanningDocCandidate(rel, name)) { - candidates.add(toPosixPath(rel)); - } - }; - - const visit = (dir: string, relDir: string, depth: number): void => { - if (depth > 3) return; - let entries: fs.Dirent[]; - try { - entries = fs.readdirSync(dir, { withFileTypes: true }); - } catch { - return; - } - - for (const entry of entries) { - const rel = relDir ? `${relDir}/${entry.name}` : entry.name; - if (entry.isDirectory()) { - if (!CODE_SCAN_SKIP_DIRS.has(entry.name)) { - visit(path.join(dir, entry.name), rel, depth + 1); - } - continue; - } - - if (entry.isFile()) addCandidate(rel, entry.name); - } - }; - - let rootEntries: fs.Dirent[] = []; - try { - rootEntries = fs.readdirSync(cwd, { withFileTypes: true }); - } catch { - rootEntries = []; - } - for (const entry of rootEntries) { - if (entry.isFile()) addCandidate(entry.name, entry.name); - } - - for (const root of roots) { - const full = path.join(cwd, root); - if (fs.existsSync(full)) visit(full, root, 0); - } - - return [...candidates].sort(); -} - -function listCodebaseMapFiles(cwd: string): string[] { - const codebaseDir = path.join(planningRoot(cwd), 'codebase'); - if (!fs.existsSync(codebaseDir)) return []; - return REQUIRED_CODEBASE_MAP_FILES.filter((file) => - fs.existsSync(path.join(codebaseDir, file)), - ); -} - function listPhaseSummaryFiles(phaseDir: string): string[] { return (scanPhasePlans(phaseDir) as unknown as Record)['summaryFiles']; } @@ -912,65 +797,13 @@ function cmdInitOnboard( options: Record = {}, ): void { const config = loadConfig(cwd); - const codebaseMapFiles = listCodebaseMapFiles(cwd); - const missingCodebaseMapFiles = REQUIRED_CODEBASE_MAP_FILES.filter( - (file) => !codebaseMapFiles.includes(file), - ); - const missingFastCodebaseMapFiles = FAST_CODEBASE_MAP_FILES.filter( - (file) => !codebaseMapFiles.includes(file), - ); - const docCandidates = listPlanningDocCandidates(cwd); - const hasCode = hasCodeFilesInternal(cwd); - const hasPackageFile = hasPackageFileInternal(cwd); - const isBrownfield = hasCode || hasPackageFile; - const hasCodebaseMap = codebaseMapFiles.length === REQUIRED_CODEBASE_MAP_FILES.length; - const fastMode = options['fast'] === true; - const hasFastCodebaseMap = missingFastCodebaseMapFiles.length === 0; - const needsCodebaseMap = isBrownfield && ( - fastMode ? !hasFastCodebaseMap : !hasCodebaseMap - ); - - const result: Record = { - commit_docs: config.commit_docs, - text_mode: - !!config.text_mode || !!((config.workflow ?? {}) as Record)['text_mode'], - - project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'), - planning_exists: fs.existsSync(planningRoot(cwd)), - requirements_exists: fs.existsSync(path.join(planningDir(cwd), 'REQUIREMENTS.md')), - roadmap_exists: fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')), - state_exists: fs.existsSync(path.join(planningDir(cwd), 'STATE.md')), - config_exists: fs.existsSync(path.join(planningDir(cwd), 'config.json')), - - has_existing_code: hasCode, - has_package_file: hasPackageFile, - is_brownfield: isBrownfield, - fast_mode: fastMode, - needs_codebase_map: needsCodebaseMap, - has_codebase_map: hasCodebaseMap, - has_fast_codebase_map: hasFastCodebaseMap, - codebase_dir_exists: fs.existsSync(path.join(planningRoot(cwd), 'codebase')), - fast_codebase_map_files_required: FAST_CODEBASE_MAP_FILES, - codebase_map_files_present: codebaseMapFiles, - missing_codebase_map_files: missingCodebaseMapFiles, - missing_fast_codebase_map_files: missingFastCodebaseMapFiles, - - has_docs_candidates: docCandidates.length > 0, - doc_candidate_count: docCandidates.length, - doc_candidates: docCandidates, - - onboarding_summary_exists: pathExistsInternal(cwd, '.planning/onboarding/SUMMARY.md'), - onboarding_summary_path: '.planning/onboarding/SUMMARY.md', - - project_path: '.planning/PROJECT.md', - requirements_path: toPosixPath( - path.relative(cwd, path.join(planningDir(cwd), 'REQUIREMENTS.md')), - ), - roadmap_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'ROADMAP.md'))), - state_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'STATE.md'))), - codebase_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'codebase'))), - onboarding_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'onboarding'))), - + const workflowConfig = (config.workflow ?? {}) as Record; + const result = { + ...buildOnboardProjection(cwd, { + commitDocs: !!config.commit_docs, + fast: options['fast'] === true, + textMode: !!config.text_mode || !!workflowConfig['text_mode'], + }), ...getInitGitState(cwd), }; diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts new file mode 100644 index 000000000..26ba11305 --- /dev/null +++ b/src/onboard-projection.cts @@ -0,0 +1,383 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +// eslint-disable-next-line @typescript-eslint/no-require-imports -- core-utils.cjs is an export= CommonJS module +import coreUtils = require('./core-utils.cjs'); +// eslint-disable-next-line @typescript-eslint/no-require-imports -- planning-workspace.cjs is an export= CommonJS module +import planningWorkspace = require('./planning-workspace.cjs'); + +const { pathExistsInternal, toPosixPath } = coreUtils; +const { planningDir, planningRoot } = planningWorkspace; + +const CODE_EXTENSIONS = new Set([ + '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', '.swift', '.java', + '.kt', '.kts', '.c', '.cpp', '.cc', '.h', '.hpp', '.cs', '.rb', '.php', '.dart', + '.m', '.mm', '.scala', '.groovy', '.lua', '.r', '.R', '.zig', '.ex', '.exs', '.clj', +]); + +const CODE_SCAN_SKIP_DIRS = new Set([ + 'node_modules', '.git', '.planning', '.claude', '.codex', '__pycache__', 'target', + 'dist', 'build', '.next', '.nuxt', '.svelte-kit', 'coverage', 'vendor', '.venv', 'venv', +]); + +const PACKAGE_FILES = [ + 'package.json', 'requirements.txt', 'pyproject.toml', 'Cargo.toml', 'go.mod', + 'Package.swift', 'build.gradle', 'build.gradle.kts', 'pom.xml', 'Gemfile', + 'composer.json', 'pubspec.yaml', 'CMakeLists.txt', 'Makefile', 'build.zig', + 'mix.exs', 'project.clj', +]; + +const REQUIRED_CODEBASE_MAP_FILES = [ + 'STACK.md', 'ARCHITECTURE.md', 'STRUCTURE.md', 'CONVENTIONS.md', 'TESTING.md', + 'INTEGRATIONS.md', 'CONCERNS.md', +]; + +const FAST_CODEBASE_MAP_FILES = [ + 'STACK.md', 'INTEGRATIONS.md', 'ARCHITECTURE.md', 'STRUCTURE.md', +]; + +const PLANNING_DOC_SEGMENTS = new Set([ + 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs', +]); + +type MapReadiness = 'none' | 'fast' | 'complete'; + +type OnboardNextAction = + | { kind: 'map-codebase'; command: string; reason: string } + | { kind: 'ingest-docs'; command: string; reason: string } + | { kind: 'new-project'; command: string; reason: string } + | { kind: 'complete-map-before-new-project'; command: string; reason: string } + | { kind: 'partial-planning'; missing: string[]; reason: string } + | { kind: 'write-summary'; summary_path: string; reason: string } + | { kind: 'ready'; reason: string }; + +interface BuildOnboardProjectionOptions { + commitDocs: boolean; + fast: boolean; + textMode: boolean; +} + +interface OnboardProjection { + commit_docs: boolean; + text_mode: boolean; + + project_exists: boolean; + planning_exists: boolean; + requirements_exists: boolean; + roadmap_exists: boolean; + state_exists: boolean; + config_exists: boolean; + + has_existing_code: boolean; + has_package_file: boolean; + is_brownfield: boolean; + fast_mode: boolean; + map_readiness: MapReadiness; + next_action: OnboardNextAction; + needs_codebase_map: boolean; + has_codebase_map: boolean; + has_fast_codebase_map: boolean; + codebase_dir_exists: boolean; + fast_codebase_map_files_required: string[]; + codebase_map_files_present: string[]; + missing_codebase_map_files: string[]; + missing_fast_codebase_map_files: string[]; + codebase_map_summary_status: string; + codebase_map_final_status: string; + + has_docs_candidates: boolean; + doc_candidate_count: number; + doc_candidates: string[]; + + onboarding_summary_exists: boolean; + onboarding_summary_path: string; + + project_path: string; + requirements_path: string; + roadmap_path: string; + state_path: string; + codebase_dir: string; + onboarding_dir: string; +} + +function hasCodeFilesInternal(dir: string, depth = 0): boolean { + if (depth > 3) return false; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return false; + } + + for (const entry of entries) { + if (entry.isFile() && CODE_EXTENSIONS.has(path.extname(entry.name))) return true; + if (entry.isDirectory() && !CODE_SCAN_SKIP_DIRS.has(entry.name)) { + if (hasCodeFilesInternal(path.join(dir, entry.name), depth + 1)) return true; + } + } + + return false; +} + +function hasPackageFileInternal(cwd: string): boolean { + return PACKAGE_FILES.some((file) => pathExistsInternal(cwd, file)); +} + +function listPlanningDocCandidates(cwd: string): string[] { + const roots = ['docs', 'adr', 'adrs', 'prd', 'prds', 'spec', 'specs', 'rfc', 'rfcs']; + const candidates = new Set(); + + function isPlanningDocCandidate(rel: string, name: string): boolean { + const upperName = name.toUpperCase(); + const relLower = rel.toLowerCase(); + const pathSegments = relLower.split('/'); + return ( + /(^|[-_ ])(ADR|PRD|SPEC|RFC)([-_ ]|\.)/i.test(name) || + /^\d{4}[-_].+\.md$/i.test(name) || + pathSegments.some((segment) => PLANNING_DOC_SEGMENTS.has(segment)) || + upperName === 'REQUIREMENTS.MD' + ); + } + + function addCandidate(rel: string, name: string): void { + if (name.toLowerCase().endsWith('.md') && isPlanningDocCandidate(rel, name)) { + candidates.add(toPosixPath(rel)); + } + } + + function visit(dir: string, relDir: string, depth: number): void { + if (depth > 3) return; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + + for (const entry of entries) { + const rel = relDir ? `${relDir}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + if (!CODE_SCAN_SKIP_DIRS.has(entry.name)) { + visit(path.join(dir, entry.name), rel, depth + 1); + } + continue; + } + + if (entry.isFile()) addCandidate(rel, entry.name); + } + } + + let rootEntries: fs.Dirent[] = []; + try { + rootEntries = fs.readdirSync(cwd, { withFileTypes: true }); + } catch { + rootEntries = []; + } + + for (const entry of rootEntries) { + if (entry.isFile()) addCandidate(entry.name, entry.name); + } + + for (const root of roots) { + const full = path.join(cwd, root); + if (fs.existsSync(full)) visit(full, root, 0); + } + + return [...candidates].sort(); +} + +function listCodebaseMapFiles(cwd: string): string[] { + const codebaseDir = path.join(planningRoot(cwd), 'codebase'); + if (!fs.existsSync(codebaseDir)) return []; + return REQUIRED_CODEBASE_MAP_FILES.filter((file) => + fs.existsSync(path.join(codebaseDir, file)), + ); +} + +function getMapReadiness(hasCompleteMap: boolean, hasFastMap: boolean): MapReadiness { + if (hasCompleteMap) return 'complete'; + if (hasFastMap) return 'fast'; + return 'none'; +} + +function mapSummaryStatus(mapReadiness: MapReadiness): string { + if (mapReadiness === 'complete') return '.planning/codebase/ (complete codebase map)'; + if (mapReadiness === 'fast') return '.planning/codebase/ (fast/partial codebase map; complete map still required for project setup)'; + return 'missing'; +} + +function mapFinalStatus(mapReadiness: MapReadiness): string { + if (mapReadiness === 'complete') return 'complete'; + if (mapReadiness === 'fast') return 'fast/partial; complete map still required for project setup'; + return 'missing'; +} + +function planningMissing(requirementsExists: boolean, roadmapExists: boolean, stateExists: boolean): string[] { + const missing: string[] = []; + if (!requirementsExists) missing.push('REQUIREMENTS.md'); + if (!roadmapExists) missing.push('ROADMAP.md'); + if (!stateExists) missing.push('STATE.md'); + return missing; +} + +function nextAction(params: { + fastMode: boolean; + isBrownfield: boolean; + needsCodebaseMap: boolean; + hasDocsCandidates: boolean; + projectExists: boolean; + mapReadiness: MapReadiness; + onboardingSummaryExists: boolean; + missingPlanningFiles: string[]; +}): OnboardNextAction { + if (params.isBrownfield && params.needsCodebaseMap) { + return { + kind: 'map-codebase', + command: params.fastMode ? '/gsd:map-codebase --fast' : '/gsd:map-codebase', + reason: 'Existing code was detected, but the required .planning/codebase/ map is missing.', + }; + } + + if (params.hasDocsCandidates && !params.projectExists) { + return { + kind: 'ingest-docs', + command: '/gsd:ingest-docs', + reason: 'Detected existing ADR/PRD/SPEC/RFC document(s) before project setup.', + }; + } + + if (!params.isBrownfield && !params.projectExists && !params.hasDocsCandidates) { + return { + kind: 'new-project', + command: '/gsd:new-project', + reason: 'No existing code or planning docs were detected.', + }; + } + + if (!params.projectExists && params.fastMode && params.mapReadiness === 'fast') { + return { + kind: 'complete-map-before-new-project', + command: '/gsd:map-codebase', + reason: 'The fast map is enough for lightweight onboarding, but project setup still requires the complete codebase map.', + }; + } + + if (!params.projectExists) { + return { + kind: 'new-project', + command: '/gsd:new-project', + reason: 'Codebase context is ready for project initialization.', + }; + } + + if (params.missingPlanningFiles.length > 0) { + return { + kind: 'partial-planning', + missing: params.missingPlanningFiles, + reason: 'Project planning exists but required planning files are missing.', + }; + } + + if (!params.onboardingSummaryExists) { + return { + kind: 'write-summary', + summary_path: '.planning/onboarding/SUMMARY.md', + reason: 'Onboarding summary is missing.', + }; + } + + return { + kind: 'ready', + reason: 'Onboarding summary already exists.', + }; +} + +function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOptions): OnboardProjection { + const codebaseMapFiles = listCodebaseMapFiles(cwd); + const missingCodebaseMapFiles = REQUIRED_CODEBASE_MAP_FILES.filter( + (file) => !codebaseMapFiles.includes(file), + ); + const missingFastCodebaseMapFiles = FAST_CODEBASE_MAP_FILES.filter( + (file) => !codebaseMapFiles.includes(file), + ); + const docCandidates = listPlanningDocCandidates(cwd); + const hasCode = hasCodeFilesInternal(cwd); + const hasPackageFile = hasPackageFileInternal(cwd); + const isBrownfield = hasCode || hasPackageFile; + const hasCodebaseMap = codebaseMapFiles.length === REQUIRED_CODEBASE_MAP_FILES.length; + const hasFastCodebaseMap = missingFastCodebaseMapFiles.length === 0; + const mapReadinessValue = getMapReadiness(hasCodebaseMap, hasFastCodebaseMap); + const needsCodebaseMap = isBrownfield && ( + options.fast ? !hasFastCodebaseMap : !hasCodebaseMap + ); + const projectExists = pathExistsInternal(cwd, '.planning/PROJECT.md'); + const requirementsExists = fs.existsSync(path.join(planningDir(cwd), 'REQUIREMENTS.md')); + const roadmapExists = fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')); + const stateExists = fs.existsSync(path.join(planningDir(cwd), 'STATE.md')); + const onboardingSummaryExists = pathExistsInternal(cwd, '.planning/onboarding/SUMMARY.md'); + const missingPlanningFiles = planningMissing(requirementsExists, roadmapExists, stateExists); + + return { + commit_docs: options.commitDocs, + text_mode: options.textMode, + + project_exists: projectExists, + planning_exists: fs.existsSync(planningRoot(cwd)), + requirements_exists: requirementsExists, + roadmap_exists: roadmapExists, + state_exists: stateExists, + config_exists: fs.existsSync(path.join(planningDir(cwd), 'config.json')), + + has_existing_code: hasCode, + has_package_file: hasPackageFile, + is_brownfield: isBrownfield, + fast_mode: options.fast, + map_readiness: mapReadinessValue, + next_action: nextAction({ + fastMode: options.fast, + isBrownfield, + needsCodebaseMap, + hasDocsCandidates: docCandidates.length > 0, + projectExists, + mapReadiness: mapReadinessValue, + onboardingSummaryExists, + missingPlanningFiles, + }), + needs_codebase_map: needsCodebaseMap, + has_codebase_map: hasCodebaseMap, + has_fast_codebase_map: hasFastCodebaseMap, + codebase_dir_exists: fs.existsSync(path.join(planningRoot(cwd), 'codebase')), + fast_codebase_map_files_required: FAST_CODEBASE_MAP_FILES, + codebase_map_files_present: codebaseMapFiles, + missing_codebase_map_files: missingCodebaseMapFiles, + missing_fast_codebase_map_files: missingFastCodebaseMapFiles, + codebase_map_summary_status: mapSummaryStatus(mapReadinessValue), + codebase_map_final_status: mapFinalStatus(mapReadinessValue), + + has_docs_candidates: docCandidates.length > 0, + doc_candidate_count: docCandidates.length, + doc_candidates: docCandidates, + + onboarding_summary_exists: onboardingSummaryExists, + onboarding_summary_path: '.planning/onboarding/SUMMARY.md', + + project_path: '.planning/PROJECT.md', + requirements_path: toPosixPath( + path.relative(cwd, path.join(planningDir(cwd), 'REQUIREMENTS.md')), + ), + roadmap_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'ROADMAP.md'))), + state_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'STATE.md'))), + codebase_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'codebase'))), + onboarding_dir: toPosixPath(path.relative(cwd, path.join(planningRoot(cwd), 'onboarding'))), + }; +} + +export = { + REQUIRED_CODEBASE_MAP_FILES, + FAST_CODEBASE_MAP_FILES, + buildOnboardProjection, + hasCodeFilesInternal, + hasPackageFileInternal, + listCodebaseMapFiles, + listPlanningDocCandidates, +}; diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 2201b3730..30bb98716 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -138,7 +138,7 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.text_mode, true); }); - test('reports fast codebase map readiness for the default fast subset', () => { + test('reports fast codebase map readiness and a complete-map handoff before new-project', () => { fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); for (const name of ['STACK', 'INTEGRATIONS', 'ARCHITECTURE', 'STRUCTURE']) { fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); @@ -149,9 +149,13 @@ describe('init onboard public CLI projection', () => { assert.ok(result.success, `init onboard should succeed: ${result.error}`); const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.map_readiness, 'fast'); assert.strictEqual(parsed.has_codebase_map, false); assert.strictEqual(parsed.has_fast_codebase_map, true); assert.strictEqual(parsed.needs_codebase_map, false); + assert.strictEqual(parsed.next_action.kind, 'complete-map-before-new-project'); + assert.strictEqual(parsed.next_action.command, '/gsd:map-codebase'); + assert.match(parsed.next_action.reason, /complete codebase map/i); assert.deepStrictEqual(parsed.fast_codebase_map_files_required, [ 'STACK.md', 'INTEGRATIONS.md', @@ -161,6 +165,74 @@ describe('init onboard public CLI projection', () => { assert.deepStrictEqual(parsed.missing_fast_codebase_map_files, []); }); + test('projects the next action for code, docs, greenfield, partial planning, and summary states', () => { + fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'src', 'server.ts'), 'export const server = true;\n'); + let result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + assert.deepStrictEqual(JSON.parse(result.output).next_action, { + kind: 'map-codebase', + command: '/gsd:map-codebase', + reason: 'Existing code was detected, but the required .planning/codebase/ map is missing.', + }); + + cleanup(tmpDir); + tmpDir = createFixture({ planning: false, projectDoc: false }); + fs.mkdirSync(path.join(tmpDir, 'docs', 'adr'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'docs', 'adr', '0001-runtime.md'), '# ADR: Runtime\n'); + result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + assert.deepStrictEqual(JSON.parse(result.output).next_action, { + kind: 'ingest-docs', + command: '/gsd:ingest-docs', + reason: 'Detected existing ADR/PRD/SPEC/RFC document(s) before project setup.', + }); + + cleanup(tmpDir); + tmpDir = createFixture({ planning: false, projectDoc: false }); + result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + assert.deepStrictEqual(JSON.parse(result.output).next_action, { + kind: 'new-project', + command: '/gsd:new-project', + reason: 'No existing code or planning docs were detected.', + }); + + cleanup(tmpDir); + tmpDir = createFixture({ planning: false, projectDoc: false }); + fs.mkdirSync(path.join(tmpDir, '.planning'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), '# Roadmap\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'STATE.md'), '# State\n'); + result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + const partial = JSON.parse(result.output); + assert.strictEqual(partial.next_action.kind, 'partial-planning'); + assert.deepStrictEqual(partial.next_action.missing, ['REQUIREMENTS.md']); + + fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'ARCHITECTURE', 'STRUCTURE', 'CONVENTIONS', 'TESTING', 'INTEGRATIONS', 'CONCERNS']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } + fs.writeFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), '# Requirements\n'); + result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + assert.deepStrictEqual(JSON.parse(result.output).next_action, { + kind: 'write-summary', + summary_path: '.planning/onboarding/SUMMARY.md', + reason: 'Onboarding summary is missing.', + }); + + fs.mkdirSync(path.join(tmpDir, '.planning', 'onboarding'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, '.planning', 'onboarding', 'SUMMARY.md'), '# Onboarding Summary\n'); + result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + assert.deepStrictEqual(JSON.parse(result.output).next_action, { + kind: 'ready', + reason: 'Onboarding summary already exists.', + }); + }); + test('reports missing requirements in otherwise existing planning', () => { fs.mkdirSync(path.join(tmpDir, '.planning'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); @@ -230,101 +302,37 @@ describe('/gsd:onboard command contract', () => { assert.ok(content.includes('@~/.claude/gsd-core/references/gate-prompts.md')); }); - test('workflow routes through existing primitives and protects existing planning', () => { + test('workflow renders the init projection without owning the route state machine', () => { const content = fs.readFileSync(WF_PATH, 'utf8'); - assert.ok(content.includes('init onboard'), 'workflow must use init onboard projection'); - assert.match(content, /gsd_run --cwd "\$_GSD_RUNTIME_ROOT" init onboard/, 'workflow must anchor init onboard at runtime root'); + assert.ok(content.includes('@~/.claude/gsd-core/references/gsd-run-resolver.md')); assert.ok( - !content.includes('ARGUMENTS:-'), - 'workflow must not depend on an unexported shell ARGUMENTS variable', + !content.includes('_GSD_SHIM_NAME="gsd-tools.cjs"'), + 'workflow must reference the shared resolver instead of inlining it', ); - assert.match( - content, - /Run init from parsed prompt args, not shell `\$ARGUMENTS`/, - 'workflow must forward fast mode from parsed prompt arguments into init onboard', - ); - assert.match( - content, - /gsd_run --cwd "\$_GSD_RUNTIME_ROOT" init onboard --fast/, - 'workflow must provide a literal fast init command', - ); - assert.ok(content.includes('has_fast_codebase_map'), 'workflow must parse fast map readiness'); - assert.match(content, /CODEBASE_MAP_READY=.*has_fast_codebase_map/s, 'workflow must treat the fast subset as acceptable in fast mode'); - assert.ok(content.includes('Run from worktree root'), 'workflow handoffs must be anchored at the worktree root'); - for (const runtimeHome of [ - 'HERMES_HOME', - 'CURSOR_CONFIG_DIR', - 'CODEX_HOME', - 'GEMINI_CONFIG_DIR', - 'WINDSURF_CONFIG_DIR', - 'OPENCODE_CONFIG_DIR', + assert.match(content, /init onboard --fast --raw/); + assert.match(content, /init onboard --raw/); + assert.match(content, /next_action\.kind/); + assert.match(content, /map_readiness/); + assert.match(content, /codebase_map_summary_status/); + assert.match(content, /ONBOARDING_ROOT=\{git_worktree_root \|\| _GSD_RUNTIME_ROOT\}/); + + for (const action of [ + 'map-codebase', + 'ingest-docs', + 'complete-map-before-new-project', + 'new-project', + 'partial-planning', + 'write-summary', + 'ready', ]) { - assert.ok(content.includes(runtimeHome), `workflow resolver must include ${runtimeHome}`); + assert.ok(content.includes(`next_action.kind == "${action}"`), `workflow must render ${action}`); } - assert.match(content, /Parse JSON fields:.*`commit_docs`/s, 'workflow must parse commit_docs before using it'); - assert.ok(content.includes('map-codebase'), 'workflow must route to map-codebase'); - assert.ok(content.includes('ingest-docs'), 'workflow must route to ingest-docs'); - assert.match( - content, - /If `has_docs_candidates` is true and `project_exists` is false:/, - 'workflow must offer docs ingest before project setup even when codebase mapping already created .planning', - ); - assert.match( - content, - /If `is_brownfield` is false and `planning_exists` is false and `has_docs_candidates` is false, print:/, - 'workflow must not send doc-only repos to new-project before the docs ingest gate', - ); - assert.ok(content.includes('new-project'), 'workflow must route to new-project'); - assert.ok(content.includes('.planning/onboarding/SUMMARY.md'), 'workflow must create onboarding summary'); - assert.match( - content, - /ONBOARDING_ROOT=\{git_worktree_root \|\| _GSD_RUNTIME_ROOT\}/, - 'workflow must resolve a single root for summary writes', - ); - assert.match( - content, - /Create `\{ONBOARDING_ROOT\}\/\.planning\/onboarding\/SUMMARY\.md`/, - 'workflow must anchor summary writes at onboarding root', - ); - assert.match( - content, - /gsd_run --cwd "\$ONBOARDING_ROOT" query commit "docs: create onboarding summary" --files \.planning\/onboarding\/SUMMARY\.md/, - 'workflow must commit the root-relative summary path from onboarding root', - ); - assert.match( - content, - /CODEBASE_MAP_SUMMARY_STATUS=\.planning\/codebase\/ \(fast\/partial-but-accepted codebase map\)/, - 'workflow summary must label fast accepted maps without implying a complete map', - ); - assert.match( - content, - /CODEBASE_MAP_FINAL_STATUS=\(fast\/partial-but-accepted; required fast files present\)/, - 'final status must distinguish complete maps from accepted fast maps', - ); - assert.match( - content, - /If `project_exists` is false and `fast_mode && has_fast_codebase_map && !has_codebase_map` is true:/, - 'workflow must not hand fast-partial maps directly to new-project', - ); - assert.match( - content, - /Fast codebase context is accepted for onboarding, but \/gsd:new-project still requires the complete codebase map\./, - 'workflow must explain why fast-partial onboarding stops before new-project', - ); - const deriveMapStatusIndex = content.indexOf('Before summary keep/update choices, derive map status values safely:'); - const keepExistingSummaryIndex = content.indexOf('If `onboarding_summary_exists` is true:'); - assert.ok(deriveMapStatusIndex >= 0, 'workflow must derive map status values'); - assert.ok(keepExistingSummaryIndex >= 0, 'workflow must define the existing-summary branch'); - assert.ok( - deriveMapStatusIndex < keepExistingSummaryIndex, - 'workflow must derive final map status before a keep-existing-summary path can skip to final status', - ); - assert.match(content, /overwrite|idempotent|do not overwrite/i, 'workflow must protect existing planning'); - assert.ok(content.includes('requirements_exists'), 'workflow must parse requirements existence'); - assert.match(content, /REQUIREMENTS\.md: \{requirements_exists \? "present" : "missing"\}/, 'workflow must report missing requirements in partial planning'); - assert.match(content, /If `project_exists` is true and .*`requirements_exists`.* is false/s, 'workflow must gate partial planning on missing requirements'); + + assert.ok(content.includes('AskUserQuestion'), 'workflow must still support interactive choices'); assert.ok(content.includes('--text'), 'workflow must document text-mode fallback'); + assert.match(content, /do not overwrite/i, 'workflow must protect existing summary/planning'); + assert.match(content, /query commit "docs: create onboarding summary" --files \.planning\/onboarding\/SUMMARY\.md/); assert.ok(!content.includes('execute-phase'), 'onboarding must not execute implementation phases'); assert.ok(!content.includes('gsd:ship'), 'onboarding must not ship work'); }); From 2a38ea5331698d2a991d5bfd79de4e3b21a8623f Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 15:04:10 -0500 Subject: [PATCH 22/75] no-mistakes(review): Harden onboarding projection routing --- src/onboard-projection.cts | 50 ++++++++++++++++++++++------------ tests/onboard-command.test.cjs | 31 +++++++++++++++++++++ 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts index 26ba11305..8e4ec8f7f 100644 --- a/src/onboard-projection.cts +++ b/src/onboard-projection.cts @@ -212,8 +212,14 @@ function mapFinalStatus(mapReadiness: MapReadiness): string { return 'missing'; } -function planningMissing(requirementsExists: boolean, roadmapExists: boolean, stateExists: boolean): string[] { +function planningMissing( + projectExists: boolean, + requirementsExists: boolean, + roadmapExists: boolean, + stateExists: boolean, +): string[] { const missing: string[] = []; + if (!projectExists) missing.push('PROJECT.md'); if (!requirementsExists) missing.push('REQUIREMENTS.md'); if (!roadmapExists) missing.push('ROADMAP.md'); if (!stateExists) missing.push('STATE.md'); @@ -228,6 +234,7 @@ function nextAction(params: { projectExists: boolean; mapReadiness: MapReadiness; onboardingSummaryExists: boolean; + hasPlanningArtifacts: boolean; missingPlanningFiles: string[]; }): OnboardNextAction { if (params.isBrownfield && params.needsCodebaseMap) { @@ -238,6 +245,22 @@ function nextAction(params: { }; } + if (!params.projectExists && params.fastMode && params.mapReadiness === 'fast') { + return { + kind: 'complete-map-before-new-project', + command: '/gsd:map-codebase', + reason: 'The fast map is enough for lightweight onboarding, but project setup still requires the complete codebase map.', + }; + } + + if (params.hasPlanningArtifacts && params.missingPlanningFiles.length > 0) { + return { + kind: 'partial-planning', + missing: params.missingPlanningFiles, + reason: 'Project planning exists but required planning files are missing.', + }; + } + if (params.hasDocsCandidates && !params.projectExists) { return { kind: 'ingest-docs', @@ -254,14 +277,6 @@ function nextAction(params: { }; } - if (!params.projectExists && params.fastMode && params.mapReadiness === 'fast') { - return { - kind: 'complete-map-before-new-project', - command: '/gsd:map-codebase', - reason: 'The fast map is enough for lightweight onboarding, but project setup still requires the complete codebase map.', - }; - } - if (!params.projectExists) { return { kind: 'new-project', @@ -270,14 +285,6 @@ function nextAction(params: { }; } - if (params.missingPlanningFiles.length > 0) { - return { - kind: 'partial-planning', - missing: params.missingPlanningFiles, - reason: 'Project planning exists but required planning files are missing.', - }; - } - if (!params.onboardingSummaryExists) { return { kind: 'write-summary', @@ -315,7 +322,13 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti const roadmapExists = fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')); const stateExists = fs.existsSync(path.join(planningDir(cwd), 'STATE.md')); const onboardingSummaryExists = pathExistsInternal(cwd, '.planning/onboarding/SUMMARY.md'); - const missingPlanningFiles = planningMissing(requirementsExists, roadmapExists, stateExists); + const hasPlanningArtifacts = projectExists || requirementsExists || roadmapExists || stateExists; + const missingPlanningFiles = planningMissing( + projectExists, + requirementsExists, + roadmapExists, + stateExists, + ); return { commit_docs: options.commitDocs, @@ -341,6 +354,7 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti projectExists, mapReadiness: mapReadinessValue, onboardingSummaryExists, + hasPlanningArtifacts, missingPlanningFiles, }), needs_codebase_map: needsCodebaseMap, diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 30bb98716..563a87967 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -165,6 +165,37 @@ describe('init onboard public CLI projection', () => { assert.deepStrictEqual(parsed.missing_fast_codebase_map_files, []); }); + test('routes fast mapped repositories with planning docs to complete map before ingest', () => { + fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'INTEGRATIONS', 'ARCHITECTURE', 'STRUCTURE']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + fs.mkdirSync(path.join(tmpDir, 'docs', 'adr'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, 'docs', 'adr', '0001-runtime.md'), '# ADR: Runtime\n'); + + const result = runGsdTools(['init', 'onboard', '--fast', '--raw'], tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.next_action.kind, 'complete-map-before-new-project'); + assert.strictEqual(parsed.next_action.command, '/gsd:map-codebase'); + }); + + test('routes planning artifacts without PROJECT.md to partial planning', () => { + fs.mkdirSync(path.join(tmpDir, '.planning'), { recursive: true }); + fs.writeFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), '# Requirements\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), '# Roadmap\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'STATE.md'), '# State\n'); + + const result = runGsdTools('init onboard --raw', tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.next_action.kind, 'partial-planning'); + assert.deepStrictEqual(parsed.next_action.missing, ['PROJECT.md']); + }); + test('projects the next action for code, docs, greenfield, partial planning, and summary states', () => { fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, 'src', 'server.ts'), 'export const server = true;\n'); From cd5971fd3f246d1235252241e82191b2964e4aa1 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 15:12:07 -0500 Subject: [PATCH 23/75] no-mistakes(review): Fix onboard skip handoffs --- gsd-core/workflows/onboard.md | 24 ++++++++++++++++++++++-- tests/onboard-command.test.cjs | 16 ++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index d955e3048..f1896fbfe 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -72,7 +72,17 @@ Run from worktree root {ONBOARDING_ROOT}: Then rerun /gsd:onboard from the same worktree root. ``` -Exit. If the user skips mapping, continue with a warning. +Exit. If the user skips mapping, print: + +```text +Skipping codebase mapping may give /gsd:new-project weaker context. + +Run from worktree root {ONBOARDING_ROOT}: + +/gsd:new-project +``` + +Exit. ### `ingest-docs` @@ -107,7 +117,17 @@ Run from worktree root {ONBOARDING_ROOT}: Then rerun /gsd:onboard from the same worktree root. ``` -Exit. If the user skips docs ingest, continue to the new-project handoff below. +Exit. If the user skips docs ingest, print: + +```text +Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from /gsd:new-project. + +Run from worktree root {ONBOARDING_ROOT}: + +/gsd:new-project +``` + +Exit. ### `complete-map-before-new-project` diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 563a87967..10851d5e5 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -362,6 +362,22 @@ describe('/gsd:onboard command contract', () => { assert.ok(content.includes('AskUserQuestion'), 'workflow must still support interactive choices'); assert.ok(content.includes('--text'), 'workflow must document text-mode fallback'); + assert.ok( + content.includes('Exit. If the user skips mapping, print:'), + 'skip mapping must hand off explicitly instead of falling through to summary creation', + ); + assert.ok( + content.includes('Skipping codebase mapping may give /gsd:new-project weaker context.'), + 'skip mapping must warn about weaker context', + ); + assert.ok( + content.includes('Exit. If the user skips docs ingest, print:'), + 'skip docs ingest must hand off explicitly instead of falling through to summary creation', + ); + assert.ok( + content.includes('Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from /gsd:new-project.'), + 'skip docs ingest must warn about omitted docs context', + ); assert.match(content, /do not overwrite/i, 'workflow must protect existing summary/planning'); assert.match(content, /query commit "docs: create onboarding summary" --files \.planning\/onboarding\/SUMMARY\.md/); assert.ok(!content.includes('execute-phase'), 'onboarding must not execute implementation phases'); From c9d964243a70e2e1d00b1c93c2259aaddce7c049 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 15:22:16 -0500 Subject: [PATCH 24/75] no-mistakes(review): Fix onboard fast-map and skip routing --- gsd-core/workflows/onboard.md | 16 +++++++++++++++- src/onboard-projection.cts | 14 ++++++++------ tests/onboard-command.test.cjs | 13 +++++++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index f1896fbfe..7166317f5 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -72,7 +72,21 @@ Run from worktree root {ONBOARDING_ROOT}: Then rerun /gsd:onboard from the same worktree root. ``` -Exit. If the user skips mapping, print: +Exit. If the user skips mapping: + +- If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead: + +```text +Skipping codebase mapping may give downstream steps weaker context, but existing ADR/PRD/SPEC/RFC documents should still be ingested before /gsd:new-project. + +Run from worktree root {ONBOARDING_ROOT}: + +/gsd:ingest-docs +``` + +Exit. + +- Otherwise print: ```text Skipping codebase mapping may give /gsd:new-project weaker context. diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts index 8e4ec8f7f..c2501a210 100644 --- a/src/onboard-projection.cts +++ b/src/onboard-projection.cts @@ -75,6 +75,7 @@ interface OnboardProjection { map_readiness: MapReadiness; next_action: OnboardNextAction; needs_codebase_map: boolean; + needs_fast_codebase_map: boolean; has_codebase_map: boolean; has_fast_codebase_map: boolean; codebase_dir_exists: boolean; @@ -229,7 +230,7 @@ function planningMissing( function nextAction(params: { fastMode: boolean; isBrownfield: boolean; - needsCodebaseMap: boolean; + needsOnboardCodebaseMap: boolean; hasDocsCandidates: boolean; projectExists: boolean; mapReadiness: MapReadiness; @@ -237,7 +238,7 @@ function nextAction(params: { hasPlanningArtifacts: boolean; missingPlanningFiles: string[]; }): OnboardNextAction { - if (params.isBrownfield && params.needsCodebaseMap) { + if (params.isBrownfield && params.needsOnboardCodebaseMap) { return { kind: 'map-codebase', command: params.fastMode ? '/gsd:map-codebase --fast' : '/gsd:map-codebase', @@ -314,9 +315,9 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti const hasCodebaseMap = codebaseMapFiles.length === REQUIRED_CODEBASE_MAP_FILES.length; const hasFastCodebaseMap = missingFastCodebaseMapFiles.length === 0; const mapReadinessValue = getMapReadiness(hasCodebaseMap, hasFastCodebaseMap); - const needsCodebaseMap = isBrownfield && ( - options.fast ? !hasFastCodebaseMap : !hasCodebaseMap - ); + const needsCodebaseMap = isBrownfield && !hasCodebaseMap; + const needsFastCodebaseMap = isBrownfield && !hasFastCodebaseMap; + const needsOnboardCodebaseMap = options.fast ? needsFastCodebaseMap : needsCodebaseMap; const projectExists = pathExistsInternal(cwd, '.planning/PROJECT.md'); const requirementsExists = fs.existsSync(path.join(planningDir(cwd), 'REQUIREMENTS.md')); const roadmapExists = fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')); @@ -349,7 +350,7 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti next_action: nextAction({ fastMode: options.fast, isBrownfield, - needsCodebaseMap, + needsOnboardCodebaseMap, hasDocsCandidates: docCandidates.length > 0, projectExists, mapReadiness: mapReadinessValue, @@ -358,6 +359,7 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti missingPlanningFiles, }), needs_codebase_map: needsCodebaseMap, + needs_fast_codebase_map: needsFastCodebaseMap, has_codebase_map: hasCodebaseMap, has_fast_codebase_map: hasFastCodebaseMap, codebase_dir_exists: fs.existsSync(path.join(planningRoot(cwd), 'codebase')), diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 10851d5e5..762068b74 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -152,7 +152,8 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.map_readiness, 'fast'); assert.strictEqual(parsed.has_codebase_map, false); assert.strictEqual(parsed.has_fast_codebase_map, true); - assert.strictEqual(parsed.needs_codebase_map, false); + assert.strictEqual(parsed.needs_codebase_map, true); + assert.strictEqual(parsed.needs_fast_codebase_map, false); assert.strictEqual(parsed.next_action.kind, 'complete-map-before-new-project'); assert.strictEqual(parsed.next_action.command, '/gsd:map-codebase'); assert.match(parsed.next_action.reason, /complete codebase map/i); @@ -363,9 +364,17 @@ describe('/gsd:onboard command contract', () => { assert.ok(content.includes('AskUserQuestion'), 'workflow must still support interactive choices'); assert.ok(content.includes('--text'), 'workflow must document text-mode fallback'); assert.ok( - content.includes('Exit. If the user skips mapping, print:'), + content.includes('Exit. If the user skips mapping:'), 'skip mapping must hand off explicitly instead of falling through to summary creation', ); + assert.ok( + content.includes('If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead:'), + 'skip mapping must preserve the docs-ingest gate when planning docs are present', + ); + assert.ok( + content.includes('/gsd:ingest-docs'), + 'skip mapping docs-preserving handoff must name the docs ingest command', + ); assert.ok( content.includes('Skipping codebase mapping may give /gsd:new-project weaker context.'), 'skip mapping must warn about weaker context', From 64d9f84cf273dfeec938ee74dc80fc3fc122a78f Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 15:28:26 -0500 Subject: [PATCH 25/75] no-mistakes(review): Forward onboard text flag --- src/init-command-router.cts | 4 ++-- src/init.cts | 2 +- tests/onboard-command.test.cjs | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/init-command-router.cts b/src/init-command-router.cts index 90e09e2e6..6ea4b4dac 100644 --- a/src/init-command-router.cts +++ b/src/init-command-router.cts @@ -73,8 +73,8 @@ function routeInitCommand({ init, args, cwd, raw, error }: RouteInitCommandOptio 'new-project': () => init.cmdInitNewProject(cwd, raw), 'new-milestone': () => init.cmdInitNewMilestone(cwd, raw), onboard: () => { - const namedArgs = parseNamedArgs(args, [], ['fast']); - init.cmdInitOnboard(cwd, raw, { fast: namedArgs['fast'] }); + const namedArgs = parseNamedArgs(args, [], ['fast', 'text']); + init.cmdInitOnboard(cwd, raw, { fast: namedArgs['fast'], text: namedArgs['text'] }); }, quick: () => init.cmdInitQuick(cwd, args.slice(2).join(' '), raw), 'ingest-docs': () => init.cmdInitIngestDocs(cwd, raw), diff --git a/src/init.cts b/src/init.cts index 5c781ba25..19d8e6f1c 100644 --- a/src/init.cts +++ b/src/init.cts @@ -802,7 +802,7 @@ function cmdInitOnboard( ...buildOnboardProjection(cwd, { commitDocs: !!config.commit_docs, fast: options['fast'] === true, - textMode: !!config.text_mode || !!workflowConfig['text_mode'], + textMode: options['text'] === true || !!config.text_mode || !!workflowConfig['text_mode'], }), ...getInitGitState(cwd), }; diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 762068b74..4904e18c2 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -97,6 +97,14 @@ describe('init onboard public CLI projection', () => { ]); }); + test('forwards the --text flag into the public projection', () => { + const result = runGsdTools(['init', 'onboard', '--text', '--raw'], tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.text_mode, true); + }); + test('reports complete codebase map and onboarding summary in existing planning', () => { fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); for (const name of ['STACK', 'ARCHITECTURE', 'STRUCTURE', 'CONVENTIONS', 'TESTING', 'INTEGRATIONS', 'CONCERNS']) { From a845a7d23170909639185fd21093ab40fb651edd Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 16:13:26 -0500 Subject: [PATCH 26/75] no-mistakes(review): Preserve partial-planning skip guard --- gsd-core/workflows/onboard.md | 15 +++++++++++++++ tests/onboard-command.test.cjs | 14 +++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 7166317f5..5d6d83187 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -74,6 +74,21 @@ Then rerun /gsd:onboard from the same worktree root. Exit. If the user skips mapping: +- If `planning_exists && (!project_exists || !requirements_exists || !roadmap_exists || !state_exists)`, route the skip to the partial planning guard instead: + +```text +Skipping codebase mapping may give downstream steps weaker context, but project planning exists and is incomplete. + +PROJECT.md: {project_exists ? "present" : "missing"} +REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} +ROADMAP.md: {roadmap_exists ? "present" : "missing"} +STATE.md: {state_exists ? "present" : "missing"} + +Run the appropriate lower-level command to fill the missing planning artifact(s), then rerun /gsd:onboard. +``` + +Exit. + - If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead: ```text diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 4904e18c2..b3ab7a64b 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -375,10 +375,22 @@ describe('/gsd:onboard command contract', () => { content.includes('Exit. If the user skips mapping:'), 'skip mapping must hand off explicitly instead of falling through to summary creation', ); + const partialPlanningSkipGuard = + 'If `planning_exists && (!project_exists || !requirements_exists || !roadmap_exists || !state_exists)`, route the skip to the partial planning guard instead:'; + const docsIngestSkipGuard = + 'If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead:'; assert.ok( - content.includes('If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead:'), + content.includes(partialPlanningSkipGuard), + 'skip mapping must preserve the partial-planning guard when incomplete planning artifacts are present', + ); + assert.ok( + content.includes(docsIngestSkipGuard), 'skip mapping must preserve the docs-ingest gate when planning docs are present', ); + assert.ok( + content.indexOf(partialPlanningSkipGuard) < content.indexOf(docsIngestSkipGuard), + 'skip mapping must check partial planning before docs ingest', + ); assert.ok( content.includes('/gsd:ingest-docs'), 'skip mapping docs-preserving handoff must name the docs ingest command', From 2f2d33aea7067a7f90614279c9bf7affa85554aa Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 17:08:29 -0500 Subject: [PATCH 27/75] no-mistakes(review): Format onboard handoffs by runtime --- gsd-core/workflows/onboard.md | 31 ++++++++++++----------- src/onboard-projection.cts | 39 ++++++++++++++++++++++++---- tests/onboard-command.test.cjs | 46 ++++++++++++++++++++++++++-------- 3 files changed, 86 insertions(+), 30 deletions(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 5d6d83187..321649fc0 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -24,6 +24,7 @@ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi Parse JSON fields from `INIT`: - `next_action.kind`, `next_action.command`, `next_action.reason`, `next_action.missing`, `next_action.summary_path` +- `handoff_commands.ingest_docs`, `handoff_commands.manager`, `handoff_commands.new_project`, `handoff_commands.onboard` - `map_readiness`, `codebase_map_summary_status`, `codebase_map_final_status` - `planning_exists`, `project_exists`, `requirements_exists`, `roadmap_exists`, `state_exists` - `is_brownfield`, `fast_mode`, `has_codebase_map`, `has_fast_codebase_map` @@ -69,12 +70,12 @@ Run from worktree root {ONBOARDING_ROOT}: {next_action.command} -Then rerun /gsd:onboard from the same worktree root. +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. If the user skips mapping: -- If `planning_exists && (!project_exists || !requirements_exists || !roadmap_exists || !state_exists)`, route the skip to the partial planning guard instead: +- If `(project_exists || requirements_exists || roadmap_exists || state_exists) && (!project_exists || !requirements_exists || !roadmap_exists || !state_exists)`, route the skip to the partial planning guard instead: ```text Skipping codebase mapping may give downstream steps weaker context, but project planning exists and is incomplete. @@ -84,7 +85,7 @@ REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} ROADMAP.md: {roadmap_exists ? "present" : "missing"} STATE.md: {state_exists ? "present" : "missing"} -Run the appropriate lower-level command to fill the missing planning artifact(s), then rerun /gsd:onboard. +Run the appropriate lower-level command to fill the missing planning artifact(s), then rerun {handoff_commands.onboard}. ``` Exit. @@ -92,11 +93,11 @@ Exit. - If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead: ```text -Skipping codebase mapping may give downstream steps weaker context, but existing ADR/PRD/SPEC/RFC documents should still be ingested before /gsd:new-project. +Skipping codebase mapping may give downstream steps weaker context, but existing ADR/PRD/SPEC/RFC documents should still be ingested before {handoff_commands.new_project}. Run from worktree root {ONBOARDING_ROOT}: -/gsd:ingest-docs +{handoff_commands.ingest_docs} ``` Exit. @@ -104,11 +105,11 @@ Exit. - Otherwise print: ```text -Skipping codebase mapping may give /gsd:new-project weaker context. +Skipping codebase mapping may give {handoff_commands.new_project} weaker context. Run from worktree root {ONBOARDING_ROOT}: -/gsd:new-project +{handoff_commands.new_project} ``` Exit. @@ -124,7 +125,7 @@ If `next_action.kind == "ingest-docs"`: Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). 1. Ingest docs first — run {next_action.command} from worktree root {ONBOARDING_ROOT} (Recommended) -2. Skip docs ingest — continue to /gsd:new-project +2. Skip docs ingest — continue to {handoff_commands.new_project} Enter number: ``` @@ -134,7 +135,7 @@ Enter number: - question: "Detected {doc_candidate_count} possible ADR/PRD/SPEC/RFC document(s). Ingest them first?" - options: - "Ingest docs first" — Run `{next_action.command}` from worktree root `{ONBOARDING_ROOT}` (Recommended) - - "Skip docs ingest" — Continue to `/gsd:new-project` + - "Skip docs ingest" — Continue to `{handoff_commands.new_project}` If the user chooses ingest, print: @@ -143,17 +144,17 @@ Run from worktree root {ONBOARDING_ROOT}: {next_action.command} -Then rerun /gsd:onboard from the same worktree root. +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. If the user skips docs ingest, print: ```text -Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from /gsd:new-project. +Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from {handoff_commands.new_project}. Run from worktree root {ONBOARDING_ROOT}: -/gsd:new-project +{handoff_commands.new_project} ``` Exit. @@ -169,7 +170,7 @@ Run from worktree root {ONBOARDING_ROOT}: {next_action.command} -Then rerun /gsd:onboard from the same worktree root. +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. @@ -200,7 +201,7 @@ REQUIREMENTS.md: {requirements_exists ? "present" : "missing"} ROADMAP.md: {roadmap_exists ? "present" : "missing"} STATE.md: {state_exists ? "present" : "missing"} -Run the appropriate lower-level command to fill the missing planning artifact(s), then rerun /gsd:onboard. +Run the appropriate lower-level command to fill the missing planning artifact(s), then rerun {handoff_commands.onboard}. ``` Exit. @@ -262,7 +263,7 @@ Onboarding status: - Codebase map: {codebase_map_final_status} - Onboarding summary: present -Next recommended command: /gsd:manager +Next recommended command: {handoff_commands.manager} ``` Do not run implementation execution or shipping from onboarding. diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts index c2501a210..b327ded57 100644 --- a/src/onboard-projection.cts +++ b/src/onboard-projection.cts @@ -5,6 +5,7 @@ import path from 'node:path'; import coreUtils = require('./core-utils.cjs'); // eslint-disable-next-line @typescript-eslint/no-require-imports -- planning-workspace.cjs is an export= CommonJS module import planningWorkspace = require('./planning-workspace.cjs'); +import { formatGsdSlash, resolveRuntime } from './runtime-slash.cjs'; const { pathExistsInternal, toPosixPath } = coreUtils; const { planningDir, planningRoot } = planningWorkspace; @@ -42,6 +43,15 @@ const PLANNING_DOC_SEGMENTS = new Set([ type MapReadiness = 'none' | 'fast' | 'complete'; +interface OnboardHandoffCommands { + ingest_docs: string; + manager: string; + map_codebase: string; + map_codebase_fast: string; + new_project: string; + onboard: string; +} + type OnboardNextAction = | { kind: 'map-codebase'; command: string; reason: string } | { kind: 'ingest-docs'; command: string; reason: string } @@ -68,6 +78,8 @@ interface OnboardProjection { state_exists: boolean; config_exists: boolean; + handoff_commands: OnboardHandoffCommands; + has_existing_code: boolean; has_package_file: boolean; is_brownfield: boolean; @@ -237,11 +249,12 @@ function nextAction(params: { onboardingSummaryExists: boolean; hasPlanningArtifacts: boolean; missingPlanningFiles: string[]; + handoffCommands: OnboardHandoffCommands; }): OnboardNextAction { if (params.isBrownfield && params.needsOnboardCodebaseMap) { return { kind: 'map-codebase', - command: params.fastMode ? '/gsd:map-codebase --fast' : '/gsd:map-codebase', + command: params.fastMode ? params.handoffCommands.map_codebase_fast : params.handoffCommands.map_codebase, reason: 'Existing code was detected, but the required .planning/codebase/ map is missing.', }; } @@ -249,7 +262,7 @@ function nextAction(params: { if (!params.projectExists && params.fastMode && params.mapReadiness === 'fast') { return { kind: 'complete-map-before-new-project', - command: '/gsd:map-codebase', + command: params.handoffCommands.map_codebase, reason: 'The fast map is enough for lightweight onboarding, but project setup still requires the complete codebase map.', }; } @@ -265,7 +278,7 @@ function nextAction(params: { if (params.hasDocsCandidates && !params.projectExists) { return { kind: 'ingest-docs', - command: '/gsd:ingest-docs', + command: params.handoffCommands.ingest_docs, reason: 'Detected existing ADR/PRD/SPEC/RFC document(s) before project setup.', }; } @@ -273,7 +286,7 @@ function nextAction(params: { if (!params.isBrownfield && !params.projectExists && !params.hasDocsCandidates) { return { kind: 'new-project', - command: '/gsd:new-project', + command: params.handoffCommands.new_project, reason: 'No existing code or planning docs were detected.', }; } @@ -281,7 +294,7 @@ function nextAction(params: { if (!params.projectExists) { return { kind: 'new-project', - command: '/gsd:new-project', + command: params.handoffCommands.new_project, reason: 'Codebase context is ready for project initialization.', }; } @@ -300,7 +313,20 @@ function nextAction(params: { }; } +function buildHandoffCommands(cwd: string): OnboardHandoffCommands { + const runtime = resolveRuntime(cwd); + return { + ingest_docs: formatGsdSlash('ingest-docs', runtime) as string, + manager: formatGsdSlash('manager', runtime) as string, + map_codebase: formatGsdSlash('map-codebase', runtime) as string, + map_codebase_fast: formatGsdSlash('map-codebase --fast', runtime) as string, + new_project: formatGsdSlash('new-project', runtime) as string, + onboard: formatGsdSlash('onboard', runtime) as string, + }; +} + function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOptions): OnboardProjection { + const handoffCommands = buildHandoffCommands(cwd); const codebaseMapFiles = listCodebaseMapFiles(cwd); const missingCodebaseMapFiles = REQUIRED_CODEBASE_MAP_FILES.filter( (file) => !codebaseMapFiles.includes(file), @@ -342,6 +368,8 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti state_exists: stateExists, config_exists: fs.existsSync(path.join(planningDir(cwd), 'config.json')), + handoff_commands: handoffCommands, + has_existing_code: hasCode, has_package_file: hasPackageFile, is_brownfield: isBrownfield, @@ -357,6 +385,7 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti onboardingSummaryExists, hasPlanningArtifacts, missingPlanningFiles, + handoffCommands, }), needs_codebase_map: needsCodebaseMap, needs_fast_codebase_map: needsFastCodebaseMap, diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index b3ab7a64b..5809f9b32 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -163,7 +163,7 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.needs_codebase_map, true); assert.strictEqual(parsed.needs_fast_codebase_map, false); assert.strictEqual(parsed.next_action.kind, 'complete-map-before-new-project'); - assert.strictEqual(parsed.next_action.command, '/gsd:map-codebase'); + assert.strictEqual(parsed.next_action.command, '/gsd-map-codebase'); assert.match(parsed.next_action.reason, /complete codebase map/i); assert.deepStrictEqual(parsed.fast_codebase_map_files_required, [ 'STACK.md', @@ -188,7 +188,7 @@ describe('init onboard public CLI projection', () => { const parsed = JSON.parse(result.output); assert.strictEqual(parsed.next_action.kind, 'complete-map-before-new-project'); - assert.strictEqual(parsed.next_action.command, '/gsd:map-codebase'); + assert.strictEqual(parsed.next_action.command, '/gsd-map-codebase'); }); test('routes planning artifacts without PROJECT.md to partial planning', () => { @@ -212,7 +212,7 @@ describe('init onboard public CLI projection', () => { assert.ok(result.success, `init onboard should succeed: ${result.error}`); assert.deepStrictEqual(JSON.parse(result.output).next_action, { kind: 'map-codebase', - command: '/gsd:map-codebase', + command: '/gsd-map-codebase', reason: 'Existing code was detected, but the required .planning/codebase/ map is missing.', }); @@ -224,7 +224,7 @@ describe('init onboard public CLI projection', () => { assert.ok(result.success, `init onboard should succeed: ${result.error}`); assert.deepStrictEqual(JSON.parse(result.output).next_action, { kind: 'ingest-docs', - command: '/gsd:ingest-docs', + command: '/gsd-ingest-docs', reason: 'Detected existing ADR/PRD/SPEC/RFC document(s) before project setup.', }); @@ -234,7 +234,7 @@ describe('init onboard public CLI projection', () => { assert.ok(result.success, `init onboard should succeed: ${result.error}`); assert.deepStrictEqual(JSON.parse(result.output).next_action, { kind: 'new-project', - command: '/gsd:new-project', + command: '/gsd-new-project', reason: 'No existing code or planning docs were detected.', }); @@ -318,6 +318,29 @@ describe('init onboard public CLI projection', () => { assert.strictEqual(parsed.needs_codebase_map, true); }); + + test('formats onboard handoff commands for the resolved runtime', () => { + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + + const result = runGsdTools(['init', 'onboard', '--raw'], tmpDir, { + HOME: tmpDir, + GSD_RUNTIME: 'codex', + }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.next_action.kind, 'map-codebase'); + assert.strictEqual(parsed.next_action.command, '$gsd-map-codebase'); + assert.deepStrictEqual(parsed.handoff_commands, { + map_codebase: '$gsd-map-codebase', + map_codebase_fast: '$gsd-map-codebase --fast', + ingest_docs: '$gsd-ingest-docs', + manager: '$gsd-manager', + new_project: '$gsd-new-project', + onboard: '$gsd-onboard', + }); + }); + test('dotted query init.onboard matches direct init onboard', () => { fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); @@ -376,7 +399,7 @@ describe('/gsd:onboard command contract', () => { 'skip mapping must hand off explicitly instead of falling through to summary creation', ); const partialPlanningSkipGuard = - 'If `planning_exists && (!project_exists || !requirements_exists || !roadmap_exists || !state_exists)`, route the skip to the partial planning guard instead:'; + 'If `(project_exists || requirements_exists || roadmap_exists || state_exists) && (!project_exists || !requirements_exists || !roadmap_exists || !state_exists)`, route the skip to the partial planning guard instead:'; const docsIngestSkipGuard = 'If `has_docs_candidates && !project_exists`, route the skip to docs ingest instead:'; assert.ok( @@ -392,11 +415,11 @@ describe('/gsd:onboard command contract', () => { 'skip mapping must check partial planning before docs ingest', ); assert.ok( - content.includes('/gsd:ingest-docs'), - 'skip mapping docs-preserving handoff must name the docs ingest command', + content.includes('{handoff_commands.ingest_docs}'), + 'skip mapping docs-preserving handoff must use the projected docs ingest command', ); assert.ok( - content.includes('Skipping codebase mapping may give /gsd:new-project weaker context.'), + content.includes('Skipping codebase mapping may give {handoff_commands.new_project} weaker context.'), 'skip mapping must warn about weaker context', ); assert.ok( @@ -404,12 +427,15 @@ describe('/gsd:onboard command contract', () => { 'skip docs ingest must hand off explicitly instead of falling through to summary creation', ); assert.ok( - content.includes('Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from /gsd:new-project.'), + content.includes('Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from {handoff_commands.new_project}.'), 'skip docs ingest must warn about omitted docs context', ); assert.match(content, /do not overwrite/i, 'workflow must protect existing summary/planning'); assert.match(content, /query commit "docs: create onboarding summary" --files \.planning\/onboarding\/SUMMARY\.md/); assert.ok(!content.includes('execute-phase'), 'onboarding must not execute implementation phases'); assert.ok(!content.includes('gsd:ship'), 'onboarding must not ship work'); + assert.ok(content.includes('Next recommended command: {handoff_commands.manager}')); + assert.ok(!content.includes('/gsd:ingest-docs'), 'skip handoffs must not hard-code legacy ingest command'); + assert.ok(!content.includes('/gsd:new-project'), 'skip handoffs must not hard-code legacy new-project command'); }); }); From 2c878c966f65c4e9568dbe33c11cfd7c9da49e86 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 17:20:34 -0500 Subject: [PATCH 28/75] no-mistakes(document): Sync onboarding docs --- commands/gsd/onboard.md | 2 +- docs/CLI-TOOLS.md | 4 ++-- docs/COMMANDS.md | 4 ++-- docs/FEATURES.md | 2 +- docs/ja-JP/CLI-TOOLS.md | 4 ++-- docs/ja-JP/COMMANDS.md | 4 ++-- docs/ja-JP/FEATURES.md | 2 +- docs/ja-JP/tutorials/onboarding-an-existing-codebase.md | 2 +- docs/ko-KR/CLI-TOOLS.md | 4 ++-- docs/ko-KR/COMMANDS.md | 4 ++-- docs/ko-KR/FEATURES.md | 2 +- docs/ko-KR/tutorials/onboarding-an-existing-codebase.md | 2 +- docs/pt-BR/CLI-TOOLS.md | 4 ++-- docs/pt-BR/COMMANDS.md | 4 ++-- docs/pt-BR/tutorials/onboarding-an-existing-codebase.md | 2 +- docs/tutorials/onboarding-an-existing-codebase.md | 2 +- docs/zh-CN/CLI-TOOLS.md | 4 ++-- docs/zh-CN/COMMANDS.md | 4 ++-- docs/zh-CN/FEATURES.md | 2 +- docs/zh-CN/tutorials/onboarding-an-existing-codebase.md | 2 +- skills/gsd-onboard/SKILL.md | 2 +- 21 files changed, 31 insertions(+), 31 deletions(-) diff --git a/commands/gsd/onboard.md b/commands/gsd/onboard.md index ae2517b1c..9211d3cff 100644 --- a/commands/gsd/onboard.md +++ b/commands/gsd/onboard.md @@ -37,7 +37,7 @@ Guide brownfield onboarding for an existing codebase by routing through the exis Arguments: $ARGUMENTS Flags: -- `--fast` — prefer `/gsd:map-codebase --fast` for the mapping handoff. +- `--fast` — prefer `/gsd:map-codebase --fast` for the mapping handoff; the complete map is still required before `/gsd:new-project`. - `--text` — use plain-text numbered lists instead of TUI menus. diff --git a/docs/CLI-TOOLS.md b/docs/CLI-TOOLS.md index e0454074a..923a1f757 100644 --- a/docs/CLI-TOOLS.md +++ b/docs/CLI-TOOLS.md @@ -421,14 +421,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init Commands (Compound Context Loading) -Load all context needed for a specific workflow in one call. Returns JSON with project info, config, state, and workflow-specific data. `init onboard [--fast]` reports brownfield signals, planning-doc candidates, codebase-map completeness, fast-map readiness, partial planning state, and onboarding summary status for `/gsd-onboard`. +Load all context needed for a specific workflow in one call. Returns JSON with project info, config, state, and workflow-specific data. `init onboard [--fast] [--text]` reports brownfield signals, planning-doc candidates, codebase-map completeness, fast-map readiness, text-mode routing, partial planning state, and onboarding summary status for `/gsd-onboard`. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone -node gsd-tools.cjs init onboard [--fast] +node gsd-tools.cjs init onboard [--fast] [--text] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/COMMANDS.md b/docs/COMMANDS.md index e8d2b9095..22216ff54 100644 --- a/docs/COMMANDS.md +++ b/docs/COMMANDS.md @@ -64,7 +64,7 @@ Guide an existing codebase through first-time GSD onboarding. The command checks | Flag | Description | |------|-------------| -| `--fast` | Prefer the lightweight `/gsd-map-codebase --fast` mapping handoff | +| `--fast` | Prefer the lightweight `/gsd-map-codebase --fast` mapping handoff; a complete map is still required before `/gsd-new-project` | | `--text` | Use numbered plain-text gates instead of TUI menus | **Prerequisites:** Existing repo or planning docs. For empty greenfield projects, use `/gsd-new-project`. @@ -72,7 +72,7 @@ Guide an existing codebase through first-time GSD onboarding. The command checks ```bash /gsd-onboard # Guided brownfield onboarding -/gsd-onboard --fast # Use lightweight codebase mapping first +/gsd-onboard --fast # Use lightweight codebase mapping first, then complete the map before project setup ``` --- diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 8f1b647dd..1a80bd7c3 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -826,7 +826,7 @@ against the mapping point, not HEAD. **Requirements:** - REQ-ONBOARD-01: System MUST detect existing code, package manifests, planning documents, partial `.planning/` state, and complete or missing codebase-map files. -- REQ-ONBOARD-02: System MUST hand off to `/gsd-map-codebase` or `/gsd-map-codebase --fast` when brownfield code lacks a complete `.planning/codebase/` map. +- REQ-ONBOARD-02: System MUST hand off to `/gsd-map-codebase` or `/gsd-map-codebase --fast` when brownfield code lacks the required `.planning/codebase/` map files; fast-map readiness is partial and MUST NOT be treated as sufficient for `/gsd-new-project`. - REQ-ONBOARD-03: System MUST offer `/gsd-ingest-docs` before `/gsd-new-project` when ADR/PRD/SPEC/RFC candidates exist and no project exists. - REQ-ONBOARD-04: System MUST refuse to report onboarding complete until `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist. - REQ-ONBOARD-05: System MUST create or confirm `.planning/onboarding/SUMMARY.md` only after project setup exists. diff --git a/docs/ja-JP/CLI-TOOLS.md b/docs/ja-JP/CLI-TOOLS.md index a4165216a..7f893f08b 100644 --- a/docs/ja-JP/CLI-TOOLS.md +++ b/docs/ja-JP/CLI-TOOLS.md @@ -288,14 +288,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init コマンド(複合コンテキスト読み込み) -特定のワークフローに必要なすべてのコンテキストを一度に読み込みます。プロジェクト情報、設定、状態、ワークフロー固有のデータを含む JSON を返します。`init onboard [--fast]` は `/gsd-onboard` 用に、brownfield シグナル、計画ドキュメント候補、コードベースマップの完全性、fast マップの準備状況、部分的な planning 状態、オンボーディングサマリー状態を返します。 +特定のワークフローに必要なすべてのコンテキストを一度に読み込みます。プロジェクト情報、設定、状態、ワークフロー固有のデータを含む JSON を返します。`init onboard [--fast] [--text]` は `/gsd-onboard` 用に、brownfield シグナル、計画ドキュメント候補、コードベースマップの完全性、fast マップの準備状況、テキストモードルーティング、部分的な planning 状態、オンボーディングサマリー状態を返します。 ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone -node gsd-tools.cjs init onboard [--fast] +node gsd-tools.cjs init onboard [--fast] [--text] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/ja-JP/COMMANDS.md b/docs/ja-JP/COMMANDS.md index c3c9ca0a5..9a2bb72f4 100644 --- a/docs/ja-JP/COMMANDS.md +++ b/docs/ja-JP/COMMANDS.md @@ -57,7 +57,7 @@ v1.40 では、最初のステージエントリーポイントとして6つの | フラグ | 説明 | |------|-------------| -| `--fast` | 軽量な `/gsd-map-codebase --fast` マッピングハンドオフを優先 | +| `--fast` | 軽量な `/gsd-map-codebase --fast` マッピングハンドオフを優先。ただし `/gsd-new-project` 前には完全なマップが必要 | | `--text` | TUI メニューではなく番号付きプレーンテキストのゲートを使用 | **前提条件:** 既存リポジトリまたは計画ドキュメント。空のグリーンフィールドプロジェクトには `/gsd-new-project` を使用します。 @@ -65,7 +65,7 @@ v1.40 では、最初のステージエントリーポイントとして6つの ```bash /gsd-onboard # ガイド付き brownfield オンボーディング -/gsd-onboard --fast # 先に軽量コードベースマッピングを使用 +/gsd-onboard --fast # 先に軽量マップを使い、その後プロジェクト設定前に完全マップを作成 ``` --- diff --git a/docs/ja-JP/FEATURES.md b/docs/ja-JP/FEATURES.md index 6e1bb6742..f12493671 100644 --- a/docs/ja-JP/FEATURES.md +++ b/docs/ja-JP/FEATURES.md @@ -814,7 +814,7 @@ **要件:** - REQ-ONBOARD-01: 既存コード、package manifest、計画ドキュメント、部分的な `.planning/`、コードベースマップの不足を検出する。 -- REQ-ONBOARD-02: 完全な `.planning/codebase/` がない brownfield では `/gsd-map-codebase` または `/gsd-map-codebase --fast` へハンドオフする。 +- REQ-ONBOARD-02: 必要な `.planning/codebase/` マップファイルがない brownfield では `/gsd-map-codebase` または `/gsd-map-codebase --fast` へハンドオフする。fast マップの readiness は部分的であり、`/gsd-new-project` に十分として扱ってはならない。 - REQ-ONBOARD-03: ADR/PRD/SPEC/RFC 候補があり project がない場合、`/gsd-new-project` の前に `/gsd-ingest-docs` を提示する。 - REQ-ONBOARD-04: `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` が揃うまで完了扱いにしない。 - REQ-ONBOARD-05: project setup 後にのみ `.planning/onboarding/SUMMARY.md` を作成または確認する。 diff --git a/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md b/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md index a877ff94b..8a730dc98 100644 --- a/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md +++ b/docs/ja-JP/tutorials/onboarding-an-existing-codebase.md @@ -52,7 +52,7 @@ claude --dangerously-skip-permissions /gsd-onboard ``` -オンボーディングがコードベースマップ不足を示したら、推奨オプションを選び、表示された `/gsd-map-codebase` ハンドオフを実行してから `/gsd-onboard` を再実行します。`/gsd-map-codebase` が4つの並行マッパーサブエージェントを生成します(「Spawning 4 parallel codebase mapper agents…」という通知が表示されます。1〜5分かかりますので中断しないでください)。各エージェントはそれぞれ異なる観点に注目します: +オンボーディングがコードベースマップ不足を示したら、推奨オプションを選び、表示された `/gsd-map-codebase` ハンドオフを実行してから `/gsd-onboard` を再実行します。`/gsd-onboard --fast` は軽量な初回パスには使えますが、`/gsd-new-project` の前には完全なマップが必要です。`/gsd-map-codebase` が4つの並行マッパーサブエージェントを生成します(「Spawning 4 parallel codebase mapper agents…」という通知が表示されます。1〜5分かかりますので中断しないでください)。各エージェントはそれぞれ異なる観点に注目します: | エージェント | 観点 | |-------|-------| diff --git a/docs/ko-KR/CLI-TOOLS.md b/docs/ko-KR/CLI-TOOLS.md index 3f375c3ec..7d9f76984 100644 --- a/docs/ko-KR/CLI-TOOLS.md +++ b/docs/ko-KR/CLI-TOOLS.md @@ -288,14 +288,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init 명령 (복합 컨텍스트 로딩) -하나의 호출로 특정 워크플로우에 필요한 모든 컨텍스트를 로드합니다. 프로젝트 정보, 설정, 상태, 워크플로우별 데이터가 포함된 JSON을 반환합니다. `init onboard [--fast]`는 `/gsd-onboard`를 위해 brownfield 신호, 계획 문서 후보, 코드베이스 맵 완성도, fast 맵 준비 상태, 부분 planning 상태, 온보딩 요약 상태를 반환합니다. +하나의 호출로 특정 워크플로우에 필요한 모든 컨텍스트를 로드합니다. 프로젝트 정보, 설정, 상태, 워크플로우별 데이터가 포함된 JSON을 반환합니다. `init onboard [--fast] [--text]`는 `/gsd-onboard`를 위해 brownfield 신호, 계획 문서 후보, 코드베이스 맵 완성도, fast 맵 준비 상태, 텍스트 모드 라우팅, 부분 planning 상태, 온보딩 요약 상태를 반환합니다. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone -node gsd-tools.cjs init onboard [--fast] +node gsd-tools.cjs init onboard [--fast] [--text] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/ko-KR/COMMANDS.md b/docs/ko-KR/COMMANDS.md index 6c473e2b7..338bb91d9 100644 --- a/docs/ko-KR/COMMANDS.md +++ b/docs/ko-KR/COMMANDS.md @@ -57,7 +57,7 @@ v1.40에서 여섯 개의 네임스페이스 라우터가 1단계 진입점으 | 플래그 | 설명 | |------|-------------| -| `--fast` | 경량 `/gsd-map-codebase --fast` 매핑 handoff 우선 사용 | +| `--fast` | 경량 `/gsd-map-codebase --fast` 매핑 handoff 우선 사용. 단, `/gsd-new-project` 전에는 완전한 맵이 필요 | | `--text` | TUI 메뉴 대신 번호가 있는 plain-text gate 사용 | **전제 조건:** 기존 저장소 또는 계획 문서. 빈 greenfield 프로젝트는 `/gsd-new-project`를 사용하세요. @@ -65,7 +65,7 @@ v1.40에서 여섯 개의 네임스페이스 라우터가 1단계 진입점으 ```bash /gsd-onboard # 안내형 brownfield 온보딩 -/gsd-onboard --fast # 먼저 경량 코드베이스 매핑 사용 +/gsd-onboard --fast # 먼저 경량 맵을 사용하고, 프로젝트 설정 전 완전한 맵 작성 ``` --- diff --git a/docs/ko-KR/FEATURES.md b/docs/ko-KR/FEATURES.md index 7556310c5..d1afde110 100644 --- a/docs/ko-KR/FEATURES.md +++ b/docs/ko-KR/FEATURES.md @@ -745,7 +745,7 @@ **요구사항.** - REQ-ONBOARD-01: 기존 코드, package manifest, planning 문서, 부분 `.planning/` 상태, 코드베이스 맵 누락을 감지해야 합니다. -- REQ-ONBOARD-02: 완전한 `.planning/codebase/`가 없는 brownfield에서는 `/gsd-map-codebase` 또는 `/gsd-map-codebase --fast`로 handoff해야 합니다. +- REQ-ONBOARD-02: 필요한 `.planning/codebase/` 맵 파일이 없는 brownfield에서는 `/gsd-map-codebase` 또는 `/gsd-map-codebase --fast`로 handoff해야 합니다. fast 맵 readiness는 부분 상태이며 `/gsd-new-project`에 충분한 것으로 취급해서는 안 됩니다. - REQ-ONBOARD-03: ADR/PRD/SPEC/RFC 후보가 있고 project가 없으면 `/gsd-new-project` 전에 `/gsd-ingest-docs`를 제안해야 합니다. - REQ-ONBOARD-04: `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md`가 모두 있을 때까지 완료로 보고하지 않아야 합니다. - REQ-ONBOARD-05: project setup 후에만 `.planning/onboarding/SUMMARY.md`를 만들거나 확인해야 합니다. diff --git a/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md b/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md index c1a058550..6fe4b7c51 100644 --- a/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md +++ b/docs/ko-KR/tutorials/onboarding-an-existing-codebase.md @@ -52,7 +52,7 @@ claude --dangerously-skip-permissions /gsd-onboard ``` -온보딩이 코드베이스 맵 누락을 보고하면 권장 옵션을 선택하고 출력된 `/gsd-map-codebase` handoff를 실행한 뒤 `/gsd-onboard`를 다시 실행합니다. `/gsd-map-codebase`가 4개의 병렬 매퍼 서브 에이전트를 생성합니다("Spawning 4 parallel codebase mapper agents…" 메시지가 표시되며, 1–5분 소요됩니다. 중단하지 마세요). 각 에이전트는 서로 다른 관심사에 집중합니다: +온보딩이 코드베이스 맵 누락을 보고하면 권장 옵션을 선택하고 출력된 `/gsd-map-codebase` handoff를 실행한 뒤 `/gsd-onboard`를 다시 실행합니다. `/gsd-onboard --fast`는 가벼운 첫 패스에는 충분하지만, `/gsd-new-project` 전에는 완전한 맵이 필요합니다. `/gsd-map-codebase`가 4개의 병렬 매퍼 서브 에이전트를 생성합니다("Spawning 4 parallel codebase mapper agents…" 메시지가 표시되며, 1–5분 소요됩니다. 중단하지 마세요). 각 에이전트는 서로 다른 관심사에 집중합니다: | 에이전트 | 집중 영역 | |---------|---------| diff --git a/docs/pt-BR/CLI-TOOLS.md b/docs/pt-BR/CLI-TOOLS.md index 2094b6bb0..107c3259a 100644 --- a/docs/pt-BR/CLI-TOOLS.md +++ b/docs/pt-BR/CLI-TOOLS.md @@ -290,14 +290,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Comandos Init (Carregamento de Contexto Composto) -Carrega todo o contexto necessário para um fluxo de trabalho específico em uma única chamada. Retorna JSON com informações do projeto, configuração, estado e dados específicos do fluxo de trabalho. `init onboard [--fast]` retorna, para `/gsd-onboard`, sinais de brownfield, candidatos a docs de planning, completude do mapa de código, prontidão do mapa fast, estado parcial de planning e status do resumo de onboarding. +Carrega todo o contexto necessário para um fluxo de trabalho específico em uma única chamada. Retorna JSON com informações do projeto, configuração, estado e dados específicos do fluxo de trabalho. `init onboard [--fast] [--text]` retorna, para `/gsd-onboard`, sinais de brownfield, candidatos a docs de planning, completude do mapa de código, prontidão do mapa fast, roteamento em modo texto, estado parcial de planning e status do resumo de onboarding. ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone -node gsd-tools.cjs init onboard [--fast] +node gsd-tools.cjs init onboard [--fast] [--text] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/pt-BR/COMMANDS.md b/docs/pt-BR/COMMANDS.md index 1ce74e1f9..dc7e978e1 100644 --- a/docs/pt-BR/COMMANDS.md +++ b/docs/pt-BR/COMMANDS.md @@ -57,7 +57,7 @@ Guia o onboarding inicial de um código existente no GSD. O comando verifica o e | Flag | Descrição | |------|-----------| -| `--fast` | Prefere o handoff leve `/gsd-map-codebase --fast` para mapeamento | +| `--fast` | Prefere o handoff leve `/gsd-map-codebase --fast`; um mapa completo ainda é necessário antes de `/gsd-new-project` | | `--text` | Usa gates numerados em texto puro em vez de menus TUI | **Pré-requisitos:** Repositório existente ou documentos de planejamento. Para projetos greenfield vazios, use `/gsd-new-project`. @@ -65,7 +65,7 @@ Guia o onboarding inicial de um código existente no GSD. O comando verifica o e ```bash /gsd-onboard # Onboarding brownfield guiado -/gsd-onboard --fast # Usa primeiro o mapeamento leve da base de código +/gsd-onboard --fast # Usa primeiro o mapa leve e depois completa o mapa antes do setup do projeto ``` --- diff --git a/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md b/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md index 26584a9db..4e8a99c76 100644 --- a/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md +++ b/docs/pt-BR/tutorials/onboarding-an-existing-codebase.md @@ -52,7 +52,7 @@ Antes de criar um projeto, deixe o GSD Core inspecionar o estado do repositório /gsd-onboard ``` -Se o onboarding informar que o mapa da base de código está ausente, escolha a opção recomendada e execute o handoff `/gsd-map-codebase` impresso antes de rodar `/gsd-onboard` novamente. O `/gsd-map-codebase` cria quatro sub-agentes mapeadores paralelos (você verá "Spawning 4 parallel codebase mapper agents…" — isso leva de 1 a 5 minutos; não interrompa). Cada agente foca em uma preocupação diferente: +Se o onboarding informar que o mapa da base de código está ausente, escolha a opção recomendada e execute o handoff `/gsd-map-codebase` impresso antes de rodar `/gsd-onboard` novamente. `/gsd-onboard --fast` serve para uma primeira passada leve, mas um mapa completo ainda é necessário antes de `/gsd-new-project`. O `/gsd-map-codebase` cria quatro sub-agentes mapeadores paralelos (você verá "Spawning 4 parallel codebase mapper agents…" — isso leva de 1 a 5 minutos; não interrompa). Cada agente foca em uma preocupação diferente: | Agente | Foco | |--------|------| diff --git a/docs/tutorials/onboarding-an-existing-codebase.md b/docs/tutorials/onboarding-an-existing-codebase.md index 1ac686efe..fd6774ee4 100644 --- a/docs/tutorials/onboarding-an-existing-codebase.md +++ b/docs/tutorials/onboarding-an-existing-codebase.md @@ -58,7 +58,7 @@ If code exists and `.planning/codebase/` is missing, GSD Core asks you to map th /gsd-map-codebase ``` -Use `/gsd-onboard --fast` if you want the onboarding gate to prefer `/gsd-map-codebase --fast` for a lighter first pass. The full mapper spawns four parallel mapper sub-agents (you'll see "Spawning 4 parallel codebase mapper agents…" — this takes 1–5 minutes; do not interrupt). Each agent focuses on a different concern: +Use `/gsd-onboard --fast` if you want the onboarding gate to prefer `/gsd-map-codebase --fast` for a lighter first pass. Fast mode is only enough for lightweight onboarding; `/gsd-onboard` still sends you back to the full mapper before `/gsd-new-project`. The full mapper spawns four parallel mapper sub-agents (you'll see "Spawning 4 parallel codebase mapper agents…" — this takes 1–5 minutes; do not interrupt). Each agent focuses on a different concern: | Agent | Focus | |-------|-------| diff --git a/docs/zh-CN/CLI-TOOLS.md b/docs/zh-CN/CLI-TOOLS.md index 70cb595a6..b141cb17e 100644 --- a/docs/zh-CN/CLI-TOOLS.md +++ b/docs/zh-CN/CLI-TOOLS.md @@ -288,14 +288,14 @@ node gsd-tools.cjs scaffold phase-dir --phase N --name "phase name" ## Init 命令(复合上下文加载) -通过单次调用加载特定工作流所需的所有上下文。返回包含项目信息、配置、状态和工作流专属数据的 JSON。`init onboard [--fast]` 会为 `/gsd-onboard` 返回 brownfield 信号、planning 文档候选、代码库映射完整性、fast 映射就绪状态、部分 planning 状态和 onboarding summary 状态。 +通过单次调用加载特定工作流所需的所有上下文。返回包含项目信息、配置、状态和工作流专属数据的 JSON。`init onboard [--fast] [--text]` 会为 `/gsd-onboard` 返回 brownfield 信号、planning 文档候选、代码库映射完整性、fast 映射就绪状态、文本模式路由、部分 planning 状态和 onboarding summary 状态。 ```bash node gsd-tools.cjs init execute-phase node gsd-tools.cjs init plan-phase node gsd-tools.cjs init new-project node gsd-tools.cjs init new-milestone -node gsd-tools.cjs init onboard [--fast] +node gsd-tools.cjs init onboard [--fast] [--text] node gsd-tools.cjs init quick node gsd-tools.cjs init resume node gsd-tools.cjs init verify-work diff --git a/docs/zh-CN/COMMANDS.md b/docs/zh-CN/COMMANDS.md index efb8906e2..3985a0928 100644 --- a/docs/zh-CN/COMMANDS.md +++ b/docs/zh-CN/COMMANDS.md @@ -57,7 +57,7 @@ v1.40 中,六个命名空间路由器作为第一阶段入口点随附发布 | 标志 | 描述 | |------|-------------| -| `--fast` | 优先使用轻量 `/gsd-map-codebase --fast` 映射交接 | +| `--fast` | 优先使用轻量 `/gsd-map-codebase --fast` 映射交接;在 `/gsd-new-project` 前仍需要完整映射 | | `--text` | 使用编号纯文本关卡,而不是 TUI 菜单 | **前提条件:** 现有仓库或规划文档。空的绿地项目请使用 `/gsd-new-project`。 @@ -65,7 +65,7 @@ v1.40 中,六个命名空间路由器作为第一阶段入口点随附发布 ```bash /gsd-onboard # 引导式 brownfield 接入 -/gsd-onboard --fast # 先使用轻量代码库映射 +/gsd-onboard --fast # 先使用轻量映射,并在项目设置前补全完整映射 ``` --- diff --git a/docs/zh-CN/FEATURES.md b/docs/zh-CN/FEATURES.md index 5994b7a61..b0d0e5355 100644 --- a/docs/zh-CN/FEATURES.md +++ b/docs/zh-CN/FEATURES.md @@ -814,7 +814,7 @@ **需求:** - REQ-ONBOARD-01:系统必须检测现有代码、package manifest、规划文档、部分 `.planning/` 状态以及缺失的代码库映射文件。 -- REQ-ONBOARD-02:当 brownfield 缺少完整 `.planning/codebase/` 时,系统必须交接到 `/gsd-map-codebase` 或 `/gsd-map-codebase --fast`。 +- REQ-ONBOARD-02:当 brownfield 缺少所需 `.planning/codebase/` 映射文件时,系统必须交接到 `/gsd-map-codebase` 或 `/gsd-map-codebase --fast`。fast 映射 readiness 是部分状态,不得视为足以运行 `/gsd-new-project`。 - REQ-ONBOARD-03:当存在 ADR/PRD/SPEC/RFC 候选且 project 不存在时,系统必须在 `/gsd-new-project` 前提供 `/gsd-ingest-docs`。 - REQ-ONBOARD-04:在 `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` 全部存在前,系统不得报告 onboarding 完成。 - REQ-ONBOARD-05:系统必须仅在 project setup 后创建或确认 `.planning/onboarding/SUMMARY.md`。 diff --git a/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md b/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md index 5f3513fc6..b90522443 100644 --- a/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md +++ b/docs/zh-CN/tutorials/onboarding-an-existing-codebase.md @@ -52,7 +52,7 @@ claude --dangerously-skip-permissions /gsd-onboard ``` -如果 onboarding 报告缺少代码库映射,请选择推荐选项并运行打印出的 `/gsd-map-codebase` 交接命令,然后重新运行 `/gsd-onboard`。`/gsd-map-codebase` 会派生四个并行映射子代理(您将看到"Spawning 4 parallel codebase mapper agents…"——这需要 1–5 分钟;请勿中断)。每个代理专注于不同的关注点: +如果 onboarding 报告缺少代码库映射,请选择推荐选项并运行打印出的 `/gsd-map-codebase` 交接命令,然后重新运行 `/gsd-onboard`。`/gsd-onboard --fast` 只适合轻量首次通过;在 `/gsd-new-project` 前仍需要完整映射。`/gsd-map-codebase` 会派生四个并行映射子代理(您将看到"Spawning 4 parallel codebase mapper agents…"——这需要 1–5 分钟;请勿中断)。每个代理专注于不同的关注点: | 代理 | 关注点 | |-------|-------| diff --git a/skills/gsd-onboard/SKILL.md b/skills/gsd-onboard/SKILL.md index 3625c3ef1..d3b3946f5 100644 --- a/skills/gsd-onboard/SKILL.md +++ b/skills/gsd-onboard/SKILL.md @@ -37,7 +37,7 @@ Guide brownfield onboarding for an existing codebase by routing through the exis Arguments: $ARGUMENTS Flags: -- `--fast` — prefer `/gsd-map-codebase --fast` for the mapping handoff. +- `--fast` — prefer `/gsd-map-codebase --fast` for the mapping handoff; the complete map is still required before `/gsd-new-project`. - `--text` — use plain-text numbered lists instead of TUI menus. From ee2ddbae53ff1d63abf3bafb2c074649314e07b5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 3 Jul 2026 22:25:53 +0000 Subject: [PATCH 29/75] fix(onboard): add onboard rerun handoffs and correct summary next step Add missing 'Then rerun onboard' instructions after new-project handoffs so brownfield onboarding returns to create SUMMARY.md per REQ-ONBOARD-05. Use handoff_commands.manager instead of next_action.reason in the summary template so persisted SUMMARY.md recommends the correct post-onboarding step. --- gsd-core/workflows/onboard.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 321649fc0..463c254d4 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -110,6 +110,8 @@ Skipping codebase mapping may give {handoff_commands.new_project} weaker context Run from worktree root {ONBOARDING_ROOT}: {handoff_commands.new_project} + +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. @@ -155,6 +157,8 @@ Skipping docs ingest may omit existing ADR/PRD/SPEC/RFC context from {handoff_co Run from worktree root {ONBOARDING_ROOT}: {handoff_commands.new_project} + +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. @@ -185,6 +189,8 @@ If `next_action.kind == "new-project"`, print: Run from worktree root {ONBOARDING_ROOT}: {next_action.command} + +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. @@ -239,7 +245,7 @@ Summary template: - Existing ADR/PRD/SPEC/RFC candidates: {has_docs_candidates ? doc_candidate_count : 0} ## Recommended Next Step -- {next_action.reason} +- {handoff_commands.manager} ``` If `commit_docs` is true, commit only the summary path from the onboarding root: From 83da2e1ca904a67cb538b065eda1ccaff15f79ad Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 3 Jul 2026 22:29:45 +0000 Subject: [PATCH 30/75] fix(onboard): enforce complete map gate in fast mode and add skip-ingest rerun Remove the projectExists guard so fast mode with a partial map still routes to complete-map-before-new-project even after project planning exists. Add the missing onboard rerun instruction to the skip-mapping docs-ingest handoff so the onboarding loop can continue after ingest. --- gsd-core/workflows/onboard.md | 2 ++ src/onboard-projection.cts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 463c254d4..625372e3b 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -98,6 +98,8 @@ Skipping codebase mapping may give downstream steps weaker context, but existing Run from worktree root {ONBOARDING_ROOT}: {handoff_commands.ingest_docs} + +Then rerun {handoff_commands.onboard} from the same worktree root. ``` Exit. diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts index b327ded57..68e144004 100644 --- a/src/onboard-projection.cts +++ b/src/onboard-projection.cts @@ -259,7 +259,7 @@ function nextAction(params: { }; } - if (!params.projectExists && params.fastMode && params.mapReadiness === 'fast') { + if (params.fastMode && params.mapReadiness === 'fast') { return { kind: 'complete-map-before-new-project', command: params.handoffCommands.map_codebase, From bee9d6f7ec6d6e877633f44789b740af208a2f7d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 3 Jul 2026 22:35:55 +0000 Subject: [PATCH 31/75] fix(onboard): align PROJECT.md path resolution with workstream-aware planning buildOnboardProjection now resolves PROJECT.md from both the shared .planning root and the active planningDir scope, matching how REQUIREMENTS.md, ROADMAP.md, and STATE.md are resolved. This prevents false partial-planning or new-project routing when planning artifacts live under a workstream or GSD_PROJECT scope. --- src/onboard-projection.cts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts index 68e144004..c88c1c345 100644 --- a/src/onboard-projection.cts +++ b/src/onboard-projection.cts @@ -247,6 +247,7 @@ function nextAction(params: { projectExists: boolean; mapReadiness: MapReadiness; onboardingSummaryExists: boolean; + onboardingSummaryPath: string; hasPlanningArtifacts: boolean; missingPlanningFiles: string[]; handoffCommands: OnboardHandoffCommands; @@ -302,7 +303,7 @@ function nextAction(params: { if (!params.onboardingSummaryExists) { return { kind: 'write-summary', - summary_path: '.planning/onboarding/SUMMARY.md', + summary_path: params.onboardingSummaryPath, reason: 'Onboarding summary is missing.', }; } @@ -344,11 +345,15 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti const needsCodebaseMap = isBrownfield && !hasCodebaseMap; const needsFastCodebaseMap = isBrownfield && !hasFastCodebaseMap; const needsOnboardCodebaseMap = options.fast ? needsFastCodebaseMap : needsCodebaseMap; - const projectExists = pathExistsInternal(cwd, '.planning/PROJECT.md'); + const projectRootPath = path.join(planningRoot(cwd), 'PROJECT.md'); + const projectScopedPath = path.join(planningDir(cwd), 'PROJECT.md'); + const projectExists = + fs.existsSync(projectRootPath) || fs.existsSync(projectScopedPath); const requirementsExists = fs.existsSync(path.join(planningDir(cwd), 'REQUIREMENTS.md')); const roadmapExists = fs.existsSync(path.join(planningDir(cwd), 'ROADMAP.md')); const stateExists = fs.existsSync(path.join(planningDir(cwd), 'STATE.md')); - const onboardingSummaryExists = pathExistsInternal(cwd, '.planning/onboarding/SUMMARY.md'); + const onboardingSummaryPath = path.join(planningRoot(cwd), 'onboarding', 'SUMMARY.md'); + const onboardingSummaryExists = fs.existsSync(onboardingSummaryPath); const hasPlanningArtifacts = projectExists || requirementsExists || roadmapExists || stateExists; const missingPlanningFiles = planningMissing( projectExists, @@ -383,6 +388,7 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti projectExists, mapReadiness: mapReadinessValue, onboardingSummaryExists, + onboardingSummaryPath: toPosixPath(path.relative(cwd, onboardingSummaryPath)), hasPlanningArtifacts, missingPlanningFiles, handoffCommands, @@ -404,9 +410,12 @@ function buildOnboardProjection(cwd: string, options: BuildOnboardProjectionOpti doc_candidates: docCandidates, onboarding_summary_exists: onboardingSummaryExists, - onboarding_summary_path: '.planning/onboarding/SUMMARY.md', + onboarding_summary_path: toPosixPath(path.relative(cwd, onboardingSummaryPath)), - project_path: '.planning/PROJECT.md', + project_path: toPosixPath(path.relative( + cwd, + fs.existsSync(projectRootPath) ? projectRootPath : projectScopedPath, + )), requirements_path: toPosixPath( path.relative(cwd, path.join(planningDir(cwd), 'REQUIREMENTS.md')), ), From 33397b69fc32bcb8d329c9767b630ed9e068c617 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 18:26:13 -0500 Subject: [PATCH 32/75] no-mistakes(document): Sync onboarding documentation --- CONTEXT.md | 2 +- README.ja-JP.md | 7 ++++--- README.ko-KR.md | 7 ++++--- README.pt-BR.md | 7 ++++--- README.zh-CN.md | 7 ++++--- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/CONTEXT.md b/CONTEXT.md index 0b191c568..f44f91742 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -68,7 +68,7 @@ Canonical command normalization and resolution Interface (`query-command-resolut Module owning command resolution, policy projection (`mutation`, `output_mode`), unknown-command diagnosis, and handler Adapter binding at one seam for query dispatch. ### Init Command Module -Module owning the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles consumed by init workflows (`/gsd-execute-phase`, `/gsd-plan-phase`, `/gsd-verify-work`, `/gsd-new-project`, `/gsd-manager`, `/gsd-progress`, `/gsd-resume`, etc.). Source of truth: `gsd-core/bin/lib/init.cjs` — the basic handlers (plus `withProjectRoot` project-identity injection) and the 3 heavyweight handlers (`initNewProject`, `initProgress`, `initManager`). All handlers return `{ data: }`. Test seams: `tests/init.test.cjs` and `tests/init-manager.test.cjs` (cover withProjectRoot precedence, progress/manager precedence regression #2674, workstream scoping regression #3196, and cross-milestone dependency regression #2267). (The SDK `handlers/init/*.ts` sources and the `init*.test.ts` seams were retired with the SDK package per ADR-0174.) +Module owning the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles consumed by init workflows (`/gsd-execute-phase`, `/gsd-plan-phase`, `/gsd-verify-work`, `/gsd-new-project`, `/gsd-onboard`, `/gsd-manager`, `/gsd-progress`, `/gsd-resume`, etc.). Source of truth: `src/init.cts` and the compiled `gsd-core/bin/lib/init.cjs`; onboarding routing readiness lives in `src/onboard-projection.cts`. The basic handlers (plus `withProjectRoot` project-identity injection) and the heavyweight handlers (`initNewProject`, `initOnboard`, `initProgress`, `initManager`) return `{ data: }`. Test seams: `tests/init.test.cjs`, `tests/onboard-command.test.cjs`, and `tests/init-manager.test.cjs` (cover withProjectRoot precedence, onboarding projection/rendering, progress/manager precedence regression #2674, workstream scoping regression #3196, and cross-milestone dependency regression #2267). (The SDK `handlers/init/*.ts` sources and the `init*.test.ts` seams were retired with the SDK package per ADR-0174.) ### Command Routing Hub Single dispatch seam (`gsd-core/bin/lib/command-routing-hub.cjs`) that centralizes CJS routing, the no-throw pure-result contract, typed error variants, and dispatch-event emission for all command family adapters. Interface: `createHub({ cjsRegistry, manifest, logger }) → hub`; `hub.dispatch({ family, subcommand, args, cwd, raw, parentTraceId? }) → Result` where `Result = { ok: true, data } | { ok: false, kind, ...typedPayload }` and `kind ∈ { UnknownCommand, InvalidArgs, HandlerRefusal, HandlerFailure }`. The `InvalidArgs` variant carries an optional `exitReason?: string` field (amendment #1642 / #1644 Phase 1) holding the `ERROR_REASON` enum value, separate from `reason` (the explanation text); the `makeInvalidArgs(arg, reason, exitReason?)` factory omits the field when the third arg is absent, undefined, or empty — preserving the strict-keys invariant tested at `tests/command-routing-hub.test.cjs:444`. The Hub is single-runtime (no mode selection, no sdkLoader), never prints, never exits, never throws. Adapters call `createHub`, dispatch, then translate the pure Result to `output()`/`error()` calls; when an `InvalidArgs` Result carries `exitReason`, the adapter passes it as the second arg to `error(message, exitReason)` so the JSON-error envelope (`GSD_JSON_ERRORS=1`) preserves the typed reason. Source: `gsd-core/bin/lib/command-routing-hub.cjs`; ADR: `docs/adr/0174-retire-gsd-sdk-package-boundary.md` (§5 amended #1642). diff --git a/README.ja-JP.md b/README.ja-JP.md index 449483459..e852c33b0 100644 --- a/README.ja-JP.md +++ b/README.ja-JP.md @@ -47,13 +47,14 @@ npx @opengsd/gsd-core@latest 別のランタイムをお使いの場合や Node.js がない場合は [ランタイムへのインストール](docs/ja-JP/how-to/install-on-your-runtime.md) を参照してください。 -インストール後、最初のプロジェクトを開始します。 +インストール後、新規プロジェクトを開始するか、既存リポジトリをオンボーディングします。 ```bash -/gsd-new-project +/gsd-new-project # グリーンフィールドプロジェクト +/gsd-onboard # 既存コードベース ``` -初めての方は [はじめてのプロジェクト](docs/ja-JP/tutorials/your-first-project.md) で、インストールから最初のフェーズ出荷までのガイド付きチュートリアルをご覧ください。 +初めての方は [はじめてのプロジェクト](docs/ja-JP/tutorials/your-first-project.md) で、インストールから最初のフェーズ出荷までのガイド付きチュートリアルをご覧ください。既存リポジトリの場合は [既存コードベースのオンボーディング](docs/ja-JP/tutorials/onboarding-an-existing-codebase.md) を参照してください。 --- diff --git a/README.ko-KR.md b/README.ko-KR.md index 3bef4570b..2d90f1a6e 100644 --- a/README.ko-KR.md +++ b/README.ko-KR.md @@ -47,13 +47,14 @@ npx @opengsd/gsd-core@latest 다른 런타임이나 Node.js가 없는 환경은 [런타임에 설치하기](docs/ko-KR/how-to/install-on-your-runtime.md)를 참조하세요. -설치 후 첫 번째 프로젝트를 시작합니다: +설치 후 새 프로젝트를 시작하거나 기존 저장소를 온보딩합니다: ```bash -/gsd-new-project +/gsd-new-project # 그린필드 프로젝트 +/gsd-onboard # 기존 코드베이스 ``` -처음 사용하시나요? [첫 번째 프로젝트](docs/ko-KR/tutorials/your-first-project.md)를 따라 설치부터 첫 단계 출시까지 안내받으세요. +처음 사용하시나요? [첫 번째 프로젝트](docs/ko-KR/tutorials/your-first-project.md)를 따라 설치부터 첫 단계 출시까지 안내받으세요. 기존 저장소라면 [기존 코드베이스 온보딩](docs/ko-KR/tutorials/onboarding-an-existing-codebase.md)을 참고하세요. --- diff --git a/README.pt-BR.md b/README.pt-BR.md index 91c6de96e..96c0c9ada 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -47,13 +47,14 @@ O instalador solicita seu ambiente de execução (Claude Code, OpenCode, Gemini Em outro runtime ou sem Node.js? Consulte [Instalar no seu runtime](docs/pt-BR/how-to/install-on-your-runtime.md). -Após a instalação, inicie seu primeiro projeto: +Após a instalação, inicie um projeto novo ou integre um repositório existente: ```bash -/gsd-new-project +/gsd-new-project # projeto greenfield +/gsd-onboard # base de código existente ``` -É a primeira vez? Siga [Seu primeiro projeto](docs/pt-BR/tutorials/your-first-project.md) para um passo a passo guiado, desde a instalação até a primeira fase entregue. +É a primeira vez? Siga [Seu primeiro projeto](docs/pt-BR/tutorials/your-first-project.md) para um passo a passo guiado, desde a instalação até a primeira fase entregue. Para um repositório existente, consulte [Integrar uma base de código existente](docs/pt-BR/tutorials/onboarding-an-existing-codebase.md). --- diff --git a/README.zh-CN.md b/README.zh-CN.md index 7e2831c54..993167e57 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -47,13 +47,14 @@ npx @opengsd/gsd-core@latest 使用其他运行时或没有 Node.js?请参阅[在你的运行时上安装](docs/zh-CN/how-to/install-on-your-runtime.md)。 -安装完成后,启动你的第一个项目: +安装完成后,启动一个新项目或接入现有仓库: ```bash -/gsd-new-project +/gsd-new-project # 新建项目 +/gsd-onboard # 现有代码库 ``` -初次使用?请按照[你的第一个项目](docs/zh-CN/tutorials/your-first-project.md)进行引导式操作,从安装到完成第一个交付阶段。 +初次使用?请按照[你的第一个项目](docs/zh-CN/tutorials/your-first-project.md)进行引导式操作,从安装到完成第一个交付阶段。对于现有仓库,请参阅[接入现有代码库](docs/zh-CN/tutorials/onboarding-an-existing-codebase.md)。 --- From 7734dee051a4c1e8fb4e5a3e3e7cc36038d31db0 Mon Sep 17 00:00:00 2001 From: jeremymcs Date: Fri, 3 Jul 2026 23:37:12 +0000 Subject: [PATCH 33/75] fix(onboard): resolve Tests-lane failures for onboard workflow - runtime-launcher-parity: recognize workflows that delegate gsd_run to references/gsd-run-resolver.md (onboard.md) and exempt them from the inline-preamble checks; add a compensating byte-equality guard (B2) asserting the reference bash block matches _runtime-launcher.snippet.sh. - onboard.md: document the TEXT_MODE plain-text/numbered-list fallback for AskUserQuestion on non-Claude runtimes (fixes ask-user-questions-fallback, #2012). - Regenerate golden-install-parity fixtures, docs/INVENTORY-MANIFEST.json (add gsd-run-resolver.md + onboard-projection.cjs), and tests/workflow-size-baseline.json. Co-authored-by: Codesmith --- gsd-core/workflows/onboard.md | 2 +- tests/runtime-launcher-parity.test.cjs | 46 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index 625372e3b..dbcd7c147 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -33,7 +33,7 @@ Parse JSON fields from `INIT`: - `commit_docs`, `text_mode`, `has_git`, `git_worktree_root`, `in_nested_subdir` Set: -- `TEXT_MODE=true` if `--text` is present or `text_mode` is true. +- `TEXT_MODE=true` if `--text` is present or `text_mode` is true. When `TEXT_MODE` is active, replace every `AskUserQuestion` call below with a plain-text numbered list and ask the user to type their choice number — required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available. - `ONBOARDING_ROOT={git_worktree_root || _GSD_RUNTIME_ROOT}`. If `has_git` and `in_nested_subdir` are true, warn that onboarding artifacts belong to the outer worktree at `git_worktree_root`. Do not run `git init`. diff --git a/tests/runtime-launcher-parity.test.cjs b/tests/runtime-launcher-parity.test.cjs index 8fada64b1..2f2448b7c 100644 --- a/tests/runtime-launcher-parity.test.cjs +++ b/tests/runtime-launcher-parity.test.cjs @@ -136,6 +136,22 @@ function collectAgentFiles() { return results; } +/** + * A workflow/agent file "delegates to the shared resolver" when it pulls the + * canonical gsd_run preamble in from gsd-core/references/gsd-run-resolver.md via + * an @-include instead of inlining the snippet (see onboard.md / issue #1990). + * + * Such files are exempt from the inline-preamble parity checks (B / G / H and the + * runtime-home propagation checks): they intentionally do NOT inline the preamble + * — onboard-command.test.cjs even asserts the absence of the inline form. Their + * resolver correctness is guaranteed transitively by: + * (1) onboard-command.test.cjs asserting the @-include is present, and + * (2) the "resolver reference stays byte-equal to the snippet" guard (B2) below. + */ +function delegatesToResolverReference(content) { + return content.includes('references/gsd-run-resolver.md'); +} + describe('runtime-launcher-parity (#373)', () => { // ─── (A) No retired GSD_SDK token ──────────────────────────────────────── test('(A) no GSD_SDK token in any workflow .md file', () => { @@ -170,6 +186,9 @@ describe('runtime-launcher-parity (#373)', () => { for (const f of files) { const rel = path.relative(WORKFLOWS_DIR, f); const content = fs.readFileSync(f, 'utf8'); + // Files that delegate to the shared resolver reference (@-include) do not + // inline the preamble — exempt them (see delegatesToResolverReference / (B2)). + if (delegatesToResolverReference(content)) continue; const blocks = extractShellBlocks(content); // Collect all block lines in document order for flat analysis @@ -226,6 +245,30 @@ describe('runtime-launcher-parity (#373)', () => { ); }); + // ─── (B2) Shared resolver reference stays byte-equal to the snippet ─────── + // Workflows may delegate to gsd-core/references/gsd-run-resolver.md instead of + // inlining the preamble (see delegatesToResolverReference). That delegation is + // only safe if the reference's bash block is byte-equal to the canonical + // snippet — otherwise a delegating workflow (e.g. onboard.md) would silently + // ship a drifted resolver. This guard replaces the inline-preamble checks for + // those files. + test('(B2) references/gsd-run-resolver.md preamble is byte-equal to the canonical snippet', () => { + const preambleStr = expectedPreamble().join('\n'); + const refPath = path.join(__dirname, '..', 'gsd-core', 'references', 'gsd-run-resolver.md'); + const refContent = fs.readFileSync(refPath, 'utf8'); + const refPreamble = extractShellBlocks(refContent) + .map((b) => b.lines.join('\n')) + .join('\n') + .trim(); + assert.equal( + refPreamble, + preambleStr, + 'gsd-core/references/gsd-run-resolver.md must contain the canonical gsd_run preamble ' + + 'byte-equal to _runtime-launcher.snippet.sh. Re-copy the snippet into the reference so ' + + 'workflows that delegate to it via @-include ship the current resolver.', + ); + }); + // ─── (C) Space-safe behavioral test ────────────────────────────────────── test('(C) gsd_run works with a RUNTIME_DIR path containing spaces', () => { // Create temp dir whose path contains a space @@ -402,6 +445,7 @@ describe('runtime-launcher-parity (#373)', () => { const content = fs.readFileSync(f, 'utf8'); const blocks = extractShellBlocks(content); const allBlockLines = blocks.flatMap((b) => b.lines); + if (delegatesToResolverReference(content)) continue; const fileHasGsdRun = allBlockLines.some((l) => /\bgsd_run\b/.test(l)); if (!fileHasGsdRun) continue; const allContent = allBlockLines.join('\n'); @@ -433,6 +477,7 @@ describe('runtime-launcher-parity (#373)', () => { const content = fs.readFileSync(f, 'utf8'); const blocks = extractShellBlocks(content); const allBlockLines = blocks.flatMap((b) => b.lines); + if (delegatesToResolverReference(content)) continue; const fileHasGsdRun = allBlockLines.some((l) => /\bgsd_run\b/.test(l)); if (!fileHasGsdRun) continue; if (!allBlockLines.join('\n').includes(CODEX_HOME_PROBE)) { @@ -1346,6 +1391,7 @@ describe('bug-891: non-Claude runtime home fallback arms', () => { const content = fs.readFileSync(f, 'utf8'); const blocks = extractShellBlocks(content); const allBlockLines = blocks.flatMap((b) => b.lines); + if (delegatesToResolverReference(content)) continue; const fileHasGsdRun = allBlockLines.some((l) => /\bgsd_run\b/.test(l)); if (!fileHasGsdRun) continue; const allContent = allBlockLines.join('\n'); From 12c20f6ca7ac9f53d4f5e44db0589aa04bc85465 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 18:54:28 -0500 Subject: [PATCH 34/75] fix(onboard): refresh generated project skills --- skills/gsd-ns-project/SKILL.md | 1 + skills/gsd-surface/SKILL.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/skills/gsd-ns-project/SKILL.md b/skills/gsd-ns-project/SKILL.md index 5aa5a8e8b..96d22ac4d 100644 --- a/skills/gsd-ns-project/SKILL.md +++ b/skills/gsd-ns-project/SKILL.md @@ -14,6 +14,7 @@ inline as part of `gsd-audit-milestone`'s output. | User wants | Invoke | |---|---| | Start a new project | gsd-new-project | +| Onboard an existing codebase | gsd-onboard | | Create a new milestone | gsd-new-milestone | | Complete the current milestone | gsd-complete-milestone | | Audit a milestone for issues | gsd-audit-milestone | diff --git a/skills/gsd-surface/SKILL.md b/skills/gsd-surface/SKILL.md index 688624c03..d3cb0d571 100644 --- a/skills/gsd-surface/SKILL.md +++ b/skills/gsd-surface/SKILL.md @@ -45,7 +45,7 @@ Display: ``` Enabled (N skills, ~T tokens): - core_loop: new-project onboard discuss-phase plan-phase execute-phase help update + core_loop: new-project discuss-phase plan-phase execute-phase help update audit_review: … … From 90ebe4ea734dc6bd0e0545eef7f41922efacbfcc Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 19:02:56 -0500 Subject: [PATCH 35/75] no-mistakes(review): Include manager in onboard installs --- commands/gsd/onboard.md | 2 +- tests/runtime-artifact-layout-install-profiles.test.cjs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/commands/gsd/onboard.md b/commands/gsd/onboard.md index 9211d3cff..e51fd9919 100644 --- a/commands/gsd/onboard.md +++ b/commands/gsd/onboard.md @@ -10,7 +10,7 @@ allowed-tools: - Grep - Agent - AskUserQuestion -requires: [config, new-project, map-codebase, ingest-docs] +requires: [config, new-project, map-codebase, ingest-docs, manager] --- **Copilot (VS Code):** Use `vscode_askquestions` wherever this workflow calls `AskUserQuestion`. They are equivalent — `vscode_askquestions` is the VS Code Copilot implementation of the same interactive question API. diff --git a/tests/runtime-artifact-layout-install-profiles.test.cjs b/tests/runtime-artifact-layout-install-profiles.test.cjs index ed94af736..6361ec939 100644 --- a/tests/runtime-artifact-layout-install-profiles.test.cjs +++ b/tests/runtime-artifact-layout-install-profiles.test.cjs @@ -380,6 +380,14 @@ describe('resolveProfile', () => { } }); + test('standard profile includes the onboard manager handoff dependency', () => { + const manifest = loadSkillsManifest(REAL_COMMANDS_DIR); + const result = resolveProfile({ modes: ['standard'], manifest }); + assert.ok(result.skills instanceof Set); + assert.ok(result.skills.has('onboard'), 'standard profile should include onboard'); + assert.ok(result.skills.has('manager'), 'onboard handoff must install gsd-manager'); + }); + test('resolves full profile — returns sentinel', () => { const manifest = loadSkillsManifest(REAL_COMMANDS_DIR); const result = resolveProfile({ modes: ['full'], manifest }); From 4866b04f39a57a446a46fe8e5b87a3ab20719961 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Fri, 3 Jul 2026 19:13:06 -0500 Subject: [PATCH 36/75] no-mistakes(document): Sync onboard documentation --- docs/ja-JP/FEATURES.md | 8 ++++++++ docs/ko-KR/FEATURES.md | 8 ++++++++ docs/pt-BR/FEATURES.md | 2 +- docs/zh-CN/FEATURES.md | 8 ++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/ja-JP/FEATURES.md b/docs/ja-JP/FEATURES.md index f12493671..31c1da45c 100644 --- a/docs/ja-JP/FEATURES.md +++ b/docs/ja-JP/FEATURES.md @@ -818,6 +818,14 @@ - REQ-ONBOARD-03: ADR/PRD/SPEC/RFC 候補があり project がない場合、`/gsd-new-project` の前に `/gsd-ingest-docs` を提示する。 - REQ-ONBOARD-04: `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` が揃うまで完了扱いにしない。 - REQ-ONBOARD-05: project setup 後にのみ `.planning/onboarding/SUMMARY.md` を作成または確認する。 +- REQ-ONBOARD-06: 対話型メニューがない runtime 向けに、`--text` で番号付きプレーンテキスト gate をサポートする。 + +**生成物:** +| Artifact | 説明 | +|----------|-------------| +| `.planning/codebase/` | `/gsd-map-codebase` handoff が生成するコードベースマップ | +| `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` | `/gsd-new-project` または `/gsd-ingest-docs` が生成する planning setup | +| `.planning/onboarding/SUMMARY.md` | Onboarding status、artifact index、next-command summary | ### 27a. 実行後コードベースドリフト検出 diff --git a/docs/ko-KR/FEATURES.md b/docs/ko-KR/FEATURES.md index d1afde110..a6663acd3 100644 --- a/docs/ko-KR/FEATURES.md +++ b/docs/ko-KR/FEATURES.md @@ -749,6 +749,14 @@ - REQ-ONBOARD-03: ADR/PRD/SPEC/RFC 후보가 있고 project가 없으면 `/gsd-new-project` 전에 `/gsd-ingest-docs`를 제안해야 합니다. - REQ-ONBOARD-04: `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md`가 모두 있을 때까지 완료로 보고하지 않아야 합니다. - REQ-ONBOARD-05: project setup 후에만 `.planning/onboarding/SUMMARY.md`를 만들거나 확인해야 합니다. +- REQ-ONBOARD-06: 대화형 메뉴가 없는 runtime을 위해 `--text` 번호형 plain-text gate를 지원해야 합니다. + +**생성 산출물.** +| 산출물 | 설명 | +|----------|-------------| +| `.planning/codebase/` | `/gsd-map-codebase` handoff가 생성한 코드베이스 맵 | +| `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` | `/gsd-new-project` 또는 `/gsd-ingest-docs`가 생성한 planning setup | +| `.planning/onboarding/SUMMARY.md` | Onboarding status, artifact index, next-command summary | --- diff --git a/docs/pt-BR/FEATURES.md b/docs/pt-BR/FEATURES.md index c0ded9cbb..ade045a95 100644 --- a/docs/pt-BR/FEATURES.md +++ b/docs/pt-BR/FEATURES.md @@ -14,7 +14,7 @@ Para catálogo completo e detalhamento exaustivo, consulte [FEATURES.md em ingl - **Commits atômicos por tarefa** para rastreabilidade e rollback - **Verificação pós-execução** com foco em objetivos da fase - **UAT guiado** via `/gsd-verify-work` -- **Suporte brownfield** com `/gsd-map-codebase` +- **Suporte brownfield** com `/gsd-onboard` e `/gsd-map-codebase` - **Workstreams** para trilhas paralelas sem colisão de estado - **Backlog, seeds e threads** para memória de médio/longo prazo diff --git a/docs/zh-CN/FEATURES.md b/docs/zh-CN/FEATURES.md index b0d0e5355..80953d3af 100644 --- a/docs/zh-CN/FEATURES.md +++ b/docs/zh-CN/FEATURES.md @@ -818,6 +818,14 @@ - REQ-ONBOARD-03:当存在 ADR/PRD/SPEC/RFC 候选且 project 不存在时,系统必须在 `/gsd-new-project` 前提供 `/gsd-ingest-docs`。 - REQ-ONBOARD-04:在 `PROJECT.md`、`REQUIREMENTS.md`、`ROADMAP.md`、`STATE.md` 全部存在前,系统不得报告 onboarding 完成。 - REQ-ONBOARD-05:系统必须仅在 project setup 后创建或确认 `.planning/onboarding/SUMMARY.md`。 +- REQ-ONBOARD-06:系统必须为没有交互式菜单的运行时支持 `--text` 编号纯文本关卡。 + +**产出:** +| Artifact | 说明 | +|----------|-------------| +| `.planning/codebase/` | 由 `/gsd-map-codebase` 交接生成的代码库映射 | +| `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` | 由 `/gsd-new-project` 或 `/gsd-ingest-docs` 生成的规划设置 | +| `.planning/onboarding/SUMMARY.md` | Onboarding status、artifact index 和 next-command summary | ### 27a. 执行后代码库漂移检测 From 89bc05ae69fedd2b02714c51f56b030a1c2a7d63 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 4 Jul 2026 00:18:30 +0000 Subject: [PATCH 37/75] Fix fast map gate misrouting onboard after project setup Move partial-planning ahead of the fast-map handoff and require !projectExists so complete-map-before-new-project only applies before new-project, allowing write-summary and partial-planning to win. --- src/onboard-projection.cts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/onboard-projection.cts b/src/onboard-projection.cts index c88c1c345..bcd3b794b 100644 --- a/src/onboard-projection.cts +++ b/src/onboard-projection.cts @@ -260,14 +260,6 @@ function nextAction(params: { }; } - if (params.fastMode && params.mapReadiness === 'fast') { - return { - kind: 'complete-map-before-new-project', - command: params.handoffCommands.map_codebase, - reason: 'The fast map is enough for lightweight onboarding, but project setup still requires the complete codebase map.', - }; - } - if (params.hasPlanningArtifacts && params.missingPlanningFiles.length > 0) { return { kind: 'partial-planning', @@ -276,6 +268,14 @@ function nextAction(params: { }; } + if (params.fastMode && params.mapReadiness === 'fast' && !params.projectExists) { + return { + kind: 'complete-map-before-new-project', + command: params.handoffCommands.map_codebase, + reason: 'The fast map is enough for lightweight onboarding, but project setup still requires the complete codebase map.', + }; + } + if (params.hasDocsCandidates && !params.projectExists) { return { kind: 'ingest-docs', From 44223b8c5a66adab50e86cfc7fd89749cec43a56 Mon Sep 17 00:00:00 2001 From: jeremymcs Date: Sat, 4 Jul 2026 00:30:09 +0000 Subject: [PATCH 38/75] test(onboard): add regression coverage for fast-map gate misroute (#1990) Locks in the 6a51bd11 fix. The fast-map gate (fastMode && mapReadiness==='fast') previously ran before the partial-planning check and lacked a !projectExists guard, so rerunning /gsd-onboard --fast after project setup, or with incomplete planning, misrouted to complete-map-before-new-project instead of write-summary/partial-planning. Both cases now covered; each fails on the pre-fix ordering. Co-authored-by: Codesmith --- tests/onboard-command.test.cjs | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/onboard-command.test.cjs b/tests/onboard-command.test.cjs index 5809f9b32..c60987a60 100644 --- a/tests/onboard-command.test.cjs +++ b/tests/onboard-command.test.cjs @@ -205,6 +205,48 @@ describe('init onboard public CLI projection', () => { assert.deepStrictEqual(parsed.next_action.missing, ['PROJECT.md']); }); + test('fast mode leaves a fully set-up project at write-summary instead of the complete-map gate (regression #1990: fast map gate misroute)', () => { + fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'INTEGRATIONS', 'ARCHITECTURE', 'STRUCTURE']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + for (const name of ['PROJECT', 'REQUIREMENTS', 'ROADMAP', 'STATE']) { + fs.writeFileSync(path.join(tmpDir, '.planning', `${name}.md`), `# ${name}\n`); + } + + const result = runGsdTools(['init', 'onboard', '--fast', '--raw'], tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.map_readiness, 'fast'); + assert.strictEqual(parsed.project_exists, true); + // Once project setup is complete, a fast map must not misroute back to the + // pre-new-project complete-map handoff; onboarding advances to the summary. + assert.strictEqual(parsed.next_action.kind, 'write-summary'); + assert.strictEqual(parsed.next_action.summary_path, '.planning/onboarding/SUMMARY.md'); + }); + + test('fast mode routes incomplete planning to partial-planning before the complete-map gate (regression #1990: fast map gate misroute)', () => { + fs.mkdirSync(path.join(tmpDir, '.planning', 'codebase'), { recursive: true }); + for (const name of ['STACK', 'INTEGRATIONS', 'ARCHITECTURE', 'STRUCTURE']) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'codebase', `${name}.md`), `# ${name}\n`); + } + fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"fixture"}\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'PROJECT.md'), '# Project\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), '# Roadmap\n'); + fs.writeFileSync(path.join(tmpDir, '.planning', 'STATE.md'), '# State\n'); + + const result = runGsdTools(['init', 'onboard', '--fast', '--raw'], tmpDir, { HOME: tmpDir }); + assert.ok(result.success, `init onboard should succeed: ${result.error}`); + + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.map_readiness, 'fast'); + // Incomplete planning must surface before the fast-map complete-map handoff. + assert.strictEqual(parsed.next_action.kind, 'partial-planning'); + assert.deepStrictEqual(parsed.next_action.missing, ['REQUIREMENTS.md']); + }); + test('projects the next action for code, docs, greenfield, partial planning, and summary states', () => { fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true }); fs.writeFileSync(path.join(tmpDir, 'src', 'server.ts'), 'export const server = true;\n'); From 4a42f684c0bffa4d9d947dd4e187e829cdd4a713 Mon Sep 17 00:00:00 2001 From: Jeremy McSpadden Date: Sat, 4 Jul 2026 07:39:14 -0500 Subject: [PATCH 39/75] fix(#1990): correct onboard changeset pr --- .changeset/steady-mice-frolic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/steady-mice-frolic.md b/.changeset/steady-mice-frolic.md index cf3a8ba59..d5bb4f8d6 100644 --- a/.changeset/steady-mice-frolic.md +++ b/.changeset/steady-mice-frolic.md @@ -1,5 +1,5 @@ --- type: Added -pr: 1991 +pr: 1994 --- **`/gsd:onboard` guides brownfield setup** — existing repos now have a top-level onboarding command that routes through codebase mapping, docs ingest, project initialization, and an onboarding summary without silently overwriting planning files. From 4c673e51f32837f0be47b4ad3d9e58942a586e52 Mon Sep 17 00:00:00 2001 From: Codesmith Date: Sun, 5 Jul 2026 18:35:38 +0000 Subject: [PATCH 40/75] chore(#1990): resync runtime launcher and regenerate artifacts after rebase onto next Co-authored-by: Codesmith --- docs/INVENTORY-MANIFEST.json | 4 ++++ gsd-core/workflows/onboard.md | 1 + 2 files changed, 5 insertions(+) diff --git a/docs/INVENTORY-MANIFEST.json b/docs/INVENTORY-MANIFEST.json index 2c94b3bc9..9bd69d266 100644 --- a/docs/INVENTORY-MANIFEST.json +++ b/docs/INVENTORY-MANIFEST.json @@ -78,6 +78,7 @@ "/gsd-ns-project", "/gsd-ns-review", "/gsd-ns-workflow", + "/gsd-onboard", "/gsd-pause-work", "/gsd-phase", "/gsd-plan-phase", @@ -160,6 +161,7 @@ "next.md", "node-repair.md", "note.md", + "onboard.md", "pause-work.md", "plan-milestone-gaps.md", "plan-phase.md", @@ -225,6 +227,7 @@ "gates.md", "git-integration.md", "git-planning-commit.md", + "gsd-run-resolver.md", "honest-verifier.md", "ios-scaffold.md", "loop-hook-dispatch.md", @@ -367,6 +370,7 @@ "model-catalog.cjs", "model-profiles.cjs", "model-resolver.cjs", + "onboard-projection.cjs", "package-identity.cjs", "package-legitimacy.cjs", "phase-command-router.cjs", diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index dbcd7c147..c4f51c014 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -14,6 +14,7 @@ Parse `$ARGUMENTS`: Run the standard `gsd_run` resolver from the reference above, then run the projection from the runtime root: ```bash +_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi # If --fast was parsed from $ARGUMENTS: INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard --fast --raw) # Otherwise: From 425d2f2c8b257f3e761abdb3015dbfdf2eca80cb Mon Sep 17 00:00:00 2001 From: Codesmith Date: Sun, 5 Jul 2026 18:59:55 +0000 Subject: [PATCH 41/75] fix(#1990): keep onboard resolver delegation in sync with canonical launcher onboard.md delegates the gsd_run preamble to gsd-core/references/gsd-run-resolver.md via @-include, but two guards regressed once the canonical launcher snippet advanced to ${CLAUDE_CONFIG_DIR:-$HOME/.claude} (#2024): - runtime-launcher-parity (B2): the resolver reference still shipped the old $HOME/.claude arm. references/ is not covered by sync-runtime-launcher.cjs, so refresh the resolver bash block to be byte-equal to _runtime-launcher.snippet.sh. - /gsd:onboard command contract: sync-runtime-launcher.cjs had re-inlined the preamble into onboard.md (a delegating file). Teach the sync transform to strip-but-never-inline files that @-include the resolver, mirroring the exemption already in the parity test (B/B2). Regenerate golden install fixtures and the workflow size baseline for the smaller onboard.md. Co-authored-by: Codesmith --- gsd-core/references/gsd-run-resolver.md | 2 +- gsd-core/workflows/onboard.md | 1 - scripts/sync-runtime-launcher.cjs | 22 ++++++++++++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gsd-core/references/gsd-run-resolver.md b/gsd-core/references/gsd-run-resolver.md index dd584b755..01f6acb6d 100644 --- a/gsd-core/references/gsd-run-resolver.md +++ b/gsd-core/references/gsd-run-resolver.md @@ -4,5 +4,5 @@ Use this bootstrap block when a workflow must call `gsd-tools` from the active w Keep this resolver centralized; workflows should reference this file instead of copying the shell probe. ```bash -_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi +_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi ``` diff --git a/gsd-core/workflows/onboard.md b/gsd-core/workflows/onboard.md index c4f51c014..dbcd7c147 100644 --- a/gsd-core/workflows/onboard.md +++ b/gsd-core/workflows/onboard.md @@ -14,7 +14,6 @@ Parse `$ARGUMENTS`: Run the standard `gsd_run` resolver from the reference above, then run the projection from the runtime root: ```bash -_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi # If --fast was parsed from $ARGUMENTS: INIT=$(gsd_run --cwd "$_GSD_RUNTIME_ROOT" init onboard --fast --raw) # Otherwise: diff --git a/scripts/sync-runtime-launcher.cjs b/scripts/sync-runtime-launcher.cjs index 6ce5a6303..dbc38a2b4 100644 --- a/scripts/sync-runtime-launcher.cjs +++ b/scripts/sync-runtime-launcher.cjs @@ -343,9 +343,12 @@ function transformFile(content, preamble) { } } - // Insert preamble into the first gsd_run block only + // Insert preamble into the first gsd_run block only — UNLESS this file + // delegates to the shared resolver reference (@-include). Delegating files keep + // the stripped blocks (any inline preamble removed) but never get one inserted. + const delegates = delegatesToResolverReference(content); const finalBlocks = strippedBlocks.map((stripped, bi) => { - if (bi === firstGsdRunBlockIdx) { + if (!delegates && bi === firstGsdRunBlockIdx) { return insertPreamble(stripped, preamble); } return stripped; @@ -374,6 +377,21 @@ function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } +/** + * A file "delegates to the shared resolver" when it pulls the canonical gsd_run + * preamble in from gsd-core/references/gsd-run-resolver.md via an @-include + * instead of inlining the snippet (see onboard.md / issue #1990). + * + * These files must NOT carry an inline preamble: the resolver reference ships the + * one canonical copy, and onboard-command.test.cjs asserts the inline form is + * absent. transformFile still STRIPS any inline preamble from them (so a stray + * copy is removed) but never re-inserts one — mirroring the exemption in + * runtime-launcher-parity.test.cjs (subtest B / B2). + */ +function delegatesToResolverReference(content) { + return content.includes('references/gsd-run-resolver.md'); +} + // Main function main() { const preamble = loadPreamble(); From a979cfd3f473f44f3cf3725e1afbee6b8c95809a Mon Sep 17 00:00:00 2001 From: Codesmith Date: Sun, 5 Jul 2026 19:18:28 +0000 Subject: [PATCH 42/75] chore(#1990): regenerate golden fixtures and size baseline after rebase onto next Co-authored-by: Codesmith --- .../golden-install-parity/antigravity.json | 19 ++++++++------- .../golden-install-parity/augment.json | 24 +++++++++++-------- .../golden-install-parity/claude.json | 19 ++++++++------- .../fixtures/golden-install-parity/cline.json | 19 ++++++++------- .../golden-install-parity/codebuddy.json | 24 +++++++++++-------- .../fixtures/golden-install-parity/codex.json | 19 ++++++++------- .../golden-install-parity/copilot.json | 19 ++++++++------- .../golden-install-parity/cursor.json | 24 +++++++++++-------- .../golden-install-parity/hermes.json | 19 ++++++++------- .../fixtures/golden-install-parity/kilo.json | 24 +++++++++++-------- .../fixtures/golden-install-parity/kimi.json | 19 ++++++++------- .../golden-install-parity/opencode.json | 24 +++++++++++-------- .../fixtures/golden-install-parity/qwen.json | 19 ++++++++------- .../fixtures/golden-install-parity/trae.json | 19 ++++++++------- .../golden-install-parity/windsurf.json | 14 ++++++----- tests/workflow-size-baseline.json | 3 ++- 16 files changed, 179 insertions(+), 129 deletions(-) diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index e884fbf03..bcf69f3d7 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -86,6 +86,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "9e6076a137f9e156", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "c11c191ffad86a9f", "gsd-core/references/honest-verifier.md": "a31a4bf42d82d5e9", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -171,7 +172,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "31f627d456ab14b0", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "e4a3b331be081e62", + "gsd-core/templates/project.md": "fae14114f2b79b10", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -224,7 +225,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "22adc4ed8589a015", + "gsd-core/workflows/do.md": "3eddf1cc9e04b685", "gsd-core/workflows/docs-update.md": "8e986e26d0e6e1a0", "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", "gsd-core/workflows/eval-review.md": "eb4040eaa5b8497f", @@ -241,10 +242,10 @@ "gsd-core/workflows/graduation.md": "a9d8f15ba81a993f", "gsd-core/workflows/health.md": "1ac4d567ee95acfb", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "0e253248c1c2e063", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0", + "gsd-core/workflows/help/modes/full.md": "c8ffd141e28f5111", + "gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69", "gsd-core/workflows/import.md": "41c62ae199209a68", "gsd-core/workflows/inbox.md": "a448220c548f27bc", "gsd-core/workflows/ingest-docs.md": "e2707f28f67d128b", @@ -262,6 +263,7 @@ "gsd-core/workflows/next.md": "8beefb4335dd7c41", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "3ce09c0aa0a20599", + "gsd-core/workflows/onboard.md": "69d871aa53a1a859", "gsd-core/workflows/pause-work.md": "564de32981a24337", "gsd-core/workflows/plan-milestone-gaps.md": "dd6a4b3a8b05ab6e", "gsd-core/workflows/plan-phase.md": "cb56e635fef4d3f3", @@ -366,7 +368,7 @@ "skills/gsd-inbox/SKILL.md": "4ec0198966ac4f7d", "skills/gsd-ingest-docs/SKILL.md": "f4e43968af317ed8", "skills/gsd-manager/SKILL.md": "6e51785860784d8c", - "skills/gsd-map-codebase/SKILL.md": "e10431a9386c6aec", + "skills/gsd-map-codebase/SKILL.md": "552f914f43b2181c", "skills/gsd-mempalace-capture/SKILL.md": "588ddf4fbf3ebe65", "skills/gsd-mempalace-recall/SKILL.md": "2d95e385fee26dee", "skills/gsd-milestone-summary/SKILL.md": "2955ab3e3a444ca3", @@ -377,9 +379,10 @@ "skills/gsd-ns-context/SKILL.md": "e791bc60e4cf124e", "skills/gsd-ns-ideate/SKILL.md": "b85f270e8415f595", "skills/gsd-ns-manage/SKILL.md": "d55c53b5b0513033", - "skills/gsd-ns-project/SKILL.md": "64844073a6115c45", + "skills/gsd-ns-project/SKILL.md": "905eff81dbb98b38", "skills/gsd-ns-review/SKILL.md": "2e30158e112d173c", "skills/gsd-ns-workflow/SKILL.md": "529e21833a6a8831", + "skills/gsd-onboard/SKILL.md": "1447665c64c8ade8", "skills/gsd-pause-work/SKILL.md": "9d3cc6bd70b03df1", "skills/gsd-phase/SKILL.md": "00676bbea61410bf", "skills/gsd-plan-phase/SKILL.md": "168046ccf9702532", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index e3557f981..8e977c425 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -62,7 +62,7 @@ "commands/gsd-inbox.md": "c218298db8b36e31", "commands/gsd-ingest-docs.md": "6718b04c597a5428", "commands/gsd-manager.md": "8f4ae79774902293", - "commands/gsd-map-codebase.md": "f3a06c4c7503f243", + "commands/gsd-map-codebase.md": "e4e170d4ef2d46c6", "commands/gsd-mempalace-capture.md": "2e610f3ebe2eb5b4", "commands/gsd-mempalace-recall.md": "38716c0983a3ef9c", "commands/gsd-milestone-summary.md": "ff5e11e6b33d4b5e", @@ -73,9 +73,10 @@ "commands/gsd-ns-context.md": "011c44e7aa46e64a", "commands/gsd-ns-ideate.md": "edc5e543512dd48a", "commands/gsd-ns-manage.md": "0409d810e499357f", - "commands/gsd-ns-project.md": "8dfd1b9a2ffe86ac", + "commands/gsd-ns-project.md": "ff67e85bc6f7fc5a", "commands/gsd-ns-review.md": "3766ed10827882a0", "commands/gsd-ns-workflow.md": "c3b3c046a74ec0ee", + "commands/gsd-onboard.md": "1e8acf7be31834be", "commands/gsd-pause-work.md": "4fb032f72238fe33", "commands/gsd-phase.md": "4920d15d779329eb", "commands/gsd-plan-phase.md": "e74f3cb7a10cbb83", @@ -156,6 +157,7 @@ "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -241,7 +243,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "b811bf951092df2f", "gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370", - "gsd-core/templates/project.md": "ab4af6becca2bb23", + "gsd-core/templates/project.md": "4f311fb1b05b823b", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -294,7 +296,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/do.md": "7512dd1892f118a1", "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", @@ -311,10 +313,10 @@ "gsd-core/workflows/graduation.md": "47f1594c88c08501", "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", - "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "3ac1c1bb851da7a5", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0", + "gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50", + "gsd-core/workflows/help/modes/full.md": "fc307cb77544df1d", + "gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d", "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", @@ -332,6 +334,7 @@ "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", + "gsd-core/workflows/onboard.md": "6f9e6c0b484271a9", "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", "gsd-core/workflows/plan-phase.md": "8b1209958c31ca2f", @@ -413,7 +416,7 @@ "skills/gsd-ns-context/skills/docs-update/SKILL.md": "e7ab14a984f7462c", "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "48846bf26ccaf0e7", "skills/gsd-ns-context/skills/graphify/SKILL.md": "3d6341614add6ccd", - "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "51d6b970dca3c28e", + "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "2017007dcd69d153", "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "a7261b5ead71cc58", "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "646e59e76acd548f", "skills/gsd-ns-ideate/SKILL.md": "d70360a5f7e8ac90", @@ -441,7 +444,7 @@ "skills/gsd-ns-manage/skills/update/SKILL.md": "c8165b8085ba106a", "skills/gsd-ns-manage/skills/workspace/SKILL.md": "98cc03aa8c735e9d", "skills/gsd-ns-manage/skills/workstreams/SKILL.md": "94d00b5116523f36", - "skills/gsd-ns-project/SKILL.md": "4d7e3c3870536dc9", + "skills/gsd-ns-project/SKILL.md": "ae47130ec878de8c", "skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "6d4c77390c549fc7", "skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "0af489daf6fd3f16", "skills/gsd-ns-project/skills/import/SKILL.md": "a3cfa7abc5ddd26d", @@ -449,6 +452,7 @@ "skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "18dc0c134cb62657", "skills/gsd-ns-project/skills/new-milestone/SKILL.md": "a94ff34b09e17a98", "skills/gsd-ns-project/skills/new-project/SKILL.md": "81f681f54ca61f90", + "skills/gsd-ns-project/skills/onboard/SKILL.md": "1f5b29c75a91be4f", "skills/gsd-ns-project/skills/profile-user/SKILL.md": "68b015a40d386bff", "skills/gsd-ns-project/skills/review-backlog/SKILL.md": "0f25310aa0cd48f6", "skills/gsd-ns-review/SKILL.md": "d7567fd9a75a5c21", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 7a285ad10..7c5c4a69b 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -85,6 +85,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "5c70ef3203b7c9ce", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -170,7 +171,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "213ccd947451ff2b", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "1f687c7a88381080", + "gsd-core/templates/project.md": "ae1f68db042c2522", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -223,7 +224,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "56215b98e26448bc", + "gsd-core/workflows/do.md": "61b92fb4d0bf3975", "gsd-core/workflows/docs-update.md": "63082608d3ae92be", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "f59e8329dae1e528", @@ -240,10 +241,10 @@ "gsd-core/workflows/graduation.md": "47f1594c88c08501", "gsd-core/workflows/health.md": "f934b1f1e9f3ae72", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "93cbdf7e542115a1", - "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0", + "gsd-core/workflows/help/modes/full.md": "e2084c6766e32d6c", + "gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9", "gsd-core/workflows/import.md": "6e8acff8c3918795", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", "gsd-core/workflows/ingest-docs.md": "25832c784e8812e6", @@ -261,6 +262,7 @@ "gsd-core/workflows/next.md": "ef30b829a6d5c5f6", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", + "gsd-core/workflows/onboard.md": "3c50ed1f1fd07619", "gsd-core/workflows/pause-work.md": "5716362557f44ce4", "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", "gsd-core/workflows/plan-phase.md": "6978a15b5232b310", @@ -365,7 +367,7 @@ "skills/gsd-inbox/SKILL.md": "d05a099c0be02c60", "skills/gsd-ingest-docs/SKILL.md": "eb85e654917a503a", "skills/gsd-manager/SKILL.md": "1370d93741e47828", - "skills/gsd-map-codebase/SKILL.md": "5009595dbde69739", + "skills/gsd-map-codebase/SKILL.md": "cf65e61890448285", "skills/gsd-mempalace-capture/SKILL.md": "40a31ad049374297", "skills/gsd-mempalace-recall/SKILL.md": "c3f412d5a64f3921", "skills/gsd-milestone-summary/SKILL.md": "33d51a325d314f3a", @@ -376,9 +378,10 @@ "skills/gsd-ns-context/SKILL.md": "3102e7ad9b60f182", "skills/gsd-ns-ideate/SKILL.md": "c2c129408a046d22", "skills/gsd-ns-manage/SKILL.md": "8d786e01fa28a7bb", - "skills/gsd-ns-project/SKILL.md": "cc0c4bd9feeab147", + "skills/gsd-ns-project/SKILL.md": "76c77b121ad68b6c", "skills/gsd-ns-review/SKILL.md": "4111ea56e820479f", "skills/gsd-ns-workflow/SKILL.md": "4282c40a5e6e8bbe", + "skills/gsd-onboard/SKILL.md": "46460b479b7524bf", "skills/gsd-pause-work/SKILL.md": "35e8a148e44f5361", "skills/gsd-phase/SKILL.md": "00be96e7ae36c6f0", "skills/gsd-plan-phase/SKILL.md": "0c9e87da048acfb7", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index 734dc44ab..d22a1693c 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -89,6 +89,7 @@ "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "f5403e1470e46e69", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "07544d9a957fc2ca", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -174,7 +175,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "b811bf951092df2f", "gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370", - "gsd-core/templates/project.md": "ab4af6becca2bb23", + "gsd-core/templates/project.md": "4f311fb1b05b823b", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -227,7 +228,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "a35bbd09f381d940", + "gsd-core/workflows/do.md": "045a18f30efb1202", "gsd-core/workflows/docs-update.md": "39f288623a8f6f32", "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", "gsd-core/workflows/eval-review.md": "3e1d7829ed2ed494", @@ -244,10 +245,10 @@ "gsd-core/workflows/graduation.md": "16fedecda36769eb", "gsd-core/workflows/health.md": "788fad84fa42eb9f", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", - "gsd-core/workflows/help/modes/default.md": "77c34f4a77dec02c", - "gsd-core/workflows/help/modes/full.md": "1bf502890828ada8", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0", + "gsd-core/workflows/help/modes/default.md": "86f7a14ad06e2f6f", + "gsd-core/workflows/help/modes/full.md": "efb266b8dbe60f51", + "gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d", "gsd-core/workflows/import.md": "96ec687c5cfe84ac", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", "gsd-core/workflows/ingest-docs.md": "7d0517356c9f2619", @@ -265,6 +266,7 @@ "gsd-core/workflows/next.md": "3f8b61a35587a021", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", + "gsd-core/workflows/onboard.md": "6f9e6c0b484271a9", "gsd-core/workflows/pause-work.md": "3530607514b0ac00", "gsd-core/workflows/plan-milestone-gaps.md": "bafdc6945cd2bd87", "gsd-core/workflows/plan-phase.md": "46db1a845f25a579", @@ -324,7 +326,7 @@ "skills/gsd-ns-context/skills/docs-update/SKILL.md": "d150afd41a25ec08", "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc", "skills/gsd-ns-context/skills/graphify/SKILL.md": "030050fcd08d129d", - "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "19aec854da15f77b", + "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "fa6a37402430af7d", "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "588ddf4fbf3ebe65", "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "2d95e385fee26dee", "skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f", @@ -352,7 +354,7 @@ "skills/gsd-ns-manage/skills/update/SKILL.md": "2666ab7786b69017", "skills/gsd-ns-manage/skills/workspace/SKILL.md": "c2616b157ec2350b", "skills/gsd-ns-manage/skills/workstreams/SKILL.md": "737841783c7fdd4f", - "skills/gsd-ns-project/SKILL.md": "5668e3a5e1d8896d", + "skills/gsd-ns-project/SKILL.md": "fac77a9e770fd655", "skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "739ed755ad84e58e", "skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "a69d534b385d6aaf", "skills/gsd-ns-project/skills/import/SKILL.md": "bc9b615cb141d26f", @@ -360,6 +362,7 @@ "skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "e3636a5e9bbaab1f", "skills/gsd-ns-project/skills/new-milestone/SKILL.md": "bc8989d97f3161ad", "skills/gsd-ns-project/skills/new-project/SKILL.md": "ff0d57491df30624", + "skills/gsd-ns-project/skills/onboard/SKILL.md": "56c34282575926d4", "skills/gsd-ns-project/skills/profile-user/SKILL.md": "0406eed4dbd9560c", "skills/gsd-ns-project/skills/review-backlog/SKILL.md": "d8a150558cc9326a", "skills/gsd-ns-review/SKILL.md": "c5afe33c212947dd", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 09416cee7..3596e2b09 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -62,7 +62,7 @@ "commands/gsd-inbox.md": "eecfcfff57f89975", "commands/gsd-ingest-docs.md": "ab3e58239c23d61d", "commands/gsd-manager.md": "bfe9e261fa918876", - "commands/gsd-map-codebase.md": "9ed09a9a9ce48ffd", + "commands/gsd-map-codebase.md": "5093093d42240325", "commands/gsd-mempalace-capture.md": "e9e00b0602e1d8b8", "commands/gsd-mempalace-recall.md": "6efef238d8c62569", "commands/gsd-milestone-summary.md": "e3a36fbd695a1833", @@ -73,9 +73,10 @@ "commands/gsd-ns-context.md": "cc8954f405ae7916", "commands/gsd-ns-ideate.md": "fd1dd80d705e6e36", "commands/gsd-ns-manage.md": "5cc012d0be1caabb", - "commands/gsd-ns-project.md": "52e30c8d84bb1ee5", + "commands/gsd-ns-project.md": "76672fae61723e55", "commands/gsd-ns-review.md": "a28dbfd4aba5f74b", "commands/gsd-ns-workflow.md": "a1b874be9cf16caf", + "commands/gsd-onboard.md": "63283b90aa671229", "commands/gsd-pause-work.md": "6caa75a7c2b4dd2d", "commands/gsd-phase.md": "e3ca4958ea20a935", "commands/gsd-plan-phase.md": "6de27d54ac191539", @@ -156,6 +157,7 @@ "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -241,7 +243,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "b811bf951092df2f", "gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370", - "gsd-core/templates/project.md": "ab4af6becca2bb23", + "gsd-core/templates/project.md": "4f311fb1b05b823b", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -294,7 +296,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/do.md": "7512dd1892f118a1", "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", @@ -311,10 +313,10 @@ "gsd-core/workflows/graduation.md": "47f1594c88c08501", "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", - "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "4c018bcc9ed4e55c", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0", + "gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50", + "gsd-core/workflows/help/modes/full.md": "3a19e96b69bcc33e", + "gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d", "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", @@ -332,6 +334,7 @@ "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", + "gsd-core/workflows/onboard.md": "6f9e6c0b484271a9", "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", "gsd-core/workflows/plan-phase.md": "3e4debac4579684f", @@ -436,7 +439,7 @@ "skills/gsd-inbox/SKILL.md": "0eb81a1b2e1835d3", "skills/gsd-ingest-docs/SKILL.md": "2df55e0ec95d57d9", "skills/gsd-manager/SKILL.md": "816db4d4ed618537", - "skills/gsd-map-codebase/SKILL.md": "00622b489483ba69", + "skills/gsd-map-codebase/SKILL.md": "b304ec25e9a95c93", "skills/gsd-mempalace-capture/SKILL.md": "5f10d368835e062c", "skills/gsd-mempalace-recall/SKILL.md": "70c8491f53f4161b", "skills/gsd-milestone-summary/SKILL.md": "9eb030a1ac307fa1", @@ -447,9 +450,10 @@ "skills/gsd-ns-context/SKILL.md": "305b9b6248e8cc95", "skills/gsd-ns-ideate/SKILL.md": "c63a1aed61888b35", "skills/gsd-ns-manage/SKILL.md": "6a5b711b5103c566", - "skills/gsd-ns-project/SKILL.md": "345ea11ccffd21b0", + "skills/gsd-ns-project/SKILL.md": "3711ce904d20ca66", "skills/gsd-ns-review/SKILL.md": "98f1f3b3caf1a279", "skills/gsd-ns-workflow/SKILL.md": "b77682820700300b", + "skills/gsd-onboard/SKILL.md": "6ad789a03124cd4f", "skills/gsd-pause-work/SKILL.md": "e2de20b7539e78d4", "skills/gsd-phase/SKILL.md": "f87211f779315ced", "skills/gsd-plan-phase/SKILL.md": "6134e837750034ab", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index f150fac04..d673bae26 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -121,6 +121,7 @@ "gsd-core/references/gates.md": "11fd2bdf27df57a5", "gsd-core/references/git-integration.md": "94715b69448bb818", "gsd-core/references/git-planning-commit.md": "5aad099c51135a0f", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -206,7 +207,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "56c67fdc5d31b556", "gsd-core/templates/planner-subagent-prompt.md": "a48a5a2ebd5a9f47", - "gsd-core/templates/project.md": "034a6501f348c5a5", + "gsd-core/templates/project.md": "c6005bd88a346a3e", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -259,7 +260,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "8f3e77a9486bc57b", + "gsd-core/workflows/do.md": "feec00355f896a3d", "gsd-core/workflows/docs-update.md": "e255317df939e302", "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", "gsd-core/workflows/eval-review.md": "63d0d0670b54c244", @@ -276,10 +277,10 @@ "gsd-core/workflows/graduation.md": "47f1594c88c08501", "gsd-core/workflows/health.md": "5b835fc606fd3e9b", "gsd-core/workflows/help.md": "08e1349950c5602a", - "gsd-core/workflows/help/modes/brief.md": "becceb85b25dca89", - "gsd-core/workflows/help/modes/default.md": "18c7dc50066f5cd6", - "gsd-core/workflows/help/modes/full.md": "8a7854a34df89bd8", - "gsd-core/workflows/help/modes/topic.md": "303613ba8b123b9f", + "gsd-core/workflows/help/modes/brief.md": "da44b130d1afe556", + "gsd-core/workflows/help/modes/default.md": "4bb3082d28026eea", + "gsd-core/workflows/help/modes/full.md": "01a1ec54df54da6e", + "gsd-core/workflows/help/modes/topic.md": "b7c7e4a8800bc3ea", "gsd-core/workflows/import.md": "cb3c8f9d09edb434", "gsd-core/workflows/inbox.md": "61b8b10e7a74b2e9", "gsd-core/workflows/ingest-docs.md": "3cb763e0687d7ffa", @@ -297,6 +298,7 @@ "gsd-core/workflows/next.md": "7097a9607a981086", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "664da466ab989f9d", + "gsd-core/workflows/onboard.md": "83c40ba7055b8b24", "gsd-core/workflows/pause-work.md": "a217770ecafcb2e0", "gsd-core/workflows/plan-milestone-gaps.md": "73d46f77c50a0690", "gsd-core/workflows/plan-phase.md": "89ee3233c1aee273", @@ -381,7 +383,7 @@ "skills/gsd-inbox/SKILL.md": "1315033595643485", "skills/gsd-ingest-docs/SKILL.md": "5bd2838bf0b6dc1b", "skills/gsd-manager/SKILL.md": "cb1cf56f5d3f66d6", - "skills/gsd-map-codebase/SKILL.md": "25d0b3adfc8b75dc", + "skills/gsd-map-codebase/SKILL.md": "cd27dc028718426b", "skills/gsd-mempalace-capture/SKILL.md": "1a7fac4d53f607ab", "skills/gsd-mempalace-recall/SKILL.md": "7205b02250e89f25", "skills/gsd-milestone-summary/SKILL.md": "af84ecb400f23556", @@ -392,9 +394,10 @@ "skills/gsd-ns-context/SKILL.md": "9b496da79789b3f9", "skills/gsd-ns-ideate/SKILL.md": "84ca1cde06110981", "skills/gsd-ns-manage/SKILL.md": "909dafa0cd19ba5a", - "skills/gsd-ns-project/SKILL.md": "fb8ad6c2223be3c3", + "skills/gsd-ns-project/SKILL.md": "936b6998d42520ac", "skills/gsd-ns-review/SKILL.md": "022253010db0e072", "skills/gsd-ns-workflow/SKILL.md": "cba075bc819b539e", + "skills/gsd-onboard/SKILL.md": "f42fc2edebeda671", "skills/gsd-pause-work/SKILL.md": "b379469eed78a196", "skills/gsd-phase/SKILL.md": "25477edc97a90c91", "skills/gsd-plan-phase/SKILL.md": "19ead1acb151a868", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index c375753f6..66f6dabfc 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -87,6 +87,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "657a93c539c16cab", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "fca7e30efb0afe3f", "gsd-core/references/honest-verifier.md": "08b1e82f59c18078", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -172,7 +173,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "e2b07376944c84e8", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "e4a3b331be081e62", + "gsd-core/templates/project.md": "fae14114f2b79b10", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -225,7 +226,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "988a20dab90c60c5", + "gsd-core/workflows/do.md": "9b46119803df09a6", "gsd-core/workflows/docs-update.md": "9292cfa3c52c434e", "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", "gsd-core/workflows/eval-review.md": "81c8e72ba3862856", @@ -242,10 +243,10 @@ "gsd-core/workflows/graduation.md": "f013efc29096faf0", "gsd-core/workflows/health.md": "f343fd32a0e398e4", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "0e9381367d6257bd", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0", + "gsd-core/workflows/help/modes/full.md": "ce88d4eb6b301e09", + "gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69", "gsd-core/workflows/import.md": "f4fa65e332b00f7e", "gsd-core/workflows/inbox.md": "a448220c548f27bc", "gsd-core/workflows/ingest-docs.md": "52be14d1a0713731", @@ -263,6 +264,7 @@ "gsd-core/workflows/next.md": "81c08abb34b2da88", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "4a5ee74cf2fc1f54", + "gsd-core/workflows/onboard.md": "a62602c6f3fd538a", "gsd-core/workflows/pause-work.md": "9ce66367be6c40db", "gsd-core/workflows/plan-milestone-gaps.md": "5cf589802d08bdf3", "gsd-core/workflows/plan-phase.md": "da462f812d1d0e61", @@ -346,7 +348,7 @@ "skills/gsd-inbox/SKILL.md": "cb9ed3865b67c04f", "skills/gsd-ingest-docs/SKILL.md": "10500de29525f6cf", "skills/gsd-manager/SKILL.md": "9946975bec15e737", - "skills/gsd-map-codebase/SKILL.md": "75806f8189d8af49", + "skills/gsd-map-codebase/SKILL.md": "39e7fd6bcc561f9d", "skills/gsd-mempalace-capture/SKILL.md": "f4511f69c14befb7", "skills/gsd-mempalace-recall/SKILL.md": "89523db66f834b2f", "skills/gsd-milestone-summary/SKILL.md": "5ca1dabfe0cd85f0", @@ -357,9 +359,10 @@ "skills/gsd-ns-context/SKILL.md": "d61edde87ae53105", "skills/gsd-ns-ideate/SKILL.md": "ca62cdf78ebe3585", "skills/gsd-ns-manage/SKILL.md": "9b1b7f6d9b877fcd", - "skills/gsd-ns-project/SKILL.md": "f1a666fb76527e6b", + "skills/gsd-ns-project/SKILL.md": "597b8dde8702c22d", "skills/gsd-ns-review/SKILL.md": "6405d0b1cf3f245d", "skills/gsd-ns-workflow/SKILL.md": "243287d21663ba87", + "skills/gsd-onboard/SKILL.md": "4d325f3033df2d37", "skills/gsd-pause-work/SKILL.md": "4f0caa008a8001ff", "skills/gsd-phase/SKILL.md": "d38c7f9b1d0d2360", "skills/gsd-plan-phase/SKILL.md": "d257bb9b1786039d", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index dc2e7f08f..956ca6c73 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -62,7 +62,7 @@ "commands/gsd-inbox.md": "e6bcee3f863d20db", "commands/gsd-ingest-docs.md": "9e7f8757b9408c01", "commands/gsd-manager.md": "f300b708a5487c76", - "commands/gsd-map-codebase.md": "cf50f4a600119c8a", + "commands/gsd-map-codebase.md": "12f705917eb202fb", "commands/gsd-mempalace-capture.md": "b30bce634ac3136c", "commands/gsd-mempalace-recall.md": "08c910285469a394", "commands/gsd-milestone-summary.md": "adfad2cf43fc5aad", @@ -73,9 +73,10 @@ "commands/gsd-ns-context.md": "b551dcc549c6a23f", "commands/gsd-ns-ideate.md": "32f561de74b1bc7b", "commands/gsd-ns-manage.md": "24445a84bd817c5b", - "commands/gsd-ns-project.md": "b39b509ac4161d28", + "commands/gsd-ns-project.md": "525f84d73f5c51e9", "commands/gsd-ns-review.md": "c8550463fbab5e76", "commands/gsd-ns-workflow.md": "2c1f1fde3c46bb40", + "commands/gsd-onboard.md": "d9e52f558fc2b90f", "commands/gsd-pause-work.md": "59630f05f95fff68", "commands/gsd-phase.md": "9a073dcd0f934f90", "commands/gsd-plan-phase.md": "57de92131fcb16b8", @@ -156,6 +157,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "9840f521ad6612b5", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -241,7 +243,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "213ccd947451ff2b", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "1f687c7a88381080", + "gsd-core/templates/project.md": "ae1f68db042c2522", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -294,7 +296,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73", - "gsd-core/workflows/do.md": "dc0ddd1f8231d26b", + "gsd-core/workflows/do.md": "9da6a73980ef2a71", "gsd-core/workflows/docs-update.md": "e86d7d7e2e3dac6d", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "a86279dd98dd5c03", @@ -311,10 +313,10 @@ "gsd-core/workflows/graduation.md": "53a4a6fa3b4e6613", "gsd-core/workflows/health.md": "e4d770484b5e7496", "gsd-core/workflows/help.md": "08e1349950c5602a", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "37c5149aae232e61", - "gsd-core/workflows/help/modes/full.md": "ed31d1afcbd3591f", - "gsd-core/workflows/help/modes/topic.md": "177d351f7465787d", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "b88ff431fffe40ae", + "gsd-core/workflows/help/modes/full.md": "a7a42d4340e8e00b", + "gsd-core/workflows/help/modes/topic.md": "cee80e0adfa3b06c", "gsd-core/workflows/import.md": "5d5fb8e51f6a243a", "gsd-core/workflows/inbox.md": "797c287852eb8957", "gsd-core/workflows/ingest-docs.md": "c6759dbf17e79293", @@ -332,6 +334,7 @@ "gsd-core/workflows/next.md": "174356dcfd7c6c32", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "1c1e466c764e3deb", + "gsd-core/workflows/onboard.md": "20c28136423d40ac", "gsd-core/workflows/pause-work.md": "5716362557f44ce4", "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", "gsd-core/workflows/plan-phase.md": "c90c001a92fc8a47", @@ -416,7 +419,7 @@ "skills/gsd-inbox/SKILL.md": "f9b4ff17883ee7e4", "skills/gsd-ingest-docs/SKILL.md": "01ed9183a00252ee", "skills/gsd-manager/SKILL.md": "62cd9f671a39e8a4", - "skills/gsd-map-codebase/SKILL.md": "f529da27d3a30b09", + "skills/gsd-map-codebase/SKILL.md": "383559aca64201e8", "skills/gsd-mempalace-capture/SKILL.md": "b308823dee547c65", "skills/gsd-mempalace-recall/SKILL.md": "56f3037091a8bd9a", "skills/gsd-milestone-summary/SKILL.md": "c5dbbc8edb97a7f7", @@ -427,9 +430,10 @@ "skills/gsd-ns-context/SKILL.md": "dcf5711653d57354", "skills/gsd-ns-ideate/SKILL.md": "0114f0bc5501c1e3", "skills/gsd-ns-manage/SKILL.md": "f3232d05d5263f5b", - "skills/gsd-ns-project/SKILL.md": "9f737a544e8d3f31", + "skills/gsd-ns-project/SKILL.md": "81d802dd3ee2e1ff", "skills/gsd-ns-review/SKILL.md": "8c686e92f293bfdd", "skills/gsd-ns-workflow/SKILL.md": "c379192bd17d47d7", + "skills/gsd-onboard/SKILL.md": "cae1f9382469fa00", "skills/gsd-pause-work/SKILL.md": "10e7531a2cb392ad", "skills/gsd-phase/SKILL.md": "1a2c9b64c1af7ffc", "skills/gsd-plan-phase/SKILL.md": "0784da05d41dcfe7", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 2bb6ec260..cd44401f3 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -86,6 +86,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "12d23fcbaa7fcf06", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "769d1472c989cd54", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -171,7 +172,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "213ccd947451ff2b", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "1f687c7a88381080", + "gsd-core/templates/project.md": "ae1f68db042c2522", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -224,7 +225,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "045e70c238db6faf", + "gsd-core/workflows/do.md": "e37540cc874fb782", "gsd-core/workflows/docs-update.md": "4d6c06e611d83b6d", "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", "gsd-core/workflows/eval-review.md": "f510e5762212dc6f", @@ -241,10 +242,10 @@ "gsd-core/workflows/graduation.md": "d1fd52bbe41dcf34", "gsd-core/workflows/health.md": "c622a5ad0d347d30", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "bb6876c976996dbd", - "gsd-core/workflows/help/modes/full.md": "fdab4b3690bdd11d", - "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "8874dac94eb68ae6", + "gsd-core/workflows/help/modes/full.md": "62779da88565d65a", + "gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9", "gsd-core/workflows/import.md": "a441445515bc2dd5", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", "gsd-core/workflows/ingest-docs.md": "ad496a4c423f1ab7", @@ -262,6 +263,7 @@ "gsd-core/workflows/next.md": "8e1fa29751d96564", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", + "gsd-core/workflows/onboard.md": "3c50ed1f1fd07619", "gsd-core/workflows/pause-work.md": "ae2d5789a95f70fe", "gsd-core/workflows/plan-milestone-gaps.md": "c86cdc1964256b98", "gsd-core/workflows/plan-phase.md": "e995429805b69fdc", @@ -344,7 +346,7 @@ "skills/gsd/gsd-ns-context/skills/docs-update/SKILL.md": "b059b3045d5daf5c", "skills/gsd/gsd-ns-context/skills/extract-learnings/SKILL.md": "36e59d6e514dcaf0", "skills/gsd/gsd-ns-context/skills/graphify/SKILL.md": "169eefd42c444cde", - "skills/gsd/gsd-ns-context/skills/map-codebase/SKILL.md": "6062ccca1a14b827", + "skills/gsd/gsd-ns-context/skills/map-codebase/SKILL.md": "9d36eee52586bb34", "skills/gsd/gsd-ns-context/skills/mempalace-capture/SKILL.md": "3fa619f73834c436", "skills/gsd/gsd-ns-context/skills/mempalace-recall/SKILL.md": "5d06922e0d7ab7d9", "skills/gsd/gsd-ns-ideate/SKILL.md": "b36bb4700ed6723a", @@ -372,7 +374,7 @@ "skills/gsd/gsd-ns-manage/skills/update/SKILL.md": "433a236998c305b0", "skills/gsd/gsd-ns-manage/skills/workspace/SKILL.md": "d655afc6f16565ed", "skills/gsd/gsd-ns-manage/skills/workstreams/SKILL.md": "6893312eaf14dab0", - "skills/gsd/gsd-ns-project/SKILL.md": "3ff43fdc0e4a6d02", + "skills/gsd/gsd-ns-project/SKILL.md": "6b3af15e7c4441c9", "skills/gsd/gsd-ns-project/skills/audit-milestone/SKILL.md": "de0556f07d899e50", "skills/gsd/gsd-ns-project/skills/complete-milestone/SKILL.md": "180cccc09bf99444", "skills/gsd/gsd-ns-project/skills/import/SKILL.md": "bf781c7a0d83c2cd", @@ -380,6 +382,7 @@ "skills/gsd/gsd-ns-project/skills/milestone-summary/SKILL.md": "c4bda5737f1137f8", "skills/gsd/gsd-ns-project/skills/new-milestone/SKILL.md": "47586c1fc8aa0645", "skills/gsd/gsd-ns-project/skills/new-project/SKILL.md": "8f22ba75717b3c88", + "skills/gsd/gsd-ns-project/skills/onboard/SKILL.md": "1d8d06ac1f27dacd", "skills/gsd/gsd-ns-project/skills/profile-user/SKILL.md": "5a8e01bc7b873a20", "skills/gsd/gsd-ns-project/skills/review-backlog/SKILL.md": "f3ef97da4e9b1d4c", "skills/gsd/gsd-ns-review/SKILL.md": "23fbadeca640e2bd", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index 4818d444d..0c52b8c0d 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -62,7 +62,7 @@ "command/gsd-inbox.md": "1429fc7f556337c3", "command/gsd-ingest-docs.md": "e655ecf1d4433ba9", "command/gsd-manager.md": "1cdc133079833552", - "command/gsd-map-codebase.md": "186c8f79319abc1c", + "command/gsd-map-codebase.md": "704cb63214f51523", "command/gsd-mempalace-capture.md": "a94ca275cbe7134c", "command/gsd-mempalace-recall.md": "d358cdd89c935877", "command/gsd-milestone-summary.md": "4ab29b777f62f0bb", @@ -73,9 +73,10 @@ "command/gsd-ns-context.md": "9a2b55b64f2e1e4b", "command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f", "command/gsd-ns-manage.md": "eded59052ca4b240", - "command/gsd-ns-project.md": "91417cf7b76581dd", + "command/gsd-ns-project.md": "c56395edb9bc7467", "command/gsd-ns-review.md": "61fe33e28eb1b961", "command/gsd-ns-workflow.md": "13c1ab91080c0cc3", + "command/gsd-onboard.md": "3e87a21c9c04f0d7", "command/gsd-pause-work.md": "04e993b1c9f8322b", "command/gsd-phase.md": "8f0e98dc6c223229", "command/gsd-plan-phase.md": "b37e9a61f946c975", @@ -156,6 +157,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "fbdf814a3af9c051", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -241,7 +243,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "2e6fd96c2cc26470", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "e4a3b331be081e62", + "gsd-core/templates/project.md": "fae14114f2b79b10", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -294,7 +296,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275", - "gsd-core/workflows/do.md": "1e6102574016b150", + "gsd-core/workflows/do.md": "d9a889717e390f8d", "gsd-core/workflows/docs-update.md": "79afaaf19fd527cc", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "926eda8bbee28b23", @@ -311,10 +313,10 @@ "gsd-core/workflows/graduation.md": "5cc8638dabcbfd40", "gsd-core/workflows/health.md": "064b3668d5d9569a", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "051f9633f45558b4", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0", + "gsd-core/workflows/help/modes/full.md": "775f766dfafb72f9", + "gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69", "gsd-core/workflows/import.md": "f8bbe6f2c0e08a78", "gsd-core/workflows/inbox.md": "a073396097c89c01", "gsd-core/workflows/ingest-docs.md": "29c1fe28bc93b345", @@ -332,6 +334,7 @@ "gsd-core/workflows/next.md": "888297a0b21888ea", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "f8c2842a2217f776", + "gsd-core/workflows/onboard.md": "78b288089305dc46", "gsd-core/workflows/pause-work.md": "a6e5336c409fdc8b", "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", "gsd-core/workflows/plan-phase.md": "03e59f06885e200f", @@ -437,7 +440,7 @@ "skills/gsd-inbox/SKILL.md": "34370c6138415209", "skills/gsd-ingest-docs/SKILL.md": "f049f06a6ec7da43", "skills/gsd-manager/SKILL.md": "a37ecdbe32952262", - "skills/gsd-map-codebase/SKILL.md": "e8c01704e8ada1d2", + "skills/gsd-map-codebase/SKILL.md": "e06d6ac1b7632cbe", "skills/gsd-mempalace-capture/SKILL.md": "f960b7b1a8fdf89b", "skills/gsd-mempalace-recall/SKILL.md": "2091c48e6e986e28", "skills/gsd-milestone-summary/SKILL.md": "da645171ca2299d8", @@ -448,9 +451,10 @@ "skills/gsd-ns-context/SKILL.md": "110fb2227bcde535", "skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc", "skills/gsd-ns-manage/SKILL.md": "2756981de613022e", - "skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26", + "skills/gsd-ns-project/SKILL.md": "56d3d8a321d267f8", "skills/gsd-ns-review/SKILL.md": "680bdd33c882b049", "skills/gsd-ns-workflow/SKILL.md": "579b7f0dac74e1fb", + "skills/gsd-onboard/SKILL.md": "0e3cc902f44b41b8", "skills/gsd-pause-work/SKILL.md": "34366b18a392a717", "skills/gsd-phase/SKILL.md": "64a241d4f8665aa2", "skills/gsd-plan-phase/SKILL.md": "c73cba04a26f0bfe", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index fce5a3af1..e8bbe4c2f 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -122,6 +122,7 @@ "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -207,7 +208,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "b811bf951092df2f", "gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370", - "gsd-core/templates/project.md": "ab4af6becca2bb23", + "gsd-core/templates/project.md": "4f311fb1b05b823b", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -260,7 +261,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/do.md": "7512dd1892f118a1", "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", @@ -277,10 +278,10 @@ "gsd-core/workflows/graduation.md": "47f1594c88c08501", "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", - "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "94c18706768e5a41", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0", + "gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50", + "gsd-core/workflows/help/modes/full.md": "ee47582c5d8d94a7", + "gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d", "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", @@ -298,6 +299,7 @@ "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", + "gsd-core/workflows/onboard.md": "6f9e6c0b484271a9", "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", "gsd-core/workflows/plan-phase.md": "2f16f3cc05fc59f1", @@ -380,7 +382,7 @@ "skills/gsd-inbox/SKILL.md": "955779a4b1df1c33", "skills/gsd-ingest-docs/SKILL.md": "6366644e623ae9e4", "skills/gsd-manager/SKILL.md": "8a11a1beb8e35a9c", - "skills/gsd-map-codebase/SKILL.md": "55dade835b0f4954", + "skills/gsd-map-codebase/SKILL.md": "73ab0afb2398de2c", "skills/gsd-mempalace-capture/SKILL.md": "64a2ec493092d26e", "skills/gsd-mempalace-recall/SKILL.md": "c6e0195e55cd934c", "skills/gsd-milestone-summary/SKILL.md": "3ea93ccaa0d4d967", @@ -391,9 +393,10 @@ "skills/gsd-ns-context/SKILL.md": "89f5bffe6702c0c5", "skills/gsd-ns-ideate/SKILL.md": "e0c0420f6878906a", "skills/gsd-ns-manage/SKILL.md": "b7fbe29e45e75f54", - "skills/gsd-ns-project/SKILL.md": "1292d4a6a4280ce9", + "skills/gsd-ns-project/SKILL.md": "fcb8a93ade9ecc72", "skills/gsd-ns-review/SKILL.md": "2ff62330379f947f", "skills/gsd-ns-workflow/SKILL.md": "86272fd655c206bc", + "skills/gsd-onboard/SKILL.md": "fd66b3c5b9c6a871", "skills/gsd-pause-work/SKILL.md": "95017c70ae9dca0d", "skills/gsd-phase/SKILL.md": "31578c329cc2583e", "skills/gsd-plan-phase/SKILL.md": "54798eddf30056b5", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index dacda292c..0eacc03a6 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -62,7 +62,7 @@ "command/gsd-inbox.md": "cc850bab897aed1f", "command/gsd-ingest-docs.md": "b47c812c247e58a4", "command/gsd-manager.md": "86ece154b34b6d1b", - "command/gsd-map-codebase.md": "1fb678f8a17a380e", + "command/gsd-map-codebase.md": "9aba6b4eed565912", "command/gsd-mempalace-capture.md": "a94ca275cbe7134c", "command/gsd-mempalace-recall.md": "d358cdd89c935877", "command/gsd-milestone-summary.md": "86a827271bc647c5", @@ -73,9 +73,10 @@ "command/gsd-ns-context.md": "9a2b55b64f2e1e4b", "command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f", "command/gsd-ns-manage.md": "eded59052ca4b240", - "command/gsd-ns-project.md": "91417cf7b76581dd", + "command/gsd-ns-project.md": "c56395edb9bc7467", "command/gsd-ns-review.md": "61fe33e28eb1b961", "command/gsd-ns-workflow.md": "13c1ab91080c0cc3", + "command/gsd-onboard.md": "3aafaeb5d3941efe", "command/gsd-pause-work.md": "bb5bf91a2e3e480e", "command/gsd-phase.md": "6bcda1539f949d5a", "command/gsd-plan-phase.md": "7ee44086b59862b9", @@ -156,6 +157,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "fbdf814a3af9c051", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "4e5af9905e4276e4", "gsd-core/references/honest-verifier.md": "b67482409f896a10", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -241,7 +243,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "ee8880432b4d1566", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "e4a3b331be081e62", + "gsd-core/templates/project.md": "fae14114f2b79b10", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -294,7 +296,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275", - "gsd-core/workflows/do.md": "d72e76d9050b53f3", + "gsd-core/workflows/do.md": "85c4c8cb7aa8af87", "gsd-core/workflows/docs-update.md": "850366c2ef8fb780", "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", "gsd-core/workflows/eval-review.md": "5394694d29ad7543", @@ -311,10 +313,10 @@ "gsd-core/workflows/graduation.md": "13080b5c24eec27d", "gsd-core/workflows/health.md": "a91e0a8e5d20b2e9", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "604993c20f4e4b20", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0", + "gsd-core/workflows/help/modes/full.md": "35598c0ed5f7356f", + "gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69", "gsd-core/workflows/import.md": "67fbf389ab8e57b4", "gsd-core/workflows/inbox.md": "a073396097c89c01", "gsd-core/workflows/ingest-docs.md": "82370f93c45c8015", @@ -332,6 +334,7 @@ "gsd-core/workflows/next.md": "6719a37b8ce2ac4f", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "0d1374f2a2257858", + "gsd-core/workflows/onboard.md": "102556e1715c01b9", "gsd-core/workflows/pause-work.md": "70c72beca55c080a", "gsd-core/workflows/plan-milestone-gaps.md": "0a9dacd422cd9533", "gsd-core/workflows/plan-phase.md": "3c49d9f4061b2388", @@ -438,7 +441,7 @@ "skills/gsd-inbox/SKILL.md": "3b2dd319d91dbab4", "skills/gsd-ingest-docs/SKILL.md": "8f294b4894f782a5", "skills/gsd-manager/SKILL.md": "cf40f237b4f20aa7", - "skills/gsd-map-codebase/SKILL.md": "6d74ea41e29ff035", + "skills/gsd-map-codebase/SKILL.md": "73f714297815f74c", "skills/gsd-mempalace-capture/SKILL.md": "f960b7b1a8fdf89b", "skills/gsd-mempalace-recall/SKILL.md": "2091c48e6e986e28", "skills/gsd-milestone-summary/SKILL.md": "175366bb500b5e64", @@ -449,9 +452,10 @@ "skills/gsd-ns-context/SKILL.md": "110fb2227bcde535", "skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc", "skills/gsd-ns-manage/SKILL.md": "2756981de613022e", - "skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26", + "skills/gsd-ns-project/SKILL.md": "56d3d8a321d267f8", "skills/gsd-ns-review/SKILL.md": "680bdd33c882b049", "skills/gsd-ns-workflow/SKILL.md": "579b7f0dac74e1fb", + "skills/gsd-onboard/SKILL.md": "ea0b1217e5ecae23", "skills/gsd-pause-work/SKILL.md": "c7e9ba4f242c4648", "skills/gsd-phase/SKILL.md": "ee78c0c56c814d84", "skills/gsd-plan-phase/SKILL.md": "6abcc3a1568a6bb9", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index bec6afbe0..67e5f5980 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -86,6 +86,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "bd249d9024c39c0d", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "10575c928ff9230d", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -171,7 +172,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "213ccd947451ff2b", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "1f687c7a88381080", + "gsd-core/templates/project.md": "ae1f68db042c2522", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -224,7 +225,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "35862ba1f7230247", + "gsd-core/workflows/do.md": "68f2607de614157d", "gsd-core/workflows/docs-update.md": "45d2f0d173c84e07", "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", "gsd-core/workflows/eval-review.md": "6dee8a1e40ececd4", @@ -241,10 +242,10 @@ "gsd-core/workflows/graduation.md": "40401655435beee3", "gsd-core/workflows/health.md": "043de14edb6a9723", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "cef457f954a9991e", - "gsd-core/workflows/help/modes/full.md": "1e1e826ba1da0bc5", - "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "7ca77077085452f5", + "gsd-core/workflows/help/modes/full.md": "00c1433a639f6ed8", + "gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9", "gsd-core/workflows/import.md": "e56c18a984396066", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", "gsd-core/workflows/ingest-docs.md": "f291310a8a89dbd8", @@ -262,6 +263,7 @@ "gsd-core/workflows/next.md": "c13515a80c20d37d", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", + "gsd-core/workflows/onboard.md": "3c50ed1f1fd07619", "gsd-core/workflows/pause-work.md": "be33f84dc1d4822f", "gsd-core/workflows/plan-milestone-gaps.md": "d98e98486123eb97", "gsd-core/workflows/plan-phase.md": "1cac08591d361397", @@ -343,7 +345,7 @@ "skills/gsd-ns-context/skills/docs-update/SKILL.md": "3d41e81ec571de60", "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "8d38e55e5f8b774b", "skills/gsd-ns-context/skills/graphify/SKILL.md": "ac3661e6e576188b", - "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "5009595dbde69739", + "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "cf65e61890448285", "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "40a31ad049374297", "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "c3f412d5a64f3921", "skills/gsd-ns-ideate/SKILL.md": "4a0d2691054b23e5", @@ -371,7 +373,7 @@ "skills/gsd-ns-manage/skills/update/SKILL.md": "530b4206d729b56d", "skills/gsd-ns-manage/skills/workspace/SKILL.md": "047c3f4247bc869e", "skills/gsd-ns-manage/skills/workstreams/SKILL.md": "f4e54cb9b1ca0442", - "skills/gsd-ns-project/SKILL.md": "a58b3170197968be", + "skills/gsd-ns-project/SKILL.md": "5d7ec93b195555e7", "skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "edb6a0cc6305d724", "skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "f6799a5a713be7bb", "skills/gsd-ns-project/skills/import/SKILL.md": "88f83921a85e536b", @@ -379,6 +381,7 @@ "skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "33d51a325d314f3a", "skills/gsd-ns-project/skills/new-milestone/SKILL.md": "ac99ffb8a966fe9d", "skills/gsd-ns-project/skills/new-project/SKILL.md": "9d5c27ebfa2c4746", + "skills/gsd-ns-project/skills/onboard/SKILL.md": "46460b479b7524bf", "skills/gsd-ns-project/skills/profile-user/SKILL.md": "78ca46045e85223f", "skills/gsd-ns-project/skills/review-backlog/SKILL.md": "1708aab6cb919223", "skills/gsd-ns-review/SKILL.md": "7badceb8627d8154", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index a045862ef..6f78043f4 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -86,6 +86,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "1bd40c3f94d712b1", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "0534754c2758352a", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -171,7 +172,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "213ccd947451ff2b", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "1f687c7a88381080", + "gsd-core/templates/project.md": "ae1f68db042c2522", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -224,7 +225,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "f3328dbd4416f11a", + "gsd-core/workflows/do.md": "5131e8796ba9d99b", "gsd-core/workflows/docs-update.md": "f13571f08e083356", "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", "gsd-core/workflows/eval-review.md": "37d545d4f0db4927", @@ -241,10 +242,10 @@ "gsd-core/workflows/graduation.md": "1ca877cda258a5de", "gsd-core/workflows/health.md": "1f9fd2deea45896f", "gsd-core/workflows/help.md": "08e1349950c5602a", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "1b3c315342701265", - "gsd-core/workflows/help/modes/full.md": "62c71f57f047999b", - "gsd-core/workflows/help/modes/topic.md": "229e3f3d85bda04b", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "ed7368e0d1b8644a", + "gsd-core/workflows/help/modes/full.md": "b3287aa383806758", + "gsd-core/workflows/help/modes/topic.md": "8a5344e56fa64ab9", "gsd-core/workflows/import.md": "31af58468db15daf", "gsd-core/workflows/inbox.md": "e9ea37b2d46dc5b4", "gsd-core/workflows/ingest-docs.md": "fba176ad3cc22f5f", @@ -262,6 +263,7 @@ "gsd-core/workflows/next.md": "2163195861877de5", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "acc9130fb1e94f0b", + "gsd-core/workflows/onboard.md": "61f111302af0f404", "gsd-core/workflows/pause-work.md": "c20d267e28ce92f0", "gsd-core/workflows/plan-milestone-gaps.md": "26db7b9329b7ddc8", "gsd-core/workflows/plan-phase.md": "fc7d25c0649e2fdf", @@ -321,7 +323,7 @@ "skills/gsd-ns-context/skills/docs-update/SKILL.md": "52755343585b987b", "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc", "skills/gsd-ns-context/skills/graphify/SKILL.md": "e0253aef14693a7e", - "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "0910348701b1fc65", + "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "2982436d8652f172", "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "36c486f14abe869a", "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "2d95e385fee26dee", "skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f", @@ -349,7 +351,7 @@ "skills/gsd-ns-manage/skills/update/SKILL.md": "2fc47bf059aa7b38", "skills/gsd-ns-manage/skills/workspace/SKILL.md": "257d17b9d20274d8", "skills/gsd-ns-manage/skills/workstreams/SKILL.md": "737841783c7fdd4f", - "skills/gsd-ns-project/SKILL.md": "5668e3a5e1d8896d", + "skills/gsd-ns-project/SKILL.md": "fac77a9e770fd655", "skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "0ccabc5556d65d56", "skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "a69d534b385d6aaf", "skills/gsd-ns-project/skills/import/SKILL.md": "a11e630bfd8ae4de", @@ -357,6 +359,7 @@ "skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "9d408f56712ba948", "skills/gsd-ns-project/skills/new-milestone/SKILL.md": "7cbc011130e8590c", "skills/gsd-ns-project/skills/new-project/SKILL.md": "ff0d57491df30624", + "skills/gsd-ns-project/skills/onboard/SKILL.md": "ae4c7b799d9ffb09", "skills/gsd-ns-project/skills/profile-user/SKILL.md": "4f526120cda2f6cc", "skills/gsd-ns-project/skills/review-backlog/SKILL.md": "d8a150558cc9326a", "skills/gsd-ns-review/SKILL.md": "c5afe33c212947dd", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index ae20090c1..ed1f715ea 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -86,6 +86,7 @@ "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "6ec36ea6b868655f", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "1bb6a410d6ebfb33", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -171,7 +172,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "213ccd947451ff2b", "gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f", - "gsd-core/templates/project.md": "1f687c7a88381080", + "gsd-core/templates/project.md": "ae1f68db042c2522", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -224,7 +225,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73", - "gsd-core/workflows/do.md": "a7ff800fdab468c7", + "gsd-core/workflows/do.md": "e2b848547e43c7a5", "gsd-core/workflows/docs-update.md": "70f73cc8c27e0ca0", "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", "gsd-core/workflows/eval-review.md": "b28be79ef29f16fd", @@ -241,10 +242,10 @@ "gsd-core/workflows/graduation.md": "a766039ff6ca653f", "gsd-core/workflows/health.md": "7b19d6e2c0357c3e", "gsd-core/workflows/help.md": "08e1349950c5602a", - "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", - "gsd-core/workflows/help/modes/default.md": "91509fe03bad9795", - "gsd-core/workflows/help/modes/full.md": "4c1a43f7095647e1", - "gsd-core/workflows/help/modes/topic.md": "177d351f7465787d", + "gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3", + "gsd-core/workflows/help/modes/default.md": "6a253f1756f74e95", + "gsd-core/workflows/help/modes/full.md": "0cd464dcd077bbfc", + "gsd-core/workflows/help/modes/topic.md": "cee80e0adfa3b06c", "gsd-core/workflows/import.md": "029cacf530aca86b", "gsd-core/workflows/inbox.md": "797c287852eb8957", "gsd-core/workflows/ingest-docs.md": "78ba04ca39f28e8d", @@ -262,6 +263,7 @@ "gsd-core/workflows/next.md": "d48cea140a5153cb", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "1c1e466c764e3deb", + "gsd-core/workflows/onboard.md": "20c28136423d40ac", "gsd-core/workflows/pause-work.md": "93fcc1c845da6396", "gsd-core/workflows/plan-milestone-gaps.md": "7880866ee1caf923", "gsd-core/workflows/plan-phase.md": "3e143f39514f8192", diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index bf1ba001e..8477fa97e 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -20,7 +20,7 @@ "discuss-phase-assumptions.md": 27028, "discuss-phase-power.md": 11273, "discuss-phase.md": 31986, - "do.md": 10112, + "do.md": 10353, "docs-update.md": 55706, "edit-phase.md": 12927, "eval-review.md": 9967, @@ -50,6 +50,7 @@ "next.md": 20138, "node-repair.md": 4173, "note.md": 6563, + "onboard.md": 8590, "pause-work.md": 14441, "plan-milestone-gaps.md": 11809, "plan-phase.md": 90455, From 3fe9a81428596319f4fcbd26b25860bbeb5afcd8 Mon Sep 17 00:00:00 2001 From: Joe Slitzker Date: Fri, 3 Jul 2026 08:40:20 -0500 Subject: [PATCH 43/75] fix(#1941): degrade /gsd-quick worktree dispatch when fork base is stale Claude Code's isolation="worktree" forks new worktrees from origin/HEAD, not the live local HEAD. When prior local commits (e.g. an earlier quick task in the same session, or this task's own Step 5.6 pre-dispatch plan commit) advance local HEAD without an intervening push, origin/HEAD stays pinned to a stale ancestor and the executor's worktree_branch_check guard halts with a base-mismatch fatal that can be many commits behind, not just one. Port the worktree.base-check auto-degrade pattern already used by execute-phase (#683/#1369) into quick.md's single-dispatch path, run immediately before EXPECTED_BASE is captured in Step 6. --- gsd-core/workflows/quick.md | 20 +++ ...ix-1941-quick-worktree-stale-base.test.cjs | 76 +++++++++ tests/workflow-size-baseline.json | 155 +++++++++--------- 3 files changed, 173 insertions(+), 78 deletions(-) create mode 100644 tests/fix-1941-quick-worktree-stale-base.test.cjs diff --git a/gsd-core/workflows/quick.md b/gsd-core/workflows/quick.md index 40668ff58..fc9f98756 100644 --- a/gsd-core/workflows/quick.md +++ b/gsd-core/workflows/quick.md @@ -671,6 +671,26 @@ fi **Step 6: Spawn executor** +Auto-degrade to sequential if HEAD has diverged from the worktree fork base (#1941, mirrors +execute-phase's #683/#1369 guard). Claude Code's `isolation="worktree"` forks new worktrees from +`origin/HEAD`, not the live local HEAD. If a prior quick task in this session (or the Step 5.6 +pre-dispatch plan commit above) advanced local HEAD without an intervening `git push`, +`origin/HEAD` stays pinned to a stale ancestor and the executor's `worktree_branch_check` guard +halts with a base-mismatch fatal — potentially many commits behind, not just one. Run this check +immediately before capturing `EXPECTED_BASE` so it reflects the most current local state. + +```bash +if [ "$RUNTIME" = "claude" ] && [ "${USE_WORKTREES:-true}" != "false" ]; then + _QUICK_SHOULD_DEGRADE=$(gsd_run query worktree.base-check --pick shouldDegrade 2>/dev/null || true) + if [ "$_QUICK_SHOULD_DEGRADE" = "true" ]; then + _QUICK_DEGRADE_MSG=$(gsd_run query worktree.base-check --pick message 2>/dev/null || true) + [ -n "$_QUICK_DEGRADE_MSG" ] && printf '%s\n' "$_QUICK_DEGRADE_MSG" >&2 + echo "⚠ [#1941] Worktree fork base diverged from orchestrator HEAD — auto-degrading to sequential mode for this quick task to avoid a base-mismatch halt." >&2 + USE_WORKTREES=false + fi +fi +``` + Capture current HEAD before spawning (used for worktree branch check): ```bash EXPECTED_BASE=$(git rev-parse HEAD) diff --git a/tests/fix-1941-quick-worktree-stale-base.test.cjs b/tests/fix-1941-quick-worktree-stale-base.test.cjs new file mode 100644 index 000000000..0b59589dd --- /dev/null +++ b/tests/fix-1941-quick-worktree-stale-base.test.cjs @@ -0,0 +1,76 @@ +// allow-test-rule: source-text-is-the-product #1941 +// Workflow .md files are the installed AI instructions — their text IS what the runtime +// loads. Testing text content tests the deployed contract. Per CONTRIBUTING.md exception matrix. + +/** + * Regression tests for bug #1941: /gsd-quick worktree executor forks from a stale base — + * up to many commits behind, not just the one-commit gap #1265 already covers. + * + * Root cause: Claude Code's isolation="worktree" forks new worktrees from origin/HEAD, not + * the live local HEAD. When prior local commits (e.g. earlier quick tasks in the same + * session, or this task's own Step 5.6 pre-dispatch plan commit) advance local HEAD without + * an intervening `git push`, origin/HEAD stays pinned to a stale ancestor and the executor's + * worktree_branch_check guard halts with a base-mismatch fatal. The fix ports the + * worktree.base-check auto-degrade pattern already used by execute-phase (#683/#1369) into + * quick.md's single-dispatch path. + */ + +const { test, describe } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('fs'); +const path = require('path'); + +const WORKFLOW_PATH = path.join(__dirname, '..', 'gsd-core', 'workflows', 'quick.md'); + +describe('quick: pre-dispatch worktree base re-check (#1941)', () => { + test('workflow file exists', () => { + assert.ok(fs.existsSync(WORKFLOW_PATH), 'workflows/quick.md should exist'); + }); + + test('Step 6 runs worktree.base-check before capturing EXPECTED_BASE', () => { + const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8'); + const step6Idx = content.indexOf('**Step 6: Spawn executor**'); + const baseCheckIdx = content.indexOf('worktree.base-check', step6Idx); + const expectedBaseIdx = content.indexOf('EXPECTED_BASE=$(git rev-parse HEAD)', step6Idx); + assert.ok(step6Idx !== -1, '"Step 6: Spawn executor" must exist in quick.md'); + assert.ok(baseCheckIdx !== -1, 'worktree.base-check must be invoked within Step 6'); + assert.ok(expectedBaseIdx !== -1, 'EXPECTED_BASE capture must exist within Step 6'); + assert.ok( + baseCheckIdx < expectedBaseIdx, + 'worktree.base-check must run BEFORE EXPECTED_BASE is captured so the degrade decision reflects the most current local HEAD' + ); + }); + + test('degrade check references #1941 for traceability', () => { + const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8'); + assert.ok(content.includes('#1941'), 'quick.md must reference #1941'); + }); + + test('degrade check sets USE_WORKTREES=false when shouldDegrade is true', () => { + const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8'); + const baseCheckIdx = content.indexOf('worktree.base-check'); + const block = content.slice(baseCheckIdx, baseCheckIdx + 600); + assert.ok( + block.includes('shouldDegrade') && block.includes('USE_WORKTREES=false'), + 'degrade check must override USE_WORKTREES=false when shouldDegrade is true' + ); + }); + + test('degrade check guards on RUNTIME=claude (worktree isolation is Claude Code-specific)', () => { + const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8'); + const baseCheckIdx = content.indexOf('worktree.base-check'); + const block = content.slice(Math.max(0, baseCheckIdx - 200), baseCheckIdx + 200); + assert.ok( + block.includes('RUNTIME') && (block.includes('"claude"') || block.includes("'claude'")), + 'degrade check must guard on RUNTIME=claude' + ); + }); + + test('degrade check names origin/HEAD as the stale fork base', () => { + const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8'); + const step6Idx = content.indexOf('**Step 6: Spawn executor**'); + const nextSection = content.indexOf('\n---', step6Idx); + const section = content.slice(step6Idx, nextSection === -1 ? undefined : nextSection); + assert.ok(section.includes('origin/HEAD'), 'Step 6 must name origin/HEAD as the stale fork base'); + }); +}); diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index c5f07afdb..eb71f2dd8 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -1,92 +1,91 @@ { - "add-backlog.md": 7176, - "add-phase.md": 7247, - "add-tests.md": 16945, - "add-todo.md": 8996, - "ai-integration-phase.md": 14805, + "add-backlog.md": 7132, + "add-phase.md": 7203, + "add-tests.md": 16901, + "add-todo.md": 8952, + "ai-integration-phase.md": 14761, "analyze-dependencies.md": 3887, - "audit-fix.md": 11032, - "audit-milestone.md": 17681, - "audit-uat.md": 7469, - "autonomous.md": 42474, - "check-todos.md": 9475, - "cleanup.md": 9941, - "code-review-fix.md": 23934, - "code-review.md": 31646, - "complete-milestone.md": 31071, - "debug.md": 13549, - "diagnose-issues.md": 12864, + "audit-fix.md": 10988, + "audit-milestone.md": 17637, + "audit-uat.md": 7425, + "autonomous.md": 42430, + "check-todos.md": 9431, + "cleanup.md": 9897, + "code-review-fix.md": 23890, + "code-review.md": 31602, + "complete-milestone.md": 31027, + "debug.md": 13505, + "diagnose-issues.md": 12820, "discovery-phase.md": 8651, - "discuss-phase-assumptions.md": 27028, + "discuss-phase-assumptions.md": 26984, "discuss-phase-power.md": 11273, - "discuss-phase.md": 31986, - "do.md": 10112, - "docs-update.md": 55706, - "edit-phase.md": 12927, - "eval-review.md": 9967, - "execute-phase.md": 93528, - "execute-plan.md": 32655, - "explore.md": 10541, - "extract-learnings.md": 12893, + "discuss-phase.md": 31990, + "do.md": 10068, + "docs-update.md": 55662, + "edit-phase.md": 12883, + "eval-review.md": 9923, + "execute-phase.md": 93515, + "execute-plan.md": 32611, + "explore.md": 10497, + "extract-learnings.md": 12849, "fast.md": 4149, - "forensics.md": 12531, - "graduation.md": 11622, - "health.md": 11868, + "forensics.md": 12487, + "graduation.md": 11578, + "health.md": 11824, "help.md": 1722, - "import.md": 14648, + "import.md": 14604, "inbox.md": 14407, - "ingest-docs.md": 18380, - "insert-phase.md": 8987, + "ingest-docs.md": 18336, + "insert-phase.md": 8943, "list-phase-assumptions.md": 4305, - "list-seeds.md": 6987, - "list-workspaces.md": 5699, - "manager.md": 27302, - "map-codebase.md": 20833, - "milestone-summary.md": 11842, - "mvp-phase.md": 13626, - "new-milestone.md": 32888, - "new-project.md": 66182, - "new-workspace.md": 11298, - "next.md": 20138, + "list-seeds.md": 6943, + "list-workspaces.md": 5655, + "manager.md": 27258, + "map-codebase.md": 20789, + "milestone-summary.md": 11798, + "mvp-phase.md": 13582, + "new-milestone.md": 32844, + "new-project.md": 66138, + "new-workspace.md": 11254, + "next.md": 20094, "node-repair.md": 4173, "note.md": 6563, - "pause-work.md": 14441, - "plan-milestone-gaps.md": 11809, - "plan-phase.md": 90455, - "plan-review-convergence.md": 23512, - "plant-seed.md": 11785, - "pr-branch.md": 15963, - "profile-user.md": 21246, - "progress.md": 30599, - "quick.md": 49183, - "reapply-patches.md": 20312, - "remove-phase.md": 8513, - "remove-workspace.md": 7551, - "resume-project.md": 17270, - "review.md": 43356, - "scan.md": 7732, - "secure-phase.md": 13520, + "pause-work.md": 14397, + "plan-milestone-gaps.md": 11765, + "plan-phase.md": 89775, + "plan-review-convergence.md": 23468, + "plant-seed.md": 11741, + "pr-branch.md": 15919, + "profile-user.md": 21202, + "progress.md": 30555, + "quick.md": 50408, + "reapply-patches.md": 20393, + "remove-phase.md": 8469, + "remove-workspace.md": 7507, + "resume-project.md": 17226, + "review.md": 40956, + "scan.md": 7688, + "secure-phase.md": 13476, "session-report.md": 4044, - "settings-advanced.md": 39718, - "settings-integrations.md": 15892, - "settings.md": 33457, - "ship.md": 24691, - "sketch-wrap-up.md": 14267, - "sketch.md": 20004, - "smart-entry.md": 11124, - "spec-phase.md": 31945, - "spike-wrap-up.md": 15136, - "spike.md": 24561, - "stats.md": 6762, + "settings-advanced.md": 39646, + "settings-integrations.md": 15848, + "settings.md": 33413, + "ship.md": 24647, + "sketch-wrap-up.md": 14223, + "sketch.md": 19960, + "spec-phase.md": 31752, + "spike-wrap-up.md": 15092, + "spike.md": 24517, + "stats.md": 6718, "sync-skills.md": 6125, - "thread.md": 12508, - "transition.md": 22060, - "ui-phase.md": 15521, - "ui-review.md": 11216, - "ultraplan-phase.md": 10512, + "thread.md": 12464, + "transition.md": 22016, + "ui-phase.md": 15477, + "ui-review.md": 11172, + "ultraplan-phase.md": 10468, "undo.md": 10431, - "update.md": 20914, - "validate-phase.md": 10789, - "verify-phase.md": 40772, - "verify-work.md": 38267 + "update.md": 21053, + "validate-phase.md": 10745, + "verify-phase.md": 40728, + "verify-work.md": 35171 } From 0bfacc4970562b6b6a532e24d699fff01881117b Mon Sep 17 00:00:00 2001 From: Joe Slitzker Date: Fri, 3 Jul 2026 09:42:44 -0500 Subject: [PATCH 44/75] docs(#1991): add changeset fragment for stale worktree base fix --- .changeset/eager-tunas-swim.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eager-tunas-swim.md diff --git a/.changeset/eager-tunas-swim.md b/.changeset/eager-tunas-swim.md new file mode 100644 index 000000000..5a77fc331 --- /dev/null +++ b/.changeset/eager-tunas-swim.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 1991 +--- +**`/gsd-quick` no longer halts with a stale-base worktree mismatch** — the worktree executor now degrades to sequential execution when its fork base has diverged from origin/HEAD, instead of spawning a worktree guaranteed to fail the base-mismatch guard. From ba60317215c4a3fee9052f8740a948a1f70b7a6a Mon Sep 17 00:00:00 2001 From: Joe Slitzker Date: Fri, 3 Jul 2026 09:46:33 -0500 Subject: [PATCH 45/75] docs(#1941): note /gsd-quick auto-degrade in worktree base-mismatch how-to The how-to doc for the exit-42 worktree base-mismatch error only mentioned /gsd-execute-phase. Now that /gsd-quick has the same auto-degrade guard, the doc should reflect both entry points. --- docs/how-to/fix-worktree-base-mismatch.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/how-to/fix-worktree-base-mismatch.md b/docs/how-to/fix-worktree-base-mismatch.md index 16b445198..e442d26ff 100644 --- a/docs/how-to/fix-worktree-base-mismatch.md +++ b/docs/how-to/fix-worktree-base-mismatch.md @@ -1,16 +1,16 @@ # How to fix the worktree base-mismatch (exit 42) error -**Goal:** Understand why `/gsd-execute-phase` halts with `FATAL: worktree base mismatch` / exit 42 when your branch is ahead of the default branch, and choose the right fix to restore normal — or parallel — execution. +**Goal:** Understand why `/gsd-execute-phase` or `/gsd-quick` halts with `FATAL: worktree base mismatch` / exit 42 when your branch is ahead of the default branch, and choose the right fix to restore normal — or parallel — execution. -**Prerequisites:** GSD Core is installed and you have an active project. You have run `/gsd-execute-phase` and either seen the exit-42 error or the one-line `⚠ Worktree base mismatch` warning. +**Prerequisites:** GSD Core is installed and you have an active project. You have run `/gsd-execute-phase` or `/gsd-quick` and either seen the exit-42 error or the one-line `⚠ Worktree base mismatch` warning. --- ## What you will see -When you run `/gsd-execute-phase` on a branch that is ahead of the repository's default branch (for example, an unmerged milestone branch, a long-lived feature branch, or a branch with commits not yet in `origin/HEAD`), you may see one of two messages: +When you run `/gsd-execute-phase` or `/gsd-quick` on a branch that is ahead of the repository's default branch (for example, an unmerged milestone branch, a long-lived feature branch, or a branch with commits not yet in `origin/HEAD`), you may see one of two messages: -**Automatic-degrade warning (phase still completes):** +**Automatic-degrade warning (phase or quick task still completes):** ``` ⚠ Worktree base mismatch: HEAD (abc12345) differs from origin/HEAD (def67890). @@ -19,7 +19,7 @@ To keep parallel worktrees, set worktree.baseRef:"head" in .claude/settings.local.json (or run: gsd-tools worktree set-baseref). See #683. ``` -The phase runs to completion sequentially; nothing is blocked. This is the runtime mitigation. +The phase or quick task runs to completion sequentially; nothing is blocked. This is the runtime mitigation (`/gsd-execute-phase`: #683/#1369; `/gsd-quick`: #1941). **Exit-42 halt (older installs or misconfigured environments):** From 61421709acb1afa45f88965f2451ef123f5d2e6b Mon Sep 17 00:00:00 2001 From: Joe Slitzker Date: Fri, 3 Jul 2026 10:07:05 -0500 Subject: [PATCH 46/75] test(#1941): regenerate golden install-parity fixtures for quick.md change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The quick.md fix in this PR changes the file content, so its per-runtime content hash in the golden-install-parity snapshot (tests/golden-install-parity.test.cjs, Linux/macOS-only) is stale. Regenerated with UPDATE_GOLDEN=1 on Linux (WSL); only the gsd-core/workflows/quick.md hash line changed in each of the 16 runtime fixtures — no other drift. --- .../golden-install-parity/antigravity.json | 219 ++++++++------- .../golden-install-parity/augment.json | 228 ++++++++-------- .../golden-install-parity/claude.json | 225 ++++++++-------- .../fixtures/golden-install-parity/cline.json | 221 ++++++++------- .../golden-install-parity/codebuddy.json | 228 ++++++++-------- .../fixtures/golden-install-parity/codex.json | 253 +++++++++--------- .../golden-install-parity/copilot.json | 225 ++++++++-------- .../golden-install-parity/cursor.json | 226 ++++++++-------- .../golden-install-parity/hermes.json | 225 ++++++++-------- .../fixtures/golden-install-parity/kilo.json | 226 ++++++++-------- .../fixtures/golden-install-parity/kimi.json | 221 ++++++++------- .../golden-install-parity/opencode.json | 226 ++++++++-------- .../fixtures/golden-install-parity/qwen.json | 225 ++++++++-------- .../fixtures/golden-install-parity/trae.json | 219 ++++++++------- .../golden-install-parity/windsurf.json | 212 ++++++++------- 15 files changed, 1665 insertions(+), 1714 deletions(-) diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index dfa090c3c..1638baf1f 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -4,46 +4,45 @@ "agents/gsd-advisor-researcher.md": "45af60c237748ee1", "agents/gsd-ai-researcher.md": "ba8898d9e739a501", "agents/gsd-assumptions-analyzer.md": "00a02fdcbaa8d833", - "agents/gsd-code-fixer.md": "6937a1f20beaa1c6", + "agents/gsd-code-fixer.md": "d8b6c16731f3b3d0", "agents/gsd-code-reviewer.md": "a700d295bbf110a9", "agents/gsd-codebase-mapper.md": "afdae82284cb21b4", - "agents/gsd-debug-session-manager.md": "5ea82765fc041ad7", - "agents/gsd-debugger.md": "7439166a1770521c", + "agents/gsd-debug-session-manager.md": "88a3726efbc28eed", + "agents/gsd-debugger.md": "bbefb65861d9d8ef", "agents/gsd-doc-classifier.md": "6dde566846b268b0", "agents/gsd-doc-synthesizer.md": "6286afdbd9a74fe0", "agents/gsd-doc-verifier.md": "888c6ac870cb91a6", "agents/gsd-doc-writer.md": "d4400c8dab4a9efc", "agents/gsd-domain-researcher.md": "1db46cac3f4d9889", - "agents/gsd-eval-auditor.md": "1b8391f1aafb067f", + "agents/gsd-eval-auditor.md": "62560f29308426d9", "agents/gsd-eval-planner.md": "3d10fd11147f6857", - "agents/gsd-executor.md": "152ca51a10b99ff8", + "agents/gsd-executor.md": "d7dedecb2206d678", "agents/gsd-framework-selector.md": "daa62c79619c76bf", "agents/gsd-integration-checker.md": "0643cd2d779b131c", - "agents/gsd-intel-updater.md": "26c1f1e028c6346a", - "agents/gsd-mempalace-curator.md": "dafdc4394d514a93", + "agents/gsd-intel-updater.md": "c2a053ffbe79cc74", + "agents/gsd-mempalace-curator.md": "a7269018acb973ce", "agents/gsd-nyquist-auditor.md": "805a1404d03629f1", "agents/gsd-pattern-mapper.md": "e62ee90d39084802", - "agents/gsd-phase-researcher.md": "cff1196c8e8bb4fa", - "agents/gsd-plan-checker.md": "dd1e7cdc837d8f3e", - "agents/gsd-planner.md": "b6d821f77fd8d7bd", - "agents/gsd-project-researcher.md": "85de7f562872ee9b", - "agents/gsd-research-synthesizer.md": "18a2e1b30ff7ae3a", + "agents/gsd-phase-researcher.md": "cbb4b284487af598", + "agents/gsd-plan-checker.md": "1db919c3b317c2e3", + "agents/gsd-planner.md": "ee43904ee3d880d7", + "agents/gsd-project-researcher.md": "6caac1da8969c8cd", + "agents/gsd-research-synthesizer.md": "50dc93f1034141ac", "agents/gsd-roadmapper.md": "7a8465ac6d4dd29e", "agents/gsd-security-auditor.md": "2ce13af25179dd10", "agents/gsd-ui-auditor.md": "f777f9c7bf62788c", "agents/gsd-ui-checker.md": "9c113a9c6b63385c", - "agents/gsd-ui-researcher.md": "5d74011a96e5b67f", + "agents/gsd-ui-researcher.md": "3c85adc5c3f76f40", "agents/gsd-user-profiler.md": "25d65f6458454764", - "agents/gsd-verifier.md": "224e8df2d8fd1d95", + "agents/gsd-verifier.md": "d2bd23b62f95a64f", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", - "gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6", + "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "8bc541aabc2e143c", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -107,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "49fbbfdac6b8ced4", + "gsd-core/references/planning-config.md": "8ce19741d18507f7", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -191,120 +190,119 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "8cc2e884a021b79b", - "gsd-core/workflows/add-phase.md": "f82afa2f93be19fa", - "gsd-core/workflows/add-tests.md": "f695210f67d2635e", - "gsd-core/workflows/add-todo.md": "de1ac76acfcc0133", - "gsd-core/workflows/ai-integration-phase.md": "22f5466085c47c00", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "a2d025013d8ef7fd", + "gsd-core/workflows/add-phase.md": "b619b3402c1e95db", + "gsd-core/workflows/add-tests.md": "206ccd9c8f25fac9", + "gsd-core/workflows/add-todo.md": "a995f9f4b11fcf23", + "gsd-core/workflows/ai-integration-phase.md": "f2fefee40ec7413c", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "44e9b0a78eb79311", - "gsd-core/workflows/audit-milestone.md": "77089ccd7b45c0f0", - "gsd-core/workflows/audit-uat.md": "ea8ddd910ed16ba4", - "gsd-core/workflows/autonomous.md": "603ce2019835f00e", - "gsd-core/workflows/check-todos.md": "5a62092df800ad7c", - "gsd-core/workflows/cleanup.md": "12c8fd85d3010fe6", - "gsd-core/workflows/code-review-fix.md": "5738cb929c995008", - "gsd-core/workflows/code-review.md": "d454365f1704d0bc", - "gsd-core/workflows/complete-milestone.md": "aaf272074acec69d", - "gsd-core/workflows/debug.md": "68f1ddc74886ebe5", - "gsd-core/workflows/diagnose-issues.md": "c8c41993c277363c", + "gsd-core/workflows/audit-fix.md": "9787a0ef00be649c", + "gsd-core/workflows/audit-milestone.md": "5e73ad8112a9b9b4", + "gsd-core/workflows/audit-uat.md": "777262a63dcaacdc", + "gsd-core/workflows/autonomous.md": "63c2fff9373e2f2c", + "gsd-core/workflows/check-todos.md": "f6a93906922dd939", + "gsd-core/workflows/cleanup.md": "53aa20672fe253bd", + "gsd-core/workflows/code-review-fix.md": "715d98a6ff5931e2", + "gsd-core/workflows/code-review.md": "d3d22e8705ab8323", + "gsd-core/workflows/complete-milestone.md": "f3fd3c8fc7bd1616", + "gsd-core/workflows/debug.md": "5ec71cc100973523", + "gsd-core/workflows/diagnose-issues.md": "4d80e23ab8adf2d7", "gsd-core/workflows/discovery-phase.md": "3de990caffdde4f8", - "gsd-core/workflows/discuss-phase-assumptions.md": "42210a0cbe1bac70", + "gsd-core/workflows/discuss-phase-assumptions.md": "5758ef496180a20c", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "c0a977154470b7f5", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "ab0c68941386998b", + "gsd-core/workflows/discuss-phase.md": "19659f106fa0f53e", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "47ec4454046099c6", "gsd-core/workflows/discuss-phase/modes/all.md": "e5fe9c9c1e2bec1a", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "c412dfbb5d536935", + "gsd-core/workflows/discuss-phase/modes/auto.md": "5256d93dca08278e", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "a6f486a303c9bd53", + "gsd-core/workflows/discuss-phase/modes/chain.md": "3a90a0c95016f7c5", "gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c", "gsd-core/workflows/discuss-phase/modes/power.md": "96822b22c42d75e8", "gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "22adc4ed8589a015", - "gsd-core/workflows/docs-update.md": "8e986e26d0e6e1a0", - "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", - "gsd-core/workflows/eval-review.md": "eb4040eaa5b8497f", - "gsd-core/workflows/execute-phase.md": "97453d3b8f49f27f", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "55d0706e80a2554a", + "gsd-core/workflows/do.md": "ecf6a2ae3c27c2af", + "gsd-core/workflows/docs-update.md": "1c3a0d23ecc9605c", + "gsd-core/workflows/edit-phase.md": "f685fb7063616826", + "gsd-core/workflows/eval-review.md": "2da6215ce79b2f7c", + "gsd-core/workflows/execute-phase.md": "e7713d986ebf45e0", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1da22ba32f524c6e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "687513ef1010180e", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bb9113e7bf953797", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "907af77eafc3d97b", - "gsd-core/workflows/explore.md": "934c00f9f216dbdb", - "gsd-core/workflows/extract-learnings.md": "167ea7f0e23bf496", + "gsd-core/workflows/execute-plan.md": "7a8c667c3587a985", + "gsd-core/workflows/explore.md": "d9593c9f00250e53", + "gsd-core/workflows/extract-learnings.md": "caa2ff0160b6ed9c", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "b64f0309b8c3fde1", - "gsd-core/workflows/graduation.md": "a9d8f15ba81a993f", - "gsd-core/workflows/health.md": "1ac4d567ee95acfb", + "gsd-core/workflows/forensics.md": "3ebc3a7f48132e04", + "gsd-core/workflows/graduation.md": "b401418dfea2b0f5", + "gsd-core/workflows/health.md": "3ab04acb14942ddd", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "0e253248c1c2e063", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", - "gsd-core/workflows/import.md": "41c62ae199209a68", + "gsd-core/workflows/help/modes/full.md": "3c3b67b4eb28cd82", + "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", + "gsd-core/workflows/import.md": "3cbe85643922fd3b", "gsd-core/workflows/inbox.md": "a448220c548f27bc", - "gsd-core/workflows/ingest-docs.md": "e2707f28f67d128b", - "gsd-core/workflows/insert-phase.md": "cdd83cf77d0f7485", + "gsd-core/workflows/ingest-docs.md": "783e0380797478cc", + "gsd-core/workflows/insert-phase.md": "d48c4aa1e864c852", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "3a8b612306ecf9c3", - "gsd-core/workflows/list-workspaces.md": "f6b1bc9fa13cc155", - "gsd-core/workflows/manager.md": "77133c13a8d303d5", - "gsd-core/workflows/map-codebase.md": "c81444eb0b2e038b", - "gsd-core/workflows/milestone-summary.md": "c4620853fe489126", - "gsd-core/workflows/mvp-phase.md": "5f0e355ff4583d67", - "gsd-core/workflows/new-milestone.md": "62aea018fb72b958", - "gsd-core/workflows/new-project.md": "f336b2da5c3963f0", - "gsd-core/workflows/new-workspace.md": "21bfae58b9cc2990", - "gsd-core/workflows/next.md": "8beefb4335dd7c41", + "gsd-core/workflows/list-seeds.md": "084c87cd310119b2", + "gsd-core/workflows/list-workspaces.md": "69aa6dcd8f63bb8a", + "gsd-core/workflows/manager.md": "187e2df237bcf418", + "gsd-core/workflows/map-codebase.md": "ea0ad99dd10c3d1c", + "gsd-core/workflows/milestone-summary.md": "d442c6719944f276", + "gsd-core/workflows/mvp-phase.md": "cd39027462579233", + "gsd-core/workflows/new-milestone.md": "f13199a8e199298f", + "gsd-core/workflows/new-project.md": "b8dc0226e885ea9c", + "gsd-core/workflows/new-workspace.md": "70dec4f25df02d64", + "gsd-core/workflows/next.md": "c45606fc89965aed", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "3ce09c0aa0a20599", - "gsd-core/workflows/pause-work.md": "564de32981a24337", - "gsd-core/workflows/plan-milestone-gaps.md": "dd6a4b3a8b05ab6e", - "gsd-core/workflows/plan-phase.md": "cb56e635fef4d3f3", + "gsd-core/workflows/pause-work.md": "3196d681d4dd8c71", + "gsd-core/workflows/plan-milestone-gaps.md": "94b193dfc9ca3681", + "gsd-core/workflows/plan-phase.md": "659b52bd338720fe", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "ab0b22244c3389aa", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "473d4d6e5b1f6340", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "d9f71484272b4b70", - "gsd-core/workflows/plant-seed.md": "6cf726be6427a35a", - "gsd-core/workflows/pr-branch.md": "dc5598ae8accdecd", - "gsd-core/workflows/profile-user.md": "355af92ac285567f", - "gsd-core/workflows/progress.md": "79a11ce798082054", - "gsd-core/workflows/quick.md": "a6aa362881f4e5da", - "gsd-core/workflows/reapply-patches.md": "4dcd6117d0a507ca", - "gsd-core/workflows/remove-phase.md": "23b9eb0858a2535e", - "gsd-core/workflows/remove-workspace.md": "d0bd7e0601138798", - "gsd-core/workflows/resume-project.md": "98e2cf8908e73a52", - "gsd-core/workflows/review.md": "9bc686206c96748c", - "gsd-core/workflows/scan.md": "a7fecd67e5cd655f", - "gsd-core/workflows/secure-phase.md": "96b199dfac00e60f", + "gsd-core/workflows/plan-review-convergence.md": "b1623082557cdca5", + "gsd-core/workflows/plant-seed.md": "1fb45cd49f66f572", + "gsd-core/workflows/pr-branch.md": "c8fd9fa250cb39fd", + "gsd-core/workflows/profile-user.md": "7b894598e26133b2", + "gsd-core/workflows/progress.md": "6087275a7ef3d84f", + "gsd-core/workflows/quick.md": "22855a8335147945", + "gsd-core/workflows/reapply-patches.md": "825e37a55a992892", + "gsd-core/workflows/remove-phase.md": "6b9947fba1a97f46", + "gsd-core/workflows/remove-workspace.md": "95f05defffe6754e", + "gsd-core/workflows/resume-project.md": "cadf390bae95fc76", + "gsd-core/workflows/review.md": "aa08449a6a180944", + "gsd-core/workflows/scan.md": "f2754f3e3ea528ff", + "gsd-core/workflows/secure-phase.md": "78705b7f09612464", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "f2f8c750101cb9ee", - "gsd-core/workflows/settings-integrations.md": "4d3001ad2b5dad8f", - "gsd-core/workflows/settings.md": "4017f3f235051902", - "gsd-core/workflows/ship.md": "984bd7660e7791fd", - "gsd-core/workflows/sketch-wrap-up.md": "0f842a609851a401", - "gsd-core/workflows/sketch.md": "314b7d323c6b57eb", - "gsd-core/workflows/smart-entry.md": "3ce5b6228238fdb6", - "gsd-core/workflows/spec-phase.md": "11c9e6b01bd2880a", - "gsd-core/workflows/spike-wrap-up.md": "8db41edc87cb7886", - "gsd-core/workflows/spike.md": "dd8d139947a8fb31", - "gsd-core/workflows/stats.md": "b64bda5c0a1a06fb", + "gsd-core/workflows/settings-advanced.md": "911234c3234b6929", + "gsd-core/workflows/settings-integrations.md": "83360968c4436bd1", + "gsd-core/workflows/settings.md": "a107a377ddeffed7", + "gsd-core/workflows/ship.md": "438fbd3ec509c1f1", + "gsd-core/workflows/sketch-wrap-up.md": "ab9fbb7371ef36bf", + "gsd-core/workflows/sketch.md": "114ca2455c2eb6fc", + "gsd-core/workflows/spec-phase.md": "5d6f0c480c0b251d", + "gsd-core/workflows/spike-wrap-up.md": "e2f251b7c8bfa2b2", + "gsd-core/workflows/spike.md": "0f9a81bcf4573195", + "gsd-core/workflows/stats.md": "a20eb078d2ab11be", "gsd-core/workflows/sync-skills.md": "8326a7ff0411b077", - "gsd-core/workflows/thread.md": "31201839d0530e89", - "gsd-core/workflows/transition.md": "3eb5edaa5c95c0de", - "gsd-core/workflows/ui-phase.md": "44f44a8aa7df3cfb", - "gsd-core/workflows/ui-review.md": "ba558aaf1ad9f58d", - "gsd-core/workflows/ultraplan-phase.md": "d8e92b0b7214eba6", + "gsd-core/workflows/thread.md": "3fb6b552e45fedbd", + "gsd-core/workflows/transition.md": "a7a5fe4040084308", + "gsd-core/workflows/ui-phase.md": "652785fbba26e80c", + "gsd-core/workflows/ui-review.md": "816b2bde136157f9", + "gsd-core/workflows/ultraplan-phase.md": "2404a01cb2e0c450", "gsd-core/workflows/undo.md": "6ab639d1fc7e0721", - "gsd-core/workflows/update.md": "2c58df5e21c41c31", - "gsd-core/workflows/validate-phase.md": "6c0ab739d15709fa", - "gsd-core/workflows/verify-phase.md": "8070a098ab538b33", - "gsd-core/workflows/verify-work.md": "be699ed7920f61b0", + "gsd-core/workflows/update.md": "dc93f366e2156e37", + "gsd-core/workflows/validate-phase.md": "5bac28c71d21c740", + "gsd-core/workflows/verify-phase.md": "e7059c04c816e62d", + "gsd-core/workflows/verify-work.md": "d1f5cfc8e22b7ce7", "hooks/gsd-check-update-worker.js": "fa301e6366270d5f", "hooks/gsd-check-update.js": "4617a98bf529e4c3", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -368,19 +366,18 @@ "skills/gsd-ingest-docs/SKILL.md": "f4e43968af317ed8", "skills/gsd-manager/SKILL.md": "6e51785860784d8c", "skills/gsd-map-codebase/SKILL.md": "e10431a9386c6aec", - "skills/gsd-mempalace-capture/SKILL.md": "588ddf4fbf3ebe65", - "skills/gsd-mempalace-recall/SKILL.md": "2d95e385fee26dee", + "skills/gsd-mempalace-capture/SKILL.md": "5647f915e5c85482", + "skills/gsd-mempalace-recall/SKILL.md": "d41523e659d1920f", "skills/gsd-milestone-summary/SKILL.md": "2955ab3e3a444ca3", "skills/gsd-mvp-phase/SKILL.md": "1cf7622d655840ac", "skills/gsd-new-milestone/SKILL.md": "f97a28dd1e2b9317", "skills/gsd-new-project/SKILL.md": "31b46764278d1c1a", - "skills/gsd-next/SKILL.md": "e7e03391c0e3a235", "skills/gsd-ns-context/SKILL.md": "e791bc60e4cf124e", "skills/gsd-ns-ideate/SKILL.md": "b85f270e8415f595", "skills/gsd-ns-manage/SKILL.md": "d55c53b5b0513033", "skills/gsd-ns-project/SKILL.md": "64844073a6115c45", "skills/gsd-ns-review/SKILL.md": "2e30158e112d173c", - "skills/gsd-ns-workflow/SKILL.md": "529e21833a6a8831", + "skills/gsd-ns-workflow/SKILL.md": "79373d30cd17ed49", "skills/gsd-pause-work/SKILL.md": "9d3cc6bd70b03df1", "skills/gsd-phase/SKILL.md": "00676bbea61410bf", "skills/gsd-plan-phase/SKILL.md": "168046ccf9702532", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index b8c79276f..c3a135d9a 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "f3baf9025a5bc4b1", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "68b2d2faccfdd8a3", + "agents/gsd-code-fixer.md": "2a98aadb20311108", "agents/gsd-code-reviewer.md": "bc8a6f2e1f787ff5", "agents/gsd-codebase-mapper.md": "85ea778ad9cf7e66", - "agents/gsd-debug-session-manager.md": "0d388fcee3eba770", - "agents/gsd-debugger.md": "2c8234c76c5d15c1", + "agents/gsd-debug-session-manager.md": "69fe2698d5a997c6", + "agents/gsd-debugger.md": "97c64f1db2fe85a3", "agents/gsd-doc-classifier.md": "f61cb0fad0d4f243", "agents/gsd-doc-synthesizer.md": "043847ebefbb9b7c", "agents/gsd-doc-verifier.md": "b3433e0db51e1c60", "agents/gsd-doc-writer.md": "376011bd99026bf7", "agents/gsd-domain-researcher.md": "671c9ea949889c4a", - "agents/gsd-eval-auditor.md": "fcaec7b00f94c435", + "agents/gsd-eval-auditor.md": "cd2a5727472ad0ab", "agents/gsd-eval-planner.md": "a4a5b4b3f7828ba3", - "agents/gsd-executor.md": "46f911cd211034b0", + "agents/gsd-executor.md": "87c499f939e30049", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "fa53e2d78be1de74", - "agents/gsd-intel-updater.md": "fa40e685d7441ace", - "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", + "agents/gsd-intel-updater.md": "f8ac501c61557a17", + "agents/gsd-mempalace-curator.md": "63676937f8970bf3", "agents/gsd-nyquist-auditor.md": "230e6667411ccf2f", "agents/gsd-pattern-mapper.md": "43c6021cf7caabfa", - "agents/gsd-phase-researcher.md": "f1f6fd6a3e67c7a8", - "agents/gsd-plan-checker.md": "bf1a4e636f2390de", - "agents/gsd-planner.md": "6e8c76da9804ac42", - "agents/gsd-project-researcher.md": "4531b7cc8f5e5f7d", - "agents/gsd-research-synthesizer.md": "4a4f68e6c75b133a", + "agents/gsd-phase-researcher.md": "e74332bb76436bc9", + "agents/gsd-plan-checker.md": "58cce5e740351df3", + "agents/gsd-planner.md": "826ead38c4c06b79", + "agents/gsd-project-researcher.md": "327c1d656be67b01", + "agents/gsd-research-synthesizer.md": "c457ba87f906d6d9", "agents/gsd-roadmapper.md": "bb2f57695dbab32c", "agents/gsd-security-auditor.md": "f22374cc1db28dca", "agents/gsd-ui-auditor.md": "dcd5712e6b160a53", "agents/gsd-ui-checker.md": "8a20715a400435f9", - "agents/gsd-ui-researcher.md": "184d1c3edca694df", + "agents/gsd-ui-researcher.md": "e64ad536d309cecf", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "f5c00a9b08fc1a7e", + "agents/gsd-verifier.md": "40f4b7fbc3564419", "commands/gsd-add-tests.md": "3608d0cf4b515103", "commands/gsd-ai-integration-phase.md": "70843d4904743f7e", "commands/gsd-audit-fix.md": "1b805946362c4f19", @@ -63,19 +63,18 @@ "commands/gsd-ingest-docs.md": "6718b04c597a5428", "commands/gsd-manager.md": "8f4ae79774902293", "commands/gsd-map-codebase.md": "f3a06c4c7503f243", - "commands/gsd-mempalace-capture.md": "2e610f3ebe2eb5b4", - "commands/gsd-mempalace-recall.md": "38716c0983a3ef9c", + "commands/gsd-mempalace-capture.md": "016a90f0eb7493ac", + "commands/gsd-mempalace-recall.md": "babb21998c7e6a6f", "commands/gsd-milestone-summary.md": "ff5e11e6b33d4b5e", "commands/gsd-mvp-phase.md": "ffc5905aed8f450a", "commands/gsd-new-milestone.md": "e9ddaec1dd29d023", "commands/gsd-new-project.md": "56552a324cff669e", - "commands/gsd-next.md": "d9f43d56e1bca2ca", "commands/gsd-ns-context.md": "011c44e7aa46e64a", "commands/gsd-ns-ideate.md": "edc5e543512dd48a", "commands/gsd-ns-manage.md": "0409d810e499357f", "commands/gsd-ns-project.md": "8dfd1b9a2ffe86ac", "commands/gsd-ns-review.md": "3766ed10827882a0", - "commands/gsd-ns-workflow.md": "c3b3c046a74ec0ee", + "commands/gsd-ns-workflow.md": "87910975ac92d103", "commands/gsd-pause-work.md": "4fb032f72238fe33", "commands/gsd-phase.md": "4920d15d779329eb", "commands/gsd-plan-phase.md": "e74f3cb7a10cbb83", @@ -107,13 +106,12 @@ "commands/gsd-workstreams.md": "52ab9c585d3a00f3", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -154,7 +152,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", + "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -177,7 +175,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "7fe958e09e74b6c8", + "gsd-core/references/planning-config.md": "1c3a3aae2ae89e83", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -261,120 +259,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "1bc7377b105194fc", - "gsd-core/workflows/add-phase.md": "46e0551ffdd8ce1a", - "gsd-core/workflows/add-tests.md": "2c1da65d41dc12d2", - "gsd-core/workflows/add-todo.md": "cc0efe270004c8fb", - "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "1153d35058e3e24f", + "gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba", + "gsd-core/workflows/add-tests.md": "2871f7e6409ba89e", + "gsd-core/workflows/add-todo.md": "3b913840c1f490b2", + "gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", - "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", - "gsd-core/workflows/autonomous.md": "7e5683728ef33707", - "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", - "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", - "gsd-core/workflows/code-review-fix.md": "c323f7098b671bd6", - "gsd-core/workflows/code-review.md": "ad450c6ef8459dad", - "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "849d7e5b9c12dcae", - "gsd-core/workflows/diagnose-issues.md": "6cc3900891dfb927", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9", + "gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793", + "gsd-core/workflows/autonomous.md": "1184e5864e201889", + "gsd-core/workflows/check-todos.md": "1e3026abe782bd36", + "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", + "gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93", + "gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e", + "gsd-core/workflows/complete-milestone.md": "337d177126f1bd67", + "gsd-core/workflows/debug.md": "da62e7a62c113b29", + "gsd-core/workflows/diagnose-issues.md": "a5f15332b3833a80", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "1e229f6d21831d60", + "gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "5c5e8d8c2c9d95aa", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", + "gsd-core/workflows/discuss-phase.md": "b2538b3f8a15f7de", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", + "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853", + "gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", - "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", - "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", - "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "346e443b260e4f38", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", + "gsd-core/workflows/do.md": "152e9c5c512f79cb", + "gsd-core/workflows/docs-update.md": "806ada831b961116", + "gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5", + "gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae", + "gsd-core/workflows/execute-phase.md": "5daeb8fac7cab295", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "2c412310dce31a0b", - "gsd-core/workflows/explore.md": "6c04f2e658d93261", - "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", + "gsd-core/workflows/execute-plan.md": "502a2498f6b27e38", + "gsd-core/workflows/explore.md": "11523b829cc67c29", + "gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "0d500a3f5ab26913", - "gsd-core/workflows/graduation.md": "47f1594c88c08501", - "gsd-core/workflows/health.md": "107e3c72e76d9535", + "gsd-core/workflows/forensics.md": "b4bde768fd27a982", + "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", + "gsd-core/workflows/health.md": "e3cb8ff4e01e9e53", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "3ac1c1bb851da7a5", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", - "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", + "gsd-core/workflows/help/modes/full.md": "5d60d11d63089892", + "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", + "gsd-core/workflows/import.md": "97861d522319d56e", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", - "gsd-core/workflows/insert-phase.md": "08dca838d831bb5b", + "gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3", + "gsd-core/workflows/insert-phase.md": "621f9e75725542b1", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "b687f2a843032d65", - "gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453", - "gsd-core/workflows/manager.md": "3ba7a3e8213c4b23", - "gsd-core/workflows/map-codebase.md": "83d750aade709983", - "gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043", - "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", - "gsd-core/workflows/new-milestone.md": "a616efb0f82d1a11", - "gsd-core/workflows/new-project.md": "5ffeef49fe73013e", - "gsd-core/workflows/new-workspace.md": "017688423110ed66", - "gsd-core/workflows/next.md": "13fb800f2472d970", + "gsd-core/workflows/list-seeds.md": "0a466d04df300854", + "gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b", + "gsd-core/workflows/manager.md": "a31f7e255dd7d01d", + "gsd-core/workflows/map-codebase.md": "582bddef590de9c6", + "gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a", + "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", + "gsd-core/workflows/new-milestone.md": "23d2135a555e95df", + "gsd-core/workflows/new-project.md": "e6855b300fcac71e", + "gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1", + "gsd-core/workflows/next.md": "48bd4b5d54f0d1f8", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", - "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", - "gsd-core/workflows/plan-phase.md": "8b1209958c31ca2f", + "gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b", + "gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25", + "gsd-core/workflows/plan-phase.md": "dc0beefd1316a860", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5", - "gsd-core/workflows/plan-review-convergence.md": "c635ecb8590a724e", - "gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede", - "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", - "gsd-core/workflows/profile-user.md": "14263db831230142", - "gsd-core/workflows/progress.md": "893aa3c36983f74b", - "gsd-core/workflows/quick.md": "3bafc0a59cc90d26", - "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", - "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", - "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", - "gsd-core/workflows/resume-project.md": "f28da1200e4545f4", - "gsd-core/workflows/review.md": "f3c2e894941c9943", - "gsd-core/workflows/scan.md": "003883d71c37da7d", - "gsd-core/workflows/secure-phase.md": "29fc6b62c5c5dc62", + "gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd", + "gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06", + "gsd-core/workflows/pr-branch.md": "f2a35833fe784a53", + "gsd-core/workflows/profile-user.md": "02bc967c299a0136", + "gsd-core/workflows/progress.md": "057699b34b6198f7", + "gsd-core/workflows/quick.md": "bf8e448df540768f", + "gsd-core/workflows/reapply-patches.md": "7915e40411490bbe", + "gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9", + "gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc", + "gsd-core/workflows/resume-project.md": "b18b51fd15cbce95", + "gsd-core/workflows/review.md": "fbfa6eebcad41aa0", + "gsd-core/workflows/scan.md": "54ff1ff60041d065", + "gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "b57c947edee905bc", - "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", - "gsd-core/workflows/settings.md": "b2d39d972650f5f3", - "gsd-core/workflows/ship.md": "7b8fe9f89143e648", - "gsd-core/workflows/sketch-wrap-up.md": "5f5ebb6a80d610c6", - "gsd-core/workflows/sketch.md": "8319cedf3f93fc35", - "gsd-core/workflows/smart-entry.md": "449238eb94abe187", - "gsd-core/workflows/spec-phase.md": "8c480bd91f3cef6f", - "gsd-core/workflows/spike-wrap-up.md": "8467dadf2af758e6", - "gsd-core/workflows/spike.md": "7727c07bb221c8cc", - "gsd-core/workflows/stats.md": "76a42cbeaf6007c2", + "gsd-core/workflows/settings-advanced.md": "895e94e9193c2de2", + "gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed", + "gsd-core/workflows/settings.md": "48d337eb7e3f141b", + "gsd-core/workflows/ship.md": "d26fb5d3e965642a", + "gsd-core/workflows/sketch-wrap-up.md": "c03f64e834b69540", + "gsd-core/workflows/sketch.md": "04e0758c1a58881e", + "gsd-core/workflows/spec-phase.md": "2aa0353147153776", + "gsd-core/workflows/spike-wrap-up.md": "c86e04a0feb220a5", + "gsd-core/workflows/spike.md": "53127654e77256bf", + "gsd-core/workflows/stats.md": "01c24349370a0e6d", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "927e7eeefd2fcf5c", - "gsd-core/workflows/transition.md": "cb8ec5affb7ebba1", - "gsd-core/workflows/ui-phase.md": "db908f3bad5bc9f0", - "gsd-core/workflows/ui-review.md": "7acfc485526d064b", - "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", + "gsd-core/workflows/thread.md": "6d075b5d26500e9d", + "gsd-core/workflows/transition.md": "eee3435817fab185", + "gsd-core/workflows/ui-phase.md": "e81783508b8b6819", + "gsd-core/workflows/ui-review.md": "1ad3654435000881", + "gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "fd160e13f8b7e83c", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", - "gsd-core/workflows/verify-phase.md": "98a995046bdb6c3c", - "gsd-core/workflows/verify-work.md": "34e980a6950cd83c", + "gsd-core/workflows/update.md": "231e7c305b40c417", + "gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb", + "gsd-core/workflows/verify-phase.md": "7579af6cd757f644", + "gsd-core/workflows/verify-work.md": "d77ace0fc4f33ff7", "hooks/gsd-check-update-worker.js": "cc1ef5f840f9dfc9", "hooks/gsd-check-update.js": "7b3a7983d5f1f5d3", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -415,8 +412,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "48846bf26ccaf0e7", "skills/gsd-ns-context/skills/graphify/SKILL.md": "3d6341614add6ccd", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "51d6b970dca3c28e", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "a7261b5ead71cc58", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "646e59e76acd548f", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "c585b152e9d9d6d3", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "1a3267902234c607", "skills/gsd-ns-ideate/SKILL.md": "d70360a5f7e8ac90", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "74651f6959cfbbd3", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "bb8413dc283a5bb1", @@ -464,7 +461,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "d0e75ee06eaa0165", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "bdab072171d79877", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "8972b413eb712cae", - "skills/gsd-ns-workflow/SKILL.md": "9c03c167c9af062a", + "skills/gsd-ns-workflow/SKILL.md": "e0711a5522acc3ca", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "851084b695ab8328", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "34fa7aff585eb78f", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "1565a532889d3ea3", @@ -472,7 +469,6 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "67c9a6189f045de0", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "34b741cc323f5f15", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f259f089a8d07a54", - "skills/gsd-ns-workflow/skills/next/SKILL.md": "e7409245f1a0f9de", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "fe5b26417ee466be", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "8cf23ecd6ac98069", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "93f68cc6a36de7f2", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 23232b818..9d060913b 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -1,48 +1,47 @@ { ".gsd-profile": "0e716a5fef4e6dc1", - "agents/gsd-advisor-researcher.md": "6f1f17e206e2c0c4", - "agents/gsd-ai-researcher.md": "e2236ee7b717c925", + "agents/gsd-advisor-researcher.md": "7cdfe98e2baf606e", + "agents/gsd-ai-researcher.md": "fa68db1fb2c6ee8a", "agents/gsd-assumptions-analyzer.md": "f94fdd67f70b4a5d", - "agents/gsd-code-fixer.md": "3d5f67cfd24ac452", + "agents/gsd-code-fixer.md": "78f5897024da1fcc", "agents/gsd-code-reviewer.md": "d626a828e8de3648", "agents/gsd-codebase-mapper.md": "8c2e9f2ce3aedf78", - "agents/gsd-debug-session-manager.md": "767c0f43d47e89ad", - "agents/gsd-debugger.md": "4d8a618121c8056a", + "agents/gsd-debug-session-manager.md": "808092282a01943f", + "agents/gsd-debugger.md": "77b44e85f02fbec7", "agents/gsd-doc-classifier.md": "4740eb4c4f6ac294", "agents/gsd-doc-synthesizer.md": "135bbdfb9053cbd8", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", "agents/gsd-doc-writer.md": "8cb62907c6458111", - "agents/gsd-domain-researcher.md": "5f7d366251b957fe", - "agents/gsd-eval-auditor.md": "fea2759beff0a642", + "agents/gsd-domain-researcher.md": "f8be56555689a970", + "agents/gsd-eval-auditor.md": "88be0494a906eda5", "agents/gsd-eval-planner.md": "112f6730f23854e3", - "agents/gsd-executor.md": "22fc2f17098a4d14", + "agents/gsd-executor.md": "50b737a811d0a334", "agents/gsd-framework-selector.md": "c350ee693cb1aa4e", "agents/gsd-integration-checker.md": "c8b4e65dee89c8ea", - "agents/gsd-intel-updater.md": "5b41e05f90ce89d9", - "agents/gsd-mempalace-curator.md": "77b53f1b155242b4", + "agents/gsd-intel-updater.md": "9fadfebd08f15244", + "agents/gsd-mempalace-curator.md": "61c387c3fd9bae78", "agents/gsd-nyquist-auditor.md": "0bc0cdad7b3a0013", "agents/gsd-pattern-mapper.md": "b45b5e106775bec1", - "agents/gsd-phase-researcher.md": "85217c69c1ed2ac6", - "agents/gsd-plan-checker.md": "c70134c61b969589", - "agents/gsd-planner.md": "aa68af11f852ecfd", - "agents/gsd-project-researcher.md": "f468e96f8339d1e0", - "agents/gsd-research-synthesizer.md": "7be02e47f4fd901b", + "agents/gsd-phase-researcher.md": "5199acbf1770da2e", + "agents/gsd-plan-checker.md": "a5b4e7222feef68f", + "agents/gsd-planner.md": "7c2ae8b93b81cea4", + "agents/gsd-project-researcher.md": "3e94e963ccd268ae", + "agents/gsd-research-synthesizer.md": "f18c06f041f7a775", "agents/gsd-roadmapper.md": "8a7f1f1256a6aed5", "agents/gsd-security-auditor.md": "4f9fc3f654af4944", "agents/gsd-ui-auditor.md": "40c0dcc15bcfb9fb", "agents/gsd-ui-checker.md": "6e94b43fd459e10e", - "agents/gsd-ui-researcher.md": "5e561130434efdb2", + "agents/gsd-ui-researcher.md": "02c2d7582e8bbc44", "agents/gsd-user-profiler.md": "003276f85792cfda", - "agents/gsd-verifier.md": "2271174b5aa20e31", + "agents/gsd-verifier.md": "d62ffb1f520520c0", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -106,7 +105,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "35aa39fef2641311", + "gsd-core/references/planning-config.md": "4435dfdc3381233f", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -190,120 +189,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "485c4b6673ddf832", - "gsd-core/workflows/add-phase.md": "0d90083e9c17bec1", - "gsd-core/workflows/add-tests.md": "330b3e7d969fc2d1", - "gsd-core/workflows/add-todo.md": "8488f10f56ac24ca", - "gsd-core/workflows/ai-integration-phase.md": "a898d99b8d844215", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "5095b6e69b4e380a", + "gsd-core/workflows/add-phase.md": "27164a671e14a789", + "gsd-core/workflows/add-tests.md": "930998905facefc3", + "gsd-core/workflows/add-todo.md": "73934334ebbf5530", + "gsd-core/workflows/ai-integration-phase.md": "17017ec424e87b8d", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", - "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", - "gsd-core/workflows/autonomous.md": "722397c04272dfaa", - "gsd-core/workflows/check-todos.md": "6c2a43d1d3e86589", - "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", - "gsd-core/workflows/code-review-fix.md": "adb62c695b39ef61", - "gsd-core/workflows/code-review.md": "6c40b95e799907d0", - "gsd-core/workflows/complete-milestone.md": "dcf1182398efb1ca", - "gsd-core/workflows/debug.md": "a9397fd35cca2240", - "gsd-core/workflows/diagnose-issues.md": "75ffc381ac3059ff", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04", + "gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12", + "gsd-core/workflows/autonomous.md": "69f12f004f1233a4", + "gsd-core/workflows/check-todos.md": "fa637b6cc9be647c", + "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", + "gsd-core/workflows/code-review-fix.md": "a416c764425cbb61", + "gsd-core/workflows/code-review.md": "3999e5bc9ce9171e", + "gsd-core/workflows/complete-milestone.md": "49a005d4a9521477", + "gsd-core/workflows/debug.md": "d5856f61f3a1ff84", + "gsd-core/workflows/diagnose-issues.md": "363684618298aecd", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", - "gsd-core/workflows/discuss-phase-assumptions.md": "46876f83547db40a", + "gsd-core/workflows/discuss-phase-assumptions.md": "af66efe23bd54b1d", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "df56c8cd170b2150", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", + "gsd-core/workflows/discuss-phase.md": "6cbb63a540616e9d", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", + "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "ecdb88a9aa70d5bf", + "gsd-core/workflows/discuss-phase/modes/chain.md": "b16547a6b0423579", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "b62c9085d4dc2963", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "56215b98e26448bc", - "gsd-core/workflows/docs-update.md": "63082608d3ae92be", - "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", - "gsd-core/workflows/eval-review.md": "f59e8329dae1e528", - "gsd-core/workflows/execute-phase.md": "4aa452149551956b", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", + "gsd-core/workflows/do.md": "032ea8e1d5a13d3b", + "gsd-core/workflows/docs-update.md": "98c30bec9350542f", + "gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c", + "gsd-core/workflows/eval-review.md": "f47fd1a7a1ca3308", + "gsd-core/workflows/execute-phase.md": "fe39dd64ff9db8f6", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "cce1a33fe9a0a32d", - "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", - "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", + "gsd-core/workflows/execute-plan.md": "8d77786e0842fefe", + "gsd-core/workflows/explore.md": "aee57d95497ca50a", + "gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "c01da0178fb97b21", - "gsd-core/workflows/graduation.md": "47f1594c88c08501", - "gsd-core/workflows/health.md": "f934b1f1e9f3ae72", + "gsd-core/workflows/forensics.md": "ec9dc257272a6980", + "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", + "gsd-core/workflows/health.md": "9fd7fe8c7c99b0db", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "93cbdf7e542115a1", - "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", - "gsd-core/workflows/import.md": "6e8acff8c3918795", + "gsd-core/workflows/help/modes/full.md": "a731f1b3a744be08", + "gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd", + "gsd-core/workflows/import.md": "b40557b17ca31024", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", - "gsd-core/workflows/ingest-docs.md": "25832c784e8812e6", - "gsd-core/workflows/insert-phase.md": "964ca91863a8749a", + "gsd-core/workflows/ingest-docs.md": "a0a58450d457ae35", + "gsd-core/workflows/insert-phase.md": "0ab06e370253622b", "gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c", - "gsd-core/workflows/list-seeds.md": "5a46337f55ae8453", - "gsd-core/workflows/list-workspaces.md": "418570fbc8b938da", - "gsd-core/workflows/manager.md": "e39dd3c23a782eb5", - "gsd-core/workflows/map-codebase.md": "a45a9aa5c10aeeed", - "gsd-core/workflows/milestone-summary.md": "ad8e69fcb3463ce4", - "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", - "gsd-core/workflows/new-milestone.md": "d93e3fd29f4f77d4", - "gsd-core/workflows/new-project.md": "0ea70b800c86fde1", - "gsd-core/workflows/new-workspace.md": "04356c9b675da7c9", - "gsd-core/workflows/next.md": "ef30b829a6d5c5f6", + "gsd-core/workflows/list-seeds.md": "da9511b569ada7f9", + "gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169", + "gsd-core/workflows/manager.md": "c0b571445b452f2b", + "gsd-core/workflows/map-codebase.md": "27c356aa00fb022a", + "gsd-core/workflows/milestone-summary.md": "e7692ea6a9ca3653", + "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", + "gsd-core/workflows/new-milestone.md": "7c957068b523ff47", + "gsd-core/workflows/new-project.md": "4184d47a8797dd4e", + "gsd-core/workflows/new-workspace.md": "668cd5038c76c771", + "gsd-core/workflows/next.md": "ef1b4c60ea3ddbc9", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", - "gsd-core/workflows/pause-work.md": "5716362557f44ce4", - "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", - "gsd-core/workflows/plan-phase.md": "6978a15b5232b310", + "gsd-core/workflows/pause-work.md": "0be71264eafd16dc", + "gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719", + "gsd-core/workflows/plan-phase.md": "f0401a3221b74b58", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "e2e8a0fc1fd49101", - "gsd-core/workflows/plant-seed.md": "af50e9f10d3cc6e1", - "gsd-core/workflows/pr-branch.md": "ab157cd8e49621dd", - "gsd-core/workflows/profile-user.md": "ff3820a27731ceb8", - "gsd-core/workflows/progress.md": "bd1ecf9207331bda", - "gsd-core/workflows/quick.md": "bd56a6313d5ed43c", - "gsd-core/workflows/reapply-patches.md": "ba9406b60f2c4041", - "gsd-core/workflows/remove-phase.md": "ada8a0546c686483", - "gsd-core/workflows/remove-workspace.md": "f3ab3a88a7e9e1ed", - "gsd-core/workflows/resume-project.md": "7f8dc986f0f35d96", - "gsd-core/workflows/review.md": "5cd71e81c4ace401", - "gsd-core/workflows/scan.md": "47371c2073d6c0be", - "gsd-core/workflows/secure-phase.md": "59d3c50aba8c9a6c", + "gsd-core/workflows/plan-review-convergence.md": "414df04b7ddff73c", + "gsd-core/workflows/plant-seed.md": "936a848f1d6c409e", + "gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5", + "gsd-core/workflows/profile-user.md": "4e17ead7b8335ad2", + "gsd-core/workflows/progress.md": "ff1627b59dcce0f9", + "gsd-core/workflows/quick.md": "c4b1d7a0cede6ee7", + "gsd-core/workflows/reapply-patches.md": "2d7dada9edec108b", + "gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09", + "gsd-core/workflows/remove-workspace.md": "0e73844f0f41cbc3", + "gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35", + "gsd-core/workflows/review.md": "a1d3ebce6222ff72", + "gsd-core/workflows/scan.md": "8e1bbf2eed1752ca", + "gsd-core/workflows/secure-phase.md": "b2b9100ff79d6017", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "02f7ef84f976bda4", - "gsd-core/workflows/settings-integrations.md": "53649313d20694ae", - "gsd-core/workflows/settings.md": "3d994d669d3fb321", - "gsd-core/workflows/ship.md": "12e8e58c077a891a", - "gsd-core/workflows/sketch-wrap-up.md": "121ed4b8127abf04", - "gsd-core/workflows/sketch.md": "737c0492686fea2d", - "gsd-core/workflows/smart-entry.md": "ad20cf74ae2e8291", - "gsd-core/workflows/spec-phase.md": "82150c52a9077602", - "gsd-core/workflows/spike-wrap-up.md": "e2704024992b3fee", - "gsd-core/workflows/spike.md": "6dce83a2c5e7e49c", - "gsd-core/workflows/stats.md": "e7852c5d8f2b05a9", + "gsd-core/workflows/settings-advanced.md": "e0e8c31a4959e872", + "gsd-core/workflows/settings-integrations.md": "b503bf4784877aa9", + "gsd-core/workflows/settings.md": "3cbb449c1e02fe29", + "gsd-core/workflows/ship.md": "f8eece9ef821fc7c", + "gsd-core/workflows/sketch-wrap-up.md": "fcef0ef795f8bfc5", + "gsd-core/workflows/sketch.md": "dc9645b2ee28559d", + "gsd-core/workflows/spec-phase.md": "bab99d00772a5cd0", + "gsd-core/workflows/spike-wrap-up.md": "89a8d7fbc74ce8f2", + "gsd-core/workflows/spike.md": "aae8bcad15642645", + "gsd-core/workflows/stats.md": "17b4f2059f4b4ef2", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "3b2c560d7189576d", - "gsd-core/workflows/transition.md": "f6731bbb766929e7", - "gsd-core/workflows/ui-phase.md": "deaf9eff81cb6733", - "gsd-core/workflows/ui-review.md": "7b488a7486a6b7cf", - "gsd-core/workflows/ultraplan-phase.md": "328664400a001fd5", + "gsd-core/workflows/thread.md": "5ad0e0d5ce7e0d11", + "gsd-core/workflows/transition.md": "96ce39403ca69594", + "gsd-core/workflows/ui-phase.md": "790e5982e5b715c3", + "gsd-core/workflows/ui-review.md": "51945fda8e931f99", + "gsd-core/workflows/ultraplan-phase.md": "92dbc48e9a7162aa", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", - "gsd-core/workflows/update.md": "f9e7d8a760d0d3c8", - "gsd-core/workflows/validate-phase.md": "2ac231dc541441c2", - "gsd-core/workflows/verify-phase.md": "0d4ffabc1caa473a", - "gsd-core/workflows/verify-work.md": "efe57bdbbb3af03f", + "gsd-core/workflows/update.md": "0b389258dcc09332", + "gsd-core/workflows/validate-phase.md": "2aa540f2c2479501", + "gsd-core/workflows/verify-phase.md": "15a999f82868ad29", + "gsd-core/workflows/verify-work.md": "ea61f9e88a44b68b", "hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3", "hooks/gsd-check-update.js": "25cde66a12d6b886", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -367,19 +365,18 @@ "skills/gsd-ingest-docs/SKILL.md": "eb85e654917a503a", "skills/gsd-manager/SKILL.md": "1370d93741e47828", "skills/gsd-map-codebase/SKILL.md": "5009595dbde69739", - "skills/gsd-mempalace-capture/SKILL.md": "40a31ad049374297", - "skills/gsd-mempalace-recall/SKILL.md": "c3f412d5a64f3921", + "skills/gsd-mempalace-capture/SKILL.md": "e9b66db79fce0a2f", + "skills/gsd-mempalace-recall/SKILL.md": "9bfa9e76c7a10e26", "skills/gsd-milestone-summary/SKILL.md": "33d51a325d314f3a", "skills/gsd-mvp-phase/SKILL.md": "f9a1348c6c297579", "skills/gsd-new-milestone/SKILL.md": "ac99ffb8a966fe9d", "skills/gsd-new-project/SKILL.md": "e4d930027074d3b6", - "skills/gsd-next/SKILL.md": "13e394affe675498", "skills/gsd-ns-context/SKILL.md": "3102e7ad9b60f182", "skills/gsd-ns-ideate/SKILL.md": "c2c129408a046d22", "skills/gsd-ns-manage/SKILL.md": "8d786e01fa28a7bb", "skills/gsd-ns-project/SKILL.md": "cc0c4bd9feeab147", "skills/gsd-ns-review/SKILL.md": "4111ea56e820479f", - "skills/gsd-ns-workflow/SKILL.md": "4282c40a5e6e8bbe", + "skills/gsd-ns-workflow/SKILL.md": "13c0d84b25545331", "skills/gsd-pause-work/SKILL.md": "35e8a148e44f5361", "skills/gsd-phase/SKILL.md": "00be96e7ae36c6f0", "skills/gsd-plan-phase/SKILL.md": "0c9e87da048acfb7", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index b4bee850c..097cce61f 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -7,46 +7,45 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "49ebcbe6985b86c9", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "6aa74a2fb2ad244a", + "agents/gsd-code-fixer.md": "353b89de3bbb4737", "agents/gsd-code-reviewer.md": "e5ec12d4d409e800", "agents/gsd-codebase-mapper.md": "e5b7941bdda53c91", - "agents/gsd-debug-session-manager.md": "a9d4e43e4d2e327a", - "agents/gsd-debugger.md": "b1f3af91f0e651c8", + "agents/gsd-debug-session-manager.md": "fc39ba45364ee4fd", + "agents/gsd-debugger.md": "dc92b6a909139c62", "agents/gsd-doc-classifier.md": "f7c361b91cc71a15", "agents/gsd-doc-synthesizer.md": "f4e6ca19363e4b0f", "agents/gsd-doc-verifier.md": "b60290c9d9f6d8d2", "agents/gsd-doc-writer.md": "27655a8cfdeb97ee", "agents/gsd-domain-researcher.md": "0fecdaea86466a56", - "agents/gsd-eval-auditor.md": "36c44303085df2f8", + "agents/gsd-eval-auditor.md": "90b5d1909977df61", "agents/gsd-eval-planner.md": "3ddea88a69b4da3f", - "agents/gsd-executor.md": "441e624e9685e505", + "agents/gsd-executor.md": "806bdb1313ead84d", "agents/gsd-framework-selector.md": "564669d479433f15", "agents/gsd-integration-checker.md": "1bbbdd3d420b994e", - "agents/gsd-intel-updater.md": "42c40fffbc720d0b", - "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", + "agents/gsd-intel-updater.md": "b084fd8df5f13f2a", + "agents/gsd-mempalace-curator.md": "63676937f8970bf3", "agents/gsd-nyquist-auditor.md": "4f9bba7b9762835d", "agents/gsd-pattern-mapper.md": "b526065fd2efa19c", - "agents/gsd-phase-researcher.md": "c507db2ba66038f4", - "agents/gsd-plan-checker.md": "a609245dbdc4ef2b", - "agents/gsd-planner.md": "ae6bf9def31a8eec", - "agents/gsd-project-researcher.md": "049f816c6caa4316", - "agents/gsd-research-synthesizer.md": "2f7dcbff50371d4c", + "agents/gsd-phase-researcher.md": "56b77237e2d044bb", + "agents/gsd-plan-checker.md": "3a2bc105b4220859", + "agents/gsd-planner.md": "5a3e05392dbfce2f", + "agents/gsd-project-researcher.md": "5a9192efdc45fd11", + "agents/gsd-research-synthesizer.md": "4b9faffa7936b36c", "agents/gsd-roadmapper.md": "bbb23d3097911516", "agents/gsd-security-auditor.md": "c35c8ec2f85b331f", "agents/gsd-ui-auditor.md": "9338efa31b9b7b99", "agents/gsd-ui-checker.md": "6ed8cd036613da1c", - "agents/gsd-ui-researcher.md": "eea2dfddf30aec9d", + "agents/gsd-ui-researcher.md": "7496c0d22e818603", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "75912e9cadd83eb3", + "agents/gsd-verifier.md": "5645dfb20b787f01", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf", - "gsd-core/bin/gsd-tools.cjs": "13640341aa311ae3", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -87,7 +86,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", + "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "f5403e1470e46e69", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -110,7 +109,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "15a5fc63268379d4", + "gsd-core/references/planning-config.md": "c386ac9e804f862e", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -194,120 +193,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "6c4393113fa9d209", - "gsd-core/workflows/add-phase.md": "cac9b86f66ab26f5", - "gsd-core/workflows/add-tests.md": "dd80832a428afb45", - "gsd-core/workflows/add-todo.md": "b71e80304fe484eb", - "gsd-core/workflows/ai-integration-phase.md": "5159c6bdf102f74b", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "805471417ad921b4", + "gsd-core/workflows/add-phase.md": "38a6397d692b6256", + "gsd-core/workflows/add-tests.md": "3182b4a48b60fc0f", + "gsd-core/workflows/add-todo.md": "2ee36f06763af56b", + "gsd-core/workflows/ai-integration-phase.md": "e1216f51ba0662f2", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "47c29d04bab02b27", - "gsd-core/workflows/audit-milestone.md": "2266710d0ae48932", - "gsd-core/workflows/audit-uat.md": "1fb7b2ab9d587c8f", - "gsd-core/workflows/autonomous.md": "cc5217b1b2238a4c", - "gsd-core/workflows/check-todos.md": "32fdf33f5dc8bdde", - "gsd-core/workflows/cleanup.md": "b0ebfc48792b407b", - "gsd-core/workflows/code-review-fix.md": "b946fe7bcb303852", - "gsd-core/workflows/code-review.md": "0b24efcfa71a2ed2", - "gsd-core/workflows/complete-milestone.md": "c0808127038a8f86", - "gsd-core/workflows/debug.md": "f42e8e3cbc298694", - "gsd-core/workflows/diagnose-issues.md": "e616d0d730328d68", + "gsd-core/workflows/audit-fix.md": "85a83f15012e220d", + "gsd-core/workflows/audit-milestone.md": "7e68a0d33382fbca", + "gsd-core/workflows/audit-uat.md": "2ab2975014fbb210", + "gsd-core/workflows/autonomous.md": "cf705fcbc207e84a", + "gsd-core/workflows/check-todos.md": "ab6239efbf42077b", + "gsd-core/workflows/cleanup.md": "869f953fb25e57a7", + "gsd-core/workflows/code-review-fix.md": "40d723ec1c6b45d1", + "gsd-core/workflows/code-review.md": "4aee640e6e6951ce", + "gsd-core/workflows/complete-milestone.md": "512494b0d8c17777", + "gsd-core/workflows/debug.md": "1d138ad68a5f94dd", + "gsd-core/workflows/diagnose-issues.md": "ed74414bee6a146f", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "89987fd183e0d552", + "gsd-core/workflows/discuss-phase-assumptions.md": "dbb54ab5455a1e49", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "a290d5ee19607bb7", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "250de9aae90daebc", + "gsd-core/workflows/discuss-phase.md": "17ef5303bf8c61b2", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "711bdeb87a76fe72", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "d6392f268422768c", + "gsd-core/workflows/discuss-phase/modes/auto.md": "a677457cfcf26929", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "1b26642897eebb36", + "gsd-core/workflows/discuss-phase/modes/chain.md": "d7f857f6d916084a", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "e38583ffc6743580", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "a35bbd09f381d940", - "gsd-core/workflows/docs-update.md": "39f288623a8f6f32", - "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", - "gsd-core/workflows/eval-review.md": "3e1d7829ed2ed494", - "gsd-core/workflows/execute-phase.md": "5c56112513a04340", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "67ebc93f51968cb6", + "gsd-core/workflows/do.md": "491de71927bca5a0", + "gsd-core/workflows/docs-update.md": "4aee7d852ab26710", + "gsd-core/workflows/edit-phase.md": "db501e21c762d2b2", + "gsd-core/workflows/eval-review.md": "e211cca4eea94930", + "gsd-core/workflows/execute-phase.md": "61b798388f3c28d7", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "84b49fd65d290399", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e3cb789a350dcadc", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bcb4ab75df626846", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "0c5551f99ee0a017", - "gsd-core/workflows/explore.md": "e83af8ceae314cf9", - "gsd-core/workflows/extract-learnings.md": "6f39375b7dc775f9", + "gsd-core/workflows/execute-plan.md": "81458a19cf02a5bc", + "gsd-core/workflows/explore.md": "28856a6b0198064b", + "gsd-core/workflows/extract-learnings.md": "b649ff8ecff388c1", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "9fc65a8eed5d8bfc", - "gsd-core/workflows/graduation.md": "16fedecda36769eb", - "gsd-core/workflows/health.md": "788fad84fa42eb9f", + "gsd-core/workflows/forensics.md": "9de19e3792169aa3", + "gsd-core/workflows/graduation.md": "ca7fa951a963d84b", + "gsd-core/workflows/health.md": "295e170806820a94", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "77c34f4a77dec02c", - "gsd-core/workflows/help/modes/full.md": "1bf502890828ada8", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", - "gsd-core/workflows/import.md": "96ec687c5cfe84ac", + "gsd-core/workflows/help/modes/full.md": "a123dd946319a258", + "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", + "gsd-core/workflows/import.md": "64c8031374b39376", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "7d0517356c9f2619", - "gsd-core/workflows/insert-phase.md": "147f0009ec74b589", + "gsd-core/workflows/ingest-docs.md": "62761071f8391015", + "gsd-core/workflows/insert-phase.md": "37fb13804b4e61f2", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "25050c5e1b2b7176", - "gsd-core/workflows/list-workspaces.md": "8f0707ecbc395856", - "gsd-core/workflows/manager.md": "05eee19fe93c063d", - "gsd-core/workflows/map-codebase.md": "14c4995c73a671c7", - "gsd-core/workflows/milestone-summary.md": "20e56b9e3902e1d2", - "gsd-core/workflows/mvp-phase.md": "3e3936e1f247ac7c", - "gsd-core/workflows/new-milestone.md": "4fcf29b3cbcd9f83", - "gsd-core/workflows/new-project.md": "66bf6135f54ece0e", - "gsd-core/workflows/new-workspace.md": "f5eed5dd9a21878f", - "gsd-core/workflows/next.md": "3f8b61a35587a021", + "gsd-core/workflows/list-seeds.md": "d3b2783b53d96746", + "gsd-core/workflows/list-workspaces.md": "e2d7ee5e70395c1d", + "gsd-core/workflows/manager.md": "3ae982361d3cbb06", + "gsd-core/workflows/map-codebase.md": "893f13a40162ce23", + "gsd-core/workflows/milestone-summary.md": "04427b0abe11968d", + "gsd-core/workflows/mvp-phase.md": "e6a902c3308345f2", + "gsd-core/workflows/new-milestone.md": "2804d6f976923412", + "gsd-core/workflows/new-project.md": "f5799451fb7c1983", + "gsd-core/workflows/new-workspace.md": "277c868dc684ad05", + "gsd-core/workflows/next.md": "e64c75922be6d8e2", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "3530607514b0ac00", - "gsd-core/workflows/plan-milestone-gaps.md": "bafdc6945cd2bd87", - "gsd-core/workflows/plan-phase.md": "46db1a845f25a579", + "gsd-core/workflows/pause-work.md": "9c1acf8c30a244fd", + "gsd-core/workflows/plan-milestone-gaps.md": "95ca791b0867fe2d", + "gsd-core/workflows/plan-phase.md": "e4256d987d376112", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "4b0a2cb0f4f28179", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "ae59c247ad4a57d2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "090c31e22b1508fe", - "gsd-core/workflows/plan-review-convergence.md": "96ccbbf9e482ea8d", - "gsd-core/workflows/plant-seed.md": "a2cdd513663226f1", - "gsd-core/workflows/pr-branch.md": "9923878a4f6a2d91", - "gsd-core/workflows/profile-user.md": "26f74db0a7fcd268", - "gsd-core/workflows/progress.md": "9f326d63afb4b76b", - "gsd-core/workflows/quick.md": "10051a9b41d5d210", - "gsd-core/workflows/reapply-patches.md": "eb4272145a117904", - "gsd-core/workflows/remove-phase.md": "e336350f8113a328", - "gsd-core/workflows/remove-workspace.md": "e685dfbd736dfd90", - "gsd-core/workflows/resume-project.md": "e23981178fa37b3d", - "gsd-core/workflows/review.md": "c2b3fcc5bfc80038", - "gsd-core/workflows/scan.md": "dfd92717caea0ce7", - "gsd-core/workflows/secure-phase.md": "cf78183f06a02582", + "gsd-core/workflows/plan-review-convergence.md": "2cdba6216184aac4", + "gsd-core/workflows/plant-seed.md": "d0d63f83ae7c939b", + "gsd-core/workflows/pr-branch.md": "15ccec6bd303ea46", + "gsd-core/workflows/profile-user.md": "21955dc3f74c66df", + "gsd-core/workflows/progress.md": "ec78c08395cc39f5", + "gsd-core/workflows/quick.md": "ec955c4e4caed4d7", + "gsd-core/workflows/reapply-patches.md": "4cfdb59f5d8e727e", + "gsd-core/workflows/remove-phase.md": "61b68a4af414e3c2", + "gsd-core/workflows/remove-workspace.md": "411bfff942216185", + "gsd-core/workflows/resume-project.md": "f8f71b5a98374b85", + "gsd-core/workflows/review.md": "f7d5b0f64631adea", + "gsd-core/workflows/scan.md": "db0c48c3963f9a8b", + "gsd-core/workflows/secure-phase.md": "c51b86e369574195", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "e08245a5a65dcec2", - "gsd-core/workflows/settings-integrations.md": "76eee76d6eb57657", - "gsd-core/workflows/settings.md": "f6c7aa7ceb99078b", - "gsd-core/workflows/ship.md": "5f931a25ea9102a4", - "gsd-core/workflows/sketch-wrap-up.md": "1f44789553180d84", - "gsd-core/workflows/sketch.md": "2226779b6003a71c", - "gsd-core/workflows/smart-entry.md": "9a64f43927641ca4", - "gsd-core/workflows/spec-phase.md": "55d727dbf400ed9a", - "gsd-core/workflows/spike-wrap-up.md": "846958e0012a0899", - "gsd-core/workflows/spike.md": "868b15cdf229cc43", - "gsd-core/workflows/stats.md": "f9241bb65770c5a4", + "gsd-core/workflows/settings-advanced.md": "39c2dc5663866fae", + "gsd-core/workflows/settings-integrations.md": "7e9fbe941882c4f6", + "gsd-core/workflows/settings.md": "bc0e1b43249e32b0", + "gsd-core/workflows/ship.md": "c3db35c8d1b398c1", + "gsd-core/workflows/sketch-wrap-up.md": "91f40fc816293e3c", + "gsd-core/workflows/sketch.md": "92a8bab2605469fb", + "gsd-core/workflows/spec-phase.md": "e06346c9c626a2d2", + "gsd-core/workflows/spike-wrap-up.md": "693949a4e10e66bd", + "gsd-core/workflows/spike.md": "204e742c846ee0d9", + "gsd-core/workflows/stats.md": "5cfea82b894eee3c", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "d71b1e815925c5cc", - "gsd-core/workflows/transition.md": "b9e41eb751375faf", - "gsd-core/workflows/ui-phase.md": "dfc93789f7fa93f5", - "gsd-core/workflows/ui-review.md": "8cd9605add21301e", - "gsd-core/workflows/ultraplan-phase.md": "ceff456b1e9d94d8", + "gsd-core/workflows/thread.md": "4a009fd2cc4387a7", + "gsd-core/workflows/transition.md": "fe82e77df8dceb1b", + "gsd-core/workflows/ui-phase.md": "06f1f80de620a319", + "gsd-core/workflows/ui-review.md": "0af83311f5e41f48", + "gsd-core/workflows/ultraplan-phase.md": "b4e64685b40bce09", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "165beec33490bd28", - "gsd-core/workflows/validate-phase.md": "5b4ae14c87859bd2", - "gsd-core/workflows/verify-phase.md": "20e90407e1e531fc", - "gsd-core/workflows/verify-work.md": "6fa216623778c541", + "gsd-core/workflows/update.md": "9cad8a8f4baff922", + "gsd-core/workflows/validate-phase.md": "54687a0f2a562fc4", + "gsd-core/workflows/verify-phase.md": "5caca0023bc88a9a", + "gsd-core/workflows/verify-work.md": "a327274299317cb1", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", @@ -326,8 +324,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc", "skills/gsd-ns-context/skills/graphify/SKILL.md": "030050fcd08d129d", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "19aec854da15f77b", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "588ddf4fbf3ebe65", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "2d95e385fee26dee", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "5647f915e5c85482", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "d41523e659d1920f", "skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "fb53053848bb6695", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "d8e26a5ed95a4ecc", @@ -375,7 +373,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "c35f175ccc747d56", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "48267dc071481a89", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "62dc6ae62bb38c16", - "skills/gsd-ns-workflow/SKILL.md": "0cb9c23c065fe448", + "skills/gsd-ns-workflow/SKILL.md": "7dbd699b5130c0d5", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "addc3a220961a9c7", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "e74b83a991dc9fc7", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "37dc7b78ceb74803", @@ -383,7 +381,6 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "e249a35959e49e99", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "3eae6536d09c2532", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "6c2beccceb46fda1", - "skills/gsd-ns-workflow/skills/next/SKILL.md": "3856471d0f64bf09", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "4e1363db6013a1e5", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "b7a6ff2837b41143", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "b7d213288df9aa96", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 5151d0025..e066adaef 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "93ca6e24f4fd3681", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "1cf3a9fdade9a470", + "agents/gsd-code-fixer.md": "2230fda7f06a3906", "agents/gsd-code-reviewer.md": "5342fcc0da974696", "agents/gsd-codebase-mapper.md": "b995bf01af0193d2", - "agents/gsd-debug-session-manager.md": "a5649998f68812d5", - "agents/gsd-debugger.md": "a63306f54bdc63bf", + "agents/gsd-debug-session-manager.md": "d7c0e160cbf76c68", + "agents/gsd-debugger.md": "fdf0aee402605636", "agents/gsd-doc-classifier.md": "095e804a82f4a47f", "agents/gsd-doc-synthesizer.md": "2a78fe239d00389c", "agents/gsd-doc-verifier.md": "e74d930905a782ea", "agents/gsd-doc-writer.md": "ed5678dd38c83716", "agents/gsd-domain-researcher.md": "1c1a800108a2b225", - "agents/gsd-eval-auditor.md": "99012004b14ea602", + "agents/gsd-eval-auditor.md": "3d3e9336c01e90fe", "agents/gsd-eval-planner.md": "4ebdd7fe9cbb0cfe", - "agents/gsd-executor.md": "d0bfc88c01a63181", + "agents/gsd-executor.md": "a5041170a536bebd", "agents/gsd-framework-selector.md": "7726fccc86bfeb50", "agents/gsd-integration-checker.md": "2d8339790bbb2dc3", - "agents/gsd-intel-updater.md": "c51339956197cbd3", - "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", + "agents/gsd-intel-updater.md": "ec317a56d4abc4d3", + "agents/gsd-mempalace-curator.md": "63676937f8970bf3", "agents/gsd-nyquist-auditor.md": "42676eea063d2ec5", "agents/gsd-pattern-mapper.md": "92cfa2e6c2a06bf3", - "agents/gsd-phase-researcher.md": "6338474da1a5d65e", - "agents/gsd-plan-checker.md": "e704c083b02e8c35", - "agents/gsd-planner.md": "164eab970e2cf025", - "agents/gsd-project-researcher.md": "e43c59f7f1f2f37a", - "agents/gsd-research-synthesizer.md": "87955470c3c129b2", + "agents/gsd-phase-researcher.md": "09657cecf0374c21", + "agents/gsd-plan-checker.md": "ad4ff5b285bffd57", + "agents/gsd-planner.md": "7573900da2449268", + "agents/gsd-project-researcher.md": "defda280dac420e7", + "agents/gsd-research-synthesizer.md": "6c3b691dba5395c6", "agents/gsd-roadmapper.md": "20b69eff61a7a9fa", "agents/gsd-security-auditor.md": "d3b8f44034a76c9d", "agents/gsd-ui-auditor.md": "a26bbc733817959b", "agents/gsd-ui-checker.md": "30aa8e8efa880bd0", - "agents/gsd-ui-researcher.md": "5b2d98efecd3ca11", + "agents/gsd-ui-researcher.md": "e1faa0ad884633ba", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "c8a8c73a277a512f", + "agents/gsd-verifier.md": "1f0f65332e5fbbf8", "commands/gsd-add-tests.md": "aa65032141557fb7", "commands/gsd-ai-integration-phase.md": "373053d7cd887aa9", "commands/gsd-audit-fix.md": "c21ef925131fade7", @@ -63,19 +63,18 @@ "commands/gsd-ingest-docs.md": "ab3e58239c23d61d", "commands/gsd-manager.md": "bfe9e261fa918876", "commands/gsd-map-codebase.md": "9ed09a9a9ce48ffd", - "commands/gsd-mempalace-capture.md": "e9e00b0602e1d8b8", - "commands/gsd-mempalace-recall.md": "6efef238d8c62569", + "commands/gsd-mempalace-capture.md": "6fa6ca7a1ecd562d", + "commands/gsd-mempalace-recall.md": "146d97ab543d8df2", "commands/gsd-milestone-summary.md": "e3a36fbd695a1833", "commands/gsd-mvp-phase.md": "671791ba61c4654a", "commands/gsd-new-milestone.md": "00b5d757991941c7", "commands/gsd-new-project.md": "490195d5003d3d17", - "commands/gsd-next.md": "dbec71acc9d5d2a2", "commands/gsd-ns-context.md": "cc8954f405ae7916", "commands/gsd-ns-ideate.md": "fd1dd80d705e6e36", "commands/gsd-ns-manage.md": "5cc012d0be1caabb", "commands/gsd-ns-project.md": "52e30c8d84bb1ee5", "commands/gsd-ns-review.md": "a28dbfd4aba5f74b", - "commands/gsd-ns-workflow.md": "a1b874be9cf16caf", + "commands/gsd-ns-workflow.md": "dcd214fc50008d42", "commands/gsd-pause-work.md": "6caa75a7c2b4dd2d", "commands/gsd-phase.md": "e3ca4958ea20a935", "commands/gsd-plan-phase.md": "6de27d54ac191539", @@ -107,13 +106,12 @@ "commands/gsd-workstreams.md": "884b6c8d648422c7", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -154,7 +152,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", + "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -177,7 +175,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "7fe958e09e74b6c8", + "gsd-core/references/planning-config.md": "1c3a3aae2ae89e83", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -261,120 +259,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "1bc7377b105194fc", - "gsd-core/workflows/add-phase.md": "46e0551ffdd8ce1a", - "gsd-core/workflows/add-tests.md": "2c1da65d41dc12d2", - "gsd-core/workflows/add-todo.md": "cc0efe270004c8fb", - "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "1153d35058e3e24f", + "gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba", + "gsd-core/workflows/add-tests.md": "2871f7e6409ba89e", + "gsd-core/workflows/add-todo.md": "3b913840c1f490b2", + "gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", - "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", - "gsd-core/workflows/autonomous.md": "7e5683728ef33707", - "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", - "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", - "gsd-core/workflows/code-review-fix.md": "c323f7098b671bd6", - "gsd-core/workflows/code-review.md": "ad450c6ef8459dad", - "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "849d7e5b9c12dcae", - "gsd-core/workflows/diagnose-issues.md": "77d98ac07c4a26ff", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9", + "gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793", + "gsd-core/workflows/autonomous.md": "1184e5864e201889", + "gsd-core/workflows/check-todos.md": "1e3026abe782bd36", + "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", + "gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93", + "gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e", + "gsd-core/workflows/complete-milestone.md": "337d177126f1bd67", + "gsd-core/workflows/debug.md": "da62e7a62c113b29", + "gsd-core/workflows/diagnose-issues.md": "690c523df07f2ea7", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "1e229f6d21831d60", + "gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "02a5381c9a2173be", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", + "gsd-core/workflows/discuss-phase.md": "a0b7539c8b3c25cd", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", + "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853", + "gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", - "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", - "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", - "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "2f9b53aac81a8f27", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", + "gsd-core/workflows/do.md": "152e9c5c512f79cb", + "gsd-core/workflows/docs-update.md": "806ada831b961116", + "gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5", + "gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae", + "gsd-core/workflows/execute-phase.md": "d3c1583906de7408", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "933d10547116794a", - "gsd-core/workflows/explore.md": "6c04f2e658d93261", - "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", + "gsd-core/workflows/execute-plan.md": "89fc525aecb29aad", + "gsd-core/workflows/explore.md": "11523b829cc67c29", + "gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "0d500a3f5ab26913", - "gsd-core/workflows/graduation.md": "47f1594c88c08501", - "gsd-core/workflows/health.md": "107e3c72e76d9535", + "gsd-core/workflows/forensics.md": "b4bde768fd27a982", + "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", + "gsd-core/workflows/health.md": "e3cb8ff4e01e9e53", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "4c018bcc9ed4e55c", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", - "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", + "gsd-core/workflows/help/modes/full.md": "de202c9910773a1d", + "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", + "gsd-core/workflows/import.md": "97861d522319d56e", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", - "gsd-core/workflows/insert-phase.md": "08dca838d831bb5b", + "gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3", + "gsd-core/workflows/insert-phase.md": "621f9e75725542b1", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "b687f2a843032d65", - "gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453", - "gsd-core/workflows/manager.md": "3ba7a3e8213c4b23", - "gsd-core/workflows/map-codebase.md": "83d750aade709983", - "gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043", - "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", - "gsd-core/workflows/new-milestone.md": "a616efb0f82d1a11", - "gsd-core/workflows/new-project.md": "278e0b88dd1d2ea0", - "gsd-core/workflows/new-workspace.md": "017688423110ed66", - "gsd-core/workflows/next.md": "13fb800f2472d970", + "gsd-core/workflows/list-seeds.md": "0a466d04df300854", + "gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b", + "gsd-core/workflows/manager.md": "a31f7e255dd7d01d", + "gsd-core/workflows/map-codebase.md": "582bddef590de9c6", + "gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a", + "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", + "gsd-core/workflows/new-milestone.md": "23d2135a555e95df", + "gsd-core/workflows/new-project.md": "2fa5ddc0fe749b28", + "gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1", + "gsd-core/workflows/next.md": "48bd4b5d54f0d1f8", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", - "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", - "gsd-core/workflows/plan-phase.md": "3e4debac4579684f", + "gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b", + "gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25", + "gsd-core/workflows/plan-phase.md": "9fc35fa37928c14e", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5", - "gsd-core/workflows/plan-review-convergence.md": "c635ecb8590a724e", - "gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede", - "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", - "gsd-core/workflows/profile-user.md": "4fa910d15dea5695", - "gsd-core/workflows/progress.md": "893aa3c36983f74b", - "gsd-core/workflows/quick.md": "5e7dcdd864513b87", - "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", - "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", - "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", - "gsd-core/workflows/resume-project.md": "f28da1200e4545f4", - "gsd-core/workflows/review.md": "f3c2e894941c9943", - "gsd-core/workflows/scan.md": "003883d71c37da7d", - "gsd-core/workflows/secure-phase.md": "29fc6b62c5c5dc62", + "gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd", + "gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06", + "gsd-core/workflows/pr-branch.md": "f2a35833fe784a53", + "gsd-core/workflows/profile-user.md": "fd15f5d92ac1703b", + "gsd-core/workflows/progress.md": "057699b34b6198f7", + "gsd-core/workflows/quick.md": "eb197ddd523f6670", + "gsd-core/workflows/reapply-patches.md": "7915e40411490bbe", + "gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9", + "gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc", + "gsd-core/workflows/resume-project.md": "b18b51fd15cbce95", + "gsd-core/workflows/review.md": "fbfa6eebcad41aa0", + "gsd-core/workflows/scan.md": "54ff1ff60041d065", + "gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "b57c947edee905bc", - "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", - "gsd-core/workflows/settings.md": "b2d39d972650f5f3", - "gsd-core/workflows/ship.md": "7b8fe9f89143e648", - "gsd-core/workflows/sketch-wrap-up.md": "2aba89ecd8f41a0d", - "gsd-core/workflows/sketch.md": "5eedd93f9a5b49d5", - "gsd-core/workflows/smart-entry.md": "449238eb94abe187", - "gsd-core/workflows/spec-phase.md": "8c480bd91f3cef6f", - "gsd-core/workflows/spike-wrap-up.md": "2b004744c52e565c", - "gsd-core/workflows/spike.md": "24a0fee1447b6f0a", - "gsd-core/workflows/stats.md": "76a42cbeaf6007c2", + "gsd-core/workflows/settings-advanced.md": "895e94e9193c2de2", + "gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed", + "gsd-core/workflows/settings.md": "48d337eb7e3f141b", + "gsd-core/workflows/ship.md": "d26fb5d3e965642a", + "gsd-core/workflows/sketch-wrap-up.md": "7d52aa95ee69d47a", + "gsd-core/workflows/sketch.md": "55cee885b4add548", + "gsd-core/workflows/spec-phase.md": "2aa0353147153776", + "gsd-core/workflows/spike-wrap-up.md": "2fde13092ba1af57", + "gsd-core/workflows/spike.md": "0051a7e2193a7522", + "gsd-core/workflows/stats.md": "01c24349370a0e6d", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "927e7eeefd2fcf5c", - "gsd-core/workflows/transition.md": "cb8ec5affb7ebba1", - "gsd-core/workflows/ui-phase.md": "7313e999421db8c1", - "gsd-core/workflows/ui-review.md": "7acfc485526d064b", - "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", + "gsd-core/workflows/thread.md": "6d075b5d26500e9d", + "gsd-core/workflows/transition.md": "eee3435817fab185", + "gsd-core/workflows/ui-phase.md": "93ea0d0dfcb2a1e8", + "gsd-core/workflows/ui-review.md": "1ad3654435000881", + "gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "5ff1f77222977648", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", - "gsd-core/workflows/verify-phase.md": "98a995046bdb6c3c", - "gsd-core/workflows/verify-work.md": "34e980a6950cd83c", + "gsd-core/workflows/update.md": "6a593863d1b0a287", + "gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb", + "gsd-core/workflows/verify-phase.md": "7579af6cd757f644", + "gsd-core/workflows/verify-work.md": "d77ace0fc4f33ff7", "hooks/gsd-check-update-worker.js": "bdc9324a2f080ddd", "hooks/gsd-check-update.js": "b7669f605631e506", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -438,19 +435,18 @@ "skills/gsd-ingest-docs/SKILL.md": "2df55e0ec95d57d9", "skills/gsd-manager/SKILL.md": "816db4d4ed618537", "skills/gsd-map-codebase/SKILL.md": "00622b489483ba69", - "skills/gsd-mempalace-capture/SKILL.md": "5f10d368835e062c", - "skills/gsd-mempalace-recall/SKILL.md": "70c8491f53f4161b", + "skills/gsd-mempalace-capture/SKILL.md": "12a57bef275e2961", + "skills/gsd-mempalace-recall/SKILL.md": "69275abbee414350", "skills/gsd-milestone-summary/SKILL.md": "9eb030a1ac307fa1", "skills/gsd-mvp-phase/SKILL.md": "236fcdd69f47d101", "skills/gsd-new-milestone/SKILL.md": "be371ad30631385e", "skills/gsd-new-project/SKILL.md": "793f7177d3bd026b", - "skills/gsd-next/SKILL.md": "43c805425b88bf75", "skills/gsd-ns-context/SKILL.md": "305b9b6248e8cc95", "skills/gsd-ns-ideate/SKILL.md": "c63a1aed61888b35", "skills/gsd-ns-manage/SKILL.md": "6a5b711b5103c566", "skills/gsd-ns-project/SKILL.md": "345ea11ccffd21b0", "skills/gsd-ns-review/SKILL.md": "98f1f3b3caf1a279", - "skills/gsd-ns-workflow/SKILL.md": "b77682820700300b", + "skills/gsd-ns-workflow/SKILL.md": "eda03f7d99eb2f8e", "skills/gsd-pause-work/SKILL.md": "e2de20b7539e78d4", "skills/gsd-phase/SKILL.md": "f87211f779315ced", "skills/gsd-plan-phase/SKILL.md": "6134e837750034ab", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 5dc6e7282..4c9876192 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -1,22 +1,22 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.md": "eea6d1604aaf305c", + "agents/gsd-advisor-researcher.md": "3995e081531dd043", "agents/gsd-advisor-researcher.toml": "144f037c79aa9c26", - "agents/gsd-ai-researcher.md": "303be751c91da4c8", + "agents/gsd-ai-researcher.md": "9deaf29ae170faff", "agents/gsd-ai-researcher.toml": "5a16e952628fdeb0", "agents/gsd-assumptions-analyzer.md": "21ee3cd4095f7cf8", "agents/gsd-assumptions-analyzer.toml": "9460360826f33ab1", - "agents/gsd-code-fixer.md": "4fa4dbb501513bc3", - "agents/gsd-code-fixer.toml": "c8286e7d68753288", + "agents/gsd-code-fixer.md": "2b98fffbdf9484b8", + "agents/gsd-code-fixer.toml": "04266b0cb2978cfb", "agents/gsd-code-reviewer.md": "854d93fb1e91fca4", "agents/gsd-code-reviewer.toml": "66420d6e6ffd14eb", "agents/gsd-codebase-mapper.md": "cf8f8550b44aec35", "agents/gsd-codebase-mapper.toml": "a4609f3ac66c2081", - "agents/gsd-debug-session-manager.md": "3d4779f94c6cfb14", - "agents/gsd-debug-session-manager.toml": "c8d894c734e97256", - "agents/gsd-debugger.md": "cb8a103ed221ca7c", - "agents/gsd-debugger.toml": "b31333b83a8fed0a", + "agents/gsd-debug-session-manager.md": "a4433f8cac0ae81c", + "agents/gsd-debug-session-manager.toml": "8b45a8660607e1ae", + "agents/gsd-debugger.md": "7ee37c67fb1becbe", + "agents/gsd-debugger.toml": "0824394ba49b977f", "agents/gsd-doc-classifier.md": "0ee2bcb95b247ef8", "agents/gsd-doc-classifier.toml": "8b94b5c8b02c133a", "agents/gsd-doc-synthesizer.md": "2a3fbfce6cf5e671", @@ -25,36 +25,36 @@ "agents/gsd-doc-verifier.toml": "c0b7ac150730b954", "agents/gsd-doc-writer.md": "0a3557268f169722", "agents/gsd-doc-writer.toml": "d21d67f9ba074156", - "agents/gsd-domain-researcher.md": "fbd2f916f265c106", + "agents/gsd-domain-researcher.md": "bafef7d698ccb928", "agents/gsd-domain-researcher.toml": "a49ddec9005b4bf5", - "agents/gsd-eval-auditor.md": "2810917e02e5547c", - "agents/gsd-eval-auditor.toml": "9b81d61b3c5f722d", + "agents/gsd-eval-auditor.md": "0e3aa386f7eb654f", + "agents/gsd-eval-auditor.toml": "531377421cf4f8f8", "agents/gsd-eval-planner.md": "73f2ad2ff2797a51", "agents/gsd-eval-planner.toml": "09468ad1a34ac468", - "agents/gsd-executor.md": "93a05c1436bc4458", - "agents/gsd-executor.toml": "f5a55d4eacd8613c", + "agents/gsd-executor.md": "79d169658b54851c", + "agents/gsd-executor.toml": "410f786fed366ab8", "agents/gsd-framework-selector.md": "ebae32430887d2e0", "agents/gsd-framework-selector.toml": "637e4e021b7ec380", "agents/gsd-integration-checker.md": "9cc875676cf7d741", "agents/gsd-integration-checker.toml": "53f3cfac6fbd6447", - "agents/gsd-intel-updater.md": "8e5453421c92c0fd", - "agents/gsd-intel-updater.toml": "94888d7182fd2fb5", - "agents/gsd-mempalace-curator.md": "60a8ec0e990ba777", - "agents/gsd-mempalace-curator.toml": "015f156ad7d2dd0f", + "agents/gsd-intel-updater.md": "097c1a4b90b28ba0", + "agents/gsd-intel-updater.toml": "07f8098bd5e0e65e", + "agents/gsd-mempalace-curator.md": "159f24243bf3acfb", + "agents/gsd-mempalace-curator.toml": "30bcaf1ca0b926db", "agents/gsd-nyquist-auditor.md": "554dbb4a01760a9d", "agents/gsd-nyquist-auditor.toml": "b3d7214b42fb67fa", "agents/gsd-pattern-mapper.md": "efbcfa7c5de4027f", "agents/gsd-pattern-mapper.toml": "48a17baa3d7d142c", - "agents/gsd-phase-researcher.md": "87d74324e7708ea0", - "agents/gsd-phase-researcher.toml": "44a3d510cd0ce3bd", - "agents/gsd-plan-checker.md": "e7f02c10ea788aee", - "agents/gsd-plan-checker.toml": "6f8ceb421d0ad721", - "agents/gsd-planner.md": "5d638a2e37b63731", - "agents/gsd-planner.toml": "50cec2af6b45a61c", - "agents/gsd-project-researcher.md": "959f2e57c3d69ed8", - "agents/gsd-project-researcher.toml": "f395e8e8c4baf1ed", - "agents/gsd-research-synthesizer.md": "497f85adf53259ef", - "agents/gsd-research-synthesizer.toml": "053616d4941a1458", + "agents/gsd-phase-researcher.md": "d34ec667b611aa51", + "agents/gsd-phase-researcher.toml": "da31585e405a30e7", + "agents/gsd-plan-checker.md": "3f282936630b20d2", + "agents/gsd-plan-checker.toml": "2d5ec87349e4af25", + "agents/gsd-planner.md": "179f4a6e8d1ab77c", + "agents/gsd-planner.toml": "1f28070c37c44060", + "agents/gsd-project-researcher.md": "6bba76aaa1afa85d", + "agents/gsd-project-researcher.toml": "b727993c5d18f584", + "agents/gsd-research-synthesizer.md": "2f99bfaa351236e3", + "agents/gsd-research-synthesizer.toml": "bab1d2e3848c1c91", "agents/gsd-roadmapper.md": "e15d82d7781dbff3", "agents/gsd-roadmapper.toml": "0b17f618eafe9be8", "agents/gsd-security-auditor.md": "a4008a6b1d01833b", @@ -63,22 +63,21 @@ "agents/gsd-ui-auditor.toml": "5e9dd62a12a16a1e", "agents/gsd-ui-checker.md": "bf7bf8cc301c65a1", "agents/gsd-ui-checker.toml": "d0a084e82a9ae52d", - "agents/gsd-ui-researcher.md": "2befca69af55e44a", - "agents/gsd-ui-researcher.toml": "b55270666066e501", + "agents/gsd-ui-researcher.md": "1f19197bcf8385a8", + "agents/gsd-ui-researcher.toml": "48032d9873cc82f7", "agents/gsd-user-profiler.md": "1bf5033c929181c1", "agents/gsd-user-profiler.toml": "b9c244bb8fbf8140", - "agents/gsd-verifier.md": "4ac4b860e2504374", - "agents/gsd-verifier.toml": "8ed9fb961409e894", + "agents/gsd-verifier.md": "7c616980dbe8a81a", + "agents/gsd-verifier.toml": "c994bfe9f1379872", "config.toml": "a34316b9ac61a620", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -142,7 +141,7 @@ "gsd-core/references/planner-reviews.md": "7889bfa28e82156b", "gsd-core/references/planner-revision.md": "2ebf1a714d1ec4bf", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "8593e6610784a339", + "gsd-core/references/planning-config.md": "0767f44905c9a65e", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -226,120 +225,119 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "62431b27424ff1ff", - "gsd-core/workflows/add-phase.md": "27f282bf5b8af59d", - "gsd-core/workflows/add-tests.md": "995918665fc78d39", - "gsd-core/workflows/add-todo.md": "097e171f797737df", - "gsd-core/workflows/ai-integration-phase.md": "1dfa15d8f28c022d", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "f33efb61b6810afd", + "gsd-core/workflows/add-phase.md": "b522eb805a7f00be", + "gsd-core/workflows/add-tests.md": "1157f7142099e956", + "gsd-core/workflows/add-todo.md": "218d02344535d232", + "gsd-core/workflows/ai-integration-phase.md": "7e3b8a29d2a71d80", "gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "46edd152d8b63bfc", - "gsd-core/workflows/audit-uat.md": "2564078edb15b5e9", - "gsd-core/workflows/autonomous.md": "92f08626d4aea668", - "gsd-core/workflows/check-todos.md": "b2b103e8638e760a", - "gsd-core/workflows/cleanup.md": "5d48d64664222a3e", - "gsd-core/workflows/code-review-fix.md": "3ff5f7eac2269ca3", - "gsd-core/workflows/code-review.md": "82858ab037b9176e", - "gsd-core/workflows/complete-milestone.md": "017df7443bd08da5", - "gsd-core/workflows/debug.md": "cc7b2d2fd4307a78", - "gsd-core/workflows/diagnose-issues.md": "e38bb21d06dff077", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "28afeeab183e254f", + "gsd-core/workflows/audit-uat.md": "b3b503e9f80dc9f5", + "gsd-core/workflows/autonomous.md": "b6a3fba06ebef11f", + "gsd-core/workflows/check-todos.md": "d847aa758e18d698", + "gsd-core/workflows/cleanup.md": "b990139192ab7c08", + "gsd-core/workflows/code-review-fix.md": "3311f5fa61f8a90b", + "gsd-core/workflows/code-review.md": "937aeabfff8963b3", + "gsd-core/workflows/complete-milestone.md": "c0eab93d97dd298e", + "gsd-core/workflows/debug.md": "e8367cffd3dfa758", + "gsd-core/workflows/diagnose-issues.md": "b6766f3830f5b130", "gsd-core/workflows/discovery-phase.md": "71a4b78ff876a854", - "gsd-core/workflows/discuss-phase-assumptions.md": "f23abfe76623ed63", + "gsd-core/workflows/discuss-phase-assumptions.md": "9d9b1e0b0fbf6e92", "gsd-core/workflows/discuss-phase-power.md": "3f8b83dc6be2e9d5", - "gsd-core/workflows/discuss-phase.md": "7c9df6656b81fda9", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", + "gsd-core/workflows/discuss-phase.md": "b84b5cd94c57b9af", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", "gsd-core/workflows/discuss-phase/modes/all.md": "42e58e1f499f7824", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "d48968f75a2056b7", + "gsd-core/workflows/discuss-phase/modes/auto.md": "48ac14a332568c30", "gsd-core/workflows/discuss-phase/modes/batch.md": "21ee55869eaa7ece", - "gsd-core/workflows/discuss-phase/modes/chain.md": "862a2c45a6096400", + "gsd-core/workflows/discuss-phase/modes/chain.md": "1ff5f2e1654e93f1", "gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "6e1c6f4d8fdd0be3", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "8f3e77a9486bc57b", - "gsd-core/workflows/docs-update.md": "e255317df939e302", - "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", - "gsd-core/workflows/eval-review.md": "63d0d0670b54c244", - "gsd-core/workflows/execute-phase.md": "b6f4765843dc05f7", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f4cacd27d37bac65", + "gsd-core/workflows/do.md": "0792489ee3d22472", + "gsd-core/workflows/docs-update.md": "c5e1ea372f4a9ee8", + "gsd-core/workflows/edit-phase.md": "c83ef0701c19c455", + "gsd-core/workflows/eval-review.md": "68d7d96bd415629b", + "gsd-core/workflows/execute-phase.md": "5db223634afa2b88", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "7ae407e4435c9a2a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "ac1f1d9ada00a91e", - "gsd-core/workflows/explore.md": "2ef10d17c8864a04", - "gsd-core/workflows/extract-learnings.md": "f716aa03fcb5f8da", + "gsd-core/workflows/execute-plan.md": "e67237068c3bc91d", + "gsd-core/workflows/explore.md": "a75d42453e639a5d", + "gsd-core/workflows/extract-learnings.md": "89145eb423bbbef2", "gsd-core/workflows/fast.md": "13252d545947354d", - "gsd-core/workflows/forensics.md": "2e8a01b5b44e65f3", - "gsd-core/workflows/graduation.md": "47f1594c88c08501", - "gsd-core/workflows/health.md": "5b835fc606fd3e9b", + "gsd-core/workflows/forensics.md": "bf6a31b2a3ec2268", + "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", + "gsd-core/workflows/health.md": "e9fe7c29fc41a887", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "becceb85b25dca89", "gsd-core/workflows/help/modes/default.md": "18c7dc50066f5cd6", - "gsd-core/workflows/help/modes/full.md": "8a7854a34df89bd8", - "gsd-core/workflows/help/modes/topic.md": "303613ba8b123b9f", - "gsd-core/workflows/import.md": "cb3c8f9d09edb434", + "gsd-core/workflows/help/modes/full.md": "072c20fe275d54df", + "gsd-core/workflows/help/modes/topic.md": "fc6697bdb47df8b3", + "gsd-core/workflows/import.md": "8b8c3a25526c0d41", "gsd-core/workflows/inbox.md": "61b8b10e7a74b2e9", - "gsd-core/workflows/ingest-docs.md": "3cb763e0687d7ffa", - "gsd-core/workflows/insert-phase.md": "5e23bd8d55b388c7", + "gsd-core/workflows/ingest-docs.md": "3680699c20c3ac7d", + "gsd-core/workflows/insert-phase.md": "9f8286598bffe5de", "gsd-core/workflows/list-phase-assumptions.md": "4d245f6ea899bcb9", - "gsd-core/workflows/list-seeds.md": "0a2d9fd5b06b8ded", - "gsd-core/workflows/list-workspaces.md": "bb74607336897b94", - "gsd-core/workflows/manager.md": "3a5abb31ad83334f", - "gsd-core/workflows/map-codebase.md": "2edab7d924b296ff", - "gsd-core/workflows/milestone-summary.md": "a53b30a84f904b50", - "gsd-core/workflows/mvp-phase.md": "100dded5c7b4cb86", - "gsd-core/workflows/new-milestone.md": "86b4b5245fc971f3", - "gsd-core/workflows/new-project.md": "a9dbf207833897cc", - "gsd-core/workflows/new-workspace.md": "3630b78e83b1e491", - "gsd-core/workflows/next.md": "7097a9607a981086", + "gsd-core/workflows/list-seeds.md": "1fb29a83e0769ced", + "gsd-core/workflows/list-workspaces.md": "7fbeaf65ce9890f5", + "gsd-core/workflows/manager.md": "4def33941b0e7d57", + "gsd-core/workflows/map-codebase.md": "320d5bfc9df29013", + "gsd-core/workflows/milestone-summary.md": "77d76610d1c98014", + "gsd-core/workflows/mvp-phase.md": "9a9b8b58d59a893f", + "gsd-core/workflows/new-milestone.md": "e7329ba10b6d8182", + "gsd-core/workflows/new-project.md": "f69c90cee1d7952d", + "gsd-core/workflows/new-workspace.md": "cc9660e79d5ba7b4", + "gsd-core/workflows/next.md": "ede3f6183e513000", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "664da466ab989f9d", - "gsd-core/workflows/pause-work.md": "a217770ecafcb2e0", - "gsd-core/workflows/plan-milestone-gaps.md": "73d46f77c50a0690", - "gsd-core/workflows/plan-phase.md": "89ee3233c1aee273", + "gsd-core/workflows/pause-work.md": "3c2ee96295959527", + "gsd-core/workflows/plan-milestone-gaps.md": "8ee841bcc7adc836", + "gsd-core/workflows/plan-phase.md": "5d3ed552933f81da", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "d838b87563feedf6", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "f10975692cbd036e", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "44a12264f8b61d03", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "f5edc589cab52a7b", - "gsd-core/workflows/plan-review-convergence.md": "acd0b09a302b6773", - "gsd-core/workflows/plant-seed.md": "5b07de07e4593281", - "gsd-core/workflows/pr-branch.md": "d13e1cc81de40896", - "gsd-core/workflows/profile-user.md": "05828c8cc61ef384", - "gsd-core/workflows/progress.md": "7bedc431bb55edb8", - "gsd-core/workflows/quick.md": "85fb48e52f0b3725", - "gsd-core/workflows/reapply-patches.md": "26297b84736e66a4", - "gsd-core/workflows/remove-phase.md": "9ee0fddd11a0d9d4", - "gsd-core/workflows/remove-workspace.md": "19d7465aaa50cb62", - "gsd-core/workflows/resume-project.md": "9965f87eb278f7f8", - "gsd-core/workflows/review.md": "3a086e38f13eab6f", - "gsd-core/workflows/scan.md": "1a3caa5d724d39e9", - "gsd-core/workflows/secure-phase.md": "db91810d16964b1e", + "gsd-core/workflows/plan-review-convergence.md": "f27818025e279aa4", + "gsd-core/workflows/plant-seed.md": "bfa729ff2ad3441a", + "gsd-core/workflows/pr-branch.md": "3b13915429c0e8d9", + "gsd-core/workflows/profile-user.md": "1faa318720f40d31", + "gsd-core/workflows/progress.md": "3e061576e3f6fae1", + "gsd-core/workflows/quick.md": "937615c018fc6853", + "gsd-core/workflows/reapply-patches.md": "fba79b3c55c3b2e7", + "gsd-core/workflows/remove-phase.md": "75c8ca0dbd1ce404", + "gsd-core/workflows/remove-workspace.md": "a9d1dcda7755b6c9", + "gsd-core/workflows/resume-project.md": "94ac2cac4c562557", + "gsd-core/workflows/review.md": "bd3873bea54d6143", + "gsd-core/workflows/scan.md": "29f3b65f5d9de885", + "gsd-core/workflows/secure-phase.md": "858b5e1152b569ed", "gsd-core/workflows/session-report.md": "dd8fa011c9394075", - "gsd-core/workflows/settings-advanced.md": "2cbb05c302f1df5e", - "gsd-core/workflows/settings-integrations.md": "77730321d3d6d317", - "gsd-core/workflows/settings.md": "1e19b0245851afc0", - "gsd-core/workflows/ship.md": "d86233c9a365effd", - "gsd-core/workflows/sketch-wrap-up.md": "07724a390fbb43f6", - "gsd-core/workflows/sketch.md": "576f300dfdde1b7d", - "gsd-core/workflows/smart-entry.md": "6f686195ae531b03", - "gsd-core/workflows/spec-phase.md": "deaec2464a6560ec", - "gsd-core/workflows/spike-wrap-up.md": "ace265c114298376", - "gsd-core/workflows/spike.md": "f42a9983eb9c89a1", - "gsd-core/workflows/stats.md": "6dfc500555849d74", + "gsd-core/workflows/settings-advanced.md": "493ffecd54335be4", + "gsd-core/workflows/settings-integrations.md": "d0443a29f3f924ec", + "gsd-core/workflows/settings.md": "3395b334321ac6fa", + "gsd-core/workflows/ship.md": "125045072ab5017d", + "gsd-core/workflows/sketch-wrap-up.md": "7709bdd7a70f736c", + "gsd-core/workflows/sketch.md": "bfe5a781d6da3ce8", + "gsd-core/workflows/spec-phase.md": "47cea2b5efffa6b0", + "gsd-core/workflows/spike-wrap-up.md": "53a2c51a8d9e6b08", + "gsd-core/workflows/spike.md": "c2f115f0d3251654", + "gsd-core/workflows/stats.md": "0d7449acf349feec", "gsd-core/workflows/sync-skills.md": "e2b793963799f8ce", - "gsd-core/workflows/thread.md": "3eef3b6baf50fbfa", - "gsd-core/workflows/transition.md": "423d12e392f5cb87", - "gsd-core/workflows/ui-phase.md": "de272c1e82f49486", - "gsd-core/workflows/ui-review.md": "5768b7aac1429ea0", - "gsd-core/workflows/ultraplan-phase.md": "0bafc2af27be4591", + "gsd-core/workflows/thread.md": "ee872031abd592e0", + "gsd-core/workflows/transition.md": "c4bded570fafe712", + "gsd-core/workflows/ui-phase.md": "b373c964b222324c", + "gsd-core/workflows/ui-review.md": "a9b2cbba80482cd8", + "gsd-core/workflows/ultraplan-phase.md": "18bbb3b5fcd30f0c", "gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5", - "gsd-core/workflows/update.md": "5c35c0ec0f462ea6", - "gsd-core/workflows/validate-phase.md": "020201a41049679f", - "gsd-core/workflows/verify-phase.md": "b9f70235e777aa81", - "gsd-core/workflows/verify-work.md": "69e27f6f419d0bba", + "gsd-core/workflows/update.md": "4166fd3e3ca72a7b", + "gsd-core/workflows/validate-phase.md": "4e94708c9ca15d70", + "gsd-core/workflows/verify-phase.md": "59bb0b12ebb47f5e", + "gsd-core/workflows/verify-work.md": "c5cf0c2fc422fa4e", "hooks/gsd-check-update.js": "ef48957eb6ac6a10", "hooks/gsd-context-monitor.js": "76fecaaa2babd6c1", "scripts/changeset/README.md": "86ff89331dfd94b2", @@ -383,19 +381,18 @@ "skills/gsd-ingest-docs/SKILL.md": "5bd2838bf0b6dc1b", "skills/gsd-manager/SKILL.md": "cb1cf56f5d3f66d6", "skills/gsd-map-codebase/SKILL.md": "25d0b3adfc8b75dc", - "skills/gsd-mempalace-capture/SKILL.md": "1a7fac4d53f607ab", - "skills/gsd-mempalace-recall/SKILL.md": "7205b02250e89f25", + "skills/gsd-mempalace-capture/SKILL.md": "65164de8f661d217", + "skills/gsd-mempalace-recall/SKILL.md": "4fd21539559aed6c", "skills/gsd-milestone-summary/SKILL.md": "af84ecb400f23556", "skills/gsd-mvp-phase/SKILL.md": "72b65ae927b280fe", "skills/gsd-new-milestone/SKILL.md": "587574d2d475bb10", "skills/gsd-new-project/SKILL.md": "129ac16e6a1f04ba", - "skills/gsd-next/SKILL.md": "7855fd70e387087e", "skills/gsd-ns-context/SKILL.md": "9b496da79789b3f9", "skills/gsd-ns-ideate/SKILL.md": "84ca1cde06110981", "skills/gsd-ns-manage/SKILL.md": "909dafa0cd19ba5a", "skills/gsd-ns-project/SKILL.md": "fb8ad6c2223be3c3", "skills/gsd-ns-review/SKILL.md": "022253010db0e072", - "skills/gsd-ns-workflow/SKILL.md": "cba075bc819b539e", + "skills/gsd-ns-workflow/SKILL.md": "14b6b1915178163f", "skills/gsd-pause-work/SKILL.md": "b379469eed78a196", "skills/gsd-phase/SKILL.md": "25477edc97a90c91", "skills/gsd-plan-phase/SKILL.md": "19ead1acb151a868", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index e547fb848..bc5f66218 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -1,50 +1,49 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.agent.md": "1fb10242ff7fb1c9", - "agents/gsd-ai-researcher.agent.md": "8e9c3a2ddd179bb1", + "agents/gsd-advisor-researcher.agent.md": "ecd72019cd5634c4", + "agents/gsd-ai-researcher.agent.md": "65c846c74f17a74b", "agents/gsd-assumptions-analyzer.agent.md": "cdabed4777a842fe", - "agents/gsd-code-fixer.agent.md": "8f39aacb760aab57", + "agents/gsd-code-fixer.agent.md": "5a2e0c49f3bb49b4", "agents/gsd-code-reviewer.agent.md": "fa1e7c421c78eae1", "agents/gsd-codebase-mapper.agent.md": "949bc73f2a7ea44d", - "agents/gsd-debug-session-manager.agent.md": "558683230ba311ba", - "agents/gsd-debugger.agent.md": "d31e32f73cd1e0dc", + "agents/gsd-debug-session-manager.agent.md": "dcfe78dafab52ae8", + "agents/gsd-debugger.agent.md": "86512dfcc01a26ff", "agents/gsd-doc-classifier.agent.md": "c5025847cf6f968a", "agents/gsd-doc-synthesizer.agent.md": "16cebf04d8998356", "agents/gsd-doc-verifier.agent.md": "0230208ae7ab1a08", "agents/gsd-doc-writer.agent.md": "37ea4932a4b80355", - "agents/gsd-domain-researcher.agent.md": "d603239b3e9fe428", - "agents/gsd-eval-auditor.agent.md": "3c03009564de55c8", + "agents/gsd-domain-researcher.agent.md": "b06738b093df1cb9", + "agents/gsd-eval-auditor.agent.md": "b30590bbf86d755d", "agents/gsd-eval-planner.agent.md": "14751876fc2b5f16", - "agents/gsd-executor.agent.md": "0058082fef5a4985", + "agents/gsd-executor.agent.md": "a6ddc10ef4ebb245", "agents/gsd-framework-selector.agent.md": "cafeec0b3489be45", "agents/gsd-integration-checker.agent.md": "30439b804927acc7", - "agents/gsd-intel-updater.agent.md": "238c1a886f35a25c", - "agents/gsd-mempalace-curator.agent.md": "9e5290ea4c4ac211", + "agents/gsd-intel-updater.agent.md": "21ea4bd0bb45cc2f", + "agents/gsd-mempalace-curator.agent.md": "bbb2c654e8fbf8fb", "agents/gsd-nyquist-auditor.agent.md": "6463a50d90ada125", "agents/gsd-pattern-mapper.agent.md": "b1f488b0fa6a2395", - "agents/gsd-phase-researcher.agent.md": "03cfb510a766fe93", - "agents/gsd-plan-checker.agent.md": "c50a5b008ddcbfad", - "agents/gsd-planner.agent.md": "d40d16eced1c6463", - "agents/gsd-project-researcher.agent.md": "d73bdbe986ffa8a6", - "agents/gsd-research-synthesizer.agent.md": "f03eed4aa89e47c5", + "agents/gsd-phase-researcher.agent.md": "27882fb95b2e4b4a", + "agents/gsd-plan-checker.agent.md": "f59df0a7c77e3853", + "agents/gsd-planner.agent.md": "9a1a6fe5c2aabab6", + "agents/gsd-project-researcher.agent.md": "5201a4a17353dbac", + "agents/gsd-research-synthesizer.agent.md": "85449c6adf0cae4f", "agents/gsd-roadmapper.agent.md": "322048cf8ddcb4e5", "agents/gsd-security-auditor.agent.md": "6f6a88b35dc2a24b", "agents/gsd-ui-auditor.agent.md": "92f50549e84ef482", "agents/gsd-ui-checker.agent.md": "c9958f2587b24156", - "agents/gsd-ui-researcher.agent.md": "d24301cc182be33e", + "agents/gsd-ui-researcher.agent.md": "8af4f969852166d1", "agents/gsd-user-profiler.agent.md": "ae16a248e18dd42b", - "agents/gsd-verifier.agent.md": "87a8e3238e838a39", + "agents/gsd-verifier.agent.md": "ad067649b80e65dc", "copilot-instructions.md": "1fb04111759f1645", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", - "gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6", + "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "10226e9512dd44bf", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -108,7 +107,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "091d7541826f8cb0", + "gsd-core/references/planning-config.md": "ea950944302fba67", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -192,120 +191,119 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "98f2dbb7c7cc93c2", - "gsd-core/workflows/add-phase.md": "34e6dd38c25b5b61", - "gsd-core/workflows/add-tests.md": "e88bc8bc3416bfdd", - "gsd-core/workflows/add-todo.md": "10253591112b7d06", - "gsd-core/workflows/ai-integration-phase.md": "ef0c2474cee76b00", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "e8483ee6b695820f", + "gsd-core/workflows/add-phase.md": "ccd0c5c85ea3172c", + "gsd-core/workflows/add-tests.md": "3868acebc8a61874", + "gsd-core/workflows/add-todo.md": "69ff299331bbedf1", + "gsd-core/workflows/ai-integration-phase.md": "4b802634f8dfcf58", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "d25431af0ecf6355", - "gsd-core/workflows/audit-milestone.md": "19e03e6d34d96f38", - "gsd-core/workflows/audit-uat.md": "5ea0e30548ed0933", - "gsd-core/workflows/autonomous.md": "dd972ddde9663295", - "gsd-core/workflows/check-todos.md": "be9b50b5f28d7504", - "gsd-core/workflows/cleanup.md": "8233b05ebf011bec", - "gsd-core/workflows/code-review-fix.md": "ab2b467b41522c10", - "gsd-core/workflows/code-review.md": "1bbbe61f45fccf4c", - "gsd-core/workflows/complete-milestone.md": "470cf39261400ee2", - "gsd-core/workflows/debug.md": "36cb536be452d79e", - "gsd-core/workflows/diagnose-issues.md": "42acbe2a43fc886e", + "gsd-core/workflows/audit-fix.md": "bd88277e075ec47f", + "gsd-core/workflows/audit-milestone.md": "3c1624402b54073d", + "gsd-core/workflows/audit-uat.md": "eccd8feb247425b0", + "gsd-core/workflows/autonomous.md": "9a91017ca1ccbaf1", + "gsd-core/workflows/check-todos.md": "4cdc0f448c772fbf", + "gsd-core/workflows/cleanup.md": "a67cfbd98eca5b86", + "gsd-core/workflows/code-review-fix.md": "84d5f91b2856a1f2", + "gsd-core/workflows/code-review.md": "fd8cd5c87ab977c2", + "gsd-core/workflows/complete-milestone.md": "172f380eaa4ffe85", + "gsd-core/workflows/debug.md": "d9a9d4c858da1314", + "gsd-core/workflows/diagnose-issues.md": "3810d5329109a87e", "gsd-core/workflows/discovery-phase.md": "8e99da61fb2b7074", - "gsd-core/workflows/discuss-phase-assumptions.md": "ab2d26b194805ac1", + "gsd-core/workflows/discuss-phase-assumptions.md": "38ba3a06ab79f1ce", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "31a79ea11c1cdd5f", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "654cdaf1138d5e27", + "gsd-core/workflows/discuss-phase.md": "1f4b3bbe790b46c8", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "1247a438ddb8ba36", "gsd-core/workflows/discuss-phase/modes/all.md": "e5fe9c9c1e2bec1a", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "329ac35098e50297", + "gsd-core/workflows/discuss-phase/modes/auto.md": "7609f2b4b75f41ea", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "c30f4a4bcd174259", + "gsd-core/workflows/discuss-phase/modes/chain.md": "b54a5ee44b9d3a4b", "gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c", "gsd-core/workflows/discuss-phase/modes/power.md": "9c97731f22d7bce9", "gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "988a20dab90c60c5", - "gsd-core/workflows/docs-update.md": "9292cfa3c52c434e", - "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", - "gsd-core/workflows/eval-review.md": "81c8e72ba3862856", - "gsd-core/workflows/execute-phase.md": "bc0ec0e19ce96269", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "63b712920f21a40f", + "gsd-core/workflows/do.md": "4fe59d153e5d36b9", + "gsd-core/workflows/docs-update.md": "15436f1f87ce9bd2", + "gsd-core/workflows/edit-phase.md": "a619911fd32d1f8e", + "gsd-core/workflows/eval-review.md": "b29095c5e7149975", + "gsd-core/workflows/execute-phase.md": "dcb483d5fceffac1", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8d835dbbc9bc72cf", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "15f872e83ad87196", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a01e6aae9f3e416e", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "c5e9dae726db15cc", - "gsd-core/workflows/explore.md": "5fd91a8510e1114b", - "gsd-core/workflows/extract-learnings.md": "f34d0b1927545b18", + "gsd-core/workflows/execute-plan.md": "da6dddd551737699", + "gsd-core/workflows/explore.md": "072bcf510734657b", + "gsd-core/workflows/extract-learnings.md": "83d19c1c9f87f797", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "459644dce26ee2ef", - "gsd-core/workflows/graduation.md": "f013efc29096faf0", - "gsd-core/workflows/health.md": "f343fd32a0e398e4", + "gsd-core/workflows/forensics.md": "6b0e23f4dc04dbf9", + "gsd-core/workflows/graduation.md": "e64a735e71c39307", + "gsd-core/workflows/health.md": "56d1a87cf530c9a8", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "0e9381367d6257bd", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", - "gsd-core/workflows/import.md": "f4fa65e332b00f7e", + "gsd-core/workflows/help/modes/full.md": "6985d700bbb1cbe5", + "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", + "gsd-core/workflows/import.md": "0e4a8880126d196b", "gsd-core/workflows/inbox.md": "a448220c548f27bc", - "gsd-core/workflows/ingest-docs.md": "52be14d1a0713731", - "gsd-core/workflows/insert-phase.md": "60a52a63a8b288f6", + "gsd-core/workflows/ingest-docs.md": "c34b9511b9ea92d8", + "gsd-core/workflows/insert-phase.md": "fc8452ee57b3dbf8", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "71dc6f748b1d1c0e", - "gsd-core/workflows/list-workspaces.md": "3c9f76af08ced623", - "gsd-core/workflows/manager.md": "97f57c099a668f83", - "gsd-core/workflows/map-codebase.md": "b426a450e5d90cc3", - "gsd-core/workflows/milestone-summary.md": "8a53906253984a62", - "gsd-core/workflows/mvp-phase.md": "93304b26c92e4418", - "gsd-core/workflows/new-milestone.md": "e5b527a9ba2c7d31", - "gsd-core/workflows/new-project.md": "5c34f0cb064568bd", - "gsd-core/workflows/new-workspace.md": "403796bdf6318515", - "gsd-core/workflows/next.md": "81c08abb34b2da88", + "gsd-core/workflows/list-seeds.md": "7040c63f68b59c10", + "gsd-core/workflows/list-workspaces.md": "e8e224465d78e733", + "gsd-core/workflows/manager.md": "c4eac43acf69d7fd", + "gsd-core/workflows/map-codebase.md": "576d06b03edff8db", + "gsd-core/workflows/milestone-summary.md": "a77da1477b8df866", + "gsd-core/workflows/mvp-phase.md": "803ddbd575f86311", + "gsd-core/workflows/new-milestone.md": "4e252aa59b46d88f", + "gsd-core/workflows/new-project.md": "d0af61f0e5f99485", + "gsd-core/workflows/new-workspace.md": "e61ad52a17e7570a", + "gsd-core/workflows/next.md": "a4cb2a110e0bce2c", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "4a5ee74cf2fc1f54", - "gsd-core/workflows/pause-work.md": "9ce66367be6c40db", - "gsd-core/workflows/plan-milestone-gaps.md": "5cf589802d08bdf3", - "gsd-core/workflows/plan-phase.md": "da462f812d1d0e61", + "gsd-core/workflows/pause-work.md": "324e04e675dc7f7f", + "gsd-core/workflows/plan-milestone-gaps.md": "c0eb896eb42e22d4", + "gsd-core/workflows/plan-phase.md": "371be4167168d461", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "bb052483744f0a6d", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d911a080dc1cece6", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "9eb16ad0b2d3905b", - "gsd-core/workflows/plant-seed.md": "21e461cd39e5181b", - "gsd-core/workflows/pr-branch.md": "2833905f119b5722", - "gsd-core/workflows/profile-user.md": "5cc032206c99ef71", - "gsd-core/workflows/progress.md": "6b9a84a43dc55af5", - "gsd-core/workflows/quick.md": "89c34e07f1bf6f53", - "gsd-core/workflows/reapply-patches.md": "8fd59e24b486f180", - "gsd-core/workflows/remove-phase.md": "e262654e319d1bc4", - "gsd-core/workflows/remove-workspace.md": "ceddfeef5f2d6754", - "gsd-core/workflows/resume-project.md": "40db7f350f5866d8", - "gsd-core/workflows/review.md": "01b40d7ddd69dc8b", - "gsd-core/workflows/scan.md": "dcc2f76d0850e2fb", - "gsd-core/workflows/secure-phase.md": "d87bd706f85bcad6", + "gsd-core/workflows/plan-review-convergence.md": "c238b5858ceb4e57", + "gsd-core/workflows/plant-seed.md": "56451bdf104983b3", + "gsd-core/workflows/pr-branch.md": "a080aed95785cf32", + "gsd-core/workflows/profile-user.md": "f19b17f34ebd4527", + "gsd-core/workflows/progress.md": "09d94d774537e7e0", + "gsd-core/workflows/quick.md": "e694d90e4ef820da", + "gsd-core/workflows/reapply-patches.md": "7e1d16d9a9ccbb03", + "gsd-core/workflows/remove-phase.md": "e94ddfe4eabc0e08", + "gsd-core/workflows/remove-workspace.md": "f28be7f32249f0d4", + "gsd-core/workflows/resume-project.md": "4ebcb4acd3c29302", + "gsd-core/workflows/review.md": "60b8ca1c543ccdfa", + "gsd-core/workflows/scan.md": "28a2847b8d04156e", + "gsd-core/workflows/secure-phase.md": "bae509fa254fe435", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "85f19b66b7d5040f", - "gsd-core/workflows/settings-integrations.md": "a1d146d6bfd14db5", - "gsd-core/workflows/settings.md": "95aa4a9bc0b51e92", - "gsd-core/workflows/ship.md": "b9dc0aaee0ff68e7", - "gsd-core/workflows/sketch-wrap-up.md": "f2590cb6ddbfad94", - "gsd-core/workflows/sketch.md": "e2063966439af8c1", - "gsd-core/workflows/smart-entry.md": "6c707b959a41900b", - "gsd-core/workflows/spec-phase.md": "858184a1966d4d79", - "gsd-core/workflows/spike-wrap-up.md": "a34d1e9ec15ae904", - "gsd-core/workflows/spike.md": "89f299c07ac0edd2", - "gsd-core/workflows/stats.md": "1db01bd96aa570fe", + "gsd-core/workflows/settings-advanced.md": "fcb1336c0e3462b3", + "gsd-core/workflows/settings-integrations.md": "58e6551f9f342736", + "gsd-core/workflows/settings.md": "5dda66befcbb3ad8", + "gsd-core/workflows/ship.md": "0ee4d6bc7e34f716", + "gsd-core/workflows/sketch-wrap-up.md": "804bb69e6c3590a0", + "gsd-core/workflows/sketch.md": "b4d17647e0fb9e5d", + "gsd-core/workflows/spec-phase.md": "117abebab62d6df7", + "gsd-core/workflows/spike-wrap-up.md": "e203ed8e057f654c", + "gsd-core/workflows/spike.md": "716d74cdb2e39a3e", + "gsd-core/workflows/stats.md": "49085df6d4793df3", "gsd-core/workflows/sync-skills.md": "eca50ffe8320dba8", - "gsd-core/workflows/thread.md": "c5cbd66223906998", - "gsd-core/workflows/transition.md": "0bb671f58f9522f3", - "gsd-core/workflows/ui-phase.md": "42142cae9ce6df5e", - "gsd-core/workflows/ui-review.md": "2851b3576894ee75", - "gsd-core/workflows/ultraplan-phase.md": "7217c34dc9eaf7bb", + "gsd-core/workflows/thread.md": "d53698a91bbbe33c", + "gsd-core/workflows/transition.md": "724b6e9b34d85f26", + "gsd-core/workflows/ui-phase.md": "9fefa0db49f2aa3f", + "gsd-core/workflows/ui-review.md": "731bca05f9770a86", + "gsd-core/workflows/ultraplan-phase.md": "2dda203295895bc1", "gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd", - "gsd-core/workflows/update.md": "f444a7cfcd246cfb", - "gsd-core/workflows/validate-phase.md": "2f705775a4b76d42", - "gsd-core/workflows/verify-phase.md": "59d1046b3a2bc481", - "gsd-core/workflows/verify-work.md": "58e9b1b16f773b53", + "gsd-core/workflows/update.md": "712ab18a9b7c14f5", + "gsd-core/workflows/validate-phase.md": "f923eac9442b6053", + "gsd-core/workflows/verify-phase.md": "eea9b642393b6b90", + "gsd-core/workflows/verify-work.md": "a5bcec82bfc2da53", "hooks/gsd-session.json": "0a462834f2a28fee", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", @@ -348,19 +346,18 @@ "skills/gsd-ingest-docs/SKILL.md": "10500de29525f6cf", "skills/gsd-manager/SKILL.md": "9946975bec15e737", "skills/gsd-map-codebase/SKILL.md": "75806f8189d8af49", - "skills/gsd-mempalace-capture/SKILL.md": "f4511f69c14befb7", - "skills/gsd-mempalace-recall/SKILL.md": "89523db66f834b2f", + "skills/gsd-mempalace-capture/SKILL.md": "d7e72629ec3772e2", + "skills/gsd-mempalace-recall/SKILL.md": "5f397524acf592d1", "skills/gsd-milestone-summary/SKILL.md": "5ca1dabfe0cd85f0", "skills/gsd-mvp-phase/SKILL.md": "60ac3c3fa6a6a19b", "skills/gsd-new-milestone/SKILL.md": "e5eafe44e271bb92", "skills/gsd-new-project/SKILL.md": "4ce68352221126c6", - "skills/gsd-next/SKILL.md": "16507fc39a3a0684", "skills/gsd-ns-context/SKILL.md": "d61edde87ae53105", "skills/gsd-ns-ideate/SKILL.md": "ca62cdf78ebe3585", "skills/gsd-ns-manage/SKILL.md": "9b1b7f6d9b877fcd", "skills/gsd-ns-project/SKILL.md": "f1a666fb76527e6b", "skills/gsd-ns-review/SKILL.md": "6405d0b1cf3f245d", - "skills/gsd-ns-workflow/SKILL.md": "243287d21663ba87", + "skills/gsd-ns-workflow/SKILL.md": "4f8a304f83832794", "skills/gsd-pause-work/SKILL.md": "4f0caa008a8001ff", "skills/gsd-phase/SKILL.md": "d38c7f9b1d0d2360", "skills/gsd-plan-phase/SKILL.md": "d257bb9b1786039d", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index e09f7dd30..cdc4b5340 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "abfc97706f16aaaf", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "76085f4442f268e6", + "agents/gsd-code-fixer.md": "d2f341335c66c524", "agents/gsd-code-reviewer.md": "f29d6edbac0a01b6", "agents/gsd-codebase-mapper.md": "d49c91fdab4efc70", - "agents/gsd-debug-session-manager.md": "d6e799fdeb1fadde", - "agents/gsd-debugger.md": "79bccf33fa2b4272", + "agents/gsd-debug-session-manager.md": "b5ea52be3681f202", + "agents/gsd-debugger.md": "a5eb6f3a2e90c7fb", "agents/gsd-doc-classifier.md": "5807f1f7cfa40c42", "agents/gsd-doc-synthesizer.md": "0897098024c17ccd", "agents/gsd-doc-verifier.md": "9934ec11845d41c3", "agents/gsd-doc-writer.md": "73b55c50c0a6bd61", "agents/gsd-domain-researcher.md": "56395dbdabf076f6", - "agents/gsd-eval-auditor.md": "ad2840fd5cd76172", + "agents/gsd-eval-auditor.md": "4910c64c0c2d14d5", "agents/gsd-eval-planner.md": "2049dac060d00eda", - "agents/gsd-executor.md": "1fb2c778178cfa1c", + "agents/gsd-executor.md": "6f810a5779d41661", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "5da30584d06b878c", - "agents/gsd-intel-updater.md": "b8971c5d96e63b38", - "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", + "agents/gsd-intel-updater.md": "7f509a2fb5acb0fe", + "agents/gsd-mempalace-curator.md": "63676937f8970bf3", "agents/gsd-nyquist-auditor.md": "e18b0209cea56a2e", "agents/gsd-pattern-mapper.md": "1229c215677f740d", - "agents/gsd-phase-researcher.md": "982d59921bed463d", - "agents/gsd-plan-checker.md": "ba51999876d40cf2", - "agents/gsd-planner.md": "15b5830dafb94517", - "agents/gsd-project-researcher.md": "beeac940d3a10e76", - "agents/gsd-research-synthesizer.md": "6315f016d55176f4", + "agents/gsd-phase-researcher.md": "ea4e3a03cd0ece30", + "agents/gsd-plan-checker.md": "0f7794651b1d8dba", + "agents/gsd-planner.md": "24fb0a6b37560086", + "agents/gsd-project-researcher.md": "b21a16c82741f50f", + "agents/gsd-research-synthesizer.md": "05177de6f4102b0f", "agents/gsd-roadmapper.md": "d28e7d4bac46dde2", "agents/gsd-security-auditor.md": "5ff44ee432387d93", "agents/gsd-ui-auditor.md": "d824acc3b2a18c53", "agents/gsd-ui-checker.md": "9f0a288ad2c6f56f", - "agents/gsd-ui-researcher.md": "1b4d93bd032ebfde", + "agents/gsd-ui-researcher.md": "7017298eddc0c835", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "dea8e61123848fb4", + "agents/gsd-verifier.md": "eb16a39ea9a0f843", "commands/gsd-add-tests.md": "1f89b16ab2cca426", "commands/gsd-ai-integration-phase.md": "3ccac39673ffb92c", "commands/gsd-audit-fix.md": "d88502ffa2151cec", @@ -63,19 +63,18 @@ "commands/gsd-ingest-docs.md": "9e7f8757b9408c01", "commands/gsd-manager.md": "f300b708a5487c76", "commands/gsd-map-codebase.md": "cf50f4a600119c8a", - "commands/gsd-mempalace-capture.md": "b30bce634ac3136c", - "commands/gsd-mempalace-recall.md": "08c910285469a394", + "commands/gsd-mempalace-capture.md": "eab7aa94d6e71138", + "commands/gsd-mempalace-recall.md": "7da498f89250cb0f", "commands/gsd-milestone-summary.md": "adfad2cf43fc5aad", "commands/gsd-mvp-phase.md": "e8debeee627a0bf2", "commands/gsd-new-milestone.md": "64b997f99b1e6293", "commands/gsd-new-project.md": "f1a6288e80cc16b0", - "commands/gsd-next.md": "e9d8b7c71627e03b", "commands/gsd-ns-context.md": "b551dcc549c6a23f", "commands/gsd-ns-ideate.md": "32f561de74b1bc7b", "commands/gsd-ns-manage.md": "24445a84bd817c5b", "commands/gsd-ns-project.md": "b39b509ac4161d28", "commands/gsd-ns-review.md": "c8550463fbab5e76", - "commands/gsd-ns-workflow.md": "2c1f1fde3c46bb40", + "commands/gsd-ns-workflow.md": "8226be5dc9e99b90", "commands/gsd-pause-work.md": "59630f05f95fff68", "commands/gsd-phase.md": "9a073dcd0f934f90", "commands/gsd-plan-phase.md": "57de92131fcb16b8", @@ -107,13 +106,12 @@ "commands/gsd-workstreams.md": "112660ceb663c750", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828", - "gsd-core/bin/gsd-tools.cjs": "887e2cb9ebdb609d", + "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -177,7 +175,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "a7b41174b754b215", + "gsd-core/references/planning-config.md": "e2330447f33f6609", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -261,120 +259,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "2926457ed07b4500", - "gsd-core/workflows/add-phase.md": "0d90083e9c17bec1", - "gsd-core/workflows/add-tests.md": "1837b9d2affa6913", - "gsd-core/workflows/add-todo.md": "d483ebe8edcf193a", - "gsd-core/workflows/ai-integration-phase.md": "b79f320d59a68773", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "05276889f397ae70", + "gsd-core/workflows/add-phase.md": "27164a671e14a789", + "gsd-core/workflows/add-tests.md": "e8a1387538bf94c6", + "gsd-core/workflows/add-todo.md": "d17cd00fa6610666", + "gsd-core/workflows/ai-integration-phase.md": "f103a92a82055846", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", - "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", - "gsd-core/workflows/autonomous.md": "4b20eda9a0b587ce", - "gsd-core/workflows/check-todos.md": "1a67337d1630848f", - "gsd-core/workflows/cleanup.md": "db47963f103c2748", - "gsd-core/workflows/code-review-fix.md": "49e7f024c551b3a5", - "gsd-core/workflows/code-review.md": "6a9fd2996a6b600e", - "gsd-core/workflows/complete-milestone.md": "1400a4856f592f3e", - "gsd-core/workflows/debug.md": "a73d8018986131ba", - "gsd-core/workflows/diagnose-issues.md": "cd582747131726e3", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04", + "gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12", + "gsd-core/workflows/autonomous.md": "147e36b1795c149c", + "gsd-core/workflows/check-todos.md": "a993c1e7b0eff1f6", + "gsd-core/workflows/cleanup.md": "2bd6ad5f107fe439", + "gsd-core/workflows/code-review-fix.md": "c62547be55f13dcd", + "gsd-core/workflows/code-review.md": "fcb3f24e4cecc737", + "gsd-core/workflows/complete-milestone.md": "36221b9fc6bce09e", + "gsd-core/workflows/debug.md": "2e3c29ded1ce0d28", + "gsd-core/workflows/diagnose-issues.md": "fa7ae5bb16f424a4", "gsd-core/workflows/discovery-phase.md": "7dcf150998559c11", - "gsd-core/workflows/discuss-phase-assumptions.md": "373788c6b7eab272", + "gsd-core/workflows/discuss-phase-assumptions.md": "6b33545647b2fea4", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "14688ff19ce2184c", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "30612a2de153cb5b", + "gsd-core/workflows/discuss-phase.md": "ed3b4ba5216c2bdb", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "5aa0d0e4198a5364", "gsd-core/workflows/discuss-phase/modes/all.md": "d2a1d16e2508a0cd", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "7ae3410133d7f580", + "gsd-core/workflows/discuss-phase/modes/auto.md": "be6041997f72b02e", "gsd-core/workflows/discuss-phase/modes/batch.md": "c23d5bdbdb60362c", - "gsd-core/workflows/discuss-phase/modes/chain.md": "13d7b2c7d8e5b82e", + "gsd-core/workflows/discuss-phase/modes/chain.md": "c3eab4e57f93bd27", "gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "adec29a0217b6664", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73", - "gsd-core/workflows/do.md": "dc0ddd1f8231d26b", - "gsd-core/workflows/docs-update.md": "e86d7d7e2e3dac6d", - "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", - "gsd-core/workflows/eval-review.md": "a86279dd98dd5c03", - "gsd-core/workflows/execute-phase.md": "f9c628754cd74d0a", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", + "gsd-core/workflows/do.md": "e00573dc44d407b5", + "gsd-core/workflows/docs-update.md": "b05a59f3079f6fa7", + "gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c", + "gsd-core/workflows/eval-review.md": "8cc5788e32c15783", + "gsd-core/workflows/execute-phase.md": "c90b217abff9bbb3", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "83dc1bf7f73735c0", - "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", - "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", + "gsd-core/workflows/execute-plan.md": "0f88a132f66b3d8f", + "gsd-core/workflows/explore.md": "aee57d95497ca50a", + "gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3", "gsd-core/workflows/fast.md": "0162075e44072447", - "gsd-core/workflows/forensics.md": "a65f817d4a515291", - "gsd-core/workflows/graduation.md": "53a4a6fa3b4e6613", - "gsd-core/workflows/health.md": "e4d770484b5e7496", + "gsd-core/workflows/forensics.md": "7ab53bb7de12d655", + "gsd-core/workflows/graduation.md": "d00ac4dfe7e1cc43", + "gsd-core/workflows/health.md": "b53e17edbf70ff96", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "37c5149aae232e61", - "gsd-core/workflows/help/modes/full.md": "ed31d1afcbd3591f", - "gsd-core/workflows/help/modes/topic.md": "177d351f7465787d", - "gsd-core/workflows/import.md": "5d5fb8e51f6a243a", + "gsd-core/workflows/help/modes/full.md": "b893a940160dbcb9", + "gsd-core/workflows/help/modes/topic.md": "9f00f5f94c5497aa", + "gsd-core/workflows/import.md": "791424ae67c9cf32", "gsd-core/workflows/inbox.md": "797c287852eb8957", - "gsd-core/workflows/ingest-docs.md": "c6759dbf17e79293", - "gsd-core/workflows/insert-phase.md": "964ca91863a8749a", + "gsd-core/workflows/ingest-docs.md": "b8b06f0561e5e68f", + "gsd-core/workflows/insert-phase.md": "0ab06e370253622b", "gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620", - "gsd-core/workflows/list-seeds.md": "831ddc27b684e30b", - "gsd-core/workflows/list-workspaces.md": "418570fbc8b938da", - "gsd-core/workflows/manager.md": "7efd6874ff9768d6", - "gsd-core/workflows/map-codebase.md": "3118100462eee628", - "gsd-core/workflows/milestone-summary.md": "6c76386b500cc5d3", - "gsd-core/workflows/mvp-phase.md": "50b189c5f4503369", - "gsd-core/workflows/new-milestone.md": "dbdff965e905117d", - "gsd-core/workflows/new-project.md": "a2b559fba00904eb", - "gsd-core/workflows/new-workspace.md": "9e76e96253d54a57", - "gsd-core/workflows/next.md": "174356dcfd7c6c32", + "gsd-core/workflows/list-seeds.md": "5c298515026e60b1", + "gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169", + "gsd-core/workflows/manager.md": "cf0f01254eabfec7", + "gsd-core/workflows/map-codebase.md": "d43dffe5098a8684", + "gsd-core/workflows/milestone-summary.md": "2cc908a8e87df942", + "gsd-core/workflows/mvp-phase.md": "542d898e0e9b928f", + "gsd-core/workflows/new-milestone.md": "514a66fe7d07c0f3", + "gsd-core/workflows/new-project.md": "559e93f61313311b", + "gsd-core/workflows/new-workspace.md": "7045e17f5dbdc204", + "gsd-core/workflows/next.md": "6c3900ed84f03670", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "1c1e466c764e3deb", - "gsd-core/workflows/pause-work.md": "5716362557f44ce4", - "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", - "gsd-core/workflows/plan-phase.md": "c90c001a92fc8a47", + "gsd-core/workflows/pause-work.md": "0be71264eafd16dc", + "gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719", + "gsd-core/workflows/plan-phase.md": "ba95020c3495b191", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "3bed01c3c906ac52", - "gsd-core/workflows/plan-review-convergence.md": "b59d9fea4e574025", - "gsd-core/workflows/plant-seed.md": "7bccd151ce7b69f2", - "gsd-core/workflows/pr-branch.md": "c67d90c65da47168", - "gsd-core/workflows/profile-user.md": "8c943983241260b5", - "gsd-core/workflows/progress.md": "65aabee5e8a6dd82", - "gsd-core/workflows/quick.md": "db98fdbe79d68ffc", - "gsd-core/workflows/reapply-patches.md": "ba9406b60f2c4041", - "gsd-core/workflows/remove-phase.md": "ada8a0546c686483", - "gsd-core/workflows/remove-workspace.md": "433affcd1a200826", - "gsd-core/workflows/resume-project.md": "7f8dc986f0f35d96", - "gsd-core/workflows/review.md": "338005f1da182bdc", - "gsd-core/workflows/scan.md": "47371c2073d6c0be", - "gsd-core/workflows/secure-phase.md": "c55975672c4e1895", + "gsd-core/workflows/plan-review-convergence.md": "783c5171101b26b9", + "gsd-core/workflows/plant-seed.md": "b28224f37faa9b95", + "gsd-core/workflows/pr-branch.md": "1f77535b6b156ad9", + "gsd-core/workflows/profile-user.md": "0d86d846075afe0e", + "gsd-core/workflows/progress.md": "098f9bc1243cf6db", + "gsd-core/workflows/quick.md": "4f354f487cecddb5", + "gsd-core/workflows/reapply-patches.md": "2d7dada9edec108b", + "gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09", + "gsd-core/workflows/remove-workspace.md": "dadbb14d9033ea3f", + "gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35", + "gsd-core/workflows/review.md": "141589a39b8c7e18", + "gsd-core/workflows/scan.md": "8e1bbf2eed1752ca", + "gsd-core/workflows/secure-phase.md": "7bd4c335484fd121", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "3817a94612e4b588", - "gsd-core/workflows/settings-integrations.md": "166ca51b1f33c2a3", - "gsd-core/workflows/settings.md": "1e285d00022e00ce", - "gsd-core/workflows/ship.md": "38830806d244fe9c", - "gsd-core/workflows/sketch-wrap-up.md": "5be73b7bdf96b539", - "gsd-core/workflows/sketch.md": "373bc0d83368a411", - "gsd-core/workflows/smart-entry.md": "c8fc316358cdcd7b", - "gsd-core/workflows/spec-phase.md": "d6e23579376c9e91", - "gsd-core/workflows/spike-wrap-up.md": "4a3bf1058691e55d", - "gsd-core/workflows/spike.md": "f741bead24d5669a", - "gsd-core/workflows/stats.md": "e7852c5d8f2b05a9", + "gsd-core/workflows/settings-advanced.md": "5ea1b546d83f2528", + "gsd-core/workflows/settings-integrations.md": "d6e399eea4b4f3f9", + "gsd-core/workflows/settings.md": "507edbebad95cfc0", + "gsd-core/workflows/ship.md": "597f9423dd372337", + "gsd-core/workflows/sketch-wrap-up.md": "6780757b2db165ac", + "gsd-core/workflows/sketch.md": "4221996fa3d87f7c", + "gsd-core/workflows/spec-phase.md": "fca5397bf040156d", + "gsd-core/workflows/spike-wrap-up.md": "ec64f0f7ab03ef9b", + "gsd-core/workflows/spike.md": "9e37f8067adf87b7", + "gsd-core/workflows/stats.md": "17b4f2059f4b4ef2", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "bf9a944978dad763", - "gsd-core/workflows/transition.md": "f6731bbb766929e7", - "gsd-core/workflows/ui-phase.md": "81f029c1bd2431b7", - "gsd-core/workflows/ui-review.md": "4bc0fd55fc037998", - "gsd-core/workflows/ultraplan-phase.md": "466e01d65c350ef6", + "gsd-core/workflows/thread.md": "cfc42471f9001ba8", + "gsd-core/workflows/transition.md": "96ce39403ca69594", + "gsd-core/workflows/ui-phase.md": "dea2f2d43a43e0d0", + "gsd-core/workflows/ui-review.md": "6b16a7f7783be471", + "gsd-core/workflows/ultraplan-phase.md": "752df97bb6c14ce2", "gsd-core/workflows/undo.md": "18dec684fb1076f9", - "gsd-core/workflows/update.md": "23e294ba707c3580", - "gsd-core/workflows/validate-phase.md": "2df0c6e298a5f249", - "gsd-core/workflows/verify-phase.md": "0d4ffabc1caa473a", - "gsd-core/workflows/verify-work.md": "145596b2542c457a", + "gsd-core/workflows/update.md": "a27dcfd2814bf2b1", + "gsd-core/workflows/validate-phase.md": "f513c28c01a44cb7", + "gsd-core/workflows/verify-phase.md": "15a999f82868ad29", + "gsd-core/workflows/verify-work.md": "531a00b7f46d08db", "hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f", "hooks/gsd-cursor-session-start.js": "c6e04ed597ea7020", "scripts/changeset/README.md": "86ff89331dfd94b2", @@ -418,19 +415,18 @@ "skills/gsd-ingest-docs/SKILL.md": "01ed9183a00252ee", "skills/gsd-manager/SKILL.md": "62cd9f671a39e8a4", "skills/gsd-map-codebase/SKILL.md": "f529da27d3a30b09", - "skills/gsd-mempalace-capture/SKILL.md": "b308823dee547c65", - "skills/gsd-mempalace-recall/SKILL.md": "56f3037091a8bd9a", + "skills/gsd-mempalace-capture/SKILL.md": "c6e93f22453145e8", + "skills/gsd-mempalace-recall/SKILL.md": "62c697606d67eddc", "skills/gsd-milestone-summary/SKILL.md": "c5dbbc8edb97a7f7", "skills/gsd-mvp-phase/SKILL.md": "9d8e2999fa9f7830", "skills/gsd-new-milestone/SKILL.md": "642d0741c89b911a", "skills/gsd-new-project/SKILL.md": "18f587ac0b390d94", - "skills/gsd-next/SKILL.md": "75ef1905cb7425e1", "skills/gsd-ns-context/SKILL.md": "dcf5711653d57354", "skills/gsd-ns-ideate/SKILL.md": "0114f0bc5501c1e3", "skills/gsd-ns-manage/SKILL.md": "f3232d05d5263f5b", "skills/gsd-ns-project/SKILL.md": "9f737a544e8d3f31", "skills/gsd-ns-review/SKILL.md": "8c686e92f293bfdd", - "skills/gsd-ns-workflow/SKILL.md": "c379192bd17d47d7", + "skills/gsd-ns-workflow/SKILL.md": "180031baca2f6d24", "skills/gsd-pause-work/SKILL.md": "10e7531a2cb392ad", "skills/gsd-phase/SKILL.md": "1a2c9b64c1af7ffc", "skills/gsd-plan-phase/SKILL.md": "0784da05d41dcfe7", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 38fb62f79..b11edef4d 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -1,49 +1,48 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.md": "f1c4a47d3d8cea72", - "agents/gsd-ai-researcher.md": "08847faf5494ff08", + "agents/gsd-advisor-researcher.md": "f3f0a55854689045", + "agents/gsd-ai-researcher.md": "72f67082f35c9da1", "agents/gsd-assumptions-analyzer.md": "f11a80795163bb5d", - "agents/gsd-code-fixer.md": "94628312f25decb5", + "agents/gsd-code-fixer.md": "58a5ef0369ba21f8", "agents/gsd-code-reviewer.md": "5ef947ca5baed775", "agents/gsd-codebase-mapper.md": "feccaeeacd05e34b", - "agents/gsd-debug-session-manager.md": "e0bdc1947db579c4", - "agents/gsd-debugger.md": "ec4f796f5c39504a", + "agents/gsd-debug-session-manager.md": "6dd3555fa4ea8e93", + "agents/gsd-debugger.md": "ecf2d6736db0c33e", "agents/gsd-doc-classifier.md": "5de2a66c751b2d58", "agents/gsd-doc-synthesizer.md": "8e6fb8220f777022", "agents/gsd-doc-verifier.md": "d3d8457bdd44bf10", "agents/gsd-doc-writer.md": "2858a8335170e85c", - "agents/gsd-domain-researcher.md": "412cdbb05ba252ea", - "agents/gsd-eval-auditor.md": "4ffb265063c318e5", + "agents/gsd-domain-researcher.md": "d4c07520f650ffd5", + "agents/gsd-eval-auditor.md": "254220230f69ac46", "agents/gsd-eval-planner.md": "03448fc9c5774b56", - "agents/gsd-executor.md": "18365948be7c2dff", + "agents/gsd-executor.md": "ddc4b274f05f59d0", "agents/gsd-framework-selector.md": "ea9981d65d6b3429", "agents/gsd-integration-checker.md": "35b4f2969d279871", - "agents/gsd-intel-updater.md": "5fe5edfae2719cb8", - "agents/gsd-mempalace-curator.md": "399e90e473b33814", + "agents/gsd-intel-updater.md": "03e143f85ab105ed", + "agents/gsd-mempalace-curator.md": "576b8d0db51bc462", "agents/gsd-nyquist-auditor.md": "8bfde4a9a36318aa", "agents/gsd-pattern-mapper.md": "cea092600aeb3978", - "agents/gsd-phase-researcher.md": "2bd0402f33d757ca", - "agents/gsd-plan-checker.md": "4b4e2b475bf5b5c3", - "agents/gsd-planner.md": "018542e335a983fa", - "agents/gsd-project-researcher.md": "425a7df7f37a5c06", - "agents/gsd-research-synthesizer.md": "9d31c87fc2c87ffa", + "agents/gsd-phase-researcher.md": "2b5e6805717399d9", + "agents/gsd-plan-checker.md": "8019a01df555f1e1", + "agents/gsd-planner.md": "c944474b7dd450d4", + "agents/gsd-project-researcher.md": "95e860350a6c1b7c", + "agents/gsd-research-synthesizer.md": "418dbd61eee9308d", "agents/gsd-roadmapper.md": "64dce5d5f9fa5654", "agents/gsd-security-auditor.md": "e4d35ada4ea67d7f", "agents/gsd-ui-auditor.md": "86797e85f718dfac", "agents/gsd-ui-checker.md": "c56fa63fb94ded5f", - "agents/gsd-ui-researcher.md": "25ffa7fa83c32a69", + "agents/gsd-ui-researcher.md": "fff7c2920da4b8af", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", - "agents/gsd-verifier.md": "82d3e9015ed04017", + "agents/gsd-verifier.md": "c5916e463df6306e", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f", - "gsd-core/bin/gsd-tools.cjs": "cbdd5da1b973c6ae", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -107,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "b5a719401e701e12", + "gsd-core/references/planning-config.md": "9b5f8ed49024cdbf", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -191,120 +190,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "79a453a2270483fb", - "gsd-core/workflows/add-phase.md": "b4c4b32c111a116a", - "gsd-core/workflows/add-tests.md": "63390575b418e270", - "gsd-core/workflows/add-todo.md": "5fe3ddc3227e0e22", - "gsd-core/workflows/ai-integration-phase.md": "ddab2912d025db65", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "73e5ca92d9456f53", + "gsd-core/workflows/add-phase.md": "3683d413f223f138", + "gsd-core/workflows/add-tests.md": "49524ea9e54535b6", + "gsd-core/workflows/add-todo.md": "cc4a1b90384ad7b9", + "gsd-core/workflows/ai-integration-phase.md": "006583b7f234af02", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "cc6270e912471cc2", - "gsd-core/workflows/audit-milestone.md": "806d346ee5bfe9f8", - "gsd-core/workflows/audit-uat.md": "86d9131fccabf2ad", - "gsd-core/workflows/autonomous.md": "dd572ca89862e5ec", - "gsd-core/workflows/check-todos.md": "ea9a303c48a5d752", - "gsd-core/workflows/cleanup.md": "6c488059fc152a49", - "gsd-core/workflows/code-review-fix.md": "04b143a963067236", - "gsd-core/workflows/code-review.md": "ff28724fc216972c", - "gsd-core/workflows/complete-milestone.md": "f1866541148dc291", - "gsd-core/workflows/debug.md": "15cf6999e85dcc8c", - "gsd-core/workflows/diagnose-issues.md": "16f2d2a85335641f", + "gsd-core/workflows/audit-fix.md": "5aded4cc2682502b", + "gsd-core/workflows/audit-milestone.md": "c36d1c46d4aecca7", + "gsd-core/workflows/audit-uat.md": "5e93ef61f91ad0c0", + "gsd-core/workflows/autonomous.md": "9bcaed473e38a7a5", + "gsd-core/workflows/check-todos.md": "8807759cc4df46c0", + "gsd-core/workflows/cleanup.md": "6380894e67d2435d", + "gsd-core/workflows/code-review-fix.md": "5090840d834ec31a", + "gsd-core/workflows/code-review.md": "29046f7fa6a9d40a", + "gsd-core/workflows/complete-milestone.md": "7bd066db127dc274", + "gsd-core/workflows/debug.md": "5840a39f14a029c4", + "gsd-core/workflows/diagnose-issues.md": "b350281a56ee5832", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", - "gsd-core/workflows/discuss-phase-assumptions.md": "db60ec68b59a40eb", + "gsd-core/workflows/discuss-phase-assumptions.md": "c158386c6cd92bd5", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "0aa052ae4ee70bf6", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "536e2fa842f1bc95", + "gsd-core/workflows/discuss-phase.md": "f6aa630f777d3006", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "432c381a366be630", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "af2d9d6ebb3f69c9", + "gsd-core/workflows/discuss-phase/modes/auto.md": "524aaa69ae3a9ee5", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "eff83e92368c983a", + "gsd-core/workflows/discuss-phase/modes/chain.md": "1a6400d7663d7643", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "e6d930e2b6769e49", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "045e70c238db6faf", - "gsd-core/workflows/docs-update.md": "4d6c06e611d83b6d", - "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", - "gsd-core/workflows/eval-review.md": "f510e5762212dc6f", - "gsd-core/workflows/execute-phase.md": "c449a87fcca14433", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "ceb8758c22660c1a", + "gsd-core/workflows/do.md": "a1a891c1d5d58d67", + "gsd-core/workflows/docs-update.md": "c9df0f7df1ebec79", + "gsd-core/workflows/edit-phase.md": "57d807e21fe70355", + "gsd-core/workflows/eval-review.md": "d16eebac88386c05", + "gsd-core/workflows/execute-phase.md": "0167a319ed9a5bc5", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b890bafa4a0c8bd3", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "3ab8bc8a07133068", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e34415dec69b8432", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "4dbe9b6f0c976245", - "gsd-core/workflows/explore.md": "48770d68e8b9c132", - "gsd-core/workflows/extract-learnings.md": "e9e167c718949c0b", + "gsd-core/workflows/execute-plan.md": "eb5de66a1cb41271", + "gsd-core/workflows/explore.md": "1c0f3ced293df114", + "gsd-core/workflows/extract-learnings.md": "c6cfb696d3bb51c7", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "91961b811917c5c4", - "gsd-core/workflows/graduation.md": "d1fd52bbe41dcf34", - "gsd-core/workflows/health.md": "c622a5ad0d347d30", + "gsd-core/workflows/forensics.md": "1362bc42a2928d79", + "gsd-core/workflows/graduation.md": "1fb19f28634dd55a", + "gsd-core/workflows/health.md": "32c1276656602ccb", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "bb6876c976996dbd", - "gsd-core/workflows/help/modes/full.md": "fdab4b3690bdd11d", - "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", - "gsd-core/workflows/import.md": "a441445515bc2dd5", + "gsd-core/workflows/help/modes/full.md": "2df924dd3815ff0e", + "gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd", + "gsd-core/workflows/import.md": "da7ca19f487c6b60", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", - "gsd-core/workflows/ingest-docs.md": "ad496a4c423f1ab7", - "gsd-core/workflows/insert-phase.md": "a0537c09191121f6", + "gsd-core/workflows/ingest-docs.md": "8adc1e35097abce2", + "gsd-core/workflows/insert-phase.md": "dad4479236245bd9", "gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c", - "gsd-core/workflows/list-seeds.md": "ad1d81683e48c4e1", - "gsd-core/workflows/list-workspaces.md": "1fe28ba52cee1394", - "gsd-core/workflows/manager.md": "b0322e4514de4c4d", - "gsd-core/workflows/map-codebase.md": "7db2e66647dd3c34", - "gsd-core/workflows/milestone-summary.md": "353fffb60749d892", - "gsd-core/workflows/mvp-phase.md": "4d102523b5d81f95", - "gsd-core/workflows/new-milestone.md": "4988e2b33d02075d", - "gsd-core/workflows/new-project.md": "c596ec378d462fdb", - "gsd-core/workflows/new-workspace.md": "5c78c58ad84e886b", - "gsd-core/workflows/next.md": "8e1fa29751d96564", + "gsd-core/workflows/list-seeds.md": "e4f9d7c12c162ef7", + "gsd-core/workflows/list-workspaces.md": "d3726de6b2eb40b4", + "gsd-core/workflows/manager.md": "c8690740c613f1a5", + "gsd-core/workflows/map-codebase.md": "23fae66ceef58e1c", + "gsd-core/workflows/milestone-summary.md": "d7ac63499e3e5c1a", + "gsd-core/workflows/mvp-phase.md": "5ce3c326ef0f6e27", + "gsd-core/workflows/new-milestone.md": "97750332c52a9ef7", + "gsd-core/workflows/new-project.md": "40c94cfb81bde99b", + "gsd-core/workflows/new-workspace.md": "af3397e97cec7d0b", + "gsd-core/workflows/next.md": "e044321fdd6b5e9c", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", - "gsd-core/workflows/pause-work.md": "ae2d5789a95f70fe", - "gsd-core/workflows/plan-milestone-gaps.md": "c86cdc1964256b98", - "gsd-core/workflows/plan-phase.md": "e995429805b69fdc", + "gsd-core/workflows/pause-work.md": "2c3abcaa1fa6d2e2", + "gsd-core/workflows/plan-milestone-gaps.md": "419744c1191354af", + "gsd-core/workflows/plan-phase.md": "e1dcabd0499a03f9", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "9607e6d03e93c1c2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "99949122a3bd455e", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "62f8e4f3b475fe5f", - "gsd-core/workflows/plan-review-convergence.md": "277e3495fb982045", - "gsd-core/workflows/plant-seed.md": "f862f77fca983749", - "gsd-core/workflows/pr-branch.md": "ecabd55e4eabf229", - "gsd-core/workflows/profile-user.md": "de5030437226cf2c", - "gsd-core/workflows/progress.md": "f18db000584d9cb1", - "gsd-core/workflows/quick.md": "66b26d6fe2bd4d71", - "gsd-core/workflows/reapply-patches.md": "158083a310859594", - "gsd-core/workflows/remove-phase.md": "fce799aae3ab2715", - "gsd-core/workflows/remove-workspace.md": "8facde381657dd71", - "gsd-core/workflows/resume-project.md": "a0443839f1f83c2d", - "gsd-core/workflows/review.md": "f11ffe5b46b50565", - "gsd-core/workflows/scan.md": "b28f65d88c522767", - "gsd-core/workflows/secure-phase.md": "f2957d4b88fb3746", + "gsd-core/workflows/plan-review-convergence.md": "8ebcd05fcd5a0d15", + "gsd-core/workflows/plant-seed.md": "76379e2aeb18d53b", + "gsd-core/workflows/pr-branch.md": "79f4d93e31af9c49", + "gsd-core/workflows/profile-user.md": "8474c1e203be5c8c", + "gsd-core/workflows/progress.md": "173b166cd30fca13", + "gsd-core/workflows/quick.md": "e931e0d4b734eccb", + "gsd-core/workflows/reapply-patches.md": "7af45bb3f2fdd1b8", + "gsd-core/workflows/remove-phase.md": "f27cecd8c78008ae", + "gsd-core/workflows/remove-workspace.md": "977155e18b9df623", + "gsd-core/workflows/resume-project.md": "849f3d49d366ff13", + "gsd-core/workflows/review.md": "06cd9992e289b241", + "gsd-core/workflows/scan.md": "cbde2b8b2b5fa5dd", + "gsd-core/workflows/secure-phase.md": "5fc8fbd5e217e48d", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "9a45f0e5b8acf83d", - "gsd-core/workflows/settings-integrations.md": "1dce76db0aca08a5", - "gsd-core/workflows/settings.md": "cb2b6be87c519df9", - "gsd-core/workflows/ship.md": "dbf8bf636cb196c0", - "gsd-core/workflows/sketch-wrap-up.md": "f1ece50ac65ea281", - "gsd-core/workflows/sketch.md": "d5887983e62b574a", - "gsd-core/workflows/smart-entry.md": "47f5c5e8608e5f7a", - "gsd-core/workflows/spec-phase.md": "6c8835fc65ea1cb8", - "gsd-core/workflows/spike-wrap-up.md": "367325e6d567b904", - "gsd-core/workflows/spike.md": "cdacb2887a321e11", - "gsd-core/workflows/stats.md": "49a991d0d3905a56", + "gsd-core/workflows/settings-advanced.md": "175388eee8afea48", + "gsd-core/workflows/settings-integrations.md": "ab490f2d5c7bbf34", + "gsd-core/workflows/settings.md": "9e35a3fedb0a8f53", + "gsd-core/workflows/ship.md": "3f6e6424d089d4d0", + "gsd-core/workflows/sketch-wrap-up.md": "eb5f0849f07479aa", + "gsd-core/workflows/sketch.md": "9a712af64fc2fff8", + "gsd-core/workflows/spec-phase.md": "79f136ab71edf595", + "gsd-core/workflows/spike-wrap-up.md": "79e23a81bb74bc95", + "gsd-core/workflows/spike.md": "80844a3c05339fdb", + "gsd-core/workflows/stats.md": "01289f444b66913d", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "5a6759e01763c2a6", - "gsd-core/workflows/transition.md": "2f65c0e12675ea08", - "gsd-core/workflows/ui-phase.md": "082a41a0549211fe", - "gsd-core/workflows/ui-review.md": "bc0ae72c0e1cab94", - "gsd-core/workflows/ultraplan-phase.md": "0d103bf2622436f7", + "gsd-core/workflows/thread.md": "596bf37dcea2ce1e", + "gsd-core/workflows/transition.md": "adab3f53afd5d8aa", + "gsd-core/workflows/ui-phase.md": "dd213d91b5c258a5", + "gsd-core/workflows/ui-review.md": "83d6d3b1f26597ff", + "gsd-core/workflows/ultraplan-phase.md": "600377d719253f14", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", - "gsd-core/workflows/update.md": "7499bb4cb2a3ce6f", - "gsd-core/workflows/validate-phase.md": "75e8971d3981d06b", - "gsd-core/workflows/verify-phase.md": "84e00bd685006870", - "gsd-core/workflows/verify-work.md": "e56e07475d5eb51e", + "gsd-core/workflows/update.md": "472d4905fc8c5ce5", + "gsd-core/workflows/validate-phase.md": "067acd7aeed52c5b", + "gsd-core/workflows/verify-phase.md": "4e1d99795e8e9413", + "gsd-core/workflows/verify-work.md": "e93eb5a56b769694", "hooks/gsd-check-update-worker.js": "7989cc2bedd1138d", "hooks/gsd-check-update.js": "25f5ad726f76fc11", "hooks/gsd-config-reload.js": "880b696458e85e9b", @@ -346,8 +344,8 @@ "skills/gsd/gsd-ns-context/skills/extract-learnings/SKILL.md": "36e59d6e514dcaf0", "skills/gsd/gsd-ns-context/skills/graphify/SKILL.md": "169eefd42c444cde", "skills/gsd/gsd-ns-context/skills/map-codebase/SKILL.md": "6062ccca1a14b827", - "skills/gsd/gsd-ns-context/skills/mempalace-capture/SKILL.md": "3fa619f73834c436", - "skills/gsd/gsd-ns-context/skills/mempalace-recall/SKILL.md": "5d06922e0d7ab7d9", + "skills/gsd/gsd-ns-context/skills/mempalace-capture/SKILL.md": "1565901c4833a49e", + "skills/gsd/gsd-ns-context/skills/mempalace-recall/SKILL.md": "eba3ad69c0e7b157", "skills/gsd/gsd-ns-ideate/SKILL.md": "b36bb4700ed6723a", "skills/gsd/gsd-ns-ideate/skills/capture/SKILL.md": "76fc7c1200124ece", "skills/gsd/gsd-ns-ideate/skills/explore/SKILL.md": "bb39acf6117cb9ca", @@ -395,7 +393,7 @@ "skills/gsd/gsd-ns-review/skills/ui-phase/SKILL.md": "3207854a4f0fab67", "skills/gsd/gsd-ns-review/skills/ui-review/SKILL.md": "512c54662616c3f9", "skills/gsd/gsd-ns-review/skills/validate-phase/SKILL.md": "f2c31c34fc8e24c4", - "skills/gsd/gsd-ns-workflow/SKILL.md": "f54502a2c6bf5495", + "skills/gsd/gsd-ns-workflow/SKILL.md": "a5c0c299df224d10", "skills/gsd/gsd-ns-workflow/skills/add-tests/SKILL.md": "29e5863322ad6f2d", "skills/gsd/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "317912c0488d701b", "skills/gsd/gsd-ns-workflow/skills/autonomous/SKILL.md": "3c9bc726e13c4916", @@ -403,7 +401,6 @@ "skills/gsd/gsd-ns-workflow/skills/execute-phase/SKILL.md": "a2e4e6211e09b3c0", "skills/gsd/gsd-ns-workflow/skills/fast/SKILL.md": "c8517ba44da99147", "skills/gsd/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "0804dfd4124526ba", - "skills/gsd/gsd-ns-workflow/skills/next/SKILL.md": "1d30cf6061d15168", "skills/gsd/gsd-ns-workflow/skills/phase/SKILL.md": "610bd06d71198849", "skills/gsd/gsd-ns-workflow/skills/plan-phase/SKILL.md": "f06f0e2fc8def3f0", "skills/gsd/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "fddf8bd7b3ae1f10", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index e3a6692da..0a5a456c2 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "3296fc4edef47f2e", "agents/gsd-ai-researcher.md": "9607993fbaafe9ba", "agents/gsd-assumptions-analyzer.md": "567d823ccd036b39", - "agents/gsd-code-fixer.md": "9652d5b56a2afbf5", + "agents/gsd-code-fixer.md": "a4444d9f58a53613", "agents/gsd-code-reviewer.md": "922c08885bc78662", "agents/gsd-codebase-mapper.md": "0ccbf6a685804979", - "agents/gsd-debug-session-manager.md": "828335b15a46b324", - "agents/gsd-debugger.md": "b59cda547363e617", + "agents/gsd-debug-session-manager.md": "5fd509a86b1335b7", + "agents/gsd-debugger.md": "11e791e0509959b1", "agents/gsd-doc-classifier.md": "dd7670f4fb345994", "agents/gsd-doc-synthesizer.md": "1e987faef95a8c71", "agents/gsd-doc-verifier.md": "8016f792d0766b77", "agents/gsd-doc-writer.md": "72a21cf92542f6c0", "agents/gsd-domain-researcher.md": "a3874d80bcbc7380", - "agents/gsd-eval-auditor.md": "630d4cd3bd6ea195", + "agents/gsd-eval-auditor.md": "d8c45cef7ddf4360", "agents/gsd-eval-planner.md": "3db12cde12aeb2c1", - "agents/gsd-executor.md": "c9aca9129bd4cab3", + "agents/gsd-executor.md": "7f18fa638ef50584", "agents/gsd-framework-selector.md": "ad5f2c6b9bec6270", "agents/gsd-integration-checker.md": "c503e2f4a3d8ec05", - "agents/gsd-intel-updater.md": "231393da62a45b2e", - "agents/gsd-mempalace-curator.md": "c6a7fe754b6ca5e1", + "agents/gsd-intel-updater.md": "b8eb72873ded3c14", + "agents/gsd-mempalace-curator.md": "6461da48ed937556", "agents/gsd-nyquist-auditor.md": "7bc3cc159c7be987", "agents/gsd-pattern-mapper.md": "6a5408fd11d70391", - "agents/gsd-phase-researcher.md": "94818f28c498bb26", - "agents/gsd-plan-checker.md": "56164206242c8caf", - "agents/gsd-planner.md": "5adf9f02c77d6859", - "agents/gsd-project-researcher.md": "60573a38d3dfd9fe", - "agents/gsd-research-synthesizer.md": "1f7cd286c5783c86", + "agents/gsd-phase-researcher.md": "46c7ca1f62f9e02b", + "agents/gsd-plan-checker.md": "a4e32c58903176ef", + "agents/gsd-planner.md": "dc90faf53dc728ce", + "agents/gsd-project-researcher.md": "e6251b65176972c7", + "agents/gsd-research-synthesizer.md": "c56fc6fd7f96c95c", "agents/gsd-roadmapper.md": "277e0a3252553ab7", "agents/gsd-security-auditor.md": "0113435969e869c4", "agents/gsd-ui-auditor.md": "9b988b95d28e56ed", "agents/gsd-ui-checker.md": "e27fd54c34ce79b8", - "agents/gsd-ui-researcher.md": "68b046253268aa64", + "agents/gsd-ui-researcher.md": "79ab871e0be9e889", "agents/gsd-user-profiler.md": "b8cb09319c517701", - "agents/gsd-verifier.md": "af609b1959cde3f3", + "agents/gsd-verifier.md": "b3d833b6ede458ef", "command/gsd-add-tests.md": "c314f9a6be312bfa", "command/gsd-ai-integration-phase.md": "bbab86a540e00db5", "command/gsd-audit-fix.md": "4106e9dce9b71585", @@ -63,19 +63,18 @@ "command/gsd-ingest-docs.md": "e655ecf1d4433ba9", "command/gsd-manager.md": "1cdc133079833552", "command/gsd-map-codebase.md": "186c8f79319abc1c", - "command/gsd-mempalace-capture.md": "a94ca275cbe7134c", - "command/gsd-mempalace-recall.md": "d358cdd89c935877", + "command/gsd-mempalace-capture.md": "08b9750f1b1d1ba6", + "command/gsd-mempalace-recall.md": "2316f1a950490845", "command/gsd-milestone-summary.md": "4ab29b777f62f0bb", "command/gsd-mvp-phase.md": "273a1c26ca13274b", "command/gsd-new-milestone.md": "a315b3205c5d3470", "command/gsd-new-project.md": "f2763e2ccbb70ebe", - "command/gsd-next.md": "dfdcfb2fd79957fa", "command/gsd-ns-context.md": "9a2b55b64f2e1e4b", "command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f", "command/gsd-ns-manage.md": "eded59052ca4b240", "command/gsd-ns-project.md": "91417cf7b76581dd", "command/gsd-ns-review.md": "61fe33e28eb1b961", - "command/gsd-ns-workflow.md": "13c1ab91080c0cc3", + "command/gsd-ns-workflow.md": "3352c292c27fe50b", "command/gsd-pause-work.md": "04e993b1c9f8322b", "command/gsd-phase.md": "8f0e98dc6c223229", "command/gsd-plan-phase.md": "b37e9a61f946c975", @@ -107,13 +106,12 @@ "command/gsd-workstreams.md": "5e57eed1881c3891", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -177,7 +175,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "af0a9694b3c39557", + "gsd-core/references/planning-config.md": "4acefb3c71169c84", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -261,120 +259,119 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "485c4b6673ddf832", - "gsd-core/workflows/add-phase.md": "0d90083e9c17bec1", - "gsd-core/workflows/add-tests.md": "ecb959f321820e5e", - "gsd-core/workflows/add-todo.md": "5082510bf0449204", - "gsd-core/workflows/ai-integration-phase.md": "c85c6afdc64f0da6", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "5095b6e69b4e380a", + "gsd-core/workflows/add-phase.md": "27164a671e14a789", + "gsd-core/workflows/add-tests.md": "5bb66a4f4c6839bb", + "gsd-core/workflows/add-todo.md": "1a3b827cda68adde", + "gsd-core/workflows/ai-integration-phase.md": "87b004f0f20fe211", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", - "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", - "gsd-core/workflows/autonomous.md": "73f429f7472c9949", - "gsd-core/workflows/check-todos.md": "ed4b4eb12be222d7", - "gsd-core/workflows/cleanup.md": "c5f1bf186395d67d", - "gsd-core/workflows/code-review-fix.md": "adb62c695b39ef61", - "gsd-core/workflows/code-review.md": "6c40b95e799907d0", - "gsd-core/workflows/complete-milestone.md": "59753bf44d4300da", - "gsd-core/workflows/debug.md": "a72d830ac3df74aa", - "gsd-core/workflows/diagnose-issues.md": "210b5b313e8a559a", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04", + "gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12", + "gsd-core/workflows/autonomous.md": "141625e98f4c6a41", + "gsd-core/workflows/check-todos.md": "cde0a3025828bad8", + "gsd-core/workflows/cleanup.md": "d124682912dab9f6", + "gsd-core/workflows/code-review-fix.md": "a416c764425cbb61", + "gsd-core/workflows/code-review.md": "3999e5bc9ce9171e", + "gsd-core/workflows/complete-milestone.md": "d0f7e0599ab54dca", + "gsd-core/workflows/debug.md": "0fa12d266c29d9d4", + "gsd-core/workflows/diagnose-issues.md": "af98c318e0aa27bf", "gsd-core/workflows/discovery-phase.md": "ca7b2be46e59e862", - "gsd-core/workflows/discuss-phase-assumptions.md": "36f7edcb666745f2", + "gsd-core/workflows/discuss-phase-assumptions.md": "6419d394b232d7b0", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "bd4b26ba168bb51f", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "f8ae26ba4e07672b", + "gsd-core/workflows/discuss-phase.md": "322f0c5d18b87e5a", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "0b16982b70abfcc2", "gsd-core/workflows/discuss-phase/modes/all.md": "5ed71228ac96e728", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "e6d4ef26786946ea", + "gsd-core/workflows/discuss-phase/modes/auto.md": "28dc6398e331b418", "gsd-core/workflows/discuss-phase/modes/batch.md": "78f6ef61690acb66", - "gsd-core/workflows/discuss-phase/modes/chain.md": "ecdb88a9aa70d5bf", + "gsd-core/workflows/discuss-phase/modes/chain.md": "b16547a6b0423579", "gsd-core/workflows/discuss-phase/modes/default.md": "5d12f2593ae4a813", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275", - "gsd-core/workflows/do.md": "1e6102574016b150", - "gsd-core/workflows/docs-update.md": "79afaaf19fd527cc", - "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", - "gsd-core/workflows/eval-review.md": "926eda8bbee28b23", - "gsd-core/workflows/execute-phase.md": "17cf87593b833b6d", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", + "gsd-core/workflows/do.md": "c1aeb36469f7badc", + "gsd-core/workflows/docs-update.md": "87bf2a6b7b6ec9db", + "gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c", + "gsd-core/workflows/eval-review.md": "f6183650f7fcabf9", + "gsd-core/workflows/execute-phase.md": "5c4b59ee5e04a022", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "8dc89b35582407f7", - "gsd-core/workflows/explore.md": "14242d36d4822df6", - "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", + "gsd-core/workflows/execute-plan.md": "9b96f0ef3d149b2c", + "gsd-core/workflows/explore.md": "a1aa05e598caf7e3", + "gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "c01da0178fb97b21", - "gsd-core/workflows/graduation.md": "5cc8638dabcbfd40", - "gsd-core/workflows/health.md": "064b3668d5d9569a", + "gsd-core/workflows/forensics.md": "ec9dc257272a6980", + "gsd-core/workflows/graduation.md": "fc01dc810d4845f8", + "gsd-core/workflows/health.md": "955d5ebacd5740e6", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "051f9633f45558b4", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", - "gsd-core/workflows/import.md": "f8bbe6f2c0e08a78", + "gsd-core/workflows/help/modes/full.md": "89044c816457cf48", + "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", + "gsd-core/workflows/import.md": "95734bf6d48ef776", "gsd-core/workflows/inbox.md": "a073396097c89c01", - "gsd-core/workflows/ingest-docs.md": "29c1fe28bc93b345", - "gsd-core/workflows/insert-phase.md": "964ca91863a8749a", + "gsd-core/workflows/ingest-docs.md": "270a4dc138d239c4", + "gsd-core/workflows/insert-phase.md": "0ab06e370253622b", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "5a46337f55ae8453", - "gsd-core/workflows/list-workspaces.md": "418570fbc8b938da", - "gsd-core/workflows/manager.md": "f3d17d2ae11ec7b5", - "gsd-core/workflows/map-codebase.md": "c3d6418d64ba2994", - "gsd-core/workflows/milestone-summary.md": "25775eeb4e2747be", - "gsd-core/workflows/mvp-phase.md": "a97708464f103300", - "gsd-core/workflows/new-milestone.md": "74779ede3babb04c", - "gsd-core/workflows/new-project.md": "6d8cd0b4fe813374", - "gsd-core/workflows/new-workspace.md": "f58d6a8c0c7796a1", - "gsd-core/workflows/next.md": "888297a0b21888ea", + "gsd-core/workflows/list-seeds.md": "da9511b569ada7f9", + "gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169", + "gsd-core/workflows/manager.md": "bedfe8a2a48a9605", + "gsd-core/workflows/map-codebase.md": "fcc2796ebf8ea2c7", + "gsd-core/workflows/milestone-summary.md": "93ba0d0005f73c35", + "gsd-core/workflows/mvp-phase.md": "3935c0d9969e3e84", + "gsd-core/workflows/new-milestone.md": "9abdd85c65989620", + "gsd-core/workflows/new-project.md": "0dce9298c090bdb4", + "gsd-core/workflows/new-workspace.md": "074efbc589061182", + "gsd-core/workflows/next.md": "0a9b4e23ac0bf7ea", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "f8c2842a2217f776", - "gsd-core/workflows/pause-work.md": "a6e5336c409fdc8b", - "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", - "gsd-core/workflows/plan-phase.md": "03e59f06885e200f", + "gsd-core/workflows/pause-work.md": "8b81699a46ca8e9b", + "gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719", + "gsd-core/workflows/plan-phase.md": "a7642fb6484cf12e", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "f10975692cbd036e", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "44a12264f8b61d03", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "774e49428f54f0a0", - "gsd-core/workflows/plant-seed.md": "ffa5774304243649", - "gsd-core/workflows/pr-branch.md": "ab157cd8e49621dd", - "gsd-core/workflows/profile-user.md": "203ebe3f8f3876a8", - "gsd-core/workflows/progress.md": "9381c59676ccb937", - "gsd-core/workflows/quick.md": "11ba83f6350462fb", - "gsd-core/workflows/reapply-patches.md": "becf9728cdb124c4", - "gsd-core/workflows/remove-phase.md": "ada8a0546c686483", - "gsd-core/workflows/remove-workspace.md": "fc83f362a2d0a1b7", - "gsd-core/workflows/resume-project.md": "7f8dc986f0f35d96", - "gsd-core/workflows/review.md": "3af2d510da581502", - "gsd-core/workflows/scan.md": "47371c2073d6c0be", - "gsd-core/workflows/secure-phase.md": "e8855104c1e0417c", + "gsd-core/workflows/plan-review-convergence.md": "88e294a5cc616e90", + "gsd-core/workflows/plant-seed.md": "249d3c6b4d474106", + "gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5", + "gsd-core/workflows/profile-user.md": "9d0f46424df26c8f", + "gsd-core/workflows/progress.md": "e7522beba5bd09b6", + "gsd-core/workflows/quick.md": "65143f5d8292724d", + "gsd-core/workflows/reapply-patches.md": "2c44426624047ed0", + "gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09", + "gsd-core/workflows/remove-workspace.md": "7bd5d1b63ef091a8", + "gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35", + "gsd-core/workflows/review.md": "9ed1fda4d8b657f1", + "gsd-core/workflows/scan.md": "8e1bbf2eed1752ca", + "gsd-core/workflows/secure-phase.md": "87fdcb37a8610e58", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "03c647793401655b", - "gsd-core/workflows/settings-integrations.md": "3ea8095d5fad891b", - "gsd-core/workflows/settings.md": "05e35aeb442b7e20", - "gsd-core/workflows/ship.md": "afd77be2093535f8", - "gsd-core/workflows/sketch-wrap-up.md": "888c0548e63197b3", - "gsd-core/workflows/sketch.md": "34a0c10fa56af7ea", - "gsd-core/workflows/smart-entry.md": "7ffe4fdb93935400", - "gsd-core/workflows/spec-phase.md": "c231f8eb723e7604", - "gsd-core/workflows/spike-wrap-up.md": "458230d4d7c44b09", - "gsd-core/workflows/spike.md": "8e63427fc146b45c", - "gsd-core/workflows/stats.md": "e7852c5d8f2b05a9", + "gsd-core/workflows/settings-advanced.md": "cde46151bf07b4da", + "gsd-core/workflows/settings-integrations.md": "4d23553b9143e834", + "gsd-core/workflows/settings.md": "c345ec6b9b5ee963", + "gsd-core/workflows/ship.md": "b6149b0bc45cc759", + "gsd-core/workflows/sketch-wrap-up.md": "7673797d65af2377", + "gsd-core/workflows/sketch.md": "201772f9c5c02e97", + "gsd-core/workflows/spec-phase.md": "2c67506aeb25a7e1", + "gsd-core/workflows/spike-wrap-up.md": "b7ee3d961b5792c6", + "gsd-core/workflows/spike.md": "a782dd863771fe0a", + "gsd-core/workflows/stats.md": "17b4f2059f4b4ef2", "gsd-core/workflows/sync-skills.md": "dc7b8b015afa4b3b", - "gsd-core/workflows/thread.md": "3b2c560d7189576d", - "gsd-core/workflows/transition.md": "caf7616dc597ad86", - "gsd-core/workflows/ui-phase.md": "638e871b80cacc6d", - "gsd-core/workflows/ui-review.md": "0fb289914252d53e", - "gsd-core/workflows/ultraplan-phase.md": "29245758b8497fa0", + "gsd-core/workflows/thread.md": "5ad0e0d5ce7e0d11", + "gsd-core/workflows/transition.md": "9040a76741f12de6", + "gsd-core/workflows/ui-phase.md": "33f7113e91c2bfe0", + "gsd-core/workflows/ui-review.md": "013272816a291305", + "gsd-core/workflows/ultraplan-phase.md": "db7df53187dae993", "gsd-core/workflows/undo.md": "7cd2153f8b15e30d", - "gsd-core/workflows/update.md": "07dc2fba78ad1865", - "gsd-core/workflows/validate-phase.md": "557e3251e3b9349a", - "gsd-core/workflows/verify-phase.md": "0d4ffabc1caa473a", - "gsd-core/workflows/verify-work.md": "b68ac37f6301a3b5", + "gsd-core/workflows/update.md": "5d0a2356dadf2017", + "gsd-core/workflows/validate-phase.md": "7915e3a261f7c9c9", + "gsd-core/workflows/verify-phase.md": "15a999f82868ad29", + "gsd-core/workflows/verify-work.md": "6194c487f858d85e", "hooks/gsd-check-update-worker.js": "c992bbad91d0e994", "hooks/gsd-check-update.js": "fdd77abe7ef26a2d", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -439,19 +436,18 @@ "skills/gsd-ingest-docs/SKILL.md": "f049f06a6ec7da43", "skills/gsd-manager/SKILL.md": "a37ecdbe32952262", "skills/gsd-map-codebase/SKILL.md": "e8c01704e8ada1d2", - "skills/gsd-mempalace-capture/SKILL.md": "f960b7b1a8fdf89b", - "skills/gsd-mempalace-recall/SKILL.md": "2091c48e6e986e28", + "skills/gsd-mempalace-capture/SKILL.md": "260e1dabc7014ba2", + "skills/gsd-mempalace-recall/SKILL.md": "045d85c8cab1afcc", "skills/gsd-milestone-summary/SKILL.md": "da645171ca2299d8", "skills/gsd-mvp-phase/SKILL.md": "eeb0ac0f88647475", "skills/gsd-new-milestone/SKILL.md": "bc8989d97f3161ad", "skills/gsd-new-project/SKILL.md": "c08047e101dbac9c", - "skills/gsd-next/SKILL.md": "3856471d0f64bf09", "skills/gsd-ns-context/SKILL.md": "110fb2227bcde535", "skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc", "skills/gsd-ns-manage/SKILL.md": "2756981de613022e", "skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26", "skills/gsd-ns-review/SKILL.md": "680bdd33c882b049", - "skills/gsd-ns-workflow/SKILL.md": "579b7f0dac74e1fb", + "skills/gsd-ns-workflow/SKILL.md": "68effe2fc2c65317", "skills/gsd-pause-work/SKILL.md": "34366b18a392a717", "skills/gsd-phase/SKILL.md": "64a241d4f8665aa2", "skills/gsd-plan-phase/SKILL.md": "c73cba04a26f0bfe", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 2e019bbd2..1b32056d7 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -9,15 +9,15 @@ "agents/subagents/gsd-ai-researcher.yaml": "59edec2a11eb0a27", "agents/subagents/gsd-assumptions-analyzer.md": "507b93a7d3375ad3", "agents/subagents/gsd-assumptions-analyzer.yaml": "e7da772d8c7e3723", - "agents/subagents/gsd-code-fixer.md": "9a397598c2df98f3", + "agents/subagents/gsd-code-fixer.md": "eadf06afc4609b2a", "agents/subagents/gsd-code-fixer.yaml": "41147d668c7e75cb", "agents/subagents/gsd-code-reviewer.md": "27cee6e8adae57da", "agents/subagents/gsd-code-reviewer.yaml": "5f2398f56018f50d", "agents/subagents/gsd-codebase-mapper.md": "04c7528a13fa3de7", "agents/subagents/gsd-codebase-mapper.yaml": "bce1c6d15f55c477", - "agents/subagents/gsd-debug-session-manager.md": "be5653e631bbd006", + "agents/subagents/gsd-debug-session-manager.md": "54f87b28876dec1b", "agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7", - "agents/subagents/gsd-debugger.md": "528ad732ccff4485", + "agents/subagents/gsd-debugger.md": "9f0811545e99c8b9", "agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43", "agents/subagents/gsd-doc-classifier.md": "7810ff57b2dba86b", "agents/subagents/gsd-doc-classifier.yaml": "a4e9cf7025b57503", @@ -29,33 +29,33 @@ "agents/subagents/gsd-doc-writer.yaml": "166fa569d11adb9f", "agents/subagents/gsd-domain-researcher.md": "c29b96a2c40f6e96", "agents/subagents/gsd-domain-researcher.yaml": "269e21863e94f29f", - "agents/subagents/gsd-eval-auditor.md": "2de50778b9b5a219", + "agents/subagents/gsd-eval-auditor.md": "8a8f48ed1249e9cd", "agents/subagents/gsd-eval-auditor.yaml": "e3d868bd5fefe938", "agents/subagents/gsd-eval-planner.md": "70f8c5727bfb9876", "agents/subagents/gsd-eval-planner.yaml": "df8499f7af297ec2", - "agents/subagents/gsd-executor.md": "278a569a7306244c", + "agents/subagents/gsd-executor.md": "2cf56de9a48e60f9", "agents/subagents/gsd-executor.yaml": "e29422986636fd64", "agents/subagents/gsd-framework-selector.md": "a15b7aa1e0576e16", "agents/subagents/gsd-framework-selector.yaml": "fb52c31cde27b0e3", "agents/subagents/gsd-integration-checker.md": "6939640ba16c3f3b", "agents/subagents/gsd-integration-checker.yaml": "3500c65ccbbe432d", - "agents/subagents/gsd-intel-updater.md": "1964fb57cf27be8d", + "agents/subagents/gsd-intel-updater.md": "8ffa8767b2270472", "agents/subagents/gsd-intel-updater.yaml": "01445ee99bec4b31", - "agents/subagents/gsd-mempalace-curator.md": "62b7c34d6c33ed0b", + "agents/subagents/gsd-mempalace-curator.md": "34b7476d313bfda4", "agents/subagents/gsd-mempalace-curator.yaml": "28dd095c371ada3b", "agents/subagents/gsd-nyquist-auditor.md": "d9dbd1e92e2598c2", "agents/subagents/gsd-nyquist-auditor.yaml": "48ad300fa775dd5d", "agents/subagents/gsd-pattern-mapper.md": "eb2d4e838aaeb10c", "agents/subagents/gsd-pattern-mapper.yaml": "d1e537e77f953fd4", - "agents/subagents/gsd-phase-researcher.md": "897080d9383bd176", + "agents/subagents/gsd-phase-researcher.md": "5982ab9a29eba637", "agents/subagents/gsd-phase-researcher.yaml": "7633c8e82617e7cc", - "agents/subagents/gsd-plan-checker.md": "bd302afc01ed40f0", + "agents/subagents/gsd-plan-checker.md": "dc5bc8d2e11f7ecf", "agents/subagents/gsd-plan-checker.yaml": "8295181071121db8", - "agents/subagents/gsd-planner.md": "f4a053af3e081edf", + "agents/subagents/gsd-planner.md": "4b815f7e76f56a01", "agents/subagents/gsd-planner.yaml": "2e83ee194bcd7fbd", - "agents/subagents/gsd-project-researcher.md": "39bc2ec5a8b18283", + "agents/subagents/gsd-project-researcher.md": "bbae5f6e13917635", "agents/subagents/gsd-project-researcher.yaml": "ce12586b0347e2dc", - "agents/subagents/gsd-research-synthesizer.md": "d384c27f7f045ecd", + "agents/subagents/gsd-research-synthesizer.md": "1f937a27044c1f7b", "agents/subagents/gsd-research-synthesizer.yaml": "898104ab3bb0b81a", "agents/subagents/gsd-roadmapper.md": "62359d6876022b48", "agents/subagents/gsd-roadmapper.yaml": "679772cb14f3a015", @@ -65,21 +65,20 @@ "agents/subagents/gsd-ui-auditor.yaml": "3fc98c1d9e8f10fd", "agents/subagents/gsd-ui-checker.md": "271da1ad4fe7a102", "agents/subagents/gsd-ui-checker.yaml": "c42316006654fae3", - "agents/subagents/gsd-ui-researcher.md": "678f035c1fdd0603", + "agents/subagents/gsd-ui-researcher.md": "34f41bc770a55199", "agents/subagents/gsd-ui-researcher.yaml": "15e215874bc2c37d", "agents/subagents/gsd-user-profiler.md": "c16f94e09e433394", "agents/subagents/gsd-user-profiler.yaml": "645826a29d079159", - "agents/subagents/gsd-verifier.md": "699f62763424ac68", + "agents/subagents/gsd-verifier.md": "780a100f92c45751", "agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -120,7 +119,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", + "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -143,7 +142,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "7fe958e09e74b6c8", + "gsd-core/references/planning-config.md": "1c3a3aae2ae89e83", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -227,120 +226,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "1bc7377b105194fc", - "gsd-core/workflows/add-phase.md": "46e0551ffdd8ce1a", - "gsd-core/workflows/add-tests.md": "2c1da65d41dc12d2", - "gsd-core/workflows/add-todo.md": "cc0efe270004c8fb", - "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "1153d35058e3e24f", + "gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba", + "gsd-core/workflows/add-tests.md": "2871f7e6409ba89e", + "gsd-core/workflows/add-todo.md": "3b913840c1f490b2", + "gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "514d02c730349a35", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", - "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", - "gsd-core/workflows/autonomous.md": "7e5683728ef33707", - "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", - "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", - "gsd-core/workflows/code-review-fix.md": "c323f7098b671bd6", - "gsd-core/workflows/code-review.md": "ad450c6ef8459dad", - "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "849d7e5b9c12dcae", - "gsd-core/workflows/diagnose-issues.md": "67c058fc7ae6026b", + "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", + "gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9", + "gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793", + "gsd-core/workflows/autonomous.md": "1184e5864e201889", + "gsd-core/workflows/check-todos.md": "1e3026abe782bd36", + "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", + "gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93", + "gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e", + "gsd-core/workflows/complete-milestone.md": "337d177126f1bd67", + "gsd-core/workflows/debug.md": "da62e7a62c113b29", + "gsd-core/workflows/diagnose-issues.md": "b1fd597cb9420c33", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "1e229f6d21831d60", + "gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "0c0465ba668adb33", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", + "gsd-core/workflows/discuss-phase.md": "d0da99d5c9c09c42", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", + "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853", + "gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", - "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", - "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", - "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "5d3377bc8ebbae58", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", + "gsd-core/workflows/do.md": "152e9c5c512f79cb", + "gsd-core/workflows/docs-update.md": "806ada831b961116", + "gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5", + "gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae", + "gsd-core/workflows/execute-phase.md": "444d5f17dfc1437a", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "c8502b7475d797a7", - "gsd-core/workflows/explore.md": "6c04f2e658d93261", - "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", + "gsd-core/workflows/execute-plan.md": "0cda7b15d42b6d6f", + "gsd-core/workflows/explore.md": "11523b829cc67c29", + "gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "0d500a3f5ab26913", - "gsd-core/workflows/graduation.md": "47f1594c88c08501", - "gsd-core/workflows/health.md": "107e3c72e76d9535", + "gsd-core/workflows/forensics.md": "b4bde768fd27a982", + "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", + "gsd-core/workflows/health.md": "e3cb8ff4e01e9e53", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "94c18706768e5a41", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", - "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", + "gsd-core/workflows/help/modes/full.md": "d7432c8631f3cae8", + "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", + "gsd-core/workflows/import.md": "97861d522319d56e", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", - "gsd-core/workflows/insert-phase.md": "08dca838d831bb5b", + "gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3", + "gsd-core/workflows/insert-phase.md": "621f9e75725542b1", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "b687f2a843032d65", - "gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453", - "gsd-core/workflows/manager.md": "3ba7a3e8213c4b23", - "gsd-core/workflows/map-codebase.md": "83d750aade709983", - "gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043", - "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", - "gsd-core/workflows/new-milestone.md": "a616efb0f82d1a11", - "gsd-core/workflows/new-project.md": "1ec88027a8e5a2fe", - "gsd-core/workflows/new-workspace.md": "017688423110ed66", - "gsd-core/workflows/next.md": "13fb800f2472d970", + "gsd-core/workflows/list-seeds.md": "0a466d04df300854", + "gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b", + "gsd-core/workflows/manager.md": "a31f7e255dd7d01d", + "gsd-core/workflows/map-codebase.md": "582bddef590de9c6", + "gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a", + "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", + "gsd-core/workflows/new-milestone.md": "23d2135a555e95df", + "gsd-core/workflows/new-project.md": "69d356f41ea36aa2", + "gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1", + "gsd-core/workflows/next.md": "48bd4b5d54f0d1f8", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", - "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", - "gsd-core/workflows/plan-phase.md": "2f16f3cc05fc59f1", + "gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b", + "gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25", + "gsd-core/workflows/plan-phase.md": "e69e435b47d77070", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5", - "gsd-core/workflows/plan-review-convergence.md": "c635ecb8590a724e", - "gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede", - "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", - "gsd-core/workflows/profile-user.md": "5abfae83739fa978", - "gsd-core/workflows/progress.md": "893aa3c36983f74b", - "gsd-core/workflows/quick.md": "d722803b72217377", - "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", - "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", - "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", - "gsd-core/workflows/resume-project.md": "f28da1200e4545f4", - "gsd-core/workflows/review.md": "f3c2e894941c9943", - "gsd-core/workflows/scan.md": "003883d71c37da7d", - "gsd-core/workflows/secure-phase.md": "29fc6b62c5c5dc62", + "gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd", + "gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06", + "gsd-core/workflows/pr-branch.md": "f2a35833fe784a53", + "gsd-core/workflows/profile-user.md": "fc41a92a13e7778b", + "gsd-core/workflows/progress.md": "057699b34b6198f7", + "gsd-core/workflows/quick.md": "c99da0fa3ae58187", + "gsd-core/workflows/reapply-patches.md": "7915e40411490bbe", + "gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9", + "gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc", + "gsd-core/workflows/resume-project.md": "b18b51fd15cbce95", + "gsd-core/workflows/review.md": "fbfa6eebcad41aa0", + "gsd-core/workflows/scan.md": "54ff1ff60041d065", + "gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "b57c947edee905bc", - "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", - "gsd-core/workflows/settings.md": "b2d39d972650f5f3", - "gsd-core/workflows/ship.md": "7b8fe9f89143e648", - "gsd-core/workflows/sketch-wrap-up.md": "b767a1d3db129a8a", - "gsd-core/workflows/sketch.md": "88cfdf4edcf222ab", - "gsd-core/workflows/smart-entry.md": "449238eb94abe187", - "gsd-core/workflows/spec-phase.md": "8c480bd91f3cef6f", - "gsd-core/workflows/spike-wrap-up.md": "da0dcb252c54fa82", - "gsd-core/workflows/spike.md": "7813e120577282d4", - "gsd-core/workflows/stats.md": "76a42cbeaf6007c2", + "gsd-core/workflows/settings-advanced.md": "895e94e9193c2de2", + "gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed", + "gsd-core/workflows/settings.md": "48d337eb7e3f141b", + "gsd-core/workflows/ship.md": "d26fb5d3e965642a", + "gsd-core/workflows/sketch-wrap-up.md": "19046704ae337d73", + "gsd-core/workflows/sketch.md": "e42a914206c152ef", + "gsd-core/workflows/spec-phase.md": "2aa0353147153776", + "gsd-core/workflows/spike-wrap-up.md": "3f3e7f0018284059", + "gsd-core/workflows/spike.md": "be2295fe2b32956f", + "gsd-core/workflows/stats.md": "01c24349370a0e6d", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "927e7eeefd2fcf5c", - "gsd-core/workflows/transition.md": "cb8ec5affb7ebba1", - "gsd-core/workflows/ui-phase.md": "6c4d02dfda1efcae", - "gsd-core/workflows/ui-review.md": "7acfc485526d064b", - "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", + "gsd-core/workflows/thread.md": "6d075b5d26500e9d", + "gsd-core/workflows/transition.md": "eee3435817fab185", + "gsd-core/workflows/ui-phase.md": "3dfb9f5161375035", + "gsd-core/workflows/ui-review.md": "1ad3654435000881", + "gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "6718e0632bba26ca", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", - "gsd-core/workflows/verify-phase.md": "98a995046bdb6c3c", - "gsd-core/workflows/verify-work.md": "34e980a6950cd83c", + "gsd-core/workflows/update.md": "6369691790864147", + "gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb", + "gsd-core/workflows/verify-phase.md": "7579af6cd757f644", + "gsd-core/workflows/verify-work.md": "d77ace0fc4f33ff7", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", @@ -382,19 +380,18 @@ "skills/gsd-ingest-docs/SKILL.md": "6366644e623ae9e4", "skills/gsd-manager/SKILL.md": "8a11a1beb8e35a9c", "skills/gsd-map-codebase/SKILL.md": "55dade835b0f4954", - "skills/gsd-mempalace-capture/SKILL.md": "64a2ec493092d26e", - "skills/gsd-mempalace-recall/SKILL.md": "c6e0195e55cd934c", + "skills/gsd-mempalace-capture/SKILL.md": "3746fa9b34e20e71", + "skills/gsd-mempalace-recall/SKILL.md": "07b1b0e767da162c", "skills/gsd-milestone-summary/SKILL.md": "3ea93ccaa0d4d967", "skills/gsd-mvp-phase/SKILL.md": "d2f98f1e955797b6", "skills/gsd-new-milestone/SKILL.md": "52c3cbe5b931985b", "skills/gsd-new-project/SKILL.md": "d74e7583377e3563", - "skills/gsd-next/SKILL.md": "0a5109eb81fbeb4b", "skills/gsd-ns-context/SKILL.md": "89f5bffe6702c0c5", "skills/gsd-ns-ideate/SKILL.md": "e0c0420f6878906a", "skills/gsd-ns-manage/SKILL.md": "b7fbe29e45e75f54", "skills/gsd-ns-project/SKILL.md": "1292d4a6a4280ce9", "skills/gsd-ns-review/SKILL.md": "2ff62330379f947f", - "skills/gsd-ns-workflow/SKILL.md": "86272fd655c206bc", + "skills/gsd-ns-workflow/SKILL.md": "3f5fcfec9da730a2", "skills/gsd-pause-work/SKILL.md": "95017c70ae9dca0d", "skills/gsd-phase/SKILL.md": "31578c329cc2583e", "skills/gsd-plan-phase/SKILL.md": "54798eddf30056b5", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index 4e83858d7..dd6f6ea54 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "6955bcd8ca353de0", "agents/gsd-ai-researcher.md": "28a05307dad84020", "agents/gsd-assumptions-analyzer.md": "45c01017e84ba193", - "agents/gsd-code-fixer.md": "3622ae5d90fb15f6", + "agents/gsd-code-fixer.md": "eb9fa698f827f23f", "agents/gsd-code-reviewer.md": "2249774416314c57", "agents/gsd-codebase-mapper.md": "948612acd505e87f", - "agents/gsd-debug-session-manager.md": "0a0483c6470df4d1", - "agents/gsd-debugger.md": "a83427bd5a0406fc", + "agents/gsd-debug-session-manager.md": "09c805b7283633fd", + "agents/gsd-debugger.md": "535cc597dcc0cade", "agents/gsd-doc-classifier.md": "cd4169adec56c26f", "agents/gsd-doc-synthesizer.md": "47a8b52fe974a810", "agents/gsd-doc-verifier.md": "65bbc2ae6b9ace29", "agents/gsd-doc-writer.md": "0696a8cdc0028917", "agents/gsd-domain-researcher.md": "71250e759ca9e723", - "agents/gsd-eval-auditor.md": "c88890105f32ace6", + "agents/gsd-eval-auditor.md": "d9c7034244882d86", "agents/gsd-eval-planner.md": "60bddb70a937f796", - "agents/gsd-executor.md": "b091b0126895ae03", + "agents/gsd-executor.md": "9726bd59fcc09611", "agents/gsd-framework-selector.md": "1c0a10355e787675", "agents/gsd-integration-checker.md": "a9de5928e5a5c649", - "agents/gsd-intel-updater.md": "493e07482fa6198a", - "agents/gsd-mempalace-curator.md": "197308371baa53ad", + "agents/gsd-intel-updater.md": "f9ef2797738b7f09", + "agents/gsd-mempalace-curator.md": "aa7cf2c611057735", "agents/gsd-nyquist-auditor.md": "7a7e0d1cbafd6b63", "agents/gsd-pattern-mapper.md": "7c6d1d9817a9c1e7", - "agents/gsd-phase-researcher.md": "9874110700b41f48", - "agents/gsd-plan-checker.md": "28ca3dc43669894f", - "agents/gsd-planner.md": "4fdb27fe53d38935", - "agents/gsd-project-researcher.md": "dae210ae0b3c6e2b", - "agents/gsd-research-synthesizer.md": "e02c6ad5d1b74171", + "agents/gsd-phase-researcher.md": "6461af91c55b5227", + "agents/gsd-plan-checker.md": "5e9ec0d98f9a0059", + "agents/gsd-planner.md": "b4bc4916aadd24e0", + "agents/gsd-project-researcher.md": "f1d486fc0a3ff905", + "agents/gsd-research-synthesizer.md": "e0c2d9957431a1e1", "agents/gsd-roadmapper.md": "1658a40b20d8b575", "agents/gsd-security-auditor.md": "e36e436c0d5c26d5", "agents/gsd-ui-auditor.md": "e810012e685b2466", "agents/gsd-ui-checker.md": "5fd0ed65262dc194", - "agents/gsd-ui-researcher.md": "d2e1ed5af2df4a7d", + "agents/gsd-ui-researcher.md": "18dd700b1ac6d86a", "agents/gsd-user-profiler.md": "d825b4c0a6431f8b", - "agents/gsd-verifier.md": "b9f2e801f9395a35", + "agents/gsd-verifier.md": "e245bfb493a5c069", "command/gsd-add-tests.md": "b9cd93ed01945f75", "command/gsd-ai-integration-phase.md": "9d4bc4dcce7f1ee0", "command/gsd-audit-fix.md": "5615403843d5e491", @@ -63,19 +63,18 @@ "command/gsd-ingest-docs.md": "b47c812c247e58a4", "command/gsd-manager.md": "86ece154b34b6d1b", "command/gsd-map-codebase.md": "1fb678f8a17a380e", - "command/gsd-mempalace-capture.md": "a94ca275cbe7134c", - "command/gsd-mempalace-recall.md": "d358cdd89c935877", + "command/gsd-mempalace-capture.md": "08b9750f1b1d1ba6", + "command/gsd-mempalace-recall.md": "2316f1a950490845", "command/gsd-milestone-summary.md": "86a827271bc647c5", "command/gsd-mvp-phase.md": "d45fd76cb9cff3ef", "command/gsd-new-milestone.md": "64c9dc73425a66a2", "command/gsd-new-project.md": "0086f0de26002219", - "command/gsd-next.md": "b0ef81652d72d894", "command/gsd-ns-context.md": "9a2b55b64f2e1e4b", "command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f", "command/gsd-ns-manage.md": "eded59052ca4b240", "command/gsd-ns-project.md": "91417cf7b76581dd", "command/gsd-ns-review.md": "61fe33e28eb1b961", - "command/gsd-ns-workflow.md": "13c1ab91080c0cc3", + "command/gsd-ns-workflow.md": "3352c292c27fe50b", "command/gsd-pause-work.md": "bb5bf91a2e3e480e", "command/gsd-phase.md": "6bcda1539f949d5a", "command/gsd-plan-phase.md": "7ee44086b59862b9", @@ -107,13 +106,12 @@ "command/gsd-workstreams.md": "5e57eed1881c3891", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -177,7 +175,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "af0a9694b3c39557", + "gsd-core/references/planning-config.md": "4acefb3c71169c84", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -261,120 +259,119 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "08289088a88d410f", - "gsd-core/workflows/add-phase.md": "5154a5fb3e0d4370", - "gsd-core/workflows/add-tests.md": "81d0a836878e1a10", - "gsd-core/workflows/add-todo.md": "72fcef9fd0cafda5", - "gsd-core/workflows/ai-integration-phase.md": "90e5f97018715b18", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "b06846965aac2c53", + "gsd-core/workflows/add-phase.md": "226a281548498ae5", + "gsd-core/workflows/add-tests.md": "29a06d57250bc054", + "gsd-core/workflows/add-todo.md": "c98d2b68d0f0bf6d", + "gsd-core/workflows/ai-integration-phase.md": "bd7f0c25f1f52a95", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "497a33eb4ee38d47", - "gsd-core/workflows/audit-milestone.md": "7aa0db364a4b67e2", - "gsd-core/workflows/audit-uat.md": "c800099fab1e1c1b", - "gsd-core/workflows/autonomous.md": "6cb0c014f5f56965", - "gsd-core/workflows/check-todos.md": "6526b64ee88c7d2e", - "gsd-core/workflows/cleanup.md": "94d771d26f62dc86", - "gsd-core/workflows/code-review-fix.md": "5d97b960da4fef73", - "gsd-core/workflows/code-review.md": "aec8ef4de1829607", - "gsd-core/workflows/complete-milestone.md": "614299b2c08e66c3", - "gsd-core/workflows/debug.md": "9d4a8afc8d36be93", - "gsd-core/workflows/diagnose-issues.md": "2971c699d52f1b85", + "gsd-core/workflows/audit-fix.md": "c7878f1dff04adf1", + "gsd-core/workflows/audit-milestone.md": "99f0b884c9208dde", + "gsd-core/workflows/audit-uat.md": "e530acf37fd9c699", + "gsd-core/workflows/autonomous.md": "5d4373ad0a20f69b", + "gsd-core/workflows/check-todos.md": "42806d03eacf9ff6", + "gsd-core/workflows/cleanup.md": "daca0c4f1d531a02", + "gsd-core/workflows/code-review-fix.md": "618c850533bd5c9e", + "gsd-core/workflows/code-review.md": "e362de9cce43c8fc", + "gsd-core/workflows/complete-milestone.md": "840e524216772d8d", + "gsd-core/workflows/debug.md": "0e12f6f3589cc0ea", + "gsd-core/workflows/diagnose-issues.md": "d8c817d029ea186e", "gsd-core/workflows/discovery-phase.md": "724408336596c50c", - "gsd-core/workflows/discuss-phase-assumptions.md": "310b08dc31710cbc", + "gsd-core/workflows/discuss-phase-assumptions.md": "42418e64617c5de3", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "3a62a8d4c374c69f", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "83ca3ea4fac785af", + "gsd-core/workflows/discuss-phase.md": "3b4b9908e57b329f", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "f44a1979ba5841a3", "gsd-core/workflows/discuss-phase/modes/all.md": "5ed71228ac96e728", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "ed71852753c6788a", + "gsd-core/workflows/discuss-phase/modes/auto.md": "69d274e077af5292", "gsd-core/workflows/discuss-phase/modes/batch.md": "78f6ef61690acb66", - "gsd-core/workflows/discuss-phase/modes/chain.md": "1558b2ce77a25c75", + "gsd-core/workflows/discuss-phase/modes/chain.md": "b01b9974f762af76", "gsd-core/workflows/discuss-phase/modes/default.md": "5d12f2593ae4a813", "gsd-core/workflows/discuss-phase/modes/power.md": "799fc7e1283b568f", "gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275", - "gsd-core/workflows/do.md": "d72e76d9050b53f3", - "gsd-core/workflows/docs-update.md": "850366c2ef8fb780", - "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", - "gsd-core/workflows/eval-review.md": "5394694d29ad7543", - "gsd-core/workflows/execute-phase.md": "ec2ef02d93b17a24", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1804215577f1ad35", + "gsd-core/workflows/do.md": "9464559b832bf9c0", + "gsd-core/workflows/docs-update.md": "93e969c3afb446a0", + "gsd-core/workflows/edit-phase.md": "ed948a400a0146c7", + "gsd-core/workflows/eval-review.md": "1ba1af74a43c07db", + "gsd-core/workflows/execute-phase.md": "f0ca3839e0d0cf8b", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a640b093a5a7b028", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "647ec0d29a0d6365", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "8b42f5df1a2c231f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "e8de8ea661c1fe81", - "gsd-core/workflows/explore.md": "7f5f9231cfd3089b", - "gsd-core/workflows/extract-learnings.md": "92b3c0979604b7d0", + "gsd-core/workflows/execute-plan.md": "7894850154836fcf", + "gsd-core/workflows/explore.md": "96ba55f53899a261", + "gsd-core/workflows/extract-learnings.md": "b8851263c2d28702", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "9354cb830152fd28", - "gsd-core/workflows/graduation.md": "13080b5c24eec27d", - "gsd-core/workflows/health.md": "a91e0a8e5d20b2e9", + "gsd-core/workflows/forensics.md": "6ce026e4bc6c875e", + "gsd-core/workflows/graduation.md": "7d03b353a0323cce", + "gsd-core/workflows/health.md": "1fad392ce1aec410", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "604993c20f4e4b20", - "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", - "gsd-core/workflows/import.md": "67fbf389ab8e57b4", + "gsd-core/workflows/help/modes/full.md": "d43cbea8b5e6e290", + "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", + "gsd-core/workflows/import.md": "46337b37d375f4da", "gsd-core/workflows/inbox.md": "a073396097c89c01", - "gsd-core/workflows/ingest-docs.md": "82370f93c45c8015", - "gsd-core/workflows/insert-phase.md": "858224afbf977c14", + "gsd-core/workflows/ingest-docs.md": "bbb4f5fb3ab75113", + "gsd-core/workflows/insert-phase.md": "a305657b04dc3f1f", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "9b05425fa7d24827", - "gsd-core/workflows/list-workspaces.md": "dc6d30036c6dc426", - "gsd-core/workflows/manager.md": "b652b27ca9c6451a", - "gsd-core/workflows/map-codebase.md": "6aa5a52741af0b3e", - "gsd-core/workflows/milestone-summary.md": "321ea8a6a206f38f", - "gsd-core/workflows/mvp-phase.md": "b4d688baa4c60dfc", - "gsd-core/workflows/new-milestone.md": "b34db94432f766cb", - "gsd-core/workflows/new-project.md": "a3850644ef65bea6", - "gsd-core/workflows/new-workspace.md": "3d82392388ee24c7", - "gsd-core/workflows/next.md": "6719a37b8ce2ac4f", + "gsd-core/workflows/list-seeds.md": "f8a55d8f83a4492d", + "gsd-core/workflows/list-workspaces.md": "74aa5ac3cb9b00bf", + "gsd-core/workflows/manager.md": "e77230eb5a8a1c78", + "gsd-core/workflows/map-codebase.md": "40624186d001658f", + "gsd-core/workflows/milestone-summary.md": "19cced11010ad8eb", + "gsd-core/workflows/mvp-phase.md": "efeb5d11f5b10e73", + "gsd-core/workflows/new-milestone.md": "08d97dcb66df7776", + "gsd-core/workflows/new-project.md": "d3c0ce0e163d5048", + "gsd-core/workflows/new-workspace.md": "cfbe1d7f60f2bfe4", + "gsd-core/workflows/next.md": "83ccac8577032cb6", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "0d1374f2a2257858", - "gsd-core/workflows/pause-work.md": "70c72beca55c080a", - "gsd-core/workflows/plan-milestone-gaps.md": "0a9dacd422cd9533", - "gsd-core/workflows/plan-phase.md": "3c49d9f4061b2388", + "gsd-core/workflows/pause-work.md": "c9f0b8826845dda7", + "gsd-core/workflows/plan-milestone-gaps.md": "5ec459734bf7570c", + "gsd-core/workflows/plan-phase.md": "03745f51d63d99b8", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "3a09141de7f3dedb", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "fa7f29c323f4cb57", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "9252897bc8e001da", - "gsd-core/workflows/plant-seed.md": "b8dad652e31c2318", - "gsd-core/workflows/pr-branch.md": "929b7cb0c99c7b9e", - "gsd-core/workflows/profile-user.md": "248d59a31948e0ed", - "gsd-core/workflows/progress.md": "8fc3404087f50b95", - "gsd-core/workflows/quick.md": "3866a5259e8912d8", - "gsd-core/workflows/reapply-patches.md": "a0e9b53f90abceb2", - "gsd-core/workflows/remove-phase.md": "dea4661e8f89596f", - "gsd-core/workflows/remove-workspace.md": "446847e71aa52504", - "gsd-core/workflows/resume-project.md": "ad9f06a10bab8cc0", - "gsd-core/workflows/review.md": "94ff56aecbbe2753", - "gsd-core/workflows/scan.md": "ad8ebcad4626d4a8", - "gsd-core/workflows/secure-phase.md": "e9a488cec3b4efdc", + "gsd-core/workflows/plan-review-convergence.md": "4f884d793d72d3fd", + "gsd-core/workflows/plant-seed.md": "507e886d0f70d84c", + "gsd-core/workflows/pr-branch.md": "3abaa18246facdc3", + "gsd-core/workflows/profile-user.md": "6c16f62edaaebdc9", + "gsd-core/workflows/progress.md": "6b34c4542cfe90b0", + "gsd-core/workflows/quick.md": "55e3c86b55995e3f", + "gsd-core/workflows/reapply-patches.md": "a6cfec7e2a0e7ee2", + "gsd-core/workflows/remove-phase.md": "863c58e99e9d630d", + "gsd-core/workflows/remove-workspace.md": "4ed03c52e5c7bd4d", + "gsd-core/workflows/resume-project.md": "15153ce5a4c38674", + "gsd-core/workflows/review.md": "4076abd5ff01195d", + "gsd-core/workflows/scan.md": "4634caefa32a7307", + "gsd-core/workflows/secure-phase.md": "9616682fe23cf042", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "f62c8e4fa6d3a3d9", - "gsd-core/workflows/settings-integrations.md": "d1711a95f44fdbde", - "gsd-core/workflows/settings.md": "bbbcad8d95d5e813", - "gsd-core/workflows/ship.md": "924c79e3cfd1e42b", - "gsd-core/workflows/sketch-wrap-up.md": "681800323681c5c6", - "gsd-core/workflows/sketch.md": "fcb7af914159ef7b", - "gsd-core/workflows/smart-entry.md": "2a253fe437496eea", - "gsd-core/workflows/spec-phase.md": "cb6cbe6eac816b0a", - "gsd-core/workflows/spike-wrap-up.md": "30a73aa19a1db271", - "gsd-core/workflows/spike.md": "f8b07d411473560a", - "gsd-core/workflows/stats.md": "846cd2808461ccdc", + "gsd-core/workflows/settings-advanced.md": "66dfc942603ae7af", + "gsd-core/workflows/settings-integrations.md": "6bd6cccc1aff9bc9", + "gsd-core/workflows/settings.md": "4c24ab123703d769", + "gsd-core/workflows/ship.md": "5ffb515478d78cb6", + "gsd-core/workflows/sketch-wrap-up.md": "1a9f5b8e01a43506", + "gsd-core/workflows/sketch.md": "89acaae8de9bf8c9", + "gsd-core/workflows/spec-phase.md": "eb94ceb386b2a328", + "gsd-core/workflows/spike-wrap-up.md": "3609a57dbd8b5ac0", + "gsd-core/workflows/spike.md": "df52b9f31a72d204", + "gsd-core/workflows/stats.md": "598b1bb510ed0451", "gsd-core/workflows/sync-skills.md": "7e2c138cdbef4282", - "gsd-core/workflows/thread.md": "82652edb1883af59", - "gsd-core/workflows/transition.md": "a66f117fad29d65a", - "gsd-core/workflows/ui-phase.md": "3927811cceccf3fd", - "gsd-core/workflows/ui-review.md": "149f39373eee5c92", - "gsd-core/workflows/ultraplan-phase.md": "f4bad8de3fdb49fa", + "gsd-core/workflows/thread.md": "f4f8312f744c9cba", + "gsd-core/workflows/transition.md": "2d6739f730c3ea10", + "gsd-core/workflows/ui-phase.md": "38dac814d2d03d6f", + "gsd-core/workflows/ui-review.md": "3d972d3bd30527b3", + "gsd-core/workflows/ultraplan-phase.md": "11db7f58a45aca2e", "gsd-core/workflows/undo.md": "0bba5e7f6196c894", - "gsd-core/workflows/update.md": "71b6cd852f38b4bc", - "gsd-core/workflows/validate-phase.md": "abcdbc1b56780565", - "gsd-core/workflows/verify-phase.md": "5bd04b040cd071dd", - "gsd-core/workflows/verify-work.md": "f0d205568abfaf74", + "gsd-core/workflows/update.md": "af51041a3172c523", + "gsd-core/workflows/validate-phase.md": "0fc5991f6d7c6c39", + "gsd-core/workflows/verify-phase.md": "13a1a43395b5e47b", + "gsd-core/workflows/verify-work.md": "c218bc9c5972dcdb", "hooks/gsd-check-update-worker.js": "385fb7c67810baf6", "hooks/gsd-check-update.js": "4549451414ffa7d7", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -440,19 +437,18 @@ "skills/gsd-ingest-docs/SKILL.md": "8f294b4894f782a5", "skills/gsd-manager/SKILL.md": "cf40f237b4f20aa7", "skills/gsd-map-codebase/SKILL.md": "6d74ea41e29ff035", - "skills/gsd-mempalace-capture/SKILL.md": "f960b7b1a8fdf89b", - "skills/gsd-mempalace-recall/SKILL.md": "2091c48e6e986e28", + "skills/gsd-mempalace-capture/SKILL.md": "260e1dabc7014ba2", + "skills/gsd-mempalace-recall/SKILL.md": "045d85c8cab1afcc", "skills/gsd-milestone-summary/SKILL.md": "175366bb500b5e64", "skills/gsd-mvp-phase/SKILL.md": "0531d0e907af41ce", "skills/gsd-new-milestone/SKILL.md": "45688741cc4bab41", "skills/gsd-new-project/SKILL.md": "feef18d69466fdf9", - "skills/gsd-next/SKILL.md": "85fb881a8ac65081", "skills/gsd-ns-context/SKILL.md": "110fb2227bcde535", "skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc", "skills/gsd-ns-manage/SKILL.md": "2756981de613022e", "skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26", "skills/gsd-ns-review/SKILL.md": "680bdd33c882b049", - "skills/gsd-ns-workflow/SKILL.md": "579b7f0dac74e1fb", + "skills/gsd-ns-workflow/SKILL.md": "68effe2fc2c65317", "skills/gsd-pause-work/SKILL.md": "c7e9ba4f242c4648", "skills/gsd-phase/SKILL.md": "ee78c0c56c814d84", "skills/gsd-plan-phase/SKILL.md": "6abcc3a1568a6bb9", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 84c168619..0ab2fab4d 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -1,49 +1,48 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.md": "f1c4a47d3d8cea72", - "agents/gsd-ai-researcher.md": "08847faf5494ff08", + "agents/gsd-advisor-researcher.md": "f3f0a55854689045", + "agents/gsd-ai-researcher.md": "72f67082f35c9da1", "agents/gsd-assumptions-analyzer.md": "f11a80795163bb5d", - "agents/gsd-code-fixer.md": "5660b5d7a912dbac", + "agents/gsd-code-fixer.md": "aa8fb3a712ee0573", "agents/gsd-code-reviewer.md": "f70ee630a166fec8", "agents/gsd-codebase-mapper.md": "b2885ffa8bb75d47", - "agents/gsd-debug-session-manager.md": "0b23e9c20c77f55c", - "agents/gsd-debugger.md": "7411b2f67a801c3e", + "agents/gsd-debug-session-manager.md": "c88ad88c7a9fff8b", + "agents/gsd-debugger.md": "89d03f3bd515f045", "agents/gsd-doc-classifier.md": "5de2a66c751b2d58", "agents/gsd-doc-synthesizer.md": "8e6fb8220f777022", "agents/gsd-doc-verifier.md": "3767850df78f4a36", "agents/gsd-doc-writer.md": "10962b6bd4212379", - "agents/gsd-domain-researcher.md": "412cdbb05ba252ea", - "agents/gsd-eval-auditor.md": "2d121dbec93fd4ce", + "agents/gsd-domain-researcher.md": "d4c07520f650ffd5", + "agents/gsd-eval-auditor.md": "0d3c7822c91197fc", "agents/gsd-eval-planner.md": "03448fc9c5774b56", - "agents/gsd-executor.md": "0735dcf053be7c76", + "agents/gsd-executor.md": "9bda03decabbaa16", "agents/gsd-framework-selector.md": "ea9981d65d6b3429", "agents/gsd-integration-checker.md": "33fd537b862eb944", - "agents/gsd-intel-updater.md": "699dacdc0a1f2478", - "agents/gsd-mempalace-curator.md": "399e90e473b33814", + "agents/gsd-intel-updater.md": "22cc46f64ad4c336", + "agents/gsd-mempalace-curator.md": "576b8d0db51bc462", "agents/gsd-nyquist-auditor.md": "7fb0ecf639c1cdfe", "agents/gsd-pattern-mapper.md": "9ab071c3ffc1cf46", - "agents/gsd-phase-researcher.md": "ecb365e5f62aaafc", - "agents/gsd-plan-checker.md": "ca47fdf6d4a36849", - "agents/gsd-planner.md": "7cb18e515bab3c05", - "agents/gsd-project-researcher.md": "d38509cab69224d9", - "agents/gsd-research-synthesizer.md": "6d64fce8b06b7a62", + "agents/gsd-phase-researcher.md": "7ecc077c36ebad64", + "agents/gsd-plan-checker.md": "7807baf92b84e721", + "agents/gsd-planner.md": "3dd52fdc04d450d9", + "agents/gsd-project-researcher.md": "fda710ba13e4117d", + "agents/gsd-research-synthesizer.md": "b425f746df47c2ac", "agents/gsd-roadmapper.md": "604b25c6687811f4", "agents/gsd-security-auditor.md": "f85447e5b5300feb", "agents/gsd-ui-auditor.md": "cc46d104cbc49079", "agents/gsd-ui-checker.md": "8f140c80fc193e13", - "agents/gsd-ui-researcher.md": "623cb59aa6dbe146", + "agents/gsd-ui-researcher.md": "14f711963a71322a", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", - "agents/gsd-verifier.md": "45c450b6d7cc5f0d", + "agents/gsd-verifier.md": "7286d42f73e54be1", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2", - "gsd-core/bin/gsd-tools.cjs": "1118403709188168", + "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -107,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "e8087cf6aae8d56f", + "gsd-core/references/planning-config.md": "32430b855023bfdb", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -191,120 +190,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "cee41d5fc52d4e37", - "gsd-core/workflows/add-phase.md": "cc63a3e108c9a065", - "gsd-core/workflows/add-tests.md": "b62585823e5636bb", - "gsd-core/workflows/add-todo.md": "5e037b444e657557", - "gsd-core/workflows/ai-integration-phase.md": "afdc7c15f03a95fc", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "4b75a93042406fb8", + "gsd-core/workflows/add-phase.md": "e660b7f2793e6057", + "gsd-core/workflows/add-tests.md": "258d0a918a40f2b4", + "gsd-core/workflows/add-todo.md": "53acd2035bee5cbb", + "gsd-core/workflows/ai-integration-phase.md": "ce4775b1ea73c8ec", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "da62236c7b3161a0", - "gsd-core/workflows/audit-milestone.md": "b7617cf590d92a56", - "gsd-core/workflows/audit-uat.md": "97d441d07e7972b3", - "gsd-core/workflows/autonomous.md": "3014ff90115f0daf", - "gsd-core/workflows/check-todos.md": "ec8c22920f6b2df1", - "gsd-core/workflows/cleanup.md": "6a18b165752e3087", - "gsd-core/workflows/code-review-fix.md": "e14afce87cf0d420", - "gsd-core/workflows/code-review.md": "d6d385b6dadae5a0", - "gsd-core/workflows/complete-milestone.md": "40085d32b15805c8", - "gsd-core/workflows/debug.md": "c23d067580b09f63", - "gsd-core/workflows/diagnose-issues.md": "652ae26975f82242", + "gsd-core/workflows/audit-fix.md": "75f9d02e6924913c", + "gsd-core/workflows/audit-milestone.md": "49d1978340cf89ef", + "gsd-core/workflows/audit-uat.md": "b38b4e18e2abd51b", + "gsd-core/workflows/autonomous.md": "4bdc47f26319ac48", + "gsd-core/workflows/check-todos.md": "7fc4a39f3e83dde7", + "gsd-core/workflows/cleanup.md": "804c5d481279f008", + "gsd-core/workflows/code-review-fix.md": "7d6caed073170b2a", + "gsd-core/workflows/code-review.md": "ca4a87c143bb2d55", + "gsd-core/workflows/complete-milestone.md": "35a311ed5cea3599", + "gsd-core/workflows/debug.md": "6000ef61c0a67d84", + "gsd-core/workflows/diagnose-issues.md": "1aa7b1f3c4cbe15d", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", - "gsd-core/workflows/discuss-phase-assumptions.md": "3865afc23e9cd46a", + "gsd-core/workflows/discuss-phase-assumptions.md": "6360526c14233193", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "8644b72386a51241", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "3102430dfad9c012", + "gsd-core/workflows/discuss-phase.md": "b5731ee756a9a724", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "1bcf72db1553bbf2", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "20066d66f481e69c", + "gsd-core/workflows/discuss-phase/modes/auto.md": "9b87eb70ef459efa", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "22ed6fd00d79ff71", + "gsd-core/workflows/discuss-phase/modes/chain.md": "2a6782b674cf4ca6", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "6914c661b95859ee", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "35862ba1f7230247", - "gsd-core/workflows/docs-update.md": "45d2f0d173c84e07", - "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", - "gsd-core/workflows/eval-review.md": "6dee8a1e40ececd4", - "gsd-core/workflows/execute-phase.md": "6bb6f3c6a33c4233", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "36af8d91e4ae8b9c", + "gsd-core/workflows/do.md": "1f0dc350abac269a", + "gsd-core/workflows/docs-update.md": "12433c1e3cf9e40e", + "gsd-core/workflows/edit-phase.md": "4ba06a05cb29f3b7", + "gsd-core/workflows/eval-review.md": "0ab8368c8edf91fb", + "gsd-core/workflows/execute-phase.md": "c739c018da3d2c0d", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9320986ccf0e8a60", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5c30e38cdc265e20", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "4116471249699255", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "503b0ced0731dc38", - "gsd-core/workflows/explore.md": "e1a83a8982532e5b", - "gsd-core/workflows/extract-learnings.md": "dd4fdb88605de49a", + "gsd-core/workflows/execute-plan.md": "73f47e5a189cd27d", + "gsd-core/workflows/explore.md": "42f73d9fc38429da", + "gsd-core/workflows/extract-learnings.md": "1d0a3cbf17159316", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "82800a3138ac1da9", - "gsd-core/workflows/graduation.md": "40401655435beee3", - "gsd-core/workflows/health.md": "043de14edb6a9723", + "gsd-core/workflows/forensics.md": "0b20c736f1220ee7", + "gsd-core/workflows/graduation.md": "7398492ff69af5e7", + "gsd-core/workflows/health.md": "de79abe3b83a0252", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "cef457f954a9991e", - "gsd-core/workflows/help/modes/full.md": "1e1e826ba1da0bc5", - "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", - "gsd-core/workflows/import.md": "e56c18a984396066", + "gsd-core/workflows/help/modes/full.md": "8f70d84fd3549aa0", + "gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd", + "gsd-core/workflows/import.md": "5c0e3e97b0a59a06", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", - "gsd-core/workflows/ingest-docs.md": "f291310a8a89dbd8", - "gsd-core/workflows/insert-phase.md": "00a34b792c323959", + "gsd-core/workflows/ingest-docs.md": "9cbe45380eed4a0e", + "gsd-core/workflows/insert-phase.md": "080d2f56cf0021ab", "gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c", - "gsd-core/workflows/list-seeds.md": "8d6e1b5d85f64c6f", - "gsd-core/workflows/list-workspaces.md": "5e434933a3db695c", - "gsd-core/workflows/manager.md": "176ca710b4be4860", - "gsd-core/workflows/map-codebase.md": "2328da6a2f180f07", - "gsd-core/workflows/milestone-summary.md": "97ddfc40c6bce906", - "gsd-core/workflows/mvp-phase.md": "5ca64695120d250c", - "gsd-core/workflows/new-milestone.md": "d009cde68c003ca6", - "gsd-core/workflows/new-project.md": "493ae04534a80f97", - "gsd-core/workflows/new-workspace.md": "0d59bb987430003e", - "gsd-core/workflows/next.md": "c13515a80c20d37d", + "gsd-core/workflows/list-seeds.md": "e8d404a07c612d46", + "gsd-core/workflows/list-workspaces.md": "0bda9b42bb5c509b", + "gsd-core/workflows/manager.md": "f2ae9c83a80cc690", + "gsd-core/workflows/map-codebase.md": "8ce1e33f45827202", + "gsd-core/workflows/milestone-summary.md": "4135889e51e1e4b5", + "gsd-core/workflows/mvp-phase.md": "b3561a8ab1b26a4c", + "gsd-core/workflows/new-milestone.md": "3f2875618897718b", + "gsd-core/workflows/new-project.md": "6c1440959e637d2d", + "gsd-core/workflows/new-workspace.md": "9b41c1b5c0196936", + "gsd-core/workflows/next.md": "80f2feb243818c90", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", - "gsd-core/workflows/pause-work.md": "be33f84dc1d4822f", - "gsd-core/workflows/plan-milestone-gaps.md": "d98e98486123eb97", - "gsd-core/workflows/plan-phase.md": "1cac08591d361397", + "gsd-core/workflows/pause-work.md": "54f1c0a9e79e2c59", + "gsd-core/workflows/plan-milestone-gaps.md": "1b820f4e70acce86", + "gsd-core/workflows/plan-phase.md": "574fc8008416e6a7", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "c22ff5ea46de665a", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "451a287826b36227", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "d050d8d551ed1756", - "gsd-core/workflows/plan-review-convergence.md": "e2d31d43cbf2aa88", - "gsd-core/workflows/plant-seed.md": "0a92ba12993ac261", - "gsd-core/workflows/pr-branch.md": "cef0f65b16d500b4", - "gsd-core/workflows/profile-user.md": "263c0693563d98da", - "gsd-core/workflows/progress.md": "3b1b2142a74af85c", - "gsd-core/workflows/quick.md": "518740e30dcd4da3", - "gsd-core/workflows/reapply-patches.md": "de0ee8acfe7245b2", - "gsd-core/workflows/remove-phase.md": "e8ae4fbbfac700f0", - "gsd-core/workflows/remove-workspace.md": "4ac64de862dc650e", - "gsd-core/workflows/resume-project.md": "7f20769f302e5427", - "gsd-core/workflows/review.md": "bb5c36262d5ff951", - "gsd-core/workflows/scan.md": "949692db4834dd27", - "gsd-core/workflows/secure-phase.md": "6758f1acf4113e9e", + "gsd-core/workflows/plan-review-convergence.md": "b809588bff4f48b5", + "gsd-core/workflows/plant-seed.md": "e3949fcbcf5d375f", + "gsd-core/workflows/pr-branch.md": "95850381230787ed", + "gsd-core/workflows/profile-user.md": "07e634c1dab106fc", + "gsd-core/workflows/progress.md": "eb2dafb8e419b784", + "gsd-core/workflows/quick.md": "cdc5477dacaec99a", + "gsd-core/workflows/reapply-patches.md": "4a93b90cbe70a2f1", + "gsd-core/workflows/remove-phase.md": "17c46fdcef27df2d", + "gsd-core/workflows/remove-workspace.md": "1d34788a9b2272d2", + "gsd-core/workflows/resume-project.md": "bba3250afbea8f09", + "gsd-core/workflows/review.md": "8ed9a9e7d150978d", + "gsd-core/workflows/scan.md": "514d3eba81565193", + "gsd-core/workflows/secure-phase.md": "a7e8edb0e5f48256", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "8d850d15f1d06dd6", - "gsd-core/workflows/settings-integrations.md": "29c5de27fbbb18e9", - "gsd-core/workflows/settings.md": "da0b7567d648b80a", - "gsd-core/workflows/ship.md": "9f94d0b155eb041e", - "gsd-core/workflows/sketch-wrap-up.md": "89e0eab2af946b04", - "gsd-core/workflows/sketch.md": "483387542d6fc3af", - "gsd-core/workflows/smart-entry.md": "d309710bcabd4675", - "gsd-core/workflows/spec-phase.md": "0d888493bde5146b", - "gsd-core/workflows/spike-wrap-up.md": "fe04cb3d30dcbc6c", - "gsd-core/workflows/spike.md": "fad28f2ecf2dac52", - "gsd-core/workflows/stats.md": "89a08155b92f4a2d", + "gsd-core/workflows/settings-advanced.md": "8e9a8f18b8c1e16e", + "gsd-core/workflows/settings-integrations.md": "8110932b38057f2f", + "gsd-core/workflows/settings.md": "1bd9dc8b2e7402e6", + "gsd-core/workflows/ship.md": "e10d21edabf201a7", + "gsd-core/workflows/sketch-wrap-up.md": "7630ee69ab22462d", + "gsd-core/workflows/sketch.md": "68c337d92c79dc9b", + "gsd-core/workflows/spec-phase.md": "dbe5f223d7bc026c", + "gsd-core/workflows/spike-wrap-up.md": "96b8244988d651fd", + "gsd-core/workflows/spike.md": "52fcd95f7b343232", + "gsd-core/workflows/stats.md": "7ffa072290ebcae3", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "f24b6454c69d064a", - "gsd-core/workflows/transition.md": "9c615db5686219d0", - "gsd-core/workflows/ui-phase.md": "a1f11225433e1795", - "gsd-core/workflows/ui-review.md": "8b989f372684851f", - "gsd-core/workflows/ultraplan-phase.md": "49921383982474e0", + "gsd-core/workflows/thread.md": "c10177767648ea7f", + "gsd-core/workflows/transition.md": "1f0a1478d75d89ec", + "gsd-core/workflows/ui-phase.md": "1c91323daf451053", + "gsd-core/workflows/ui-review.md": "f1f82d8257e910cc", + "gsd-core/workflows/ultraplan-phase.md": "edcaa0b29f942df0", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", - "gsd-core/workflows/update.md": "b34cb866152d4de3", - "gsd-core/workflows/validate-phase.md": "e989cbaa4228564c", - "gsd-core/workflows/verify-phase.md": "a8679ba1d84145c5", - "gsd-core/workflows/verify-work.md": "b5afb65fdf311301", + "gsd-core/workflows/update.md": "baae1a977fbeba49", + "gsd-core/workflows/validate-phase.md": "0e153ccb3bdb9dda", + "gsd-core/workflows/verify-phase.md": "0ef74d5b7f7646f6", + "gsd-core/workflows/verify-work.md": "69d9d98563b9ec81", "hooks/gsd-check-update-worker.js": "4bb354044e0dff91", "hooks/gsd-check-update.js": "d2065cb3e725a42a", "hooks/gsd-config-reload.js": "4f52b8a0120bb1b8", @@ -345,8 +343,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "8d38e55e5f8b774b", "skills/gsd-ns-context/skills/graphify/SKILL.md": "ac3661e6e576188b", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "5009595dbde69739", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "40a31ad049374297", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "c3f412d5a64f3921", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "e9b66db79fce0a2f", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "9bfa9e76c7a10e26", "skills/gsd-ns-ideate/SKILL.md": "4a0d2691054b23e5", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "05fa421c95fbad2d", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "7ee5c455f37093be", @@ -394,7 +392,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "7c9404102a9b9d74", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "ef8f643abff1486b", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "70375e2381319d2b", - "skills/gsd-ns-workflow/SKILL.md": "5a65f9fb93a71cec", + "skills/gsd-ns-workflow/SKILL.md": "46f5e3e89eed3743", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "6661195a66f25ae8", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "96c8151779ad510e", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "fb57d2c08ea9e8bc", @@ -402,7 +400,6 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "13518a22e020e1bf", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "5f3f8b0c3f564d14", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f9a1348c6c297579", - "skills/gsd-ns-workflow/skills/next/SKILL.md": "13e394affe675498", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "1ed640e5f06c7be6", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "75979bb1db5557af", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "c3dd8bfa877eaed5", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 837e7cf47..01f7797a0 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -4,46 +4,45 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "abfc97706f16aaaf", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "5fe29063843be67e", + "agents/gsd-code-fixer.md": "31fa8ab0d217788c", "agents/gsd-code-reviewer.md": "338c46ab59c4e45f", "agents/gsd-codebase-mapper.md": "8529d8a1ede8bbfb", - "agents/gsd-debug-session-manager.md": "69aa7eae3a23f6a9", - "agents/gsd-debugger.md": "704eb4e94b4d1212", + "agents/gsd-debug-session-manager.md": "410e3739329bd9ac", + "agents/gsd-debugger.md": "956c3207a43f973f", "agents/gsd-doc-classifier.md": "5807f1f7cfa40c42", "agents/gsd-doc-synthesizer.md": "0897098024c17ccd", "agents/gsd-doc-verifier.md": "e51e50892963ccc7", "agents/gsd-doc-writer.md": "b0c3ad805b789226", "agents/gsd-domain-researcher.md": "b80f76874c04e515", - "agents/gsd-eval-auditor.md": "470bf16303ec4d2e", + "agents/gsd-eval-auditor.md": "96df1d4a9cd553a0", "agents/gsd-eval-planner.md": "22334fde85723c9d", - "agents/gsd-executor.md": "45eeb443a6e6dbe8", + "agents/gsd-executor.md": "546ea45461739438", "agents/gsd-framework-selector.md": "7726fccc86bfeb50", "agents/gsd-integration-checker.md": "7cd2072984411c7f", - "agents/gsd-intel-updater.md": "83de6ba9172891c3", - "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", + "agents/gsd-intel-updater.md": "2751bbd33912aa1b", + "agents/gsd-mempalace-curator.md": "63676937f8970bf3", "agents/gsd-nyquist-auditor.md": "58efbed3b81b5ede", "agents/gsd-pattern-mapper.md": "b5d7a4abb1baecb9", - "agents/gsd-phase-researcher.md": "2256f1f82212c757", - "agents/gsd-plan-checker.md": "523119bd5d6599fe", - "agents/gsd-planner.md": "d0e98ddbfb1339f5", - "agents/gsd-project-researcher.md": "ddf7794e81300032", - "agents/gsd-research-synthesizer.md": "a124b00271748d07", + "agents/gsd-phase-researcher.md": "2ba0dab43912f28a", + "agents/gsd-plan-checker.md": "bc56265bcba1b002", + "agents/gsd-planner.md": "6ba7e6a042dbfc3c", + "agents/gsd-project-researcher.md": "16165f30baea2a06", + "agents/gsd-research-synthesizer.md": "9694b191aecc5f73", "agents/gsd-roadmapper.md": "493ef92b42b12cf4", "agents/gsd-security-auditor.md": "fbd3798eec23651b", "agents/gsd-ui-auditor.md": "771ae08260534d5c", "agents/gsd-ui-checker.md": "8573715bebbd4782", - "agents/gsd-ui-researcher.md": "3e737e761bc67073", + "agents/gsd-ui-researcher.md": "70ad13e7de7b0da7", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "99e95e235aacffbf", + "agents/gsd-verifier.md": "2fef6afe676b0e34", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527", - "gsd-core/bin/gsd-tools.cjs": "fa4db2ce1f77ef99", + "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -107,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "33c5b0685be54e96", + "gsd-core/references/planning-config.md": "970c47f816acdb30", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -191,120 +190,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "1851e97996d445d5", - "gsd-core/workflows/add-phase.md": "09bdebbc62f3310e", - "gsd-core/workflows/add-tests.md": "ff3a598cdbc5aa6e", - "gsd-core/workflows/add-todo.md": "0fe07cbd29ec252b", - "gsd-core/workflows/ai-integration-phase.md": "d469eb120e52de0f", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "36f58e864aeaf24d", + "gsd-core/workflows/add-phase.md": "4e498058a786615f", + "gsd-core/workflows/add-tests.md": "688a232a0a4b918e", + "gsd-core/workflows/add-todo.md": "792592b2133698a7", + "gsd-core/workflows/ai-integration-phase.md": "0672cc9afb7b7a0b", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "ac71c1179444fdc3", - "gsd-core/workflows/audit-milestone.md": "a379eda51d821bce", - "gsd-core/workflows/audit-uat.md": "6e768b1c208a787a", - "gsd-core/workflows/autonomous.md": "c482645c5d1ead46", - "gsd-core/workflows/check-todos.md": "0dda8236355e8c9c", - "gsd-core/workflows/cleanup.md": "82f65f5214ecd748", - "gsd-core/workflows/code-review-fix.md": "959a65773b325ed2", - "gsd-core/workflows/code-review.md": "b31bbd7dbe5ed303", - "gsd-core/workflows/complete-milestone.md": "6e918b72bd885426", - "gsd-core/workflows/debug.md": "197d3642a6704de5", - "gsd-core/workflows/diagnose-issues.md": "9274b11a3db98c65", + "gsd-core/workflows/audit-fix.md": "493e4abe4f701662", + "gsd-core/workflows/audit-milestone.md": "26b2428d9a8df7b2", + "gsd-core/workflows/audit-uat.md": "f02cd45df6304b06", + "gsd-core/workflows/autonomous.md": "b615e91ac7c248bd", + "gsd-core/workflows/check-todos.md": "e4209530a4132312", + "gsd-core/workflows/cleanup.md": "78080ff25ba43f8c", + "gsd-core/workflows/code-review-fix.md": "4eebfb7f1612b441", + "gsd-core/workflows/code-review.md": "7630639b5f2f9ff2", + "gsd-core/workflows/complete-milestone.md": "5f7dbe9842b23e57", + "gsd-core/workflows/debug.md": "87c20def8d313e45", + "gsd-core/workflows/diagnose-issues.md": "a0b3fee49d516c0b", "gsd-core/workflows/discovery-phase.md": "b32b6197b66c9a13", - "gsd-core/workflows/discuss-phase-assumptions.md": "3d05b08eae75c7bd", + "gsd-core/workflows/discuss-phase-assumptions.md": "3689bacffdd7cdd4", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "4509657816c5566a", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "c9cd7db62e76ebcb", + "gsd-core/workflows/discuss-phase.md": "9c4af7ae57aaad8f", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "5522bd33cbd9b9b8", "gsd-core/workflows/discuss-phase/modes/all.md": "e698b84ebb2ff56d", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "6ba5c7b738f44003", + "gsd-core/workflows/discuss-phase/modes/auto.md": "bb489751893f4498", "gsd-core/workflows/discuss-phase/modes/batch.md": "21ee55869eaa7ece", - "gsd-core/workflows/discuss-phase/modes/chain.md": "4739c3d2ef20a76c", + "gsd-core/workflows/discuss-phase/modes/chain.md": "c643b0b42b24e0d4", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "e1043e27b50a5e18", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "f3328dbd4416f11a", - "gsd-core/workflows/docs-update.md": "f13571f08e083356", - "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", - "gsd-core/workflows/eval-review.md": "37d545d4f0db4927", - "gsd-core/workflows/execute-phase.md": "0f90fb13e63cf2b2", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c985a30317a1aa6b", + "gsd-core/workflows/do.md": "461d545bbde0dc8f", + "gsd-core/workflows/docs-update.md": "dd1050b32c2dc170", + "gsd-core/workflows/edit-phase.md": "38f9c9945073ac8c", + "gsd-core/workflows/eval-review.md": "48fdef1cf0e67525", + "gsd-core/workflows/execute-phase.md": "5e36e2287a165064", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "44d46d3e98942efc", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "1e0cc4675bcf1496", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a2fc97089560ec0a", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "4910f75bab2040ab", - "gsd-core/workflows/explore.md": "8a5437aa0c239c38", - "gsd-core/workflows/extract-learnings.md": "3fcc858b20d0d0e6", + "gsd-core/workflows/execute-plan.md": "6d437a23e6d9ffcc", + "gsd-core/workflows/explore.md": "9f24bf678b1ef341", + "gsd-core/workflows/extract-learnings.md": "0e0eead67cec3d28", "gsd-core/workflows/fast.md": "0162075e44072447", - "gsd-core/workflows/forensics.md": "665546666547875d", - "gsd-core/workflows/graduation.md": "1ca877cda258a5de", - "gsd-core/workflows/health.md": "1f9fd2deea45896f", + "gsd-core/workflows/forensics.md": "96103895b70d652c", + "gsd-core/workflows/graduation.md": "63b74175d5e9cc1e", + "gsd-core/workflows/health.md": "9ddf28b84e1ce089", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "1b3c315342701265", - "gsd-core/workflows/help/modes/full.md": "62c71f57f047999b", - "gsd-core/workflows/help/modes/topic.md": "229e3f3d85bda04b", - "gsd-core/workflows/import.md": "31af58468db15daf", + "gsd-core/workflows/help/modes/full.md": "6d4aacaec9858e28", + "gsd-core/workflows/help/modes/topic.md": "5419498effee148f", + "gsd-core/workflows/import.md": "47cc99b635e45f82", "gsd-core/workflows/inbox.md": "e9ea37b2d46dc5b4", - "gsd-core/workflows/ingest-docs.md": "fba176ad3cc22f5f", - "gsd-core/workflows/insert-phase.md": "753fa719f0d41d76", + "gsd-core/workflows/ingest-docs.md": "9554d457d64b7c17", + "gsd-core/workflows/insert-phase.md": "ff204ee159b41506", "gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620", - "gsd-core/workflows/list-seeds.md": "74ec072a74f8fdfe", - "gsd-core/workflows/list-workspaces.md": "886e99378a3d19d9", - "gsd-core/workflows/manager.md": "212a50d3f65fff21", - "gsd-core/workflows/map-codebase.md": "713561638fb1b88e", - "gsd-core/workflows/milestone-summary.md": "a0063cfbe08f2250", - "gsd-core/workflows/mvp-phase.md": "8ed9f4552350ede8", - "gsd-core/workflows/new-milestone.md": "af5ad8ed5aac6677", - "gsd-core/workflows/new-project.md": "32ce66cbeaa26cc5", - "gsd-core/workflows/new-workspace.md": "6b6fbad18d30f783", - "gsd-core/workflows/next.md": "2163195861877de5", + "gsd-core/workflows/list-seeds.md": "fa287a9ed912eb17", + "gsd-core/workflows/list-workspaces.md": "4668ebdc3380a7a6", + "gsd-core/workflows/manager.md": "79a6e4de6654f4e7", + "gsd-core/workflows/map-codebase.md": "f90d0577d254c38e", + "gsd-core/workflows/milestone-summary.md": "feb8305a862a79de", + "gsd-core/workflows/mvp-phase.md": "1d2292f3c444c13d", + "gsd-core/workflows/new-milestone.md": "f69e9ccc51ab956b", + "gsd-core/workflows/new-project.md": "d1a0070ed292c25a", + "gsd-core/workflows/new-workspace.md": "555689ccf58bafdb", + "gsd-core/workflows/next.md": "569c68513fd94ea7", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "acc9130fb1e94f0b", - "gsd-core/workflows/pause-work.md": "c20d267e28ce92f0", - "gsd-core/workflows/plan-milestone-gaps.md": "26db7b9329b7ddc8", - "gsd-core/workflows/plan-phase.md": "fc7d25c0649e2fdf", + "gsd-core/workflows/pause-work.md": "09a6b8980f7b771a", + "gsd-core/workflows/plan-milestone-gaps.md": "022822b3b6971b75", + "gsd-core/workflows/plan-phase.md": "8eddecda8fcd8765", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "778b73a8db6f7c32", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "382dac17d70ebfac", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "619946c879f33b9d", - "gsd-core/workflows/plan-review-convergence.md": "85629dd3815dcf64", - "gsd-core/workflows/plant-seed.md": "856ad565b2eb0c47", - "gsd-core/workflows/pr-branch.md": "79fd55b88ea2db9c", - "gsd-core/workflows/profile-user.md": "672821e6b1266645", - "gsd-core/workflows/progress.md": "94768f835b0b8908", - "gsd-core/workflows/quick.md": "8ac5f3919f754499", - "gsd-core/workflows/reapply-patches.md": "21b38c374f19fd78", - "gsd-core/workflows/remove-phase.md": "a46c2fe853bf4e86", - "gsd-core/workflows/remove-workspace.md": "ae0e1c6d4438d663", - "gsd-core/workflows/resume-project.md": "f242e4c8aba18ea2", - "gsd-core/workflows/review.md": "34a23b9b65fb55f6", - "gsd-core/workflows/scan.md": "63631467651d9ca8", - "gsd-core/workflows/secure-phase.md": "6cc236e53c2e7d56", + "gsd-core/workflows/plan-review-convergence.md": "8fb889570c17db15", + "gsd-core/workflows/plant-seed.md": "dc911406ada4d188", + "gsd-core/workflows/pr-branch.md": "e939128047e02395", + "gsd-core/workflows/profile-user.md": "0831c4b96b1265c9", + "gsd-core/workflows/progress.md": "3e2b44a7a175654c", + "gsd-core/workflows/quick.md": "bd2b2b1e2da01f6a", + "gsd-core/workflows/reapply-patches.md": "ea66e63f56e7deb3", + "gsd-core/workflows/remove-phase.md": "5a2521695edd486b", + "gsd-core/workflows/remove-workspace.md": "ed8e5e30c33f1bfd", + "gsd-core/workflows/resume-project.md": "ee9dcc4e3dd3e32c", + "gsd-core/workflows/review.md": "a2dab55fa3acfca0", + "gsd-core/workflows/scan.md": "afc48f3339293b30", + "gsd-core/workflows/secure-phase.md": "882886f04d3b7e82", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "252d3f848c95220e", - "gsd-core/workflows/settings-integrations.md": "f8f756709ec02363", - "gsd-core/workflows/settings.md": "01cf9ffd340cff64", - "gsd-core/workflows/ship.md": "c08f0fe3025d2c86", - "gsd-core/workflows/sketch-wrap-up.md": "dbec602d104cb951", - "gsd-core/workflows/sketch.md": "44ff275150b6d045", - "gsd-core/workflows/smart-entry.md": "d8018578571f08d5", - "gsd-core/workflows/spec-phase.md": "ab8fad8038b14cad", - "gsd-core/workflows/spike-wrap-up.md": "6fe876cb87603bc3", - "gsd-core/workflows/spike.md": "c042a437baaf10ad", - "gsd-core/workflows/stats.md": "e4f84542fb5721ef", + "gsd-core/workflows/settings-advanced.md": "8f12ba07bf7a795f", + "gsd-core/workflows/settings-integrations.md": "9aa7005e6dd84bcc", + "gsd-core/workflows/settings.md": "4332d1ee0efe797b", + "gsd-core/workflows/ship.md": "0647d19b5487b1a3", + "gsd-core/workflows/sketch-wrap-up.md": "4894dac77fc42655", + "gsd-core/workflows/sketch.md": "52f4a04f511e205e", + "gsd-core/workflows/spec-phase.md": "56cecc44b2cc0bc4", + "gsd-core/workflows/spike-wrap-up.md": "1f57905138a648ac", + "gsd-core/workflows/spike.md": "48df8b626cbd378d", + "gsd-core/workflows/stats.md": "18089135bc41f1b4", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "0582c6be8a78bbd8", - "gsd-core/workflows/transition.md": "163d220813b0835f", - "gsd-core/workflows/ui-phase.md": "871655025b431a55", - "gsd-core/workflows/ui-review.md": "4e70afbfd5601853", - "gsd-core/workflows/ultraplan-phase.md": "77b58ef8af5209bd", + "gsd-core/workflows/thread.md": "61e0eee731434ea9", + "gsd-core/workflows/transition.md": "b49ddd9247f804e7", + "gsd-core/workflows/ui-phase.md": "a725ebdd4f47fb97", + "gsd-core/workflows/ui-review.md": "b3221cac976daffa", + "gsd-core/workflows/ultraplan-phase.md": "06ac6fbb061b2464", "gsd-core/workflows/undo.md": "59b8baa54efc4110", - "gsd-core/workflows/update.md": "1f935251fca1f276", - "gsd-core/workflows/validate-phase.md": "1c0ebe56d96a14d1", - "gsd-core/workflows/verify-phase.md": "53cbdce394dcdac0", - "gsd-core/workflows/verify-work.md": "d3a0970205acc6a5", + "gsd-core/workflows/update.md": "e259898f86ae7133", + "gsd-core/workflows/validate-phase.md": "70d102b4d5113dd4", + "gsd-core/workflows/verify-phase.md": "67eefbd1f6417281", + "gsd-core/workflows/verify-work.md": "b48ff071a4c733c9", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", @@ -323,8 +321,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc", "skills/gsd-ns-context/skills/graphify/SKILL.md": "e0253aef14693a7e", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "0910348701b1fc65", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "36c486f14abe869a", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "2d95e385fee26dee", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "92740c97e0ce6942", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "d41523e659d1920f", "skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "90aee26970fa7639", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "d8e26a5ed95a4ecc", @@ -372,7 +370,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "89a29a2fa62b177e", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "3e23efe03dafd691", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "fa1ab5c9a869f6cd", - "skills/gsd-ns-workflow/SKILL.md": "0cb9c23c065fe448", + "skills/gsd-ns-workflow/SKILL.md": "7dbd699b5130c0d5", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "6d64ae85b590274f", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "c458b792bdf5b1f2", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "37dc7b78ceb74803", @@ -380,7 +378,6 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "eb0158de64f22a55", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "3eae6536d09c2532", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "81c98f4436888cb8", - "skills/gsd-ns-workflow/skills/next/SKILL.md": "02993a5aa046eadd", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "50f6cc4df79a26b7", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "44d42fa41a094ad9", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "fee26bc1daedbff5", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index c242d071f..09cbdb6e3 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -4,46 +4,45 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "abfc97706f16aaaf", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "f00d815ec535a168", + "agents/gsd-code-fixer.md": "4d66f7e056369896", "agents/gsd-code-reviewer.md": "efc0d2dee321c654", "agents/gsd-codebase-mapper.md": "cfa2bbfaf264e1fd", - "agents/gsd-debug-session-manager.md": "793d9a80778d1080", - "agents/gsd-debugger.md": "6b28c99a37402200", + "agents/gsd-debug-session-manager.md": "40edd70065aa07bb", + "agents/gsd-debugger.md": "107754fc10a1aafa", "agents/gsd-doc-classifier.md": "5807f1f7cfa40c42", "agents/gsd-doc-synthesizer.md": "0897098024c17ccd", "agents/gsd-doc-verifier.md": "ede2f297b73b5a86", "agents/gsd-doc-writer.md": "0109294817e475a8", "agents/gsd-domain-researcher.md": "56395dbdabf076f6", - "agents/gsd-eval-auditor.md": "fb64fc5acf359747", + "agents/gsd-eval-auditor.md": "8a2cab3ae8b4674b", "agents/gsd-eval-planner.md": "2049dac060d00eda", - "agents/gsd-executor.md": "406fdcc0597bea77", + "agents/gsd-executor.md": "9ab8c4acb4206e09", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "4ffb37fb230c2b90", - "agents/gsd-intel-updater.md": "a81d77c143c02108", - "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", + "agents/gsd-intel-updater.md": "16ee6795da80a7c0", + "agents/gsd-mempalace-curator.md": "63676937f8970bf3", "agents/gsd-nyquist-auditor.md": "0ef8609fd897e399", "agents/gsd-pattern-mapper.md": "ada0c169daa2f0ec", - "agents/gsd-phase-researcher.md": "2a45ebde829555ec", - "agents/gsd-plan-checker.md": "33fbf70b7b24eb1e", - "agents/gsd-planner.md": "f408404c60840c9f", - "agents/gsd-project-researcher.md": "f6697b316b5995ba", - "agents/gsd-research-synthesizer.md": "04036f38c1d373ea", + "agents/gsd-phase-researcher.md": "bf5104cc11b973e9", + "agents/gsd-plan-checker.md": "15ebf7ea032c6de2", + "agents/gsd-planner.md": "f508c186b837b3f0", + "agents/gsd-project-researcher.md": "3fbfb4b098966e64", + "agents/gsd-research-synthesizer.md": "beb116fe6df1b376", "agents/gsd-roadmapper.md": "fb62e1e3de84b5f9", "agents/gsd-security-auditor.md": "13b660e2d336ed8e", "agents/gsd-ui-auditor.md": "20cc99872e9b998b", "agents/gsd-ui-checker.md": "b9c38249bff35478", - "agents/gsd-ui-researcher.md": "f830742b9493601c", + "agents/gsd-ui-researcher.md": "e31fa75e26f957f2", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "a07b00b9c5b7b338", + "agents/gsd-verifier.md": "b16b34a580941124", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2", - "gsd-core/bin/gsd-tools.cjs": "92e0f7b7eb55af51", + "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", + "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", + "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -107,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "062db9fe16ec76f9", + "gsd-core/references/planning-config.md": "742e11db47c5c0aa", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -191,120 +190,119 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", - "gsd-core/workflows/add-backlog.md": "61169973a10b1321", - "gsd-core/workflows/add-phase.md": "f9b1f7cc229b57f8", - "gsd-core/workflows/add-tests.md": "b5e03955cb29d7d8", - "gsd-core/workflows/add-todo.md": "cab0d8215579fbdd", - "gsd-core/workflows/ai-integration-phase.md": "8948988717506320", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", + "gsd-core/workflows/add-backlog.md": "b84c744efaed7a2e", + "gsd-core/workflows/add-phase.md": "199ac1b4879fb51a", + "gsd-core/workflows/add-tests.md": "5aafbe6d624d41c9", + "gsd-core/workflows/add-todo.md": "7151303ccc3e6d05", + "gsd-core/workflows/ai-integration-phase.md": "9b287efec21a3c0b", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "babe6812b86cec8f", - "gsd-core/workflows/audit-milestone.md": "ac2238ea6c11ae9e", - "gsd-core/workflows/audit-uat.md": "d496e39402e160de", - "gsd-core/workflows/autonomous.md": "fe7bb7c978f305a2", - "gsd-core/workflows/check-todos.md": "afc840fceb07bf99", - "gsd-core/workflows/cleanup.md": "93c14107979a4428", - "gsd-core/workflows/code-review-fix.md": "9b2de93a6087774d", - "gsd-core/workflows/code-review.md": "2f0ebfb7a2e33764", - "gsd-core/workflows/complete-milestone.md": "f463bf4e86ac26f6", - "gsd-core/workflows/debug.md": "52243eb936a43150", - "gsd-core/workflows/diagnose-issues.md": "447072aa72385271", + "gsd-core/workflows/audit-fix.md": "e1ad3e58979d9eef", + "gsd-core/workflows/audit-milestone.md": "e578d1ce71b172e6", + "gsd-core/workflows/audit-uat.md": "0f779101b40c7229", + "gsd-core/workflows/autonomous.md": "afb9649e6d9b3860", + "gsd-core/workflows/check-todos.md": "ad2ff17a672e7101", + "gsd-core/workflows/cleanup.md": "edc0bc375acdb563", + "gsd-core/workflows/code-review-fix.md": "aa750f6d1abd3b9f", + "gsd-core/workflows/code-review.md": "20c76ddd702e7cd5", + "gsd-core/workflows/complete-milestone.md": "921f9197b4d7f5fd", + "gsd-core/workflows/debug.md": "9679214d9472e213", + "gsd-core/workflows/diagnose-issues.md": "7c0b8debfc906ca0", "gsd-core/workflows/discovery-phase.md": "7dcf150998559c11", - "gsd-core/workflows/discuss-phase-assumptions.md": "f57000d5c5fb178a", + "gsd-core/workflows/discuss-phase-assumptions.md": "3f3b0ac79cdb5631", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "ce4e6abce9cb2d4e", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "cb49f485c4a1f09e", + "gsd-core/workflows/discuss-phase.md": "25d8a61ecf8c21a0", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "1be08d135fd60027", "gsd-core/workflows/discuss-phase/modes/all.md": "d2a1d16e2508a0cd", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "e98b6efbfd66d409", + "gsd-core/workflows/discuss-phase/modes/auto.md": "a66e476942667f9f", "gsd-core/workflows/discuss-phase/modes/batch.md": "c23d5bdbdb60362c", - "gsd-core/workflows/discuss-phase/modes/chain.md": "2f3acba636e436aa", + "gsd-core/workflows/discuss-phase/modes/chain.md": "58125711f7c432ce", "gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "aeb56fe7b95dd786", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73", - "gsd-core/workflows/do.md": "a7ff800fdab468c7", - "gsd-core/workflows/docs-update.md": "70f73cc8c27e0ca0", - "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", - "gsd-core/workflows/eval-review.md": "b28be79ef29f16fd", - "gsd-core/workflows/execute-phase.md": "7cf72d7c95491ece", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "47ae5482f8e64100", + "gsd-core/workflows/do.md": "fc00009666985144", + "gsd-core/workflows/docs-update.md": "a3c2ec2c856aaabc", + "gsd-core/workflows/edit-phase.md": "1666ca537fbef030", + "gsd-core/workflows/eval-review.md": "bb01b3300db963bc", + "gsd-core/workflows/execute-phase.md": "20063847abe7ce75", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "579a3dcf8d69de31", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0f9ccd7edea1d6a9", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bbd704d6b6f0787b", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "c8567fb4438b4404", - "gsd-core/workflows/explore.md": "04e461ff8159a24e", - "gsd-core/workflows/extract-learnings.md": "af793bdf4ffd1c8a", + "gsd-core/workflows/execute-plan.md": "f6bc701c05bb7d70", + "gsd-core/workflows/explore.md": "7a9bb001b196409f", + "gsd-core/workflows/extract-learnings.md": "58ce8fbc17388788", "gsd-core/workflows/fast.md": "0162075e44072447", - "gsd-core/workflows/forensics.md": "3d1ce16b5f605592", - "gsd-core/workflows/graduation.md": "a766039ff6ca653f", - "gsd-core/workflows/health.md": "7b19d6e2c0357c3e", + "gsd-core/workflows/forensics.md": "0e933018fd06e629", + "gsd-core/workflows/graduation.md": "5734685667d8f512", + "gsd-core/workflows/health.md": "644b42c215b1b00e", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "91509fe03bad9795", - "gsd-core/workflows/help/modes/full.md": "4c1a43f7095647e1", - "gsd-core/workflows/help/modes/topic.md": "177d351f7465787d", - "gsd-core/workflows/import.md": "029cacf530aca86b", + "gsd-core/workflows/help/modes/full.md": "8fb3c93df5883f56", + "gsd-core/workflows/help/modes/topic.md": "9f00f5f94c5497aa", + "gsd-core/workflows/import.md": "f5b3826c4cfb2682", "gsd-core/workflows/inbox.md": "797c287852eb8957", - "gsd-core/workflows/ingest-docs.md": "78ba04ca39f28e8d", - "gsd-core/workflows/insert-phase.md": "9aac75665c3a0ee8", + "gsd-core/workflows/ingest-docs.md": "6f0ddb1130216a7d", + "gsd-core/workflows/insert-phase.md": "238e327203e04ed1", "gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620", - "gsd-core/workflows/list-seeds.md": "39162bbefe932b3d", - "gsd-core/workflows/list-workspaces.md": "6950fb740a1e96ab", - "gsd-core/workflows/manager.md": "fc1e8daaf8d40bf0", - "gsd-core/workflows/map-codebase.md": "0a2a653ed1603784", - "gsd-core/workflows/milestone-summary.md": "1fdbae19ad06a0a3", - "gsd-core/workflows/mvp-phase.md": "e3c4cade4fe69408", - "gsd-core/workflows/new-milestone.md": "33db858beb76e3c5", - "gsd-core/workflows/new-project.md": "0ff192c54373ab8a", - "gsd-core/workflows/new-workspace.md": "8c2b60fbbf241e03", - "gsd-core/workflows/next.md": "d48cea140a5153cb", + "gsd-core/workflows/list-seeds.md": "a87319b154d0fb8c", + "gsd-core/workflows/list-workspaces.md": "ff4ad30adc55d5b8", + "gsd-core/workflows/manager.md": "072a9f2ba6084641", + "gsd-core/workflows/map-codebase.md": "6c89a16e0d9fddfe", + "gsd-core/workflows/milestone-summary.md": "957f9620aa472f87", + "gsd-core/workflows/mvp-phase.md": "bcc8037866fa1d4d", + "gsd-core/workflows/new-milestone.md": "b43ff95a594bd688", + "gsd-core/workflows/new-project.md": "d6709238a3ada30c", + "gsd-core/workflows/new-workspace.md": "8a9ab30eac218190", + "gsd-core/workflows/next.md": "3ebbf30622521e76", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "1c1e466c764e3deb", - "gsd-core/workflows/pause-work.md": "93fcc1c845da6396", - "gsd-core/workflows/plan-milestone-gaps.md": "7880866ee1caf923", - "gsd-core/workflows/plan-phase.md": "3e143f39514f8192", + "gsd-core/workflows/pause-work.md": "5ce6a137bd9fc0f8", + "gsd-core/workflows/plan-milestone-gaps.md": "19911e87fd4185f2", + "gsd-core/workflows/plan-phase.md": "f6e8c5e38d5c5a52", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "80b1ba493a9a967f", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "7c2be59e3e19299a", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "3fed4740a91d0443", - "gsd-core/workflows/plan-review-convergence.md": "1fd8d6e1a833e700", - "gsd-core/workflows/plant-seed.md": "6cf61f540cdbd8b9", - "gsd-core/workflows/pr-branch.md": "acd59f915d018ad4", - "gsd-core/workflows/profile-user.md": "c4313672b81b5bcd", - "gsd-core/workflows/progress.md": "18813a345bd2343a", - "gsd-core/workflows/quick.md": "0fcad72e7dbe99c9", - "gsd-core/workflows/reapply-patches.md": "d449a23d3acf6379", - "gsd-core/workflows/remove-phase.md": "e7a6af429b36e77b", - "gsd-core/workflows/remove-workspace.md": "b5e60fbb33b3e33a", - "gsd-core/workflows/resume-project.md": "82cfe1b8cb17c085", - "gsd-core/workflows/review.md": "0873ea94ca23383c", - "gsd-core/workflows/scan.md": "12c11b2edc165df9", - "gsd-core/workflows/secure-phase.md": "7bf923689bf58288", + "gsd-core/workflows/plan-review-convergence.md": "7e01c19b7b9a2aad", + "gsd-core/workflows/plant-seed.md": "9d36ecd08093a494", + "gsd-core/workflows/pr-branch.md": "cc28ab5cd9db16b9", + "gsd-core/workflows/profile-user.md": "fa3b87e1f2d71371", + "gsd-core/workflows/progress.md": "36f1d4621c1798a4", + "gsd-core/workflows/quick.md": "709e40e10d1900b4", + "gsd-core/workflows/reapply-patches.md": "04885b2129cbb457", + "gsd-core/workflows/remove-phase.md": "24559d23e008c9c3", + "gsd-core/workflows/remove-workspace.md": "e958c1e932aef492", + "gsd-core/workflows/resume-project.md": "c5731b8aabed70f9", + "gsd-core/workflows/review.md": "dc8366ef168183db", + "gsd-core/workflows/scan.md": "8aa95448b1ba4a4a", + "gsd-core/workflows/secure-phase.md": "550152cd82c25c00", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "4c030adc097d1746", - "gsd-core/workflows/settings-integrations.md": "b082fc518b484c07", - "gsd-core/workflows/settings.md": "13ca50dba129c17b", - "gsd-core/workflows/ship.md": "c035bb8b3bb7efbb", - "gsd-core/workflows/sketch-wrap-up.md": "10063f56c2c7f141", - "gsd-core/workflows/sketch.md": "25c1f8f7acfb1da9", - "gsd-core/workflows/smart-entry.md": "bd81482cb6a7ac53", - "gsd-core/workflows/spec-phase.md": "c05348d644f9d77a", - "gsd-core/workflows/spike-wrap-up.md": "8029ca4effb5b716", - "gsd-core/workflows/spike.md": "a94af5171bb9d2ce", - "gsd-core/workflows/stats.md": "d58325fc3fb8d1b6", + "gsd-core/workflows/settings-advanced.md": "68269242a4e4c2cc", + "gsd-core/workflows/settings-integrations.md": "ff9af62cdc5c7908", + "gsd-core/workflows/settings.md": "38a801a7b89a9379", + "gsd-core/workflows/ship.md": "ddfd8e847836dd94", + "gsd-core/workflows/sketch-wrap-up.md": "67e90c60062d0d5f", + "gsd-core/workflows/sketch.md": "7418628ba45dd6c0", + "gsd-core/workflows/spec-phase.md": "e8ed811cd67076b7", + "gsd-core/workflows/spike-wrap-up.md": "f8e39782c6e42ef7", + "gsd-core/workflows/spike.md": "aa5934044317ba7a", + "gsd-core/workflows/stats.md": "c49d3de15375d04b", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "d83a0d0bd0f94c4c", - "gsd-core/workflows/transition.md": "1bd8a772f0aac5ba", - "gsd-core/workflows/ui-phase.md": "2fcfffcfb344456d", - "gsd-core/workflows/ui-review.md": "dca8100a43161ea7", - "gsd-core/workflows/ultraplan-phase.md": "53b77a8edf60acd0", + "gsd-core/workflows/thread.md": "3e9fcfbb254a31a7", + "gsd-core/workflows/transition.md": "9a49f9c48805f666", + "gsd-core/workflows/ui-phase.md": "54e01f1973450a3c", + "gsd-core/workflows/ui-review.md": "fea93c281767f8d7", + "gsd-core/workflows/ultraplan-phase.md": "a164cc6aa4fb5bbb", "gsd-core/workflows/undo.md": "18dec684fb1076f9", - "gsd-core/workflows/update.md": "79aaf4b8f1f83045", - "gsd-core/workflows/validate-phase.md": "2db47bf5547d7b9d", - "gsd-core/workflows/verify-phase.md": "ea7f8a705b297e27", - "gsd-core/workflows/verify-work.md": "5ad63a5edfb6acac", + "gsd-core/workflows/update.md": "cbf978622ad0f577", + "gsd-core/workflows/validate-phase.md": "a36cf2c688c261ac", + "gsd-core/workflows/verify-phase.md": "8a89a915dad5960b", + "gsd-core/workflows/verify-work.md": "f4429f002440a5ae", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", From 7d4fc3a519c3a937b34de8db732171976ca4192d Mon Sep 17 00:00:00 2001 From: Joe Slitzker Date: Sun, 5 Jul 2026 18:56:29 -0500 Subject: [PATCH 47/75] test(#1941): regenerate golden fixtures + size baseline after rebase onto next The rebase onto origin/next pulled in the runtime-launcher preamble resync (applied repo-wide on next) alongside this branch's quick.md change; both together shift every runtime's install hashes and workflow sizes, so the fixtures from the pre-rebase regen were stale. --- .../golden-install-parity/antigravity.json | 218 +++++++-------- .../golden-install-parity/augment.json | 227 ++++++++-------- .../golden-install-parity/claude.json | 224 ++++++++-------- .../fixtures/golden-install-parity/cline.json | 220 +++++++-------- .../golden-install-parity/codebuddy.json | 227 ++++++++-------- .../fixtures/golden-install-parity/codex.json | 252 +++++++++--------- .../golden-install-parity/copilot.json | 224 ++++++++-------- .../golden-install-parity/cursor.json | 225 ++++++++-------- .../golden-install-parity/hermes.json | 224 ++++++++-------- .../fixtures/golden-install-parity/kilo.json | 225 ++++++++-------- .../fixtures/golden-install-parity/kimi.json | 220 +++++++-------- .../golden-install-parity/opencode.json | 225 ++++++++-------- .../fixtures/golden-install-parity/qwen.json | 224 ++++++++-------- .../fixtures/golden-install-parity/trae.json | 218 +++++++-------- .../golden-install-parity/windsurf.json | 211 +++++++-------- tests/workflow-size-baseline.json | 155 +++++------ 16 files changed, 1777 insertions(+), 1742 deletions(-) diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 1638baf1f..4557df2e5 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -4,45 +4,45 @@ "agents/gsd-advisor-researcher.md": "45af60c237748ee1", "agents/gsd-ai-researcher.md": "ba8898d9e739a501", "agents/gsd-assumptions-analyzer.md": "00a02fdcbaa8d833", - "agents/gsd-code-fixer.md": "d8b6c16731f3b3d0", + "agents/gsd-code-fixer.md": "6937a1f20beaa1c6", "agents/gsd-code-reviewer.md": "a700d295bbf110a9", "agents/gsd-codebase-mapper.md": "afdae82284cb21b4", - "agents/gsd-debug-session-manager.md": "88a3726efbc28eed", - "agents/gsd-debugger.md": "bbefb65861d9d8ef", + "agents/gsd-debug-session-manager.md": "5ea82765fc041ad7", + "agents/gsd-debugger.md": "7439166a1770521c", "agents/gsd-doc-classifier.md": "6dde566846b268b0", "agents/gsd-doc-synthesizer.md": "6286afdbd9a74fe0", "agents/gsd-doc-verifier.md": "888c6ac870cb91a6", "agents/gsd-doc-writer.md": "d4400c8dab4a9efc", "agents/gsd-domain-researcher.md": "1db46cac3f4d9889", - "agents/gsd-eval-auditor.md": "62560f29308426d9", + "agents/gsd-eval-auditor.md": "1b8391f1aafb067f", "agents/gsd-eval-planner.md": "3d10fd11147f6857", - "agents/gsd-executor.md": "d7dedecb2206d678", + "agents/gsd-executor.md": "152ca51a10b99ff8", "agents/gsd-framework-selector.md": "daa62c79619c76bf", "agents/gsd-integration-checker.md": "0643cd2d779b131c", - "agents/gsd-intel-updater.md": "c2a053ffbe79cc74", - "agents/gsd-mempalace-curator.md": "a7269018acb973ce", + "agents/gsd-intel-updater.md": "26c1f1e028c6346a", + "agents/gsd-mempalace-curator.md": "dafdc4394d514a93", "agents/gsd-nyquist-auditor.md": "805a1404d03629f1", "agents/gsd-pattern-mapper.md": "e62ee90d39084802", - "agents/gsd-phase-researcher.md": "cbb4b284487af598", - "agents/gsd-plan-checker.md": "1db919c3b317c2e3", - "agents/gsd-planner.md": "ee43904ee3d880d7", - "agents/gsd-project-researcher.md": "6caac1da8969c8cd", - "agents/gsd-research-synthesizer.md": "50dc93f1034141ac", + "agents/gsd-phase-researcher.md": "cff1196c8e8bb4fa", + "agents/gsd-plan-checker.md": "dd1e7cdc837d8f3e", + "agents/gsd-planner.md": "b6d821f77fd8d7bd", + "agents/gsd-project-researcher.md": "85de7f562872ee9b", + "agents/gsd-research-synthesizer.md": "18a2e1b30ff7ae3a", "agents/gsd-roadmapper.md": "7a8465ac6d4dd29e", "agents/gsd-security-auditor.md": "2ce13af25179dd10", "agents/gsd-ui-auditor.md": "f777f9c7bf62788c", "agents/gsd-ui-checker.md": "9c113a9c6b63385c", - "agents/gsd-ui-researcher.md": "3c85adc5c3f76f40", + "agents/gsd-ui-researcher.md": "5d74011a96e5b67f", "agents/gsd-user-profiler.md": "25d65f6458454764", - "agents/gsd-verifier.md": "d2bd23b62f95a64f", + "agents/gsd-verifier.md": "224e8df2d8fd1d95", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", + "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "8bc541aabc2e143c", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -106,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "8ce19741d18507f7", + "gsd-core/references/planning-config.md": "49fbbfdac6b8ced4", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -190,119 +190,120 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "a2d025013d8ef7fd", - "gsd-core/workflows/add-phase.md": "b619b3402c1e95db", - "gsd-core/workflows/add-tests.md": "206ccd9c8f25fac9", - "gsd-core/workflows/add-todo.md": "a995f9f4b11fcf23", - "gsd-core/workflows/ai-integration-phase.md": "f2fefee40ec7413c", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "8cc2e884a021b79b", + "gsd-core/workflows/add-phase.md": "f82afa2f93be19fa", + "gsd-core/workflows/add-tests.md": "f695210f67d2635e", + "gsd-core/workflows/add-todo.md": "de1ac76acfcc0133", + "gsd-core/workflows/ai-integration-phase.md": "22f5466085c47c00", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "9787a0ef00be649c", - "gsd-core/workflows/audit-milestone.md": "5e73ad8112a9b9b4", - "gsd-core/workflows/audit-uat.md": "777262a63dcaacdc", - "gsd-core/workflows/autonomous.md": "63c2fff9373e2f2c", - "gsd-core/workflows/check-todos.md": "f6a93906922dd939", - "gsd-core/workflows/cleanup.md": "53aa20672fe253bd", - "gsd-core/workflows/code-review-fix.md": "715d98a6ff5931e2", - "gsd-core/workflows/code-review.md": "d3d22e8705ab8323", - "gsd-core/workflows/complete-milestone.md": "f3fd3c8fc7bd1616", - "gsd-core/workflows/debug.md": "5ec71cc100973523", - "gsd-core/workflows/diagnose-issues.md": "4d80e23ab8adf2d7", + "gsd-core/workflows/audit-fix.md": "44e9b0a78eb79311", + "gsd-core/workflows/audit-milestone.md": "77089ccd7b45c0f0", + "gsd-core/workflows/audit-uat.md": "ea8ddd910ed16ba4", + "gsd-core/workflows/autonomous.md": "603ce2019835f00e", + "gsd-core/workflows/check-todos.md": "5a62092df800ad7c", + "gsd-core/workflows/cleanup.md": "12c8fd85d3010fe6", + "gsd-core/workflows/code-review-fix.md": "5738cb929c995008", + "gsd-core/workflows/code-review.md": "d454365f1704d0bc", + "gsd-core/workflows/complete-milestone.md": "aaf272074acec69d", + "gsd-core/workflows/debug.md": "68f1ddc74886ebe5", + "gsd-core/workflows/diagnose-issues.md": "c8c41993c277363c", "gsd-core/workflows/discovery-phase.md": "3de990caffdde4f8", - "gsd-core/workflows/discuss-phase-assumptions.md": "5758ef496180a20c", + "gsd-core/workflows/discuss-phase-assumptions.md": "42210a0cbe1bac70", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "19659f106fa0f53e", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "47ec4454046099c6", + "gsd-core/workflows/discuss-phase.md": "c0a977154470b7f5", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "ab0c68941386998b", "gsd-core/workflows/discuss-phase/modes/all.md": "e5fe9c9c1e2bec1a", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "5256d93dca08278e", + "gsd-core/workflows/discuss-phase/modes/auto.md": "c412dfbb5d536935", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "3a90a0c95016f7c5", + "gsd-core/workflows/discuss-phase/modes/chain.md": "a6f486a303c9bd53", "gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c", "gsd-core/workflows/discuss-phase/modes/power.md": "96822b22c42d75e8", "gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "ecf6a2ae3c27c2af", - "gsd-core/workflows/docs-update.md": "1c3a0d23ecc9605c", - "gsd-core/workflows/edit-phase.md": "f685fb7063616826", - "gsd-core/workflows/eval-review.md": "2da6215ce79b2f7c", - "gsd-core/workflows/execute-phase.md": "e7713d986ebf45e0", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1da22ba32f524c6e", + "gsd-core/workflows/do.md": "22adc4ed8589a015", + "gsd-core/workflows/docs-update.md": "8e986e26d0e6e1a0", + "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", + "gsd-core/workflows/eval-review.md": "eb4040eaa5b8497f", + "gsd-core/workflows/execute-phase.md": "97453d3b8f49f27f", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "55d0706e80a2554a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bb9113e7bf953797", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "687513ef1010180e", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "7a8c667c3587a985", - "gsd-core/workflows/explore.md": "d9593c9f00250e53", - "gsd-core/workflows/extract-learnings.md": "caa2ff0160b6ed9c", + "gsd-core/workflows/execute-plan.md": "907af77eafc3d97b", + "gsd-core/workflows/explore.md": "934c00f9f216dbdb", + "gsd-core/workflows/extract-learnings.md": "167ea7f0e23bf496", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "3ebc3a7f48132e04", - "gsd-core/workflows/graduation.md": "b401418dfea2b0f5", - "gsd-core/workflows/health.md": "3ab04acb14942ddd", + "gsd-core/workflows/forensics.md": "b64f0309b8c3fde1", + "gsd-core/workflows/graduation.md": "a9d8f15ba81a993f", + "gsd-core/workflows/health.md": "1ac4d567ee95acfb", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "3c3b67b4eb28cd82", - "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", - "gsd-core/workflows/import.md": "3cbe85643922fd3b", + "gsd-core/workflows/help/modes/full.md": "0e253248c1c2e063", + "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/import.md": "41c62ae199209a68", "gsd-core/workflows/inbox.md": "a448220c548f27bc", - "gsd-core/workflows/ingest-docs.md": "783e0380797478cc", - "gsd-core/workflows/insert-phase.md": "d48c4aa1e864c852", + "gsd-core/workflows/ingest-docs.md": "e2707f28f67d128b", + "gsd-core/workflows/insert-phase.md": "cdd83cf77d0f7485", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "084c87cd310119b2", - "gsd-core/workflows/list-workspaces.md": "69aa6dcd8f63bb8a", - "gsd-core/workflows/manager.md": "187e2df237bcf418", - "gsd-core/workflows/map-codebase.md": "ea0ad99dd10c3d1c", - "gsd-core/workflows/milestone-summary.md": "d442c6719944f276", - "gsd-core/workflows/mvp-phase.md": "cd39027462579233", - "gsd-core/workflows/new-milestone.md": "f13199a8e199298f", - "gsd-core/workflows/new-project.md": "b8dc0226e885ea9c", - "gsd-core/workflows/new-workspace.md": "70dec4f25df02d64", - "gsd-core/workflows/next.md": "c45606fc89965aed", + "gsd-core/workflows/list-seeds.md": "3a8b612306ecf9c3", + "gsd-core/workflows/list-workspaces.md": "f6b1bc9fa13cc155", + "gsd-core/workflows/manager.md": "77133c13a8d303d5", + "gsd-core/workflows/map-codebase.md": "c81444eb0b2e038b", + "gsd-core/workflows/milestone-summary.md": "c4620853fe489126", + "gsd-core/workflows/mvp-phase.md": "5f0e355ff4583d67", + "gsd-core/workflows/new-milestone.md": "62aea018fb72b958", + "gsd-core/workflows/new-project.md": "f336b2da5c3963f0", + "gsd-core/workflows/new-workspace.md": "21bfae58b9cc2990", + "gsd-core/workflows/next.md": "8beefb4335dd7c41", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "3ce09c0aa0a20599", - "gsd-core/workflows/pause-work.md": "3196d681d4dd8c71", - "gsd-core/workflows/plan-milestone-gaps.md": "94b193dfc9ca3681", - "gsd-core/workflows/plan-phase.md": "659b52bd338720fe", + "gsd-core/workflows/pause-work.md": "564de32981a24337", + "gsd-core/workflows/plan-milestone-gaps.md": "dd6a4b3a8b05ab6e", + "gsd-core/workflows/plan-phase.md": "cb56e635fef4d3f3", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "473d4d6e5b1f6340", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "ab0b22244c3389aa", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "b1623082557cdca5", - "gsd-core/workflows/plant-seed.md": "1fb45cd49f66f572", - "gsd-core/workflows/pr-branch.md": "c8fd9fa250cb39fd", - "gsd-core/workflows/profile-user.md": "7b894598e26133b2", - "gsd-core/workflows/progress.md": "6087275a7ef3d84f", - "gsd-core/workflows/quick.md": "22855a8335147945", - "gsd-core/workflows/reapply-patches.md": "825e37a55a992892", - "gsd-core/workflows/remove-phase.md": "6b9947fba1a97f46", - "gsd-core/workflows/remove-workspace.md": "95f05defffe6754e", - "gsd-core/workflows/resume-project.md": "cadf390bae95fc76", - "gsd-core/workflows/review.md": "aa08449a6a180944", - "gsd-core/workflows/scan.md": "f2754f3e3ea528ff", - "gsd-core/workflows/secure-phase.md": "78705b7f09612464", + "gsd-core/workflows/plan-review-convergence.md": "d9f71484272b4b70", + "gsd-core/workflows/plant-seed.md": "6cf726be6427a35a", + "gsd-core/workflows/pr-branch.md": "dc5598ae8accdecd", + "gsd-core/workflows/profile-user.md": "355af92ac285567f", + "gsd-core/workflows/progress.md": "79a11ce798082054", + "gsd-core/workflows/quick.md": "35582887917ef938", + "gsd-core/workflows/reapply-patches.md": "4dcd6117d0a507ca", + "gsd-core/workflows/remove-phase.md": "23b9eb0858a2535e", + "gsd-core/workflows/remove-workspace.md": "d0bd7e0601138798", + "gsd-core/workflows/resume-project.md": "98e2cf8908e73a52", + "gsd-core/workflows/review.md": "9bc686206c96748c", + "gsd-core/workflows/scan.md": "a7fecd67e5cd655f", + "gsd-core/workflows/secure-phase.md": "96b199dfac00e60f", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "911234c3234b6929", - "gsd-core/workflows/settings-integrations.md": "83360968c4436bd1", - "gsd-core/workflows/settings.md": "a107a377ddeffed7", - "gsd-core/workflows/ship.md": "438fbd3ec509c1f1", - "gsd-core/workflows/sketch-wrap-up.md": "ab9fbb7371ef36bf", - "gsd-core/workflows/sketch.md": "114ca2455c2eb6fc", - "gsd-core/workflows/spec-phase.md": "5d6f0c480c0b251d", - "gsd-core/workflows/spike-wrap-up.md": "e2f251b7c8bfa2b2", - "gsd-core/workflows/spike.md": "0f9a81bcf4573195", - "gsd-core/workflows/stats.md": "a20eb078d2ab11be", + "gsd-core/workflows/settings-advanced.md": "f2f8c750101cb9ee", + "gsd-core/workflows/settings-integrations.md": "4d3001ad2b5dad8f", + "gsd-core/workflows/settings.md": "4017f3f235051902", + "gsd-core/workflows/ship.md": "984bd7660e7791fd", + "gsd-core/workflows/sketch-wrap-up.md": "0f842a609851a401", + "gsd-core/workflows/sketch.md": "314b7d323c6b57eb", + "gsd-core/workflows/smart-entry.md": "3ce5b6228238fdb6", + "gsd-core/workflows/spec-phase.md": "11c9e6b01bd2880a", + "gsd-core/workflows/spike-wrap-up.md": "8db41edc87cb7886", + "gsd-core/workflows/spike.md": "dd8d139947a8fb31", + "gsd-core/workflows/stats.md": "b64bda5c0a1a06fb", "gsd-core/workflows/sync-skills.md": "8326a7ff0411b077", - "gsd-core/workflows/thread.md": "3fb6b552e45fedbd", - "gsd-core/workflows/transition.md": "a7a5fe4040084308", - "gsd-core/workflows/ui-phase.md": "652785fbba26e80c", - "gsd-core/workflows/ui-review.md": "816b2bde136157f9", - "gsd-core/workflows/ultraplan-phase.md": "2404a01cb2e0c450", + "gsd-core/workflows/thread.md": "31201839d0530e89", + "gsd-core/workflows/transition.md": "3eb5edaa5c95c0de", + "gsd-core/workflows/ui-phase.md": "44f44a8aa7df3cfb", + "gsd-core/workflows/ui-review.md": "ba558aaf1ad9f58d", + "gsd-core/workflows/ultraplan-phase.md": "d8e92b0b7214eba6", "gsd-core/workflows/undo.md": "6ab639d1fc7e0721", - "gsd-core/workflows/update.md": "dc93f366e2156e37", - "gsd-core/workflows/validate-phase.md": "5bac28c71d21c740", - "gsd-core/workflows/verify-phase.md": "e7059c04c816e62d", - "gsd-core/workflows/verify-work.md": "d1f5cfc8e22b7ce7", + "gsd-core/workflows/update.md": "2c58df5e21c41c31", + "gsd-core/workflows/validate-phase.md": "6c0ab739d15709fa", + "gsd-core/workflows/verify-phase.md": "8070a098ab538b33", + "gsd-core/workflows/verify-work.md": "be699ed7920f61b0", "hooks/gsd-check-update-worker.js": "fa301e6366270d5f", "hooks/gsd-check-update.js": "4617a98bf529e4c3", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -366,18 +367,19 @@ "skills/gsd-ingest-docs/SKILL.md": "f4e43968af317ed8", "skills/gsd-manager/SKILL.md": "6e51785860784d8c", "skills/gsd-map-codebase/SKILL.md": "e10431a9386c6aec", - "skills/gsd-mempalace-capture/SKILL.md": "5647f915e5c85482", - "skills/gsd-mempalace-recall/SKILL.md": "d41523e659d1920f", + "skills/gsd-mempalace-capture/SKILL.md": "588ddf4fbf3ebe65", + "skills/gsd-mempalace-recall/SKILL.md": "2d95e385fee26dee", "skills/gsd-milestone-summary/SKILL.md": "2955ab3e3a444ca3", "skills/gsd-mvp-phase/SKILL.md": "1cf7622d655840ac", "skills/gsd-new-milestone/SKILL.md": "f97a28dd1e2b9317", "skills/gsd-new-project/SKILL.md": "31b46764278d1c1a", + "skills/gsd-next/SKILL.md": "e7e03391c0e3a235", "skills/gsd-ns-context/SKILL.md": "e791bc60e4cf124e", "skills/gsd-ns-ideate/SKILL.md": "b85f270e8415f595", "skills/gsd-ns-manage/SKILL.md": "d55c53b5b0513033", "skills/gsd-ns-project/SKILL.md": "64844073a6115c45", "skills/gsd-ns-review/SKILL.md": "2e30158e112d173c", - "skills/gsd-ns-workflow/SKILL.md": "79373d30cd17ed49", + "skills/gsd-ns-workflow/SKILL.md": "529e21833a6a8831", "skills/gsd-pause-work/SKILL.md": "9d3cc6bd70b03df1", "skills/gsd-phase/SKILL.md": "00676bbea61410bf", "skills/gsd-plan-phase/SKILL.md": "168046ccf9702532", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index c3a135d9a..d4e75d87f 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "f3baf9025a5bc4b1", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "2a98aadb20311108", + "agents/gsd-code-fixer.md": "68b2d2faccfdd8a3", "agents/gsd-code-reviewer.md": "bc8a6f2e1f787ff5", "agents/gsd-codebase-mapper.md": "85ea778ad9cf7e66", - "agents/gsd-debug-session-manager.md": "69fe2698d5a997c6", - "agents/gsd-debugger.md": "97c64f1db2fe85a3", + "agents/gsd-debug-session-manager.md": "0d388fcee3eba770", + "agents/gsd-debugger.md": "2c8234c76c5d15c1", "agents/gsd-doc-classifier.md": "f61cb0fad0d4f243", "agents/gsd-doc-synthesizer.md": "043847ebefbb9b7c", "agents/gsd-doc-verifier.md": "b3433e0db51e1c60", "agents/gsd-doc-writer.md": "376011bd99026bf7", "agents/gsd-domain-researcher.md": "671c9ea949889c4a", - "agents/gsd-eval-auditor.md": "cd2a5727472ad0ab", + "agents/gsd-eval-auditor.md": "fcaec7b00f94c435", "agents/gsd-eval-planner.md": "a4a5b4b3f7828ba3", - "agents/gsd-executor.md": "87c499f939e30049", + "agents/gsd-executor.md": "46f911cd211034b0", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "fa53e2d78be1de74", - "agents/gsd-intel-updater.md": "f8ac501c61557a17", - "agents/gsd-mempalace-curator.md": "63676937f8970bf3", + "agents/gsd-intel-updater.md": "fa40e685d7441ace", + "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", "agents/gsd-nyquist-auditor.md": "230e6667411ccf2f", "agents/gsd-pattern-mapper.md": "43c6021cf7caabfa", - "agents/gsd-phase-researcher.md": "e74332bb76436bc9", - "agents/gsd-plan-checker.md": "58cce5e740351df3", - "agents/gsd-planner.md": "826ead38c4c06b79", - "agents/gsd-project-researcher.md": "327c1d656be67b01", - "agents/gsd-research-synthesizer.md": "c457ba87f906d6d9", + "agents/gsd-phase-researcher.md": "f1f6fd6a3e67c7a8", + "agents/gsd-plan-checker.md": "bf1a4e636f2390de", + "agents/gsd-planner.md": "6e8c76da9804ac42", + "agents/gsd-project-researcher.md": "4531b7cc8f5e5f7d", + "agents/gsd-research-synthesizer.md": "4a4f68e6c75b133a", "agents/gsd-roadmapper.md": "bb2f57695dbab32c", "agents/gsd-security-auditor.md": "f22374cc1db28dca", "agents/gsd-ui-auditor.md": "dcd5712e6b160a53", "agents/gsd-ui-checker.md": "8a20715a400435f9", - "agents/gsd-ui-researcher.md": "e64ad536d309cecf", + "agents/gsd-ui-researcher.md": "184d1c3edca694df", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "40f4b7fbc3564419", + "agents/gsd-verifier.md": "f5c00a9b08fc1a7e", "commands/gsd-add-tests.md": "3608d0cf4b515103", "commands/gsd-ai-integration-phase.md": "70843d4904743f7e", "commands/gsd-audit-fix.md": "1b805946362c4f19", @@ -63,18 +63,19 @@ "commands/gsd-ingest-docs.md": "6718b04c597a5428", "commands/gsd-manager.md": "8f4ae79774902293", "commands/gsd-map-codebase.md": "f3a06c4c7503f243", - "commands/gsd-mempalace-capture.md": "016a90f0eb7493ac", - "commands/gsd-mempalace-recall.md": "babb21998c7e6a6f", + "commands/gsd-mempalace-capture.md": "2e610f3ebe2eb5b4", + "commands/gsd-mempalace-recall.md": "38716c0983a3ef9c", "commands/gsd-milestone-summary.md": "ff5e11e6b33d4b5e", "commands/gsd-mvp-phase.md": "ffc5905aed8f450a", "commands/gsd-new-milestone.md": "e9ddaec1dd29d023", "commands/gsd-new-project.md": "56552a324cff669e", + "commands/gsd-next.md": "d9f43d56e1bca2ca", "commands/gsd-ns-context.md": "011c44e7aa46e64a", "commands/gsd-ns-ideate.md": "edc5e543512dd48a", "commands/gsd-ns-manage.md": "0409d810e499357f", "commands/gsd-ns-project.md": "8dfd1b9a2ffe86ac", "commands/gsd-ns-review.md": "3766ed10827882a0", - "commands/gsd-ns-workflow.md": "87910975ac92d103", + "commands/gsd-ns-workflow.md": "c3b3c046a74ec0ee", "commands/gsd-pause-work.md": "4fb032f72238fe33", "commands/gsd-phase.md": "4920d15d779329eb", "commands/gsd-plan-phase.md": "e74f3cb7a10cbb83", @@ -106,12 +107,12 @@ "commands/gsd-workstreams.md": "52ab9c585d3a00f3", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -152,7 +153,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", + "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -175,7 +176,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "1c3a3aae2ae89e83", + "gsd-core/references/planning-config.md": "7fe958e09e74b6c8", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -259,119 +260,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "1153d35058e3e24f", - "gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba", - "gsd-core/workflows/add-tests.md": "2871f7e6409ba89e", - "gsd-core/workflows/add-todo.md": "3b913840c1f490b2", - "gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "1bc7377b105194fc", + "gsd-core/workflows/add-phase.md": "46e0551ffdd8ce1a", + "gsd-core/workflows/add-tests.md": "2c1da65d41dc12d2", + "gsd-core/workflows/add-todo.md": "cc0efe270004c8fb", + "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9", - "gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793", - "gsd-core/workflows/autonomous.md": "1184e5864e201889", - "gsd-core/workflows/check-todos.md": "1e3026abe782bd36", - "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", - "gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93", - "gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e", - "gsd-core/workflows/complete-milestone.md": "337d177126f1bd67", - "gsd-core/workflows/debug.md": "da62e7a62c113b29", - "gsd-core/workflows/diagnose-issues.md": "a5f15332b3833a80", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", + "gsd-core/workflows/autonomous.md": "7e5683728ef33707", + "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", + "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", + "gsd-core/workflows/code-review-fix.md": "c323f7098b671bd6", + "gsd-core/workflows/code-review.md": "ad450c6ef8459dad", + "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", + "gsd-core/workflows/debug.md": "849d7e5b9c12dcae", + "gsd-core/workflows/diagnose-issues.md": "6cc3900891dfb927", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad", + "gsd-core/workflows/discuss-phase-assumptions.md": "1e229f6d21831d60", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "b2538b3f8a15f7de", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", + "gsd-core/workflows/discuss-phase.md": "5c5e8d8c2c9d95aa", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", + "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d", + "gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "152e9c5c512f79cb", - "gsd-core/workflows/docs-update.md": "806ada831b961116", - "gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5", - "gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae", - "gsd-core/workflows/execute-phase.md": "5daeb8fac7cab295", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643", + "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", + "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", + "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", + "gsd-core/workflows/execute-phase.md": "346e443b260e4f38", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "502a2498f6b27e38", - "gsd-core/workflows/explore.md": "11523b829cc67c29", - "gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb", + "gsd-core/workflows/execute-plan.md": "2c412310dce31a0b", + "gsd-core/workflows/explore.md": "6c04f2e658d93261", + "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "b4bde768fd27a982", - "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", - "gsd-core/workflows/health.md": "e3cb8ff4e01e9e53", + "gsd-core/workflows/forensics.md": "0d500a3f5ab26913", + "gsd-core/workflows/graduation.md": "47f1594c88c08501", + "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "5d60d11d63089892", - "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", - "gsd-core/workflows/import.md": "97861d522319d56e", + "gsd-core/workflows/help/modes/full.md": "3ac1c1bb851da7a5", + "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3", - "gsd-core/workflows/insert-phase.md": "621f9e75725542b1", + "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", + "gsd-core/workflows/insert-phase.md": "08dca838d831bb5b", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "0a466d04df300854", - "gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b", - "gsd-core/workflows/manager.md": "a31f7e255dd7d01d", - "gsd-core/workflows/map-codebase.md": "582bddef590de9c6", - "gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a", - "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", - "gsd-core/workflows/new-milestone.md": "23d2135a555e95df", - "gsd-core/workflows/new-project.md": "e6855b300fcac71e", - "gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1", - "gsd-core/workflows/next.md": "48bd4b5d54f0d1f8", + "gsd-core/workflows/list-seeds.md": "b687f2a843032d65", + "gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453", + "gsd-core/workflows/manager.md": "3ba7a3e8213c4b23", + "gsd-core/workflows/map-codebase.md": "83d750aade709983", + "gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043", + "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", + "gsd-core/workflows/new-milestone.md": "a616efb0f82d1a11", + "gsd-core/workflows/new-project.md": "5ffeef49fe73013e", + "gsd-core/workflows/new-workspace.md": "017688423110ed66", + "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b", - "gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25", - "gsd-core/workflows/plan-phase.md": "dc0beefd1316a860", + "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", + "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", + "gsd-core/workflows/plan-phase.md": "8b1209958c31ca2f", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5", - "gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd", - "gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06", - "gsd-core/workflows/pr-branch.md": "f2a35833fe784a53", - "gsd-core/workflows/profile-user.md": "02bc967c299a0136", - "gsd-core/workflows/progress.md": "057699b34b6198f7", - "gsd-core/workflows/quick.md": "bf8e448df540768f", - "gsd-core/workflows/reapply-patches.md": "7915e40411490bbe", - "gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9", - "gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc", - "gsd-core/workflows/resume-project.md": "b18b51fd15cbce95", - "gsd-core/workflows/review.md": "fbfa6eebcad41aa0", - "gsd-core/workflows/scan.md": "54ff1ff60041d065", - "gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2", + "gsd-core/workflows/plan-review-convergence.md": "c635ecb8590a724e", + "gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede", + "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", + "gsd-core/workflows/profile-user.md": "14263db831230142", + "gsd-core/workflows/progress.md": "893aa3c36983f74b", + "gsd-core/workflows/quick.md": "5790ceb09aa685be", + "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", + "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", + "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", + "gsd-core/workflows/resume-project.md": "f28da1200e4545f4", + "gsd-core/workflows/review.md": "f3c2e894941c9943", + "gsd-core/workflows/scan.md": "003883d71c37da7d", + "gsd-core/workflows/secure-phase.md": "29fc6b62c5c5dc62", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "895e94e9193c2de2", - "gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed", - "gsd-core/workflows/settings.md": "48d337eb7e3f141b", - "gsd-core/workflows/ship.md": "d26fb5d3e965642a", - "gsd-core/workflows/sketch-wrap-up.md": "c03f64e834b69540", - "gsd-core/workflows/sketch.md": "04e0758c1a58881e", - "gsd-core/workflows/spec-phase.md": "2aa0353147153776", - "gsd-core/workflows/spike-wrap-up.md": "c86e04a0feb220a5", - "gsd-core/workflows/spike.md": "53127654e77256bf", - "gsd-core/workflows/stats.md": "01c24349370a0e6d", + "gsd-core/workflows/settings-advanced.md": "b57c947edee905bc", + "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", + "gsd-core/workflows/settings.md": "b2d39d972650f5f3", + "gsd-core/workflows/ship.md": "7b8fe9f89143e648", + "gsd-core/workflows/sketch-wrap-up.md": "5f5ebb6a80d610c6", + "gsd-core/workflows/sketch.md": "8319cedf3f93fc35", + "gsd-core/workflows/smart-entry.md": "449238eb94abe187", + "gsd-core/workflows/spec-phase.md": "8c480bd91f3cef6f", + "gsd-core/workflows/spike-wrap-up.md": "8467dadf2af758e6", + "gsd-core/workflows/spike.md": "7727c07bb221c8cc", + "gsd-core/workflows/stats.md": "76a42cbeaf6007c2", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "6d075b5d26500e9d", - "gsd-core/workflows/transition.md": "eee3435817fab185", - "gsd-core/workflows/ui-phase.md": "e81783508b8b6819", - "gsd-core/workflows/ui-review.md": "1ad3654435000881", - "gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262", + "gsd-core/workflows/thread.md": "927e7eeefd2fcf5c", + "gsd-core/workflows/transition.md": "cb8ec5affb7ebba1", + "gsd-core/workflows/ui-phase.md": "db908f3bad5bc9f0", + "gsd-core/workflows/ui-review.md": "7acfc485526d064b", + "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "231e7c305b40c417", - "gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb", - "gsd-core/workflows/verify-phase.md": "7579af6cd757f644", - "gsd-core/workflows/verify-work.md": "d77ace0fc4f33ff7", + "gsd-core/workflows/update.md": "fd160e13f8b7e83c", + "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/verify-phase.md": "98a995046bdb6c3c", + "gsd-core/workflows/verify-work.md": "34e980a6950cd83c", "hooks/gsd-check-update-worker.js": "cc1ef5f840f9dfc9", "hooks/gsd-check-update.js": "7b3a7983d5f1f5d3", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -412,8 +414,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "48846bf26ccaf0e7", "skills/gsd-ns-context/skills/graphify/SKILL.md": "3d6341614add6ccd", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "51d6b970dca3c28e", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "c585b152e9d9d6d3", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "1a3267902234c607", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "a7261b5ead71cc58", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "646e59e76acd548f", "skills/gsd-ns-ideate/SKILL.md": "d70360a5f7e8ac90", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "74651f6959cfbbd3", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "bb8413dc283a5bb1", @@ -461,7 +463,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "d0e75ee06eaa0165", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "bdab072171d79877", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "8972b413eb712cae", - "skills/gsd-ns-workflow/SKILL.md": "e0711a5522acc3ca", + "skills/gsd-ns-workflow/SKILL.md": "9c03c167c9af062a", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "851084b695ab8328", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "34fa7aff585eb78f", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "1565a532889d3ea3", @@ -469,6 +471,7 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "67c9a6189f045de0", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "34b741cc323f5f15", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f259f089a8d07a54", + "skills/gsd-ns-workflow/skills/next/SKILL.md": "e7409245f1a0f9de", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "fe5b26417ee466be", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "8cf23ecd6ac98069", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "93f68cc6a36de7f2", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 9d060913b..2e64fe353 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -1,47 +1,47 @@ { ".gsd-profile": "0e716a5fef4e6dc1", - "agents/gsd-advisor-researcher.md": "7cdfe98e2baf606e", - "agents/gsd-ai-researcher.md": "fa68db1fb2c6ee8a", + "agents/gsd-advisor-researcher.md": "6f1f17e206e2c0c4", + "agents/gsd-ai-researcher.md": "e2236ee7b717c925", "agents/gsd-assumptions-analyzer.md": "f94fdd67f70b4a5d", - "agents/gsd-code-fixer.md": "78f5897024da1fcc", + "agents/gsd-code-fixer.md": "3d5f67cfd24ac452", "agents/gsd-code-reviewer.md": "d626a828e8de3648", "agents/gsd-codebase-mapper.md": "8c2e9f2ce3aedf78", - "agents/gsd-debug-session-manager.md": "808092282a01943f", - "agents/gsd-debugger.md": "77b44e85f02fbec7", + "agents/gsd-debug-session-manager.md": "767c0f43d47e89ad", + "agents/gsd-debugger.md": "4d8a618121c8056a", "agents/gsd-doc-classifier.md": "4740eb4c4f6ac294", "agents/gsd-doc-synthesizer.md": "135bbdfb9053cbd8", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", "agents/gsd-doc-writer.md": "8cb62907c6458111", - "agents/gsd-domain-researcher.md": "f8be56555689a970", - "agents/gsd-eval-auditor.md": "88be0494a906eda5", + "agents/gsd-domain-researcher.md": "5f7d366251b957fe", + "agents/gsd-eval-auditor.md": "fea2759beff0a642", "agents/gsd-eval-planner.md": "112f6730f23854e3", - "agents/gsd-executor.md": "50b737a811d0a334", + "agents/gsd-executor.md": "22fc2f17098a4d14", "agents/gsd-framework-selector.md": "c350ee693cb1aa4e", "agents/gsd-integration-checker.md": "c8b4e65dee89c8ea", - "agents/gsd-intel-updater.md": "9fadfebd08f15244", - "agents/gsd-mempalace-curator.md": "61c387c3fd9bae78", + "agents/gsd-intel-updater.md": "5b41e05f90ce89d9", + "agents/gsd-mempalace-curator.md": "77b53f1b155242b4", "agents/gsd-nyquist-auditor.md": "0bc0cdad7b3a0013", "agents/gsd-pattern-mapper.md": "b45b5e106775bec1", - "agents/gsd-phase-researcher.md": "5199acbf1770da2e", - "agents/gsd-plan-checker.md": "a5b4e7222feef68f", - "agents/gsd-planner.md": "7c2ae8b93b81cea4", - "agents/gsd-project-researcher.md": "3e94e963ccd268ae", - "agents/gsd-research-synthesizer.md": "f18c06f041f7a775", + "agents/gsd-phase-researcher.md": "85217c69c1ed2ac6", + "agents/gsd-plan-checker.md": "c70134c61b969589", + "agents/gsd-planner.md": "aa68af11f852ecfd", + "agents/gsd-project-researcher.md": "f468e96f8339d1e0", + "agents/gsd-research-synthesizer.md": "7be02e47f4fd901b", "agents/gsd-roadmapper.md": "8a7f1f1256a6aed5", "agents/gsd-security-auditor.md": "4f9fc3f654af4944", "agents/gsd-ui-auditor.md": "40c0dcc15bcfb9fb", "agents/gsd-ui-checker.md": "6e94b43fd459e10e", - "agents/gsd-ui-researcher.md": "02c2d7582e8bbc44", + "agents/gsd-ui-researcher.md": "5e561130434efdb2", "agents/gsd-user-profiler.md": "003276f85792cfda", - "agents/gsd-verifier.md": "d62ffb1f520520c0", + "agents/gsd-verifier.md": "2271174b5aa20e31", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -105,7 +105,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "4435dfdc3381233f", + "gsd-core/references/planning-config.md": "35aa39fef2641311", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -189,119 +189,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "5095b6e69b4e380a", - "gsd-core/workflows/add-phase.md": "27164a671e14a789", - "gsd-core/workflows/add-tests.md": "930998905facefc3", - "gsd-core/workflows/add-todo.md": "73934334ebbf5530", - "gsd-core/workflows/ai-integration-phase.md": "17017ec424e87b8d", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "485c4b6673ddf832", + "gsd-core/workflows/add-phase.md": "0d90083e9c17bec1", + "gsd-core/workflows/add-tests.md": "330b3e7d969fc2d1", + "gsd-core/workflows/add-todo.md": "8488f10f56ac24ca", + "gsd-core/workflows/ai-integration-phase.md": "a898d99b8d844215", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04", - "gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12", - "gsd-core/workflows/autonomous.md": "69f12f004f1233a4", - "gsd-core/workflows/check-todos.md": "fa637b6cc9be647c", - "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", - "gsd-core/workflows/code-review-fix.md": "a416c764425cbb61", - "gsd-core/workflows/code-review.md": "3999e5bc9ce9171e", - "gsd-core/workflows/complete-milestone.md": "49a005d4a9521477", - "gsd-core/workflows/debug.md": "d5856f61f3a1ff84", - "gsd-core/workflows/diagnose-issues.md": "363684618298aecd", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", + "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", + "gsd-core/workflows/autonomous.md": "722397c04272dfaa", + "gsd-core/workflows/check-todos.md": "6c2a43d1d3e86589", + "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", + "gsd-core/workflows/code-review-fix.md": "adb62c695b39ef61", + "gsd-core/workflows/code-review.md": "6c40b95e799907d0", + "gsd-core/workflows/complete-milestone.md": "dcf1182398efb1ca", + "gsd-core/workflows/debug.md": "a9397fd35cca2240", + "gsd-core/workflows/diagnose-issues.md": "75ffc381ac3059ff", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", - "gsd-core/workflows/discuss-phase-assumptions.md": "af66efe23bd54b1d", + "gsd-core/workflows/discuss-phase-assumptions.md": "46876f83547db40a", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "6cbb63a540616e9d", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", + "gsd-core/workflows/discuss-phase.md": "df56c8cd170b2150", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", + "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "b16547a6b0423579", + "gsd-core/workflows/discuss-phase/modes/chain.md": "ecdb88a9aa70d5bf", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "b62c9085d4dc2963", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "032ea8e1d5a13d3b", - "gsd-core/workflows/docs-update.md": "98c30bec9350542f", - "gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c", - "gsd-core/workflows/eval-review.md": "f47fd1a7a1ca3308", - "gsd-core/workflows/execute-phase.md": "fe39dd64ff9db8f6", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772", + "gsd-core/workflows/do.md": "56215b98e26448bc", + "gsd-core/workflows/docs-update.md": "63082608d3ae92be", + "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", + "gsd-core/workflows/eval-review.md": "f59e8329dae1e528", + "gsd-core/workflows/execute-phase.md": "4aa452149551956b", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "8d77786e0842fefe", - "gsd-core/workflows/explore.md": "aee57d95497ca50a", - "gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3", + "gsd-core/workflows/execute-plan.md": "cce1a33fe9a0a32d", + "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", + "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "ec9dc257272a6980", - "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", - "gsd-core/workflows/health.md": "9fd7fe8c7c99b0db", + "gsd-core/workflows/forensics.md": "c01da0178fb97b21", + "gsd-core/workflows/graduation.md": "47f1594c88c08501", + "gsd-core/workflows/health.md": "f934b1f1e9f3ae72", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "a731f1b3a744be08", - "gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd", - "gsd-core/workflows/import.md": "b40557b17ca31024", + "gsd-core/workflows/help/modes/full.md": "93cbdf7e542115a1", + "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", + "gsd-core/workflows/import.md": "6e8acff8c3918795", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", - "gsd-core/workflows/ingest-docs.md": "a0a58450d457ae35", - "gsd-core/workflows/insert-phase.md": "0ab06e370253622b", + "gsd-core/workflows/ingest-docs.md": "25832c784e8812e6", + "gsd-core/workflows/insert-phase.md": "964ca91863a8749a", "gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c", - "gsd-core/workflows/list-seeds.md": "da9511b569ada7f9", - "gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169", - "gsd-core/workflows/manager.md": "c0b571445b452f2b", - "gsd-core/workflows/map-codebase.md": "27c356aa00fb022a", - "gsd-core/workflows/milestone-summary.md": "e7692ea6a9ca3653", - "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", - "gsd-core/workflows/new-milestone.md": "7c957068b523ff47", - "gsd-core/workflows/new-project.md": "4184d47a8797dd4e", - "gsd-core/workflows/new-workspace.md": "668cd5038c76c771", - "gsd-core/workflows/next.md": "ef1b4c60ea3ddbc9", + "gsd-core/workflows/list-seeds.md": "5a46337f55ae8453", + "gsd-core/workflows/list-workspaces.md": "418570fbc8b938da", + "gsd-core/workflows/manager.md": "e39dd3c23a782eb5", + "gsd-core/workflows/map-codebase.md": "a45a9aa5c10aeeed", + "gsd-core/workflows/milestone-summary.md": "ad8e69fcb3463ce4", + "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", + "gsd-core/workflows/new-milestone.md": "d93e3fd29f4f77d4", + "gsd-core/workflows/new-project.md": "0ea70b800c86fde1", + "gsd-core/workflows/new-workspace.md": "04356c9b675da7c9", + "gsd-core/workflows/next.md": "ef30b829a6d5c5f6", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", - "gsd-core/workflows/pause-work.md": "0be71264eafd16dc", - "gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719", - "gsd-core/workflows/plan-phase.md": "f0401a3221b74b58", + "gsd-core/workflows/pause-work.md": "5716362557f44ce4", + "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", + "gsd-core/workflows/plan-phase.md": "6978a15b5232b310", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "414df04b7ddff73c", - "gsd-core/workflows/plant-seed.md": "936a848f1d6c409e", - "gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5", - "gsd-core/workflows/profile-user.md": "4e17ead7b8335ad2", - "gsd-core/workflows/progress.md": "ff1627b59dcce0f9", - "gsd-core/workflows/quick.md": "c4b1d7a0cede6ee7", - "gsd-core/workflows/reapply-patches.md": "2d7dada9edec108b", - "gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09", - "gsd-core/workflows/remove-workspace.md": "0e73844f0f41cbc3", - "gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35", - "gsd-core/workflows/review.md": "a1d3ebce6222ff72", - "gsd-core/workflows/scan.md": "8e1bbf2eed1752ca", - "gsd-core/workflows/secure-phase.md": "b2b9100ff79d6017", + "gsd-core/workflows/plan-review-convergence.md": "e2e8a0fc1fd49101", + "gsd-core/workflows/plant-seed.md": "af50e9f10d3cc6e1", + "gsd-core/workflows/pr-branch.md": "ab157cd8e49621dd", + "gsd-core/workflows/profile-user.md": "ff3820a27731ceb8", + "gsd-core/workflows/progress.md": "bd1ecf9207331bda", + "gsd-core/workflows/quick.md": "da83b1a15b7f1bf7", + "gsd-core/workflows/reapply-patches.md": "ba9406b60f2c4041", + "gsd-core/workflows/remove-phase.md": "ada8a0546c686483", + "gsd-core/workflows/remove-workspace.md": "f3ab3a88a7e9e1ed", + "gsd-core/workflows/resume-project.md": "7f8dc986f0f35d96", + "gsd-core/workflows/review.md": "5cd71e81c4ace401", + "gsd-core/workflows/scan.md": "47371c2073d6c0be", + "gsd-core/workflows/secure-phase.md": "59d3c50aba8c9a6c", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "e0e8c31a4959e872", - "gsd-core/workflows/settings-integrations.md": "b503bf4784877aa9", - "gsd-core/workflows/settings.md": "3cbb449c1e02fe29", - "gsd-core/workflows/ship.md": "f8eece9ef821fc7c", - "gsd-core/workflows/sketch-wrap-up.md": "fcef0ef795f8bfc5", - "gsd-core/workflows/sketch.md": "dc9645b2ee28559d", - "gsd-core/workflows/spec-phase.md": "bab99d00772a5cd0", - "gsd-core/workflows/spike-wrap-up.md": "89a8d7fbc74ce8f2", - "gsd-core/workflows/spike.md": "aae8bcad15642645", - "gsd-core/workflows/stats.md": "17b4f2059f4b4ef2", + "gsd-core/workflows/settings-advanced.md": "02f7ef84f976bda4", + "gsd-core/workflows/settings-integrations.md": "53649313d20694ae", + "gsd-core/workflows/settings.md": "3d994d669d3fb321", + "gsd-core/workflows/ship.md": "12e8e58c077a891a", + "gsd-core/workflows/sketch-wrap-up.md": "121ed4b8127abf04", + "gsd-core/workflows/sketch.md": "737c0492686fea2d", + "gsd-core/workflows/smart-entry.md": "ad20cf74ae2e8291", + "gsd-core/workflows/spec-phase.md": "82150c52a9077602", + "gsd-core/workflows/spike-wrap-up.md": "e2704024992b3fee", + "gsd-core/workflows/spike.md": "6dce83a2c5e7e49c", + "gsd-core/workflows/stats.md": "e7852c5d8f2b05a9", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "5ad0e0d5ce7e0d11", - "gsd-core/workflows/transition.md": "96ce39403ca69594", - "gsd-core/workflows/ui-phase.md": "790e5982e5b715c3", - "gsd-core/workflows/ui-review.md": "51945fda8e931f99", - "gsd-core/workflows/ultraplan-phase.md": "92dbc48e9a7162aa", + "gsd-core/workflows/thread.md": "3b2c560d7189576d", + "gsd-core/workflows/transition.md": "f6731bbb766929e7", + "gsd-core/workflows/ui-phase.md": "deaf9eff81cb6733", + "gsd-core/workflows/ui-review.md": "7b488a7486a6b7cf", + "gsd-core/workflows/ultraplan-phase.md": "328664400a001fd5", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", - "gsd-core/workflows/update.md": "0b389258dcc09332", - "gsd-core/workflows/validate-phase.md": "2aa540f2c2479501", - "gsd-core/workflows/verify-phase.md": "15a999f82868ad29", - "gsd-core/workflows/verify-work.md": "ea61f9e88a44b68b", + "gsd-core/workflows/update.md": "f9e7d8a760d0d3c8", + "gsd-core/workflows/validate-phase.md": "2ac231dc541441c2", + "gsd-core/workflows/verify-phase.md": "0d4ffabc1caa473a", + "gsd-core/workflows/verify-work.md": "efe57bdbbb3af03f", "hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3", "hooks/gsd-check-update.js": "25cde66a12d6b886", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -365,18 +366,19 @@ "skills/gsd-ingest-docs/SKILL.md": "eb85e654917a503a", "skills/gsd-manager/SKILL.md": "1370d93741e47828", "skills/gsd-map-codebase/SKILL.md": "5009595dbde69739", - "skills/gsd-mempalace-capture/SKILL.md": "e9b66db79fce0a2f", - "skills/gsd-mempalace-recall/SKILL.md": "9bfa9e76c7a10e26", + "skills/gsd-mempalace-capture/SKILL.md": "40a31ad049374297", + "skills/gsd-mempalace-recall/SKILL.md": "c3f412d5a64f3921", "skills/gsd-milestone-summary/SKILL.md": "33d51a325d314f3a", "skills/gsd-mvp-phase/SKILL.md": "f9a1348c6c297579", "skills/gsd-new-milestone/SKILL.md": "ac99ffb8a966fe9d", "skills/gsd-new-project/SKILL.md": "e4d930027074d3b6", + "skills/gsd-next/SKILL.md": "13e394affe675498", "skills/gsd-ns-context/SKILL.md": "3102e7ad9b60f182", "skills/gsd-ns-ideate/SKILL.md": "c2c129408a046d22", "skills/gsd-ns-manage/SKILL.md": "8d786e01fa28a7bb", "skills/gsd-ns-project/SKILL.md": "cc0c4bd9feeab147", "skills/gsd-ns-review/SKILL.md": "4111ea56e820479f", - "skills/gsd-ns-workflow/SKILL.md": "13c0d84b25545331", + "skills/gsd-ns-workflow/SKILL.md": "4282c40a5e6e8bbe", "skills/gsd-pause-work/SKILL.md": "35e8a148e44f5361", "skills/gsd-phase/SKILL.md": "00be96e7ae36c6f0", "skills/gsd-plan-phase/SKILL.md": "0c9e87da048acfb7", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index 097cce61f..b01b602a6 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -7,45 +7,45 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "49ebcbe6985b86c9", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "353b89de3bbb4737", + "agents/gsd-code-fixer.md": "6aa74a2fb2ad244a", "agents/gsd-code-reviewer.md": "e5ec12d4d409e800", "agents/gsd-codebase-mapper.md": "e5b7941bdda53c91", - "agents/gsd-debug-session-manager.md": "fc39ba45364ee4fd", - "agents/gsd-debugger.md": "dc92b6a909139c62", + "agents/gsd-debug-session-manager.md": "a9d4e43e4d2e327a", + "agents/gsd-debugger.md": "b1f3af91f0e651c8", "agents/gsd-doc-classifier.md": "f7c361b91cc71a15", "agents/gsd-doc-synthesizer.md": "f4e6ca19363e4b0f", "agents/gsd-doc-verifier.md": "b60290c9d9f6d8d2", "agents/gsd-doc-writer.md": "27655a8cfdeb97ee", "agents/gsd-domain-researcher.md": "0fecdaea86466a56", - "agents/gsd-eval-auditor.md": "90b5d1909977df61", + "agents/gsd-eval-auditor.md": "36c44303085df2f8", "agents/gsd-eval-planner.md": "3ddea88a69b4da3f", - "agents/gsd-executor.md": "806bdb1313ead84d", + "agents/gsd-executor.md": "441e624e9685e505", "agents/gsd-framework-selector.md": "564669d479433f15", "agents/gsd-integration-checker.md": "1bbbdd3d420b994e", - "agents/gsd-intel-updater.md": "b084fd8df5f13f2a", - "agents/gsd-mempalace-curator.md": "63676937f8970bf3", + "agents/gsd-intel-updater.md": "42c40fffbc720d0b", + "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", "agents/gsd-nyquist-auditor.md": "4f9bba7b9762835d", "agents/gsd-pattern-mapper.md": "b526065fd2efa19c", - "agents/gsd-phase-researcher.md": "56b77237e2d044bb", - "agents/gsd-plan-checker.md": "3a2bc105b4220859", - "agents/gsd-planner.md": "5a3e05392dbfce2f", - "agents/gsd-project-researcher.md": "5a9192efdc45fd11", - "agents/gsd-research-synthesizer.md": "4b9faffa7936b36c", + "agents/gsd-phase-researcher.md": "c507db2ba66038f4", + "agents/gsd-plan-checker.md": "a609245dbdc4ef2b", + "agents/gsd-planner.md": "ae6bf9def31a8eec", + "agents/gsd-project-researcher.md": "049f816c6caa4316", + "agents/gsd-research-synthesizer.md": "2f7dcbff50371d4c", "agents/gsd-roadmapper.md": "bbb23d3097911516", "agents/gsd-security-auditor.md": "c35c8ec2f85b331f", "agents/gsd-ui-auditor.md": "9338efa31b9b7b99", "agents/gsd-ui-checker.md": "6ed8cd036613da1c", - "agents/gsd-ui-researcher.md": "7496c0d22e818603", + "agents/gsd-ui-researcher.md": "eea2dfddf30aec9d", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "5645dfb20b787f01", + "agents/gsd-verifier.md": "75912e9cadd83eb3", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -86,7 +86,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", + "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "f5403e1470e46e69", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -109,7 +109,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "c386ac9e804f862e", + "gsd-core/references/planning-config.md": "15a5fc63268379d4", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -193,119 +193,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "805471417ad921b4", - "gsd-core/workflows/add-phase.md": "38a6397d692b6256", - "gsd-core/workflows/add-tests.md": "3182b4a48b60fc0f", - "gsd-core/workflows/add-todo.md": "2ee36f06763af56b", - "gsd-core/workflows/ai-integration-phase.md": "e1216f51ba0662f2", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "6c4393113fa9d209", + "gsd-core/workflows/add-phase.md": "cac9b86f66ab26f5", + "gsd-core/workflows/add-tests.md": "dd80832a428afb45", + "gsd-core/workflows/add-todo.md": "b71e80304fe484eb", + "gsd-core/workflows/ai-integration-phase.md": "5159c6bdf102f74b", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "85a83f15012e220d", - "gsd-core/workflows/audit-milestone.md": "7e68a0d33382fbca", - "gsd-core/workflows/audit-uat.md": "2ab2975014fbb210", - "gsd-core/workflows/autonomous.md": "cf705fcbc207e84a", - "gsd-core/workflows/check-todos.md": "ab6239efbf42077b", - "gsd-core/workflows/cleanup.md": "869f953fb25e57a7", - "gsd-core/workflows/code-review-fix.md": "40d723ec1c6b45d1", - "gsd-core/workflows/code-review.md": "4aee640e6e6951ce", - "gsd-core/workflows/complete-milestone.md": "512494b0d8c17777", - "gsd-core/workflows/debug.md": "1d138ad68a5f94dd", - "gsd-core/workflows/diagnose-issues.md": "ed74414bee6a146f", + "gsd-core/workflows/audit-fix.md": "47c29d04bab02b27", + "gsd-core/workflows/audit-milestone.md": "2266710d0ae48932", + "gsd-core/workflows/audit-uat.md": "1fb7b2ab9d587c8f", + "gsd-core/workflows/autonomous.md": "cc5217b1b2238a4c", + "gsd-core/workflows/check-todos.md": "32fdf33f5dc8bdde", + "gsd-core/workflows/cleanup.md": "b0ebfc48792b407b", + "gsd-core/workflows/code-review-fix.md": "b946fe7bcb303852", + "gsd-core/workflows/code-review.md": "0b24efcfa71a2ed2", + "gsd-core/workflows/complete-milestone.md": "c0808127038a8f86", + "gsd-core/workflows/debug.md": "f42e8e3cbc298694", + "gsd-core/workflows/diagnose-issues.md": "e616d0d730328d68", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "dbb54ab5455a1e49", + "gsd-core/workflows/discuss-phase-assumptions.md": "89987fd183e0d552", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "17ef5303bf8c61b2", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "711bdeb87a76fe72", + "gsd-core/workflows/discuss-phase.md": "a290d5ee19607bb7", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "250de9aae90daebc", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "a677457cfcf26929", + "gsd-core/workflows/discuss-phase/modes/auto.md": "d6392f268422768c", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "d7f857f6d916084a", + "gsd-core/workflows/discuss-phase/modes/chain.md": "1b26642897eebb36", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "e38583ffc6743580", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "491de71927bca5a0", - "gsd-core/workflows/docs-update.md": "4aee7d852ab26710", - "gsd-core/workflows/edit-phase.md": "db501e21c762d2b2", - "gsd-core/workflows/eval-review.md": "e211cca4eea94930", - "gsd-core/workflows/execute-phase.md": "61b798388f3c28d7", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "84b49fd65d290399", + "gsd-core/workflows/do.md": "a35bbd09f381d940", + "gsd-core/workflows/docs-update.md": "39f288623a8f6f32", + "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", + "gsd-core/workflows/eval-review.md": "3e1d7829ed2ed494", + "gsd-core/workflows/execute-phase.md": "5c56112513a04340", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "67ebc93f51968cb6", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bcb4ab75df626846", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e3cb789a350dcadc", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "81458a19cf02a5bc", - "gsd-core/workflows/explore.md": "28856a6b0198064b", - "gsd-core/workflows/extract-learnings.md": "b649ff8ecff388c1", + "gsd-core/workflows/execute-plan.md": "0c5551f99ee0a017", + "gsd-core/workflows/explore.md": "e83af8ceae314cf9", + "gsd-core/workflows/extract-learnings.md": "6f39375b7dc775f9", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "9de19e3792169aa3", - "gsd-core/workflows/graduation.md": "ca7fa951a963d84b", - "gsd-core/workflows/health.md": "295e170806820a94", + "gsd-core/workflows/forensics.md": "9fc65a8eed5d8bfc", + "gsd-core/workflows/graduation.md": "16fedecda36769eb", + "gsd-core/workflows/health.md": "788fad84fa42eb9f", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "77c34f4a77dec02c", - "gsd-core/workflows/help/modes/full.md": "a123dd946319a258", - "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", - "gsd-core/workflows/import.md": "64c8031374b39376", + "gsd-core/workflows/help/modes/full.md": "1bf502890828ada8", + "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/import.md": "96ec687c5cfe84ac", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "62761071f8391015", - "gsd-core/workflows/insert-phase.md": "37fb13804b4e61f2", + "gsd-core/workflows/ingest-docs.md": "7d0517356c9f2619", + "gsd-core/workflows/insert-phase.md": "147f0009ec74b589", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "d3b2783b53d96746", - "gsd-core/workflows/list-workspaces.md": "e2d7ee5e70395c1d", - "gsd-core/workflows/manager.md": "3ae982361d3cbb06", - "gsd-core/workflows/map-codebase.md": "893f13a40162ce23", - "gsd-core/workflows/milestone-summary.md": "04427b0abe11968d", - "gsd-core/workflows/mvp-phase.md": "e6a902c3308345f2", - "gsd-core/workflows/new-milestone.md": "2804d6f976923412", - "gsd-core/workflows/new-project.md": "f5799451fb7c1983", - "gsd-core/workflows/new-workspace.md": "277c868dc684ad05", - "gsd-core/workflows/next.md": "e64c75922be6d8e2", + "gsd-core/workflows/list-seeds.md": "25050c5e1b2b7176", + "gsd-core/workflows/list-workspaces.md": "8f0707ecbc395856", + "gsd-core/workflows/manager.md": "05eee19fe93c063d", + "gsd-core/workflows/map-codebase.md": "14c4995c73a671c7", + "gsd-core/workflows/milestone-summary.md": "20e56b9e3902e1d2", + "gsd-core/workflows/mvp-phase.md": "3e3936e1f247ac7c", + "gsd-core/workflows/new-milestone.md": "4fcf29b3cbcd9f83", + "gsd-core/workflows/new-project.md": "66bf6135f54ece0e", + "gsd-core/workflows/new-workspace.md": "f5eed5dd9a21878f", + "gsd-core/workflows/next.md": "3f8b61a35587a021", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "9c1acf8c30a244fd", - "gsd-core/workflows/plan-milestone-gaps.md": "95ca791b0867fe2d", - "gsd-core/workflows/plan-phase.md": "e4256d987d376112", + "gsd-core/workflows/pause-work.md": "3530607514b0ac00", + "gsd-core/workflows/plan-milestone-gaps.md": "bafdc6945cd2bd87", + "gsd-core/workflows/plan-phase.md": "46db1a845f25a579", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "ae59c247ad4a57d2", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "4b0a2cb0f4f28179", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "090c31e22b1508fe", - "gsd-core/workflows/plan-review-convergence.md": "2cdba6216184aac4", - "gsd-core/workflows/plant-seed.md": "d0d63f83ae7c939b", - "gsd-core/workflows/pr-branch.md": "15ccec6bd303ea46", - "gsd-core/workflows/profile-user.md": "21955dc3f74c66df", - "gsd-core/workflows/progress.md": "ec78c08395cc39f5", - "gsd-core/workflows/quick.md": "ec955c4e4caed4d7", - "gsd-core/workflows/reapply-patches.md": "4cfdb59f5d8e727e", - "gsd-core/workflows/remove-phase.md": "61b68a4af414e3c2", - "gsd-core/workflows/remove-workspace.md": "411bfff942216185", - "gsd-core/workflows/resume-project.md": "f8f71b5a98374b85", - "gsd-core/workflows/review.md": "f7d5b0f64631adea", - "gsd-core/workflows/scan.md": "db0c48c3963f9a8b", - "gsd-core/workflows/secure-phase.md": "c51b86e369574195", + "gsd-core/workflows/plan-review-convergence.md": "96ccbbf9e482ea8d", + "gsd-core/workflows/plant-seed.md": "a2cdd513663226f1", + "gsd-core/workflows/pr-branch.md": "9923878a4f6a2d91", + "gsd-core/workflows/profile-user.md": "26f74db0a7fcd268", + "gsd-core/workflows/progress.md": "9f326d63afb4b76b", + "gsd-core/workflows/quick.md": "68a9dfcd53f0859f", + "gsd-core/workflows/reapply-patches.md": "eb4272145a117904", + "gsd-core/workflows/remove-phase.md": "e336350f8113a328", + "gsd-core/workflows/remove-workspace.md": "e685dfbd736dfd90", + "gsd-core/workflows/resume-project.md": "e23981178fa37b3d", + "gsd-core/workflows/review.md": "c2b3fcc5bfc80038", + "gsd-core/workflows/scan.md": "dfd92717caea0ce7", + "gsd-core/workflows/secure-phase.md": "cf78183f06a02582", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "39c2dc5663866fae", - "gsd-core/workflows/settings-integrations.md": "7e9fbe941882c4f6", - "gsd-core/workflows/settings.md": "bc0e1b43249e32b0", - "gsd-core/workflows/ship.md": "c3db35c8d1b398c1", - "gsd-core/workflows/sketch-wrap-up.md": "91f40fc816293e3c", - "gsd-core/workflows/sketch.md": "92a8bab2605469fb", - "gsd-core/workflows/spec-phase.md": "e06346c9c626a2d2", - "gsd-core/workflows/spike-wrap-up.md": "693949a4e10e66bd", - "gsd-core/workflows/spike.md": "204e742c846ee0d9", - "gsd-core/workflows/stats.md": "5cfea82b894eee3c", + "gsd-core/workflows/settings-advanced.md": "e08245a5a65dcec2", + "gsd-core/workflows/settings-integrations.md": "76eee76d6eb57657", + "gsd-core/workflows/settings.md": "f6c7aa7ceb99078b", + "gsd-core/workflows/ship.md": "5f931a25ea9102a4", + "gsd-core/workflows/sketch-wrap-up.md": "1f44789553180d84", + "gsd-core/workflows/sketch.md": "2226779b6003a71c", + "gsd-core/workflows/smart-entry.md": "9a64f43927641ca4", + "gsd-core/workflows/spec-phase.md": "55d727dbf400ed9a", + "gsd-core/workflows/spike-wrap-up.md": "846958e0012a0899", + "gsd-core/workflows/spike.md": "868b15cdf229cc43", + "gsd-core/workflows/stats.md": "f9241bb65770c5a4", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "4a009fd2cc4387a7", - "gsd-core/workflows/transition.md": "fe82e77df8dceb1b", - "gsd-core/workflows/ui-phase.md": "06f1f80de620a319", - "gsd-core/workflows/ui-review.md": "0af83311f5e41f48", - "gsd-core/workflows/ultraplan-phase.md": "b4e64685b40bce09", + "gsd-core/workflows/thread.md": "d71b1e815925c5cc", + "gsd-core/workflows/transition.md": "b9e41eb751375faf", + "gsd-core/workflows/ui-phase.md": "dfc93789f7fa93f5", + "gsd-core/workflows/ui-review.md": "8cd9605add21301e", + "gsd-core/workflows/ultraplan-phase.md": "ceff456b1e9d94d8", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "9cad8a8f4baff922", - "gsd-core/workflows/validate-phase.md": "54687a0f2a562fc4", - "gsd-core/workflows/verify-phase.md": "5caca0023bc88a9a", - "gsd-core/workflows/verify-work.md": "a327274299317cb1", + "gsd-core/workflows/update.md": "165beec33490bd28", + "gsd-core/workflows/validate-phase.md": "5b4ae14c87859bd2", + "gsd-core/workflows/verify-phase.md": "20e90407e1e531fc", + "gsd-core/workflows/verify-work.md": "6fa216623778c541", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", @@ -324,8 +325,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc", "skills/gsd-ns-context/skills/graphify/SKILL.md": "030050fcd08d129d", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "19aec854da15f77b", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "5647f915e5c85482", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "d41523e659d1920f", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "588ddf4fbf3ebe65", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "2d95e385fee26dee", "skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "fb53053848bb6695", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "d8e26a5ed95a4ecc", @@ -373,7 +374,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "c35f175ccc747d56", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "48267dc071481a89", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "62dc6ae62bb38c16", - "skills/gsd-ns-workflow/SKILL.md": "7dbd699b5130c0d5", + "skills/gsd-ns-workflow/SKILL.md": "0cb9c23c065fe448", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "addc3a220961a9c7", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "e74b83a991dc9fc7", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "37dc7b78ceb74803", @@ -381,6 +382,7 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "e249a35959e49e99", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "3eae6536d09c2532", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "6c2beccceb46fda1", + "skills/gsd-ns-workflow/skills/next/SKILL.md": "3856471d0f64bf09", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "4e1363db6013a1e5", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "b7a6ff2837b41143", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "b7d213288df9aa96", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index e066adaef..7a5e888ae 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "93ca6e24f4fd3681", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "2230fda7f06a3906", + "agents/gsd-code-fixer.md": "1cf3a9fdade9a470", "agents/gsd-code-reviewer.md": "5342fcc0da974696", "agents/gsd-codebase-mapper.md": "b995bf01af0193d2", - "agents/gsd-debug-session-manager.md": "d7c0e160cbf76c68", - "agents/gsd-debugger.md": "fdf0aee402605636", + "agents/gsd-debug-session-manager.md": "a5649998f68812d5", + "agents/gsd-debugger.md": "a63306f54bdc63bf", "agents/gsd-doc-classifier.md": "095e804a82f4a47f", "agents/gsd-doc-synthesizer.md": "2a78fe239d00389c", "agents/gsd-doc-verifier.md": "e74d930905a782ea", "agents/gsd-doc-writer.md": "ed5678dd38c83716", "agents/gsd-domain-researcher.md": "1c1a800108a2b225", - "agents/gsd-eval-auditor.md": "3d3e9336c01e90fe", + "agents/gsd-eval-auditor.md": "99012004b14ea602", "agents/gsd-eval-planner.md": "4ebdd7fe9cbb0cfe", - "agents/gsd-executor.md": "a5041170a536bebd", + "agents/gsd-executor.md": "d0bfc88c01a63181", "agents/gsd-framework-selector.md": "7726fccc86bfeb50", "agents/gsd-integration-checker.md": "2d8339790bbb2dc3", - "agents/gsd-intel-updater.md": "ec317a56d4abc4d3", - "agents/gsd-mempalace-curator.md": "63676937f8970bf3", + "agents/gsd-intel-updater.md": "c51339956197cbd3", + "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", "agents/gsd-nyquist-auditor.md": "42676eea063d2ec5", "agents/gsd-pattern-mapper.md": "92cfa2e6c2a06bf3", - "agents/gsd-phase-researcher.md": "09657cecf0374c21", - "agents/gsd-plan-checker.md": "ad4ff5b285bffd57", - "agents/gsd-planner.md": "7573900da2449268", - "agents/gsd-project-researcher.md": "defda280dac420e7", - "agents/gsd-research-synthesizer.md": "6c3b691dba5395c6", + "agents/gsd-phase-researcher.md": "6338474da1a5d65e", + "agents/gsd-plan-checker.md": "e704c083b02e8c35", + "agents/gsd-planner.md": "164eab970e2cf025", + "agents/gsd-project-researcher.md": "e43c59f7f1f2f37a", + "agents/gsd-research-synthesizer.md": "87955470c3c129b2", "agents/gsd-roadmapper.md": "20b69eff61a7a9fa", "agents/gsd-security-auditor.md": "d3b8f44034a76c9d", "agents/gsd-ui-auditor.md": "a26bbc733817959b", "agents/gsd-ui-checker.md": "30aa8e8efa880bd0", - "agents/gsd-ui-researcher.md": "e1faa0ad884633ba", + "agents/gsd-ui-researcher.md": "5b2d98efecd3ca11", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "1f0f65332e5fbbf8", + "agents/gsd-verifier.md": "c8a8c73a277a512f", "commands/gsd-add-tests.md": "aa65032141557fb7", "commands/gsd-ai-integration-phase.md": "373053d7cd887aa9", "commands/gsd-audit-fix.md": "c21ef925131fade7", @@ -63,18 +63,19 @@ "commands/gsd-ingest-docs.md": "ab3e58239c23d61d", "commands/gsd-manager.md": "bfe9e261fa918876", "commands/gsd-map-codebase.md": "9ed09a9a9ce48ffd", - "commands/gsd-mempalace-capture.md": "6fa6ca7a1ecd562d", - "commands/gsd-mempalace-recall.md": "146d97ab543d8df2", + "commands/gsd-mempalace-capture.md": "e9e00b0602e1d8b8", + "commands/gsd-mempalace-recall.md": "6efef238d8c62569", "commands/gsd-milestone-summary.md": "e3a36fbd695a1833", "commands/gsd-mvp-phase.md": "671791ba61c4654a", "commands/gsd-new-milestone.md": "00b5d757991941c7", "commands/gsd-new-project.md": "490195d5003d3d17", + "commands/gsd-next.md": "dbec71acc9d5d2a2", "commands/gsd-ns-context.md": "cc8954f405ae7916", "commands/gsd-ns-ideate.md": "fd1dd80d705e6e36", "commands/gsd-ns-manage.md": "5cc012d0be1caabb", "commands/gsd-ns-project.md": "52e30c8d84bb1ee5", "commands/gsd-ns-review.md": "a28dbfd4aba5f74b", - "commands/gsd-ns-workflow.md": "dcd214fc50008d42", + "commands/gsd-ns-workflow.md": "a1b874be9cf16caf", "commands/gsd-pause-work.md": "6caa75a7c2b4dd2d", "commands/gsd-phase.md": "e3ca4958ea20a935", "commands/gsd-plan-phase.md": "6de27d54ac191539", @@ -106,12 +107,12 @@ "commands/gsd-workstreams.md": "884b6c8d648422c7", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -152,7 +153,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", + "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -175,7 +176,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "1c3a3aae2ae89e83", + "gsd-core/references/planning-config.md": "7fe958e09e74b6c8", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -259,119 +260,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "1153d35058e3e24f", - "gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba", - "gsd-core/workflows/add-tests.md": "2871f7e6409ba89e", - "gsd-core/workflows/add-todo.md": "3b913840c1f490b2", - "gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "1bc7377b105194fc", + "gsd-core/workflows/add-phase.md": "46e0551ffdd8ce1a", + "gsd-core/workflows/add-tests.md": "2c1da65d41dc12d2", + "gsd-core/workflows/add-todo.md": "cc0efe270004c8fb", + "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9", - "gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793", - "gsd-core/workflows/autonomous.md": "1184e5864e201889", - "gsd-core/workflows/check-todos.md": "1e3026abe782bd36", - "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", - "gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93", - "gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e", - "gsd-core/workflows/complete-milestone.md": "337d177126f1bd67", - "gsd-core/workflows/debug.md": "da62e7a62c113b29", - "gsd-core/workflows/diagnose-issues.md": "690c523df07f2ea7", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", + "gsd-core/workflows/autonomous.md": "7e5683728ef33707", + "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", + "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", + "gsd-core/workflows/code-review-fix.md": "c323f7098b671bd6", + "gsd-core/workflows/code-review.md": "ad450c6ef8459dad", + "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", + "gsd-core/workflows/debug.md": "849d7e5b9c12dcae", + "gsd-core/workflows/diagnose-issues.md": "77d98ac07c4a26ff", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad", + "gsd-core/workflows/discuss-phase-assumptions.md": "1e229f6d21831d60", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "a0b7539c8b3c25cd", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", + "gsd-core/workflows/discuss-phase.md": "02a5381c9a2173be", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", + "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d", + "gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "152e9c5c512f79cb", - "gsd-core/workflows/docs-update.md": "806ada831b961116", - "gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5", - "gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae", - "gsd-core/workflows/execute-phase.md": "d3c1583906de7408", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643", + "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", + "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", + "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", + "gsd-core/workflows/execute-phase.md": "2f9b53aac81a8f27", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "89fc525aecb29aad", - "gsd-core/workflows/explore.md": "11523b829cc67c29", - "gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb", + "gsd-core/workflows/execute-plan.md": "933d10547116794a", + "gsd-core/workflows/explore.md": "6c04f2e658d93261", + "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "b4bde768fd27a982", - "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", - "gsd-core/workflows/health.md": "e3cb8ff4e01e9e53", + "gsd-core/workflows/forensics.md": "0d500a3f5ab26913", + "gsd-core/workflows/graduation.md": "47f1594c88c08501", + "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "de202c9910773a1d", - "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", - "gsd-core/workflows/import.md": "97861d522319d56e", + "gsd-core/workflows/help/modes/full.md": "4c018bcc9ed4e55c", + "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3", - "gsd-core/workflows/insert-phase.md": "621f9e75725542b1", + "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", + "gsd-core/workflows/insert-phase.md": "08dca838d831bb5b", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "0a466d04df300854", - "gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b", - "gsd-core/workflows/manager.md": "a31f7e255dd7d01d", - "gsd-core/workflows/map-codebase.md": "582bddef590de9c6", - "gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a", - "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", - "gsd-core/workflows/new-milestone.md": "23d2135a555e95df", - "gsd-core/workflows/new-project.md": "2fa5ddc0fe749b28", - "gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1", - "gsd-core/workflows/next.md": "48bd4b5d54f0d1f8", + "gsd-core/workflows/list-seeds.md": "b687f2a843032d65", + "gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453", + "gsd-core/workflows/manager.md": "3ba7a3e8213c4b23", + "gsd-core/workflows/map-codebase.md": "83d750aade709983", + "gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043", + "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", + "gsd-core/workflows/new-milestone.md": "a616efb0f82d1a11", + "gsd-core/workflows/new-project.md": "278e0b88dd1d2ea0", + "gsd-core/workflows/new-workspace.md": "017688423110ed66", + "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b", - "gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25", - "gsd-core/workflows/plan-phase.md": "9fc35fa37928c14e", + "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", + "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", + "gsd-core/workflows/plan-phase.md": "3e4debac4579684f", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5", - "gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd", - "gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06", - "gsd-core/workflows/pr-branch.md": "f2a35833fe784a53", - "gsd-core/workflows/profile-user.md": "fd15f5d92ac1703b", - "gsd-core/workflows/progress.md": "057699b34b6198f7", - "gsd-core/workflows/quick.md": "eb197ddd523f6670", - "gsd-core/workflows/reapply-patches.md": "7915e40411490bbe", - "gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9", - "gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc", - "gsd-core/workflows/resume-project.md": "b18b51fd15cbce95", - "gsd-core/workflows/review.md": "fbfa6eebcad41aa0", - "gsd-core/workflows/scan.md": "54ff1ff60041d065", - "gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2", + "gsd-core/workflows/plan-review-convergence.md": "c635ecb8590a724e", + "gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede", + "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", + "gsd-core/workflows/profile-user.md": "4fa910d15dea5695", + "gsd-core/workflows/progress.md": "893aa3c36983f74b", + "gsd-core/workflows/quick.md": "9033dbe58443af36", + "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", + "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", + "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", + "gsd-core/workflows/resume-project.md": "f28da1200e4545f4", + "gsd-core/workflows/review.md": "f3c2e894941c9943", + "gsd-core/workflows/scan.md": "003883d71c37da7d", + "gsd-core/workflows/secure-phase.md": "29fc6b62c5c5dc62", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "895e94e9193c2de2", - "gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed", - "gsd-core/workflows/settings.md": "48d337eb7e3f141b", - "gsd-core/workflows/ship.md": "d26fb5d3e965642a", - "gsd-core/workflows/sketch-wrap-up.md": "7d52aa95ee69d47a", - "gsd-core/workflows/sketch.md": "55cee885b4add548", - "gsd-core/workflows/spec-phase.md": "2aa0353147153776", - "gsd-core/workflows/spike-wrap-up.md": "2fde13092ba1af57", - "gsd-core/workflows/spike.md": "0051a7e2193a7522", - "gsd-core/workflows/stats.md": "01c24349370a0e6d", + "gsd-core/workflows/settings-advanced.md": "b57c947edee905bc", + "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", + "gsd-core/workflows/settings.md": "b2d39d972650f5f3", + "gsd-core/workflows/ship.md": "7b8fe9f89143e648", + "gsd-core/workflows/sketch-wrap-up.md": "2aba89ecd8f41a0d", + "gsd-core/workflows/sketch.md": "5eedd93f9a5b49d5", + "gsd-core/workflows/smart-entry.md": "449238eb94abe187", + "gsd-core/workflows/spec-phase.md": "8c480bd91f3cef6f", + "gsd-core/workflows/spike-wrap-up.md": "2b004744c52e565c", + "gsd-core/workflows/spike.md": "24a0fee1447b6f0a", + "gsd-core/workflows/stats.md": "76a42cbeaf6007c2", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "6d075b5d26500e9d", - "gsd-core/workflows/transition.md": "eee3435817fab185", - "gsd-core/workflows/ui-phase.md": "93ea0d0dfcb2a1e8", - "gsd-core/workflows/ui-review.md": "1ad3654435000881", - "gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262", + "gsd-core/workflows/thread.md": "927e7eeefd2fcf5c", + "gsd-core/workflows/transition.md": "cb8ec5affb7ebba1", + "gsd-core/workflows/ui-phase.md": "7313e999421db8c1", + "gsd-core/workflows/ui-review.md": "7acfc485526d064b", + "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "6a593863d1b0a287", - "gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb", - "gsd-core/workflows/verify-phase.md": "7579af6cd757f644", - "gsd-core/workflows/verify-work.md": "d77ace0fc4f33ff7", + "gsd-core/workflows/update.md": "5ff1f77222977648", + "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/verify-phase.md": "98a995046bdb6c3c", + "gsd-core/workflows/verify-work.md": "34e980a6950cd83c", "hooks/gsd-check-update-worker.js": "bdc9324a2f080ddd", "hooks/gsd-check-update.js": "b7669f605631e506", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -435,18 +437,19 @@ "skills/gsd-ingest-docs/SKILL.md": "2df55e0ec95d57d9", "skills/gsd-manager/SKILL.md": "816db4d4ed618537", "skills/gsd-map-codebase/SKILL.md": "00622b489483ba69", - "skills/gsd-mempalace-capture/SKILL.md": "12a57bef275e2961", - "skills/gsd-mempalace-recall/SKILL.md": "69275abbee414350", + "skills/gsd-mempalace-capture/SKILL.md": "5f10d368835e062c", + "skills/gsd-mempalace-recall/SKILL.md": "70c8491f53f4161b", "skills/gsd-milestone-summary/SKILL.md": "9eb030a1ac307fa1", "skills/gsd-mvp-phase/SKILL.md": "236fcdd69f47d101", "skills/gsd-new-milestone/SKILL.md": "be371ad30631385e", "skills/gsd-new-project/SKILL.md": "793f7177d3bd026b", + "skills/gsd-next/SKILL.md": "43c805425b88bf75", "skills/gsd-ns-context/SKILL.md": "305b9b6248e8cc95", "skills/gsd-ns-ideate/SKILL.md": "c63a1aed61888b35", "skills/gsd-ns-manage/SKILL.md": "6a5b711b5103c566", "skills/gsd-ns-project/SKILL.md": "345ea11ccffd21b0", "skills/gsd-ns-review/SKILL.md": "98f1f3b3caf1a279", - "skills/gsd-ns-workflow/SKILL.md": "eda03f7d99eb2f8e", + "skills/gsd-ns-workflow/SKILL.md": "b77682820700300b", "skills/gsd-pause-work/SKILL.md": "e2de20b7539e78d4", "skills/gsd-phase/SKILL.md": "f87211f779315ced", "skills/gsd-plan-phase/SKILL.md": "6134e837750034ab", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 4c9876192..bedfce68f 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -1,22 +1,22 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.md": "3995e081531dd043", + "agents/gsd-advisor-researcher.md": "eea6d1604aaf305c", "agents/gsd-advisor-researcher.toml": "144f037c79aa9c26", - "agents/gsd-ai-researcher.md": "9deaf29ae170faff", + "agents/gsd-ai-researcher.md": "303be751c91da4c8", "agents/gsd-ai-researcher.toml": "5a16e952628fdeb0", "agents/gsd-assumptions-analyzer.md": "21ee3cd4095f7cf8", "agents/gsd-assumptions-analyzer.toml": "9460360826f33ab1", - "agents/gsd-code-fixer.md": "2b98fffbdf9484b8", - "agents/gsd-code-fixer.toml": "04266b0cb2978cfb", + "agents/gsd-code-fixer.md": "4fa4dbb501513bc3", + "agents/gsd-code-fixer.toml": "c8286e7d68753288", "agents/gsd-code-reviewer.md": "854d93fb1e91fca4", "agents/gsd-code-reviewer.toml": "66420d6e6ffd14eb", "agents/gsd-codebase-mapper.md": "cf8f8550b44aec35", "agents/gsd-codebase-mapper.toml": "a4609f3ac66c2081", - "agents/gsd-debug-session-manager.md": "a4433f8cac0ae81c", - "agents/gsd-debug-session-manager.toml": "8b45a8660607e1ae", - "agents/gsd-debugger.md": "7ee37c67fb1becbe", - "agents/gsd-debugger.toml": "0824394ba49b977f", + "agents/gsd-debug-session-manager.md": "3d4779f94c6cfb14", + "agents/gsd-debug-session-manager.toml": "c8d894c734e97256", + "agents/gsd-debugger.md": "cb8a103ed221ca7c", + "agents/gsd-debugger.toml": "b31333b83a8fed0a", "agents/gsd-doc-classifier.md": "0ee2bcb95b247ef8", "agents/gsd-doc-classifier.toml": "8b94b5c8b02c133a", "agents/gsd-doc-synthesizer.md": "2a3fbfce6cf5e671", @@ -25,36 +25,36 @@ "agents/gsd-doc-verifier.toml": "c0b7ac150730b954", "agents/gsd-doc-writer.md": "0a3557268f169722", "agents/gsd-doc-writer.toml": "d21d67f9ba074156", - "agents/gsd-domain-researcher.md": "bafef7d698ccb928", + "agents/gsd-domain-researcher.md": "fbd2f916f265c106", "agents/gsd-domain-researcher.toml": "a49ddec9005b4bf5", - "agents/gsd-eval-auditor.md": "0e3aa386f7eb654f", - "agents/gsd-eval-auditor.toml": "531377421cf4f8f8", + "agents/gsd-eval-auditor.md": "2810917e02e5547c", + "agents/gsd-eval-auditor.toml": "9b81d61b3c5f722d", "agents/gsd-eval-planner.md": "73f2ad2ff2797a51", "agents/gsd-eval-planner.toml": "09468ad1a34ac468", - "agents/gsd-executor.md": "79d169658b54851c", - "agents/gsd-executor.toml": "410f786fed366ab8", + "agents/gsd-executor.md": "93a05c1436bc4458", + "agents/gsd-executor.toml": "f5a55d4eacd8613c", "agents/gsd-framework-selector.md": "ebae32430887d2e0", "agents/gsd-framework-selector.toml": "637e4e021b7ec380", "agents/gsd-integration-checker.md": "9cc875676cf7d741", "agents/gsd-integration-checker.toml": "53f3cfac6fbd6447", - "agents/gsd-intel-updater.md": "097c1a4b90b28ba0", - "agents/gsd-intel-updater.toml": "07f8098bd5e0e65e", - "agents/gsd-mempalace-curator.md": "159f24243bf3acfb", - "agents/gsd-mempalace-curator.toml": "30bcaf1ca0b926db", + "agents/gsd-intel-updater.md": "8e5453421c92c0fd", + "agents/gsd-intel-updater.toml": "94888d7182fd2fb5", + "agents/gsd-mempalace-curator.md": "60a8ec0e990ba777", + "agents/gsd-mempalace-curator.toml": "015f156ad7d2dd0f", "agents/gsd-nyquist-auditor.md": "554dbb4a01760a9d", "agents/gsd-nyquist-auditor.toml": "b3d7214b42fb67fa", "agents/gsd-pattern-mapper.md": "efbcfa7c5de4027f", "agents/gsd-pattern-mapper.toml": "48a17baa3d7d142c", - "agents/gsd-phase-researcher.md": "d34ec667b611aa51", - "agents/gsd-phase-researcher.toml": "da31585e405a30e7", - "agents/gsd-plan-checker.md": "3f282936630b20d2", - "agents/gsd-plan-checker.toml": "2d5ec87349e4af25", - "agents/gsd-planner.md": "179f4a6e8d1ab77c", - "agents/gsd-planner.toml": "1f28070c37c44060", - "agents/gsd-project-researcher.md": "6bba76aaa1afa85d", - "agents/gsd-project-researcher.toml": "b727993c5d18f584", - "agents/gsd-research-synthesizer.md": "2f99bfaa351236e3", - "agents/gsd-research-synthesizer.toml": "bab1d2e3848c1c91", + "agents/gsd-phase-researcher.md": "87d74324e7708ea0", + "agents/gsd-phase-researcher.toml": "44a3d510cd0ce3bd", + "agents/gsd-plan-checker.md": "e7f02c10ea788aee", + "agents/gsd-plan-checker.toml": "6f8ceb421d0ad721", + "agents/gsd-planner.md": "5d638a2e37b63731", + "agents/gsd-planner.toml": "50cec2af6b45a61c", + "agents/gsd-project-researcher.md": "959f2e57c3d69ed8", + "agents/gsd-project-researcher.toml": "f395e8e8c4baf1ed", + "agents/gsd-research-synthesizer.md": "497f85adf53259ef", + "agents/gsd-research-synthesizer.toml": "053616d4941a1458", "agents/gsd-roadmapper.md": "e15d82d7781dbff3", "agents/gsd-roadmapper.toml": "0b17f618eafe9be8", "agents/gsd-security-auditor.md": "a4008a6b1d01833b", @@ -63,21 +63,21 @@ "agents/gsd-ui-auditor.toml": "5e9dd62a12a16a1e", "agents/gsd-ui-checker.md": "bf7bf8cc301c65a1", "agents/gsd-ui-checker.toml": "d0a084e82a9ae52d", - "agents/gsd-ui-researcher.md": "1f19197bcf8385a8", - "agents/gsd-ui-researcher.toml": "48032d9873cc82f7", + "agents/gsd-ui-researcher.md": "2befca69af55e44a", + "agents/gsd-ui-researcher.toml": "b55270666066e501", "agents/gsd-user-profiler.md": "1bf5033c929181c1", "agents/gsd-user-profiler.toml": "b9c244bb8fbf8140", - "agents/gsd-verifier.md": "7c616980dbe8a81a", - "agents/gsd-verifier.toml": "c994bfe9f1379872", + "agents/gsd-verifier.md": "4ac4b860e2504374", + "agents/gsd-verifier.toml": "8ed9fb961409e894", "config.toml": "a34316b9ac61a620", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -141,7 +141,7 @@ "gsd-core/references/planner-reviews.md": "7889bfa28e82156b", "gsd-core/references/planner-revision.md": "2ebf1a714d1ec4bf", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "0767f44905c9a65e", + "gsd-core/references/planning-config.md": "8593e6610784a339", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -225,119 +225,120 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "f33efb61b6810afd", - "gsd-core/workflows/add-phase.md": "b522eb805a7f00be", - "gsd-core/workflows/add-tests.md": "1157f7142099e956", - "gsd-core/workflows/add-todo.md": "218d02344535d232", - "gsd-core/workflows/ai-integration-phase.md": "7e3b8a29d2a71d80", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "62431b27424ff1ff", + "gsd-core/workflows/add-phase.md": "27f282bf5b8af59d", + "gsd-core/workflows/add-tests.md": "995918665fc78d39", + "gsd-core/workflows/add-todo.md": "097e171f797737df", + "gsd-core/workflows/ai-integration-phase.md": "1dfa15d8f28c022d", "gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "28afeeab183e254f", - "gsd-core/workflows/audit-uat.md": "b3b503e9f80dc9f5", - "gsd-core/workflows/autonomous.md": "b6a3fba06ebef11f", - "gsd-core/workflows/check-todos.md": "d847aa758e18d698", - "gsd-core/workflows/cleanup.md": "b990139192ab7c08", - "gsd-core/workflows/code-review-fix.md": "3311f5fa61f8a90b", - "gsd-core/workflows/code-review.md": "937aeabfff8963b3", - "gsd-core/workflows/complete-milestone.md": "c0eab93d97dd298e", - "gsd-core/workflows/debug.md": "e8367cffd3dfa758", - "gsd-core/workflows/diagnose-issues.md": "b6766f3830f5b130", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "46edd152d8b63bfc", + "gsd-core/workflows/audit-uat.md": "2564078edb15b5e9", + "gsd-core/workflows/autonomous.md": "92f08626d4aea668", + "gsd-core/workflows/check-todos.md": "b2b103e8638e760a", + "gsd-core/workflows/cleanup.md": "5d48d64664222a3e", + "gsd-core/workflows/code-review-fix.md": "3ff5f7eac2269ca3", + "gsd-core/workflows/code-review.md": "82858ab037b9176e", + "gsd-core/workflows/complete-milestone.md": "017df7443bd08da5", + "gsd-core/workflows/debug.md": "cc7b2d2fd4307a78", + "gsd-core/workflows/diagnose-issues.md": "e38bb21d06dff077", "gsd-core/workflows/discovery-phase.md": "71a4b78ff876a854", - "gsd-core/workflows/discuss-phase-assumptions.md": "9d9b1e0b0fbf6e92", + "gsd-core/workflows/discuss-phase-assumptions.md": "f23abfe76623ed63", "gsd-core/workflows/discuss-phase-power.md": "3f8b83dc6be2e9d5", - "gsd-core/workflows/discuss-phase.md": "b84b5cd94c57b9af", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", + "gsd-core/workflows/discuss-phase.md": "7c9df6656b81fda9", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", "gsd-core/workflows/discuss-phase/modes/all.md": "42e58e1f499f7824", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "48ac14a332568c30", + "gsd-core/workflows/discuss-phase/modes/auto.md": "d48968f75a2056b7", "gsd-core/workflows/discuss-phase/modes/batch.md": "21ee55869eaa7ece", - "gsd-core/workflows/discuss-phase/modes/chain.md": "1ff5f2e1654e93f1", + "gsd-core/workflows/discuss-phase/modes/chain.md": "862a2c45a6096400", "gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "6e1c6f4d8fdd0be3", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "0792489ee3d22472", - "gsd-core/workflows/docs-update.md": "c5e1ea372f4a9ee8", - "gsd-core/workflows/edit-phase.md": "c83ef0701c19c455", - "gsd-core/workflows/eval-review.md": "68d7d96bd415629b", - "gsd-core/workflows/execute-phase.md": "5db223634afa2b88", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "7ae407e4435c9a2a", + "gsd-core/workflows/do.md": "8f3e77a9486bc57b", + "gsd-core/workflows/docs-update.md": "e255317df939e302", + "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", + "gsd-core/workflows/eval-review.md": "63d0d0670b54c244", + "gsd-core/workflows/execute-phase.md": "b6f4765843dc05f7", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f4cacd27d37bac65", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "e67237068c3bc91d", - "gsd-core/workflows/explore.md": "a75d42453e639a5d", - "gsd-core/workflows/extract-learnings.md": "89145eb423bbbef2", + "gsd-core/workflows/execute-plan.md": "ac1f1d9ada00a91e", + "gsd-core/workflows/explore.md": "2ef10d17c8864a04", + "gsd-core/workflows/extract-learnings.md": "f716aa03fcb5f8da", "gsd-core/workflows/fast.md": "13252d545947354d", - "gsd-core/workflows/forensics.md": "bf6a31b2a3ec2268", - "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", - "gsd-core/workflows/health.md": "e9fe7c29fc41a887", + "gsd-core/workflows/forensics.md": "2e8a01b5b44e65f3", + "gsd-core/workflows/graduation.md": "47f1594c88c08501", + "gsd-core/workflows/health.md": "5b835fc606fd3e9b", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "becceb85b25dca89", "gsd-core/workflows/help/modes/default.md": "18c7dc50066f5cd6", - "gsd-core/workflows/help/modes/full.md": "072c20fe275d54df", - "gsd-core/workflows/help/modes/topic.md": "fc6697bdb47df8b3", - "gsd-core/workflows/import.md": "8b8c3a25526c0d41", + "gsd-core/workflows/help/modes/full.md": "8a7854a34df89bd8", + "gsd-core/workflows/help/modes/topic.md": "303613ba8b123b9f", + "gsd-core/workflows/import.md": "cb3c8f9d09edb434", "gsd-core/workflows/inbox.md": "61b8b10e7a74b2e9", - "gsd-core/workflows/ingest-docs.md": "3680699c20c3ac7d", - "gsd-core/workflows/insert-phase.md": "9f8286598bffe5de", + "gsd-core/workflows/ingest-docs.md": "3cb763e0687d7ffa", + "gsd-core/workflows/insert-phase.md": "5e23bd8d55b388c7", "gsd-core/workflows/list-phase-assumptions.md": "4d245f6ea899bcb9", - "gsd-core/workflows/list-seeds.md": "1fb29a83e0769ced", - "gsd-core/workflows/list-workspaces.md": "7fbeaf65ce9890f5", - "gsd-core/workflows/manager.md": "4def33941b0e7d57", - "gsd-core/workflows/map-codebase.md": "320d5bfc9df29013", - "gsd-core/workflows/milestone-summary.md": "77d76610d1c98014", - "gsd-core/workflows/mvp-phase.md": "9a9b8b58d59a893f", - "gsd-core/workflows/new-milestone.md": "e7329ba10b6d8182", - "gsd-core/workflows/new-project.md": "f69c90cee1d7952d", - "gsd-core/workflows/new-workspace.md": "cc9660e79d5ba7b4", - "gsd-core/workflows/next.md": "ede3f6183e513000", + "gsd-core/workflows/list-seeds.md": "0a2d9fd5b06b8ded", + "gsd-core/workflows/list-workspaces.md": "bb74607336897b94", + "gsd-core/workflows/manager.md": "3a5abb31ad83334f", + "gsd-core/workflows/map-codebase.md": "2edab7d924b296ff", + "gsd-core/workflows/milestone-summary.md": "a53b30a84f904b50", + "gsd-core/workflows/mvp-phase.md": "100dded5c7b4cb86", + "gsd-core/workflows/new-milestone.md": "86b4b5245fc971f3", + "gsd-core/workflows/new-project.md": "a9dbf207833897cc", + "gsd-core/workflows/new-workspace.md": "3630b78e83b1e491", + "gsd-core/workflows/next.md": "7097a9607a981086", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "664da466ab989f9d", - "gsd-core/workflows/pause-work.md": "3c2ee96295959527", - "gsd-core/workflows/plan-milestone-gaps.md": "8ee841bcc7adc836", - "gsd-core/workflows/plan-phase.md": "5d3ed552933f81da", + "gsd-core/workflows/pause-work.md": "a217770ecafcb2e0", + "gsd-core/workflows/plan-milestone-gaps.md": "73d46f77c50a0690", + "gsd-core/workflows/plan-phase.md": "89ee3233c1aee273", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "d838b87563feedf6", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "44a12264f8b61d03", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "f10975692cbd036e", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "f5edc589cab52a7b", - "gsd-core/workflows/plan-review-convergence.md": "f27818025e279aa4", - "gsd-core/workflows/plant-seed.md": "bfa729ff2ad3441a", - "gsd-core/workflows/pr-branch.md": "3b13915429c0e8d9", - "gsd-core/workflows/profile-user.md": "1faa318720f40d31", - "gsd-core/workflows/progress.md": "3e061576e3f6fae1", - "gsd-core/workflows/quick.md": "937615c018fc6853", - "gsd-core/workflows/reapply-patches.md": "fba79b3c55c3b2e7", - "gsd-core/workflows/remove-phase.md": "75c8ca0dbd1ce404", - "gsd-core/workflows/remove-workspace.md": "a9d1dcda7755b6c9", - "gsd-core/workflows/resume-project.md": "94ac2cac4c562557", - "gsd-core/workflows/review.md": "bd3873bea54d6143", - "gsd-core/workflows/scan.md": "29f3b65f5d9de885", - "gsd-core/workflows/secure-phase.md": "858b5e1152b569ed", + "gsd-core/workflows/plan-review-convergence.md": "acd0b09a302b6773", + "gsd-core/workflows/plant-seed.md": "5b07de07e4593281", + "gsd-core/workflows/pr-branch.md": "d13e1cc81de40896", + "gsd-core/workflows/profile-user.md": "05828c8cc61ef384", + "gsd-core/workflows/progress.md": "7bedc431bb55edb8", + "gsd-core/workflows/quick.md": "3e7686705da2af19", + "gsd-core/workflows/reapply-patches.md": "26297b84736e66a4", + "gsd-core/workflows/remove-phase.md": "9ee0fddd11a0d9d4", + "gsd-core/workflows/remove-workspace.md": "19d7465aaa50cb62", + "gsd-core/workflows/resume-project.md": "9965f87eb278f7f8", + "gsd-core/workflows/review.md": "3a086e38f13eab6f", + "gsd-core/workflows/scan.md": "1a3caa5d724d39e9", + "gsd-core/workflows/secure-phase.md": "db91810d16964b1e", "gsd-core/workflows/session-report.md": "dd8fa011c9394075", - "gsd-core/workflows/settings-advanced.md": "493ffecd54335be4", - "gsd-core/workflows/settings-integrations.md": "d0443a29f3f924ec", - "gsd-core/workflows/settings.md": "3395b334321ac6fa", - "gsd-core/workflows/ship.md": "125045072ab5017d", - "gsd-core/workflows/sketch-wrap-up.md": "7709bdd7a70f736c", - "gsd-core/workflows/sketch.md": "bfe5a781d6da3ce8", - "gsd-core/workflows/spec-phase.md": "47cea2b5efffa6b0", - "gsd-core/workflows/spike-wrap-up.md": "53a2c51a8d9e6b08", - "gsd-core/workflows/spike.md": "c2f115f0d3251654", - "gsd-core/workflows/stats.md": "0d7449acf349feec", + "gsd-core/workflows/settings-advanced.md": "2cbb05c302f1df5e", + "gsd-core/workflows/settings-integrations.md": "77730321d3d6d317", + "gsd-core/workflows/settings.md": "1e19b0245851afc0", + "gsd-core/workflows/ship.md": "d86233c9a365effd", + "gsd-core/workflows/sketch-wrap-up.md": "07724a390fbb43f6", + "gsd-core/workflows/sketch.md": "576f300dfdde1b7d", + "gsd-core/workflows/smart-entry.md": "6f686195ae531b03", + "gsd-core/workflows/spec-phase.md": "deaec2464a6560ec", + "gsd-core/workflows/spike-wrap-up.md": "ace265c114298376", + "gsd-core/workflows/spike.md": "f42a9983eb9c89a1", + "gsd-core/workflows/stats.md": "6dfc500555849d74", "gsd-core/workflows/sync-skills.md": "e2b793963799f8ce", - "gsd-core/workflows/thread.md": "ee872031abd592e0", - "gsd-core/workflows/transition.md": "c4bded570fafe712", - "gsd-core/workflows/ui-phase.md": "b373c964b222324c", - "gsd-core/workflows/ui-review.md": "a9b2cbba80482cd8", - "gsd-core/workflows/ultraplan-phase.md": "18bbb3b5fcd30f0c", + "gsd-core/workflows/thread.md": "3eef3b6baf50fbfa", + "gsd-core/workflows/transition.md": "423d12e392f5cb87", + "gsd-core/workflows/ui-phase.md": "de272c1e82f49486", + "gsd-core/workflows/ui-review.md": "5768b7aac1429ea0", + "gsd-core/workflows/ultraplan-phase.md": "0bafc2af27be4591", "gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5", - "gsd-core/workflows/update.md": "4166fd3e3ca72a7b", - "gsd-core/workflows/validate-phase.md": "4e94708c9ca15d70", - "gsd-core/workflows/verify-phase.md": "59bb0b12ebb47f5e", - "gsd-core/workflows/verify-work.md": "c5cf0c2fc422fa4e", + "gsd-core/workflows/update.md": "5c35c0ec0f462ea6", + "gsd-core/workflows/validate-phase.md": "020201a41049679f", + "gsd-core/workflows/verify-phase.md": "b9f70235e777aa81", + "gsd-core/workflows/verify-work.md": "69e27f6f419d0bba", "hooks/gsd-check-update.js": "ef48957eb6ac6a10", "hooks/gsd-context-monitor.js": "76fecaaa2babd6c1", "scripts/changeset/README.md": "86ff89331dfd94b2", @@ -381,18 +382,19 @@ "skills/gsd-ingest-docs/SKILL.md": "5bd2838bf0b6dc1b", "skills/gsd-manager/SKILL.md": "cb1cf56f5d3f66d6", "skills/gsd-map-codebase/SKILL.md": "25d0b3adfc8b75dc", - "skills/gsd-mempalace-capture/SKILL.md": "65164de8f661d217", - "skills/gsd-mempalace-recall/SKILL.md": "4fd21539559aed6c", + "skills/gsd-mempalace-capture/SKILL.md": "1a7fac4d53f607ab", + "skills/gsd-mempalace-recall/SKILL.md": "7205b02250e89f25", "skills/gsd-milestone-summary/SKILL.md": "af84ecb400f23556", "skills/gsd-mvp-phase/SKILL.md": "72b65ae927b280fe", "skills/gsd-new-milestone/SKILL.md": "587574d2d475bb10", "skills/gsd-new-project/SKILL.md": "129ac16e6a1f04ba", + "skills/gsd-next/SKILL.md": "7855fd70e387087e", "skills/gsd-ns-context/SKILL.md": "9b496da79789b3f9", "skills/gsd-ns-ideate/SKILL.md": "84ca1cde06110981", "skills/gsd-ns-manage/SKILL.md": "909dafa0cd19ba5a", "skills/gsd-ns-project/SKILL.md": "fb8ad6c2223be3c3", "skills/gsd-ns-review/SKILL.md": "022253010db0e072", - "skills/gsd-ns-workflow/SKILL.md": "14b6b1915178163f", + "skills/gsd-ns-workflow/SKILL.md": "cba075bc819b539e", "skills/gsd-pause-work/SKILL.md": "b379469eed78a196", "skills/gsd-phase/SKILL.md": "25477edc97a90c91", "skills/gsd-plan-phase/SKILL.md": "19ead1acb151a868", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index bc5f66218..06eee9362 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -1,49 +1,49 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.agent.md": "ecd72019cd5634c4", - "agents/gsd-ai-researcher.agent.md": "65c846c74f17a74b", + "agents/gsd-advisor-researcher.agent.md": "1fb10242ff7fb1c9", + "agents/gsd-ai-researcher.agent.md": "8e9c3a2ddd179bb1", "agents/gsd-assumptions-analyzer.agent.md": "cdabed4777a842fe", - "agents/gsd-code-fixer.agent.md": "5a2e0c49f3bb49b4", + "agents/gsd-code-fixer.agent.md": "8f39aacb760aab57", "agents/gsd-code-reviewer.agent.md": "fa1e7c421c78eae1", "agents/gsd-codebase-mapper.agent.md": "949bc73f2a7ea44d", - "agents/gsd-debug-session-manager.agent.md": "dcfe78dafab52ae8", - "agents/gsd-debugger.agent.md": "86512dfcc01a26ff", + "agents/gsd-debug-session-manager.agent.md": "558683230ba311ba", + "agents/gsd-debugger.agent.md": "d31e32f73cd1e0dc", "agents/gsd-doc-classifier.agent.md": "c5025847cf6f968a", "agents/gsd-doc-synthesizer.agent.md": "16cebf04d8998356", "agents/gsd-doc-verifier.agent.md": "0230208ae7ab1a08", "agents/gsd-doc-writer.agent.md": "37ea4932a4b80355", - "agents/gsd-domain-researcher.agent.md": "b06738b093df1cb9", - "agents/gsd-eval-auditor.agent.md": "b30590bbf86d755d", + "agents/gsd-domain-researcher.agent.md": "d603239b3e9fe428", + "agents/gsd-eval-auditor.agent.md": "3c03009564de55c8", "agents/gsd-eval-planner.agent.md": "14751876fc2b5f16", - "agents/gsd-executor.agent.md": "a6ddc10ef4ebb245", + "agents/gsd-executor.agent.md": "0058082fef5a4985", "agents/gsd-framework-selector.agent.md": "cafeec0b3489be45", "agents/gsd-integration-checker.agent.md": "30439b804927acc7", - "agents/gsd-intel-updater.agent.md": "21ea4bd0bb45cc2f", - "agents/gsd-mempalace-curator.agent.md": "bbb2c654e8fbf8fb", + "agents/gsd-intel-updater.agent.md": "238c1a886f35a25c", + "agents/gsd-mempalace-curator.agent.md": "9e5290ea4c4ac211", "agents/gsd-nyquist-auditor.agent.md": "6463a50d90ada125", "agents/gsd-pattern-mapper.agent.md": "b1f488b0fa6a2395", - "agents/gsd-phase-researcher.agent.md": "27882fb95b2e4b4a", - "agents/gsd-plan-checker.agent.md": "f59df0a7c77e3853", - "agents/gsd-planner.agent.md": "9a1a6fe5c2aabab6", - "agents/gsd-project-researcher.agent.md": "5201a4a17353dbac", - "agents/gsd-research-synthesizer.agent.md": "85449c6adf0cae4f", + "agents/gsd-phase-researcher.agent.md": "03cfb510a766fe93", + "agents/gsd-plan-checker.agent.md": "c50a5b008ddcbfad", + "agents/gsd-planner.agent.md": "d40d16eced1c6463", + "agents/gsd-project-researcher.agent.md": "d73bdbe986ffa8a6", + "agents/gsd-research-synthesizer.agent.md": "f03eed4aa89e47c5", "agents/gsd-roadmapper.agent.md": "322048cf8ddcb4e5", "agents/gsd-security-auditor.agent.md": "6f6a88b35dc2a24b", "agents/gsd-ui-auditor.agent.md": "92f50549e84ef482", "agents/gsd-ui-checker.agent.md": "c9958f2587b24156", - "agents/gsd-ui-researcher.agent.md": "8af4f969852166d1", + "agents/gsd-ui-researcher.agent.md": "d24301cc182be33e", "agents/gsd-user-profiler.agent.md": "ae16a248e18dd42b", - "agents/gsd-verifier.agent.md": "ad067649b80e65dc", + "agents/gsd-verifier.agent.md": "87a8e3238e838a39", "copilot-instructions.md": "1fb04111759f1645", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", + "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "10226e9512dd44bf", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -107,7 +107,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "ea950944302fba67", + "gsd-core/references/planning-config.md": "091d7541826f8cb0", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -191,119 +191,120 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "e8483ee6b695820f", - "gsd-core/workflows/add-phase.md": "ccd0c5c85ea3172c", - "gsd-core/workflows/add-tests.md": "3868acebc8a61874", - "gsd-core/workflows/add-todo.md": "69ff299331bbedf1", - "gsd-core/workflows/ai-integration-phase.md": "4b802634f8dfcf58", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "98f2dbb7c7cc93c2", + "gsd-core/workflows/add-phase.md": "34e6dd38c25b5b61", + "gsd-core/workflows/add-tests.md": "e88bc8bc3416bfdd", + "gsd-core/workflows/add-todo.md": "10253591112b7d06", + "gsd-core/workflows/ai-integration-phase.md": "ef0c2474cee76b00", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "bd88277e075ec47f", - "gsd-core/workflows/audit-milestone.md": "3c1624402b54073d", - "gsd-core/workflows/audit-uat.md": "eccd8feb247425b0", - "gsd-core/workflows/autonomous.md": "9a91017ca1ccbaf1", - "gsd-core/workflows/check-todos.md": "4cdc0f448c772fbf", - "gsd-core/workflows/cleanup.md": "a67cfbd98eca5b86", - "gsd-core/workflows/code-review-fix.md": "84d5f91b2856a1f2", - "gsd-core/workflows/code-review.md": "fd8cd5c87ab977c2", - "gsd-core/workflows/complete-milestone.md": "172f380eaa4ffe85", - "gsd-core/workflows/debug.md": "d9a9d4c858da1314", - "gsd-core/workflows/diagnose-issues.md": "3810d5329109a87e", + "gsd-core/workflows/audit-fix.md": "d25431af0ecf6355", + "gsd-core/workflows/audit-milestone.md": "19e03e6d34d96f38", + "gsd-core/workflows/audit-uat.md": "5ea0e30548ed0933", + "gsd-core/workflows/autonomous.md": "dd972ddde9663295", + "gsd-core/workflows/check-todos.md": "be9b50b5f28d7504", + "gsd-core/workflows/cleanup.md": "8233b05ebf011bec", + "gsd-core/workflows/code-review-fix.md": "ab2b467b41522c10", + "gsd-core/workflows/code-review.md": "1bbbe61f45fccf4c", + "gsd-core/workflows/complete-milestone.md": "470cf39261400ee2", + "gsd-core/workflows/debug.md": "36cb536be452d79e", + "gsd-core/workflows/diagnose-issues.md": "42acbe2a43fc886e", "gsd-core/workflows/discovery-phase.md": "8e99da61fb2b7074", - "gsd-core/workflows/discuss-phase-assumptions.md": "38ba3a06ab79f1ce", + "gsd-core/workflows/discuss-phase-assumptions.md": "ab2d26b194805ac1", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "1f4b3bbe790b46c8", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "1247a438ddb8ba36", + "gsd-core/workflows/discuss-phase.md": "31a79ea11c1cdd5f", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "654cdaf1138d5e27", "gsd-core/workflows/discuss-phase/modes/all.md": "e5fe9c9c1e2bec1a", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "7609f2b4b75f41ea", + "gsd-core/workflows/discuss-phase/modes/auto.md": "329ac35098e50297", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "b54a5ee44b9d3a4b", + "gsd-core/workflows/discuss-phase/modes/chain.md": "c30f4a4bcd174259", "gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c", "gsd-core/workflows/discuss-phase/modes/power.md": "9c97731f22d7bce9", "gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4", - "gsd-core/workflows/do.md": "4fe59d153e5d36b9", - "gsd-core/workflows/docs-update.md": "15436f1f87ce9bd2", - "gsd-core/workflows/edit-phase.md": "a619911fd32d1f8e", - "gsd-core/workflows/eval-review.md": "b29095c5e7149975", - "gsd-core/workflows/execute-phase.md": "dcb483d5fceffac1", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8d835dbbc9bc72cf", + "gsd-core/workflows/do.md": "988a20dab90c60c5", + "gsd-core/workflows/docs-update.md": "9292cfa3c52c434e", + "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", + "gsd-core/workflows/eval-review.md": "81c8e72ba3862856", + "gsd-core/workflows/execute-phase.md": "bc0ec0e19ce96269", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "63b712920f21a40f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a01e6aae9f3e416e", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "15f872e83ad87196", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "da6dddd551737699", - "gsd-core/workflows/explore.md": "072bcf510734657b", - "gsd-core/workflows/extract-learnings.md": "83d19c1c9f87f797", + "gsd-core/workflows/execute-plan.md": "c5e9dae726db15cc", + "gsd-core/workflows/explore.md": "5fd91a8510e1114b", + "gsd-core/workflows/extract-learnings.md": "f34d0b1927545b18", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "6b0e23f4dc04dbf9", - "gsd-core/workflows/graduation.md": "e64a735e71c39307", - "gsd-core/workflows/health.md": "56d1a87cf530c9a8", + "gsd-core/workflows/forensics.md": "459644dce26ee2ef", + "gsd-core/workflows/graduation.md": "f013efc29096faf0", + "gsd-core/workflows/health.md": "f343fd32a0e398e4", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "6985d700bbb1cbe5", - "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", - "gsd-core/workflows/import.md": "0e4a8880126d196b", + "gsd-core/workflows/help/modes/full.md": "0e9381367d6257bd", + "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/import.md": "f4fa65e332b00f7e", "gsd-core/workflows/inbox.md": "a448220c548f27bc", - "gsd-core/workflows/ingest-docs.md": "c34b9511b9ea92d8", - "gsd-core/workflows/insert-phase.md": "fc8452ee57b3dbf8", + "gsd-core/workflows/ingest-docs.md": "52be14d1a0713731", + "gsd-core/workflows/insert-phase.md": "60a52a63a8b288f6", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "7040c63f68b59c10", - "gsd-core/workflows/list-workspaces.md": "e8e224465d78e733", - "gsd-core/workflows/manager.md": "c4eac43acf69d7fd", - "gsd-core/workflows/map-codebase.md": "576d06b03edff8db", - "gsd-core/workflows/milestone-summary.md": "a77da1477b8df866", - "gsd-core/workflows/mvp-phase.md": "803ddbd575f86311", - "gsd-core/workflows/new-milestone.md": "4e252aa59b46d88f", - "gsd-core/workflows/new-project.md": "d0af61f0e5f99485", - "gsd-core/workflows/new-workspace.md": "e61ad52a17e7570a", - "gsd-core/workflows/next.md": "a4cb2a110e0bce2c", + "gsd-core/workflows/list-seeds.md": "71dc6f748b1d1c0e", + "gsd-core/workflows/list-workspaces.md": "3c9f76af08ced623", + "gsd-core/workflows/manager.md": "97f57c099a668f83", + "gsd-core/workflows/map-codebase.md": "b426a450e5d90cc3", + "gsd-core/workflows/milestone-summary.md": "8a53906253984a62", + "gsd-core/workflows/mvp-phase.md": "93304b26c92e4418", + "gsd-core/workflows/new-milestone.md": "e5b527a9ba2c7d31", + "gsd-core/workflows/new-project.md": "5c34f0cb064568bd", + "gsd-core/workflows/new-workspace.md": "403796bdf6318515", + "gsd-core/workflows/next.md": "81c08abb34b2da88", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "4a5ee74cf2fc1f54", - "gsd-core/workflows/pause-work.md": "324e04e675dc7f7f", - "gsd-core/workflows/plan-milestone-gaps.md": "c0eb896eb42e22d4", - "gsd-core/workflows/plan-phase.md": "371be4167168d461", + "gsd-core/workflows/pause-work.md": "9ce66367be6c40db", + "gsd-core/workflows/plan-milestone-gaps.md": "5cf589802d08bdf3", + "gsd-core/workflows/plan-phase.md": "da462f812d1d0e61", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d911a080dc1cece6", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "bb052483744f0a6d", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "c238b5858ceb4e57", - "gsd-core/workflows/plant-seed.md": "56451bdf104983b3", - "gsd-core/workflows/pr-branch.md": "a080aed95785cf32", - "gsd-core/workflows/profile-user.md": "f19b17f34ebd4527", - "gsd-core/workflows/progress.md": "09d94d774537e7e0", - "gsd-core/workflows/quick.md": "e694d90e4ef820da", - "gsd-core/workflows/reapply-patches.md": "7e1d16d9a9ccbb03", - "gsd-core/workflows/remove-phase.md": "e94ddfe4eabc0e08", - "gsd-core/workflows/remove-workspace.md": "f28be7f32249f0d4", - "gsd-core/workflows/resume-project.md": "4ebcb4acd3c29302", - "gsd-core/workflows/review.md": "60b8ca1c543ccdfa", - "gsd-core/workflows/scan.md": "28a2847b8d04156e", - "gsd-core/workflows/secure-phase.md": "bae509fa254fe435", + "gsd-core/workflows/plan-review-convergence.md": "9eb16ad0b2d3905b", + "gsd-core/workflows/plant-seed.md": "21e461cd39e5181b", + "gsd-core/workflows/pr-branch.md": "2833905f119b5722", + "gsd-core/workflows/profile-user.md": "5cc032206c99ef71", + "gsd-core/workflows/progress.md": "6b9a84a43dc55af5", + "gsd-core/workflows/quick.md": "7ddfe17f048541ec", + "gsd-core/workflows/reapply-patches.md": "8fd59e24b486f180", + "gsd-core/workflows/remove-phase.md": "e262654e319d1bc4", + "gsd-core/workflows/remove-workspace.md": "ceddfeef5f2d6754", + "gsd-core/workflows/resume-project.md": "40db7f350f5866d8", + "gsd-core/workflows/review.md": "01b40d7ddd69dc8b", + "gsd-core/workflows/scan.md": "dcc2f76d0850e2fb", + "gsd-core/workflows/secure-phase.md": "d87bd706f85bcad6", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "fcb1336c0e3462b3", - "gsd-core/workflows/settings-integrations.md": "58e6551f9f342736", - "gsd-core/workflows/settings.md": "5dda66befcbb3ad8", - "gsd-core/workflows/ship.md": "0ee4d6bc7e34f716", - "gsd-core/workflows/sketch-wrap-up.md": "804bb69e6c3590a0", - "gsd-core/workflows/sketch.md": "b4d17647e0fb9e5d", - "gsd-core/workflows/spec-phase.md": "117abebab62d6df7", - "gsd-core/workflows/spike-wrap-up.md": "e203ed8e057f654c", - "gsd-core/workflows/spike.md": "716d74cdb2e39a3e", - "gsd-core/workflows/stats.md": "49085df6d4793df3", + "gsd-core/workflows/settings-advanced.md": "85f19b66b7d5040f", + "gsd-core/workflows/settings-integrations.md": "a1d146d6bfd14db5", + "gsd-core/workflows/settings.md": "95aa4a9bc0b51e92", + "gsd-core/workflows/ship.md": "b9dc0aaee0ff68e7", + "gsd-core/workflows/sketch-wrap-up.md": "f2590cb6ddbfad94", + "gsd-core/workflows/sketch.md": "e2063966439af8c1", + "gsd-core/workflows/smart-entry.md": "6c707b959a41900b", + "gsd-core/workflows/spec-phase.md": "858184a1966d4d79", + "gsd-core/workflows/spike-wrap-up.md": "a34d1e9ec15ae904", + "gsd-core/workflows/spike.md": "89f299c07ac0edd2", + "gsd-core/workflows/stats.md": "1db01bd96aa570fe", "gsd-core/workflows/sync-skills.md": "eca50ffe8320dba8", - "gsd-core/workflows/thread.md": "d53698a91bbbe33c", - "gsd-core/workflows/transition.md": "724b6e9b34d85f26", - "gsd-core/workflows/ui-phase.md": "9fefa0db49f2aa3f", - "gsd-core/workflows/ui-review.md": "731bca05f9770a86", - "gsd-core/workflows/ultraplan-phase.md": "2dda203295895bc1", + "gsd-core/workflows/thread.md": "c5cbd66223906998", + "gsd-core/workflows/transition.md": "0bb671f58f9522f3", + "gsd-core/workflows/ui-phase.md": "42142cae9ce6df5e", + "gsd-core/workflows/ui-review.md": "2851b3576894ee75", + "gsd-core/workflows/ultraplan-phase.md": "7217c34dc9eaf7bb", "gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd", - "gsd-core/workflows/update.md": "712ab18a9b7c14f5", - "gsd-core/workflows/validate-phase.md": "f923eac9442b6053", - "gsd-core/workflows/verify-phase.md": "eea9b642393b6b90", - "gsd-core/workflows/verify-work.md": "a5bcec82bfc2da53", + "gsd-core/workflows/update.md": "f444a7cfcd246cfb", + "gsd-core/workflows/validate-phase.md": "2f705775a4b76d42", + "gsd-core/workflows/verify-phase.md": "59d1046b3a2bc481", + "gsd-core/workflows/verify-work.md": "58e9b1b16f773b53", "hooks/gsd-session.json": "0a462834f2a28fee", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", @@ -346,18 +347,19 @@ "skills/gsd-ingest-docs/SKILL.md": "10500de29525f6cf", "skills/gsd-manager/SKILL.md": "9946975bec15e737", "skills/gsd-map-codebase/SKILL.md": "75806f8189d8af49", - "skills/gsd-mempalace-capture/SKILL.md": "d7e72629ec3772e2", - "skills/gsd-mempalace-recall/SKILL.md": "5f397524acf592d1", + "skills/gsd-mempalace-capture/SKILL.md": "f4511f69c14befb7", + "skills/gsd-mempalace-recall/SKILL.md": "89523db66f834b2f", "skills/gsd-milestone-summary/SKILL.md": "5ca1dabfe0cd85f0", "skills/gsd-mvp-phase/SKILL.md": "60ac3c3fa6a6a19b", "skills/gsd-new-milestone/SKILL.md": "e5eafe44e271bb92", "skills/gsd-new-project/SKILL.md": "4ce68352221126c6", + "skills/gsd-next/SKILL.md": "16507fc39a3a0684", "skills/gsd-ns-context/SKILL.md": "d61edde87ae53105", "skills/gsd-ns-ideate/SKILL.md": "ca62cdf78ebe3585", "skills/gsd-ns-manage/SKILL.md": "9b1b7f6d9b877fcd", "skills/gsd-ns-project/SKILL.md": "f1a666fb76527e6b", "skills/gsd-ns-review/SKILL.md": "6405d0b1cf3f245d", - "skills/gsd-ns-workflow/SKILL.md": "4f8a304f83832794", + "skills/gsd-ns-workflow/SKILL.md": "243287d21663ba87", "skills/gsd-pause-work/SKILL.md": "4f0caa008a8001ff", "skills/gsd-phase/SKILL.md": "d38c7f9b1d0d2360", "skills/gsd-plan-phase/SKILL.md": "d257bb9b1786039d", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index cdc4b5340..18d47d903 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "abfc97706f16aaaf", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "d2f341335c66c524", + "agents/gsd-code-fixer.md": "76085f4442f268e6", "agents/gsd-code-reviewer.md": "f29d6edbac0a01b6", "agents/gsd-codebase-mapper.md": "d49c91fdab4efc70", - "agents/gsd-debug-session-manager.md": "b5ea52be3681f202", - "agents/gsd-debugger.md": "a5eb6f3a2e90c7fb", + "agents/gsd-debug-session-manager.md": "d6e799fdeb1fadde", + "agents/gsd-debugger.md": "79bccf33fa2b4272", "agents/gsd-doc-classifier.md": "5807f1f7cfa40c42", "agents/gsd-doc-synthesizer.md": "0897098024c17ccd", "agents/gsd-doc-verifier.md": "9934ec11845d41c3", "agents/gsd-doc-writer.md": "73b55c50c0a6bd61", "agents/gsd-domain-researcher.md": "56395dbdabf076f6", - "agents/gsd-eval-auditor.md": "4910c64c0c2d14d5", + "agents/gsd-eval-auditor.md": "ad2840fd5cd76172", "agents/gsd-eval-planner.md": "2049dac060d00eda", - "agents/gsd-executor.md": "6f810a5779d41661", + "agents/gsd-executor.md": "1fb2c778178cfa1c", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "5da30584d06b878c", - "agents/gsd-intel-updater.md": "7f509a2fb5acb0fe", - "agents/gsd-mempalace-curator.md": "63676937f8970bf3", + "agents/gsd-intel-updater.md": "b8971c5d96e63b38", + "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", "agents/gsd-nyquist-auditor.md": "e18b0209cea56a2e", "agents/gsd-pattern-mapper.md": "1229c215677f740d", - "agents/gsd-phase-researcher.md": "ea4e3a03cd0ece30", - "agents/gsd-plan-checker.md": "0f7794651b1d8dba", - "agents/gsd-planner.md": "24fb0a6b37560086", - "agents/gsd-project-researcher.md": "b21a16c82741f50f", - "agents/gsd-research-synthesizer.md": "05177de6f4102b0f", + "agents/gsd-phase-researcher.md": "982d59921bed463d", + "agents/gsd-plan-checker.md": "ba51999876d40cf2", + "agents/gsd-planner.md": "15b5830dafb94517", + "agents/gsd-project-researcher.md": "beeac940d3a10e76", + "agents/gsd-research-synthesizer.md": "6315f016d55176f4", "agents/gsd-roadmapper.md": "d28e7d4bac46dde2", "agents/gsd-security-auditor.md": "5ff44ee432387d93", "agents/gsd-ui-auditor.md": "d824acc3b2a18c53", "agents/gsd-ui-checker.md": "9f0a288ad2c6f56f", - "agents/gsd-ui-researcher.md": "7017298eddc0c835", + "agents/gsd-ui-researcher.md": "1b4d93bd032ebfde", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "eb16a39ea9a0f843", + "agents/gsd-verifier.md": "dea8e61123848fb4", "commands/gsd-add-tests.md": "1f89b16ab2cca426", "commands/gsd-ai-integration-phase.md": "3ccac39673ffb92c", "commands/gsd-audit-fix.md": "d88502ffa2151cec", @@ -63,18 +63,19 @@ "commands/gsd-ingest-docs.md": "9e7f8757b9408c01", "commands/gsd-manager.md": "f300b708a5487c76", "commands/gsd-map-codebase.md": "cf50f4a600119c8a", - "commands/gsd-mempalace-capture.md": "eab7aa94d6e71138", - "commands/gsd-mempalace-recall.md": "7da498f89250cb0f", + "commands/gsd-mempalace-capture.md": "b30bce634ac3136c", + "commands/gsd-mempalace-recall.md": "08c910285469a394", "commands/gsd-milestone-summary.md": "adfad2cf43fc5aad", "commands/gsd-mvp-phase.md": "e8debeee627a0bf2", "commands/gsd-new-milestone.md": "64b997f99b1e6293", "commands/gsd-new-project.md": "f1a6288e80cc16b0", + "commands/gsd-next.md": "e9d8b7c71627e03b", "commands/gsd-ns-context.md": "b551dcc549c6a23f", "commands/gsd-ns-ideate.md": "32f561de74b1bc7b", "commands/gsd-ns-manage.md": "24445a84bd817c5b", "commands/gsd-ns-project.md": "b39b509ac4161d28", "commands/gsd-ns-review.md": "c8550463fbab5e76", - "commands/gsd-ns-workflow.md": "8226be5dc9e99b90", + "commands/gsd-ns-workflow.md": "2c1f1fde3c46bb40", "commands/gsd-pause-work.md": "59630f05f95fff68", "commands/gsd-phase.md": "9a073dcd0f934f90", "commands/gsd-plan-phase.md": "57de92131fcb16b8", @@ -106,12 +107,12 @@ "commands/gsd-workstreams.md": "112660ceb663c750", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", + "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -175,7 +176,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "e2330447f33f6609", + "gsd-core/references/planning-config.md": "a7b41174b754b215", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -259,119 +260,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "05276889f397ae70", - "gsd-core/workflows/add-phase.md": "27164a671e14a789", - "gsd-core/workflows/add-tests.md": "e8a1387538bf94c6", - "gsd-core/workflows/add-todo.md": "d17cd00fa6610666", - "gsd-core/workflows/ai-integration-phase.md": "f103a92a82055846", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "2926457ed07b4500", + "gsd-core/workflows/add-phase.md": "0d90083e9c17bec1", + "gsd-core/workflows/add-tests.md": "1837b9d2affa6913", + "gsd-core/workflows/add-todo.md": "d483ebe8edcf193a", + "gsd-core/workflows/ai-integration-phase.md": "b79f320d59a68773", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04", - "gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12", - "gsd-core/workflows/autonomous.md": "147e36b1795c149c", - "gsd-core/workflows/check-todos.md": "a993c1e7b0eff1f6", - "gsd-core/workflows/cleanup.md": "2bd6ad5f107fe439", - "gsd-core/workflows/code-review-fix.md": "c62547be55f13dcd", - "gsd-core/workflows/code-review.md": "fcb3f24e4cecc737", - "gsd-core/workflows/complete-milestone.md": "36221b9fc6bce09e", - "gsd-core/workflows/debug.md": "2e3c29ded1ce0d28", - "gsd-core/workflows/diagnose-issues.md": "fa7ae5bb16f424a4", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", + "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", + "gsd-core/workflows/autonomous.md": "4b20eda9a0b587ce", + "gsd-core/workflows/check-todos.md": "1a67337d1630848f", + "gsd-core/workflows/cleanup.md": "db47963f103c2748", + "gsd-core/workflows/code-review-fix.md": "49e7f024c551b3a5", + "gsd-core/workflows/code-review.md": "6a9fd2996a6b600e", + "gsd-core/workflows/complete-milestone.md": "1400a4856f592f3e", + "gsd-core/workflows/debug.md": "a73d8018986131ba", + "gsd-core/workflows/diagnose-issues.md": "cd582747131726e3", "gsd-core/workflows/discovery-phase.md": "7dcf150998559c11", - "gsd-core/workflows/discuss-phase-assumptions.md": "6b33545647b2fea4", + "gsd-core/workflows/discuss-phase-assumptions.md": "373788c6b7eab272", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "ed3b4ba5216c2bdb", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "5aa0d0e4198a5364", + "gsd-core/workflows/discuss-phase.md": "14688ff19ce2184c", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "30612a2de153cb5b", "gsd-core/workflows/discuss-phase/modes/all.md": "d2a1d16e2508a0cd", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "be6041997f72b02e", + "gsd-core/workflows/discuss-phase/modes/auto.md": "7ae3410133d7f580", "gsd-core/workflows/discuss-phase/modes/batch.md": "c23d5bdbdb60362c", - "gsd-core/workflows/discuss-phase/modes/chain.md": "c3eab4e57f93bd27", + "gsd-core/workflows/discuss-phase/modes/chain.md": "13d7b2c7d8e5b82e", "gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "adec29a0217b6664", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73", - "gsd-core/workflows/do.md": "e00573dc44d407b5", - "gsd-core/workflows/docs-update.md": "b05a59f3079f6fa7", - "gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c", - "gsd-core/workflows/eval-review.md": "8cc5788e32c15783", - "gsd-core/workflows/execute-phase.md": "c90b217abff9bbb3", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772", + "gsd-core/workflows/do.md": "dc0ddd1f8231d26b", + "gsd-core/workflows/docs-update.md": "e86d7d7e2e3dac6d", + "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", + "gsd-core/workflows/eval-review.md": "a86279dd98dd5c03", + "gsd-core/workflows/execute-phase.md": "f9c628754cd74d0a", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "0f88a132f66b3d8f", - "gsd-core/workflows/explore.md": "aee57d95497ca50a", - "gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3", + "gsd-core/workflows/execute-plan.md": "83dc1bf7f73735c0", + "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", + "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "0162075e44072447", - "gsd-core/workflows/forensics.md": "7ab53bb7de12d655", - "gsd-core/workflows/graduation.md": "d00ac4dfe7e1cc43", - "gsd-core/workflows/health.md": "b53e17edbf70ff96", + "gsd-core/workflows/forensics.md": "a65f817d4a515291", + "gsd-core/workflows/graduation.md": "53a4a6fa3b4e6613", + "gsd-core/workflows/health.md": "e4d770484b5e7496", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "37c5149aae232e61", - "gsd-core/workflows/help/modes/full.md": "b893a940160dbcb9", - "gsd-core/workflows/help/modes/topic.md": "9f00f5f94c5497aa", - "gsd-core/workflows/import.md": "791424ae67c9cf32", + "gsd-core/workflows/help/modes/full.md": "ed31d1afcbd3591f", + "gsd-core/workflows/help/modes/topic.md": "177d351f7465787d", + "gsd-core/workflows/import.md": "5d5fb8e51f6a243a", "gsd-core/workflows/inbox.md": "797c287852eb8957", - "gsd-core/workflows/ingest-docs.md": "b8b06f0561e5e68f", - "gsd-core/workflows/insert-phase.md": "0ab06e370253622b", + "gsd-core/workflows/ingest-docs.md": "c6759dbf17e79293", + "gsd-core/workflows/insert-phase.md": "964ca91863a8749a", "gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620", - "gsd-core/workflows/list-seeds.md": "5c298515026e60b1", - "gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169", - "gsd-core/workflows/manager.md": "cf0f01254eabfec7", - "gsd-core/workflows/map-codebase.md": "d43dffe5098a8684", - "gsd-core/workflows/milestone-summary.md": "2cc908a8e87df942", - "gsd-core/workflows/mvp-phase.md": "542d898e0e9b928f", - "gsd-core/workflows/new-milestone.md": "514a66fe7d07c0f3", - "gsd-core/workflows/new-project.md": "559e93f61313311b", - "gsd-core/workflows/new-workspace.md": "7045e17f5dbdc204", - "gsd-core/workflows/next.md": "6c3900ed84f03670", + "gsd-core/workflows/list-seeds.md": "831ddc27b684e30b", + "gsd-core/workflows/list-workspaces.md": "418570fbc8b938da", + "gsd-core/workflows/manager.md": "7efd6874ff9768d6", + "gsd-core/workflows/map-codebase.md": "3118100462eee628", + "gsd-core/workflows/milestone-summary.md": "6c76386b500cc5d3", + "gsd-core/workflows/mvp-phase.md": "50b189c5f4503369", + "gsd-core/workflows/new-milestone.md": "dbdff965e905117d", + "gsd-core/workflows/new-project.md": "a2b559fba00904eb", + "gsd-core/workflows/new-workspace.md": "9e76e96253d54a57", + "gsd-core/workflows/next.md": "174356dcfd7c6c32", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "1c1e466c764e3deb", - "gsd-core/workflows/pause-work.md": "0be71264eafd16dc", - "gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719", - "gsd-core/workflows/plan-phase.md": "ba95020c3495b191", + "gsd-core/workflows/pause-work.md": "5716362557f44ce4", + "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", + "gsd-core/workflows/plan-phase.md": "c90c001a92fc8a47", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "3bed01c3c906ac52", - "gsd-core/workflows/plan-review-convergence.md": "783c5171101b26b9", - "gsd-core/workflows/plant-seed.md": "b28224f37faa9b95", - "gsd-core/workflows/pr-branch.md": "1f77535b6b156ad9", - "gsd-core/workflows/profile-user.md": "0d86d846075afe0e", - "gsd-core/workflows/progress.md": "098f9bc1243cf6db", - "gsd-core/workflows/quick.md": "4f354f487cecddb5", - "gsd-core/workflows/reapply-patches.md": "2d7dada9edec108b", - "gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09", - "gsd-core/workflows/remove-workspace.md": "dadbb14d9033ea3f", - "gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35", - "gsd-core/workflows/review.md": "141589a39b8c7e18", - "gsd-core/workflows/scan.md": "8e1bbf2eed1752ca", - "gsd-core/workflows/secure-phase.md": "7bd4c335484fd121", + "gsd-core/workflows/plan-review-convergence.md": "b59d9fea4e574025", + "gsd-core/workflows/plant-seed.md": "7bccd151ce7b69f2", + "gsd-core/workflows/pr-branch.md": "c67d90c65da47168", + "gsd-core/workflows/profile-user.md": "8c943983241260b5", + "gsd-core/workflows/progress.md": "65aabee5e8a6dd82", + "gsd-core/workflows/quick.md": "762256cf6d177c06", + "gsd-core/workflows/reapply-patches.md": "ba9406b60f2c4041", + "gsd-core/workflows/remove-phase.md": "ada8a0546c686483", + "gsd-core/workflows/remove-workspace.md": "433affcd1a200826", + "gsd-core/workflows/resume-project.md": "7f8dc986f0f35d96", + "gsd-core/workflows/review.md": "338005f1da182bdc", + "gsd-core/workflows/scan.md": "47371c2073d6c0be", + "gsd-core/workflows/secure-phase.md": "c55975672c4e1895", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "5ea1b546d83f2528", - "gsd-core/workflows/settings-integrations.md": "d6e399eea4b4f3f9", - "gsd-core/workflows/settings.md": "507edbebad95cfc0", - "gsd-core/workflows/ship.md": "597f9423dd372337", - "gsd-core/workflows/sketch-wrap-up.md": "6780757b2db165ac", - "gsd-core/workflows/sketch.md": "4221996fa3d87f7c", - "gsd-core/workflows/spec-phase.md": "fca5397bf040156d", - "gsd-core/workflows/spike-wrap-up.md": "ec64f0f7ab03ef9b", - "gsd-core/workflows/spike.md": "9e37f8067adf87b7", - "gsd-core/workflows/stats.md": "17b4f2059f4b4ef2", + "gsd-core/workflows/settings-advanced.md": "3817a94612e4b588", + "gsd-core/workflows/settings-integrations.md": "166ca51b1f33c2a3", + "gsd-core/workflows/settings.md": "1e285d00022e00ce", + "gsd-core/workflows/ship.md": "38830806d244fe9c", + "gsd-core/workflows/sketch-wrap-up.md": "5be73b7bdf96b539", + "gsd-core/workflows/sketch.md": "373bc0d83368a411", + "gsd-core/workflows/smart-entry.md": "c8fc316358cdcd7b", + "gsd-core/workflows/spec-phase.md": "d6e23579376c9e91", + "gsd-core/workflows/spike-wrap-up.md": "4a3bf1058691e55d", + "gsd-core/workflows/spike.md": "f741bead24d5669a", + "gsd-core/workflows/stats.md": "e7852c5d8f2b05a9", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "cfc42471f9001ba8", - "gsd-core/workflows/transition.md": "96ce39403ca69594", - "gsd-core/workflows/ui-phase.md": "dea2f2d43a43e0d0", - "gsd-core/workflows/ui-review.md": "6b16a7f7783be471", - "gsd-core/workflows/ultraplan-phase.md": "752df97bb6c14ce2", + "gsd-core/workflows/thread.md": "bf9a944978dad763", + "gsd-core/workflows/transition.md": "f6731bbb766929e7", + "gsd-core/workflows/ui-phase.md": "81f029c1bd2431b7", + "gsd-core/workflows/ui-review.md": "4bc0fd55fc037998", + "gsd-core/workflows/ultraplan-phase.md": "466e01d65c350ef6", "gsd-core/workflows/undo.md": "18dec684fb1076f9", - "gsd-core/workflows/update.md": "a27dcfd2814bf2b1", - "gsd-core/workflows/validate-phase.md": "f513c28c01a44cb7", - "gsd-core/workflows/verify-phase.md": "15a999f82868ad29", - "gsd-core/workflows/verify-work.md": "531a00b7f46d08db", + "gsd-core/workflows/update.md": "23e294ba707c3580", + "gsd-core/workflows/validate-phase.md": "2df0c6e298a5f249", + "gsd-core/workflows/verify-phase.md": "0d4ffabc1caa473a", + "gsd-core/workflows/verify-work.md": "145596b2542c457a", "hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f", "hooks/gsd-cursor-session-start.js": "c6e04ed597ea7020", "scripts/changeset/README.md": "86ff89331dfd94b2", @@ -415,18 +417,19 @@ "skills/gsd-ingest-docs/SKILL.md": "01ed9183a00252ee", "skills/gsd-manager/SKILL.md": "62cd9f671a39e8a4", "skills/gsd-map-codebase/SKILL.md": "f529da27d3a30b09", - "skills/gsd-mempalace-capture/SKILL.md": "c6e93f22453145e8", - "skills/gsd-mempalace-recall/SKILL.md": "62c697606d67eddc", + "skills/gsd-mempalace-capture/SKILL.md": "b308823dee547c65", + "skills/gsd-mempalace-recall/SKILL.md": "56f3037091a8bd9a", "skills/gsd-milestone-summary/SKILL.md": "c5dbbc8edb97a7f7", "skills/gsd-mvp-phase/SKILL.md": "9d8e2999fa9f7830", "skills/gsd-new-milestone/SKILL.md": "642d0741c89b911a", "skills/gsd-new-project/SKILL.md": "18f587ac0b390d94", + "skills/gsd-next/SKILL.md": "75ef1905cb7425e1", "skills/gsd-ns-context/SKILL.md": "dcf5711653d57354", "skills/gsd-ns-ideate/SKILL.md": "0114f0bc5501c1e3", "skills/gsd-ns-manage/SKILL.md": "f3232d05d5263f5b", "skills/gsd-ns-project/SKILL.md": "9f737a544e8d3f31", "skills/gsd-ns-review/SKILL.md": "8c686e92f293bfdd", - "skills/gsd-ns-workflow/SKILL.md": "180031baca2f6d24", + "skills/gsd-ns-workflow/SKILL.md": "c379192bd17d47d7", "skills/gsd-pause-work/SKILL.md": "10e7531a2cb392ad", "skills/gsd-phase/SKILL.md": "1a2c9b64c1af7ffc", "skills/gsd-plan-phase/SKILL.md": "0784da05d41dcfe7", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index b11edef4d..e606ab097 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -1,48 +1,48 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.md": "f3f0a55854689045", - "agents/gsd-ai-researcher.md": "72f67082f35c9da1", + "agents/gsd-advisor-researcher.md": "f1c4a47d3d8cea72", + "agents/gsd-ai-researcher.md": "08847faf5494ff08", "agents/gsd-assumptions-analyzer.md": "f11a80795163bb5d", - "agents/gsd-code-fixer.md": "58a5ef0369ba21f8", + "agents/gsd-code-fixer.md": "94628312f25decb5", "agents/gsd-code-reviewer.md": "5ef947ca5baed775", "agents/gsd-codebase-mapper.md": "feccaeeacd05e34b", - "agents/gsd-debug-session-manager.md": "6dd3555fa4ea8e93", - "agents/gsd-debugger.md": "ecf2d6736db0c33e", + "agents/gsd-debug-session-manager.md": "e0bdc1947db579c4", + "agents/gsd-debugger.md": "ec4f796f5c39504a", "agents/gsd-doc-classifier.md": "5de2a66c751b2d58", "agents/gsd-doc-synthesizer.md": "8e6fb8220f777022", "agents/gsd-doc-verifier.md": "d3d8457bdd44bf10", "agents/gsd-doc-writer.md": "2858a8335170e85c", - "agents/gsd-domain-researcher.md": "d4c07520f650ffd5", - "agents/gsd-eval-auditor.md": "254220230f69ac46", + "agents/gsd-domain-researcher.md": "412cdbb05ba252ea", + "agents/gsd-eval-auditor.md": "4ffb265063c318e5", "agents/gsd-eval-planner.md": "03448fc9c5774b56", - "agents/gsd-executor.md": "ddc4b274f05f59d0", + "agents/gsd-executor.md": "18365948be7c2dff", "agents/gsd-framework-selector.md": "ea9981d65d6b3429", "agents/gsd-integration-checker.md": "35b4f2969d279871", - "agents/gsd-intel-updater.md": "03e143f85ab105ed", - "agents/gsd-mempalace-curator.md": "576b8d0db51bc462", + "agents/gsd-intel-updater.md": "5fe5edfae2719cb8", + "agents/gsd-mempalace-curator.md": "399e90e473b33814", "agents/gsd-nyquist-auditor.md": "8bfde4a9a36318aa", "agents/gsd-pattern-mapper.md": "cea092600aeb3978", - "agents/gsd-phase-researcher.md": "2b5e6805717399d9", - "agents/gsd-plan-checker.md": "8019a01df555f1e1", - "agents/gsd-planner.md": "c944474b7dd450d4", - "agents/gsd-project-researcher.md": "95e860350a6c1b7c", - "agents/gsd-research-synthesizer.md": "418dbd61eee9308d", + "agents/gsd-phase-researcher.md": "2bd0402f33d757ca", + "agents/gsd-plan-checker.md": "4b4e2b475bf5b5c3", + "agents/gsd-planner.md": "018542e335a983fa", + "agents/gsd-project-researcher.md": "425a7df7f37a5c06", + "agents/gsd-research-synthesizer.md": "9d31c87fc2c87ffa", "agents/gsd-roadmapper.md": "64dce5d5f9fa5654", "agents/gsd-security-auditor.md": "e4d35ada4ea67d7f", "agents/gsd-ui-auditor.md": "86797e85f718dfac", "agents/gsd-ui-checker.md": "c56fa63fb94ded5f", - "agents/gsd-ui-researcher.md": "fff7c2920da4b8af", + "agents/gsd-ui-researcher.md": "25ffa7fa83c32a69", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", - "agents/gsd-verifier.md": "c5916e463df6306e", + "agents/gsd-verifier.md": "82d3e9015ed04017", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -106,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "9b5f8ed49024cdbf", + "gsd-core/references/planning-config.md": "b5a719401e701e12", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -190,119 +190,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "73e5ca92d9456f53", - "gsd-core/workflows/add-phase.md": "3683d413f223f138", - "gsd-core/workflows/add-tests.md": "49524ea9e54535b6", - "gsd-core/workflows/add-todo.md": "cc4a1b90384ad7b9", - "gsd-core/workflows/ai-integration-phase.md": "006583b7f234af02", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "79a453a2270483fb", + "gsd-core/workflows/add-phase.md": "b4c4b32c111a116a", + "gsd-core/workflows/add-tests.md": "63390575b418e270", + "gsd-core/workflows/add-todo.md": "5fe3ddc3227e0e22", + "gsd-core/workflows/ai-integration-phase.md": "ddab2912d025db65", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "5aded4cc2682502b", - "gsd-core/workflows/audit-milestone.md": "c36d1c46d4aecca7", - "gsd-core/workflows/audit-uat.md": "5e93ef61f91ad0c0", - "gsd-core/workflows/autonomous.md": "9bcaed473e38a7a5", - "gsd-core/workflows/check-todos.md": "8807759cc4df46c0", - "gsd-core/workflows/cleanup.md": "6380894e67d2435d", - "gsd-core/workflows/code-review-fix.md": "5090840d834ec31a", - "gsd-core/workflows/code-review.md": "29046f7fa6a9d40a", - "gsd-core/workflows/complete-milestone.md": "7bd066db127dc274", - "gsd-core/workflows/debug.md": "5840a39f14a029c4", - "gsd-core/workflows/diagnose-issues.md": "b350281a56ee5832", + "gsd-core/workflows/audit-fix.md": "cc6270e912471cc2", + "gsd-core/workflows/audit-milestone.md": "806d346ee5bfe9f8", + "gsd-core/workflows/audit-uat.md": "86d9131fccabf2ad", + "gsd-core/workflows/autonomous.md": "dd572ca89862e5ec", + "gsd-core/workflows/check-todos.md": "ea9a303c48a5d752", + "gsd-core/workflows/cleanup.md": "6c488059fc152a49", + "gsd-core/workflows/code-review-fix.md": "04b143a963067236", + "gsd-core/workflows/code-review.md": "ff28724fc216972c", + "gsd-core/workflows/complete-milestone.md": "f1866541148dc291", + "gsd-core/workflows/debug.md": "15cf6999e85dcc8c", + "gsd-core/workflows/diagnose-issues.md": "16f2d2a85335641f", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", - "gsd-core/workflows/discuss-phase-assumptions.md": "c158386c6cd92bd5", + "gsd-core/workflows/discuss-phase-assumptions.md": "db60ec68b59a40eb", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "f6aa630f777d3006", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "432c381a366be630", + "gsd-core/workflows/discuss-phase.md": "0aa052ae4ee70bf6", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "536e2fa842f1bc95", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "524aaa69ae3a9ee5", + "gsd-core/workflows/discuss-phase/modes/auto.md": "af2d9d6ebb3f69c9", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "1a6400d7663d7643", + "gsd-core/workflows/discuss-phase/modes/chain.md": "eff83e92368c983a", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "e6d930e2b6769e49", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "a1a891c1d5d58d67", - "gsd-core/workflows/docs-update.md": "c9df0f7df1ebec79", - "gsd-core/workflows/edit-phase.md": "57d807e21fe70355", - "gsd-core/workflows/eval-review.md": "d16eebac88386c05", - "gsd-core/workflows/execute-phase.md": "0167a319ed9a5bc5", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b890bafa4a0c8bd3", + "gsd-core/workflows/do.md": "045e70c238db6faf", + "gsd-core/workflows/docs-update.md": "4d6c06e611d83b6d", + "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", + "gsd-core/workflows/eval-review.md": "f510e5762212dc6f", + "gsd-core/workflows/execute-phase.md": "c449a87fcca14433", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "ceb8758c22660c1a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e34415dec69b8432", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "3ab8bc8a07133068", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "eb5de66a1cb41271", - "gsd-core/workflows/explore.md": "1c0f3ced293df114", - "gsd-core/workflows/extract-learnings.md": "c6cfb696d3bb51c7", + "gsd-core/workflows/execute-plan.md": "4dbe9b6f0c976245", + "gsd-core/workflows/explore.md": "48770d68e8b9c132", + "gsd-core/workflows/extract-learnings.md": "e9e167c718949c0b", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "1362bc42a2928d79", - "gsd-core/workflows/graduation.md": "1fb19f28634dd55a", - "gsd-core/workflows/health.md": "32c1276656602ccb", + "gsd-core/workflows/forensics.md": "91961b811917c5c4", + "gsd-core/workflows/graduation.md": "d1fd52bbe41dcf34", + "gsd-core/workflows/health.md": "c622a5ad0d347d30", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "bb6876c976996dbd", - "gsd-core/workflows/help/modes/full.md": "2df924dd3815ff0e", - "gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd", - "gsd-core/workflows/import.md": "da7ca19f487c6b60", + "gsd-core/workflows/help/modes/full.md": "fdab4b3690bdd11d", + "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", + "gsd-core/workflows/import.md": "a441445515bc2dd5", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", - "gsd-core/workflows/ingest-docs.md": "8adc1e35097abce2", - "gsd-core/workflows/insert-phase.md": "dad4479236245bd9", + "gsd-core/workflows/ingest-docs.md": "ad496a4c423f1ab7", + "gsd-core/workflows/insert-phase.md": "a0537c09191121f6", "gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c", - "gsd-core/workflows/list-seeds.md": "e4f9d7c12c162ef7", - "gsd-core/workflows/list-workspaces.md": "d3726de6b2eb40b4", - "gsd-core/workflows/manager.md": "c8690740c613f1a5", - "gsd-core/workflows/map-codebase.md": "23fae66ceef58e1c", - "gsd-core/workflows/milestone-summary.md": "d7ac63499e3e5c1a", - "gsd-core/workflows/mvp-phase.md": "5ce3c326ef0f6e27", - "gsd-core/workflows/new-milestone.md": "97750332c52a9ef7", - "gsd-core/workflows/new-project.md": "40c94cfb81bde99b", - "gsd-core/workflows/new-workspace.md": "af3397e97cec7d0b", - "gsd-core/workflows/next.md": "e044321fdd6b5e9c", + "gsd-core/workflows/list-seeds.md": "ad1d81683e48c4e1", + "gsd-core/workflows/list-workspaces.md": "1fe28ba52cee1394", + "gsd-core/workflows/manager.md": "b0322e4514de4c4d", + "gsd-core/workflows/map-codebase.md": "7db2e66647dd3c34", + "gsd-core/workflows/milestone-summary.md": "353fffb60749d892", + "gsd-core/workflows/mvp-phase.md": "4d102523b5d81f95", + "gsd-core/workflows/new-milestone.md": "4988e2b33d02075d", + "gsd-core/workflows/new-project.md": "c596ec378d462fdb", + "gsd-core/workflows/new-workspace.md": "5c78c58ad84e886b", + "gsd-core/workflows/next.md": "8e1fa29751d96564", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", - "gsd-core/workflows/pause-work.md": "2c3abcaa1fa6d2e2", - "gsd-core/workflows/plan-milestone-gaps.md": "419744c1191354af", - "gsd-core/workflows/plan-phase.md": "e1dcabd0499a03f9", + "gsd-core/workflows/pause-work.md": "ae2d5789a95f70fe", + "gsd-core/workflows/plan-milestone-gaps.md": "c86cdc1964256b98", + "gsd-core/workflows/plan-phase.md": "e995429805b69fdc", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "99949122a3bd455e", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "9607e6d03e93c1c2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "62f8e4f3b475fe5f", - "gsd-core/workflows/plan-review-convergence.md": "8ebcd05fcd5a0d15", - "gsd-core/workflows/plant-seed.md": "76379e2aeb18d53b", - "gsd-core/workflows/pr-branch.md": "79f4d93e31af9c49", - "gsd-core/workflows/profile-user.md": "8474c1e203be5c8c", - "gsd-core/workflows/progress.md": "173b166cd30fca13", - "gsd-core/workflows/quick.md": "e931e0d4b734eccb", - "gsd-core/workflows/reapply-patches.md": "7af45bb3f2fdd1b8", - "gsd-core/workflows/remove-phase.md": "f27cecd8c78008ae", - "gsd-core/workflows/remove-workspace.md": "977155e18b9df623", - "gsd-core/workflows/resume-project.md": "849f3d49d366ff13", - "gsd-core/workflows/review.md": "06cd9992e289b241", - "gsd-core/workflows/scan.md": "cbde2b8b2b5fa5dd", - "gsd-core/workflows/secure-phase.md": "5fc8fbd5e217e48d", + "gsd-core/workflows/plan-review-convergence.md": "277e3495fb982045", + "gsd-core/workflows/plant-seed.md": "f862f77fca983749", + "gsd-core/workflows/pr-branch.md": "ecabd55e4eabf229", + "gsd-core/workflows/profile-user.md": "de5030437226cf2c", + "gsd-core/workflows/progress.md": "f18db000584d9cb1", + "gsd-core/workflows/quick.md": "5044ce4e7512e174", + "gsd-core/workflows/reapply-patches.md": "158083a310859594", + "gsd-core/workflows/remove-phase.md": "fce799aae3ab2715", + "gsd-core/workflows/remove-workspace.md": "8facde381657dd71", + "gsd-core/workflows/resume-project.md": "a0443839f1f83c2d", + "gsd-core/workflows/review.md": "f11ffe5b46b50565", + "gsd-core/workflows/scan.md": "b28f65d88c522767", + "gsd-core/workflows/secure-phase.md": "f2957d4b88fb3746", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "175388eee8afea48", - "gsd-core/workflows/settings-integrations.md": "ab490f2d5c7bbf34", - "gsd-core/workflows/settings.md": "9e35a3fedb0a8f53", - "gsd-core/workflows/ship.md": "3f6e6424d089d4d0", - "gsd-core/workflows/sketch-wrap-up.md": "eb5f0849f07479aa", - "gsd-core/workflows/sketch.md": "9a712af64fc2fff8", - "gsd-core/workflows/spec-phase.md": "79f136ab71edf595", - "gsd-core/workflows/spike-wrap-up.md": "79e23a81bb74bc95", - "gsd-core/workflows/spike.md": "80844a3c05339fdb", - "gsd-core/workflows/stats.md": "01289f444b66913d", + "gsd-core/workflows/settings-advanced.md": "9a45f0e5b8acf83d", + "gsd-core/workflows/settings-integrations.md": "1dce76db0aca08a5", + "gsd-core/workflows/settings.md": "cb2b6be87c519df9", + "gsd-core/workflows/ship.md": "dbf8bf636cb196c0", + "gsd-core/workflows/sketch-wrap-up.md": "f1ece50ac65ea281", + "gsd-core/workflows/sketch.md": "d5887983e62b574a", + "gsd-core/workflows/smart-entry.md": "47f5c5e8608e5f7a", + "gsd-core/workflows/spec-phase.md": "6c8835fc65ea1cb8", + "gsd-core/workflows/spike-wrap-up.md": "367325e6d567b904", + "gsd-core/workflows/spike.md": "cdacb2887a321e11", + "gsd-core/workflows/stats.md": "49a991d0d3905a56", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "596bf37dcea2ce1e", - "gsd-core/workflows/transition.md": "adab3f53afd5d8aa", - "gsd-core/workflows/ui-phase.md": "dd213d91b5c258a5", - "gsd-core/workflows/ui-review.md": "83d6d3b1f26597ff", - "gsd-core/workflows/ultraplan-phase.md": "600377d719253f14", + "gsd-core/workflows/thread.md": "5a6759e01763c2a6", + "gsd-core/workflows/transition.md": "2f65c0e12675ea08", + "gsd-core/workflows/ui-phase.md": "082a41a0549211fe", + "gsd-core/workflows/ui-review.md": "bc0ae72c0e1cab94", + "gsd-core/workflows/ultraplan-phase.md": "0d103bf2622436f7", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", - "gsd-core/workflows/update.md": "472d4905fc8c5ce5", - "gsd-core/workflows/validate-phase.md": "067acd7aeed52c5b", - "gsd-core/workflows/verify-phase.md": "4e1d99795e8e9413", - "gsd-core/workflows/verify-work.md": "e93eb5a56b769694", + "gsd-core/workflows/update.md": "7499bb4cb2a3ce6f", + "gsd-core/workflows/validate-phase.md": "75e8971d3981d06b", + "gsd-core/workflows/verify-phase.md": "84e00bd685006870", + "gsd-core/workflows/verify-work.md": "e56e07475d5eb51e", "hooks/gsd-check-update-worker.js": "7989cc2bedd1138d", "hooks/gsd-check-update.js": "25f5ad726f76fc11", "hooks/gsd-config-reload.js": "880b696458e85e9b", @@ -344,8 +345,8 @@ "skills/gsd/gsd-ns-context/skills/extract-learnings/SKILL.md": "36e59d6e514dcaf0", "skills/gsd/gsd-ns-context/skills/graphify/SKILL.md": "169eefd42c444cde", "skills/gsd/gsd-ns-context/skills/map-codebase/SKILL.md": "6062ccca1a14b827", - "skills/gsd/gsd-ns-context/skills/mempalace-capture/SKILL.md": "1565901c4833a49e", - "skills/gsd/gsd-ns-context/skills/mempalace-recall/SKILL.md": "eba3ad69c0e7b157", + "skills/gsd/gsd-ns-context/skills/mempalace-capture/SKILL.md": "3fa619f73834c436", + "skills/gsd/gsd-ns-context/skills/mempalace-recall/SKILL.md": "5d06922e0d7ab7d9", "skills/gsd/gsd-ns-ideate/SKILL.md": "b36bb4700ed6723a", "skills/gsd/gsd-ns-ideate/skills/capture/SKILL.md": "76fc7c1200124ece", "skills/gsd/gsd-ns-ideate/skills/explore/SKILL.md": "bb39acf6117cb9ca", @@ -393,7 +394,7 @@ "skills/gsd/gsd-ns-review/skills/ui-phase/SKILL.md": "3207854a4f0fab67", "skills/gsd/gsd-ns-review/skills/ui-review/SKILL.md": "512c54662616c3f9", "skills/gsd/gsd-ns-review/skills/validate-phase/SKILL.md": "f2c31c34fc8e24c4", - "skills/gsd/gsd-ns-workflow/SKILL.md": "a5c0c299df224d10", + "skills/gsd/gsd-ns-workflow/SKILL.md": "f54502a2c6bf5495", "skills/gsd/gsd-ns-workflow/skills/add-tests/SKILL.md": "29e5863322ad6f2d", "skills/gsd/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "317912c0488d701b", "skills/gsd/gsd-ns-workflow/skills/autonomous/SKILL.md": "3c9bc726e13c4916", @@ -401,6 +402,7 @@ "skills/gsd/gsd-ns-workflow/skills/execute-phase/SKILL.md": "a2e4e6211e09b3c0", "skills/gsd/gsd-ns-workflow/skills/fast/SKILL.md": "c8517ba44da99147", "skills/gsd/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "0804dfd4124526ba", + "skills/gsd/gsd-ns-workflow/skills/next/SKILL.md": "1d30cf6061d15168", "skills/gsd/gsd-ns-workflow/skills/phase/SKILL.md": "610bd06d71198849", "skills/gsd/gsd-ns-workflow/skills/plan-phase/SKILL.md": "f06f0e2fc8def3f0", "skills/gsd/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "fddf8bd7b3ae1f10", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index 0a5a456c2..a7e46a99d 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "3296fc4edef47f2e", "agents/gsd-ai-researcher.md": "9607993fbaafe9ba", "agents/gsd-assumptions-analyzer.md": "567d823ccd036b39", - "agents/gsd-code-fixer.md": "a4444d9f58a53613", + "agents/gsd-code-fixer.md": "9652d5b56a2afbf5", "agents/gsd-code-reviewer.md": "922c08885bc78662", "agents/gsd-codebase-mapper.md": "0ccbf6a685804979", - "agents/gsd-debug-session-manager.md": "5fd509a86b1335b7", - "agents/gsd-debugger.md": "11e791e0509959b1", + "agents/gsd-debug-session-manager.md": "828335b15a46b324", + "agents/gsd-debugger.md": "b59cda547363e617", "agents/gsd-doc-classifier.md": "dd7670f4fb345994", "agents/gsd-doc-synthesizer.md": "1e987faef95a8c71", "agents/gsd-doc-verifier.md": "8016f792d0766b77", "agents/gsd-doc-writer.md": "72a21cf92542f6c0", "agents/gsd-domain-researcher.md": "a3874d80bcbc7380", - "agents/gsd-eval-auditor.md": "d8c45cef7ddf4360", + "agents/gsd-eval-auditor.md": "630d4cd3bd6ea195", "agents/gsd-eval-planner.md": "3db12cde12aeb2c1", - "agents/gsd-executor.md": "7f18fa638ef50584", + "agents/gsd-executor.md": "c9aca9129bd4cab3", "agents/gsd-framework-selector.md": "ad5f2c6b9bec6270", "agents/gsd-integration-checker.md": "c503e2f4a3d8ec05", - "agents/gsd-intel-updater.md": "b8eb72873ded3c14", - "agents/gsd-mempalace-curator.md": "6461da48ed937556", + "agents/gsd-intel-updater.md": "231393da62a45b2e", + "agents/gsd-mempalace-curator.md": "c6a7fe754b6ca5e1", "agents/gsd-nyquist-auditor.md": "7bc3cc159c7be987", "agents/gsd-pattern-mapper.md": "6a5408fd11d70391", - "agents/gsd-phase-researcher.md": "46c7ca1f62f9e02b", - "agents/gsd-plan-checker.md": "a4e32c58903176ef", - "agents/gsd-planner.md": "dc90faf53dc728ce", - "agents/gsd-project-researcher.md": "e6251b65176972c7", - "agents/gsd-research-synthesizer.md": "c56fc6fd7f96c95c", + "agents/gsd-phase-researcher.md": "94818f28c498bb26", + "agents/gsd-plan-checker.md": "56164206242c8caf", + "agents/gsd-planner.md": "5adf9f02c77d6859", + "agents/gsd-project-researcher.md": "60573a38d3dfd9fe", + "agents/gsd-research-synthesizer.md": "1f7cd286c5783c86", "agents/gsd-roadmapper.md": "277e0a3252553ab7", "agents/gsd-security-auditor.md": "0113435969e869c4", "agents/gsd-ui-auditor.md": "9b988b95d28e56ed", "agents/gsd-ui-checker.md": "e27fd54c34ce79b8", - "agents/gsd-ui-researcher.md": "79ab871e0be9e889", + "agents/gsd-ui-researcher.md": "68b046253268aa64", "agents/gsd-user-profiler.md": "b8cb09319c517701", - "agents/gsd-verifier.md": "b3d833b6ede458ef", + "agents/gsd-verifier.md": "af609b1959cde3f3", "command/gsd-add-tests.md": "c314f9a6be312bfa", "command/gsd-ai-integration-phase.md": "bbab86a540e00db5", "command/gsd-audit-fix.md": "4106e9dce9b71585", @@ -63,18 +63,19 @@ "command/gsd-ingest-docs.md": "e655ecf1d4433ba9", "command/gsd-manager.md": "1cdc133079833552", "command/gsd-map-codebase.md": "186c8f79319abc1c", - "command/gsd-mempalace-capture.md": "08b9750f1b1d1ba6", - "command/gsd-mempalace-recall.md": "2316f1a950490845", + "command/gsd-mempalace-capture.md": "a94ca275cbe7134c", + "command/gsd-mempalace-recall.md": "d358cdd89c935877", "command/gsd-milestone-summary.md": "4ab29b777f62f0bb", "command/gsd-mvp-phase.md": "273a1c26ca13274b", "command/gsd-new-milestone.md": "a315b3205c5d3470", "command/gsd-new-project.md": "f2763e2ccbb70ebe", + "command/gsd-next.md": "dfdcfb2fd79957fa", "command/gsd-ns-context.md": "9a2b55b64f2e1e4b", "command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f", "command/gsd-ns-manage.md": "eded59052ca4b240", "command/gsd-ns-project.md": "91417cf7b76581dd", "command/gsd-ns-review.md": "61fe33e28eb1b961", - "command/gsd-ns-workflow.md": "3352c292c27fe50b", + "command/gsd-ns-workflow.md": "13c1ab91080c0cc3", "command/gsd-pause-work.md": "04e993b1c9f8322b", "command/gsd-phase.md": "8f0e98dc6c223229", "command/gsd-plan-phase.md": "b37e9a61f946c975", @@ -106,12 +107,12 @@ "command/gsd-workstreams.md": "5e57eed1881c3891", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -175,7 +176,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "4acefb3c71169c84", + "gsd-core/references/planning-config.md": "af0a9694b3c39557", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -259,119 +260,120 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "5095b6e69b4e380a", - "gsd-core/workflows/add-phase.md": "27164a671e14a789", - "gsd-core/workflows/add-tests.md": "5bb66a4f4c6839bb", - "gsd-core/workflows/add-todo.md": "1a3b827cda68adde", - "gsd-core/workflows/ai-integration-phase.md": "87b004f0f20fe211", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "485c4b6673ddf832", + "gsd-core/workflows/add-phase.md": "0d90083e9c17bec1", + "gsd-core/workflows/add-tests.md": "ecb959f321820e5e", + "gsd-core/workflows/add-todo.md": "5082510bf0449204", + "gsd-core/workflows/ai-integration-phase.md": "c85c6afdc64f0da6", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04", - "gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12", - "gsd-core/workflows/autonomous.md": "141625e98f4c6a41", - "gsd-core/workflows/check-todos.md": "cde0a3025828bad8", - "gsd-core/workflows/cleanup.md": "d124682912dab9f6", - "gsd-core/workflows/code-review-fix.md": "a416c764425cbb61", - "gsd-core/workflows/code-review.md": "3999e5bc9ce9171e", - "gsd-core/workflows/complete-milestone.md": "d0f7e0599ab54dca", - "gsd-core/workflows/debug.md": "0fa12d266c29d9d4", - "gsd-core/workflows/diagnose-issues.md": "af98c318e0aa27bf", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", + "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", + "gsd-core/workflows/autonomous.md": "73f429f7472c9949", + "gsd-core/workflows/check-todos.md": "ed4b4eb12be222d7", + "gsd-core/workflows/cleanup.md": "c5f1bf186395d67d", + "gsd-core/workflows/code-review-fix.md": "adb62c695b39ef61", + "gsd-core/workflows/code-review.md": "6c40b95e799907d0", + "gsd-core/workflows/complete-milestone.md": "59753bf44d4300da", + "gsd-core/workflows/debug.md": "a72d830ac3df74aa", + "gsd-core/workflows/diagnose-issues.md": "210b5b313e8a559a", "gsd-core/workflows/discovery-phase.md": "ca7b2be46e59e862", - "gsd-core/workflows/discuss-phase-assumptions.md": "6419d394b232d7b0", + "gsd-core/workflows/discuss-phase-assumptions.md": "36f7edcb666745f2", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "322f0c5d18b87e5a", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "0b16982b70abfcc2", + "gsd-core/workflows/discuss-phase.md": "bd4b26ba168bb51f", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "f8ae26ba4e07672b", "gsd-core/workflows/discuss-phase/modes/all.md": "5ed71228ac96e728", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "28dc6398e331b418", + "gsd-core/workflows/discuss-phase/modes/auto.md": "e6d4ef26786946ea", "gsd-core/workflows/discuss-phase/modes/batch.md": "78f6ef61690acb66", - "gsd-core/workflows/discuss-phase/modes/chain.md": "b16547a6b0423579", + "gsd-core/workflows/discuss-phase/modes/chain.md": "ecdb88a9aa70d5bf", "gsd-core/workflows/discuss-phase/modes/default.md": "5d12f2593ae4a813", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275", - "gsd-core/workflows/do.md": "c1aeb36469f7badc", - "gsd-core/workflows/docs-update.md": "87bf2a6b7b6ec9db", - "gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c", - "gsd-core/workflows/eval-review.md": "f6183650f7fcabf9", - "gsd-core/workflows/execute-phase.md": "5c4b59ee5e04a022", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772", + "gsd-core/workflows/do.md": "1e6102574016b150", + "gsd-core/workflows/docs-update.md": "79afaaf19fd527cc", + "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", + "gsd-core/workflows/eval-review.md": "926eda8bbee28b23", + "gsd-core/workflows/execute-phase.md": "17cf87593b833b6d", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "9b96f0ef3d149b2c", - "gsd-core/workflows/explore.md": "a1aa05e598caf7e3", - "gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3", + "gsd-core/workflows/execute-plan.md": "8dc89b35582407f7", + "gsd-core/workflows/explore.md": "14242d36d4822df6", + "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "ec9dc257272a6980", - "gsd-core/workflows/graduation.md": "fc01dc810d4845f8", - "gsd-core/workflows/health.md": "955d5ebacd5740e6", + "gsd-core/workflows/forensics.md": "c01da0178fb97b21", + "gsd-core/workflows/graduation.md": "5cc8638dabcbfd40", + "gsd-core/workflows/health.md": "064b3668d5d9569a", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "89044c816457cf48", - "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", - "gsd-core/workflows/import.md": "95734bf6d48ef776", + "gsd-core/workflows/help/modes/full.md": "051f9633f45558b4", + "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/import.md": "f8bbe6f2c0e08a78", "gsd-core/workflows/inbox.md": "a073396097c89c01", - "gsd-core/workflows/ingest-docs.md": "270a4dc138d239c4", - "gsd-core/workflows/insert-phase.md": "0ab06e370253622b", + "gsd-core/workflows/ingest-docs.md": "29c1fe28bc93b345", + "gsd-core/workflows/insert-phase.md": "964ca91863a8749a", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "da9511b569ada7f9", - "gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169", - "gsd-core/workflows/manager.md": "bedfe8a2a48a9605", - "gsd-core/workflows/map-codebase.md": "fcc2796ebf8ea2c7", - "gsd-core/workflows/milestone-summary.md": "93ba0d0005f73c35", - "gsd-core/workflows/mvp-phase.md": "3935c0d9969e3e84", - "gsd-core/workflows/new-milestone.md": "9abdd85c65989620", - "gsd-core/workflows/new-project.md": "0dce9298c090bdb4", - "gsd-core/workflows/new-workspace.md": "074efbc589061182", - "gsd-core/workflows/next.md": "0a9b4e23ac0bf7ea", + "gsd-core/workflows/list-seeds.md": "5a46337f55ae8453", + "gsd-core/workflows/list-workspaces.md": "418570fbc8b938da", + "gsd-core/workflows/manager.md": "f3d17d2ae11ec7b5", + "gsd-core/workflows/map-codebase.md": "c3d6418d64ba2994", + "gsd-core/workflows/milestone-summary.md": "25775eeb4e2747be", + "gsd-core/workflows/mvp-phase.md": "a97708464f103300", + "gsd-core/workflows/new-milestone.md": "74779ede3babb04c", + "gsd-core/workflows/new-project.md": "6d8cd0b4fe813374", + "gsd-core/workflows/new-workspace.md": "f58d6a8c0c7796a1", + "gsd-core/workflows/next.md": "888297a0b21888ea", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "f8c2842a2217f776", - "gsd-core/workflows/pause-work.md": "8b81699a46ca8e9b", - "gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719", - "gsd-core/workflows/plan-phase.md": "a7642fb6484cf12e", + "gsd-core/workflows/pause-work.md": "a6e5336c409fdc8b", + "gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e", + "gsd-core/workflows/plan-phase.md": "03e59f06885e200f", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "44a12264f8b61d03", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "f10975692cbd036e", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "88e294a5cc616e90", - "gsd-core/workflows/plant-seed.md": "249d3c6b4d474106", - "gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5", - "gsd-core/workflows/profile-user.md": "9d0f46424df26c8f", - "gsd-core/workflows/progress.md": "e7522beba5bd09b6", - "gsd-core/workflows/quick.md": "65143f5d8292724d", - "gsd-core/workflows/reapply-patches.md": "2c44426624047ed0", - "gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09", - "gsd-core/workflows/remove-workspace.md": "7bd5d1b63ef091a8", - "gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35", - "gsd-core/workflows/review.md": "9ed1fda4d8b657f1", - "gsd-core/workflows/scan.md": "8e1bbf2eed1752ca", - "gsd-core/workflows/secure-phase.md": "87fdcb37a8610e58", + "gsd-core/workflows/plan-review-convergence.md": "774e49428f54f0a0", + "gsd-core/workflows/plant-seed.md": "ffa5774304243649", + "gsd-core/workflows/pr-branch.md": "ab157cd8e49621dd", + "gsd-core/workflows/profile-user.md": "203ebe3f8f3876a8", + "gsd-core/workflows/progress.md": "9381c59676ccb937", + "gsd-core/workflows/quick.md": "fd7461e5a92fe450", + "gsd-core/workflows/reapply-patches.md": "becf9728cdb124c4", + "gsd-core/workflows/remove-phase.md": "ada8a0546c686483", + "gsd-core/workflows/remove-workspace.md": "fc83f362a2d0a1b7", + "gsd-core/workflows/resume-project.md": "7f8dc986f0f35d96", + "gsd-core/workflows/review.md": "3af2d510da581502", + "gsd-core/workflows/scan.md": "47371c2073d6c0be", + "gsd-core/workflows/secure-phase.md": "e8855104c1e0417c", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "cde46151bf07b4da", - "gsd-core/workflows/settings-integrations.md": "4d23553b9143e834", - "gsd-core/workflows/settings.md": "c345ec6b9b5ee963", - "gsd-core/workflows/ship.md": "b6149b0bc45cc759", - "gsd-core/workflows/sketch-wrap-up.md": "7673797d65af2377", - "gsd-core/workflows/sketch.md": "201772f9c5c02e97", - "gsd-core/workflows/spec-phase.md": "2c67506aeb25a7e1", - "gsd-core/workflows/spike-wrap-up.md": "b7ee3d961b5792c6", - "gsd-core/workflows/spike.md": "a782dd863771fe0a", - "gsd-core/workflows/stats.md": "17b4f2059f4b4ef2", + "gsd-core/workflows/settings-advanced.md": "03c647793401655b", + "gsd-core/workflows/settings-integrations.md": "3ea8095d5fad891b", + "gsd-core/workflows/settings.md": "05e35aeb442b7e20", + "gsd-core/workflows/ship.md": "afd77be2093535f8", + "gsd-core/workflows/sketch-wrap-up.md": "888c0548e63197b3", + "gsd-core/workflows/sketch.md": "34a0c10fa56af7ea", + "gsd-core/workflows/smart-entry.md": "7ffe4fdb93935400", + "gsd-core/workflows/spec-phase.md": "c231f8eb723e7604", + "gsd-core/workflows/spike-wrap-up.md": "458230d4d7c44b09", + "gsd-core/workflows/spike.md": "8e63427fc146b45c", + "gsd-core/workflows/stats.md": "e7852c5d8f2b05a9", "gsd-core/workflows/sync-skills.md": "dc7b8b015afa4b3b", - "gsd-core/workflows/thread.md": "5ad0e0d5ce7e0d11", - "gsd-core/workflows/transition.md": "9040a76741f12de6", - "gsd-core/workflows/ui-phase.md": "33f7113e91c2bfe0", - "gsd-core/workflows/ui-review.md": "013272816a291305", - "gsd-core/workflows/ultraplan-phase.md": "db7df53187dae993", + "gsd-core/workflows/thread.md": "3b2c560d7189576d", + "gsd-core/workflows/transition.md": "caf7616dc597ad86", + "gsd-core/workflows/ui-phase.md": "638e871b80cacc6d", + "gsd-core/workflows/ui-review.md": "0fb289914252d53e", + "gsd-core/workflows/ultraplan-phase.md": "29245758b8497fa0", "gsd-core/workflows/undo.md": "7cd2153f8b15e30d", - "gsd-core/workflows/update.md": "5d0a2356dadf2017", - "gsd-core/workflows/validate-phase.md": "7915e3a261f7c9c9", - "gsd-core/workflows/verify-phase.md": "15a999f82868ad29", - "gsd-core/workflows/verify-work.md": "6194c487f858d85e", + "gsd-core/workflows/update.md": "07dc2fba78ad1865", + "gsd-core/workflows/validate-phase.md": "557e3251e3b9349a", + "gsd-core/workflows/verify-phase.md": "0d4ffabc1caa473a", + "gsd-core/workflows/verify-work.md": "b68ac37f6301a3b5", "hooks/gsd-check-update-worker.js": "c992bbad91d0e994", "hooks/gsd-check-update.js": "fdd77abe7ef26a2d", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -436,18 +438,19 @@ "skills/gsd-ingest-docs/SKILL.md": "f049f06a6ec7da43", "skills/gsd-manager/SKILL.md": "a37ecdbe32952262", "skills/gsd-map-codebase/SKILL.md": "e8c01704e8ada1d2", - "skills/gsd-mempalace-capture/SKILL.md": "260e1dabc7014ba2", - "skills/gsd-mempalace-recall/SKILL.md": "045d85c8cab1afcc", + "skills/gsd-mempalace-capture/SKILL.md": "f960b7b1a8fdf89b", + "skills/gsd-mempalace-recall/SKILL.md": "2091c48e6e986e28", "skills/gsd-milestone-summary/SKILL.md": "da645171ca2299d8", "skills/gsd-mvp-phase/SKILL.md": "eeb0ac0f88647475", "skills/gsd-new-milestone/SKILL.md": "bc8989d97f3161ad", "skills/gsd-new-project/SKILL.md": "c08047e101dbac9c", + "skills/gsd-next/SKILL.md": "3856471d0f64bf09", "skills/gsd-ns-context/SKILL.md": "110fb2227bcde535", "skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc", "skills/gsd-ns-manage/SKILL.md": "2756981de613022e", "skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26", "skills/gsd-ns-review/SKILL.md": "680bdd33c882b049", - "skills/gsd-ns-workflow/SKILL.md": "68effe2fc2c65317", + "skills/gsd-ns-workflow/SKILL.md": "579b7f0dac74e1fb", "skills/gsd-pause-work/SKILL.md": "34366b18a392a717", "skills/gsd-phase/SKILL.md": "64a241d4f8665aa2", "skills/gsd-plan-phase/SKILL.md": "c73cba04a26f0bfe", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 1b32056d7..092d0bea9 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -9,15 +9,15 @@ "agents/subagents/gsd-ai-researcher.yaml": "59edec2a11eb0a27", "agents/subagents/gsd-assumptions-analyzer.md": "507b93a7d3375ad3", "agents/subagents/gsd-assumptions-analyzer.yaml": "e7da772d8c7e3723", - "agents/subagents/gsd-code-fixer.md": "eadf06afc4609b2a", + "agents/subagents/gsd-code-fixer.md": "9a397598c2df98f3", "agents/subagents/gsd-code-fixer.yaml": "41147d668c7e75cb", "agents/subagents/gsd-code-reviewer.md": "27cee6e8adae57da", "agents/subagents/gsd-code-reviewer.yaml": "5f2398f56018f50d", "agents/subagents/gsd-codebase-mapper.md": "04c7528a13fa3de7", "agents/subagents/gsd-codebase-mapper.yaml": "bce1c6d15f55c477", - "agents/subagents/gsd-debug-session-manager.md": "54f87b28876dec1b", + "agents/subagents/gsd-debug-session-manager.md": "be5653e631bbd006", "agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7", - "agents/subagents/gsd-debugger.md": "9f0811545e99c8b9", + "agents/subagents/gsd-debugger.md": "528ad732ccff4485", "agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43", "agents/subagents/gsd-doc-classifier.md": "7810ff57b2dba86b", "agents/subagents/gsd-doc-classifier.yaml": "a4e9cf7025b57503", @@ -29,33 +29,33 @@ "agents/subagents/gsd-doc-writer.yaml": "166fa569d11adb9f", "agents/subagents/gsd-domain-researcher.md": "c29b96a2c40f6e96", "agents/subagents/gsd-domain-researcher.yaml": "269e21863e94f29f", - "agents/subagents/gsd-eval-auditor.md": "8a8f48ed1249e9cd", + "agents/subagents/gsd-eval-auditor.md": "2de50778b9b5a219", "agents/subagents/gsd-eval-auditor.yaml": "e3d868bd5fefe938", "agents/subagents/gsd-eval-planner.md": "70f8c5727bfb9876", "agents/subagents/gsd-eval-planner.yaml": "df8499f7af297ec2", - "agents/subagents/gsd-executor.md": "2cf56de9a48e60f9", + "agents/subagents/gsd-executor.md": "278a569a7306244c", "agents/subagents/gsd-executor.yaml": "e29422986636fd64", "agents/subagents/gsd-framework-selector.md": "a15b7aa1e0576e16", "agents/subagents/gsd-framework-selector.yaml": "fb52c31cde27b0e3", "agents/subagents/gsd-integration-checker.md": "6939640ba16c3f3b", "agents/subagents/gsd-integration-checker.yaml": "3500c65ccbbe432d", - "agents/subagents/gsd-intel-updater.md": "8ffa8767b2270472", + "agents/subagents/gsd-intel-updater.md": "1964fb57cf27be8d", "agents/subagents/gsd-intel-updater.yaml": "01445ee99bec4b31", - "agents/subagents/gsd-mempalace-curator.md": "34b7476d313bfda4", + "agents/subagents/gsd-mempalace-curator.md": "62b7c34d6c33ed0b", "agents/subagents/gsd-mempalace-curator.yaml": "28dd095c371ada3b", "agents/subagents/gsd-nyquist-auditor.md": "d9dbd1e92e2598c2", "agents/subagents/gsd-nyquist-auditor.yaml": "48ad300fa775dd5d", "agents/subagents/gsd-pattern-mapper.md": "eb2d4e838aaeb10c", "agents/subagents/gsd-pattern-mapper.yaml": "d1e537e77f953fd4", - "agents/subagents/gsd-phase-researcher.md": "5982ab9a29eba637", + "agents/subagents/gsd-phase-researcher.md": "897080d9383bd176", "agents/subagents/gsd-phase-researcher.yaml": "7633c8e82617e7cc", - "agents/subagents/gsd-plan-checker.md": "dc5bc8d2e11f7ecf", + "agents/subagents/gsd-plan-checker.md": "bd302afc01ed40f0", "agents/subagents/gsd-plan-checker.yaml": "8295181071121db8", - "agents/subagents/gsd-planner.md": "4b815f7e76f56a01", + "agents/subagents/gsd-planner.md": "f4a053af3e081edf", "agents/subagents/gsd-planner.yaml": "2e83ee194bcd7fbd", - "agents/subagents/gsd-project-researcher.md": "bbae5f6e13917635", + "agents/subagents/gsd-project-researcher.md": "39bc2ec5a8b18283", "agents/subagents/gsd-project-researcher.yaml": "ce12586b0347e2dc", - "agents/subagents/gsd-research-synthesizer.md": "1f937a27044c1f7b", + "agents/subagents/gsd-research-synthesizer.md": "d384c27f7f045ecd", "agents/subagents/gsd-research-synthesizer.yaml": "898104ab3bb0b81a", "agents/subagents/gsd-roadmapper.md": "62359d6876022b48", "agents/subagents/gsd-roadmapper.yaml": "679772cb14f3a015", @@ -65,20 +65,20 @@ "agents/subagents/gsd-ui-auditor.yaml": "3fc98c1d9e8f10fd", "agents/subagents/gsd-ui-checker.md": "271da1ad4fe7a102", "agents/subagents/gsd-ui-checker.yaml": "c42316006654fae3", - "agents/subagents/gsd-ui-researcher.md": "34f41bc770a55199", + "agents/subagents/gsd-ui-researcher.md": "678f035c1fdd0603", "agents/subagents/gsd-ui-researcher.yaml": "15e215874bc2c37d", "agents/subagents/gsd-user-profiler.md": "c16f94e09e433394", "agents/subagents/gsd-user-profiler.yaml": "645826a29d079159", - "agents/subagents/gsd-verifier.md": "780a100f92c45751", + "agents/subagents/gsd-verifier.md": "699f62763424ac68", "agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -119,7 +119,7 @@ "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", "gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8", "gsd-core/references/gate-prompts.md": "e69f5993ab944d80", - "gsd-core/references/gates.md": "7dc9fd3a3d6217c6", + "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", @@ -142,7 +142,7 @@ "gsd-core/references/planner-reviews.md": "dda0193a0fbd4947", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "1c3a3aae2ae89e83", + "gsd-core/references/planning-config.md": "7fe958e09e74b6c8", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -226,119 +226,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "1153d35058e3e24f", - "gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba", - "gsd-core/workflows/add-tests.md": "2871f7e6409ba89e", - "gsd-core/workflows/add-todo.md": "3b913840c1f490b2", - "gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "1bc7377b105194fc", + "gsd-core/workflows/add-phase.md": "46e0551ffdd8ce1a", + "gsd-core/workflows/add-tests.md": "2c1da65d41dc12d2", + "gsd-core/workflows/add-todo.md": "cc0efe270004c8fb", + "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", - "gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b", - "gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9", - "gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793", - "gsd-core/workflows/autonomous.md": "1184e5864e201889", - "gsd-core/workflows/check-todos.md": "1e3026abe782bd36", - "gsd-core/workflows/cleanup.md": "5cf0772521c192a4", - "gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93", - "gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e", - "gsd-core/workflows/complete-milestone.md": "337d177126f1bd67", - "gsd-core/workflows/debug.md": "da62e7a62c113b29", - "gsd-core/workflows/diagnose-issues.md": "b1fd597cb9420c33", + "gsd-core/workflows/audit-fix.md": "514d02c730349a35", + "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", + "gsd-core/workflows/autonomous.md": "7e5683728ef33707", + "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", + "gsd-core/workflows/cleanup.md": "0daa2f2720c111f1", + "gsd-core/workflows/code-review-fix.md": "c323f7098b671bd6", + "gsd-core/workflows/code-review.md": "ad450c6ef8459dad", + "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", + "gsd-core/workflows/debug.md": "849d7e5b9c12dcae", + "gsd-core/workflows/diagnose-issues.md": "67c058fc7ae6026b", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", - "gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad", + "gsd-core/workflows/discuss-phase-assumptions.md": "1e229f6d21831d60", "gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a", - "gsd-core/workflows/discuss-phase.md": "d0da99d5c9c09c42", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24", + "gsd-core/workflows/discuss-phase.md": "0c0465ba668adb33", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321", + "gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d", + "gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "152e9c5c512f79cb", - "gsd-core/workflows/docs-update.md": "806ada831b961116", - "gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5", - "gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae", - "gsd-core/workflows/execute-phase.md": "444d5f17dfc1437a", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643", + "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", + "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", + "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", + "gsd-core/workflows/execute-phase.md": "5d3377bc8ebbae58", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fca31a68773b37da", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "0cda7b15d42b6d6f", - "gsd-core/workflows/explore.md": "11523b829cc67c29", - "gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb", + "gsd-core/workflows/execute-plan.md": "c8502b7475d797a7", + "gsd-core/workflows/explore.md": "6c04f2e658d93261", + "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "94136fb570d20a9d", - "gsd-core/workflows/forensics.md": "b4bde768fd27a982", - "gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b", - "gsd-core/workflows/health.md": "e3cb8ff4e01e9e53", + "gsd-core/workflows/forensics.md": "0d500a3f5ab26913", + "gsd-core/workflows/graduation.md": "47f1594c88c08501", + "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "d7432c8631f3cae8", - "gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6", - "gsd-core/workflows/import.md": "97861d522319d56e", + "gsd-core/workflows/help/modes/full.md": "94c18706768e5a41", + "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", - "gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3", - "gsd-core/workflows/insert-phase.md": "621f9e75725542b1", + "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", + "gsd-core/workflows/insert-phase.md": "08dca838d831bb5b", "gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3", - "gsd-core/workflows/list-seeds.md": "0a466d04df300854", - "gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b", - "gsd-core/workflows/manager.md": "a31f7e255dd7d01d", - "gsd-core/workflows/map-codebase.md": "582bddef590de9c6", - "gsd-core/workflows/milestone-summary.md": "8b6ceec4aa454b8a", - "gsd-core/workflows/mvp-phase.md": "bfa668107be972ed", - "gsd-core/workflows/new-milestone.md": "23d2135a555e95df", - "gsd-core/workflows/new-project.md": "69d356f41ea36aa2", - "gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1", - "gsd-core/workflows/next.md": "48bd4b5d54f0d1f8", + "gsd-core/workflows/list-seeds.md": "b687f2a843032d65", + "gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453", + "gsd-core/workflows/manager.md": "3ba7a3e8213c4b23", + "gsd-core/workflows/map-codebase.md": "83d750aade709983", + "gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043", + "gsd-core/workflows/mvp-phase.md": "344dd300e0cc1e74", + "gsd-core/workflows/new-milestone.md": "a616efb0f82d1a11", + "gsd-core/workflows/new-project.md": "1ec88027a8e5a2fe", + "gsd-core/workflows/new-workspace.md": "017688423110ed66", + "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", - "gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b", - "gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25", - "gsd-core/workflows/plan-phase.md": "e69e435b47d77070", + "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", + "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", + "gsd-core/workflows/plan-phase.md": "2f16f3cc05fc59f1", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "d64097345ffac40d", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5", - "gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd", - "gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06", - "gsd-core/workflows/pr-branch.md": "f2a35833fe784a53", - "gsd-core/workflows/profile-user.md": "fc41a92a13e7778b", - "gsd-core/workflows/progress.md": "057699b34b6198f7", - "gsd-core/workflows/quick.md": "c99da0fa3ae58187", - "gsd-core/workflows/reapply-patches.md": "7915e40411490bbe", - "gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9", - "gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc", - "gsd-core/workflows/resume-project.md": "b18b51fd15cbce95", - "gsd-core/workflows/review.md": "fbfa6eebcad41aa0", - "gsd-core/workflows/scan.md": "54ff1ff60041d065", - "gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2", + "gsd-core/workflows/plan-review-convergence.md": "c635ecb8590a724e", + "gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede", + "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", + "gsd-core/workflows/profile-user.md": "5abfae83739fa978", + "gsd-core/workflows/progress.md": "893aa3c36983f74b", + "gsd-core/workflows/quick.md": "e265e01cfe117215", + "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", + "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", + "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", + "gsd-core/workflows/resume-project.md": "f28da1200e4545f4", + "gsd-core/workflows/review.md": "f3c2e894941c9943", + "gsd-core/workflows/scan.md": "003883d71c37da7d", + "gsd-core/workflows/secure-phase.md": "29fc6b62c5c5dc62", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "895e94e9193c2de2", - "gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed", - "gsd-core/workflows/settings.md": "48d337eb7e3f141b", - "gsd-core/workflows/ship.md": "d26fb5d3e965642a", - "gsd-core/workflows/sketch-wrap-up.md": "19046704ae337d73", - "gsd-core/workflows/sketch.md": "e42a914206c152ef", - "gsd-core/workflows/spec-phase.md": "2aa0353147153776", - "gsd-core/workflows/spike-wrap-up.md": "3f3e7f0018284059", - "gsd-core/workflows/spike.md": "be2295fe2b32956f", - "gsd-core/workflows/stats.md": "01c24349370a0e6d", + "gsd-core/workflows/settings-advanced.md": "b57c947edee905bc", + "gsd-core/workflows/settings-integrations.md": "70515c5838fb9826", + "gsd-core/workflows/settings.md": "b2d39d972650f5f3", + "gsd-core/workflows/ship.md": "7b8fe9f89143e648", + "gsd-core/workflows/sketch-wrap-up.md": "b767a1d3db129a8a", + "gsd-core/workflows/sketch.md": "88cfdf4edcf222ab", + "gsd-core/workflows/smart-entry.md": "449238eb94abe187", + "gsd-core/workflows/spec-phase.md": "8c480bd91f3cef6f", + "gsd-core/workflows/spike-wrap-up.md": "da0dcb252c54fa82", + "gsd-core/workflows/spike.md": "7813e120577282d4", + "gsd-core/workflows/stats.md": "76a42cbeaf6007c2", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "6d075b5d26500e9d", - "gsd-core/workflows/transition.md": "eee3435817fab185", - "gsd-core/workflows/ui-phase.md": "3dfb9f5161375035", - "gsd-core/workflows/ui-review.md": "1ad3654435000881", - "gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262", + "gsd-core/workflows/thread.md": "927e7eeefd2fcf5c", + "gsd-core/workflows/transition.md": "cb8ec5affb7ebba1", + "gsd-core/workflows/ui-phase.md": "6c4d02dfda1efcae", + "gsd-core/workflows/ui-review.md": "7acfc485526d064b", + "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", - "gsd-core/workflows/update.md": "6369691790864147", - "gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb", - "gsd-core/workflows/verify-phase.md": "7579af6cd757f644", - "gsd-core/workflows/verify-work.md": "d77ace0fc4f33ff7", + "gsd-core/workflows/update.md": "6718e0632bba26ca", + "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/verify-phase.md": "98a995046bdb6c3c", + "gsd-core/workflows/verify-work.md": "34e980a6950cd83c", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", @@ -380,18 +381,19 @@ "skills/gsd-ingest-docs/SKILL.md": "6366644e623ae9e4", "skills/gsd-manager/SKILL.md": "8a11a1beb8e35a9c", "skills/gsd-map-codebase/SKILL.md": "55dade835b0f4954", - "skills/gsd-mempalace-capture/SKILL.md": "3746fa9b34e20e71", - "skills/gsd-mempalace-recall/SKILL.md": "07b1b0e767da162c", + "skills/gsd-mempalace-capture/SKILL.md": "64a2ec493092d26e", + "skills/gsd-mempalace-recall/SKILL.md": "c6e0195e55cd934c", "skills/gsd-milestone-summary/SKILL.md": "3ea93ccaa0d4d967", "skills/gsd-mvp-phase/SKILL.md": "d2f98f1e955797b6", "skills/gsd-new-milestone/SKILL.md": "52c3cbe5b931985b", "skills/gsd-new-project/SKILL.md": "d74e7583377e3563", + "skills/gsd-next/SKILL.md": "0a5109eb81fbeb4b", "skills/gsd-ns-context/SKILL.md": "89f5bffe6702c0c5", "skills/gsd-ns-ideate/SKILL.md": "e0c0420f6878906a", "skills/gsd-ns-manage/SKILL.md": "b7fbe29e45e75f54", "skills/gsd-ns-project/SKILL.md": "1292d4a6a4280ce9", "skills/gsd-ns-review/SKILL.md": "2ff62330379f947f", - "skills/gsd-ns-workflow/SKILL.md": "3f5fcfec9da730a2", + "skills/gsd-ns-workflow/SKILL.md": "86272fd655c206bc", "skills/gsd-pause-work/SKILL.md": "95017c70ae9dca0d", "skills/gsd-phase/SKILL.md": "31578c329cc2583e", "skills/gsd-plan-phase/SKILL.md": "54798eddf30056b5", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index dd6f6ea54..b5dd344dc 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -4,37 +4,37 @@ "agents/gsd-advisor-researcher.md": "6955bcd8ca353de0", "agents/gsd-ai-researcher.md": "28a05307dad84020", "agents/gsd-assumptions-analyzer.md": "45c01017e84ba193", - "agents/gsd-code-fixer.md": "eb9fa698f827f23f", + "agents/gsd-code-fixer.md": "3622ae5d90fb15f6", "agents/gsd-code-reviewer.md": "2249774416314c57", "agents/gsd-codebase-mapper.md": "948612acd505e87f", - "agents/gsd-debug-session-manager.md": "09c805b7283633fd", - "agents/gsd-debugger.md": "535cc597dcc0cade", + "agents/gsd-debug-session-manager.md": "0a0483c6470df4d1", + "agents/gsd-debugger.md": "a83427bd5a0406fc", "agents/gsd-doc-classifier.md": "cd4169adec56c26f", "agents/gsd-doc-synthesizer.md": "47a8b52fe974a810", "agents/gsd-doc-verifier.md": "65bbc2ae6b9ace29", "agents/gsd-doc-writer.md": "0696a8cdc0028917", "agents/gsd-domain-researcher.md": "71250e759ca9e723", - "agents/gsd-eval-auditor.md": "d9c7034244882d86", + "agents/gsd-eval-auditor.md": "c88890105f32ace6", "agents/gsd-eval-planner.md": "60bddb70a937f796", - "agents/gsd-executor.md": "9726bd59fcc09611", + "agents/gsd-executor.md": "b091b0126895ae03", "agents/gsd-framework-selector.md": "1c0a10355e787675", "agents/gsd-integration-checker.md": "a9de5928e5a5c649", - "agents/gsd-intel-updater.md": "f9ef2797738b7f09", - "agents/gsd-mempalace-curator.md": "aa7cf2c611057735", + "agents/gsd-intel-updater.md": "493e07482fa6198a", + "agents/gsd-mempalace-curator.md": "197308371baa53ad", "agents/gsd-nyquist-auditor.md": "7a7e0d1cbafd6b63", "agents/gsd-pattern-mapper.md": "7c6d1d9817a9c1e7", - "agents/gsd-phase-researcher.md": "6461af91c55b5227", - "agents/gsd-plan-checker.md": "5e9ec0d98f9a0059", - "agents/gsd-planner.md": "b4bc4916aadd24e0", - "agents/gsd-project-researcher.md": "f1d486fc0a3ff905", - "agents/gsd-research-synthesizer.md": "e0c2d9957431a1e1", + "agents/gsd-phase-researcher.md": "9874110700b41f48", + "agents/gsd-plan-checker.md": "28ca3dc43669894f", + "agents/gsd-planner.md": "4fdb27fe53d38935", + "agents/gsd-project-researcher.md": "dae210ae0b3c6e2b", + "agents/gsd-research-synthesizer.md": "e02c6ad5d1b74171", "agents/gsd-roadmapper.md": "1658a40b20d8b575", "agents/gsd-security-auditor.md": "e36e436c0d5c26d5", "agents/gsd-ui-auditor.md": "e810012e685b2466", "agents/gsd-ui-checker.md": "5fd0ed65262dc194", - "agents/gsd-ui-researcher.md": "18dd700b1ac6d86a", + "agents/gsd-ui-researcher.md": "d2e1ed5af2df4a7d", "agents/gsd-user-profiler.md": "d825b4c0a6431f8b", - "agents/gsd-verifier.md": "e245bfb493a5c069", + "agents/gsd-verifier.md": "b9f2e801f9395a35", "command/gsd-add-tests.md": "b9cd93ed01945f75", "command/gsd-ai-integration-phase.md": "9d4bc4dcce7f1ee0", "command/gsd-audit-fix.md": "5615403843d5e491", @@ -63,18 +63,19 @@ "command/gsd-ingest-docs.md": "b47c812c247e58a4", "command/gsd-manager.md": "86ece154b34b6d1b", "command/gsd-map-codebase.md": "1fb678f8a17a380e", - "command/gsd-mempalace-capture.md": "08b9750f1b1d1ba6", - "command/gsd-mempalace-recall.md": "2316f1a950490845", + "command/gsd-mempalace-capture.md": "a94ca275cbe7134c", + "command/gsd-mempalace-recall.md": "d358cdd89c935877", "command/gsd-milestone-summary.md": "86a827271bc647c5", "command/gsd-mvp-phase.md": "d45fd76cb9cff3ef", "command/gsd-new-milestone.md": "64c9dc73425a66a2", "command/gsd-new-project.md": "0086f0de26002219", + "command/gsd-next.md": "b0ef81652d72d894", "command/gsd-ns-context.md": "9a2b55b64f2e1e4b", "command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f", "command/gsd-ns-manage.md": "eded59052ca4b240", "command/gsd-ns-project.md": "91417cf7b76581dd", "command/gsd-ns-review.md": "61fe33e28eb1b961", - "command/gsd-ns-workflow.md": "3352c292c27fe50b", + "command/gsd-ns-workflow.md": "13c1ab91080c0cc3", "command/gsd-pause-work.md": "bb5bf91a2e3e480e", "command/gsd-phase.md": "6bcda1539f949d5a", "command/gsd-plan-phase.md": "7ee44086b59862b9", @@ -106,12 +107,12 @@ "command/gsd-workstreams.md": "5e57eed1881c3891", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -175,7 +176,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "4acefb3c71169c84", + "gsd-core/references/planning-config.md": "af0a9694b3c39557", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -259,119 +260,120 @@ "gsd-core/templates/user-profile.md": "52abe2af968e8533", "gsd-core/templates/user-setup.md": "1da2382725db080f", "gsd-core/templates/verification-report.md": "78ab9264ce63ed7e", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "b06846965aac2c53", - "gsd-core/workflows/add-phase.md": "226a281548498ae5", - "gsd-core/workflows/add-tests.md": "29a06d57250bc054", - "gsd-core/workflows/add-todo.md": "c98d2b68d0f0bf6d", - "gsd-core/workflows/ai-integration-phase.md": "bd7f0c25f1f52a95", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "08289088a88d410f", + "gsd-core/workflows/add-phase.md": "5154a5fb3e0d4370", + "gsd-core/workflows/add-tests.md": "81d0a836878e1a10", + "gsd-core/workflows/add-todo.md": "72fcef9fd0cafda5", + "gsd-core/workflows/ai-integration-phase.md": "90e5f97018715b18", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "c7878f1dff04adf1", - "gsd-core/workflows/audit-milestone.md": "99f0b884c9208dde", - "gsd-core/workflows/audit-uat.md": "e530acf37fd9c699", - "gsd-core/workflows/autonomous.md": "5d4373ad0a20f69b", - "gsd-core/workflows/check-todos.md": "42806d03eacf9ff6", - "gsd-core/workflows/cleanup.md": "daca0c4f1d531a02", - "gsd-core/workflows/code-review-fix.md": "618c850533bd5c9e", - "gsd-core/workflows/code-review.md": "e362de9cce43c8fc", - "gsd-core/workflows/complete-milestone.md": "840e524216772d8d", - "gsd-core/workflows/debug.md": "0e12f6f3589cc0ea", - "gsd-core/workflows/diagnose-issues.md": "d8c817d029ea186e", + "gsd-core/workflows/audit-fix.md": "497a33eb4ee38d47", + "gsd-core/workflows/audit-milestone.md": "7aa0db364a4b67e2", + "gsd-core/workflows/audit-uat.md": "c800099fab1e1c1b", + "gsd-core/workflows/autonomous.md": "6cb0c014f5f56965", + "gsd-core/workflows/check-todos.md": "6526b64ee88c7d2e", + "gsd-core/workflows/cleanup.md": "94d771d26f62dc86", + "gsd-core/workflows/code-review-fix.md": "5d97b960da4fef73", + "gsd-core/workflows/code-review.md": "aec8ef4de1829607", + "gsd-core/workflows/complete-milestone.md": "614299b2c08e66c3", + "gsd-core/workflows/debug.md": "9d4a8afc8d36be93", + "gsd-core/workflows/diagnose-issues.md": "2971c699d52f1b85", "gsd-core/workflows/discovery-phase.md": "724408336596c50c", - "gsd-core/workflows/discuss-phase-assumptions.md": "42418e64617c5de3", + "gsd-core/workflows/discuss-phase-assumptions.md": "310b08dc31710cbc", "gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383", - "gsd-core/workflows/discuss-phase.md": "3b4b9908e57b329f", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "f44a1979ba5841a3", + "gsd-core/workflows/discuss-phase.md": "3a62a8d4c374c69f", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "83ca3ea4fac785af", "gsd-core/workflows/discuss-phase/modes/all.md": "5ed71228ac96e728", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "69d274e077af5292", + "gsd-core/workflows/discuss-phase/modes/auto.md": "ed71852753c6788a", "gsd-core/workflows/discuss-phase/modes/batch.md": "78f6ef61690acb66", - "gsd-core/workflows/discuss-phase/modes/chain.md": "b01b9974f762af76", + "gsd-core/workflows/discuss-phase/modes/chain.md": "1558b2ce77a25c75", "gsd-core/workflows/discuss-phase/modes/default.md": "5d12f2593ae4a813", "gsd-core/workflows/discuss-phase/modes/power.md": "799fc7e1283b568f", "gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275", - "gsd-core/workflows/do.md": "9464559b832bf9c0", - "gsd-core/workflows/docs-update.md": "93e969c3afb446a0", - "gsd-core/workflows/edit-phase.md": "ed948a400a0146c7", - "gsd-core/workflows/eval-review.md": "1ba1af74a43c07db", - "gsd-core/workflows/execute-phase.md": "f0ca3839e0d0cf8b", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a640b093a5a7b028", + "gsd-core/workflows/do.md": "d72e76d9050b53f3", + "gsd-core/workflows/docs-update.md": "850366c2ef8fb780", + "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", + "gsd-core/workflows/eval-review.md": "5394694d29ad7543", + "gsd-core/workflows/execute-phase.md": "ec2ef02d93b17a24", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1804215577f1ad35", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "8b42f5df1a2c231f", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "647ec0d29a0d6365", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "7894850154836fcf", - "gsd-core/workflows/explore.md": "96ba55f53899a261", - "gsd-core/workflows/extract-learnings.md": "b8851263c2d28702", + "gsd-core/workflows/execute-plan.md": "e8de8ea661c1fe81", + "gsd-core/workflows/explore.md": "7f5f9231cfd3089b", + "gsd-core/workflows/extract-learnings.md": "92b3c0979604b7d0", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "6ce026e4bc6c875e", - "gsd-core/workflows/graduation.md": "7d03b353a0323cce", - "gsd-core/workflows/health.md": "1fad392ce1aec410", + "gsd-core/workflows/forensics.md": "9354cb830152fd28", + "gsd-core/workflows/graduation.md": "13080b5c24eec27d", + "gsd-core/workflows/health.md": "a91e0a8e5d20b2e9", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa", - "gsd-core/workflows/help/modes/full.md": "d43cbea8b5e6e290", - "gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7", - "gsd-core/workflows/import.md": "46337b37d375f4da", + "gsd-core/workflows/help/modes/full.md": "604993c20f4e4b20", + "gsd-core/workflows/help/modes/topic.md": "19a279fe91922d3b", + "gsd-core/workflows/import.md": "67fbf389ab8e57b4", "gsd-core/workflows/inbox.md": "a073396097c89c01", - "gsd-core/workflows/ingest-docs.md": "bbb4f5fb3ab75113", - "gsd-core/workflows/insert-phase.md": "a305657b04dc3f1f", + "gsd-core/workflows/ingest-docs.md": "82370f93c45c8015", + "gsd-core/workflows/insert-phase.md": "858224afbf977c14", "gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3", - "gsd-core/workflows/list-seeds.md": "f8a55d8f83a4492d", - "gsd-core/workflows/list-workspaces.md": "74aa5ac3cb9b00bf", - "gsd-core/workflows/manager.md": "e77230eb5a8a1c78", - "gsd-core/workflows/map-codebase.md": "40624186d001658f", - "gsd-core/workflows/milestone-summary.md": "19cced11010ad8eb", - "gsd-core/workflows/mvp-phase.md": "efeb5d11f5b10e73", - "gsd-core/workflows/new-milestone.md": "08d97dcb66df7776", - "gsd-core/workflows/new-project.md": "d3c0ce0e163d5048", - "gsd-core/workflows/new-workspace.md": "cfbe1d7f60f2bfe4", - "gsd-core/workflows/next.md": "83ccac8577032cb6", + "gsd-core/workflows/list-seeds.md": "9b05425fa7d24827", + "gsd-core/workflows/list-workspaces.md": "dc6d30036c6dc426", + "gsd-core/workflows/manager.md": "b652b27ca9c6451a", + "gsd-core/workflows/map-codebase.md": "6aa5a52741af0b3e", + "gsd-core/workflows/milestone-summary.md": "321ea8a6a206f38f", + "gsd-core/workflows/mvp-phase.md": "b4d688baa4c60dfc", + "gsd-core/workflows/new-milestone.md": "b34db94432f766cb", + "gsd-core/workflows/new-project.md": "a3850644ef65bea6", + "gsd-core/workflows/new-workspace.md": "3d82392388ee24c7", + "gsd-core/workflows/next.md": "6719a37b8ce2ac4f", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "0d1374f2a2257858", - "gsd-core/workflows/pause-work.md": "c9f0b8826845dda7", - "gsd-core/workflows/plan-milestone-gaps.md": "5ec459734bf7570c", - "gsd-core/workflows/plan-phase.md": "03745f51d63d99b8", + "gsd-core/workflows/pause-work.md": "70c72beca55c080a", + "gsd-core/workflows/plan-milestone-gaps.md": "0a9dacd422cd9533", + "gsd-core/workflows/plan-phase.md": "3c49d9f4061b2388", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "fa7f29c323f4cb57", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "3a09141de7f3dedb", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261", - "gsd-core/workflows/plan-review-convergence.md": "4f884d793d72d3fd", - "gsd-core/workflows/plant-seed.md": "507e886d0f70d84c", - "gsd-core/workflows/pr-branch.md": "3abaa18246facdc3", - "gsd-core/workflows/profile-user.md": "6c16f62edaaebdc9", - "gsd-core/workflows/progress.md": "6b34c4542cfe90b0", - "gsd-core/workflows/quick.md": "55e3c86b55995e3f", - "gsd-core/workflows/reapply-patches.md": "a6cfec7e2a0e7ee2", - "gsd-core/workflows/remove-phase.md": "863c58e99e9d630d", - "gsd-core/workflows/remove-workspace.md": "4ed03c52e5c7bd4d", - "gsd-core/workflows/resume-project.md": "15153ce5a4c38674", - "gsd-core/workflows/review.md": "4076abd5ff01195d", - "gsd-core/workflows/scan.md": "4634caefa32a7307", - "gsd-core/workflows/secure-phase.md": "9616682fe23cf042", + "gsd-core/workflows/plan-review-convergence.md": "9252897bc8e001da", + "gsd-core/workflows/plant-seed.md": "b8dad652e31c2318", + "gsd-core/workflows/pr-branch.md": "929b7cb0c99c7b9e", + "gsd-core/workflows/profile-user.md": "248d59a31948e0ed", + "gsd-core/workflows/progress.md": "8fc3404087f50b95", + "gsd-core/workflows/quick.md": "10cc8ddd4bc3f0ee", + "gsd-core/workflows/reapply-patches.md": "a0e9b53f90abceb2", + "gsd-core/workflows/remove-phase.md": "dea4661e8f89596f", + "gsd-core/workflows/remove-workspace.md": "446847e71aa52504", + "gsd-core/workflows/resume-project.md": "ad9f06a10bab8cc0", + "gsd-core/workflows/review.md": "94ff56aecbbe2753", + "gsd-core/workflows/scan.md": "ad8ebcad4626d4a8", + "gsd-core/workflows/secure-phase.md": "e9a488cec3b4efdc", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "66dfc942603ae7af", - "gsd-core/workflows/settings-integrations.md": "6bd6cccc1aff9bc9", - "gsd-core/workflows/settings.md": "4c24ab123703d769", - "gsd-core/workflows/ship.md": "5ffb515478d78cb6", - "gsd-core/workflows/sketch-wrap-up.md": "1a9f5b8e01a43506", - "gsd-core/workflows/sketch.md": "89acaae8de9bf8c9", - "gsd-core/workflows/spec-phase.md": "eb94ceb386b2a328", - "gsd-core/workflows/spike-wrap-up.md": "3609a57dbd8b5ac0", - "gsd-core/workflows/spike.md": "df52b9f31a72d204", - "gsd-core/workflows/stats.md": "598b1bb510ed0451", + "gsd-core/workflows/settings-advanced.md": "f62c8e4fa6d3a3d9", + "gsd-core/workflows/settings-integrations.md": "d1711a95f44fdbde", + "gsd-core/workflows/settings.md": "bbbcad8d95d5e813", + "gsd-core/workflows/ship.md": "924c79e3cfd1e42b", + "gsd-core/workflows/sketch-wrap-up.md": "681800323681c5c6", + "gsd-core/workflows/sketch.md": "fcb7af914159ef7b", + "gsd-core/workflows/smart-entry.md": "2a253fe437496eea", + "gsd-core/workflows/spec-phase.md": "cb6cbe6eac816b0a", + "gsd-core/workflows/spike-wrap-up.md": "30a73aa19a1db271", + "gsd-core/workflows/spike.md": "f8b07d411473560a", + "gsd-core/workflows/stats.md": "846cd2808461ccdc", "gsd-core/workflows/sync-skills.md": "7e2c138cdbef4282", - "gsd-core/workflows/thread.md": "f4f8312f744c9cba", - "gsd-core/workflows/transition.md": "2d6739f730c3ea10", - "gsd-core/workflows/ui-phase.md": "38dac814d2d03d6f", - "gsd-core/workflows/ui-review.md": "3d972d3bd30527b3", - "gsd-core/workflows/ultraplan-phase.md": "11db7f58a45aca2e", + "gsd-core/workflows/thread.md": "82652edb1883af59", + "gsd-core/workflows/transition.md": "a66f117fad29d65a", + "gsd-core/workflows/ui-phase.md": "3927811cceccf3fd", + "gsd-core/workflows/ui-review.md": "149f39373eee5c92", + "gsd-core/workflows/ultraplan-phase.md": "f4bad8de3fdb49fa", "gsd-core/workflows/undo.md": "0bba5e7f6196c894", - "gsd-core/workflows/update.md": "af51041a3172c523", - "gsd-core/workflows/validate-phase.md": "0fc5991f6d7c6c39", - "gsd-core/workflows/verify-phase.md": "13a1a43395b5e47b", - "gsd-core/workflows/verify-work.md": "c218bc9c5972dcdb", + "gsd-core/workflows/update.md": "71b6cd852f38b4bc", + "gsd-core/workflows/validate-phase.md": "abcdbc1b56780565", + "gsd-core/workflows/verify-phase.md": "5bd04b040cd071dd", + "gsd-core/workflows/verify-work.md": "f0d205568abfaf74", "hooks/gsd-check-update-worker.js": "385fb7c67810baf6", "hooks/gsd-check-update.js": "4549451414ffa7d7", "hooks/gsd-config-reload.js": "96546e0e8bb47904", @@ -437,18 +439,19 @@ "skills/gsd-ingest-docs/SKILL.md": "8f294b4894f782a5", "skills/gsd-manager/SKILL.md": "cf40f237b4f20aa7", "skills/gsd-map-codebase/SKILL.md": "6d74ea41e29ff035", - "skills/gsd-mempalace-capture/SKILL.md": "260e1dabc7014ba2", - "skills/gsd-mempalace-recall/SKILL.md": "045d85c8cab1afcc", + "skills/gsd-mempalace-capture/SKILL.md": "f960b7b1a8fdf89b", + "skills/gsd-mempalace-recall/SKILL.md": "2091c48e6e986e28", "skills/gsd-milestone-summary/SKILL.md": "175366bb500b5e64", "skills/gsd-mvp-phase/SKILL.md": "0531d0e907af41ce", "skills/gsd-new-milestone/SKILL.md": "45688741cc4bab41", "skills/gsd-new-project/SKILL.md": "feef18d69466fdf9", + "skills/gsd-next/SKILL.md": "85fb881a8ac65081", "skills/gsd-ns-context/SKILL.md": "110fb2227bcde535", "skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc", "skills/gsd-ns-manage/SKILL.md": "2756981de613022e", "skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26", "skills/gsd-ns-review/SKILL.md": "680bdd33c882b049", - "skills/gsd-ns-workflow/SKILL.md": "68effe2fc2c65317", + "skills/gsd-ns-workflow/SKILL.md": "579b7f0dac74e1fb", "skills/gsd-pause-work/SKILL.md": "c7e9ba4f242c4648", "skills/gsd-phase/SKILL.md": "ee78c0c56c814d84", "skills/gsd-plan-phase/SKILL.md": "6abcc3a1568a6bb9", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 0ab2fab4d..071a61405 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -1,48 +1,48 @@ { ".gsd-profile": "0e716a5fef4e6dc1", ".gsd/defaults.json": "560664b045e645cb", - "agents/gsd-advisor-researcher.md": "f3f0a55854689045", - "agents/gsd-ai-researcher.md": "72f67082f35c9da1", + "agents/gsd-advisor-researcher.md": "f1c4a47d3d8cea72", + "agents/gsd-ai-researcher.md": "08847faf5494ff08", "agents/gsd-assumptions-analyzer.md": "f11a80795163bb5d", - "agents/gsd-code-fixer.md": "aa8fb3a712ee0573", + "agents/gsd-code-fixer.md": "5660b5d7a912dbac", "agents/gsd-code-reviewer.md": "f70ee630a166fec8", "agents/gsd-codebase-mapper.md": "b2885ffa8bb75d47", - "agents/gsd-debug-session-manager.md": "c88ad88c7a9fff8b", - "agents/gsd-debugger.md": "89d03f3bd515f045", + "agents/gsd-debug-session-manager.md": "0b23e9c20c77f55c", + "agents/gsd-debugger.md": "7411b2f67a801c3e", "agents/gsd-doc-classifier.md": "5de2a66c751b2d58", "agents/gsd-doc-synthesizer.md": "8e6fb8220f777022", "agents/gsd-doc-verifier.md": "3767850df78f4a36", "agents/gsd-doc-writer.md": "10962b6bd4212379", - "agents/gsd-domain-researcher.md": "d4c07520f650ffd5", - "agents/gsd-eval-auditor.md": "0d3c7822c91197fc", + "agents/gsd-domain-researcher.md": "412cdbb05ba252ea", + "agents/gsd-eval-auditor.md": "2d121dbec93fd4ce", "agents/gsd-eval-planner.md": "03448fc9c5774b56", - "agents/gsd-executor.md": "9bda03decabbaa16", + "agents/gsd-executor.md": "0735dcf053be7c76", "agents/gsd-framework-selector.md": "ea9981d65d6b3429", "agents/gsd-integration-checker.md": "33fd537b862eb944", - "agents/gsd-intel-updater.md": "22cc46f64ad4c336", - "agents/gsd-mempalace-curator.md": "576b8d0db51bc462", + "agents/gsd-intel-updater.md": "699dacdc0a1f2478", + "agents/gsd-mempalace-curator.md": "399e90e473b33814", "agents/gsd-nyquist-auditor.md": "7fb0ecf639c1cdfe", "agents/gsd-pattern-mapper.md": "9ab071c3ffc1cf46", - "agents/gsd-phase-researcher.md": "7ecc077c36ebad64", - "agents/gsd-plan-checker.md": "7807baf92b84e721", - "agents/gsd-planner.md": "3dd52fdc04d450d9", - "agents/gsd-project-researcher.md": "fda710ba13e4117d", - "agents/gsd-research-synthesizer.md": "b425f746df47c2ac", + "agents/gsd-phase-researcher.md": "ecb365e5f62aaafc", + "agents/gsd-plan-checker.md": "ca47fdf6d4a36849", + "agents/gsd-planner.md": "7cb18e515bab3c05", + "agents/gsd-project-researcher.md": "d38509cab69224d9", + "agents/gsd-research-synthesizer.md": "6d64fce8b06b7a62", "agents/gsd-roadmapper.md": "604b25c6687811f4", "agents/gsd-security-auditor.md": "f85447e5b5300feb", "agents/gsd-ui-auditor.md": "cc46d104cbc49079", "agents/gsd-ui-checker.md": "8f140c80fc193e13", - "agents/gsd-ui-researcher.md": "14f711963a71322a", + "agents/gsd-ui-researcher.md": "623cb59aa6dbe146", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", - "agents/gsd-verifier.md": "7286d42f73e54be1", + "agents/gsd-verifier.md": "45c450b6d7cc5f0d", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "4456f5432471af00", + "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -106,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "32430b855023bfdb", + "gsd-core/references/planning-config.md": "e8087cf6aae8d56f", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -190,119 +190,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "4b75a93042406fb8", - "gsd-core/workflows/add-phase.md": "e660b7f2793e6057", - "gsd-core/workflows/add-tests.md": "258d0a918a40f2b4", - "gsd-core/workflows/add-todo.md": "53acd2035bee5cbb", - "gsd-core/workflows/ai-integration-phase.md": "ce4775b1ea73c8ec", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "cee41d5fc52d4e37", + "gsd-core/workflows/add-phase.md": "cc63a3e108c9a065", + "gsd-core/workflows/add-tests.md": "b62585823e5636bb", + "gsd-core/workflows/add-todo.md": "5e037b444e657557", + "gsd-core/workflows/ai-integration-phase.md": "afdc7c15f03a95fc", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "75f9d02e6924913c", - "gsd-core/workflows/audit-milestone.md": "49d1978340cf89ef", - "gsd-core/workflows/audit-uat.md": "b38b4e18e2abd51b", - "gsd-core/workflows/autonomous.md": "4bdc47f26319ac48", - "gsd-core/workflows/check-todos.md": "7fc4a39f3e83dde7", - "gsd-core/workflows/cleanup.md": "804c5d481279f008", - "gsd-core/workflows/code-review-fix.md": "7d6caed073170b2a", - "gsd-core/workflows/code-review.md": "ca4a87c143bb2d55", - "gsd-core/workflows/complete-milestone.md": "35a311ed5cea3599", - "gsd-core/workflows/debug.md": "6000ef61c0a67d84", - "gsd-core/workflows/diagnose-issues.md": "1aa7b1f3c4cbe15d", + "gsd-core/workflows/audit-fix.md": "da62236c7b3161a0", + "gsd-core/workflows/audit-milestone.md": "b7617cf590d92a56", + "gsd-core/workflows/audit-uat.md": "97d441d07e7972b3", + "gsd-core/workflows/autonomous.md": "3014ff90115f0daf", + "gsd-core/workflows/check-todos.md": "ec8c22920f6b2df1", + "gsd-core/workflows/cleanup.md": "6a18b165752e3087", + "gsd-core/workflows/code-review-fix.md": "e14afce87cf0d420", + "gsd-core/workflows/code-review.md": "d6d385b6dadae5a0", + "gsd-core/workflows/complete-milestone.md": "40085d32b15805c8", + "gsd-core/workflows/debug.md": "c23d067580b09f63", + "gsd-core/workflows/diagnose-issues.md": "652ae26975f82242", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", - "gsd-core/workflows/discuss-phase-assumptions.md": "6360526c14233193", + "gsd-core/workflows/discuss-phase-assumptions.md": "3865afc23e9cd46a", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "b5731ee756a9a724", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "1bcf72db1553bbf2", + "gsd-core/workflows/discuss-phase.md": "8644b72386a51241", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "3102430dfad9c012", "gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54", "gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105", - "gsd-core/workflows/discuss-phase/modes/auto.md": "9b87eb70ef459efa", + "gsd-core/workflows/discuss-phase/modes/auto.md": "20066d66f481e69c", "gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448", - "gsd-core/workflows/discuss-phase/modes/chain.md": "2a6782b674cf4ca6", + "gsd-core/workflows/discuss-phase/modes/chain.md": "22ed6fd00d79ff71", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261", "gsd-core/workflows/discuss-phase/modes/text.md": "6914c661b95859ee", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "1f0dc350abac269a", - "gsd-core/workflows/docs-update.md": "12433c1e3cf9e40e", - "gsd-core/workflows/edit-phase.md": "4ba06a05cb29f3b7", - "gsd-core/workflows/eval-review.md": "0ab8368c8edf91fb", - "gsd-core/workflows/execute-phase.md": "c739c018da3d2c0d", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9320986ccf0e8a60", + "gsd-core/workflows/do.md": "35862ba1f7230247", + "gsd-core/workflows/docs-update.md": "45d2f0d173c84e07", + "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", + "gsd-core/workflows/eval-review.md": "6dee8a1e40ececd4", + "gsd-core/workflows/execute-phase.md": "6bb6f3c6a33c4233", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "36af8d91e4ae8b9c", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "4116471249699255", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5c30e38cdc265e20", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "73f47e5a189cd27d", - "gsd-core/workflows/explore.md": "42f73d9fc38429da", - "gsd-core/workflows/extract-learnings.md": "1d0a3cbf17159316", + "gsd-core/workflows/execute-plan.md": "503b0ced0731dc38", + "gsd-core/workflows/explore.md": "e1a83a8982532e5b", + "gsd-core/workflows/extract-learnings.md": "dd4fdb88605de49a", "gsd-core/workflows/fast.md": "54fe93778b45a7eb", - "gsd-core/workflows/forensics.md": "0b20c736f1220ee7", - "gsd-core/workflows/graduation.md": "7398492ff69af5e7", - "gsd-core/workflows/health.md": "de79abe3b83a0252", + "gsd-core/workflows/forensics.md": "82800a3138ac1da9", + "gsd-core/workflows/graduation.md": "40401655435beee3", + "gsd-core/workflows/health.md": "043de14edb6a9723", "gsd-core/workflows/help.md": "5d040504b9ab35e3", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "cef457f954a9991e", - "gsd-core/workflows/help/modes/full.md": "8f70d84fd3549aa0", - "gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd", - "gsd-core/workflows/import.md": "5c0e3e97b0a59a06", + "gsd-core/workflows/help/modes/full.md": "1e1e826ba1da0bc5", + "gsd-core/workflows/help/modes/topic.md": "899d7168a485297f", + "gsd-core/workflows/import.md": "e56c18a984396066", "gsd-core/workflows/inbox.md": "91aac6360e1a8672", - "gsd-core/workflows/ingest-docs.md": "9cbe45380eed4a0e", - "gsd-core/workflows/insert-phase.md": "080d2f56cf0021ab", + "gsd-core/workflows/ingest-docs.md": "f291310a8a89dbd8", + "gsd-core/workflows/insert-phase.md": "00a34b792c323959", "gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c", - "gsd-core/workflows/list-seeds.md": "e8d404a07c612d46", - "gsd-core/workflows/list-workspaces.md": "0bda9b42bb5c509b", - "gsd-core/workflows/manager.md": "f2ae9c83a80cc690", - "gsd-core/workflows/map-codebase.md": "8ce1e33f45827202", - "gsd-core/workflows/milestone-summary.md": "4135889e51e1e4b5", - "gsd-core/workflows/mvp-phase.md": "b3561a8ab1b26a4c", - "gsd-core/workflows/new-milestone.md": "3f2875618897718b", - "gsd-core/workflows/new-project.md": "6c1440959e637d2d", - "gsd-core/workflows/new-workspace.md": "9b41c1b5c0196936", - "gsd-core/workflows/next.md": "80f2feb243818c90", + "gsd-core/workflows/list-seeds.md": "8d6e1b5d85f64c6f", + "gsd-core/workflows/list-workspaces.md": "5e434933a3db695c", + "gsd-core/workflows/manager.md": "176ca710b4be4860", + "gsd-core/workflows/map-codebase.md": "2328da6a2f180f07", + "gsd-core/workflows/milestone-summary.md": "97ddfc40c6bce906", + "gsd-core/workflows/mvp-phase.md": "5ca64695120d250c", + "gsd-core/workflows/new-milestone.md": "d009cde68c003ca6", + "gsd-core/workflows/new-project.md": "493ae04534a80f97", + "gsd-core/workflows/new-workspace.md": "0d59bb987430003e", + "gsd-core/workflows/next.md": "c13515a80c20d37d", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "42b66686b2c102cb", - "gsd-core/workflows/pause-work.md": "54f1c0a9e79e2c59", - "gsd-core/workflows/plan-milestone-gaps.md": "1b820f4e70acce86", - "gsd-core/workflows/plan-phase.md": "574fc8008416e6a7", + "gsd-core/workflows/pause-work.md": "be33f84dc1d4822f", + "gsd-core/workflows/plan-milestone-gaps.md": "d98e98486123eb97", + "gsd-core/workflows/plan-phase.md": "1cac08591d361397", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "451a287826b36227", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "c22ff5ea46de665a", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "d050d8d551ed1756", - "gsd-core/workflows/plan-review-convergence.md": "b809588bff4f48b5", - "gsd-core/workflows/plant-seed.md": "e3949fcbcf5d375f", - "gsd-core/workflows/pr-branch.md": "95850381230787ed", - "gsd-core/workflows/profile-user.md": "07e634c1dab106fc", - "gsd-core/workflows/progress.md": "eb2dafb8e419b784", - "gsd-core/workflows/quick.md": "cdc5477dacaec99a", - "gsd-core/workflows/reapply-patches.md": "4a93b90cbe70a2f1", - "gsd-core/workflows/remove-phase.md": "17c46fdcef27df2d", - "gsd-core/workflows/remove-workspace.md": "1d34788a9b2272d2", - "gsd-core/workflows/resume-project.md": "bba3250afbea8f09", - "gsd-core/workflows/review.md": "8ed9a9e7d150978d", - "gsd-core/workflows/scan.md": "514d3eba81565193", - "gsd-core/workflows/secure-phase.md": "a7e8edb0e5f48256", + "gsd-core/workflows/plan-review-convergence.md": "e2d31d43cbf2aa88", + "gsd-core/workflows/plant-seed.md": "0a92ba12993ac261", + "gsd-core/workflows/pr-branch.md": "cef0f65b16d500b4", + "gsd-core/workflows/profile-user.md": "263c0693563d98da", + "gsd-core/workflows/progress.md": "3b1b2142a74af85c", + "gsd-core/workflows/quick.md": "0a9a7dacc73f8e53", + "gsd-core/workflows/reapply-patches.md": "de0ee8acfe7245b2", + "gsd-core/workflows/remove-phase.md": "e8ae4fbbfac700f0", + "gsd-core/workflows/remove-workspace.md": "4ac64de862dc650e", + "gsd-core/workflows/resume-project.md": "7f20769f302e5427", + "gsd-core/workflows/review.md": "bb5c36262d5ff951", + "gsd-core/workflows/scan.md": "949692db4834dd27", + "gsd-core/workflows/secure-phase.md": "6758f1acf4113e9e", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "8e9a8f18b8c1e16e", - "gsd-core/workflows/settings-integrations.md": "8110932b38057f2f", - "gsd-core/workflows/settings.md": "1bd9dc8b2e7402e6", - "gsd-core/workflows/ship.md": "e10d21edabf201a7", - "gsd-core/workflows/sketch-wrap-up.md": "7630ee69ab22462d", - "gsd-core/workflows/sketch.md": "68c337d92c79dc9b", - "gsd-core/workflows/spec-phase.md": "dbe5f223d7bc026c", - "gsd-core/workflows/spike-wrap-up.md": "96b8244988d651fd", - "gsd-core/workflows/spike.md": "52fcd95f7b343232", - "gsd-core/workflows/stats.md": "7ffa072290ebcae3", + "gsd-core/workflows/settings-advanced.md": "8d850d15f1d06dd6", + "gsd-core/workflows/settings-integrations.md": "29c5de27fbbb18e9", + "gsd-core/workflows/settings.md": "da0b7567d648b80a", + "gsd-core/workflows/ship.md": "9f94d0b155eb041e", + "gsd-core/workflows/sketch-wrap-up.md": "89e0eab2af946b04", + "gsd-core/workflows/sketch.md": "483387542d6fc3af", + "gsd-core/workflows/smart-entry.md": "d309710bcabd4675", + "gsd-core/workflows/spec-phase.md": "0d888493bde5146b", + "gsd-core/workflows/spike-wrap-up.md": "fe04cb3d30dcbc6c", + "gsd-core/workflows/spike.md": "fad28f2ecf2dac52", + "gsd-core/workflows/stats.md": "89a08155b92f4a2d", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "c10177767648ea7f", - "gsd-core/workflows/transition.md": "1f0a1478d75d89ec", - "gsd-core/workflows/ui-phase.md": "1c91323daf451053", - "gsd-core/workflows/ui-review.md": "f1f82d8257e910cc", - "gsd-core/workflows/ultraplan-phase.md": "edcaa0b29f942df0", + "gsd-core/workflows/thread.md": "f24b6454c69d064a", + "gsd-core/workflows/transition.md": "9c615db5686219d0", + "gsd-core/workflows/ui-phase.md": "a1f11225433e1795", + "gsd-core/workflows/ui-review.md": "8b989f372684851f", + "gsd-core/workflows/ultraplan-phase.md": "49921383982474e0", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", - "gsd-core/workflows/update.md": "baae1a977fbeba49", - "gsd-core/workflows/validate-phase.md": "0e153ccb3bdb9dda", - "gsd-core/workflows/verify-phase.md": "0ef74d5b7f7646f6", - "gsd-core/workflows/verify-work.md": "69d9d98563b9ec81", + "gsd-core/workflows/update.md": "b34cb866152d4de3", + "gsd-core/workflows/validate-phase.md": "e989cbaa4228564c", + "gsd-core/workflows/verify-phase.md": "a8679ba1d84145c5", + "gsd-core/workflows/verify-work.md": "b5afb65fdf311301", "hooks/gsd-check-update-worker.js": "4bb354044e0dff91", "hooks/gsd-check-update.js": "d2065cb3e725a42a", "hooks/gsd-config-reload.js": "4f52b8a0120bb1b8", @@ -343,8 +344,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "8d38e55e5f8b774b", "skills/gsd-ns-context/skills/graphify/SKILL.md": "ac3661e6e576188b", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "5009595dbde69739", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "e9b66db79fce0a2f", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "9bfa9e76c7a10e26", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "40a31ad049374297", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "c3f412d5a64f3921", "skills/gsd-ns-ideate/SKILL.md": "4a0d2691054b23e5", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "05fa421c95fbad2d", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "7ee5c455f37093be", @@ -392,7 +393,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "7c9404102a9b9d74", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "ef8f643abff1486b", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "70375e2381319d2b", - "skills/gsd-ns-workflow/SKILL.md": "46f5e3e89eed3743", + "skills/gsd-ns-workflow/SKILL.md": "5a65f9fb93a71cec", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "6661195a66f25ae8", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "96c8151779ad510e", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "fb57d2c08ea9e8bc", @@ -400,6 +401,7 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "13518a22e020e1bf", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "5f3f8b0c3f564d14", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f9a1348c6c297579", + "skills/gsd-ns-workflow/skills/next/SKILL.md": "13e394affe675498", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "1ed640e5f06c7be6", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "75979bb1db5557af", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "c3dd8bfa877eaed5", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 01f7797a0..1f894a16c 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -4,45 +4,45 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "abfc97706f16aaaf", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "31fa8ab0d217788c", + "agents/gsd-code-fixer.md": "5fe29063843be67e", "agents/gsd-code-reviewer.md": "338c46ab59c4e45f", "agents/gsd-codebase-mapper.md": "8529d8a1ede8bbfb", - "agents/gsd-debug-session-manager.md": "410e3739329bd9ac", - "agents/gsd-debugger.md": "956c3207a43f973f", + "agents/gsd-debug-session-manager.md": "69aa7eae3a23f6a9", + "agents/gsd-debugger.md": "704eb4e94b4d1212", "agents/gsd-doc-classifier.md": "5807f1f7cfa40c42", "agents/gsd-doc-synthesizer.md": "0897098024c17ccd", "agents/gsd-doc-verifier.md": "e51e50892963ccc7", "agents/gsd-doc-writer.md": "b0c3ad805b789226", "agents/gsd-domain-researcher.md": "b80f76874c04e515", - "agents/gsd-eval-auditor.md": "96df1d4a9cd553a0", + "agents/gsd-eval-auditor.md": "470bf16303ec4d2e", "agents/gsd-eval-planner.md": "22334fde85723c9d", - "agents/gsd-executor.md": "546ea45461739438", + "agents/gsd-executor.md": "45eeb443a6e6dbe8", "agents/gsd-framework-selector.md": "7726fccc86bfeb50", "agents/gsd-integration-checker.md": "7cd2072984411c7f", - "agents/gsd-intel-updater.md": "2751bbd33912aa1b", - "agents/gsd-mempalace-curator.md": "63676937f8970bf3", + "agents/gsd-intel-updater.md": "83de6ba9172891c3", + "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", "agents/gsd-nyquist-auditor.md": "58efbed3b81b5ede", "agents/gsd-pattern-mapper.md": "b5d7a4abb1baecb9", - "agents/gsd-phase-researcher.md": "2ba0dab43912f28a", - "agents/gsd-plan-checker.md": "bc56265bcba1b002", - "agents/gsd-planner.md": "6ba7e6a042dbfc3c", - "agents/gsd-project-researcher.md": "16165f30baea2a06", - "agents/gsd-research-synthesizer.md": "9694b191aecc5f73", + "agents/gsd-phase-researcher.md": "2256f1f82212c757", + "agents/gsd-plan-checker.md": "523119bd5d6599fe", + "agents/gsd-planner.md": "d0e98ddbfb1339f5", + "agents/gsd-project-researcher.md": "ddf7794e81300032", + "agents/gsd-research-synthesizer.md": "a124b00271748d07", "agents/gsd-roadmapper.md": "493ef92b42b12cf4", "agents/gsd-security-auditor.md": "fbd3798eec23651b", "agents/gsd-ui-auditor.md": "771ae08260534d5c", "agents/gsd-ui-checker.md": "8573715bebbd4782", - "agents/gsd-ui-researcher.md": "70ad13e7de7b0da7", + "agents/gsd-ui-researcher.md": "3e737e761bc67073", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "2fef6afe676b0e34", + "agents/gsd-verifier.md": "99e95e235aacffbf", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", + "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -106,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "970c47f816acdb30", + "gsd-core/references/planning-config.md": "33c5b0685be54e96", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -190,119 +190,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "36f58e864aeaf24d", - "gsd-core/workflows/add-phase.md": "4e498058a786615f", - "gsd-core/workflows/add-tests.md": "688a232a0a4b918e", - "gsd-core/workflows/add-todo.md": "792592b2133698a7", - "gsd-core/workflows/ai-integration-phase.md": "0672cc9afb7b7a0b", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "1851e97996d445d5", + "gsd-core/workflows/add-phase.md": "09bdebbc62f3310e", + "gsd-core/workflows/add-tests.md": "ff3a598cdbc5aa6e", + "gsd-core/workflows/add-todo.md": "0fe07cbd29ec252b", + "gsd-core/workflows/ai-integration-phase.md": "d469eb120e52de0f", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "493e4abe4f701662", - "gsd-core/workflows/audit-milestone.md": "26b2428d9a8df7b2", - "gsd-core/workflows/audit-uat.md": "f02cd45df6304b06", - "gsd-core/workflows/autonomous.md": "b615e91ac7c248bd", - "gsd-core/workflows/check-todos.md": "e4209530a4132312", - "gsd-core/workflows/cleanup.md": "78080ff25ba43f8c", - "gsd-core/workflows/code-review-fix.md": "4eebfb7f1612b441", - "gsd-core/workflows/code-review.md": "7630639b5f2f9ff2", - "gsd-core/workflows/complete-milestone.md": "5f7dbe9842b23e57", - "gsd-core/workflows/debug.md": "87c20def8d313e45", - "gsd-core/workflows/diagnose-issues.md": "a0b3fee49d516c0b", + "gsd-core/workflows/audit-fix.md": "ac71c1179444fdc3", + "gsd-core/workflows/audit-milestone.md": "a379eda51d821bce", + "gsd-core/workflows/audit-uat.md": "6e768b1c208a787a", + "gsd-core/workflows/autonomous.md": "c482645c5d1ead46", + "gsd-core/workflows/check-todos.md": "0dda8236355e8c9c", + "gsd-core/workflows/cleanup.md": "82f65f5214ecd748", + "gsd-core/workflows/code-review-fix.md": "959a65773b325ed2", + "gsd-core/workflows/code-review.md": "b31bbd7dbe5ed303", + "gsd-core/workflows/complete-milestone.md": "6e918b72bd885426", + "gsd-core/workflows/debug.md": "197d3642a6704de5", + "gsd-core/workflows/diagnose-issues.md": "9274b11a3db98c65", "gsd-core/workflows/discovery-phase.md": "b32b6197b66c9a13", - "gsd-core/workflows/discuss-phase-assumptions.md": "3689bacffdd7cdd4", + "gsd-core/workflows/discuss-phase-assumptions.md": "3d05b08eae75c7bd", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "9c4af7ae57aaad8f", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "5522bd33cbd9b9b8", + "gsd-core/workflows/discuss-phase.md": "4509657816c5566a", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "c9cd7db62e76ebcb", "gsd-core/workflows/discuss-phase/modes/all.md": "e698b84ebb2ff56d", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "bb489751893f4498", + "gsd-core/workflows/discuss-phase/modes/auto.md": "6ba5c7b738f44003", "gsd-core/workflows/discuss-phase/modes/batch.md": "21ee55869eaa7ece", - "gsd-core/workflows/discuss-phase/modes/chain.md": "c643b0b42b24e0d4", + "gsd-core/workflows/discuss-phase/modes/chain.md": "4739c3d2ef20a76c", "gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "e1043e27b50a5e18", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "461d545bbde0dc8f", - "gsd-core/workflows/docs-update.md": "dd1050b32c2dc170", - "gsd-core/workflows/edit-phase.md": "38f9c9945073ac8c", - "gsd-core/workflows/eval-review.md": "48fdef1cf0e67525", - "gsd-core/workflows/execute-phase.md": "5e36e2287a165064", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "44d46d3e98942efc", + "gsd-core/workflows/do.md": "f3328dbd4416f11a", + "gsd-core/workflows/docs-update.md": "f13571f08e083356", + "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", + "gsd-core/workflows/eval-review.md": "37d545d4f0db4927", + "gsd-core/workflows/execute-phase.md": "0f90fb13e63cf2b2", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c985a30317a1aa6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a2fc97089560ec0a", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "1e0cc4675bcf1496", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "6d437a23e6d9ffcc", - "gsd-core/workflows/explore.md": "9f24bf678b1ef341", - "gsd-core/workflows/extract-learnings.md": "0e0eead67cec3d28", + "gsd-core/workflows/execute-plan.md": "4910f75bab2040ab", + "gsd-core/workflows/explore.md": "8a5437aa0c239c38", + "gsd-core/workflows/extract-learnings.md": "3fcc858b20d0d0e6", "gsd-core/workflows/fast.md": "0162075e44072447", - "gsd-core/workflows/forensics.md": "96103895b70d652c", - "gsd-core/workflows/graduation.md": "63b74175d5e9cc1e", - "gsd-core/workflows/health.md": "9ddf28b84e1ce089", + "gsd-core/workflows/forensics.md": "665546666547875d", + "gsd-core/workflows/graduation.md": "1ca877cda258a5de", + "gsd-core/workflows/health.md": "1f9fd2deea45896f", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "1b3c315342701265", - "gsd-core/workflows/help/modes/full.md": "6d4aacaec9858e28", - "gsd-core/workflows/help/modes/topic.md": "5419498effee148f", - "gsd-core/workflows/import.md": "47cc99b635e45f82", + "gsd-core/workflows/help/modes/full.md": "62c71f57f047999b", + "gsd-core/workflows/help/modes/topic.md": "229e3f3d85bda04b", + "gsd-core/workflows/import.md": "31af58468db15daf", "gsd-core/workflows/inbox.md": "e9ea37b2d46dc5b4", - "gsd-core/workflows/ingest-docs.md": "9554d457d64b7c17", - "gsd-core/workflows/insert-phase.md": "ff204ee159b41506", + "gsd-core/workflows/ingest-docs.md": "fba176ad3cc22f5f", + "gsd-core/workflows/insert-phase.md": "753fa719f0d41d76", "gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620", - "gsd-core/workflows/list-seeds.md": "fa287a9ed912eb17", - "gsd-core/workflows/list-workspaces.md": "4668ebdc3380a7a6", - "gsd-core/workflows/manager.md": "79a6e4de6654f4e7", - "gsd-core/workflows/map-codebase.md": "f90d0577d254c38e", - "gsd-core/workflows/milestone-summary.md": "feb8305a862a79de", - "gsd-core/workflows/mvp-phase.md": "1d2292f3c444c13d", - "gsd-core/workflows/new-milestone.md": "f69e9ccc51ab956b", - "gsd-core/workflows/new-project.md": "d1a0070ed292c25a", - "gsd-core/workflows/new-workspace.md": "555689ccf58bafdb", - "gsd-core/workflows/next.md": "569c68513fd94ea7", + "gsd-core/workflows/list-seeds.md": "74ec072a74f8fdfe", + "gsd-core/workflows/list-workspaces.md": "886e99378a3d19d9", + "gsd-core/workflows/manager.md": "212a50d3f65fff21", + "gsd-core/workflows/map-codebase.md": "713561638fb1b88e", + "gsd-core/workflows/milestone-summary.md": "a0063cfbe08f2250", + "gsd-core/workflows/mvp-phase.md": "8ed9f4552350ede8", + "gsd-core/workflows/new-milestone.md": "af5ad8ed5aac6677", + "gsd-core/workflows/new-project.md": "32ce66cbeaa26cc5", + "gsd-core/workflows/new-workspace.md": "6b6fbad18d30f783", + "gsd-core/workflows/next.md": "2163195861877de5", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "acc9130fb1e94f0b", - "gsd-core/workflows/pause-work.md": "09a6b8980f7b771a", - "gsd-core/workflows/plan-milestone-gaps.md": "022822b3b6971b75", - "gsd-core/workflows/plan-phase.md": "8eddecda8fcd8765", + "gsd-core/workflows/pause-work.md": "c20d267e28ce92f0", + "gsd-core/workflows/plan-milestone-gaps.md": "26db7b9329b7ddc8", + "gsd-core/workflows/plan-phase.md": "fc7d25c0649e2fdf", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "382dac17d70ebfac", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "778b73a8db6f7c32", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "619946c879f33b9d", - "gsd-core/workflows/plan-review-convergence.md": "8fb889570c17db15", - "gsd-core/workflows/plant-seed.md": "dc911406ada4d188", - "gsd-core/workflows/pr-branch.md": "e939128047e02395", - "gsd-core/workflows/profile-user.md": "0831c4b96b1265c9", - "gsd-core/workflows/progress.md": "3e2b44a7a175654c", - "gsd-core/workflows/quick.md": "bd2b2b1e2da01f6a", - "gsd-core/workflows/reapply-patches.md": "ea66e63f56e7deb3", - "gsd-core/workflows/remove-phase.md": "5a2521695edd486b", - "gsd-core/workflows/remove-workspace.md": "ed8e5e30c33f1bfd", - "gsd-core/workflows/resume-project.md": "ee9dcc4e3dd3e32c", - "gsd-core/workflows/review.md": "a2dab55fa3acfca0", - "gsd-core/workflows/scan.md": "afc48f3339293b30", - "gsd-core/workflows/secure-phase.md": "882886f04d3b7e82", + "gsd-core/workflows/plan-review-convergence.md": "85629dd3815dcf64", + "gsd-core/workflows/plant-seed.md": "856ad565b2eb0c47", + "gsd-core/workflows/pr-branch.md": "79fd55b88ea2db9c", + "gsd-core/workflows/profile-user.md": "672821e6b1266645", + "gsd-core/workflows/progress.md": "94768f835b0b8908", + "gsd-core/workflows/quick.md": "9bbf907e39688638", + "gsd-core/workflows/reapply-patches.md": "21b38c374f19fd78", + "gsd-core/workflows/remove-phase.md": "a46c2fe853bf4e86", + "gsd-core/workflows/remove-workspace.md": "ae0e1c6d4438d663", + "gsd-core/workflows/resume-project.md": "f242e4c8aba18ea2", + "gsd-core/workflows/review.md": "34a23b9b65fb55f6", + "gsd-core/workflows/scan.md": "63631467651d9ca8", + "gsd-core/workflows/secure-phase.md": "6cc236e53c2e7d56", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "8f12ba07bf7a795f", - "gsd-core/workflows/settings-integrations.md": "9aa7005e6dd84bcc", - "gsd-core/workflows/settings.md": "4332d1ee0efe797b", - "gsd-core/workflows/ship.md": "0647d19b5487b1a3", - "gsd-core/workflows/sketch-wrap-up.md": "4894dac77fc42655", - "gsd-core/workflows/sketch.md": "52f4a04f511e205e", - "gsd-core/workflows/spec-phase.md": "56cecc44b2cc0bc4", - "gsd-core/workflows/spike-wrap-up.md": "1f57905138a648ac", - "gsd-core/workflows/spike.md": "48df8b626cbd378d", - "gsd-core/workflows/stats.md": "18089135bc41f1b4", + "gsd-core/workflows/settings-advanced.md": "252d3f848c95220e", + "gsd-core/workflows/settings-integrations.md": "f8f756709ec02363", + "gsd-core/workflows/settings.md": "01cf9ffd340cff64", + "gsd-core/workflows/ship.md": "c08f0fe3025d2c86", + "gsd-core/workflows/sketch-wrap-up.md": "dbec602d104cb951", + "gsd-core/workflows/sketch.md": "44ff275150b6d045", + "gsd-core/workflows/smart-entry.md": "d8018578571f08d5", + "gsd-core/workflows/spec-phase.md": "ab8fad8038b14cad", + "gsd-core/workflows/spike-wrap-up.md": "6fe876cb87603bc3", + "gsd-core/workflows/spike.md": "c042a437baaf10ad", + "gsd-core/workflows/stats.md": "e4f84542fb5721ef", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "61e0eee731434ea9", - "gsd-core/workflows/transition.md": "b49ddd9247f804e7", - "gsd-core/workflows/ui-phase.md": "a725ebdd4f47fb97", - "gsd-core/workflows/ui-review.md": "b3221cac976daffa", - "gsd-core/workflows/ultraplan-phase.md": "06ac6fbb061b2464", + "gsd-core/workflows/thread.md": "0582c6be8a78bbd8", + "gsd-core/workflows/transition.md": "163d220813b0835f", + "gsd-core/workflows/ui-phase.md": "871655025b431a55", + "gsd-core/workflows/ui-review.md": "4e70afbfd5601853", + "gsd-core/workflows/ultraplan-phase.md": "77b58ef8af5209bd", "gsd-core/workflows/undo.md": "59b8baa54efc4110", - "gsd-core/workflows/update.md": "e259898f86ae7133", - "gsd-core/workflows/validate-phase.md": "70d102b4d5113dd4", - "gsd-core/workflows/verify-phase.md": "67eefbd1f6417281", - "gsd-core/workflows/verify-work.md": "b48ff071a4c733c9", + "gsd-core/workflows/update.md": "1f935251fca1f276", + "gsd-core/workflows/validate-phase.md": "1c0ebe56d96a14d1", + "gsd-core/workflows/verify-phase.md": "53cbdce394dcdac0", + "gsd-core/workflows/verify-work.md": "d3a0970205acc6a5", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", @@ -321,8 +322,8 @@ "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc", "skills/gsd-ns-context/skills/graphify/SKILL.md": "e0253aef14693a7e", "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "0910348701b1fc65", - "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "92740c97e0ce6942", - "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "d41523e659d1920f", + "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "36c486f14abe869a", + "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "2d95e385fee26dee", "skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f", "skills/gsd-ns-ideate/skills/capture/SKILL.md": "90aee26970fa7639", "skills/gsd-ns-ideate/skills/explore/SKILL.md": "d8e26a5ed95a4ecc", @@ -370,7 +371,7 @@ "skills/gsd-ns-review/skills/ui-phase/SKILL.md": "89a29a2fa62b177e", "skills/gsd-ns-review/skills/ui-review/SKILL.md": "3e23efe03dafd691", "skills/gsd-ns-review/skills/validate-phase/SKILL.md": "fa1ab5c9a869f6cd", - "skills/gsd-ns-workflow/SKILL.md": "7dbd699b5130c0d5", + "skills/gsd-ns-workflow/SKILL.md": "0cb9c23c065fe448", "skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "6d64ae85b590274f", "skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "c458b792bdf5b1f2", "skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "37dc7b78ceb74803", @@ -378,6 +379,7 @@ "skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "eb0158de64f22a55", "skills/gsd-ns-workflow/skills/fast/SKILL.md": "3eae6536d09c2532", "skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "81c98f4436888cb8", + "skills/gsd-ns-workflow/skills/next/SKILL.md": "02993a5aa046eadd", "skills/gsd-ns-workflow/skills/phase/SKILL.md": "50f6cc4df79a26b7", "skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "44d42fa41a094ad9", "skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "fee26bc1daedbff5", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index 09cbdb6e3..d1dc20935 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -4,45 +4,45 @@ "agents/gsd-advisor-researcher.md": "e5be2680b690c198", "agents/gsd-ai-researcher.md": "abfc97706f16aaaf", "agents/gsd-assumptions-analyzer.md": "b3219da6b194fdef", - "agents/gsd-code-fixer.md": "4d66f7e056369896", + "agents/gsd-code-fixer.md": "f00d815ec535a168", "agents/gsd-code-reviewer.md": "efc0d2dee321c654", "agents/gsd-codebase-mapper.md": "cfa2bbfaf264e1fd", - "agents/gsd-debug-session-manager.md": "40edd70065aa07bb", - "agents/gsd-debugger.md": "107754fc10a1aafa", + "agents/gsd-debug-session-manager.md": "793d9a80778d1080", + "agents/gsd-debugger.md": "6b28c99a37402200", "agents/gsd-doc-classifier.md": "5807f1f7cfa40c42", "agents/gsd-doc-synthesizer.md": "0897098024c17ccd", "agents/gsd-doc-verifier.md": "ede2f297b73b5a86", "agents/gsd-doc-writer.md": "0109294817e475a8", "agents/gsd-domain-researcher.md": "56395dbdabf076f6", - "agents/gsd-eval-auditor.md": "8a2cab3ae8b4674b", + "agents/gsd-eval-auditor.md": "fb64fc5acf359747", "agents/gsd-eval-planner.md": "2049dac060d00eda", - "agents/gsd-executor.md": "9ab8c4acb4206e09", + "agents/gsd-executor.md": "406fdcc0597bea77", "agents/gsd-framework-selector.md": "4b77eebbe9288d80", "agents/gsd-integration-checker.md": "4ffb37fb230c2b90", - "agents/gsd-intel-updater.md": "16ee6795da80a7c0", - "agents/gsd-mempalace-curator.md": "63676937f8970bf3", + "agents/gsd-intel-updater.md": "a81d77c143c02108", + "agents/gsd-mempalace-curator.md": "78f4894a9d5f44b1", "agents/gsd-nyquist-auditor.md": "0ef8609fd897e399", "agents/gsd-pattern-mapper.md": "ada0c169daa2f0ec", - "agents/gsd-phase-researcher.md": "bf5104cc11b973e9", - "agents/gsd-plan-checker.md": "15ebf7ea032c6de2", - "agents/gsd-planner.md": "f508c186b837b3f0", - "agents/gsd-project-researcher.md": "3fbfb4b098966e64", - "agents/gsd-research-synthesizer.md": "beb116fe6df1b376", + "agents/gsd-phase-researcher.md": "2a45ebde829555ec", + "agents/gsd-plan-checker.md": "33fbf70b7b24eb1e", + "agents/gsd-planner.md": "f408404c60840c9f", + "agents/gsd-project-researcher.md": "f6697b316b5995ba", + "agents/gsd-research-synthesizer.md": "04036f38c1d373ea", "agents/gsd-roadmapper.md": "fb62e1e3de84b5f9", "agents/gsd-security-auditor.md": "13b660e2d336ed8e", "agents/gsd-ui-auditor.md": "20cc99872e9b998b", "agents/gsd-ui-checker.md": "b9c38249bff35478", - "agents/gsd-ui-researcher.md": "e31fa75e26f957f2", + "agents/gsd-ui-researcher.md": "f830742b9493601c", "agents/gsd-user-profiler.md": "622220df0654b6bf", - "agents/gsd-verifier.md": "b16b34a580941124", + "agents/gsd-verifier.md": "a07b00b9c5b7b338", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e", + "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", - "gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268", - "gsd-core/bin/shared/model-catalog.json": "9e74bf9cc8aa3774", - "gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4", + "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", + "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", "gsd-core/contexts/research.md": "b3285d8e7209cc3b", @@ -106,7 +106,7 @@ "gsd-core/references/planner-reviews.md": "da39eace09a10743", "gsd-core/references/planner-revision.md": "86ba8a511f081f05", "gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b", - "gsd-core/references/planning-config.md": "742e11db47c5c0aa", + "gsd-core/references/planning-config.md": "062db9fe16ec76f9", "gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6", "gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020", "gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8", @@ -190,119 +190,120 @@ "gsd-core/templates/user-profile.md": "20749f23e4c413fc", "gsd-core/templates/user-setup.md": "78b7d718b6e8d67c", "gsd-core/templates/verification-report.md": "dd5faa6254183731", - "gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb", - "gsd-core/workflows/add-backlog.md": "b84c744efaed7a2e", - "gsd-core/workflows/add-phase.md": "199ac1b4879fb51a", - "gsd-core/workflows/add-tests.md": "5aafbe6d624d41c9", - "gsd-core/workflows/add-todo.md": "7151303ccc3e6d05", - "gsd-core/workflows/ai-integration-phase.md": "9b287efec21a3c0b", + "gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335", + "gsd-core/workflows/add-backlog.md": "61169973a10b1321", + "gsd-core/workflows/add-phase.md": "f9b1f7cc229b57f8", + "gsd-core/workflows/add-tests.md": "b5e03955cb29d7d8", + "gsd-core/workflows/add-todo.md": "cab0d8215579fbdd", + "gsd-core/workflows/ai-integration-phase.md": "8948988717506320", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", - "gsd-core/workflows/audit-fix.md": "e1ad3e58979d9eef", - "gsd-core/workflows/audit-milestone.md": "e578d1ce71b172e6", - "gsd-core/workflows/audit-uat.md": "0f779101b40c7229", - "gsd-core/workflows/autonomous.md": "afb9649e6d9b3860", - "gsd-core/workflows/check-todos.md": "ad2ff17a672e7101", - "gsd-core/workflows/cleanup.md": "edc0bc375acdb563", - "gsd-core/workflows/code-review-fix.md": "aa750f6d1abd3b9f", - "gsd-core/workflows/code-review.md": "20c76ddd702e7cd5", - "gsd-core/workflows/complete-milestone.md": "921f9197b4d7f5fd", - "gsd-core/workflows/debug.md": "9679214d9472e213", - "gsd-core/workflows/diagnose-issues.md": "7c0b8debfc906ca0", + "gsd-core/workflows/audit-fix.md": "babe6812b86cec8f", + "gsd-core/workflows/audit-milestone.md": "ac2238ea6c11ae9e", + "gsd-core/workflows/audit-uat.md": "d496e39402e160de", + "gsd-core/workflows/autonomous.md": "fe7bb7c978f305a2", + "gsd-core/workflows/check-todos.md": "afc840fceb07bf99", + "gsd-core/workflows/cleanup.md": "93c14107979a4428", + "gsd-core/workflows/code-review-fix.md": "9b2de93a6087774d", + "gsd-core/workflows/code-review.md": "2f0ebfb7a2e33764", + "gsd-core/workflows/complete-milestone.md": "f463bf4e86ac26f6", + "gsd-core/workflows/debug.md": "52243eb936a43150", + "gsd-core/workflows/diagnose-issues.md": "447072aa72385271", "gsd-core/workflows/discovery-phase.md": "7dcf150998559c11", - "gsd-core/workflows/discuss-phase-assumptions.md": "3f3b0ac79cdb5631", + "gsd-core/workflows/discuss-phase-assumptions.md": "f57000d5c5fb178a", "gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6", - "gsd-core/workflows/discuss-phase.md": "25d8a61ecf8c21a0", - "gsd-core/workflows/discuss-phase/modes/advisor.md": "1be08d135fd60027", + "gsd-core/workflows/discuss-phase.md": "ce4e6abce9cb2d4e", + "gsd-core/workflows/discuss-phase/modes/advisor.md": "cb49f485c4a1f09e", "gsd-core/workflows/discuss-phase/modes/all.md": "d2a1d16e2508a0cd", "gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730", - "gsd-core/workflows/discuss-phase/modes/auto.md": "a66e476942667f9f", + "gsd-core/workflows/discuss-phase/modes/auto.md": "e98b6efbfd66d409", "gsd-core/workflows/discuss-phase/modes/batch.md": "c23d5bdbdb60362c", - "gsd-core/workflows/discuss-phase/modes/chain.md": "58125711f7c432ce", + "gsd-core/workflows/discuss-phase/modes/chain.md": "2f3acba636e436aa", "gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985", "gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2", "gsd-core/workflows/discuss-phase/modes/text.md": "aeb56fe7b95dd786", "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73", - "gsd-core/workflows/do.md": "fc00009666985144", - "gsd-core/workflows/docs-update.md": "a3c2ec2c856aaabc", - "gsd-core/workflows/edit-phase.md": "1666ca537fbef030", - "gsd-core/workflows/eval-review.md": "bb01b3300db963bc", - "gsd-core/workflows/execute-phase.md": "20063847abe7ce75", - "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "579a3dcf8d69de31", + "gsd-core/workflows/do.md": "a7ff800fdab468c7", + "gsd-core/workflows/docs-update.md": "70f73cc8c27e0ca0", + "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", + "gsd-core/workflows/eval-review.md": "b28be79ef29f16fd", + "gsd-core/workflows/execute-phase.md": "7cf72d7c95491ece", + "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "47ae5482f8e64100", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", - "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bbd704d6b6f0787b", + "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0f9ccd7edea1d6a9", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "f6bc701c05bb7d70", - "gsd-core/workflows/explore.md": "7a9bb001b196409f", - "gsd-core/workflows/extract-learnings.md": "58ce8fbc17388788", + "gsd-core/workflows/execute-plan.md": "c8567fb4438b4404", + "gsd-core/workflows/explore.md": "04e461ff8159a24e", + "gsd-core/workflows/extract-learnings.md": "af793bdf4ffd1c8a", "gsd-core/workflows/fast.md": "0162075e44072447", - "gsd-core/workflows/forensics.md": "0e933018fd06e629", - "gsd-core/workflows/graduation.md": "5734685667d8f512", - "gsd-core/workflows/health.md": "644b42c215b1b00e", + "gsd-core/workflows/forensics.md": "3d1ce16b5f605592", + "gsd-core/workflows/graduation.md": "a766039ff6ca653f", + "gsd-core/workflows/health.md": "7b19d6e2c0357c3e", "gsd-core/workflows/help.md": "08e1349950c5602a", "gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495", "gsd-core/workflows/help/modes/default.md": "91509fe03bad9795", - "gsd-core/workflows/help/modes/full.md": "8fb3c93df5883f56", - "gsd-core/workflows/help/modes/topic.md": "9f00f5f94c5497aa", - "gsd-core/workflows/import.md": "f5b3826c4cfb2682", + "gsd-core/workflows/help/modes/full.md": "4c1a43f7095647e1", + "gsd-core/workflows/help/modes/topic.md": "177d351f7465787d", + "gsd-core/workflows/import.md": "029cacf530aca86b", "gsd-core/workflows/inbox.md": "797c287852eb8957", - "gsd-core/workflows/ingest-docs.md": "6f0ddb1130216a7d", - "gsd-core/workflows/insert-phase.md": "238e327203e04ed1", + "gsd-core/workflows/ingest-docs.md": "78ba04ca39f28e8d", + "gsd-core/workflows/insert-phase.md": "9aac75665c3a0ee8", "gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620", - "gsd-core/workflows/list-seeds.md": "a87319b154d0fb8c", - "gsd-core/workflows/list-workspaces.md": "ff4ad30adc55d5b8", - "gsd-core/workflows/manager.md": "072a9f2ba6084641", - "gsd-core/workflows/map-codebase.md": "6c89a16e0d9fddfe", - "gsd-core/workflows/milestone-summary.md": "957f9620aa472f87", - "gsd-core/workflows/mvp-phase.md": "bcc8037866fa1d4d", - "gsd-core/workflows/new-milestone.md": "b43ff95a594bd688", - "gsd-core/workflows/new-project.md": "d6709238a3ada30c", - "gsd-core/workflows/new-workspace.md": "8a9ab30eac218190", - "gsd-core/workflows/next.md": "3ebbf30622521e76", + "gsd-core/workflows/list-seeds.md": "39162bbefe932b3d", + "gsd-core/workflows/list-workspaces.md": "6950fb740a1e96ab", + "gsd-core/workflows/manager.md": "fc1e8daaf8d40bf0", + "gsd-core/workflows/map-codebase.md": "0a2a653ed1603784", + "gsd-core/workflows/milestone-summary.md": "1fdbae19ad06a0a3", + "gsd-core/workflows/mvp-phase.md": "e3c4cade4fe69408", + "gsd-core/workflows/new-milestone.md": "33db858beb76e3c5", + "gsd-core/workflows/new-project.md": "0ff192c54373ab8a", + "gsd-core/workflows/new-workspace.md": "8c2b60fbbf241e03", + "gsd-core/workflows/next.md": "d48cea140a5153cb", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "1c1e466c764e3deb", - "gsd-core/workflows/pause-work.md": "5ce6a137bd9fc0f8", - "gsd-core/workflows/plan-milestone-gaps.md": "19911e87fd4185f2", - "gsd-core/workflows/plan-phase.md": "f6e8c5e38d5c5a52", + "gsd-core/workflows/pause-work.md": "93fcc1c845da6396", + "gsd-core/workflows/plan-milestone-gaps.md": "7880866ee1caf923", + "gsd-core/workflows/plan-phase.md": "3e143f39514f8192", "gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb", - "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "7c2be59e3e19299a", + "gsd-core/workflows/plan-phase/steps/prd-express-path.md": "80b1ba493a9a967f", "gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "3fed4740a91d0443", - "gsd-core/workflows/plan-review-convergence.md": "7e01c19b7b9a2aad", - "gsd-core/workflows/plant-seed.md": "9d36ecd08093a494", - "gsd-core/workflows/pr-branch.md": "cc28ab5cd9db16b9", - "gsd-core/workflows/profile-user.md": "fa3b87e1f2d71371", - "gsd-core/workflows/progress.md": "36f1d4621c1798a4", - "gsd-core/workflows/quick.md": "709e40e10d1900b4", - "gsd-core/workflows/reapply-patches.md": "04885b2129cbb457", - "gsd-core/workflows/remove-phase.md": "24559d23e008c9c3", - "gsd-core/workflows/remove-workspace.md": "e958c1e932aef492", - "gsd-core/workflows/resume-project.md": "c5731b8aabed70f9", - "gsd-core/workflows/review.md": "dc8366ef168183db", - "gsd-core/workflows/scan.md": "8aa95448b1ba4a4a", - "gsd-core/workflows/secure-phase.md": "550152cd82c25c00", + "gsd-core/workflows/plan-review-convergence.md": "1fd8d6e1a833e700", + "gsd-core/workflows/plant-seed.md": "6cf61f540cdbd8b9", + "gsd-core/workflows/pr-branch.md": "acd59f915d018ad4", + "gsd-core/workflows/profile-user.md": "c4313672b81b5bcd", + "gsd-core/workflows/progress.md": "18813a345bd2343a", + "gsd-core/workflows/quick.md": "3acd391cc0c3813a", + "gsd-core/workflows/reapply-patches.md": "d449a23d3acf6379", + "gsd-core/workflows/remove-phase.md": "e7a6af429b36e77b", + "gsd-core/workflows/remove-workspace.md": "b5e60fbb33b3e33a", + "gsd-core/workflows/resume-project.md": "82cfe1b8cb17c085", + "gsd-core/workflows/review.md": "0873ea94ca23383c", + "gsd-core/workflows/scan.md": "12c11b2edc165df9", + "gsd-core/workflows/secure-phase.md": "7bf923689bf58288", "gsd-core/workflows/session-report.md": "2e5b1205324ddefa", - "gsd-core/workflows/settings-advanced.md": "68269242a4e4c2cc", - "gsd-core/workflows/settings-integrations.md": "ff9af62cdc5c7908", - "gsd-core/workflows/settings.md": "38a801a7b89a9379", - "gsd-core/workflows/ship.md": "ddfd8e847836dd94", - "gsd-core/workflows/sketch-wrap-up.md": "67e90c60062d0d5f", - "gsd-core/workflows/sketch.md": "7418628ba45dd6c0", - "gsd-core/workflows/spec-phase.md": "e8ed811cd67076b7", - "gsd-core/workflows/spike-wrap-up.md": "f8e39782c6e42ef7", - "gsd-core/workflows/spike.md": "aa5934044317ba7a", - "gsd-core/workflows/stats.md": "c49d3de15375d04b", + "gsd-core/workflows/settings-advanced.md": "4c030adc097d1746", + "gsd-core/workflows/settings-integrations.md": "b082fc518b484c07", + "gsd-core/workflows/settings.md": "13ca50dba129c17b", + "gsd-core/workflows/ship.md": "c035bb8b3bb7efbb", + "gsd-core/workflows/sketch-wrap-up.md": "10063f56c2c7f141", + "gsd-core/workflows/sketch.md": "25c1f8f7acfb1da9", + "gsd-core/workflows/smart-entry.md": "bd81482cb6a7ac53", + "gsd-core/workflows/spec-phase.md": "c05348d644f9d77a", + "gsd-core/workflows/spike-wrap-up.md": "8029ca4effb5b716", + "gsd-core/workflows/spike.md": "a94af5171bb9d2ce", + "gsd-core/workflows/stats.md": "d58325fc3fb8d1b6", "gsd-core/workflows/sync-skills.md": "b505e6f8331c0918", - "gsd-core/workflows/thread.md": "3e9fcfbb254a31a7", - "gsd-core/workflows/transition.md": "9a49f9c48805f666", - "gsd-core/workflows/ui-phase.md": "54e01f1973450a3c", - "gsd-core/workflows/ui-review.md": "fea93c281767f8d7", - "gsd-core/workflows/ultraplan-phase.md": "a164cc6aa4fb5bbb", + "gsd-core/workflows/thread.md": "d83a0d0bd0f94c4c", + "gsd-core/workflows/transition.md": "1bd8a772f0aac5ba", + "gsd-core/workflows/ui-phase.md": "2fcfffcfb344456d", + "gsd-core/workflows/ui-review.md": "dca8100a43161ea7", + "gsd-core/workflows/ultraplan-phase.md": "53b77a8edf60acd0", "gsd-core/workflows/undo.md": "18dec684fb1076f9", - "gsd-core/workflows/update.md": "cbf978622ad0f577", - "gsd-core/workflows/validate-phase.md": "a36cf2c688c261ac", - "gsd-core/workflows/verify-phase.md": "8a89a915dad5960b", - "gsd-core/workflows/verify-work.md": "f4429f002440a5ae", + "gsd-core/workflows/update.md": "79aaf4b8f1f83045", + "gsd-core/workflows/validate-phase.md": "2db47bf5547d7b9d", + "gsd-core/workflows/verify-phase.md": "ea7f8a705b297e27", + "gsd-core/workflows/verify-work.md": "5ad63a5edfb6acac", "scripts/changeset/README.md": "86ff89331dfd94b2", "scripts/changeset/cli.cjs": "68f92a344b199271", "scripts/changeset/github-release-notes.cjs": "795677f0c009b132", diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index eb71f2dd8..29fcbfed7 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -1,91 +1,92 @@ { - "add-backlog.md": 7132, - "add-phase.md": 7203, - "add-tests.md": 16901, - "add-todo.md": 8952, - "ai-integration-phase.md": 14761, + "add-backlog.md": 7176, + "add-phase.md": 7247, + "add-tests.md": 16945, + "add-todo.md": 8996, + "ai-integration-phase.md": 14805, "analyze-dependencies.md": 3887, - "audit-fix.md": 10988, - "audit-milestone.md": 17637, - "audit-uat.md": 7425, - "autonomous.md": 42430, - "check-todos.md": 9431, - "cleanup.md": 9897, - "code-review-fix.md": 23890, - "code-review.md": 31602, - "complete-milestone.md": 31027, - "debug.md": 13505, - "diagnose-issues.md": 12820, + "audit-fix.md": 11032, + "audit-milestone.md": 17681, + "audit-uat.md": 7469, + "autonomous.md": 42474, + "check-todos.md": 9475, + "cleanup.md": 9941, + "code-review-fix.md": 23934, + "code-review.md": 31646, + "complete-milestone.md": 31071, + "debug.md": 13549, + "diagnose-issues.md": 12864, "discovery-phase.md": 8651, - "discuss-phase-assumptions.md": 26984, + "discuss-phase-assumptions.md": 27028, "discuss-phase-power.md": 11273, - "discuss-phase.md": 31990, - "do.md": 10068, - "docs-update.md": 55662, - "edit-phase.md": 12883, - "eval-review.md": 9923, - "execute-phase.md": 93515, - "execute-plan.md": 32611, - "explore.md": 10497, - "extract-learnings.md": 12849, + "discuss-phase.md": 31986, + "do.md": 10112, + "docs-update.md": 55706, + "edit-phase.md": 12927, + "eval-review.md": 9967, + "execute-phase.md": 93528, + "execute-plan.md": 32655, + "explore.md": 10541, + "extract-learnings.md": 12893, "fast.md": 4149, - "forensics.md": 12487, - "graduation.md": 11578, - "health.md": 11824, + "forensics.md": 12531, + "graduation.md": 11622, + "health.md": 11868, "help.md": 1722, - "import.md": 14604, + "import.md": 14648, "inbox.md": 14407, - "ingest-docs.md": 18336, - "insert-phase.md": 8943, + "ingest-docs.md": 18380, + "insert-phase.md": 8987, "list-phase-assumptions.md": 4305, - "list-seeds.md": 6943, - "list-workspaces.md": 5655, - "manager.md": 27258, - "map-codebase.md": 20789, - "milestone-summary.md": 11798, - "mvp-phase.md": 13582, - "new-milestone.md": 32844, - "new-project.md": 66138, - "new-workspace.md": 11254, - "next.md": 20094, + "list-seeds.md": 6987, + "list-workspaces.md": 5699, + "manager.md": 27302, + "map-codebase.md": 20833, + "milestone-summary.md": 11842, + "mvp-phase.md": 13626, + "new-milestone.md": 32888, + "new-project.md": 66182, + "new-workspace.md": 11298, + "next.md": 20138, "node-repair.md": 4173, "note.md": 6563, - "pause-work.md": 14397, - "plan-milestone-gaps.md": 11765, - "plan-phase.md": 89775, - "plan-review-convergence.md": 23468, - "plant-seed.md": 11741, - "pr-branch.md": 15919, - "profile-user.md": 21202, - "progress.md": 30555, - "quick.md": 50408, - "reapply-patches.md": 20393, - "remove-phase.md": 8469, - "remove-workspace.md": 7507, - "resume-project.md": 17226, - "review.md": 40956, - "scan.md": 7688, - "secure-phase.md": 13476, + "pause-work.md": 14441, + "plan-milestone-gaps.md": 11809, + "plan-phase.md": 90455, + "plan-review-convergence.md": 23512, + "plant-seed.md": 11785, + "pr-branch.md": 15963, + "profile-user.md": 21246, + "progress.md": 30599, + "quick.md": 50452, + "reapply-patches.md": 20312, + "remove-phase.md": 8513, + "remove-workspace.md": 7551, + "resume-project.md": 17270, + "review.md": 43356, + "scan.md": 7732, + "secure-phase.md": 13520, "session-report.md": 4044, - "settings-advanced.md": 39646, - "settings-integrations.md": 15848, - "settings.md": 33413, - "ship.md": 24647, - "sketch-wrap-up.md": 14223, - "sketch.md": 19960, - "spec-phase.md": 31752, - "spike-wrap-up.md": 15092, - "spike.md": 24517, - "stats.md": 6718, + "settings-advanced.md": 39718, + "settings-integrations.md": 15892, + "settings.md": 33457, + "ship.md": 24691, + "sketch-wrap-up.md": 14267, + "sketch.md": 20004, + "smart-entry.md": 11124, + "spec-phase.md": 31945, + "spike-wrap-up.md": 15136, + "spike.md": 24561, + "stats.md": 6762, "sync-skills.md": 6125, - "thread.md": 12464, - "transition.md": 22016, - "ui-phase.md": 15477, - "ui-review.md": 11172, - "ultraplan-phase.md": 10468, + "thread.md": 12508, + "transition.md": 22060, + "ui-phase.md": 15521, + "ui-review.md": 11216, + "ultraplan-phase.md": 10512, "undo.md": 10431, - "update.md": 21053, - "validate-phase.md": 10745, - "verify-phase.md": 40728, - "verify-work.md": 35171 + "update.md": 20914, + "validate-phase.md": 10789, + "verify-phase.md": 40772, + "verify-work.md": 38267 } From f66c77aff813babfa4b9cbde080f51553f1c2ae4 Mon Sep 17 00:00:00 2001 From: Joe Slitzker Date: Mon, 6 Jul 2026 13:07:46 -0500 Subject: [PATCH 48/75] test(#1941): regenerate golden fixtures after rebase onto next (zcode runtime) next gained a new zcode runtime (#2039) since the last rebase, adding tests/fixtures/golden-install-parity/zcode.json and shifting every other runtime's install hashes again. Regenerated on Linux (WSL); full suite (2830 tests) passes. --- tests/fixtures/golden-install-parity/antigravity.json | 5 +++-- tests/fixtures/golden-install-parity/augment.json | 5 +++-- tests/fixtures/golden-install-parity/claude.json | 5 +++-- tests/fixtures/golden-install-parity/cline.json | 5 +++-- tests/fixtures/golden-install-parity/codebuddy.json | 5 +++-- tests/fixtures/golden-install-parity/codex.json | 5 +++-- tests/fixtures/golden-install-parity/copilot.json | 5 +++-- tests/fixtures/golden-install-parity/cursor.json | 5 +++-- tests/fixtures/golden-install-parity/hermes.json | 5 +++-- tests/fixtures/golden-install-parity/kilo.json | 5 +++-- tests/fixtures/golden-install-parity/kimi.json | 5 +++-- tests/fixtures/golden-install-parity/opencode.json | 5 +++-- tests/fixtures/golden-install-parity/qwen.json | 5 +++-- tests/fixtures/golden-install-parity/trae.json | 5 +++-- tests/fixtures/golden-install-parity/windsurf.json | 5 +++-- tests/fixtures/golden-install-parity/zcode.json | 2 +- 16 files changed, 46 insertions(+), 31 deletions(-) diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 4557df2e5..738934d69 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -37,11 +37,12 @@ "agents/gsd-verifier.md": "224e8df2d8fd1d95", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", + "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", + "gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "8bc541aabc2e143c", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index d4e75d87f..eaa7fb7ba 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -107,11 +107,12 @@ "commands/gsd-workstreams.md": "52ab9c585d3a00f3", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 2e64fe353..67d82d1ee 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -36,11 +36,12 @@ "agents/gsd-verifier.md": "2271174b5aa20e31", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index b01b602a6..249c34e6c 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -40,11 +40,12 @@ "agents/gsd-verifier.md": "75912e9cadd83eb3", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf", + "gsd-core/bin/gsd-tools.cjs": "13640341aa311ae3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 7a5e888ae..d2f667992 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -107,11 +107,12 @@ "commands/gsd-workstreams.md": "884b6c8d648422c7", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index bedfce68f..fde33cf6c 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -72,11 +72,12 @@ "config.toml": "a34316b9ac61a620", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 06eee9362..df7ac4c89 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -38,11 +38,12 @@ "copilot-instructions.md": "1fb04111759f1645", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", + "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", + "gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "10226e9512dd44bf", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 18d47d903..38f0ca0a6 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -107,11 +107,12 @@ "commands/gsd-workstreams.md": "112660ceb663c750", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", + "gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828", + "gsd-core/bin/gsd-tools.cjs": "887e2cb9ebdb609d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index e606ab097..de0a888a6 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -37,11 +37,12 @@ "agents/gsd-verifier.md": "82d3e9015ed04017", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f", + "gsd-core/bin/gsd-tools.cjs": "cbdd5da1b973c6ae", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index a7e46a99d..f058bfa39 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -107,11 +107,12 @@ "command/gsd-workstreams.md": "5e57eed1881c3891", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 092d0bea9..9f4648e44 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -73,11 +73,12 @@ "agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index b5dd344dc..ea9589877 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -107,11 +107,12 @@ "command/gsd-workstreams.md": "5e57eed1881c3891", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", + "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 071a61405..bf36be0a3 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -37,11 +37,12 @@ "agents/gsd-verifier.md": "45c450b6d7cc5f0d", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e504d3b82da834ae", + "gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2", + "gsd-core/bin/gsd-tools.cjs": "1118403709188168", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 1f894a16c..c285005e2 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -37,11 +37,12 @@ "agents/gsd-verifier.md": "99e95e235aacffbf", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", + "gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527", + "gsd-core/bin/gsd-tools.cjs": "fa4db2ce1f77ef99", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index d1dc20935..60941d862 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -37,11 +37,12 @@ "agents/gsd-verifier.md": "a07b00b9c5b7b338", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", - "gsd-core/bin/gsd-tools.cjs": "e839e52071d5baa1", + "gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2", + "gsd-core/bin/gsd-tools.cjs": "92e0f7b7eb55af51", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", - "gsd-core/bin/shared/model-catalog.json": "ca909d55f7966269", + "gsd-core/bin/shared/model-catalog.json": "e554a288fcbc1b2e", "gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a", "gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904", "gsd-core/contexts/dev.md": "dcb0de9dce33cf41", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 2f09d5f90..85e467636 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -344,7 +344,7 @@ "gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b", "gsd-core/workflows/profile-user.md": "e23bea0a69c0bb4b", "gsd-core/workflows/progress.md": "893aa3c36983f74b", - "gsd-core/workflows/quick.md": "1bc59c4d97fed876", + "gsd-core/workflows/quick.md": "5747c2d8a37affbb", "gsd-core/workflows/reapply-patches.md": "39050f72601aec89", "gsd-core/workflows/remove-phase.md": "df9a45f0b1880999", "gsd-core/workflows/remove-workspace.md": "a7ca66db6b7c132c", From e3262d94d3fd8f3c33d7e0b789acf72caafec563 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 15:18:23 -0400 Subject: [PATCH 49/75] feat(capabilities): add claude-orchestration capability (Workflow backend) (#1143) Default-off, BETA, claude-only capability adopting Claude Code's Workflow tool (/effort ultracode, Agent SDK >= v0.3.149) as an optional parallel-execution backend for the GSD loop. Restores the wave parallelism + plan-checker + verifier that #853 forces inline on Claude Code, and folds gsd-ultraplan-phase under one runtime gate. - Pure fail-closed core (src/claude-orchestration.cts): detectWorkflowBackend (gate ladder: enabled -> Claude -> backend != inline -> nested+background host -> valid Agent SDK -> SDK >= floor; every miss degrades to inline) and emitWorkflowScript (waves -> parallel() barriers, plans -> gsd-executor + worktree, files_modified overlap -> separate stages, resumeFromRunId, budget). All interpolated identifiers validated script-safe; briefs JSON-quoted. - claude-orchestration command family (gsd-tools claude-orchestration detect-backend|emit-workflow) for orchestrator invocation. - Two gated loop contributions at wired points (execute:wave:post, plan:post); federated config keys (enabled/execution_backend/min_agent_sdk_version). - ADR-1143 implementation amendment; CONTEXT.md glossary entry; explanation doc. On any runtime lacking the Workflow tool, behaviour is byte-identical to today. closes #1143 --- .../1143-claude-orchestration-capability.md | 5 + CONTEXT.md | 2 + .../claude-orchestration/capability.json | 85 +++ .../fragments/execute-wave-post.md | 59 ++ .../fragments/plan-post.md | 28 + docs/INVENTORY-MANIFEST.json | 2 + .../1143-claude-orchestration-capability.md | 36 ++ .../claude-orchestration-capability.md | 94 +++ docs/reference/capability-matrix.md | 3 +- eslint.config.mjs | 2 + gsd-core/bin/lib/capability-registry.cjs | 149 +++++ .../claude-orchestration-command-router.cjs | 136 ++++ gsd-core/bin/lib/claude-orchestration.cjs | 359 +++++++++++ src/claude-orchestration-command-router.cts | 159 +++++ src/claude-orchestration.cts | 449 +++++++++++++ .../check-gap-analysis-plan-post-e2e.test.cjs | 10 +- ...aude-orchestration-command-router.test.cjs | 169 +++++ tests/claude-orchestration.test.cjs | 607 ++++++++++++++++++ ...ecute-wave-post-gate-pipeline-e2e.test.cjs | 12 +- 19 files changed, 2357 insertions(+), 9 deletions(-) create mode 100644 .changeset/1143-claude-orchestration-capability.md create mode 100644 capabilities/claude-orchestration/capability.json create mode 100644 capabilities/claude-orchestration/fragments/execute-wave-post.md create mode 100644 capabilities/claude-orchestration/fragments/plan-post.md create mode 100644 docs/explanation/claude-orchestration-capability.md create mode 100644 gsd-core/bin/lib/claude-orchestration-command-router.cjs create mode 100644 gsd-core/bin/lib/claude-orchestration.cjs create mode 100644 src/claude-orchestration-command-router.cts create mode 100644 src/claude-orchestration.cts create mode 100644 tests/claude-orchestration-command-router.test.cjs create mode 100644 tests/claude-orchestration.test.cjs diff --git a/.changeset/1143-claude-orchestration-capability.md b/.changeset/1143-claude-orchestration-capability.md new file mode 100644 index 000000000..934bc28bc --- /dev/null +++ b/.changeset/1143-claude-orchestration-capability.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 0 +--- +**A default-off, BETA, claude-only "Claude orchestration" capability** — adopts Claude Code's Workflow tool (`/effort ultracode`, Agent SDK ≥ v0.3.149) as an optional parallel-execution backend for the GSD loop, restoring the wave parallelism + plan-checker + verifier that the #853 backgrounded-agent nesting limitation forces inline on Claude Code, and folding the existing `gsd-ultraplan-phase` plan-offload under the same runtime gate. When `claude_orchestration.enabled` is on AND the runtime is Claude AND the Workflow tool is detected AND the Agent SDK meets the floor (`claude_orchestration.min_agent_sdk_version`, default `0.3.149`), `execute-phase` emits a generated Workflow script (`waves → parallel() barriers`, `plans → agent({ agentType: 'gsd-executor', isolation: 'worktree' })`, `files_modified overlap → separate sequential stages`, `resumeFromRunId` wired to the phase run id, shared `budget` pool) that composes the SAME executor agent + worktree isolation the inline path uses, so artifacts/commits are produced identically. Detection is pure and fail-closed (any miss → inline), so on any runtime lacking the Workflow tool behaviour is byte-identical to today. Adds a pure module `gsd-core/bin/lib/claude-orchestration.cjs` (`detectWorkflowBackend`, `emitWorkflowScript`), the `capabilities/claude-orchestration/` declaration with two gated loop contributions (`execute:wave:post`, `plan:post`) and a `claude-orchestration` command family (`gsd-tools claude-orchestration detect-backend|emit-workflow`), federated config keys, and an ADR-1143 implementation amendment. (#1143) diff --git a/CONTEXT.md b/CONTEXT.md index 0b191c568..02e92c938 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -220,6 +220,8 @@ ADR-1244 Phase 4 (D5+D6) orchestration seam (`gsd-core/bin/lib/capability-lifecy ### Capability Command Dispatch ADR-1244 Phase 5 (D7) registry-driven dispatch of capability command families. First-party families (`graphify`/`intel`/`audit`, shipped in `bin/lib/`) dispatch via `dispatchCapabilityCommand` (`gsd-core/bin/gsd-tools.cjs`) against the FROZEN `capability-registry.cjs` `commandFamilies` (confined to `bin/lib/`) — unchanged. Third-party (installed overlay) families dispatch via `dispatchOverlayCapabilityCommand`: after the first-party path returns false, it calls `loadRegistry({ includeInstalled, cwd })` and dispatches a family iff its `capId` is in `_overlay.commandRoots` — which `capability-loader.cjs` populates ONLY for accepted overlay capabilities that declare `commands` AND pass the loader's activation gate (a **committed** ledger entry, present and non-`_pending`, PLUS — for PROJECT scope — a matching user consent record in the Capability Consent Store; GLOBAL scope needs no consent record). A bundle dropped on disk with no install (no ledger entry) or no on-this-machine consent is NOT command-dispatchable. The router module is `require()`'d FROM the capability's install root via `defaultRequireFromInstallRoot` (bare-`.cjs` basename + `realpath` containment, rejecting `..` traversal and symlink escape); same own-property/function/sync-only guards as the first-party path. Wired into the `runCommand` default arm before "Unknown command". A repo-planted project ledger no longer activates anything on its own (#1459) — see `docs/explanation/capability-trust-model.md` "project-scope trust boundary". +### Claude Orchestration Capability +Default-off, BETA, claude-only Capability (`capabilities/claude-orchestration/`, `role: feature`, `runtimeCompat.supported: ["claude"]`, `tier: full`, `activationKey: claude_orchestration.enabled`) adopting Claude Code's Workflow tool (the engine behind `/effort ultracode`, Agent SDK ≥ v0.3.149) as an optional parallel-execution backend for the GSD loop, and folding the `gsd-ultraplan-phase` plan-offload under the same runtime gate (#1143; ADR-1143). Pure, fail-closed core in `gsd-core/bin/lib/claude-orchestration.cjs` (generated from `src/claude-orchestration.cts`): `detectWorkflowBackend({ runtimeId, hostIntegration, config, agentSdkVersion }) → { available, backend:'workflow'|'inline', reason }` (gate ladder: enabled → Claude → execution_backend ≠ inline → host dispatch nested+background → valid Agent SDK → SDK ≥ floor; every miss degrades to `inline`, never throws); `emitWorkflowScript({ phaseDir, waves, runId, budgetTokens? }) → { ok, script, summary }` mapping waves → `parallel()` stage barriers, plans → `agent({ agentType:'gsd-executor', isolation:'worktree' })`, `files_modified` overlap → separate sequential stages (greedy first-fit), `resumeFromRunId` wired to the run id, shared `budget(tokens)`; all interpolated identifiers validated script-safe (no `"`,`\`,control chars) and briefs JSON-quoted (review anti-injection). Registers two loop contributions at WIRED points only (execute:wave:pre/execute:pre are declared but not rendered, same constraint external-job documents): `execute:wave:post into:executor` (Workflow-backend guidance) and `plan:post into:planner` (ultraplan ownership declaration), both `when: claude_orchestration.enabled`, `onError: skip`. Federated config keys (`claude_orchestration.enabled` default false, `execution_backend` enum auto|workflow|inline default auto, `min_agent_sdk_version` string default "0.3.149") live only in the registry — uninstall removes them cleanly. Pre-release versions of the floor compare below GA (SemVer precedence). Restores the wave parallelism + plan-checker + verifier that #853 forces inline on Claude Code; on any runtime lacking the Workflow tool, behaviour is byte-identical to today. BETA v1 ships detection + emission + declarative ultraplan ownership + a `claude-orchestration` command family (`gsd-tools claude-orchestration detect-backend|emit-workflow`, router `gsd-core/bin/lib/claude-orchestration-command-router.cjs` from `src/claude-orchestration-command-router.cts`); full install-profile migration of the ultraplan skill into `skills[]` is a follow-up (CLUSTERS/profile gate). Test anchors: `tests/claude-orchestration.test.cjs`, `tests/claude-orchestration-command-router.test.cjs`. ### Loop Extension Point A named, stable site on a host loop step (per-step `pre`/`post` plus per-wave in Execute; 12 total) where Capabilities register hooks. Three hook kinds: `step` (runs as its own sequenced unit), `contribution` (injects into the core step's prompt/context), and `gate` (checks and optionally blocks via a declared `blocking` flag). Each hook declares the artifacts it produces and consumes; hook order is derived by topological sort of that produces/consumes graph (capability-id tiebreak), which also defines data flow — file-artifact based, surviving `/clear` and fresh executor contexts. Hooks are surfaced by runtime resolution with concrete projection: the workflow calls a query that resolves the active hooks and returns fully-rendered, ordered markdown for the executor. Failure is default-resilient — a non-gate hook that errors is skipped with a warning; a hook may opt into `onError: halt`. Part of the Capability system. ADR-857 phase 3c ships the registry-consuming query layer: `gsd-core/bin/lib/loop-resolver.cjs` exposes `resolveLoopHooks({ point, registry, config })` (pure, no I/O), `renderLoopHooks(resolved)` (pure markdown renderer), and `cmdLoopRenderHooks(cwd, point, raw, opts)` (I/O entry point); activated via `gsd-tools loop render-hooks ` which emits `{ point, activeHooks[], rendered }`. Activation is driven by `when` (dotted config key resolved against `loadConfig`), with inline literal `__proto__`/`constructor`/`prototype` prototype-pollution guard. The first phase-6 cutovers wiring workflows to this query have landed — ui-phase at `plan:pre` and ui-review at `verify:post` (in `plan-phase.md`/`autonomous.md`); further per-feature cutovers are ongoing. diff --git a/capabilities/claude-orchestration/capability.json b/capabilities/claude-orchestration/capability.json new file mode 100644 index 000000000..921704c67 --- /dev/null +++ b/capabilities/claude-orchestration/capability.json @@ -0,0 +1,85 @@ +{ + "id": "claude-orchestration", + "role": "feature", + "version": "1.7.0-rc.3", + "title": "Claude orchestration (Workflow backend)", + "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the parallelism + plan-checker + verifier that the #853 backgrounded-agent nesting limitation forces inline on Claude Code. Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", + "tier": "full", + "requires": [], + "engines": { + "gsd": ">=1.7.0" + }, + "runtimeCompat": { + "supported": [ + "claude" + ], + "unsupported": [] + }, + "skills": [], + "agents": [], + "hooks": [], + "commands": [ + { + "family": "claude-orchestration", + "module": "claude-orchestration-command-router.cjs", + "router": "routeClaudeOrchestrationCommand", + "subcommands": [ + "detect-backend", + "emit-workflow" + ] + } + ], + "activationKey": "claude_orchestration.enabled", + "config": { + "claude_orchestration.enabled": { + "type": "boolean", + "default": false, + "description": "Master toggle for the Claude orchestration capability. Default-off + BETA: the Workflow-tool execution backend and the ultraplan plan-offload surface are inert unless this is true. When false, loop behaviour is byte-identical to a non-Claude runtime (inline/manual dispatch)." + }, + "claude_orchestration.execution_backend": { + "type": "enum", + "values": [ + "auto", + "workflow", + "inline" + ], + "default": "auto", + "description": "Which execute-phase dispatch backend to use when the capability is enabled. 'auto' (default) activates the Workflow backend only when the runtime is Claude AND the Workflow tool is detected AND the Agent SDK meets claude_orchestration.min_agent_sdk_version; otherwise it falls back to inline. 'workflow' forces the Workflow backend when the tool is present AND the Agent SDK meets the floor (still fails closed to inline if the tool is absent or the SDK is too old — the floor applies in both modes). 'inline' forces today's manual one-agent-per-message dispatch regardless of tool availability." + }, + "claude_orchestration.min_agent_sdk_version": { + "type": "string", + "default": "0.3.149", + "description": "Minimum Agent SDK version required to activate the Workflow backend under execution_backend='auto'. Defaults to 0.3.149 (the release that introduced the Workflow tool). Raise to pin a higher floor; the detection seam fails closed to inline for any runtime reporting an older or unknown version." + } + }, + "steps": [], + "contributions": [ + { + "point": "execute:wave:post", + "into": "executor", + "fragment": { + "path": "fragments/execute-wave-post.md" + }, + "produces": [], + "consumes": [ + "PLAN.md" + ], + "when": "claude_orchestration.enabled", + "onError": "skip" + }, + { + "point": "plan:post", + "into": "planner", + "fragment": { + "path": "fragments/plan-post.md" + }, + "produces": [], + "consumes": [ + "CONTEXT.md" + ], + "when": "claude_orchestration.enabled", + "onError": "skip" + } + ], + "gates": [] +} diff --git a/capabilities/claude-orchestration/fragments/execute-wave-post.md b/capabilities/claude-orchestration/fragments/execute-wave-post.md new file mode 100644 index 000000000..8e9bdb8a7 --- /dev/null +++ b/capabilities/claude-orchestration/fragments/execute-wave-post.md @@ -0,0 +1,59 @@ +# Claude orchestration — Workflow execution backend (BETA) + +> Injected at `execute:wave:post` `into: executor` only when +> `claude_orchestration.enabled` is true. Default-off; `onError: skip`. + +## When this contribution is active + +The Claude orchestration capability is **default-off and BETA**. It activates only +when ALL of the following hold: + +1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND +2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent + SDK-specific), AND +3. `claude_orchestration.execution_backend` resolves to `workflow` — either + explicitly, or via `auto` — **and** the Agent SDK version is + `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK + floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release + or older SDK never activates the preview backend). + +Detection is fail-closed: any miss degrades to **inline, manual, one-agent-per- +message dispatch** — exactly today's behaviour. On a non-Claude runtime this +contribution is a no-op. + +## What the executor does when the Workflow backend is active + +Instead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor, +isolation=worktree, run_in_background=true)` per message (which on Claude Code +cannot nest further subagents — #853 — and so degrades to sequential inline +execution), execute-phase **emits a generated Workflow script** and lets the main +loop orchestrate it: + +- **waves → `parallel()` barriers** — each wave is one barrier; the next wave + waits for the previous to complete. +- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`** + — the SAME executor agent and worktree isolation the inline path uses, so the + produced `SUMMARY.md` and commits are identical. +- **`files_modified` overlap → separate sequential stages** — two plans that + touch the same file are placed in different stages within the wave (the same + overlap rule execute-phase already applies inline). +- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase + resumes without re-running completed plans. +- **`budget(tokens)`** — a shared token pool across the whole phase when the + orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a + function parameter, not a config key; the orchestrator decides the budget). + +The emitter is a pure function exposed through the capability command surface: +`gsd-tools claude-orchestration emit-workflow --waves --run-id +[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript` +directly). It maps the phase's wave/plan manifest to the Workflow script string +and never invokes the Workflow tool itself; the orchestrator runs the emitted +script. Use `gsd-tools claude-orchestration detect-backend` to resolve whether +the Workflow backend should activate for the current runtime. + +## Fallback contract + +If detection resolves to `inline` (tool absent, SDK too old, runtime not Claude, +or the capability disabled), execute-phase MUST proceed with the standard inline +wave dispatch. The executor MUST NOT assume parallelism, a shared budget, or +resume-from-run-id semantics in that mode. diff --git a/capabilities/claude-orchestration/fragments/plan-post.md b/capabilities/claude-orchestration/fragments/plan-post.md new file mode 100644 index 000000000..bec9b01fa --- /dev/null +++ b/capabilities/claude-orchestration/fragments/plan-post.md @@ -0,0 +1,28 @@ +# Claude orchestration — ultraplan plan-offload ownership (BETA) + +> Injected at `plan:post` `into: planner` only when +> `claude_orchestration.enabled` is true. Default-off; `onError: skip`. + +## Ownership declaration + +The `gsd-ultraplan-phase` plan-offload surface (offloading GSD's plan phase to +Claude Code's ultraplan cloud) is **owned by this capability**, not by a +standalone BETA skill. Both surfaces share one runtime gate +(`claude_orchestration.enabled`), one BETA boundary, and one Claude-Code-only +detection seam. + +## When the planner should consider ultraplan offload + +When this contribution is active (capability enabled, Claude Code runtime), the +planner MAY offer the `/gsd-ultraplan-phase` path as an alternative to local +`/gsd-plan-phase` for phases where cloud-assisted planning adds value. This is +advisory, not mandatory — the stable local planner remains the default. + +## Fallback contract + +If the capability is disabled, or the runtime is not Claude Code, ultraplan +offload is **not surfaced** and the planner proceeds with the standard local +`/gsd-plan-phase`. The `gsd-ultraplan-phase` command itself remains installed +(its own runtime gate already no-ops on non-Claude runtimes); this contribution +only governs whether the capability manifest advertises it as part of the +orchestration surface. diff --git a/docs/INVENTORY-MANIFEST.json b/docs/INVENTORY-MANIFEST.json index 2c94b3bc9..0bc7c3b28 100644 --- a/docs/INVENTORY-MANIFEST.json +++ b/docs/INVENTORY-MANIFEST.json @@ -306,6 +306,8 @@ "capability-writer.cjs", "check-command-router.cjs", "cjs-command-router-adapter.cjs", + "claude-orchestration-command-router.cjs", + "claude-orchestration.cjs", "cli-exit.cjs", "cli-skew-check.cjs", "clock.cjs", diff --git a/docs/adr/1143-claude-orchestration-capability.md b/docs/adr/1143-claude-orchestration-capability.md index 128a40909..4541bce43 100644 --- a/docs/adr/1143-claude-orchestration-capability.md +++ b/docs/adr/1143-claude-orchestration-capability.md @@ -86,3 +86,39 @@ These existing multi-model features (`execute-phase` `cross_ai_delegation`, the - **Neutral:** no effect on non-Claude runtimes by construction; no behavior change until explicitly enabled. > **Governance note:** This ADR is a *draft design* accompanying feature request #1143. Per CONTRIBUTING, it is PR'd only after the issue receives `approved-feature`, and the capability is implemented only after #857 is released. + +## Amendment (2026-07-06): BETA v1 implementation landed + +#857 is **released** (CLOSED); the capability infrastructure is live. The BETA v1 +of this capability has shipped as `capabilities/claude-orchestration/` with the +scope agreed in the Decision, refined to the lowest-risk first slice: + +- **Detection + emission** live as pure, fail-closed functions in + `gsd-core/bin/lib/claude-orchestration.cjs` (source `src/claude-orchestration.cts`): + `detectWorkflowBackend` (gate ladder: enabled → Claude runtime → + execution_backend ≠ inline → host dispatch nested+background → valid Agent SDK + → SDK ≥ `claude_orchestration.min_agent_sdk_version`, default `0.3.149`) and + `emitWorkflowScript` (waves → `parallel()` stage barriers, plans → + `agent({ agentType: 'gsd-executor', isolation: 'worktree' })`, `files_modified` + overlap → separate sequential stages, `resumeFromRunId` wired to the phase run + id, shared `budget(tokens)` pool). All interpolated values are validated as + script-safe identifiers or JSON-quoted (review Finding 1). +- **Loop registration** is at the two **wired** points the loop host contract + actually renders: `execute:wave:post into:executor` (Workflow-backend guidance) + and `plan:post into:planner` (ultraplan ownership declaration). `execute:wave:pre` + and `execute:pre` are declared in the contract but **not wired** today, so the + capability registers at `wave:post` (the constraint `external-job` also documents). +- **Config** is federated (`claude_orchestration.enabled` default false / + `activationKey`, `execution_backend` enum `auto|workflow|inline` default `auto`, + `min_agent_sdk_version`); the keys live only in the registry, so uninstall + removes them cleanly. +- **ultraplan ownership** is declared in the manifest (`plan:post` contribution); + full install-profile migration of the `gsd-ultraplan-phase` skill into the + capability's `skills[]` is deferred to a follow-up (it triggers the CLUSTERS / + profile membership gate and is a heavier, install-machinery change). + +Status remains **Proposed** — the BETA is default-off and the end-to-end Workflow +execution path (actual orchestration via the Workflow tool inside Claude Code) is +not verifiable outside that runtime. The capability is structurally complete and +tested at the contract level; flipping to Accepted follows maintainer sign-off on +the E2E behaviour once exercised on Claude Code with the Workflow tool present. diff --git a/docs/explanation/claude-orchestration-capability.md b/docs/explanation/claude-orchestration-capability.md new file mode 100644 index 000000000..e044a4e1f --- /dev/null +++ b/docs/explanation/claude-orchestration-capability.md @@ -0,0 +1,94 @@ +# Claude orchestration capability (BETA) + +> **Explanation** — *why this capability exists and how it fits the loop.* For the +> step-by-step, see the [capability reference](../reference/capability-matrix.md); +> for the design record, see [ADR-1143](../adr/1143-claude-orchestration-capability.md). + +## The problem + +GSD's `execute-phase` is wave-based: plans carry a wave number, waves run +sequentially, and plans *within* a wave run in parallel when their +`files_modified` sets don't overlap. On most runtimes GSD realizes that by +fanning out one backgrounded `gsd-executor` agent (in a worktree) per plan. + +On **Claude Code** that fan-out degrades. Backgrounded agents on Claude Code have +no `Agent`/`Task` tool, so they cannot nest subagents ([#853]). The autonomous +loop therefore falls back to **inline sequential execution** — and with it +silently drops wave parallelism, the plan-checker, and the verifier — on the one +runtime most GSD users run. + +Claude Code ships an orchestration primitive that sidesteps exactly this: the +**Workflow tool** (the engine behind `/effort ultracode`, Agent SDK ≥ v0.3.149). +A Workflow script *is* the orchestrator — it runs from the main loop and spawns +subagents itself via `agent()`, `parallel()` (barrier), `pipeline()`, and +`phase()`, with `isolation: 'worktree'`, a shared token `budget`, and +`resumeFromRunId`. + +## The capability + +`claude-orchestration` is a **default-off, BETA, claude-only** capability that +adopts the Workflow tool as an optional, runtime-gated parallel-execution +backend, and folds the existing `gsd-ultraplan-phase` plan-offload under the same +gate. It is blocked-on-nothing now that the ADR-857 capability system is released. + +- **`role: feature`**, `runtimeCompat.supported: ["claude"]`, `tier: full`. +- **`activationKey: claude_orchestration.enabled`** — default `false`. Nothing + changes until you opt in. +- Registers at two **wired** loop points: `execute:wave:post` (into the executor) + and `plan:post` (into the planner). Both are `onError: skip` and gated by the + `enabled` key. + +## How it decides whether to activate + +Detection is a pure, **fail-closed** function — `detectWorkflowBackend`. The +Workflow backend activates only when *every* gate passes; any miss degrades to +`inline` (today's behaviour): + +1. `claude_orchestration.enabled` is true. +2. The runtime is Claude (the Workflow tool is Claude / Agent SDK-specific). +3. `claude_orchestration.execution_backend` is `auto` or `workflow` (not `inline`). +4. The host descriptor advertises `dispatch.nested` **and** `dispatch.background` + (the nesting-capable Claude-Code shape — a proxy for Workflow-tool presence, + meaningful only after gate 2). +5. The Agent SDK reports a valid semver version. +6. That version is `>= claude_orchestration.min_agent_sdk_version` + (default `0.3.149`). A pre-release of the floor (e.g. `0.3.149-rc.1`) compares + *below* the GA release per SemVer, so the preview backend stays off. + +## What the executor runs when the backend is active + +`emitWorkflowScript` maps the phase's wave/plan model onto Workflow primitives: + +| GSD concept | Workflow primitive | +|---|---| +| Wave | `parallel()` stage barrier | +| Plan | `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })` | +| `files_modified` overlap | forces the plans into separate sequential stages | +| Phase run id | `resumeFromRunId("")` | +| Phase token cap | `budget()` | + +Because the emitted script composes the **same** `gsd-executor` agent and +**worktree isolation** the inline path uses, it produces the same `SUMMARY.md` +artifacts and commits — the only difference is the execution vehicle. + +## The fallback contract + +On any runtime lacking the Workflow tool — or when the capability is disabled, +the SDK is too old, or detection fails for any reason — execute-phase proceeds +with the standard inline wave dispatch. This is a release gate, not a nicety: a +regression test asserts the inline fallback on every non-capable combination, so +the capability is default-off and low-risk by construction. + +## BETA scope (v1) + +The first slice ships **detection + emission + declarative ultraplan ownership**. +The emitter is exercised at the contract level (structure, overlap splitting, +resume, budget, anti-injection). End-to-end execution through the Workflow tool +is verifiable only inside Claude Code with the tool present. Full install-profile +migration of the `gsd-ultraplan-phase` skill into the capability's `skills[]` +array is a follow-up (it touches the cluster/profile machinery); for v1 the +manifest *declares* ultraplan ownership at `plan:post` and the existing skill's +own runtime gate continues to no-op on non-Claude runtimes. + +[#853]: https://github.com/open-gsd/gsd-core/issues/853 +[#1143]: https://github.com/open-gsd/gsd-core/issues/1143 diff --git a/docs/reference/capability-matrix.md b/docs/reference/capability-matrix.md index 4efee626d..c74755eac 100644 --- a/docs/reference/capability-matrix.md +++ b/docs/reference/capability-matrix.md @@ -44,7 +44,7 @@ Core package and are stamped with the package version at release (per ADR-1244 D6). They are not subject to the consent or integrity-pin flow applied to third-party capabilities. -### Feature capabilities (role: feature) — 18 +### Feature capabilities (role: feature) — 19 Feature capabilities extend what the loop does — contributing research, planning, execution, verification, or ship artefacts at the loop extension @@ -55,6 +55,7 @@ points. | `ai-integration` | feature | full | `>=1.6.0` | `plan:pre` | step | first-party | | `assumption-delta` | feature | full | `>=1.6.0` | `plan:pre` | contribution | first-party | | `audit` | feature | full | `>=1.6.0` | — | — | first-party | +| `claude-orchestration` | feature | full | `>=1.7.0` | `plan:post`, `execute:wave:post` | contribution | first-party | | `code-review` | feature | full | `>=1.6.0` | `execute:post` | step | first-party | | `drift` | feature | full | `>=1.6.0` | `plan:pre`, `execute:wave:post` | gate | first-party | | `external-job` | feature | full | `>=1.7.0` | `plan:post`, `execute:wave:post` | contribution | first-party | diff --git a/eslint.config.mjs b/eslint.config.mjs index 580c90822..d382077df 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -56,6 +56,8 @@ export default tseslint.config( 'coverage/**', '**/*.generated.cjs', // ADR-457: tsc-generated runtime artifact — lint the src/*.cts source, not the emitted .cjs. + 'gsd-core/bin/lib/claude-orchestration.cjs', + 'gsd-core/bin/lib/claude-orchestration-command-router.cjs', 'gsd-core/bin/lib/semver-compare.cjs', 'gsd-core/bin/lib/host-integration.cjs', 'gsd-core/bin/lib/handshake-serialized.cjs', diff --git a/gsd-core/bin/lib/capability-registry.cjs b/gsd-core/bin/lib/capability-registry.cjs index a4706bfa3..796ac88da 100644 --- a/gsd-core/bin/lib/capability-registry.cjs +++ b/gsd-core/bin/lib/capability-registry.cjs @@ -424,6 +424,93 @@ const capabilities = { } } }, + "claude-orchestration": { + "id": "claude-orchestration", + "role": "feature", + "version": "1.7.0-rc.3", + "title": "Claude orchestration (Workflow backend)", + "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the parallelism + plan-checker + verifier that the #853 backgrounded-agent nesting limitation forces inline on Claude Code. Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", + "tier": "full", + "requires": [], + "engines": { + "gsd": ">=1.7.0" + }, + "runtimeCompat": { + "supported": [ + "claude" + ], + "unsupported": [] + }, + "skills": [], + "agents": [], + "hooks": [], + "commands": [ + { + "family": "claude-orchestration", + "module": "claude-orchestration-command-router.cjs", + "router": "routeClaudeOrchestrationCommand", + "subcommands": [ + "detect-backend", + "emit-workflow" + ] + } + ], + "activationKey": "claude_orchestration.enabled", + "config": { + "claude_orchestration.enabled": { + "type": "boolean", + "default": false, + "description": "Master toggle for the Claude orchestration capability. Default-off + BETA: the Workflow-tool execution backend and the ultraplan plan-offload surface are inert unless this is true. When false, loop behaviour is byte-identical to a non-Claude runtime (inline/manual dispatch)." + }, + "claude_orchestration.execution_backend": { + "type": "enum", + "values": [ + "auto", + "workflow", + "inline" + ], + "default": "auto", + "description": "Which execute-phase dispatch backend to use when the capability is enabled. 'auto' (default) activates the Workflow backend only when the runtime is Claude AND the Workflow tool is detected AND the Agent SDK meets claude_orchestration.min_agent_sdk_version; otherwise it falls back to inline. 'workflow' forces the Workflow backend when the tool is present AND the Agent SDK meets the floor (still fails closed to inline if the tool is absent or the SDK is too old — the floor applies in both modes). 'inline' forces today's manual one-agent-per-message dispatch regardless of tool availability." + }, + "claude_orchestration.min_agent_sdk_version": { + "type": "string", + "default": "0.3.149", + "description": "Minimum Agent SDK version required to activate the Workflow backend under execution_backend='auto'. Defaults to 0.3.149 (the release that introduced the Workflow tool). Raise to pin a higher floor; the detection seam fails closed to inline for any runtime reporting an older or unknown version." + } + }, + "steps": [], + "contributions": [ + { + "point": "execute:wave:post", + "into": "executor", + "fragment": { + "path": "fragments/execute-wave-post.md", + "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:post` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## What the executor does when the Workflow backend is active\n\nInstead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor,\nisolation=worktree, run_in_background=true)` per message (which on Claude Code\ncannot nest further subagents — #853 — and so degrades to sequential inline\nexecution), execute-phase **emits a generated Workflow script** and lets the main\nloop orchestrate it:\n\n- **waves → `parallel()` barriers** — each wave is one barrier; the next wave\n waits for the previous to complete.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n — the SAME executor agent and worktree isolation the inline path uses, so the\n produced `SUMMARY.md` and commits are identical.\n- **`files_modified` overlap → separate sequential stages** — two plans that\n touch the same file are placed in different stages within the wave (the same\n overlap rule execute-phase already applies inline).\n- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n- **`budget(tokens)`** — a shared token pool across the whole phase when the\n orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a\n function parameter, not a config key; the orchestrator decides the budget).\n\nThe emitter is a pure function exposed through the capability command surface:\n`gsd-tools claude-orchestration emit-workflow --waves --run-id \n[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript`\ndirectly). It maps the phase's wave/plan manifest to the Workflow script string\nand never invokes the Workflow tool itself; the orchestrator runs the emitted\nscript. Use `gsd-tools claude-orchestration detect-backend` to resolve whether\nthe Workflow backend should activate for the current runtime.\n\n## Fallback contract\n\nIf detection resolves to `inline` (tool absent, SDK too old, runtime not Claude,\nor the capability disabled), execute-phase MUST proceed with the standard inline\nwave dispatch. The executor MUST NOT assume parallelism, a shared budget, or\nresume-from-run-id semantics in that mode.\n" + }, + "produces": [], + "consumes": [ + "PLAN.md" + ], + "when": "claude_orchestration.enabled", + "onError": "skip" + }, + { + "point": "plan:post", + "into": "planner", + "fragment": { + "path": "fragments/plan-post.md", + "inline": "# Claude orchestration — ultraplan plan-offload ownership (BETA)\n\n> Injected at `plan:post` `into: planner` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## Ownership declaration\n\nThe `gsd-ultraplan-phase` plan-offload surface (offloading GSD's plan phase to\nClaude Code's ultraplan cloud) is **owned by this capability**, not by a\nstandalone BETA skill. Both surfaces share one runtime gate\n(`claude_orchestration.enabled`), one BETA boundary, and one Claude-Code-only\ndetection seam.\n\n## When the planner should consider ultraplan offload\n\nWhen this contribution is active (capability enabled, Claude Code runtime), the\nplanner MAY offer the `/gsd-ultraplan-phase` path as an alternative to local\n`/gsd-plan-phase` for phases where cloud-assisted planning adds value. This is\nadvisory, not mandatory — the stable local planner remains the default.\n\n## Fallback contract\n\nIf the capability is disabled, or the runtime is not Claude Code, ultraplan\noffload is **not surfaced** and the planner proceeds with the standard local\n`/gsd-plan-phase`. The `gsd-ultraplan-phase` command itself remains installed\n(its own runtime gate already no-ops on non-Claude runtimes); this contribution\nonly governs whether the capability manifest advertises it as part of the\norchestration surface.\n" + }, + "produces": [], + "consumes": [ + "CONTEXT.md" + ], + "when": "claude_orchestration.enabled", + "onError": "skip" + } + ], + "gates": [] + }, "cline": { "id": "cline", "role": "runtime", @@ -2845,6 +2932,21 @@ const byLoopPoint = { } ], "contributions": [ + { + "capId": "claude-orchestration", + "point": "plan:post", + "into": "planner", + "fragment": { + "path": "fragments/plan-post.md", + "inline": "# Claude orchestration — ultraplan plan-offload ownership (BETA)\n\n> Injected at `plan:post` `into: planner` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## Ownership declaration\n\nThe `gsd-ultraplan-phase` plan-offload surface (offloading GSD's plan phase to\nClaude Code's ultraplan cloud) is **owned by this capability**, not by a\nstandalone BETA skill. Both surfaces share one runtime gate\n(`claude_orchestration.enabled`), one BETA boundary, and one Claude-Code-only\ndetection seam.\n\n## When the planner should consider ultraplan offload\n\nWhen this contribution is active (capability enabled, Claude Code runtime), the\nplanner MAY offer the `/gsd-ultraplan-phase` path as an alternative to local\n`/gsd-plan-phase` for phases where cloud-assisted planning adds value. This is\nadvisory, not mandatory — the stable local planner remains the default.\n\n## Fallback contract\n\nIf the capability is disabled, or the runtime is not Claude Code, ultraplan\noffload is **not surfaced** and the planner proceeds with the standard local\n`/gsd-plan-phase`. The `gsd-ultraplan-phase` command itself remains installed\n(its own runtime gate already no-ops on non-Claude runtimes); this contribution\nonly governs whether the capability manifest advertises it as part of the\norchestration surface.\n" + }, + "produces": [], + "consumes": [ + "CONTEXT.md" + ], + "when": "claude_orchestration.enabled", + "onError": "skip" + }, { "capId": "external-job", "point": "plan:post", @@ -2885,6 +2987,21 @@ const byLoopPoint = { "execute:wave:post": { "steps": [], "contributions": [ + { + "capId": "claude-orchestration", + "point": "execute:wave:post", + "into": "executor", + "fragment": { + "path": "fragments/execute-wave-post.md", + "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:post` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## What the executor does when the Workflow backend is active\n\nInstead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor,\nisolation=worktree, run_in_background=true)` per message (which on Claude Code\ncannot nest further subagents — #853 — and so degrades to sequential inline\nexecution), execute-phase **emits a generated Workflow script** and lets the main\nloop orchestrate it:\n\n- **waves → `parallel()` barriers** — each wave is one barrier; the next wave\n waits for the previous to complete.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n — the SAME executor agent and worktree isolation the inline path uses, so the\n produced `SUMMARY.md` and commits are identical.\n- **`files_modified` overlap → separate sequential stages** — two plans that\n touch the same file are placed in different stages within the wave (the same\n overlap rule execute-phase already applies inline).\n- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n- **`budget(tokens)`** — a shared token pool across the whole phase when the\n orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a\n function parameter, not a config key; the orchestrator decides the budget).\n\nThe emitter is a pure function exposed through the capability command surface:\n`gsd-tools claude-orchestration emit-workflow --waves --run-id \n[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript`\ndirectly). It maps the phase's wave/plan manifest to the Workflow script string\nand never invokes the Workflow tool itself; the orchestrator runs the emitted\nscript. Use `gsd-tools claude-orchestration detect-backend` to resolve whether\nthe Workflow backend should activate for the current runtime.\n\n## Fallback contract\n\nIf detection resolves to `inline` (tool absent, SDK too old, runtime not Claude,\nor the capability disabled), execute-phase MUST proceed with the standard inline\nwave dispatch. The executor MUST NOT assume parallelism, a shared budget, or\nresume-from-run-id semantics in that mode.\n" + }, + "produces": [], + "consumes": [ + "PLAN.md" + ], + "when": "claude_orchestration.enabled", + "onError": "skip" + }, { "capId": "external-job", "point": "execute:wave:post", @@ -3095,6 +3212,9 @@ const byLoopPoint = { const configKeys = { "workflow.ai_integration_phase": "ai-integration", "workflow.assumption_delta": "assumption-delta", + "claude_orchestration.enabled": "claude-orchestration", + "claude_orchestration.execution_backend": "claude-orchestration", + "claude_orchestration.min_agent_sdk_version": "claude-orchestration", "workflow.code_review": "code-review", "workflow.code_review_depth": "code-review", "workflow.drift_threshold": "drift", @@ -3146,6 +3266,29 @@ const configSchema = { "default": true, "description": "Enable the assumption-delta architecture checkpoint during planning. When a pluralization/optional/chosen signal is detected in the phase scope, the planner is prompted to re-ask whether the primary key / identity model still names the right thing. Advisory (non-blocking)." }, + "claude_orchestration.enabled": { + "owner": "claude-orchestration", + "type": "boolean", + "default": false, + "description": "Master toggle for the Claude orchestration capability. Default-off + BETA: the Workflow-tool execution backend and the ultraplan plan-offload surface are inert unless this is true. When false, loop behaviour is byte-identical to a non-Claude runtime (inline/manual dispatch)." + }, + "claude_orchestration.execution_backend": { + "owner": "claude-orchestration", + "type": "enum", + "default": "auto", + "description": "Which execute-phase dispatch backend to use when the capability is enabled. 'auto' (default) activates the Workflow backend only when the runtime is Claude AND the Workflow tool is detected AND the Agent SDK meets claude_orchestration.min_agent_sdk_version; otherwise it falls back to inline. 'workflow' forces the Workflow backend when the tool is present AND the Agent SDK meets the floor (still fails closed to inline if the tool is absent or the SDK is too old — the floor applies in both modes). 'inline' forces today's manual one-agent-per-message dispatch regardless of tool availability.", + "values": [ + "auto", + "workflow", + "inline" + ] + }, + "claude_orchestration.min_agent_sdk_version": { + "owner": "claude-orchestration", + "type": "string", + "default": "0.3.149", + "description": "Minimum Agent SDK version required to activate the Workflow backend under execution_backend='auto'. Defaults to 0.3.149 (the release that introduced the Workflow tool). Raise to pin a higher floor; the detection seam fails closed to inline for any runtime reporting an older or unknown version." + }, "workflow.code_review": { "owner": "code-review", "type": "boolean", @@ -4777,6 +4920,11 @@ const commandFamilies = { "module": "audit-command-router.cjs", "router": "routeAuditUat" }, + "claude-orchestration": { + "capId": "claude-orchestration", + "module": "claude-orchestration-command-router.cjs", + "router": "routeClaudeOrchestrationCommand" + }, "extract-messages": { "capId": "profile-pipeline", "module": "profile-pipeline-command-router.cjs", @@ -4916,6 +5064,7 @@ const _requiresGraph = { "audit": [], "augment": [], "claude": [], + "claude-orchestration": [], "cline": [], "code-review": [], "codebuddy": [], diff --git a/gsd-core/bin/lib/claude-orchestration-command-router.cjs b/gsd-core/bin/lib/claude-orchestration-command-router.cjs new file mode 100644 index 000000000..a07ad64c2 --- /dev/null +++ b/gsd-core/bin/lib/claude-orchestration-command-router.cjs @@ -0,0 +1,136 @@ +"use strict"; +/** + * Claude orchestration command router — CLI dispatcher for + * `gsd-tools claude-orchestration `. + * + * #1143 — thin CLI adapter over the pure `claude-orchestration.cjs` module. + * Lets execute-phase (or any orchestrator) invoke the Workflow-backend + * detection and the Workflow-script emitter through the standard capability + * command surface (ADR-959) instead of a bare `require()`. + * + * Router signature: { args, cwd, raw, error } — identical to the other host + * routers; discovered by dispatchCapabilityCommand via the registry's + * commandFamilies index. + * + * Subcommands: + * detect-backend [--runtime ] [--agent-sdk-version ] [--no-nested-dispatch] + * Resolves whether the Workflow backend should activate. `--runtime` + * defaults to the GSD_RUNTIME env var (or 'unknown'). Reads the + * `claude_orchestration.*` keys from .planning/config.json. Emits + * { available, backend, reason }. + * + * emit-workflow --waves --run-id [--phase-dir ] [--budget ] + * Reads a wave/plan manifest JSON file and emits the generated Workflow + * script + summary. The manifest shape matches emitWorkflowScript's input: + * { waves: [{ id, plans: [{ id, brief, files_modified: string[] }] }] }. + */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +// eslint-disable-next-line @typescript-eslint/no-require-imports +const io = require("./io.cjs"); +// eslint-disable-next-line @typescript-eslint/no-require-imports +const core = require("./claude-orchestration.cjs"); +// eslint-disable-next-line @typescript-eslint/no-require-imports +const configLoader = require("./config-loader.cjs"); +const { output } = io; +const { detectWorkflowBackend, emitWorkflowScript } = core; +const CAPABLE_HOST = { dispatch: { nested: true, background: true } }; +function usage(error) { + error('Usage: gsd-tools claude-orchestration [...]\n' + + ' detect-backend [--runtime ] [--agent-sdk-version ] [--no-nested-dispatch]\n' + + ' emit-workflow --waves --run-id [--phase-dir ] [--budget ]'); +} +function argValue(args, flag) { + const i = args.indexOf(flag); + return i !== -1 && i + 1 < args.length ? args[i + 1] : undefined; +} +/** + * Detect whether the Workflow backend should activate for the current/given + * runtime. Reads `claude_orchestration.*` from the project config; runtime and + * SDK version come from flags (the orchestrator already knows these) or env. + */ +function cmdDetectBackend(args, cwd, raw) { + const runtimeId = argValue(args, '--runtime') || process.env['GSD_RUNTIME'] || 'unknown'; + const agentSdkVersion = argValue(args, '--agent-sdk-version'); + const noNested = args.includes('--no-nested-dispatch'); + const hostIntegration = noNested ? { dispatch: { nested: false, background: true } } : CAPABLE_HOST; + // Resolve the claude_orchestration.* slice from the project config (federated + // keys are merged by loadConfig as a nested object). A config read failure + // degrades to inline — it must not break the core loop. + let claudeSlice = {}; + try { + const loaded = configLoader.loadConfig(cwd); + const slice = loaded['claude_orchestration']; + if (slice && typeof slice === 'object' && !Array.isArray(slice)) { + claudeSlice = slice; + } + } + catch { + claudeSlice = {}; + } + // Flatten the nested slice into the dotted-key shape detectWorkflowBackend expects. + const flatConfig = {}; + for (const k of Object.keys(claudeSlice)) { + flatConfig['claude_orchestration.' + k] = claudeSlice[k]; + } + const result = detectWorkflowBackend({ runtimeId, hostIntegration, config: flatConfig, agentSdkVersion }); + output(result, raw); +} +/** + * Emit a Workflow script from a wave/plan manifest file. + */ +function cmdEmitWorkflow(args, _cwd, raw, error) { + const wavesPath = argValue(args, '--waves'); + const runId = argValue(args, '--run-id'); + const phaseDir = argValue(args, '--phase-dir') || '.planning/phases/current'; + const budgetRaw = argValue(args, '--budget'); + if (!wavesPath) { + error('emit-workflow requires --waves '); + return; + } + if (!runId) { + error('emit-workflow requires --run-id '); + return; + } + let waves; + try { + const content = node_fs_1.default.readFileSync(node_path_1.default.resolve(wavesPath), 'utf8'); + const parsed = JSON.parse(content); + waves = parsed['waves']; + } + catch (e) { + error('emit-workflow: could not read/parse --waves file "' + wavesPath + '": ' + (e instanceof Error ? e.message : String(e))); + return; + } + const budgetTokens = budgetRaw !== undefined ? parseInt(budgetRaw, 10) : undefined; + const budget = (typeof budgetTokens === 'number' && !Number.isNaN(budgetTokens)) ? budgetTokens : undefined; + const result = emitWorkflowScript({ + phaseDir, + runId, + waves: waves, + budgetTokens: budget, + }); + if (!result.ok) { + error('emit-workflow: ' + result.reason); + return; + } + output({ script: result.script, summary: result.summary }, raw); +} +function routeClaudeOrchestrationCommand(opts) { + const { args, cwd, raw, error } = opts; + // args[0] is the family ('claude-orchestration'); the subcommand is args[1]. + const subcommand = args[1]; + if (subcommand === 'detect-backend') { + cmdDetectBackend(args, cwd, raw); + } + else if (subcommand === 'emit-workflow') { + cmdEmitWorkflow(args, cwd, raw, error); + } + else { + usage(error); + } +} +module.exports = { routeClaudeOrchestrationCommand }; diff --git a/gsd-core/bin/lib/claude-orchestration.cjs b/gsd-core/bin/lib/claude-orchestration.cjs new file mode 100644 index 000000000..802329a29 --- /dev/null +++ b/gsd-core/bin/lib/claude-orchestration.cjs @@ -0,0 +1,359 @@ +"use strict"; +/** + * Claude Orchestration Capability — Workflow-tool backend detection + emitter + * + * #1143 — adopts Claude Code's Workflow tool (the engine behind `/effort ultracode`) + * as an optional, runtime-gated parallel-execution backend for the GSD loop. + * + * This module is the pure, testable core of the capability. It owns two seams: + * + * detectWorkflowBackend({ runtimeId, hostIntegration, config, agentSdkVersion }) + * → { available: boolean, backend: 'workflow'|'inline', reason: string } + * Fail-closed: every miss degrades to `inline` (today's behaviour), so the + * core loop is byte-identical unless every gate opens. This is criteria 3 + 6. + * + * emitWorkflowScript({ phaseDir, waves, runId, budgetTokens? }) + * → { ok:true, script, summary } | { ok:false, reason } + * Maps GSD's wave/plan model 1:1 onto Workflow primitives: + * wave → sequential `parallel()` stage barriers, + * plan → `agent(brief, { agentType:'gsd-executor', isolation:'worktree' })`, + * files_modified overlap → forces plans into separate sequential stages + * (the same overlap rule execute-phase already applies inline), + * resumeFromRunId → wired to the phase run id, + * budgetTokens → a shared token pool. + * The emitted script composes the SAME gsd-executor agent and worktree + * isolation the inline path uses, so it produces the same artifacts/commits + * (criterion 2). It is a generated string consumed by the orchestrator; this + * module never invokes the Workflow tool itself. + * + * Design laws: + * - Gall's Law: ship a small working slice that composes existing primitives + * (gsd-executor + worktree isolation) rather than reinventing them. + * - Greenspun's Tenth Rule (cited in #1143): adopt the Workflow tool's + * barrier/pipeline/budget/resume semantics instead of hand-rolling them. + * - Postel's Law: liberal in input (missing fields → inline), conservative in + * output (workflow only when every gate opens). + * - Fail-closed: an unknown version, a missing descriptor, or a disabled + * toggle all resolve to `inline`, never to `workflow`. + * + * Zero external dependencies. Pure functions. Never throws on bad input. + */ +// ─── Constants ──────────────────────────────────────────────────────────────── +/** + * The Agent SDK version that introduced the Workflow tool (#1143 prior art). + * Used as the default floor when config does not override it. A runtime reporting + * an agentSdkVersion below this cannot host the Workflow backend. + */ +const WORKFLOW_TOOL_FLOOR_VERSION = '0.3.149'; +/** Closed enum for the `claude_orchestration.execution_backend` config key. */ +const BACKEND_VALUES = new Set(['auto', 'workflow', 'inline']); +/** Only this runtime can host the Workflow tool (Claude Code / Agent SDK). */ +const WORKFLOW_RUNTIME = 'claude'; +// ─── Semver helpers ─────────────────────────────────────────────────────────── +/** Official-ish strict SemVer 2.0.0 numeric triple (+ optional pre/build). */ +const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; +/** True for a syntactically valid semver string. */ +function isValidSemver(s) { + return typeof s === 'string' && SEMVER_RE.test(s); +} +/** + * Compare two semver strings. + * Returns -1/0/1 in the usual sense. Garbage in either position → -1 (fail-closed: + * an unparseable version is treated as "less than" any real floor, so detection + * never accidentally enables the preview backend on an unknown SDK). + * + * Pre-release/build metadata are ignored for the comparison — only the numeric + * major.minor.patch triple participates, matching how the Workflow-tool floor is + * specified (a plain "0.3.149"). + */ +function compareSemver(a, b) { + if (!isValidSemver(a) || !isValidSemver(b)) + return -1; + // Split numeric triple from pre-release/build metadata. + const parseTriple = (s) => { + const core = s.split('-')[0].split('+')[0].split('.'); + return [parseInt(core[0], 10), parseInt(core[1], 10), parseInt(core[2], 10)]; + }; + const hasPre = (s) => s.indexOf('-') !== -1; + const am = parseTriple(a); + const bm = parseTriple(b); + for (let i = 0; i < 3; i++) { + if (am[i] < bm[i]) + return -1; + if (am[i] > bm[i]) + return 1; + } + // Numeric triple is equal. SemVer 2.0.0 precedence: a version WITH a pre-release + // tag is LOWER than the same triple WITHOUT one. This keeps the floor fail-closed + // for pre-release builds of the floor (e.g. 0.3.149-rc.1 < 0.3.149 → inline). + const aPre = hasPre(a); + const bPre = hasPre(b); + if (aPre && !bPre) + return -1; + if (!aPre && bPre) + return 1; + return 0; +} +/** Inline result shorthand. */ +function inline(reason, available = false) { + return { available, backend: 'inline', reason }; +} +/** + * Resolve whether the Workflow-tool backend should activate. + * + * Gate ladder (all must pass for `workflow`; first miss wins, fail-closed): + * 1. capability enabled (claude_orchestration.enabled truthy) + * 2. runtime is Claude (the only runtime that exposes the Workflow tool) + * 3. execution_backend !== 'inline' + * 4. host descriptor signals nested+background dispatch (Workflow-tool capable) + * 5. agentSdkVersion is a known, valid semver + * 6. agentSdkVersion >= the configured floor (default WORKFLOW_TOOL_FLOOR_VERSION) + * 7. execution_backend === 'workflow' OR 'auto' (both reach here; 'inline' exited at 3) + * + * Never throws. Destructures defensively. + */ +function detectWorkflowBackend(input) { + if (input === null || input === undefined || typeof input !== 'object') { + return inline('capability_disabled'); + } + const cfg = (input.config !== null && input.config !== undefined && typeof input.config === 'object') + ? input.config + : {}; + // 1. capability must be opted in (default-off — ships disabled). + if (!cfg['claude_orchestration.enabled']) { + return inline('capability_disabled'); + } + // 2. only Claude can host the Workflow tool. + if (input.runtimeId !== WORKFLOW_RUNTIME) { + return inline('runtime_not_claude'); + } + // 3. explicit inline opt-out short-circuits. + let backendRaw = cfg['claude_orchestration.execution_backend']; + if (typeof backendRaw !== 'string' || !BACKEND_VALUES.has(backendRaw)) { + backendRaw = 'auto'; + } + if (backendRaw === 'inline') { + return inline('backend_inline'); + } + // 4. the host dispatch descriptor must be the nesting-capable Claude-Code shape + // (a proxy for Workflow-tool presence). This is Claude-specific and already + // gated at step 2; `background:true` alone is true on several non-Claude hosts, + // so the proxy is only meaningful after the runtime check above. Note: this is + // NOT the canonical `shouldFlattenDispatch` rule (which keys on + // `backgroundDispatch`); the Workflow backend works precisely because a single + // tool-call orchestrates internally, sidestepping the backgroundDispatch:false + // limitation. Missing/false/foreign descriptor → fail-closed. + const hi = input.hostIntegration; + if (hi === null || hi === undefined || typeof hi !== 'object' || Array.isArray(hi)) { + return inline('workflow_tool_unavailable'); + } + const dispatch = hi.dispatch; + if (typeof dispatch !== 'object' || dispatch === null || Array.isArray(dispatch)) { + return inline('workflow_tool_unavailable'); + } + const nested = dispatch['nested']; + const background = dispatch['background']; + if (nested !== true || background !== true) { + return inline('workflow_tool_unavailable'); + } + // 5. an unknown agentSdkVersion cannot be trusted to meet the floor. + if (!isValidSemver(input.agentSdkVersion)) { + return inline('agent_sdk_version_unknown'); + } + // 6. version floor (config override > default constant). + const floorRaw = cfg['claude_orchestration.min_agent_sdk_version']; + const floor = typeof floorRaw === 'string' && isValidSemver(floorRaw) ? floorRaw : WORKFLOW_TOOL_FLOOR_VERSION; + if (compareSemver(input.agentSdkVersion, floor) < 0) { + return inline('agent_sdk_version_below_floor'); + } + // 7. auto/workflow both reach the workflow backend once every gate passes. + return { available: true, backend: 'workflow', reason: 'workflow_backend_active' }; +} +/** + * Partition a wave's plans into the fewest sequential stages such that no two + * plans in the same stage share a modified file. Greedy first-fit: each plan + * goes into the earliest stage where it does not overlap any plan already there. + * + * This is the same overlap rule execute-phase applies inline — the only difference + * is the execution vehicle (Workflow `parallel()` vs one-agent-per-message). + */ +function partitionStages(plans) { + const stages = []; + for (const plan of plans) { + const fileSet = new Set(plan.files_modified); + let placed = false; + for (const stage of stages) { + let overlap = false; + for (const f of fileSet) { + if (stage.files.has(f)) { + overlap = true; + break; + } + } + if (!overlap) { + stage.plans.push(plan); + for (const f of fileSet) + stage.files.add(f); + placed = true; + break; + } + } + if (!placed) { + stages.push({ plans: [plan], files: new Set(fileSet) }); + } + } + return stages.map((s) => s.plans.map((p) => p.id)); +} +/** + * Quote a free-text value for safe embedding as a JavaScript/Workflow double-quoted + * string literal. Uses JSON.stringify so every JS-relevant escape (backslash, quote, + * newline, tab, NUL, U+2028/U+2029, all control chars) is handled by the language + * itself — there is no hand-rolled escape table to drift. Returns the value already + * wrapped in its surrounding quotes. + */ +function quoteString(s) { + return JSON.stringify(s); +} +/** + * True if `s` is a safe identifier/path token to interpolate into the generated + * script WITHOUT requiring a string-literal context — i.e. it contains no + * character that could terminate a comment line (`\n`/`\r`), break out of a + * string literal (`"` / `\`), or smuggle a NUL/control sequence. Used for + * `phaseDir`, `runId`, `wave.id`, and `plan.id`, which are identifiers/paths and + * must never legitimately contain such characters. Rejecting them at validation + * (rather than silently flattening) keeps the emitted script faithful to input. + */ +const UNSCRIPTABLE_CHAR_RE = /[\r\n"\\\x00-\x1f\x7f\u2028\u2029]/; +function isScriptableIdentifier(s) { + if (typeof s !== 'string' || s.length === 0) + return false; + return !UNSCRIPTABLE_CHAR_RE.test(s); +} +/** + * Emit a Workflow script mapping the phase's wave/plan model onto Workflow + * primitives. Pure and deterministic: identical input yields an identical string. + * + * Returns ok:false (never throws) on invalid input — empty waves, missing runId, + * a wave with no plans, etc. + */ +function emitWorkflowScript(input) { + if (input === null || input === undefined || typeof input !== 'object') { + return { ok: false, reason: 'invalid_input' }; + } + const { phaseDir, waves, runId } = input; + // Identifiers/paths interpolated into the generated script must be free of any + // character that could terminate a comment, break out of a string literal, or + // smuggle control bytes — reject up front (security: #1143 review Finding 1). + if (!isScriptableIdentifier(phaseDir)) { + return { ok: false, reason: 'phaseDir must be a non-empty string without newlines/quotes/backslash/control chars' }; + } + if (!isScriptableIdentifier(runId)) { + return { ok: false, reason: 'runId must be a non-empty string without newlines/quotes/backslash/control chars' }; + } + if (!Array.isArray(waves) || waves.length === 0) { + return { ok: false, reason: 'waves must be a non-empty array' }; + } + for (let i = 0; i < waves.length; i++) { + const w = waves[i]; + if (w === null || typeof w !== 'object' || typeof w.id !== 'string') { + return { ok: false, reason: 'waves[' + i + '] must be { id, plans: non-empty[] }' }; + } + if (!isScriptableIdentifier(w.id)) { + return { ok: false, reason: 'waves[' + i + '].id must not contain newlines/quotes/backslash/control chars' }; + } + if (!Array.isArray(w.plans) || w.plans.length === 0) { + return { ok: false, reason: 'waves[' + i + '] must have a non-empty plans array' }; + } + const seenIds = new Set(); + for (let j = 0; j < w.plans.length; j++) { + const p = w.plans[j]; + if (p === null || typeof p !== 'object' || typeof p.id !== 'string' || typeof p.brief !== 'string' || !Array.isArray(p.files_modified)) { + return { ok: false, reason: 'waves[' + i + '].plans[' + j + '] must be { id, brief, files_modified[] }' }; + } + if (!isScriptableIdentifier(p.id)) { + return { ok: false, reason: 'waves[' + i + '].plans[' + j + '].id must not contain newlines/quotes/backslash/control chars' }; + } + if (seenIds.has(p.id)) { + return { ok: false, reason: 'waves[' + i + '] has duplicate plan id "' + p.id + '"' }; + } + seenIds.add(p.id); + for (const f of p.files_modified) { + if (typeof f !== 'string' || f.length === 0) { + return { ok: false, reason: 'waves[' + i + '].plans[' + j + '].files_modified entries must be non-empty strings' }; + } + } + } + } + const budgetTokens = (typeof input.budgetTokens === 'number' && Number.isFinite(input.budgetTokens) && input.budgetTokens > 0) + ? Math.floor(input.budgetTokens) + : null; + const lines = []; + lines.push('// GSD Workflow script — generated by the claude-orchestration capability (#1143)'); + lines.push('// phase: ' + phaseDir); + lines.push('// BETA: preview-grade; on any failure the orchestrator falls back to inline dispatch.'); + lines.push('// Composes the SAME gsd-executor agent + worktree isolation as the inline path,'); + lines.push('// so artifacts (SUMMARY.md) and commits are produced identically.'); + lines.push('resumeFromRunId(' + quoteString(runId) + ')'); + if (budgetTokens !== null) { + lines.push('budget(' + budgetTokens + ')'); + } + lines.push(''); + const stagesByWave = []; + let totalPlans = 0; + for (let wi = 0; wi < waves.length; wi++) { + const wave = waves[wi]; + const stages = partitionStages(wave.plans); + stagesByWave.push(stages); + totalPlans += wave.plans.length; + lines.push('// Wave ' + wave.id); + for (let si = 0; si < stages.length; si++) { + const stagePlanIds = stages[si]; + // Resolve back to plan objects for briefs (ids are unique within a wave — validated above). + const stagePlans = stagePlanIds.map((id) => wave.plans.find((p) => p.id === id)); + if (stages.length > 1) { + lines.push('// Stage ' + si + (si > 0 ? ' (sequential — files_modified overlap)' : '')); + } + if (stagePlans.length === 1) { + const p = stagePlans[0]; + lines.push('parallel('); + lines.push(' agent(' + quoteString(p.brief) + ', { agentType: "gsd-executor", isolation: "worktree" })'); + lines.push(')'); + } + else { + lines.push('parallel('); + for (const p of stagePlans) { + lines.push(' agent(' + quoteString(p.brief) + ', { agentType: "gsd-executor", isolation: "worktree" }),'); + } + // Replace trailing comma on the last agent line with nothing. + const lastIdx = lines.length - 1; + lines[lastIdx] = lines[lastIdx].replace(/,$/, ''); + lines.push(')'); + } + } + if (wi < waves.length - 1) + lines.push(''); + } + lines.push('// Each agent writes SUMMARY.md on its worktree branch; commits land there'); + lines.push('// and are merged by the orchestrator exactly as in inline wave dispatch.'); + const script = lines.join('\n'); + return { + ok: true, + script, + summary: { + waves: waves.length, + plans: totalPlans, + stagesByWave, + resumeRunId: runId, + budgetTokens, + }, + }; +} +module.exports = { + detectWorkflowBackend, + emitWorkflowScript, + compareSemver, + isValidSemver, + WORKFLOW_TOOL_FLOOR_VERSION, + BACKEND_VALUES, + WORKFLOW_RUNTIME, +}; diff --git a/src/claude-orchestration-command-router.cts b/src/claude-orchestration-command-router.cts new file mode 100644 index 000000000..cabc96435 --- /dev/null +++ b/src/claude-orchestration-command-router.cts @@ -0,0 +1,159 @@ +/** + * Claude orchestration command router — CLI dispatcher for + * `gsd-tools claude-orchestration `. + * + * #1143 — thin CLI adapter over the pure `claude-orchestration.cjs` module. + * Lets execute-phase (or any orchestrator) invoke the Workflow-backend + * detection and the Workflow-script emitter through the standard capability + * command surface (ADR-959) instead of a bare `require()`. + * + * Router signature: { args, cwd, raw, error } — identical to the other host + * routers; discovered by dispatchCapabilityCommand via the registry's + * commandFamilies index. + * + * Subcommands: + * detect-backend [--runtime ] [--agent-sdk-version ] [--no-nested-dispatch] + * Resolves whether the Workflow backend should activate. `--runtime` + * defaults to the GSD_RUNTIME env var (or 'unknown'). Reads the + * `claude_orchestration.*` keys from .planning/config.json. Emits + * { available, backend, reason }. + * + * emit-workflow --waves --run-id [--phase-dir ] [--budget ] + * Reads a wave/plan manifest JSON file and emits the generated Workflow + * script + summary. The manifest shape matches emitWorkflowScript's input: + * { waves: [{ id, plans: [{ id, brief, files_modified: string[] }] }] }. + */ + +import fs from 'node:fs'; +import path from 'node:path'; +// eslint-disable-next-line @typescript-eslint/no-require-imports +import io = require('./io.cjs'); +// eslint-disable-next-line @typescript-eslint/no-require-imports +import core = require('./claude-orchestration.cjs'); +// eslint-disable-next-line @typescript-eslint/no-require-imports +import configLoader = require('./config-loader.cjs'); + +const { output } = io; +const { detectWorkflowBackend, emitWorkflowScript } = core; + +const CAPABLE_HOST = { dispatch: { nested: true, background: true } }; + +interface RouterOpts { + args: string[]; + cwd: string; + raw: boolean; + error: (msg: string, reason?: string) => void; +} + +function usage(error: (msg: string, reason?: string) => void): void { + error( + 'Usage: gsd-tools claude-orchestration [...]\n' + + ' detect-backend [--runtime ] [--agent-sdk-version ] [--no-nested-dispatch]\n' + + ' emit-workflow --waves --run-id [--phase-dir ] [--budget ]', + ); +} + +function argValue(args: string[], flag: string): string | undefined { + const i = args.indexOf(flag); + return i !== -1 && i + 1 < args.length ? args[i + 1] : undefined; +} + +/** + * Detect whether the Workflow backend should activate for the current/given + * runtime. Reads `claude_orchestration.*` from the project config; runtime and + * SDK version come from flags (the orchestrator already knows these) or env. + */ +function cmdDetectBackend(args: string[], cwd: string, raw: boolean): void { + const runtimeId = argValue(args, '--runtime') || process.env['GSD_RUNTIME'] || 'unknown'; + const agentSdkVersion = argValue(args, '--agent-sdk-version'); + const noNested = args.includes('--no-nested-dispatch'); + const hostIntegration = noNested ? { dispatch: { nested: false, background: true } } : CAPABLE_HOST; + + // Resolve the claude_orchestration.* slice from the project config (federated + // keys are merged by loadConfig as a nested object). A config read failure + // degrades to inline — it must not break the core loop. + let claudeSlice: Record = {}; + try { + const loaded = configLoader.loadConfig(cwd); + const slice = loaded['claude_orchestration']; + if (slice && typeof slice === 'object' && !Array.isArray(slice)) { + claudeSlice = slice as Record; + } + } catch { + claudeSlice = {}; + } + + // Flatten the nested slice into the dotted-key shape detectWorkflowBackend expects. + const flatConfig: Record = {}; + for (const k of Object.keys(claudeSlice)) { + flatConfig['claude_orchestration.' + k] = claudeSlice[k]; + } + + const result = detectWorkflowBackend({ runtimeId, hostIntegration, config: flatConfig, agentSdkVersion }); + output(result, raw); +} + +/** + * Emit a Workflow script from a wave/plan manifest file. + */ +function cmdEmitWorkflow(args: string[], _cwd: string, raw: boolean, error: (msg: string, reason?: string) => void): void { + const wavesPath = argValue(args, '--waves'); + const runId = argValue(args, '--run-id'); + const phaseDir = argValue(args, '--phase-dir') || '.planning/phases/current'; + const budgetRaw = argValue(args, '--budget'); + + if (!wavesPath) { + error('emit-workflow requires --waves '); + return; + } + if (!runId) { + error('emit-workflow requires --run-id '); + return; + } + + let waves: unknown; + try { + const content = fs.readFileSync(path.resolve(wavesPath), 'utf8'); + const parsed = JSON.parse(content) as Record; + waves = parsed['waves']; + } catch (e) { + error('emit-workflow: could not read/parse --waves file "' + wavesPath + '": ' + (e instanceof Error ? e.message : String(e))); + return; + } + + const budgetTokens = budgetRaw !== undefined ? parseInt(budgetRaw, 10) : undefined; + const budget = (typeof budgetTokens === 'number' && !Number.isNaN(budgetTokens)) ? budgetTokens : undefined; + + const result = emitWorkflowScript({ + phaseDir, + runId, + waves: waves as EmitInput['waves'], + budgetTokens: budget, + }); + + if (!result.ok) { + error('emit-workflow: ' + result.reason); + return; + } + output({ script: result.script, summary: result.summary }, raw); +} + +// Re-declared minimal input type for the cast above (avoids importing private types). +interface EmitInput { + waves: Array<{ id: string; plans: Array<{ id: string; brief: string; files_modified: string[] }> }>; +} + +function routeClaudeOrchestrationCommand(opts: RouterOpts): void { + const { args, cwd, raw, error } = opts; + // args[0] is the family ('claude-orchestration'); the subcommand is args[1]. + const subcommand = args[1]; + if (subcommand === 'detect-backend') { + cmdDetectBackend(args, cwd, raw); + } else if (subcommand === 'emit-workflow') { + cmdEmitWorkflow(args, cwd, raw, error); + } else { + usage(error); + } +} + +export = { routeClaudeOrchestrationCommand }; diff --git a/src/claude-orchestration.cts b/src/claude-orchestration.cts new file mode 100644 index 000000000..897636a8d --- /dev/null +++ b/src/claude-orchestration.cts @@ -0,0 +1,449 @@ +/** + * Claude Orchestration Capability — Workflow-tool backend detection + emitter + * + * #1143 — adopts Claude Code's Workflow tool (the engine behind `/effort ultracode`) + * as an optional, runtime-gated parallel-execution backend for the GSD loop. + * + * This module is the pure, testable core of the capability. It owns two seams: + * + * detectWorkflowBackend({ runtimeId, hostIntegration, config, agentSdkVersion }) + * → { available: boolean, backend: 'workflow'|'inline', reason: string } + * Fail-closed: every miss degrades to `inline` (today's behaviour), so the + * core loop is byte-identical unless every gate opens. This is criteria 3 + 6. + * + * emitWorkflowScript({ phaseDir, waves, runId, budgetTokens? }) + * → { ok:true, script, summary } | { ok:false, reason } + * Maps GSD's wave/plan model 1:1 onto Workflow primitives: + * wave → sequential `parallel()` stage barriers, + * plan → `agent(brief, { agentType:'gsd-executor', isolation:'worktree' })`, + * files_modified overlap → forces plans into separate sequential stages + * (the same overlap rule execute-phase already applies inline), + * resumeFromRunId → wired to the phase run id, + * budgetTokens → a shared token pool. + * The emitted script composes the SAME gsd-executor agent and worktree + * isolation the inline path uses, so it produces the same artifacts/commits + * (criterion 2). It is a generated string consumed by the orchestrator; this + * module never invokes the Workflow tool itself. + * + * Design laws: + * - Gall's Law: ship a small working slice that composes existing primitives + * (gsd-executor + worktree isolation) rather than reinventing them. + * - Greenspun's Tenth Rule (cited in #1143): adopt the Workflow tool's + * barrier/pipeline/budget/resume semantics instead of hand-rolling them. + * - Postel's Law: liberal in input (missing fields → inline), conservative in + * output (workflow only when every gate opens). + * - Fail-closed: an unknown version, a missing descriptor, or a disabled + * toggle all resolve to `inline`, never to `workflow`. + * + * Zero external dependencies. Pure functions. Never throws on bad input. + */ + +// ─── Constants ──────────────────────────────────────────────────────────────── + +/** + * The Agent SDK version that introduced the Workflow tool (#1143 prior art). + * Used as the default floor when config does not override it. A runtime reporting + * an agentSdkVersion below this cannot host the Workflow backend. + */ +const WORKFLOW_TOOL_FLOOR_VERSION = '0.3.149'; + +/** Closed enum for the `claude_orchestration.execution_backend` config key. */ +const BACKEND_VALUES = new Set(['auto', 'workflow', 'inline']); + +/** Only this runtime can host the Workflow tool (Claude Code / Agent SDK). */ +const WORKFLOW_RUNTIME = 'claude'; + +// ─── Semver helpers ─────────────────────────────────────────────────────────── + +/** Official-ish strict SemVer 2.0.0 numeric triple (+ optional pre/build). */ +const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; + +/** True for a syntactically valid semver string. */ +function isValidSemver(s: unknown): s is string { + return typeof s === 'string' && SEMVER_RE.test(s); +} + +/** + * Compare two semver strings. + * Returns -1/0/1 in the usual sense. Garbage in either position → -1 (fail-closed: + * an unparseable version is treated as "less than" any real floor, so detection + * never accidentally enables the preview backend on an unknown SDK). + * + * Pre-release/build metadata are ignored for the comparison — only the numeric + * major.minor.patch triple participates, matching how the Workflow-tool floor is + * specified (a plain "0.3.149"). + */ +function compareSemver(a: string, b: string): number { + if (!isValidSemver(a) || !isValidSemver(b)) return -1; + // Split numeric triple from pre-release/build metadata. + const parseTriple = (s: string): number[] => { + const core = s.split('-')[0].split('+')[0].split('.'); + return [parseInt(core[0], 10), parseInt(core[1], 10), parseInt(core[2], 10)]; + }; + const hasPre = (s: string): boolean => s.indexOf('-') !== -1; + const am = parseTriple(a); + const bm = parseTriple(b); + for (let i = 0; i < 3; i++) { + if (am[i] < bm[i]) return -1; + if (am[i] > bm[i]) return 1; + } + // Numeric triple is equal. SemVer 2.0.0 precedence: a version WITH a pre-release + // tag is LOWER than the same triple WITHOUT one. This keeps the floor fail-closed + // for pre-release builds of the floor (e.g. 0.3.149-rc.1 < 0.3.149 → inline). + const aPre = hasPre(a); + const bPre = hasPre(b); + if (aPre && !bPre) return -1; + if (!aPre && bPre) return 1; + return 0; +} + +// ─── detectWorkflowBackend ──────────────────────────────────────────────────── + +interface HostIntegration { + dispatch?: { + nested?: boolean; + background?: boolean; + backgroundDispatch?: boolean; + [k: string]: unknown; + }; + [k: string]: unknown; +} + +interface BackendConfig { + 'claude_orchestration.enabled'?: unknown; + 'claude_orchestration.execution_backend'?: unknown; + 'claude_orchestration.min_agent_sdk_version'?: unknown; + [k: string]: unknown; +} + +interface DetectInput { + runtimeId?: string; + hostIntegration?: HostIntegration | null; + config?: BackendConfig | null; + agentSdkVersion?: string; +} + +interface DetectResult { + available: boolean; + backend: 'workflow' | 'inline'; + reason: string; +} + +/** Inline result shorthand. */ +function inline(reason: string, available = false): DetectResult { + return { available, backend: 'inline', reason }; +} + +/** + * Resolve whether the Workflow-tool backend should activate. + * + * Gate ladder (all must pass for `workflow`; first miss wins, fail-closed): + * 1. capability enabled (claude_orchestration.enabled truthy) + * 2. runtime is Claude (the only runtime that exposes the Workflow tool) + * 3. execution_backend !== 'inline' + * 4. host descriptor signals nested+background dispatch (Workflow-tool capable) + * 5. agentSdkVersion is a known, valid semver + * 6. agentSdkVersion >= the configured floor (default WORKFLOW_TOOL_FLOOR_VERSION) + * 7. execution_backend === 'workflow' OR 'auto' (both reach here; 'inline' exited at 3) + * + * Never throws. Destructures defensively. + */ +function detectWorkflowBackend(input: DetectInput | null | undefined): DetectResult { + if (input === null || input === undefined || typeof input !== 'object') { + return inline('capability_disabled'); + } + + const cfg: BackendConfig = + (input.config !== null && input.config !== undefined && typeof input.config === 'object') + ? input.config + : {}; + + // 1. capability must be opted in (default-off — ships disabled). + if (!cfg['claude_orchestration.enabled']) { + return inline('capability_disabled'); + } + + // 2. only Claude can host the Workflow tool. + if (input.runtimeId !== WORKFLOW_RUNTIME) { + return inline('runtime_not_claude'); + } + + // 3. explicit inline opt-out short-circuits. + let backendRaw = cfg['claude_orchestration.execution_backend']; + if (typeof backendRaw !== 'string' || !BACKEND_VALUES.has(backendRaw)) { + backendRaw = 'auto'; + } + if (backendRaw === 'inline') { + return inline('backend_inline'); + } + + // 4. the host dispatch descriptor must be the nesting-capable Claude-Code shape + // (a proxy for Workflow-tool presence). This is Claude-specific and already + // gated at step 2; `background:true` alone is true on several non-Claude hosts, + // so the proxy is only meaningful after the runtime check above. Note: this is + // NOT the canonical `shouldFlattenDispatch` rule (which keys on + // `backgroundDispatch`); the Workflow backend works precisely because a single + // tool-call orchestrates internally, sidestepping the backgroundDispatch:false + // limitation. Missing/false/foreign descriptor → fail-closed. + const hi = input.hostIntegration; + if (hi === null || hi === undefined || typeof hi !== 'object' || Array.isArray(hi)) { + return inline('workflow_tool_unavailable'); + } + const dispatch = (hi as { dispatch?: Record }).dispatch; + if (typeof dispatch !== 'object' || dispatch === null || Array.isArray(dispatch)) { + return inline('workflow_tool_unavailable'); + } + const nested = dispatch['nested']; + const background = dispatch['background']; + if (nested !== true || background !== true) { + return inline('workflow_tool_unavailable'); + } + + // 5. an unknown agentSdkVersion cannot be trusted to meet the floor. + if (!isValidSemver(input.agentSdkVersion)) { + return inline('agent_sdk_version_unknown'); + } + + // 6. version floor (config override > default constant). + const floorRaw = cfg['claude_orchestration.min_agent_sdk_version']; + const floor = typeof floorRaw === 'string' && isValidSemver(floorRaw) ? floorRaw : WORKFLOW_TOOL_FLOOR_VERSION; + if (compareSemver(input.agentSdkVersion, floor) < 0) { + return inline('agent_sdk_version_below_floor'); + } + + // 7. auto/workflow both reach the workflow backend once every gate passes. + return { available: true, backend: 'workflow', reason: 'workflow_backend_active' }; +} + +// ─── emitWorkflowScript ─────────────────────────────────────────────────────── + +interface Plan { + id: string; + brief: string; + files_modified: string[]; +} + +interface Wave { + id: string; + plans: Plan[]; +} + +interface EmitInput { + phaseDir: string; + waves: Wave[]; + runId: string; + budgetTokens?: number; +} + +interface EmitOk { + ok: true; + script: string; + summary: { + waves: number; + plans: number; + stagesByWave: string[][][]; // wave → stage → planId[] + resumeRunId: string; + budgetTokens: number | null; + }; +} + +interface EmitErr { + ok: false; + reason: string; +} + +/** + * Partition a wave's plans into the fewest sequential stages such that no two + * plans in the same stage share a modified file. Greedy first-fit: each plan + * goes into the earliest stage where it does not overlap any plan already there. + * + * This is the same overlap rule execute-phase applies inline — the only difference + * is the execution vehicle (Workflow `parallel()` vs one-agent-per-message). + */ +function partitionStages(plans: Plan[]): string[][] { + const stages: { plans: Plan[]; files: Set }[] = []; + for (const plan of plans) { + const fileSet = new Set(plan.files_modified); + let placed = false; + for (const stage of stages) { + let overlap = false; + for (const f of fileSet) { + if (stage.files.has(f)) { overlap = true; break; } + } + if (!overlap) { + stage.plans.push(plan); + for (const f of fileSet) stage.files.add(f); + placed = true; + break; + } + } + if (!placed) { + stages.push({ plans: [plan], files: new Set(fileSet) }); + } + } + return stages.map((s) => s.plans.map((p) => p.id)); +} + +/** + * Quote a free-text value for safe embedding as a JavaScript/Workflow double-quoted + * string literal. Uses JSON.stringify so every JS-relevant escape (backslash, quote, + * newline, tab, NUL, U+2028/U+2029, all control chars) is handled by the language + * itself — there is no hand-rolled escape table to drift. Returns the value already + * wrapped in its surrounding quotes. + */ +function quoteString(s: string): string { + return JSON.stringify(s); +} + +/** + * True if `s` is a safe identifier/path token to interpolate into the generated + * script WITHOUT requiring a string-literal context — i.e. it contains no + * character that could terminate a comment line (`\n`/`\r`), break out of a + * string literal (`"` / `\`), or smuggle a NUL/control sequence. Used for + * `phaseDir`, `runId`, `wave.id`, and `plan.id`, which are identifiers/paths and + * must never legitimately contain such characters. Rejecting them at validation + * (rather than silently flattening) keeps the emitted script faithful to input. + */ +const UNSCRIPTABLE_CHAR_RE = /[\r\n"\\\x00-\x1f\x7f\u2028\u2029]/; +function isScriptableIdentifier(s: unknown): boolean { + if (typeof s !== 'string' || s.length === 0) return false; + return !UNSCRIPTABLE_CHAR_RE.test(s); +} + +/** + * Emit a Workflow script mapping the phase's wave/plan model onto Workflow + * primitives. Pure and deterministic: identical input yields an identical string. + * + * Returns ok:false (never throws) on invalid input — empty waves, missing runId, + * a wave with no plans, etc. + */ +function emitWorkflowScript(input: EmitInput | null | undefined): EmitOk | EmitErr { + if (input === null || input === undefined || typeof input !== 'object') { + return { ok: false, reason: 'invalid_input' }; + } + const { phaseDir, waves, runId } = input; + // Identifiers/paths interpolated into the generated script must be free of any + // character that could terminate a comment, break out of a string literal, or + // smuggle control bytes — reject up front (security: #1143 review Finding 1). + if (!isScriptableIdentifier(phaseDir)) { + return { ok: false, reason: 'phaseDir must be a non-empty string without newlines/quotes/backslash/control chars' }; + } + if (!isScriptableIdentifier(runId)) { + return { ok: false, reason: 'runId must be a non-empty string without newlines/quotes/backslash/control chars' }; + } + if (!Array.isArray(waves) || waves.length === 0) { + return { ok: false, reason: 'waves must be a non-empty array' }; + } + for (let i = 0; i < waves.length; i++) { + const w = waves[i]; + if (w === null || typeof w !== 'object' || typeof w.id !== 'string') { + return { ok: false, reason: 'waves[' + i + '] must be { id, plans: non-empty[] }' }; + } + if (!isScriptableIdentifier(w.id)) { + return { ok: false, reason: 'waves[' + i + '].id must not contain newlines/quotes/backslash/control chars' }; + } + if (!Array.isArray(w.plans) || w.plans.length === 0) { + return { ok: false, reason: 'waves[' + i + '] must have a non-empty plans array' }; + } + const seenIds = new Set(); + for (let j = 0; j < w.plans.length; j++) { + const p = w.plans[j]; + if (p === null || typeof p !== 'object' || typeof p.id !== 'string' || typeof p.brief !== 'string' || !Array.isArray(p.files_modified)) { + return { ok: false, reason: 'waves[' + i + '].plans[' + j + '] must be { id, brief, files_modified[] }' }; + } + if (!isScriptableIdentifier(p.id)) { + return { ok: false, reason: 'waves[' + i + '].plans[' + j + '].id must not contain newlines/quotes/backslash/control chars' }; + } + if (seenIds.has(p.id)) { + return { ok: false, reason: 'waves[' + i + '] has duplicate plan id "' + p.id + '"' }; + } + seenIds.add(p.id); + for (const f of p.files_modified) { + if (typeof f !== 'string' || f.length === 0) { + return { ok: false, reason: 'waves[' + i + '].plans[' + j + '].files_modified entries must be non-empty strings' }; + } + } + } + } + + const budgetTokens = (typeof input.budgetTokens === 'number' && Number.isFinite(input.budgetTokens) && input.budgetTokens > 0) + ? Math.floor(input.budgetTokens) + : null; + + const lines: string[] = []; + lines.push('// GSD Workflow script — generated by the claude-orchestration capability (#1143)'); + lines.push('// phase: ' + phaseDir); + lines.push('// BETA: preview-grade; on any failure the orchestrator falls back to inline dispatch.'); + lines.push('// Composes the SAME gsd-executor agent + worktree isolation as the inline path,'); + lines.push('// so artifacts (SUMMARY.md) and commits are produced identically.'); + lines.push('resumeFromRunId(' + quoteString(runId) + ')'); + if (budgetTokens !== null) { + lines.push('budget(' + budgetTokens + ')'); + } + lines.push(''); + + const stagesByWave: string[][][] = []; + let totalPlans = 0; + + for (let wi = 0; wi < waves.length; wi++) { + const wave = waves[wi]; + const stages = partitionStages(wave.plans); + stagesByWave.push(stages); + totalPlans += wave.plans.length; + + lines.push('// Wave ' + wave.id); + for (let si = 0; si < stages.length; si++) { + const stagePlanIds = stages[si]; + // Resolve back to plan objects for briefs (ids are unique within a wave — validated above). + const stagePlans = stagePlanIds.map((id) => wave.plans.find((p) => p.id === id) as Plan); + if (stages.length > 1) { + lines.push('// Stage ' + si + (si > 0 ? ' (sequential — files_modified overlap)' : '')); + } + if (stagePlans.length === 1) { + const p = stagePlans[0]; + lines.push('parallel('); + lines.push(' agent(' + quoteString(p.brief) + ', { agentType: "gsd-executor", isolation: "worktree" })'); + lines.push(')'); + } else { + lines.push('parallel('); + for (const p of stagePlans) { + lines.push(' agent(' + quoteString(p.brief) + ', { agentType: "gsd-executor", isolation: "worktree" }),'); + } + // Replace trailing comma on the last agent line with nothing. + const lastIdx = lines.length - 1; + lines[lastIdx] = lines[lastIdx].replace(/,$/, ''); + lines.push(')'); + } + } + if (wi < waves.length - 1) lines.push(''); + } + + lines.push('// Each agent writes SUMMARY.md on its worktree branch; commits land there'); + lines.push('// and are merged by the orchestrator exactly as in inline wave dispatch.'); + + const script = lines.join('\n'); + + return { + ok: true, + script, + summary: { + waves: waves.length, + plans: totalPlans, + stagesByWave, + resumeRunId: runId, + budgetTokens, + }, + }; +} + +// ─── Exports ────────────────────────────────────────────────────────────────── + +export = { + detectWorkflowBackend, + emitWorkflowScript, + compareSemver, + isValidSemver, + WORKFLOW_TOOL_FLOOR_VERSION, + BACKEND_VALUES, + WORKFLOW_RUNTIME, +}; diff --git a/tests/check-gap-analysis-plan-post-e2e.test.cjs b/tests/check-gap-analysis-plan-post-e2e.test.cjs index 4a4a7930a..62b4bf87a 100644 --- a/tests/check-gap-analysis-plan-post-e2e.test.cjs +++ b/tests/check-gap-analysis-plan-post-e2e.test.cjs @@ -493,7 +493,7 @@ describe('resolveLoopHooks plan:post — pure function against real registry', ( assert.strictEqual(result.activeHooks[0].capId, 'gap-analysis'); }); - test('[happy] real registry byLoopPoint plan:post has 1 step (mempalace), 1 contribution (external-job planner fragment), and 1 gate (gap-analysis)', () => { + test('[happy] real registry byLoopPoint plan:post has 1 step (mempalace), 2 contributions (external-job planner + claude-orchestration ultraplan ownership), and 1 gate (gap-analysis)', () => { const entry = realRegistry.byLoopPoint['plan:post']; assert.ok(entry, 'plan:post must exist in byLoopPoint'); assert.ok(Array.isArray(entry.steps), 'steps must be an array'); @@ -501,8 +501,12 @@ describe('resolveLoopHooks plan:post — pure function against real registry', ( assert.ok(Array.isArray(entry.gates), 'gates must be an array'); assert.strictEqual(entry.steps.length, 1, 'plan:post must have 1 step (mempalace capture)'); assert.strictEqual(entry.steps[0].capId, 'mempalace', 'plan:post step must be from mempalace'); - assert.strictEqual(entry.contributions.length, 1, 'plan:post must have 1 contribution (external-job planner runtime-budget fragment)'); - assert.strictEqual(entry.contributions[0].capId, 'external-job', 'plan:post contribution must be from external-job'); + // #1143: claude-orchestration registers a plan:post contribution declaring + // ultraplan plan-offload ownership under its runtime gate (default-off). + assert.strictEqual(entry.contributions.length, 2, 'plan:post must have 2 contributions (external-job planner + claude-orchestration ultraplan ownership)'); + const capIds = entry.contributions.map(c => c.capId).sort(); + assert.deepStrictEqual(capIds, ['claude-orchestration', 'external-job'], + `plan:post contributions must be external-job + claude-orchestration; got ${capIds.join(',')}`); assert.strictEqual(entry.gates.length, 1, 'plan:post must have exactly one gate'); assert.strictEqual(entry.gates[0].capId, 'gap-analysis'); }); diff --git a/tests/claude-orchestration-command-router.test.cjs b/tests/claude-orchestration-command-router.test.cjs new file mode 100644 index 000000000..e0a408f1b --- /dev/null +++ b/tests/claude-orchestration-command-router.test.cjs @@ -0,0 +1,169 @@ +'use strict'; + +/** + * claude-orchestration-command-router.test.cjs — end-to-end tests for the + * `gsd-tools claude-orchestration` command surface (#1143). + * + * Exercises the full dispatch path: gsd-tools → dispatchCapabilityCommand → + * routeClaudeOrchestrationCommand → the pure detect/emitter functions. + * + * NOTE: runGsdTools() returns { success, output, exitCode, error } — it does + * NOT throw on a non-zero exit (helpers.cjs). Tests assert `.success` and parse + * `.output`, and check `.error` on the failure path. + */ + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const { runGsdTools, createTempProject, cleanup } = require('./helpers.cjs'); + +// ─── Fixtures ───────────────────────────────────────────────────────────────── + +const WAVES_MANIFEST = { + waves: [ + { + id: 'w1', + plans: [ + { id: 'p1', brief: 'Implement the foo module', files_modified: ['src/foo.cts'] }, + { id: 'p2', brief: 'Wire the bar seam', files_modified: ['src/bar.cts'] }, + ], + }, + ], +}; + +function writeManifest(tmpDir) { + const manifestPath = path.join(tmpDir, 'waves.json'); + fs.writeFileSync(manifestPath, JSON.stringify(WAVES_MANIFEST), 'utf8'); + return manifestPath; +} + +/** Run the command and assert it succeeded, returning the parsed JSON output. */ +function runAndParse(args, cwd) { + const res = runGsdTools(args, cwd); + assert.strictEqual(res.success, true, 'command should succeed; stderr: ' + (res.error || '')); + assert.ok(res.output.length > 0, 'command should emit output'); + return JSON.parse(res.output); +} + +// ─── emit-workflow ──────────────────────────────────────────────────────────── + +describe('claude-orchestration emit-workflow (CLI)', () => { + test('emits a Workflow script with parallel barriers, gsd-executor + worktree, and resumeFromRunId', () => { + const tmp = createTempProject('claw-emit-'); + try { + const manifestPath = writeManifest(tmp); + const parsed = runAndParse([ + 'claude-orchestration', 'emit-workflow', + '--waves', manifestPath, + '--run-id', 'run-cli-1143', + '--phase-dir', '.planning/phases/01-foo', + ], tmp); + assert.ok(typeof parsed.script === 'string' && parsed.script.length > 0); + assert.ok(parsed.script.includes('parallel('), 'parallel() barrier emitted'); + assert.ok(parsed.script.includes('gsd-executor'), 'gsd-executor agentType'); + assert.ok(parsed.script.includes('worktree'), 'worktree isolation'); + assert.ok(parsed.script.includes('resumeFromRunId'), 'resumeFromRunId wired'); + assert.ok(parsed.script.includes('run-cli-1143'), 'carries the run id'); + assert.strictEqual(parsed.summary.resumeRunId, 'run-cli-1143'); + assert.strictEqual(parsed.summary.waves, 1); + assert.strictEqual(parsed.summary.plans, 2); + } finally { + cleanup(tmp); + } + }); + + test('budget flag threads a shared token pool into the script', () => { + const tmp = createTempProject('claw-budget-'); + try { + const manifestPath = writeManifest(tmp); + const parsed = runAndParse([ + 'claude-orchestration', 'emit-workflow', + '--waves', manifestPath, + '--run-id', 'r', + '--budget', '750000', + ], tmp); + assert.ok(parsed.script.includes('budget('), 'budget() pool emitted'); + assert.ok(parsed.script.includes('750000')); + } finally { + cleanup(tmp); + } + }); + + test('missing --waves -> non-zero exit with a diagnostic', () => { + const tmp = createTempProject('claw-noargs-'); + try { + const res = runGsdTools([ + 'claude-orchestration', 'emit-workflow', '--run-id', 'r', + ], tmp); + assert.strictEqual(res.success, false, 'missing --waves must fail'); + assert.ok(res.exitCode !== 0, 'non-zero exit'); + assert.match(res.error || '', /--waves/); + } finally { + cleanup(tmp); + } + }); +}); + +// ─── detect-backend ─────────────────────────────────────────────────────────── + +describe('claude-orchestration detect-backend (CLI)', () => { + test('default config (capability off) -> inline, even on Claude', () => { + const tmp = createTempProject('claw-detect-'); + try { + const parsed = runAndParse([ + 'claude-orchestration', 'detect-backend', + '--runtime', 'claude', + '--agent-sdk-version', '1.0.0', + ], tmp); + assert.strictEqual(parsed.backend, 'inline'); + assert.strictEqual(parsed.available, false); + assert.match(parsed.reason, /disabled/); + } finally { + cleanup(tmp); + } + }); + + test('enabled + claude + capable + new-enough SDK -> workflow', () => { + const tmp = createTempProject('claw-detect-on-'); + try { + fs.mkdirSync(path.join(tmp, '.planning'), { recursive: true }); + fs.writeFileSync( + path.join(tmp, '.planning', 'config.json'), + JSON.stringify({ claude_orchestration: { enabled: true, execution_backend: 'auto' } }), + 'utf8', + ); + const parsed = runAndParse([ + 'claude-orchestration', 'detect-backend', + '--runtime', 'claude', + '--agent-sdk-version', '1.2.0', + ], tmp); + assert.strictEqual(parsed.backend, 'workflow'); + assert.strictEqual(parsed.available, true); + } finally { + cleanup(tmp); + } + }); + + test('non-Claude runtime -> inline (criterion 6)', () => { + const tmp = createTempProject('claw-detect-nonclaude-'); + try { + fs.mkdirSync(path.join(tmp, '.planning'), { recursive: true }); + fs.writeFileSync( + path.join(tmp, '.planning', 'config.json'), + JSON.stringify({ claude_orchestration: { enabled: true } }), + 'utf8', + ); + const parsed = runAndParse([ + 'claude-orchestration', 'detect-backend', + '--runtime', 'codex', + '--agent-sdk-version', '1.0.0', + ], tmp); + assert.strictEqual(parsed.backend, 'inline'); + assert.match(parsed.reason, /claude/i); + } finally { + cleanup(tmp); + } + }); +}); diff --git a/tests/claude-orchestration.test.cjs b/tests/claude-orchestration.test.cjs new file mode 100644 index 000000000..03a3e6c66 --- /dev/null +++ b/tests/claude-orchestration.test.cjs @@ -0,0 +1,607 @@ +'use strict'; + +/** + * claude-orchestration.test.cjs — Behavioral tests for the Claude orchestration + * capability (#1143): Workflow-tool backend detection, Workflow-script emission, + * capability-declaration validation, registry integration, and inline-fallback parity. + * + * The capability is default-off + BETA + claude-only. On any runtime lacking the + * Workflow tool it must be a byte-identical no-op. These tests encode that contract. + */ + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const fc = require('fast-check'); + +const { + detectWorkflowBackend, + emitWorkflowScript, + WORKFLOW_TOOL_FLOOR_VERSION, + BACKEND_VALUES, + compareSemver, +} = require('../gsd-core/bin/lib/claude-orchestration.cjs'); + +const { + validateCapability, + validateAgainstContract, + loadAndValidate, + buildRegistry, + serializeRegistry, + normalizeLineEndings, + stripGeneratedComment, +} = require('../scripts/gen-capability-registry.cjs'); + +const ROOT = path.resolve(__dirname, '..'); +const CAP_PATH = path.join(ROOT, 'capabilities', 'claude-orchestration', 'capability.json'); +const REGISTRY_PATH = path.join(ROOT, 'gsd-core', 'bin', 'lib', 'capability-registry.cjs'); + +// ─── Fixtures ───────────────────────────────────────────────────────────────── + +/** A host-integration descriptor whose dispatch axis signals Workflow-tool capability. */ +const CAPABLE_HOST = { + dispatch: { namedDispatch: true, nested: true, background: true, backgroundDispatch: false }, +}; + +/** Read the real capability declaration (data file — not a source grep). */ +function loadCap() { + return JSON.parse(fs.readFileSync(CAP_PATH, 'utf8')); +} + +/** A minimal single-plan wave manifest. */ +function singleWaveManifest() { + return { + phaseDir: '.planning/phases/01-foo', + runId: 'run-abc-1143', + waves: [ + { + id: 'w1', + plans: [ + { id: 'p1', brief: 'Implement the foo module', files_modified: ['src/foo.cts'] }, + ], + }, + ], + }; +} + +/** Two plans in one wave that DO NOT overlap (parallel-safe in a single stage). */ +function nonOverlappingManifest() { + return { + phaseDir: '.planning/phases/01-foo', + runId: 'run-abc-1143', + waves: [ + { + id: 'w1', + plans: [ + { id: 'p1', brief: 'Plan A', files_modified: ['src/a.cts'] }, + { id: 'p2', brief: 'Plan B', files_modified: ['src/b.cts'] }, + ], + }, + ], + }; +} + +/** Two plans in one wave that DO overlap on files_modified (must split into stages). */ +function overlappingManifest() { + return { + phaseDir: '.planning/phases/01-foo', + runId: 'run-abc-1143', + waves: [ + { + id: 'w1', + plans: [ + { id: 'p1', brief: 'Plan A', files_modified: ['src/shared.cts', 'src/a.cts'] }, + { id: 'p2', brief: 'Plan B', files_modified: ['src/shared.cts', 'src/b.cts'] }, + ], + }, + ], + }; +} + +// ─── 1. detectWorkflowBackend ───────────────────────────────────────────────── + +describe('detectWorkflowBackend', () => { + + test('capability disabled (default-off) -> inline, even on Claude with the tool', () => { + const r = detectWorkflowBackend({ + runtimeId: 'claude', + hostIntegration: CAPABLE_HOST, + agentSdkVersion: '1.0.0', + config: { 'claude_orchestration.enabled': false }, + }); + assert.strictEqual(r.available, false); + assert.strictEqual(r.backend, 'inline'); + assert.match(r.reason, /disabled/); + }); + + test('non-Claude runtime -> inline (criterion 6: no change to non-Claude loop)', () => { + for (const runtimeId of ['codex', 'cursor', 'opencode', 'copilot', ' Windsurf'.trim()]) { + const r = detectWorkflowBackend({ + runtimeId, + hostIntegration: CAPABLE_HOST, + agentSdkVersion: '1.0.0', + config: { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'workflow' }, + }); + assert.strictEqual(r.backend, 'inline', runtimeId + ' should be inline'); + assert.strictEqual(r.available, false, runtimeId + ' should be unavailable'); + assert.match(r.reason, /claude/i, runtimeId + ' reason should mention claude'); + } + }); + + test('Claude + auto + capable host + new-enough SDK -> workflow', () => { + const r = detectWorkflowBackend({ + runtimeId: 'claude', + hostIntegration: CAPABLE_HOST, + agentSdkVersion: '1.2.0', + config: { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'auto' }, + }); + assert.strictEqual(r.backend, 'workflow'); + assert.strictEqual(r.available, true); + }); + + test('Claude + execution_backend:"workflow" forces workflow when tool is capable', () => { + const r = detectWorkflowBackend({ + runtimeId: 'claude', + hostIntegration: CAPABLE_HOST, + agentSdkVersion: '1.0.0', + config: { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'workflow' }, + }); + assert.strictEqual(r.backend, 'workflow'); + assert.strictEqual(r.available, true); + }); + + test('Claude + execution_backend:"inline" -> inline even when tool is capable', () => { + const r = detectWorkflowBackend({ + runtimeId: 'claude', + hostIntegration: CAPABLE_HOST, + agentSdkVersion: '1.0.0', + config: { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'inline' }, + }); + assert.strictEqual(r.backend, 'inline'); + assert.match(r.reason, /inline/); + }); + + test('Claude + auto + host lacking nested dispatch -> inline (fail-closed)', () => { + const r = detectWorkflowBackend({ + runtimeId: 'claude', + hostIntegration: { dispatch: { nested: false, background: true } }, + agentSdkVersion: '1.0.0', + config: { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'auto' }, + }); + assert.strictEqual(r.backend, 'inline'); + assert.strictEqual(r.available, false); + }); + + test('Claude + unknown agentSdkVersion -> inline fail-closed (criterion 3 fallback)', () => { + const r = detectWorkflowBackend({ + runtimeId: 'claude', + hostIntegration: CAPABLE_HOST, + agentSdkVersion: undefined, + config: { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'auto' }, + }); + assert.strictEqual(r.backend, 'inline'); + assert.strictEqual(r.available, false); + assert.match(r.reason, /version|sdk|unknown/i); + }); + + test('agent SDK version boundary: floor-1 -> inline, floor -> workflow, floor+patch -> workflow', () => { + const floor = WORKFLOW_TOOL_FLOOR_VERSION; + const [maj, min, pat] = floor.split('.').map((n) => parseInt(n, 10)); + // Robust "below" derivation with full borrow chain (works for .0.0 floors too). + let below; + if (pat > 0) below = `${maj}.${min}.${pat - 1}`; + else if (min > 0) below = `${maj}.${min - 1}.999`; + else if (maj > 0) below = `${maj - 1}.999.999`; + else { assert.ok(false, 'cannot derive below for 0.0.0 floor'); return; } + const above = `${maj}.${min}.${pat + 1}`; + // Sanity: confirm below really is below per the comparator under test. + assert.ok(compareSemver(below, floor) < 0, below + ' must compare below ' + floor); + + const cfg = { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'auto' }; + + const rBelow = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: below, config: cfg }); + assert.strictEqual(rBelow.backend, 'inline', below + ' (floor-1) must be inline'); + + const rAt = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: floor, config: cfg }); + assert.strictEqual(rAt.backend, 'workflow', floor + ' (exact floor) must be workflow'); + + const rAbove = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: above, config: cfg }); + assert.strictEqual(rAbove.backend, 'workflow', above + ' (floor+patch) must be workflow'); + }); + + test('config-level min_agent_sdk_version override raises/lowers the floor', () => { + const cfg = { + 'claude_orchestration.enabled': true, + 'claude_orchestration.execution_backend': 'auto', + 'claude_orchestration.min_agent_sdk_version': '2.0.0', + }; + const r1 = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: '1.9.9', config: cfg }); + assert.strictEqual(r1.backend, 'inline', 'below raised floor -> inline'); + const r2 = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: '2.0.0', config: cfg }); + assert.strictEqual(r2.backend, 'workflow', 'at raised floor -> workflow'); + }); + + test('execution_backend:"workflow" + SDK below floor -> inline (M-1: floor applies in both modes)', () => { + const cfg = { + 'claude_orchestration.enabled': true, + 'claude_orchestration.execution_backend': 'workflow', + }; + const r = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: '0.3.0', config: cfg }); + assert.strictEqual(r.backend, 'inline', 'workflow mode must still honor the SDK floor (fail-closed)'); + assert.strictEqual(r.available, false); + assert.match(r.reason, /floor|version/); + }); + + test('pre-release of the floor (0.3.149-rc.1) -> inline (pre-release < GA per SemVer)', () => { + const cfg = { 'claude_orchestration.enabled': true, 'claude_orchestration.execution_backend': 'auto' }; + // Explicitly assert the precedence rule: a pre-release tag is below the GA release. + assert.ok(compareSemver('0.3.149-rc.1', '0.3.149') < 0, 'pre-release must compare below GA'); + const r = detectWorkflowBackend({ runtimeId: 'claude', hostIntegration: CAPABLE_HOST, agentSdkVersion: '0.3.149-rc.1', config: cfg }); + assert.strictEqual(r.backend, 'inline', 'pre-release of the floor must not activate the BETA backend'); + assert.strictEqual(r.available, false); + }); + + test('missing/empty input -> inline, never throws (Postel: liberal-in-input)', () => { + assert.strictEqual(detectWorkflowBackend({}).backend, 'inline'); + assert.strictEqual(detectWorkflowBackend(null).backend, 'inline'); + assert.strictEqual(detectWorkflowBackend(undefined).backend, 'inline'); + assert.strictEqual(detectWorkflowBackend({ runtimeId: 'claude' }).backend, 'inline'); + }); + + test('BACKEND_VALUES exposes the closed enum', () => { + assert.deepStrictEqual([...BACKEND_VALUES].sort(), ['auto', 'inline', 'workflow']); + }); + + test('property: pure & deterministic (same input -> same output)', () => { + fc.assert(fc.property( + fc.record({ + runtimeId: fc.constantFrom('claude', 'codex', 'cursor', 'opencode'), + sdk: fc.option(fc.string({ minLength: 1, maxLength: 8 }).filter((s) => /^\d/.test(s)), { nil: undefined }), + backend: fc.constantFrom('auto', 'workflow', 'inline'), + enabled: fc.boolean(), + }), + (input) => { + const cfg = { + 'claude_orchestration.enabled': input.enabled, + 'claude_orchestration.execution_backend': input.backend, + }; + const a = detectWorkflowBackend({ runtimeId: input.runtimeId, hostIntegration: CAPABLE_HOST, agentSdkVersion: input.sdk, config: cfg }); + const b = detectWorkflowBackend({ runtimeId: input.runtimeId, hostIntegration: CAPABLE_HOST, agentSdkVersion: input.sdk, config: cfg }); + assert.deepStrictEqual(a, b); + assert.ok(['workflow', 'inline'].includes(a.backend)); + }, + )); + }); +}); + +// ─── 2. compareSemver helper ────────────────────────────────────────────────── + +describe('compareSemver', () => { + test('ordering', () => { + assert.ok(compareSemver('1.0.0', '0.9.9') > 0); + assert.ok(compareSemver('1.0.0', '1.0.0') === 0); + assert.ok(compareSemver('1.0.0', '1.0.1') < 0); + assert.ok(compareSemver('2.0.0', '1.9.9') > 0); + }); + test('garbage versions compare as -1 (fail-closed)', () => { + assert.strictEqual(compareSemver('garbage', '1.0.0'), -1); + assert.strictEqual(compareSemver('1.0.0', ''), -1); + }); +}); + +// ─── 3. emitWorkflowScript ──────────────────────────────────────────────────── + +describe('emitWorkflowScript', () => { + + test('single-wave single-plan -> one parallel barrier, one agent, executor+worktree', () => { + const { ok, script, summary } = emitWorkflowScript(singleWaveManifest()); + assert.strictEqual(ok, true); + assert.ok(typeof script === 'string' && script.length > 0); + + const parallelCount = (script.match(/parallel\s*\(/g) || []).length; + assert.ok(parallelCount >= 1, 'at least one parallel() barrier'); + assert.ok(script.includes('agent('), 'agent() call per plan'); + assert.ok(script.includes('gsd-executor'), 'uses gsd-executor agentType'); + assert.ok(script.includes('worktree'), 'uses worktree isolation'); + assert.ok(script.includes('SUMMARY.md'), 'produces SUMMARY.md (same artifact as inline path)'); + + assert.deepStrictEqual(summary.waves, 1); + assert.deepStrictEqual(summary.plans, 1); + }); + + test('multi-wave -> one parallel() barrier per wave (sequential barriers)', () => { + const r = emitWorkflowScript({ + phaseDir: '.planning/phases/01-foo', + runId: 'run-multi', + waves: [ + { id: 'w1', plans: [{ id: 'p1', brief: 'A', files_modified: ['src/a.cts'] }] }, + { id: 'w2', plans: [{ id: 'p2', brief: 'B', files_modified: ['src/b.cts'] }] }, + { id: 'w3', plans: [{ id: 'p3', brief: 'C', files_modified: ['src/c.cts'] }] }, + ], + }); + assert.strictEqual(r.ok, true); + const parallelCount = (r.script.match(/parallel\s*\(/g) || []).length; + assert.strictEqual(parallelCount, 3, 'one parallel() per wave'); + assert.strictEqual(r.summary.waves, 3); + assert.strictEqual(r.summary.plans, 3); + }); + + test('overlapping files_modified -> plans split into separate sequential stages (criterion 2)', () => { + const r = emitWorkflowScript(overlappingManifest()); + assert.strictEqual(r.ok, true); + // Two plans sharing src/shared.cts must NOT be in the same stage. + const stages = r.summary.stagesByWave[0]; // wave w1 + assert.ok(Array.isArray(stages), 'stagesByWave present'); + assert.strictEqual(stages.length, 2, 'overlapping plans split into 2 stages'); + const stagePlanSets = stages.map((s) => s.slice().sort()); + const allPlans = stagePlanSets.flat().sort(); + assert.deepStrictEqual(allPlans, ['p1', 'p2']); + // p1 and p2 must be in different stages + assert.ok(stages[0].length === 1 && stages[1].length === 1, 'one plan per stage when they overlap'); + }); + + test('non-overlapping plans -> coalesced into a single parallel stage', () => { + const r = emitWorkflowScript(nonOverlappingManifest()); + assert.strictEqual(r.ok, true); + const stages = r.summary.stagesByWave[0]; + assert.strictEqual(stages.length, 1, 'non-overlapping plans share one stage'); + assert.deepStrictEqual(stages[0].slice().sort(), ['p1', 'p2']); + }); + + test('resumeFromRunId wired to the provided runId (criterion 4)', () => { + const r = emitWorkflowScript(singleWaveManifest()); + assert.ok(r.script.includes('resumeFromRunId'), 'references resumeFromRunId'); + assert.ok(r.script.includes('run-abc-1143'), 'carries the run id'); + assert.strictEqual(r.summary.resumeRunId, 'run-abc-1143'); + }); + + test('shared budget pool emitted when budgetTokens provided', () => { + const r = emitWorkflowScript({ ...singleWaveManifest(), budgetTokens: 500000 }); + assert.ok(r.script.includes('budget('), 'emits budget() pool'); + assert.ok(r.script.includes('500000')); + }); + + test('no budget() emitted when budgetTokens omitted', () => { + const r = emitWorkflowScript(singleWaveManifest()); + assert.ok(!r.script.includes('budget('), 'no budget() when unset'); + }); + + test('invalid input -> ok:false with a reason, never throws', () => { + const empty = emitWorkflowScript({ phaseDir: '.p', runId: 'r', waves: [] }); + assert.strictEqual(empty.ok, false); + assert.ok(typeof empty.reason === 'string' && empty.reason.length > 0); + + const noRun = emitWorkflowScript({ phaseDir: '.p', runId: '', waves: singleWaveManifest().waves }); + assert.strictEqual(noRun.ok, false); + + const noPhase = emitWorkflowScript({ phaseDir: '', runId: 'r', waves: singleWaveManifest().waves }); + assert.strictEqual(noPhase.ok, false); + + const badWave = emitWorkflowScript({ phaseDir: '.p', runId: 'r', waves: [{ id: 'w1', plans: [] }] }); + assert.strictEqual(badWave.ok, false); + }); + + test('SECURITY: runId/phaseDir/wave.id/plan.id with injection chars -> ok:false (never reach the script)', () => { + // runId is interpolated inside resumeFromRunId("...") — a quote/backslash/newline + // could break out of the call. Identifier validation must reject it. + const injectRun = emitWorkflowScript({ phaseDir: '.p', runId: 'x");evil("y', waves: singleWaveManifest().waves }); + assert.strictEqual(injectRun.ok, false); + assert.match(injectRun.reason, /runId/i); + + const newlineRun = emitWorkflowScript({ phaseDir: '.p', runId: 'r\nbreakout', waves: singleWaveManifest().waves }); + assert.strictEqual(newlineRun.ok, false); + + const injectPhase = emitWorkflowScript({ phaseDir: '.p"; drop table', runId: 'r', waves: singleWaveManifest().waves }); + assert.strictEqual(injectPhase.ok, false); + + const injectWave = emitWorkflowScript({ + phaseDir: '.p', runId: 'r', + waves: [{ id: 'w1\nagent("evil")', plans: [{ id: 'p1', brief: 'b', files_modified: ['a.cts'] }] }], + }); + assert.strictEqual(injectWave.ok, false); + + const injectPlan = emitWorkflowScript({ + phaseDir: '.p', runId: 'r', + waves: [{ id: 'w1', plans: [{ id: 'p1";x("y', brief: 'b', files_modified: ['a.cts'] }] }], + }); + assert.strictEqual(injectPlan.ok, false); + }); + + test('SECURITY: a brief containing quotes/backslash/newlines is neutralised (never breaks the string literal)', () => { + const r = emitWorkflowScript({ + phaseDir: '.p', runId: 'r', + waves: [{ id: 'w1', plans: [{ id: 'p1', brief: 'he said "hi" \\ then \n newline', files_modified: ['a.cts'] }] }], + }); + assert.strictEqual(r.ok, true); + // The emitted script must not contain a raw unescaped quote that closes the + // agent() string literal, nor a raw newline inside the brief. + assert.ok(!r.script.includes('he said "hi" \\\\'), 'no unescaped breakout'); + // The full brief text never appears verbatim with its dangerous chars intact. + assert.ok(!r.script.includes('"hi"'), 'the inner quote must be JSON-escaped, not raw'); + }); + + test('duplicate plan id within a wave -> ok:false (L-5: no silent brief loss)', () => { + const r = emitWorkflowScript({ + phaseDir: '.p', runId: 'r', + waves: [{ id: 'w1', plans: [ + { id: 'p1', brief: 'first', files_modified: ['a.cts'] }, + { id: 'p1', brief: 'second', files_modified: ['b.cts'] }, + ] }], + }); + assert.strictEqual(r.ok, false); + assert.match(r.reason, /duplicate/i); + }); + + test('non-string files_modified entries -> ok:false (L-7: strict element typing)', () => { + const r = emitWorkflowScript({ + phaseDir: '.p', runId: 'r', + waves: [{ id: 'w1', plans: [{ id: 'p1', brief: 'b', files_modified: ['ok.cts', 42, { path: 'x' }] }] }], + }); + assert.strictEqual(r.ok, false); + assert.match(r.reason, /files_modified/); + }); + + test('property: deterministic (same input -> identical script)', () => { + fc.assert(fc.property( + fc.record({ + runId: fc.string({ minLength: 1, maxLength: 12 }).filter((s) => /^[a-zA-Z0-9-]+$/.test(s)), + nPlans: fc.integer({ min: 1, max: 5 }), + }), + ({ runId, nPlans }) => { + const waves = [{ + id: 'w1', + plans: Array.from({ length: nPlans }, (_, i) => ({ + id: 'p' + i, + brief: 'brief ' + i, + files_modified: ['src/file' + i + '.cts'], + })), + }]; + const a = emitWorkflowScript({ phaseDir: '.planning/phases/01-x', runId, waves }); + const b = emitWorkflowScript({ phaseDir: '.planning/phases/01-x', runId, waves }); + assert.strictEqual(a.script, b.script); + assert.deepStrictEqual(a.summary, b.summary); + }, + )); + }); +}); + +// ─── 4. Capability declaration validation ───────────────────────────────────── + +describe('capability declaration (capabilities/claude-orchestration/capability.json)', () => { + + test('file exists and parses', () => { + const cap = loadCap(); + assert.strictEqual(cap.id, 'claude-orchestration'); + }); + + test('passes per-file validateCapability', () => { + const errors = validateCapability(loadCap(), 'claude-orchestration'); + assert.deepEqual(errors, [], 'Expected no validation errors: ' + JSON.stringify(errors)); + }); + + test('passes contract validation (contribution.into roles, when references)', () => { + const errors = validateAgainstContract(loadCap(), 'claude-orchestration'); + assert.deepEqual(errors, [], 'Expected no contract errors: ' + JSON.stringify(errors)); + }); + + test('default-off: activationKey default is false and points at the enabled key', () => { + const cap = loadCap(); + assert.strictEqual(cap.activationKey, 'claude_orchestration.enabled'); + assert.strictEqual(cap.config['claude_orchestration.enabled'].default, false); + assert.strictEqual(cap.config['claude_orchestration.enabled'].type, 'boolean'); + }); + + test('runtimeCompat is claude-only (criterion 6)', () => { + const cap = loadCap(); + assert.deepStrictEqual(cap.runtimeCompat.supported, ['claude']); + assert.deepStrictEqual(cap.runtimeCompat.unsupported, []); + }); + + test('BETA posture: tier full, role feature', () => { + const cap = loadCap(); + assert.strictEqual(cap.role, 'feature'); + assert.strictEqual(cap.tier, 'full'); + }); + + test('execution_backend is an enum with auto|workflow|inline defaulting to auto', () => { + const slice = loadCap().config['claude_orchestration.execution_backend']; + assert.strictEqual(slice.type, 'enum'); + assert.deepStrictEqual(slice.values, ['auto', 'workflow', 'inline']); + assert.strictEqual(slice.default, 'auto'); + }); + + test('registers at WIRED points only (execute:wave:post, plan:post)', () => { + const cap = loadCap(); + const points = cap.contributions.map((c) => c.point); + for (const p of points) { + assert.ok( + ['discuss:pre', 'discuss:post', 'plan:pre', 'plan:post', 'execute:post', 'execute:wave:post', 'verify:post', 'ship:pre', 'ship:post'].includes(p), + 'contribution point ' + p + ' must be a wired point', + ); + } + assert.ok(points.includes('execute:wave:post'), 'registers the execute wave hook'); + assert.ok(points.includes('plan:post'), 'declares plan:* ownership for ultraplan (criterion 5)'); + }); + + test('all contributions gated by the enabled key + onError:skip (default-resilient)', () => { + const cap = loadCap(); + for (const c of cap.contributions) { + assert.strictEqual(c.when, 'claude_orchestration.enabled', 'every contribution gated by enabled'); + assert.strictEqual(c.onError, 'skip', 'every contribution onError:skip'); + } + }); +}); + +// ─── 5. Registry integration ────────────────────────────────────────────────── + +describe('registry integration', () => { + + test('loadAndValidate includes claude-orchestration with no errors', () => { + const { capMap, errors } = loadAndValidate(new Set()); // empty central keys = no collision noise + // Filter errors to only those touching our capability. + const ours = errors.filter((e) => e.includes('claude-orchestration')); + assert.deepEqual(ours, [], 'our capability produced errors: ' + JSON.stringify(ours)); + assert.ok(capMap.has('claude-orchestration'), 'capMap includes claude-orchestration'); + }); + + test('buildRegistry surfaces the federated config keys in configSchema', () => { + const { capMap } = loadAndValidate(new Set()); + const registry = buildRegistry(capMap); + assert.ok(registry.configSchema['claude_orchestration.enabled'], 'enabled key federated'); + assert.ok(registry.configSchema['claude_orchestration.execution_backend'], 'execution_backend key federated'); + assert.strictEqual(registry.configSchema['claude_orchestration.enabled'].owner, 'claude-orchestration'); + assert.strictEqual(registry.configSchema['claude_orchestration.execution_backend'].default, 'auto'); + }); + + test('byLoopPoint[execute:wave:post].contributions includes our capability', () => { + const { capMap } = loadAndValidate(new Set()); + const registry = buildRegistry(capMap); + const contribs = registry.byLoopPoint['execute:wave:post'].contributions; + const ours = contribs.find((c) => c.capId === 'claude-orchestration'); + assert.ok(ours, 'our execute:wave:post contribution is registered'); + assert.strictEqual(ours.into, 'executor'); + }); + + test('committed registry is in sync (gen-capability-registry --check)', () => { + const { capMap } = loadAndValidate(new Set()); + const registry = buildRegistry(capMap); + const live = serializeRegistry(registry, capMap); + const committed = fs.readFileSync(REGISTRY_PATH, 'utf8'); + assert.strictEqual( + normalizeLineEndings(stripGeneratedComment(committed)), + normalizeLineEndings(stripGeneratedComment(live)), + 'registry is stale — run: node scripts/gen-capability-registry.cjs --write', + ); + }); +}); + +// ─── 6. Inline-fallback parity (criterion 3 + 6) ────────────────────────────── + +describe('inline-fallback parity', () => { + + test('default config (capability off) -> inline on every runtime, including Claude', () => { + // The capability ships default-off; with no user opt-in the backend is always inline. + const defaultCfg = {}; // nothing set + for (const runtimeId of ['claude', 'codex', 'cursor', 'opencode']) { + const r = detectWorkflowBackend({ + runtimeId, + hostIntegration: CAPABLE_HOST, + agentSdkVersion: '1.0.0', + config: defaultCfg, + }); + assert.strictEqual(r.backend, 'inline', runtimeId + ' default must be inline'); + assert.strictEqual(r.available, false, runtimeId + ' default must be unavailable'); + } + }); + + test('generated Workflow script preserves the inline-path contract (same agent + isolation + artifact)', () => { + // Criterion 2: the emitted Workflow composes the SAME gsd-executor agent and worktree + // isolation the inline path uses, and produces the same SUMMARY.md artifact. + const r = emitWorkflowScript(singleWaveManifest()); + assert.ok(r.script.includes('gsd-executor'), 'same executor agent as inline dispatch'); + assert.ok(r.script.includes('worktree'), 'same worktree isolation as inline dispatch'); + assert.ok(r.script.includes('SUMMARY.md'), 'same SUMMARY.md artifact as inline dispatch'); + }); +}); diff --git a/tests/execute-wave-post-gate-pipeline-e2e.test.cjs b/tests/execute-wave-post-gate-pipeline-e2e.test.cjs index 99fdbeec9..c01f1903d 100644 --- a/tests/execute-wave-post-gate-pipeline-e2e.test.cjs +++ b/tests/execute-wave-post-gate-pipeline-e2e.test.cjs @@ -629,15 +629,17 @@ describe('F. Real registry execute:wave:post shape — guard against accidental `ui.safety-gate onError must be 'halt'; got ${uiGate.onError}`); }); - test('[happy] real registry: execute:wave:post has no steps and 2 contributions (mempalace capture-problems + external-job executor fragment)', () => { + test('[happy] real registry: execute:wave:post has no steps and 3 contributions (claude-orchestration executor + external-job executor + mempalace capture-problems)', () => { const point = realRegistry.byLoopPoint['execute:wave:post']; assert.strictEqual(point.steps.length, 0, `execute:wave:post steps must be empty; got ${point.steps.length}`); - assert.strictEqual(point.contributions.length, 2, - `execute:wave:post must have 2 contributions (mempalace + external-job); got ${point.contributions.length}`); + // #1143: claude-orchestration registers an execute:wave:post contribution + // providing the Workflow-tool backend guidance (default-off, claude-only). + assert.strictEqual(point.contributions.length, 3, + `execute:wave:post must have 3 contributions (claude-orchestration + external-job + mempalace); got ${point.contributions.length}`); const capIds = point.contributions.map(c => c.capId).sort(); - assert.deepStrictEqual(capIds, ['external-job', 'mempalace'], - `execute:wave:post contributions must be mempalace + external-job; got ${capIds.join(',')}`); + assert.deepStrictEqual(capIds, ['claude-orchestration', 'external-job', 'mempalace'], + `execute:wave:post contributions must be claude-orchestration + external-job + mempalace; got ${capIds.join(',')}`); }); }); From f433db8b88801a6e308ff0fe4c46b7da7d89b0e3 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 15:41:19 -0400 Subject: [PATCH 50/75] =?UTF-8?q?fix(#1143):=20address=20adversarial=20rev?= =?UTF-8?q?iew=20=E2=80=94=20full=20semver=20precedence,=20docs/reality=20?= =?UTF-8?q?alignment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - compareSemver: implement full SemVer 2.0.0 §11 pre-release identifier comparison (two pre-releases of the same triple now order correctly; was 0). - capability description + fragment: scope the plan-checker/verifier claim (this capability delivers the parallel-execution backend; those gates remain inline until separately wired). Correct the 'each wave is one barrier' prose (a wave splits into multiple sequential parallel() barriers on files_modified overlap). Frame detect-backend CLI as a simulation harness; the pure function with the live host descriptor is the real detection seam. - partitionStages docstring: 'near-minimal via greedy first-fit' (not 'fewest'); document empty-files_modified behavior. --- .../claude-orchestration/capability.json | 2 +- .../fragments/execute-wave-post.md | 13 +++-- gsd-core/bin/lib/capability-registry.cjs | 6 +- gsd-core/bin/lib/claude-orchestration.cjs | 57 +++++++++++++++++-- src/claude-orchestration.cts | 48 ++++++++++++++-- tests/claude-orchestration.test.cjs | 8 +++ 6 files changed, 114 insertions(+), 20 deletions(-) diff --git a/capabilities/claude-orchestration/capability.json b/capabilities/claude-orchestration/capability.json index 921704c67..95474d492 100644 --- a/capabilities/claude-orchestration/capability.json +++ b/capabilities/claude-orchestration/capability.json @@ -3,7 +3,7 @@ "role": "feature", "version": "1.7.0-rc.3", "title": "Claude orchestration (Workflow backend)", - "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the parallelism + plan-checker + verifier that the #853 backgrounded-agent nesting limitation forces inline on Claude Code. Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", + "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", "tier": "full", "requires": [], "engines": { diff --git a/capabilities/claude-orchestration/fragments/execute-wave-post.md b/capabilities/claude-orchestration/fragments/execute-wave-post.md index 8e9bdb8a7..db0e76d5a 100644 --- a/capabilities/claude-orchestration/fragments/execute-wave-post.md +++ b/capabilities/claude-orchestration/fragments/execute-wave-post.md @@ -29,8 +29,10 @@ cannot nest further subagents — #853 — and so degrades to sequential inline execution), execute-phase **emits a generated Workflow script** and lets the main loop orchestrate it: -- **waves → `parallel()` barriers** — each wave is one barrier; the next wave - waits for the previous to complete. +- **waves → one or more sequential `parallel()` barriers** — each wave is a + barrier group; when plans within a wave share `files_modified`, they are split + into separate sequential stages within that wave's barrier (the next wave + still waits for the previous wave to complete). - **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`** — the SAME executor agent and worktree isolation the inline path uses, so the produced `SUMMARY.md` and commits are identical. @@ -48,8 +50,11 @@ The emitter is a pure function exposed through the capability command surface: [--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript` directly). It maps the phase's wave/plan manifest to the Workflow script string and never invokes the Workflow tool itself; the orchestrator runs the emitted -script. Use `gsd-tools claude-orchestration detect-backend` to resolve whether -the Workflow backend should activate for the current runtime. +script. Detection is resolved by the orchestrator calling the pure +`detectWorkflowBackend` with the LIVE host descriptor (the CLI +`gsd-tools claude-orchestration detect-backend` is a simulation harness that +assumes a capable host unless `--no-nested-dispatch` is passed — it does not probe +the real runtime; the orchestrator supplies the real descriptor). ## Fallback contract diff --git a/gsd-core/bin/lib/capability-registry.cjs b/gsd-core/bin/lib/capability-registry.cjs index 796ac88da..33e4b1ce1 100644 --- a/gsd-core/bin/lib/capability-registry.cjs +++ b/gsd-core/bin/lib/capability-registry.cjs @@ -429,7 +429,7 @@ const capabilities = { "role": "feature", "version": "1.7.0-rc.3", "title": "Claude orchestration (Workflow backend)", - "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the parallelism + plan-checker + verifier that the #853 backgrounded-agent nesting limitation forces inline on Claude Code. Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", + "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", "tier": "full", "requires": [], "engines": { @@ -485,7 +485,7 @@ const capabilities = { "into": "executor", "fragment": { "path": "fragments/execute-wave-post.md", - "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:post` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## What the executor does when the Workflow backend is active\n\nInstead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor,\nisolation=worktree, run_in_background=true)` per message (which on Claude Code\ncannot nest further subagents — #853 — and so degrades to sequential inline\nexecution), execute-phase **emits a generated Workflow script** and lets the main\nloop orchestrate it:\n\n- **waves → `parallel()` barriers** — each wave is one barrier; the next wave\n waits for the previous to complete.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n — the SAME executor agent and worktree isolation the inline path uses, so the\n produced `SUMMARY.md` and commits are identical.\n- **`files_modified` overlap → separate sequential stages** — two plans that\n touch the same file are placed in different stages within the wave (the same\n overlap rule execute-phase already applies inline).\n- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n- **`budget(tokens)`** — a shared token pool across the whole phase when the\n orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a\n function parameter, not a config key; the orchestrator decides the budget).\n\nThe emitter is a pure function exposed through the capability command surface:\n`gsd-tools claude-orchestration emit-workflow --waves --run-id \n[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript`\ndirectly). It maps the phase's wave/plan manifest to the Workflow script string\nand never invokes the Workflow tool itself; the orchestrator runs the emitted\nscript. Use `gsd-tools claude-orchestration detect-backend` to resolve whether\nthe Workflow backend should activate for the current runtime.\n\n## Fallback contract\n\nIf detection resolves to `inline` (tool absent, SDK too old, runtime not Claude,\nor the capability disabled), execute-phase MUST proceed with the standard inline\nwave dispatch. The executor MUST NOT assume parallelism, a shared budget, or\nresume-from-run-id semantics in that mode.\n" + "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:post` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## What the executor does when the Workflow backend is active\n\nInstead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor,\nisolation=worktree, run_in_background=true)` per message (which on Claude Code\ncannot nest further subagents — #853 — and so degrades to sequential inline\nexecution), execute-phase **emits a generated Workflow script** and lets the main\nloop orchestrate it:\n\n- **waves → one or more sequential `parallel()` barriers** — each wave is a\n barrier group; when plans within a wave share `files_modified`, they are split\n into separate sequential stages within that wave's barrier (the next wave\n still waits for the previous wave to complete).\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n — the SAME executor agent and worktree isolation the inline path uses, so the\n produced `SUMMARY.md` and commits are identical.\n- **`files_modified` overlap → separate sequential stages** — two plans that\n touch the same file are placed in different stages within the wave (the same\n overlap rule execute-phase already applies inline).\n- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n- **`budget(tokens)`** — a shared token pool across the whole phase when the\n orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a\n function parameter, not a config key; the orchestrator decides the budget).\n\nThe emitter is a pure function exposed through the capability command surface:\n`gsd-tools claude-orchestration emit-workflow --waves --run-id \n[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript`\ndirectly). It maps the phase's wave/plan manifest to the Workflow script string\nand never invokes the Workflow tool itself; the orchestrator runs the emitted\nscript. Detection is resolved by the orchestrator calling the pure\n`detectWorkflowBackend` with the LIVE host descriptor (the CLI\n`gsd-tools claude-orchestration detect-backend` is a simulation harness that\nassumes a capable host unless `--no-nested-dispatch` is passed — it does not probe\nthe real runtime; the orchestrator supplies the real descriptor).\n\n## Fallback contract\n\nIf detection resolves to `inline` (tool absent, SDK too old, runtime not Claude,\nor the capability disabled), execute-phase MUST proceed with the standard inline\nwave dispatch. The executor MUST NOT assume parallelism, a shared budget, or\nresume-from-run-id semantics in that mode.\n" }, "produces": [], "consumes": [ @@ -2993,7 +2993,7 @@ const byLoopPoint = { "into": "executor", "fragment": { "path": "fragments/execute-wave-post.md", - "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:post` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## What the executor does when the Workflow backend is active\n\nInstead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor,\nisolation=worktree, run_in_background=true)` per message (which on Claude Code\ncannot nest further subagents — #853 — and so degrades to sequential inline\nexecution), execute-phase **emits a generated Workflow script** and lets the main\nloop orchestrate it:\n\n- **waves → `parallel()` barriers** — each wave is one barrier; the next wave\n waits for the previous to complete.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n — the SAME executor agent and worktree isolation the inline path uses, so the\n produced `SUMMARY.md` and commits are identical.\n- **`files_modified` overlap → separate sequential stages** — two plans that\n touch the same file are placed in different stages within the wave (the same\n overlap rule execute-phase already applies inline).\n- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n- **`budget(tokens)`** — a shared token pool across the whole phase when the\n orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a\n function parameter, not a config key; the orchestrator decides the budget).\n\nThe emitter is a pure function exposed through the capability command surface:\n`gsd-tools claude-orchestration emit-workflow --waves --run-id \n[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript`\ndirectly). It maps the phase's wave/plan manifest to the Workflow script string\nand never invokes the Workflow tool itself; the orchestrator runs the emitted\nscript. Use `gsd-tools claude-orchestration detect-backend` to resolve whether\nthe Workflow backend should activate for the current runtime.\n\n## Fallback contract\n\nIf detection resolves to `inline` (tool absent, SDK too old, runtime not Claude,\nor the capability disabled), execute-phase MUST proceed with the standard inline\nwave dispatch. The executor MUST NOT assume parallelism, a shared budget, or\nresume-from-run-id semantics in that mode.\n" + "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:post` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## What the executor does when the Workflow backend is active\n\nInstead of the orchestrator fanning out one `Agent(subagent_type=gsd-executor,\nisolation=worktree, run_in_background=true)` per message (which on Claude Code\ncannot nest further subagents — #853 — and so degrades to sequential inline\nexecution), execute-phase **emits a generated Workflow script** and lets the main\nloop orchestrate it:\n\n- **waves → one or more sequential `parallel()` barriers** — each wave is a\n barrier group; when plans within a wave share `files_modified`, they are split\n into separate sequential stages within that wave's barrier (the next wave\n still waits for the previous wave to complete).\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n — the SAME executor agent and worktree isolation the inline path uses, so the\n produced `SUMMARY.md` and commits are identical.\n- **`files_modified` overlap → separate sequential stages** — two plans that\n touch the same file are placed in different stages within the wave (the same\n overlap rule execute-phase already applies inline).\n- **`resumeFromRunId`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n- **`budget(tokens)`** — a shared token pool across the whole phase when the\n orchestrator passes a `budgetTokens` value to `emitWorkflowScript` (it is a\n function parameter, not a config key; the orchestrator decides the budget).\n\nThe emitter is a pure function exposed through the capability command surface:\n`gsd-tools claude-orchestration emit-workflow --waves --run-id \n[--phase-dir ] [--budget ]` (or `require('gsd-core/bin/lib/claude-orchestration.cjs').emitWorkflowScript`\ndirectly). It maps the phase's wave/plan manifest to the Workflow script string\nand never invokes the Workflow tool itself; the orchestrator runs the emitted\nscript. Detection is resolved by the orchestrator calling the pure\n`detectWorkflowBackend` with the LIVE host descriptor (the CLI\n`gsd-tools claude-orchestration detect-backend` is a simulation harness that\nassumes a capable host unless `--no-nested-dispatch` is passed — it does not probe\nthe real runtime; the orchestrator supplies the real descriptor).\n\n## Fallback contract\n\nIf detection resolves to `inline` (tool absent, SDK too old, runtime not Claude,\nor the capability disabled), execute-phase MUST proceed with the standard inline\nwave dispatch. The executor MUST NOT assume parallelism, a shared budget, or\nresume-from-run-id semantics in that mode.\n" }, "produces": [], "consumes": [ diff --git a/gsd-core/bin/lib/claude-orchestration.cjs b/gsd-core/bin/lib/claude-orchestration.cjs index 802329a29..956fdc2ed 100644 --- a/gsd-core/bin/lib/claude-orchestration.cjs +++ b/gsd-core/bin/lib/claude-orchestration.cjs @@ -75,6 +75,7 @@ function compareSemver(a, b) { return [parseInt(core[0], 10), parseInt(core[1], 10), parseInt(core[2], 10)]; }; const hasPre = (s) => s.indexOf('-') !== -1; + const preIdentifiers = (s) => (s.split('-')[1] || '').split('+')[0].split('.').filter((x) => x.length > 0); const am = parseTriple(a); const bm = parseTriple(b); for (let i = 0; i < 3; i++) { @@ -83,15 +84,53 @@ function compareSemver(a, b) { if (am[i] > bm[i]) return 1; } - // Numeric triple is equal. SemVer 2.0.0 precedence: a version WITH a pre-release - // tag is LOWER than the same triple WITHOUT one. This keeps the floor fail-closed - // for pre-release builds of the floor (e.g. 0.3.149-rc.1 < 0.3.149 → inline). + // Numeric triple is equal. SemVer 2.0.0 §11 precedence: + // - a version WITH a pre-release tag is LOWER than the same triple WITHOUT one + // (keeps the floor fail-closed for pre-release builds of the GA floor); + // - two pre-releases of the same triple are ordered by their dot-separated + // identifiers (numeric < alphanumeric; numeric compared numerically, + // alphanumeric lexically; fewer identifiers < more). const aPre = hasPre(a); const bPre = hasPre(b); if (aPre && !bPre) return -1; if (!aPre && bPre) return 1; + if (aPre && bPre) { + const ai = preIdentifiers(a); + const bi = preIdentifiers(b); + const len = Math.min(ai.length, bi.length); + for (let i = 0; i < len; i++) { + const ax = ai[i]; + const bx = bi[i]; + const aNum = /^\d+$/.test(ax); + const bNum = /^\d+$/.test(bx); + if (aNum && bNum) { + const an = parseInt(ax, 10); + const bn = parseInt(bx, 10); + if (an < bn) + return -1; + if (an > bn) + return 1; + } + else if (aNum && !bNum) { + return -1; // numeric identifiers always lower than alphanumeric + } + else if (!aNum && bNum) { + return 1; + } + else { + if (ax < bx) + return -1; + if (ax > bx) + return 1; + } + } + if (ai.length < bi.length) + return -1; + if (ai.length > bi.length) + return 1; + } return 0; } /** Inline result shorthand. */ @@ -170,9 +209,15 @@ function detectWorkflowBackend(input) { return { available: true, backend: 'workflow', reason: 'workflow_backend_active' }; } /** - * Partition a wave's plans into the fewest sequential stages such that no two - * plans in the same stage share a modified file. Greedy first-fit: each plan - * goes into the earliest stage where it does not overlap any plan already there. + * Partition a wave's plans into a near-minimal number of sequential stages (via + * greedy first-fit — not guaranteed optimal for arbitrary overlap graphs, but + * correct: no two plans sharing a file ever cohabit a stage) such that no two + * plans in the same stage share a modified file. Each plan goes into the earliest + * stage where it does not overlap any plan already there. + * + * A plan with an EMPTY files_modified set declares no files; it overlaps nothing + * and coalesces into stage 0 (same behavior as the inline path, which also cannot + * guard against undeclared concurrent writes — declare filesModified accurately). * * This is the same overlap rule execute-phase applies inline — the only difference * is the execution vehicle (Workflow `parallel()` vs one-agent-per-message). diff --git a/src/claude-orchestration.cts b/src/claude-orchestration.cts index 897636a8d..8e877edbf 100644 --- a/src/claude-orchestration.cts +++ b/src/claude-orchestration.cts @@ -81,19 +81,49 @@ function compareSemver(a: string, b: string): number { return [parseInt(core[0], 10), parseInt(core[1], 10), parseInt(core[2], 10)]; }; const hasPre = (s: string): boolean => s.indexOf('-') !== -1; + const preIdentifiers = (s: string): string[] => (s.split('-')[1] || '').split('+')[0].split('.').filter((x) => x.length > 0); const am = parseTriple(a); const bm = parseTriple(b); for (let i = 0; i < 3; i++) { if (am[i] < bm[i]) return -1; if (am[i] > bm[i]) return 1; } - // Numeric triple is equal. SemVer 2.0.0 precedence: a version WITH a pre-release - // tag is LOWER than the same triple WITHOUT one. This keeps the floor fail-closed - // for pre-release builds of the floor (e.g. 0.3.149-rc.1 < 0.3.149 → inline). + // Numeric triple is equal. SemVer 2.0.0 §11 precedence: + // - a version WITH a pre-release tag is LOWER than the same triple WITHOUT one + // (keeps the floor fail-closed for pre-release builds of the GA floor); + // - two pre-releases of the same triple are ordered by their dot-separated + // identifiers (numeric < alphanumeric; numeric compared numerically, + // alphanumeric lexically; fewer identifiers < more). const aPre = hasPre(a); const bPre = hasPre(b); if (aPre && !bPre) return -1; if (!aPre && bPre) return 1; + if (aPre && bPre) { + const ai = preIdentifiers(a); + const bi = preIdentifiers(b); + const len = Math.min(ai.length, bi.length); + for (let i = 0; i < len; i++) { + const ax = ai[i]; + const bx = bi[i]; + const aNum = /^\d+$/.test(ax); + const bNum = /^\d+$/.test(bx); + if (aNum && bNum) { + const an = parseInt(ax, 10); + const bn = parseInt(bx, 10); + if (an < bn) return -1; + if (an > bn) return 1; + } else if (aNum && !bNum) { + return -1; // numeric identifiers always lower than alphanumeric + } else if (!aNum && bNum) { + return 1; + } else { + if (ax < bx) return -1; + if (ax > bx) return 1; + } + } + if (ai.length < bi.length) return -1; + if (ai.length > bi.length) return 1; + } return 0; } @@ -253,9 +283,15 @@ interface EmitErr { } /** - * Partition a wave's plans into the fewest sequential stages such that no two - * plans in the same stage share a modified file. Greedy first-fit: each plan - * goes into the earliest stage where it does not overlap any plan already there. + * Partition a wave's plans into a near-minimal number of sequential stages (via + * greedy first-fit — not guaranteed optimal for arbitrary overlap graphs, but + * correct: no two plans sharing a file ever cohabit a stage) such that no two + * plans in the same stage share a modified file. Each plan goes into the earliest + * stage where it does not overlap any plan already there. + * + * A plan with an EMPTY files_modified set declares no files; it overlaps nothing + * and coalesces into stage 0 (same behavior as the inline path, which also cannot + * guard against undeclared concurrent writes — declare filesModified accurately). * * This is the same overlap rule execute-phase applies inline — the only difference * is the execution vehicle (Workflow `parallel()` vs one-agent-per-message). diff --git a/tests/claude-orchestration.test.cjs b/tests/claude-orchestration.test.cjs index 03a3e6c66..808501e1e 100644 --- a/tests/claude-orchestration.test.cjs +++ b/tests/claude-orchestration.test.cjs @@ -243,6 +243,14 @@ describe('detectWorkflowBackend', () => { assert.strictEqual(r.available, false); }); + test('two pre-releases of the same triple order by their identifiers (SemVer §11)', () => { + assert.ok(compareSemver('0.3.149-rc.0', '0.3.149-rc.1') < 0, 'rc.0 < rc.1'); + assert.ok(compareSemver('1.0.0-alpha.1', '1.0.0-alpha.2') < 0, 'alpha.1 < alpha.2'); + assert.ok(compareSemver('1.0.0-rc.1', '1.0.0-rc.2') < 0, 'rc.1 < rc.2'); + // numeric < alphanumeric at the same position + assert.ok(compareSemver('1.0.0-1', '1.0.0-alpha') < 0, 'numeric identifier < alphanumeric'); + }); + test('missing/empty input -> inline, never throws (Postel: liberal-in-input)', () => { assert.strictEqual(detectWorkflowBackend({}).backend, 'inline'); assert.strictEqual(detectWorkflowBackend(null).backend, 'inline'); From 256d2aa95cf50592e5376115f13fa68277f821d0 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 16:03:26 -0400 Subject: [PATCH 51/75] fix(#1143): backfill changeset pr number (2044) --- .changeset/1143-claude-orchestration-capability.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/1143-claude-orchestration-capability.md b/.changeset/1143-claude-orchestration-capability.md index 934bc28bc..d87aae625 100644 --- a/.changeset/1143-claude-orchestration-capability.md +++ b/.changeset/1143-claude-orchestration-capability.md @@ -1,5 +1,5 @@ --- type: Added -pr: 0 +pr: 2044 --- **A default-off, BETA, claude-only "Claude orchestration" capability** — adopts Claude Code's Workflow tool (`/effort ultracode`, Agent SDK ≥ v0.3.149) as an optional parallel-execution backend for the GSD loop, restoring the wave parallelism + plan-checker + verifier that the #853 backgrounded-agent nesting limitation forces inline on Claude Code, and folding the existing `gsd-ultraplan-phase` plan-offload under the same runtime gate. When `claude_orchestration.enabled` is on AND the runtime is Claude AND the Workflow tool is detected AND the Agent SDK meets the floor (`claude_orchestration.min_agent_sdk_version`, default `0.3.149`), `execute-phase` emits a generated Workflow script (`waves → parallel() barriers`, `plans → agent({ agentType: 'gsd-executor', isolation: 'worktree' })`, `files_modified overlap → separate sequential stages`, `resumeFromRunId` wired to the phase run id, shared `budget` pool) that composes the SAME executor agent + worktree isolation the inline path uses, so artifacts/commits are produced identically. Detection is pure and fail-closed (any miss → inline), so on any runtime lacking the Workflow tool behaviour is byte-identical to today. Adds a pure module `gsd-core/bin/lib/claude-orchestration.cjs` (`detectWorkflowBackend`, `emitWorkflowScript`), the `capabilities/claude-orchestration/` declaration with two gated loop contributions (`execute:wave:post`, `plan:post`) and a `claude-orchestration` command family (`gsd-tools claude-orchestration detect-backend|emit-workflow`), federated config keys, and an ADR-1143 implementation amendment. (#1143) From 3f7c9aa82814e36a62d4fa6cc4804dd6c5f4f73e Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 16:33:24 -0400 Subject: [PATCH 52/75] docs(#1143): add how-to for enabling and using the Claude orchestration backend --- ...e-claude-orchestration-workflow-backend.md | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 docs/how-to/enable-claude-orchestration-workflow-backend.md diff --git a/docs/how-to/enable-claude-orchestration-workflow-backend.md b/docs/how-to/enable-claude-orchestration-workflow-backend.md new file mode 100644 index 000000000..a8fea05e1 --- /dev/null +++ b/docs/how-to/enable-claude-orchestration-workflow-backend.md @@ -0,0 +1,171 @@ +# How to enable and use the Claude orchestration backend (BETA) + +Run GSD's execute-phase waves through Claude Code's Workflow tool (`/effort ultracode`, Agent SDK ≥ v0.3.149) instead of the default one-agent-per-message dispatch, and fold the `gsd-ultraplan-phase` plan-offload under the same gate. On Claude Code this restores the wave parallelism that backgrounded-agent nesting (#853) otherwise forces inline. + +> **BETA.** This capability tracks a Claude Code preview surface. It is default-off, fail-closed, and Claude-only. Every detection miss degrades silently to today's inline behaviour — enabling it can never break the loop. See the [explanation doc](../explanation/claude-orchestration-capability.md) for the why, and [ADR-1143](../adr/1143-claude-orchestration-capability.md) for the design. + +**What you need:** +- GSD installed with the `full` profile (the capability is `tier: full`). +- **Claude Code** with the Workflow tool available (Agent SDK ≥ `0.3.149`). On any other runtime the capability is an explicit no-op — you can flip the switch safely, nothing happens. +- A GSD project with at least one planned phase (you need a wave/plan manifest to emit a script for). + +--- + +## Step 1 — Enable the capability + +The capability ships disabled. Turn on the master switch inside your GSD project: + +```bash +gsd-tools query config-set claude_orchestration.enabled true +``` + +That single key gates everything — both the Workflow-backend hook at `execute:wave:post` and the ultraplan ownership declaration at `plan:post`. All other `claude_orchestration.*` keys are optional refinements. + +Verify it took: + +```bash +gsd-tools query config-get claude_orchestration.enabled +# → true +``` + +--- + +## Step 2 — Check whether your runtime qualifies + +Detection is fail-closed: the Workflow backend activates only when **every** gate opens. Before relying on it, confirm your runtime reports as capable: + +```bash +gsd-tools claude-orchestration detect-backend \ + --runtime claude \ + --agent-sdk-version 1.2.0 +``` + +You will get one of two results: + +| `backend` | `available` | Meaning | +|-----------|-------------|---------| +| `workflow` | `true` | Every gate passed — the emitter will produce a Workflow script the orchestrator can run. | +| `inline` | `false` | A gate failed. The `reason` field tells you which: `capability_disabled`, `runtime_not_claude`, `backend_inline`, `workflow_tool_unavailable`, `agent_sdk_version_unknown`, or `agent_sdk_version_below_floor`. | + +> **The CLI is a simulation harness, not a probe.** `detect-backend` assumes a capable host descriptor unless you pass `--no-nested-dispatch`. It exists so you (and the orchestrator) can ask "given these facts, would the backend activate?" The real detection the loop uses is the pure `detectWorkflowBackend` function, called with the live host descriptor. + +### If detection returns `inline` + +Work through the `reason`: + +- **`runtime_not_claude`** — you are on Codex / Cursor / opencode / etc. The Workflow tool is Claude-specific; there is nothing to enable here. Your loop is unchanged. +- **`agent_sdk_version_below_floor`** — upgrade Claude Code / the Agent SDK to at least `claude_orchestration.min_agent_sdk_version` (default `0.3.149`). A pre-release of the floor (e.g. `0.3.149-rc.1`) compares *below* the GA release and will not activate. +- **`workflow_tool_unavailable`** — your host descriptor does not advertise nested + background dispatch. This is unusual on Claude Code; if you see it, the Workflow tool is not present in this session. +- **`agent_sdk_version_unknown`** — the version could not be determined. Supply it explicitly via `--agent-sdk-version`. + +### Pin a higher floor (optional) + +If you want to gate the BETA behind a newer Agent SDK than the default: + +```bash +gsd-tools query config-set claude_orchestration.min_agent_sdk_version 1.0.0 +``` + +--- + +## Step 3 — Choose the execution backend + +`claude_orchestration.execution_backend` controls how aggressively the backend is used once detection passes: + +| Value | Behaviour | +|-------|-----------| +| `auto` (default) | Use the Workflow backend **if** detection passes; otherwise inline. The safe, recommended value. | +| `workflow` | Force the Workflow backend when the tool is present (still fails closed to inline if the tool is absent or the SDK is too old — the floor applies in both modes). | +| `inline` | Force today's manual one-agent-per-message dispatch, even on a capable Claude Code runtime. Use this to A/B compare or to temporarily retire the BETA. | + +Switch with: + +```bash +gsd-tools query config-set claude_orchestration.execution_backend workflow +``` + +--- + +## Step 4 — Emit a Workflow script for a phase + +With the capability enabled and detection passing, generate the Workflow script for a phase's wave/plan manifest. The manifest is the wave/plan model execute-phase already builds: + +```json +{ + "waves": [ + { + "id": "w1", + "plans": [ + { "id": "p1", "brief": "Implement the foo module", "files_modified": ["src/foo.cts"] }, + { "id": "p2", "brief": "Wire the bar seam", "files_modified": ["src/bar.cts"] } + ] + } + ] +} +``` + +Emit the script: + +```bash +gsd-tools claude-orchestration emit-workflow \ + --waves .planning/phases/01-foo/waves.json \ + --run-id phase-01-foo \ + --phase-dir .planning/phases/01-foo \ + --budget 500000 +``` + +The output is a generated Workflow script that maps GSD's model 1:1 onto Workflow primitives: + +- **waves → sequential `parallel()` barriers** (split into separate stages within a wave when `files_modified` overlap), +- **plans → `agent(brief, { agentType: "gsd-executor", isolation: "worktree" })`** — the **same** executor agent and worktree isolation the inline path uses, +- **`resumeFromRunId("")`** wired to the phase run id, +- **`budget()`** — a shared token pool across the whole phase (omit `--budget` to skip). + +Because the script composes the same `gsd-executor` agent + worktree isolation + `SUMMARY.md` artifact as the inline path, the artifacts and commits it produces are identical — only the execution vehicle differs. + +### Run the emitted script + +Feed the emitted script to Claude Code's Workflow tool (`/effort ultracode`, or an Agent SDK `Workflow` invocation). The orchestrator runs it; each `agent()` call spawns a `gsd-executor` in its own worktree, waves barrier between each other, and `resumeFromRunId` lets an interrupted phase resume without re-running completed plans. + +--- + +## Step 5 — Ultraplan plan-offload + +Enabling the capability also folds `gsd-ultraplan-phase` under the same runtime gate. When the capability is on, the planner may offer the `/gsd-ultraplan-phase` path (offload plan-phase to Claude Code's ultraplan cloud) as an alternative to local `/gsd-plan-phase`. This is advisory — the stable local planner remains the default. + +If the capability is off, or the runtime is not Claude Code, ultraplan offload is not surfaced and `/gsd-plan-phase` runs as normal. + +--- + +## Disabling + +To turn the capability off and return to byte-identical inline behaviour: + +```bash +gsd-tools query config-set claude_orchestration.enabled false +``` + +Or force inline dispatch while leaving the capability otherwise on: + +```bash +gsd-tools query config-set claude_orchestration.execution_backend inline +``` + +Either step is sufficient — no uninstall or resurface needed. The federated config keys live only in the capability registry, so they vanish cleanly if the capability is ever removed. + +--- + +## What is and is not wired in BETA v1 + +**Working today:** +- Detection (`detectWorkflowBackend` / `gsd-tools claude-orchestration detect-backend`) — fail-closed, tested across every gate. +- Emission (`emitWorkflowScript` / `gsd-tools claude-orchestration emit-workflow`) — waves→barriers, overlap→stages, resume, budget, anti-injection. +- The contribution fragments at `execute:wave:post` and `plan:post` (gated, `onError: skip`). +- Inline fallback on every non-capable combination (regression-tested). + +**Not yet wired (follow-ups):** +- `execute-phase.md` does not yet auto-branch to emit-and-run the Workflow script. Today you emit the script explicitly (Step 4) and run it via the Workflow tool. Automatic dispatch inside the loop is the next milestone. +- The plan-checker and verifier still run inline — this capability delivers the parallel-execution backend, not those gates. +- Full install-profile migration of the `gsd-ultraplan-phase` skill into the capability's `skills[]` (it is currently declared in the manifest; the skill's own runtime gate continues to no-op on non-Claude runtimes). + +If a preview-API change breaks detection, the capability degrades to inline; it cannot destabilise the core loop. From 9ea5519bc05733640680d889ddb14d7b6418a03d Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 19:33:43 -0400 Subject: [PATCH 53/75] test(#2041): add regression test for model_overrides claude alias mapping Mirrors the #1133 model_policy alias-mapping tests for the model_overrides path. Covers AC1-AC6: mappable Claude full IDs (claude-sonnet-5/opus-4-8/ haiku-4-5/fable-5) resolve to aliases on runtime:claude; bare aliases pass through; non-claude runtimes keep full IDs verbatim; unmappable Claude IDs warn-once + fall through; resolveModelForTier escalation path also maps; non-Claude custom/vendor values pass through verbatim (regression guards). Expected RED against unfixed model-resolver.cts (override short-circuit at lines 162-167 / 288-290 returns override verbatim with no alias mapping). --- tests/model-resolver.test.cjs | 158 ++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/tests/model-resolver.test.cjs b/tests/model-resolver.test.cjs index 9fc7fa30e..95c5addc0 100644 --- a/tests/model-resolver.test.cjs +++ b/tests/model-resolver.test.cjs @@ -3770,6 +3770,164 @@ describe('#49 resolveModelPolicy: prototype-pollution guards', () => { }); }); +// ─── #2041: model_overrides Claude full ID → Agent-tool alias on claude runtime ─ +// +// Mirrors the #1133 model_policy alias-mapping tests (above) for the +// model_overrides path. Bug: a full Claude model ID in model_overrides +// (e.g. "claude-sonnet-5") was returned VERBATIM on the claude runtime and +// handed to the Claude Agent tool, whose typed `model` parameter documents only +// tier aliases (opus/sonnet/haiku/fable). The model_policy path already maps +// full IDs → aliases via CLAUDE_POLICY_ID_TO_ALIAS (#1144); model_overrides +// skipped that mapping entirely. The fix mirrors #1144 on the override path. +// Non-Claude runtimes and non-Claude values pass through verbatim (parity). + +describe('#2041 model_overrides: Claude full ID → alias on claude runtime', () => { + let tmpDir; + beforeEach(() => { + tmpDir = makeTmp('2041'); + resetRuntimeWarningCaches(); + }); + afterEach(() => { + rmr(tmpDir); + resetRuntimeWarningCaches(); + }); + + // AC1 + AC2: mappable Claude full IDs resolve to their aliases on claude runtime + test('model_overrides claude-sonnet-5 → "sonnet" on runtime:claude (resolveModelInternal)', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-executor': 'claude-sonnet-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-executor'), 'sonnet'); + }); + + test('model_overrides claude-opus-4-8 → "opus" on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-planner': 'claude-opus-4-8' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'opus'); + }); + + test('model_overrides claude-haiku-4-5 → "haiku" on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-codebase-mapper': 'claude-haiku-4-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-codebase-mapper'), 'haiku'); + }); + + test('model_overrides claude-fable-5 → "fable" on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-planner': 'claude-fable-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'fable'); + }); + + // AC3: bare aliases pass through verbatim + test('model_overrides bare "sonnet" alias passes through verbatim on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-executor': 'sonnet' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-executor'), 'sonnet'); + }); + + test('model_overrides bare "fable" alias passes through verbatim on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-planner': 'fable' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'fable'); + }); + + // AC1 (implicit claude): mapping fires when runtime key is absent (defaults to claude) + test('model_overrides claude-sonnet-5 → "sonnet" with implicit claude runtime (no runtime key)', () => { + writeConfig(tmpDir, { + model_overrides: { 'gsd-executor': 'claude-sonnet-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-executor'), 'sonnet'); + }); + + // AC4: non-claude runtimes keep full IDs verbatim (parity with model_policy path) + test('model_overrides claude-sonnet-5 → verbatim ID on non-claude runtime (opencode)', () => { + writeConfig(tmpDir, { + runtime: 'opencode', + model_overrides: { 'gsd-executor': 'claude-sonnet-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-executor'), 'claude-sonnet-5'); + }); + + // AC5: unmappable Claude full ID warns once + falls through to tier alias + test('model_overrides unmappable claude ID (claude-opus-4-5) falls through to tier alias on claude', () => { + resetRuntimeWarningCaches(); + writeConfig(tmpDir, { + runtime: 'claude', + model_profile: 'balanced', + model_overrides: { 'gsd-planner': 'claude-opus-4-5' }, + }); + // gsd-planner balanced → opus tier; claude-opus-4-5 has no alias → warn + fall through → 'opus' + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'opus'); + }); + + test('model_overrides unmappable claude ID emits a stderr warning exactly once (dedupe)', () => { + resetRuntimeWarningCaches(); + writeConfig(tmpDir, { + runtime: 'claude', + model_profile: 'balanced', + model_overrides: { 'gsd-planner': 'claude-opus-4-5' }, + }); + const writes = []; + const original = process.stderr.write.bind(process.stderr); + process.stderr.write = (chunk) => { writes.push(String(chunk)); return true; }; + try { + resolveModelInternal(tmpDir, 'gsd-planner'); + resolveModelInternal(tmpDir, 'gsd-planner'); // second call — dedupe must suppress + } finally { + process.stderr.write = original; + } + const warnings = writes.filter((w) => w.includes('model_overrides') && w.includes('claude-opus-4-5')); + assert.strictEqual(warnings.length, 1, + `expected exactly one override warning, got ${warnings.length}: ${JSON.stringify(writes)}`); + }); + + // AC6: resolveModelForTier (escalation / --attempt path) maps the same way + test('resolveModelForTier maps claude-sonnet-5 → "sonnet" on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-executor': 'claude-sonnet-5' }, + }); + assert.strictEqual(resolveModelForTier(tmpDir, 'gsd-executor', 0), 'sonnet'); + }); + + test('resolveModelForTier keeps full ID verbatim on non-claude runtime', () => { + writeConfig(tmpDir, { + runtime: 'opencode', + model_overrides: { 'gsd-executor': 'claude-sonnet-5' }, + }); + assert.strictEqual(resolveModelForTier(tmpDir, 'gsd-executor', 0), 'claude-sonnet-5'); + }); + + // Regression guard: non-Claude custom / vendor values still pass through verbatim + // on the claude runtime (the fix must NOT touch values that aren't Claude IDs). + test('model_overrides non-Claude custom model passes through verbatim on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-planner': 'my-custom-model' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'my-custom-model'); + }); + + test('model_overrides non-Claude vendor ID (openai/gpt-5) passes through verbatim on runtime:claude', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-executor': 'openai/gpt-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-executor'), 'openai/gpt-5'); + }); +}); + // ─── resolveModelForTier: model_policy beats dynamic_routing ───────────────── describe('#49 resolveModelForTier: model_policy beats dynamic_routing', () => { From f214f1320d61296f9bbb8530112646ee3687a1de Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 20:06:30 -0400 Subject: [PATCH 54/75] fix(#2041): map model_overrides full claude IDs to agent-tool aliases model_overrides values that are full Claude model IDs (claude-sonnet-5, claude-opus-4-8, claude-haiku-4-5, claude-fable-5) were returned verbatim on the claude runtime and handed to the Claude Agent tool, whose typed model parameter documents only tier aliases (opus/sonnet/haiku/fable). The model_policy path already mapped full IDs -> aliases via CLAUDE_POLICY_ID_TO_ALIAS (#1144); model_overrides skipped that mapping, so the two resolver paths produced different shapes for the same underlying Claude model. The fix mirrors #1144 on the override path via a shared mapClaudeOverrideForRuntime helper used by both resolveModelInternal and resolveModelForTier. Bare aliases pass through verbatim; non-Claude runtimes and non-Claude custom/vendor values keep full IDs verbatim (parity). An unmappable Claude ID (e.g. claude-opus-4-5) warns once to stderr and falls through to tier resolution, exactly as the model_policy path already does. Alias mapping is also the documented best practice (prevents staleness when new model versions ship). --- src/model-resolver.cts | 61 +++++++++++++++++++++++++++++++++++++++--- tests/helpers.cjs | 1 + 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/model-resolver.cts b/src/model-resolver.cts index 2fea5d5e1..2820b3510 100644 --- a/src/model-resolver.cts +++ b/src/model-resolver.cts @@ -105,6 +105,51 @@ function _resetModelPolicyWarningCacheForTests(): void { _modelPolicyUnmappableWarned.clear(); } +// Dedupe stderr warnings for unmappable model_overrides Claude IDs (#2041). +const _modelOverrideUnmappableWarned = new Set(); +function warnModelOverrideUnmappable(agentType: string, overrideValue: string): void { + const key = `${agentType}::${overrideValue}`; + if (_modelOverrideUnmappableWarned.has(key)) return; + _modelOverrideUnmappableWarned.add(key); + // MUST go to stderr — resolve-model's JSON result is parsed from stdout. + process.stderr.write( + `gsd: warning — model_overrides value "${overrideValue}" for ${agentType} ` + + `has no Claude agent alias; falling through to tier resolution.\n`, + ); +} + +// Test-only: reset the model_overrides warn-dedupe cache between cases (#2041). +function _resetModelOverrideWarningCacheForTests(): void { + _modelOverrideUnmappableWarned.clear(); +} + +/** + * #2041 — Map a `model_overrides` value to its Claude Agent-tool alias on the + * claude runtime, mirroring the `model_policy` path (#1144). Claude Code's + * Agent tool `model` parameter documents only tier aliases (opus/sonnet/haiku/ + * fable); a full Claude model ID returned verbatim is silently dropped by the + * spawner. Returns the value to return verbatim, or null to signal "fall + * through to normal tier/dynamic-routing resolution" (used when a Claude full + * ID has no alias — matches model_policy's warn-and-fall-through). Non-Claude + * runtimes and non-Claude values always pass through verbatim. + */ +function mapClaudeOverrideForRuntime( + override: string, + configRuntime: string | null | undefined, + agentType: string, +): string | null { + const onClaude = !configRuntime || configRuntime === 'claude'; + if (!onClaude) return override; + const alias = CLAUDE_POLICY_ID_TO_ALIAS[override]; + if (alias) return alias; + if (CLAUDE_AGENT_ALIASES.has(override)) return override; + if (override.startsWith('claude-')) { + warnModelOverrideUnmappable(agentType, override); + return null; + } + return override; +} + /** * #49 — Provider-neutral model policy preset resolution. */ @@ -159,11 +204,15 @@ function resolveModelPolicy(policy: Record | null | undefined, function resolveModelInternal(cwd: string, agentType: string): string { const config = loadConfig(cwd); - // 1. Per-agent override + // 1. Per-agent override (#2041: map Claude full IDs → Agent-tool aliases on + // the claude runtime, mirroring the model_policy path #1144; non-Claude + // runtimes and non-Claude values pass through verbatim). const modelOverrides = config['model_overrides'] as Record | null | undefined; const override = modelOverrides?.[agentType]; if (override) { - return override; + const mapped = mapClaudeOverrideForRuntime(override, config['runtime'] as string | null | undefined, agentType); + if (mapped !== null) return mapped; + // Unmappable Claude ID — fall through to tier resolution (matches model_policy). } // 2. Compute the tier @@ -287,7 +336,11 @@ function resolveModelForTier(cwd: string, agentType: string, attempt?: number): const modelOverrides = config['model_overrides'] as Record | null | undefined; const override = modelOverrides?.[agentType]; - if (override) return override; + if (override) { + const mapped = mapClaudeOverrideForRuntime(override, config['runtime'] as string | null | undefined, agentType); + if (mapped !== null) return mapped; + // Unmappable Claude ID — fall through to dynamic_routing / model_policy resolution. + } if (config['model_policy'] && config['runtime'] && config['runtime'] !== 'claude') { return resolveModelInternal(cwd, agentType); @@ -508,6 +561,8 @@ export = { resolveModelPolicy, resolveModelInternal, _resetModelPolicyWarningCacheForTests, + _resetModelOverrideWarningCacheForTests, + mapClaudeOverrideForRuntime, VALID_GRANULARITIES, resolveGranularityInternal, assertValidGranularityOverride, diff --git a/tests/helpers.cjs b/tests/helpers.cjs index 3538a26a5..234bc8f99 100644 --- a/tests/helpers.cjs +++ b/tests/helpers.cjs @@ -423,6 +423,7 @@ function resetRuntimeWarningCaches() { const modelResolver = require('../gsd-core/bin/lib/model-resolver.cjs'); configLoader._resetRuntimeWarningCacheForTests(); modelResolver._resetModelPolicyWarningCacheForTests(); + modelResolver._resetModelOverrideWarningCacheForTests(); } module.exports = { runGsdTools, createTempDir, createTempProject, createTempGitProject, cleanup, parseFrontmatter, isUsageOutput, captureConsole, toPosixPath, runNpm, isolatedNpmEnv, withIsolatedProcessState, delay, waitFor, resetRuntimeWarningCaches, TOOLS_PATH }; From 13e40fcbf748205b51dafd508b3834dc97d66138 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 20:07:54 -0400 Subject: [PATCH 55/75] docs(#2041): add changeset fragment for model_overrides alias fix --- .changeset/gentle-badgers-roar.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/gentle-badgers-roar.md diff --git a/.changeset/gentle-badgers-roar.md b/.changeset/gentle-badgers-roar.md new file mode 100644 index 000000000..f92ea1e0a --- /dev/null +++ b/.changeset/gentle-badgers-roar.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 0 +--- +**`model_overrides` Claude model IDs now resolve to Agent-tool aliases on the claude runtime** — a full Claude model ID (e.g. `claude-sonnet-5`) in `model_overrides` was returned verbatim and silently dropped by the Claude Agent tool (whose `model` parameter documents only tier aliases), causing the spawned subagent to inherit the parent session model instead of the configured one. It now maps to the tier alias (`sonnet`/`opus`/`haiku`/`fable`), consistent with the `model_policy` path (#1144). Bare aliases, non-Claude values, and non-Claude runtimes are unchanged; a Claude ID with no alias warns once and falls through to tier resolution. (#2041) From e95af39a8c5552b2bd87550c9d752d4cb40e8a5b Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 20:16:30 -0400 Subject: [PATCH 56/75] fix(#2041): address code+security review findings - add typeof guard so a non-string override passes through verbatim instead of crashing on .startsWith (preserves pre-fix no-crash behaviour) [LOW-1] - use Object.hasOwn() for the alias lookup so __proto__/constructor cannot return a truthy non-string from the plain object literal [LOW-D3] - cap the unmappable-override stderr warning at 64 chars so an oversized or secret-shaped value cannot leak in full to stderr/logs [LOW-D4] - remove the unused mapClaudeOverrideForRuntime export (helpers are covered behaviourally via resolveModelInternal/resolveModelForTier) [NIT] - add resolveModelForTier unmappable-override fall-through test (closes the mutation-score gap) [MEDIUM-1] - add case-sensitivity contract test (Claude-Sonnet-5 passes through verbatim) [LOW-2] Both orthogonal reviews returned APPROVE with no Critical/High findings. --- src/model-resolver.cts | 24 +++++++++++++++++++----- tests/model-resolver.test.cjs | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/model-resolver.cts b/src/model-resolver.cts index 2820b3510..dc1bc31f1 100644 --- a/src/model-resolver.cts +++ b/src/model-resolver.cts @@ -111,9 +111,12 @@ function warnModelOverrideUnmappable(agentType: string, overrideValue: string): const key = `${agentType}::${overrideValue}`; if (_modelOverrideUnmappableWarned.has(key)) return; _modelOverrideUnmappableWarned.add(key); - // MUST go to stderr — resolve-model's JSON result is parsed from stdout. + // Cap emission length so an oversized or secret-shaped value cannot leak in + // full to stderr/logs (#2041 security review). MUST go to stderr — resolve- + // model's JSON result is parsed from stdout. + const safe = overrideValue.length > 64 ? overrideValue.slice(0, 64) + '…' : overrideValue; process.stderr.write( - `gsd: warning — model_overrides value "${overrideValue}" for ${agentType} ` + + `gsd: warning — model_overrides value "${safe}" for ${agentType} ` + `has no Claude agent alias; falling through to tier resolution.\n`, ); } @@ -132,16 +135,28 @@ function _resetModelOverrideWarningCacheForTests(): void { * through to normal tier/dynamic-routing resolution" (used when a Claude full * ID has no alias — matches model_policy's warn-and-fall-through). Non-Claude * runtimes and non-Claude values always pass through verbatim. + * + * Hardening (code+security review): a `typeof` guard preserves the pre-fix + * no-crash behavior if a malformed config surfaces a non-string value, and an + * `Object.hasOwn` lookup defeats `__proto__`/`constructor` lookups on the plain + * object literal so those reserved keys cannot return a truthy non-string. */ function mapClaudeOverrideForRuntime( override: string, configRuntime: string | null | undefined, agentType: string, ): string | null { + // Defensive: model_overrides is typed Record but a malformed + // config could surface a non-string; pass through verbatim (preserving the + // pre-fix no-crash behaviour) and let the downstream Agent tool reject it. + if (typeof override !== 'string') return override; const onClaude = !configRuntime || configRuntime === 'claude'; if (!onClaude) return override; - const alias = CLAUDE_POLICY_ID_TO_ALIAS[override]; - if (alias) return alias; + // Object.hasOwn guards against __proto__/constructor returning a truthy + // non-string from the plain object literal (#2041 security review). + if (Object.hasOwn(CLAUDE_POLICY_ID_TO_ALIAS, override)) { + return CLAUDE_POLICY_ID_TO_ALIAS[override]; + } if (CLAUDE_AGENT_ALIASES.has(override)) return override; if (override.startsWith('claude-')) { warnModelOverrideUnmappable(agentType, override); @@ -562,7 +577,6 @@ export = { resolveModelInternal, _resetModelPolicyWarningCacheForTests, _resetModelOverrideWarningCacheForTests, - mapClaudeOverrideForRuntime, VALID_GRANULARITIES, resolveGranularityInternal, assertValidGranularityOverride, diff --git a/tests/model-resolver.test.cjs b/tests/model-resolver.test.cjs index 95c5addc0..3e2d06ddf 100644 --- a/tests/model-resolver.test.cjs +++ b/tests/model-resolver.test.cjs @@ -3909,6 +3909,32 @@ describe('#2041 model_overrides: Claude full ID → alias on claude runtime', () assert.strictEqual(resolveModelForTier(tmpDir, 'gsd-executor', 0), 'claude-sonnet-5'); }); + // MEDIUM-1 (review): exercise the unmappable-override fall-through branch in + // resolveModelForTier (closes the mutation-score gap — a future refactor that + // accidentally returned the verbatim override instead of falling through + // would otherwise survive the suite). + test('resolveModelForTier unmappable claude ID falls through to tier alias on claude', () => { + resetRuntimeWarningCaches(); + writeConfig(tmpDir, { + runtime: 'claude', + model_profile: 'balanced', + model_overrides: { 'gsd-planner': 'claude-opus-4-5' }, + }); + // unmappable override → fall through → no dynamic_routing → resolveModelInternal → 'opus' + assert.strictEqual(resolveModelForTier(tmpDir, 'gsd-planner', 0), 'opus'); + }); + + // LOW-2 (review): pin the case-sensitive contract — a case-variant like + // "Claude-Sonnet-5" is NOT mapped (alias keys are case-sensitive, matching + // the model_policy path and the Claude API). + test('model_overrides case-variant "Claude-Sonnet-5" passes through verbatim (case-sensitive contract)', () => { + writeConfig(tmpDir, { + runtime: 'claude', + model_overrides: { 'gsd-executor': 'Claude-Sonnet-5' }, + }); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-executor'), 'Claude-Sonnet-5'); + }); + // Regression guard: non-Claude custom / vendor values still pass through verbatim // on the claude runtime (the fix must NOT touch values that aren't Claude IDs). test('model_overrides non-Claude custom model passes through verbatim on runtime:claude', () => { From 6136aa20de2233916916b0765d09403bde9e4d65 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 20:59:38 -0400 Subject: [PATCH 57/75] docs(#2041): backfill changeset pr number to 2048 --- .changeset/gentle-badgers-roar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/gentle-badgers-roar.md b/.changeset/gentle-badgers-roar.md index f92ea1e0a..a20eb5765 100644 --- a/.changeset/gentle-badgers-roar.md +++ b/.changeset/gentle-badgers-roar.md @@ -1,5 +1,5 @@ --- type: Fixed -pr: 0 +pr: 2048 --- **`model_overrides` Claude model IDs now resolve to Agent-tool aliases on the claude runtime** — a full Claude model ID (e.g. `claude-sonnet-5`) in `model_overrides` was returned verbatim and silently dropped by the Claude Agent tool (whose `model` parameter documents only tier aliases), causing the spawned subagent to inherit the parent session model instead of the configured one. It now maps to the tier alias (`sonnet`/`opus`/`haiku`/`fable`), consistent with the `model_policy` path (#1144). Bare aliases, non-Claude values, and non-Claude runtimes are unchanged; a Claude ID with no alias warns once and falls through to tier resolution. (#2041) From 4b1825e5f8361ffd7b2664816fe96e333a7d52a1 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 21:10:27 -0400 Subject: [PATCH 58/75] test(#1858): add regression tests for flat commands/gsd-*.md layout Mirrors the #1160 installed-layout tests for the flat source layout (/commands/gsd-.md, no commands/gsd/ subdir). Covers stem extraction (strip gsd- prefix), requires parsing via shared parseRequires, companion _calls_agents_ key parity, _resolveManifest flat-branch detection, precedence (flat-empty falls through to installed), and a generative-parity assertion that the flat loader and nested loader produce identical stem sets for the real command tree. Expected RED against unfixed capability-state.cts (_resolveManifest has no flat branch; _loadFlatCommandsGsdManifest not exported). --- tests/capability-state.test.cjs | 169 ++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) diff --git a/tests/capability-state.test.cjs b/tests/capability-state.test.cjs index 66bba4e9c..fa2553c7a 100644 --- a/tests/capability-state.test.cjs +++ b/tests/capability-state.test.cjs @@ -22,6 +22,7 @@ const { isCapabilityActive, _isSafePropKey, _loadInstalledSkillsManifest, + _loadFlatCommandsGsdManifest, _resolveManifest, } = require('../gsd-core/bin/lib/capability-state.cjs'); @@ -823,6 +824,174 @@ describe('cmdCapabilityState — end-to-end via gsd-tools CLI', () => { // FAIL before the fix and PASS after, regardless of whether commands/gsd // happens to exist in the current checkout. +describe('regressions: flat commands/gsd-.md layout (#1858)', () => { + // Flat command layout (Claude local project install shape): skills live at + // /commands/gsd-.md — the gsd- prefix is baked into the filename + // and there is NO commands/gsd/ subdir. _resolveManifest must detect this + // layout, strip the gsd- prefix, and produce the same stems the nested + // loader (commands/gsd/.md) would, or every skill-bearing capability + // is silently reported surfaced:false / enabled:false / active:false. + function makeFlatCommandMd(stem, requires) { + const req = requires ? `requires: [${requires.join(', ')}]` : 'requires: [phase]'; + return [ + '---', + `name: gsd:${stem}`, + `description: ${stem} skill`, + 'argument-hint: "[phase number]"', + 'allowed-tools:', + ' - Read', + req, + '---', + 'Execute end-to-end.', + ].join('\n') + '\n'; + } + + // ── Unit tests for _loadFlatCommandsGsdManifest ───────────────────────────── + + test('_loadFlatCommandsGsdManifest: returns empty map when parent dir absent', () => { + const missing = path.join(os.tmpdir(), 'cap-flat-missing-' + Date.now()); + const manifest = _loadFlatCommandsGsdManifest(missing); + assert.ok(manifest instanceof Map, 'should return a Map'); + assert.strictEqual(manifest.size, 0, 'should be empty when parent dir absent'); + }); + + test('_loadFlatCommandsGsdManifest: scans gsd-.md and strips the gsd- prefix', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-flat-scan-')); + try { + fs.writeFileSync(path.join(tmpDir, 'gsd-validate-phase.md'), makeFlatCommandMd('validate-phase'), 'utf8'); + fs.writeFileSync(path.join(tmpDir, 'gsd-secure-phase.md'), makeFlatCommandMd('secure-phase'), 'utf8'); + // Non-gsd file must be ignored + fs.writeFileSync(path.join(tmpDir, 'random-doc.md'), '# not a skill\n', 'utf8'); + // Non-markdown gsd file must be ignored + fs.writeFileSync(path.join(tmpDir, 'gsd-notskill.txt'), 'nope\n', 'utf8'); + + const manifest = _loadFlatCommandsGsdManifest(tmpDir); + assert.ok(manifest.has('validate-phase'), 'flat gsd-validate-phase.md -> stem validate-phase'); + assert.ok(manifest.has('secure-phase'), 'flat gsd-secure-phase.md -> stem secure-phase'); + assert.ok(!manifest.has('gsd-validate-phase'), 'must NOT keep the gsd- prefix on the stem'); + assert.ok(!manifest.has('random-doc'), 'non-gsd file must be ignored'); + assert.ok(!manifest.has('notskill'), 'non-.md gsd file must be ignored'); + } finally { + cleanup(tmpDir); + } + }); + + test('_loadFlatCommandsGsdManifest: parses requires via shared parseRequires (no drift)', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-flat-req-')); + try { + fs.writeFileSync( + path.join(tmpDir, 'gsd-my-skill.md'), + makeFlatCommandMd('my-skill', ['dep-a', 'dep-b']), + 'utf8', + ); + const manifest = _loadFlatCommandsGsdManifest(tmpDir); + assert.deepStrictEqual(manifest.get('my-skill'), ['dep-a', 'dep-b']); + } finally { + cleanup(tmpDir); + } + }); + + test('_loadFlatCommandsGsdManifest: companion _calls_agents_ key present (parity with nested loader)', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-flat-agents-')); + try { + fs.writeFileSync(path.join(tmpDir, 'gsd-validate-phase.md'), makeFlatCommandMd('validate-phase'), 'utf8'); + const manifest = _loadFlatCommandsGsdManifest(tmpDir); + assert.ok(manifest.has('_calls_agents_validate-phase'), + 'flat loader must emit the companion _calls_agents_ key (same Map shape as loadSkillsManifest)'); + } finally { + cleanup(tmpDir); + } + }); + + // ── _resolveManifest picks the flat branch when nested is absent ──────────── + + test('_resolveManifest: detects flat commands/gsd-.md layout when nested commands/gsd/ is absent (#1858)', () => { + const tmpRepo = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rm-flat-repo-')); + try { + // Flat source layout: /commands/gsd-.md + // NO commands/gsd/ subdir, NO skills/ dir. + const commandsDir = path.join(tmpRepo, 'commands'); + fs.mkdirSync(commandsDir, { recursive: true }); + fs.writeFileSync(path.join(commandsDir, 'gsd-validate-phase.md'), makeFlatCommandMd('validate-phase'), 'utf8'); + fs.writeFileSync(path.join(commandsDir, 'gsd-secure-phase.md'), makeFlatCommandMd('secure-phase'), 'utf8'); + + // commandsGsdDir = /commands/gsd (nested — does NOT exist). + // dirname(commandsGsdDir) = /commands (where the flat files live). + const commandsGsdDir = path.join(commandsDir, 'gsd'); + // configDir = a separate empty tmp dir (no skills/ → installed fallback empty). + const configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rm-flat-cfg-')); + try { + const manifest = _resolveManifest(commandsGsdDir, configDir); + assert.ok(manifest.has('validate-phase'), + 'flat layout must populate validate-phase stem (was empty pre-fix → all skill caps unsurfaced)'); + assert.ok(manifest.has('secure-phase'), 'flat layout must populate secure-phase stem'); + assert.ok(!manifest.has('gsd-validate-phase'), 'stem must have gsd- prefix stripped'); + } finally { + cleanup(configDir); + } + } finally { + cleanup(tmpRepo); + } + }); + + test('_resolveManifest: flat branch does NOT shadow a populated installed skills dir when no flat files exist', () => { + // Precedence: nested > flat-source > installed. If the flat parent dir has + // NO gsd-*.md files, the flat loader returns an empty Map and _resolveManifest + // must fall through to the installed-skills branch (not return empty). + const tmpRepo = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rm-precedence-')); + try { + const commandsDir = path.join(tmpRepo, 'commands'); + fs.mkdirSync(commandsDir, { recursive: true }); + // No gsd-*.md files in commands/ — flat loader yields empty. + // Installed skills present under configDir: + const configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rm-precedence-cfg-')); + try { + const secureDir = path.join(configDir, 'skills', 'gsd-secure-phase'); + fs.mkdirSync(secureDir, { recursive: true }); + fs.writeFileSync(path.join(secureDir, 'SKILL.md'), + '---\nname: gsd:secure-phase\nrequires: [phase]\n---\nbody\n', 'utf8'); + + const commandsGsdDir = path.join(commandsDir, 'gsd'); // nested absent + const manifest = _resolveManifest(commandsGsdDir, configDir); + assert.ok(manifest.has('secure-phase'), + 'when flat dir is empty, installed-skills fallback must still work (precedence flat > installed only when flat non-empty)'); + } finally { + cleanup(configDir); + } + } finally { + cleanup(tmpRepo); + } + }); + + // ── Parity: flat loader produces the same stems as the nested loader ──────── + // (DEFECT.GENERATIVE-FIX — guards against silent divergence between the two + // parallel manifest-builders.) + + test('flat loader and nested loader produce identical stems for the same command set (parity)', () => { + const realCommandsGsdDir = path.resolve(__dirname, '..', 'commands', 'gsd'); + if (!fs.existsSync(realCommandsGsdDir)) return; // skip outside a repo checkout + // Build a flat mirror of the real nested commands/gsd/.md as + // commands/gsd-.md in a temp dir, then compare stem sets. + const tmpFlat = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-parity-flat-')); + try { + const nested = require('../gsd-core/bin/lib/install-profiles.cjs').loadSkillsManifest(realCommandsGsdDir); + for (const [stem] of nested) { + if (stem.startsWith('_calls_agents_')) continue; + const src = path.join(realCommandsGsdDir, stem + '.md'); + if (!fs.existsSync(src)) continue; + fs.writeFileSync(path.join(tmpFlat, 'gsd-' + stem + '.md'), fs.readFileSync(src, 'utf8'), 'utf8'); + } + const flat = _loadFlatCommandsGsdManifest(tmpFlat); + const nestedStems = [...nested.keys()].filter((k) => !k.startsWith('_calls_agents_')).sort(); + const flatStems = [...flat.keys()].filter((k) => !k.startsWith('_calls_agents_')).sort(); + assert.deepStrictEqual(flatStems, nestedStems, + 'flat loader stem set must match nested loader stem set for the real command tree'); + } finally { + cleanup(tmpFlat); + } + }); +}); + describe('regressions: installed-runtime capability surface (#1160)', () => { // Minimal valid SKILL.md content (frontmatter only — matches what install emits) function makeSkillMd(stem) { From 9dcd37033254e05ac267288e2776d1a4dd8c099f Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 21:13:42 -0400 Subject: [PATCH 59/75] fix(#1858): detect flat commands/gsd-.md layout in _resolveManifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _resolveManifest only recognized the nested source layout (commands/gsd/*.md) and the installed-runtime skills layout (skills/gsd-/SKILL.md). A flat source install (Claude local project shape: commands/gsd-.md, no commands/gsd/ subdir) matched neither branch, so the manifest came back empty and resolveSurface materialized the full profile to an empty Set — silently reporting every skill-bearing capability as surfaced:false / enabled:false / active:false. The nyquist/code-review/security/ui verify:post and execute:post hooks never fired even with their workflow.* toggles on. Add a third branch: when commandsGsdDir is absent, scan dirname(commandsGsdDir) for gsd-.md files, strip the gsd- prefix, and build the same Map shape the nested loader produces (requires via shared parseRequires, companion _calls_agents_ via shared parseCallsAgents). Falls through to the installed-skills branch when the flat dir has no gsd-*.md files (precedence: nested > flat-source > installed). Also export parseCallsAgents from install-profiles so capability-state reuses the SAME parser the nested loader uses (no drift; mirrors the existing parseRequires export+reuse pattern). --- src/capability-state.cts | 75 +++++++++++++++++++++++++++++++++++----- src/install-profiles.cts | 1 + 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/capability-state.cts b/src/capability-state.cts index a43b16f3b..cead2c8b5 100644 --- a/src/capability-state.cts +++ b/src/capability-state.cts @@ -46,7 +46,7 @@ const { loadConfig } = configLoaderMod; // eslint-disable-next-line @typescript-eslint/no-require-imports import installProfilesMod = require('./install-profiles.cjs'); -const { readActiveProfile, loadSkillsManifest, resolveProfile, parseRequires } = installProfilesMod; +const { readActiveProfile, loadSkillsManifest, resolveProfile, parseRequires, parseCallsAgents } = installProfilesMod; // eslint-disable-next-line @typescript-eslint/no-require-imports import surfaceMod = require('./surface.cjs'); @@ -384,22 +384,80 @@ function _loadInstalledSkillsManifest(configDir: string): Map return manifest; } +/** + * #1858 — Build a skill dependency manifest from a FLAT commands/gsd-.md + * source layout (the Claude local project install shape, where the `gsd-` + * prefix is baked into each filename at the commands/ level and there is no + * commands/gsd/ subdir). Strips the `gsd-` prefix so stems match the nested + * loader's output (gsd-validate-phase.md → validate-phase, same as nested + * validate-phase.md). + * + * Map shape is identical to loadSkillsManifest: each stem maps to its + * `requires` deps (parsed via the same shared parseRequires) and carries a + * companion `_calls_agents_` key (parsed via parseCallsAgents) so the + * flat and nested paths cannot drift. + * + * Returns an empty Map when the parent directory does not exist or contains + * no gsd-*.md files (so _resolveManifest can use size>0 as the "flat layout + * present" signal and fall through to the installed-skills branch otherwise). + */ +function _loadFlatCommandsGsdManifest(commandsParentDir: string): Map { + const manifest = new Map(); + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(commandsParentDir, { withFileTypes: true }); + } catch { + return manifest; + } + for (const entry of entries) { + if (!entry.isFile()) continue; + if (!entry.name.startsWith('gsd-')) continue; + if (!entry.name.endsWith('.md')) continue; + // Strip 'gsd-' prefix (4 chars) and '.md' suffix (3 chars) → stem. + const stem = entry.name.slice(4, -3); + if (!stem) continue; + let content = ''; + try { + content = fs.readFileSync(path.join(commandsParentDir, entry.name), 'utf8'); + } catch { + // Unreadable file — register with empty deps + agents (parity with + // loadSkillsManifest's readFileSync catch branch). + } + manifest.set(stem, content ? parseRequires(content) : []); + manifest.set(`_calls_agents_${stem}`, content ? parseCallsAgents(content) : []); + } + return manifest; +} + /** * Resolve the skill dependency manifest for capability-state resolution. * - * Resolution order (fixes #1160 — installed-runtime capability surface): - * 1. If commandsGsdDir exists, load from source (repo-checkout behavior). - * 2. Otherwise, fall back to installed skills at configDir/skills/gsd-[stem]/SKILL.md. + * Resolution order: + * 1. If commandsGsdDir exists, load from the nested source layout + * (repo-checkout behavior: /commands/gsd/*.md). + * 2. #1858 — otherwise, if the flat source layout is present (gsd-.md + * files in dirname(commandsGsdDir)), load from there. This is the Claude + * local project install shape where commands/gsd/ does not exist but + * commands/gsd-.md files do. + * 3. #1160 — otherwise, fall back to installed skills at + * configDir/skills/gsd-[stem]/SKILL.md. * - * In an installed runtime the commands/gsd source tree is absent; only the - * skills/ layout exists. Returning an empty manifest caused resolveSurface to - * materialise the full-sentinel to an empty Set, making every capability appear - * unsurfaced even when the skill was physically installed. + * In an installed runtime both source trees are absent; only the skills/ + * layout exists. Returning an empty manifest caused resolveSurface to + * materialise the full-sentinel to an empty Set, making every skill-bearing + * capability appear unsurfaced even when the skill was physically installed + * (#1160) or authored as a flat command file (#1858). */ function _resolveManifest(commandsGsdDir: string, configDir: string): Map { if (fs.existsSync(commandsGsdDir)) { return loadSkillsManifest(commandsGsdDir); } + // #1858: flat source layout — gsd-.md files at dirname(commandsGsdDir). + // Only claim the flat branch when it actually has gsd-*.md files; otherwise + // fall through to the installed-skills branch (a commands/ dir with no gsd + // files must not shadow an installed skills/ tree). + const flat = _loadFlatCommandsGsdManifest(path.dirname(commandsGsdDir)); + if (flat.size > 0) return flat; return _loadInstalledSkillsManifest(configDir); } @@ -619,6 +677,7 @@ export = { // Exported for tests _resolveCommandsGsdDir, _loadInstalledSkillsManifest, + _loadFlatCommandsGsdManifest, _resolveManifest, _isSafePropKey, }; diff --git a/src/install-profiles.cts b/src/install-profiles.cts index 90674c367..474327ae5 100644 --- a/src/install-profiles.cts +++ b/src/install-profiles.cts @@ -875,6 +875,7 @@ export = { writeActiveProfile, // Shared internals parseRequires, + parseCallsAgents, cleanupStagedSkills, // Back-compat / deprecated MINIMAL_SKILL_ALLOWLIST, From e3d053619c67f1afbad9f13af72774b9d4eebdda Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 21:14:44 -0400 Subject: [PATCH 60/75] docs(#1858): add changeset fragment for flat-layout manifest fix --- .changeset/steady-ibex-run.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/steady-ibex-run.md diff --git a/.changeset/steady-ibex-run.md b/.changeset/steady-ibex-run.md new file mode 100644 index 000000000..e455bdf75 --- /dev/null +++ b/.changeset/steady-ibex-run.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 0 +--- +**Skill-bearing capabilities now surface correctly on flat command-layout installs** — on an install using the flat `commands/gsd-.md` source layout (e.g. a Claude Code local project install with no `commands/gsd/` subdir), every skill-bearing capability (`nyquist`, `code-review`, `security`, `ui`, `mempalace`, `ai-integration`, `profile-pipeline`) was silently reported `surfaced:false`/`enabled:false`/`active:false`, so their loop hooks (`verify:post`, `execute:post`, etc.) never fired even with the corresponding `workflow.*` toggle on. The skill-manifest resolver now detects the flat layout and produces the same stems the nested `commands/gsd/*.md` loader does. (#1858) From 2c853822a172307386dd8b7a4ce4a1db8fb41610 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 21:35:24 -0400 Subject: [PATCH 61/75] fix(#1858): address code+security review findings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - restructure _loadFlatCommandsGsdManifest try/catch to wrap read+parse+set together (mirrors loadSkillsManifest exactly), so a thrown parser degrades both keys to [] — closes the latent catch-scope parity drift [Nit-1] - add boundary test: gsd-.md (empty stem) skipped, gsd-x.md single-char stem kept (slice(4,-3) boundary) [Low-1] - add unreadable-file test (POSIX-gated): both keys degrade to [] [Low-2] - strengthen parity test to also compare requires + _calls_agents_ VALUES, not just the stem set [Nit-2] Both orthogonal reviews returned APPROVE with no Critical/High findings. Security review confirmed no new trust-boundary crossing, prototype-pollution immune (Map/Set throughout), and symlink/path-traversal surface identical to the pre-existing nested loader (not a regression). --- src/capability-state.cts | 16 +++++++---- tests/capability-state.test.cjs | 49 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/capability-state.cts b/src/capability-state.cts index cead2c8b5..9527e930a 100644 --- a/src/capability-state.cts +++ b/src/capability-state.cts @@ -416,15 +416,19 @@ function _loadFlatCommandsGsdManifest(commandsParentDir: string): Map.md layout (#1858)', () => { } }); + // Low-1 (review): boundary — empty stem (gsd-.md) skipped, single-char stem kept. + test('_loadFlatCommandsGsdManifest: skips gsd-.md (empty stem) and keeps single-char stem (slice boundary)', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-flat-edge-')); + try { + fs.writeFileSync(path.join(tmpDir, 'gsd-.md'), makeFlatCommandMd(''), 'utf8'); + fs.writeFileSync(path.join(tmpDir, 'gsd-x.md'), makeFlatCommandMd('x'), 'utf8'); + const manifest = _loadFlatCommandsGsdManifest(tmpDir); + assert.ok(!manifest.has(''), 'gsd-.md must NOT register an empty-string stem'); + assert.ok(!manifest.has('_calls_agents_'), 'no companion key for an empty stem'); + assert.ok(manifest.has('x'), 'gsd-x.md -> single-char stem "x" (slice(4,-3) boundary)'); + } finally { + cleanup(tmpDir); + } + }); + + // Low-2 (review): unreadable file degrades both keys to [] (parity with nested + // loader's catch). POSIX-only AND must not run as root — root bypasses POSIX + // read permission bits, so chmod 0o000 would NOT make the file unreadable and + // the test would assert [] against the real parsed deps (false failure). + // Skip on win32 (DEFECT.WINDOWS-POSIX-MODE-BIT-ASSERT) and when getuid()==0. + const _skipUnreadable = process.platform === 'win32' || (typeof process.getuid === 'function' && process.getuid() === 0); + test('_loadFlatCommandsGsdManifest: unreadable file degrades to empty deps + agents (parity)', { skip: _skipUnreadable }, () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-flat-unread-')); + let madeUnreadable = false; + try { + const skillPath = path.join(tmpDir, 'gsd-secure.md'); + fs.writeFileSync(skillPath, '---\nname: gsd:secure\nrequires: [phase]\n---\nbody\n', { mode: 0o644 }); + fs.chmodSync(skillPath, 0o000); + madeUnreadable = true; + const manifest = _loadFlatCommandsGsdManifest(tmpDir); + assert.deepStrictEqual(manifest.get('secure'), [], 'unreadable file -> empty requires (parity with nested catch)'); + assert.deepStrictEqual(manifest.get('_calls_agents_secure'), [], 'unreadable file -> empty agents (parity with nested catch)'); + } finally { + // Restore writability so cleanup() can rm the tmp tree. + if (madeUnreadable) { + try { fs.chmodSync(path.join(tmpDir, 'gsd-secure.md'), 0o644); } catch { /* best effort */ } + } + cleanup(tmpDir); + } + }); + // ── _resolveManifest picks the flat branch when nested is absent ──────────── test('_resolveManifest: detects flat commands/gsd-.md layout when nested commands/gsd/ is absent (#1858)', () => { @@ -986,6 +1027,14 @@ describe('regressions: flat commands/gsd-.md layout (#1858)', () => { const flatStems = [...flat.keys()].filter((k) => !k.startsWith('_calls_agents_')).sort(); assert.deepStrictEqual(flatStems, nestedStems, 'flat loader stem set must match nested loader stem set for the real command tree'); + // Nit-2 (review): also compare _calls_agents_ VALUES, not just the + // stem set — proves the shared parseCallsAgents output is identical. + for (const stem of flatStems) { + assert.deepStrictEqual(flat.get(`_calls_agents_${stem}`), nested.get(`_calls_agents_${stem}`), + `agent refs for stem "${stem}" must match between flat and nested loaders`); + assert.deepStrictEqual(flat.get(stem), nested.get(stem), + `requires for stem "${stem}" must match between flat and nested loaders`); + } } finally { cleanup(tmpFlat); } From 4424a366d7487e36725645b9fa3eed86359333ff Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 22:18:40 -0400 Subject: [PATCH 62/75] docs(#1858): backfill changeset pr number to 2049 --- .changeset/steady-ibex-run.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/steady-ibex-run.md b/.changeset/steady-ibex-run.md index e455bdf75..bf1b37a3b 100644 --- a/.changeset/steady-ibex-run.md +++ b/.changeset/steady-ibex-run.md @@ -1,5 +1,5 @@ --- type: Fixed -pr: 0 +pr: 2049 --- **Skill-bearing capabilities now surface correctly on flat command-layout installs** — on an install using the flat `commands/gsd-.md` source layout (e.g. a Claude Code local project install with no `commands/gsd/` subdir), every skill-bearing capability (`nyquist`, `code-review`, `security`, `ui`, `mempalace`, `ai-integration`, `profile-pipeline`) was silently reported `surfaced:false`/`enabled:false`/`active:false`, so their loop hooks (`verify:post`, `execute:post`, etc.) never fired even with the corresponding `workflow.*` toggle on. The skill-manifest resolver now detects the flat layout and produces the same stems the nested `commands/gsd/*.md` loader does. (#1858) From 192764f0c36a4a097ded6caedf76a165d0a88108 Mon Sep 17 00:00:00 2001 From: Codesmith Date: Tue, 7 Jul 2026 02:55:18 +0000 Subject: [PATCH 63/75] chore(#1990): recapture zcode golden install fixture with onboard artifacts Co-authored-by: Codesmith --- .../fixtures/golden-install-parity/zcode.json | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 2f09d5f90..aca29fca4 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -62,7 +62,7 @@ "commands/gsd-inbox.md": "da55c1408a6ee6cc", "commands/gsd-ingest-docs.md": "7a3c21ae5d5d133a", "commands/gsd-manager.md": "9f54653a7c589b00", - "commands/gsd-map-codebase.md": "8b605921868c03a3", + "commands/gsd-map-codebase.md": "709e9572953accc6", "commands/gsd-mempalace-capture.md": "5d4556e444acbb90", "commands/gsd-mempalace-recall.md": "5ac67fa4b7f2b03b", "commands/gsd-milestone-summary.md": "f8fa9c357c08b74b", @@ -73,9 +73,10 @@ "commands/gsd-ns-context.md": "011c44e7aa46e64a", "commands/gsd-ns-ideate.md": "edc5e543512dd48a", "commands/gsd-ns-manage.md": "0409d810e499357f", - "commands/gsd-ns-project.md": "8dfd1b9a2ffe86ac", + "commands/gsd-ns-project.md": "ff67e85bc6f7fc5a", "commands/gsd-ns-review.md": "3766ed10827882a0", "commands/gsd-ns-workflow.md": "c3b3c046a74ec0ee", + "commands/gsd-onboard.md": "a35340ce39334fc7", "commands/gsd-pause-work.md": "40a953fcddbedb5d", "commands/gsd-phase.md": "5dd3d40e3461a973", "commands/gsd-plan-phase.md": "2fb6cc9c4caa6a36", @@ -157,6 +158,7 @@ "gsd-core/references/gates.md": "bd79c7f90c8cb8d7", "gsd-core/references/git-integration.md": "77bf9dff38b2c9d4", "gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7", + "gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1", "gsd-core/references/honest-verifier.md": "8815c9fc18c35719", "gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f", "gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987", @@ -242,7 +244,7 @@ "gsd-core/templates/milestone.md": "74d2f750ae9f4a9c", "gsd-core/templates/phase-prompt.md": "b811bf951092df2f", "gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370", - "gsd-core/templates/project.md": "ab4af6becca2bb23", + "gsd-core/templates/project.md": "4f311fb1b05b823b", "gsd-core/templates/requirements.md": "a44de4c2f146e473", "gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0", "gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f", @@ -295,7 +297,7 @@ "gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb", "gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f", "gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1", - "gsd-core/workflows/do.md": "8f460af710c8f6a4", + "gsd-core/workflows/do.md": "7512dd1892f118a1", "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", @@ -312,10 +314,10 @@ "gsd-core/workflows/graduation.md": "47f1594c88c08501", "gsd-core/workflows/health.md": "107e3c72e76d9535", "gsd-core/workflows/help.md": "5d040504b9ab35e3", - "gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7", - "gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995", - "gsd-core/workflows/help/modes/full.md": "96abbac7f3f10e32", - "gsd-core/workflows/help/modes/topic.md": "6762e41e3291ae24", + "gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0", + "gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50", + "gsd-core/workflows/help/modes/full.md": "895b35f264530d24", + "gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d", "gsd-core/workflows/import.md": "3d3fa603ceb8bc9f", "gsd-core/workflows/inbox.md": "437f981ef9ae7b26", "gsd-core/workflows/ingest-docs.md": "c859921c811ac11b", @@ -333,6 +335,7 @@ "gsd-core/workflows/next.md": "13fb800f2472d970", "gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b", "gsd-core/workflows/note.md": "5a99eb396c744619", + "gsd-core/workflows/onboard.md": "6f9e6c0b484271a9", "gsd-core/workflows/pause-work.md": "f2b33bba5593d422", "gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc", "gsd-core/workflows/plan-phase.md": "a886ba9bdf4d0baf", @@ -414,7 +417,7 @@ "skills/gsd-ns-context/skills/docs-update/SKILL.md": "8fb602920a333d73", "skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "6de7eeaaf4939e5d", "skills/gsd-ns-context/skills/graphify/SKILL.md": "d54c2b44e8059299", - "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "ce7f2382e4086b68", + "skills/gsd-ns-context/skills/map-codebase/SKILL.md": "f48d48b43e2cc4bd", "skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "40a31ad049374297", "skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "c3f412d5a64f3921", "skills/gsd-ns-ideate/SKILL.md": "4a0d2691054b23e5", @@ -442,7 +445,7 @@ "skills/gsd-ns-manage/skills/update/SKILL.md": "01ca0efbdb8f6efa", "skills/gsd-ns-manage/skills/workspace/SKILL.md": "c6c07625a373e6a3", "skills/gsd-ns-manage/skills/workstreams/SKILL.md": "f4e54cb9b1ca0442", - "skills/gsd-ns-project/SKILL.md": "a58b3170197968be", + "skills/gsd-ns-project/SKILL.md": "5d7ec93b195555e7", "skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "a6eb7edcfd23c7e4", "skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "d7f6202222d1b26e", "skills/gsd-ns-project/skills/import/SKILL.md": "0a734021e0b86481", @@ -450,6 +453,7 @@ "skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "c77f6c8ce7c57db9", "skills/gsd-ns-project/skills/new-milestone/SKILL.md": "3aad804c48d77474", "skills/gsd-ns-project/skills/new-project/SKILL.md": "e3cfd1fdbc2c3406", + "skills/gsd-ns-project/skills/onboard/SKILL.md": "84519552f7396347", "skills/gsd-ns-project/skills/profile-user/SKILL.md": "f57ad5e5c5899100", "skills/gsd-ns-project/skills/review-backlog/SKILL.md": "1708aab6cb919223", "skills/gsd-ns-review/SKILL.md": "7badceb8627d8154", From 6a15ab93450e532af6e11064c548bf29694a9fba Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 22:57:05 -0400 Subject: [PATCH 64/75] test(#2003): add regression tests for --runtime override on capability state/loop render-hooks Mirrors the #1160 installed-layout block for the runtime auto-detection gap. Covers: runtimeOverride='claude' bypasses persisted config.runtime:'codex'; no override still honours persisted runtime (regression guard); alias canonicalization (codex-app -> codex); and an end-to-end CLI test proving 'capability state --runtime claude' resolves the Claude config dir despite a persisted runtime:'codex'. Expected RED against unfixed resolveCapabilityRuntimeState (no runtimeOverride param) and unfixed gsd-tools.cjs (no --runtime parsing for capability state / loop render-hooks). --- tests/capability-state.test.cjs | 93 ++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/tests/capability-state.test.cjs b/tests/capability-state.test.cjs index 66bba4e9c..2757e3b5f 100644 --- a/tests/capability-state.test.cjs +++ b/tests/capability-state.test.cjs @@ -15,10 +15,11 @@ const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); -const { cleanup } = require('./helpers.cjs'); +const { cleanup, runGsdTools } = require('./helpers.cjs'); const { resolveCapabilityState, + resolveCapabilityRuntimeState, isCapabilityActive, _isSafePropKey, _loadInstalledSkillsManifest, @@ -1810,3 +1811,93 @@ describe('#1459 IC-04: capability-state threads gsdHome to the overlay loader', } }); }); + +describe('regressions: --runtime override bypasses persisted runtime (#2003)', () => { + // #2003: `capability state` and `loop render-hooks` parsed only --config-dir, + // never --runtime. resolveCapabilityRuntimeState derived the config dir from + // resolveRuntime(cwd) (GSD_RUNTIME → config.runtime → 'claude'), so a repo + // with persisted runtime:"codex" resolved the config dir to ~/.codex — where + // the Claude skill isn't installed → surfaced:false. Fix: thread an explicit + // --runtime override through both commands into resolveCapabilityRuntimeState + // so it bypasses the persisted-runtime fallback (mirrors the update-context / + // effort sync precedent). + + function writePersistedRuntime(tmpDir, runtime) { + fs.mkdirSync(path.join(tmpDir, '.planning', 'phases'), { recursive: true }); + fs.writeFileSync( + path.join(tmpDir, '.planning', 'config.json'), + JSON.stringify({ runtime }), + 'utf8', + ); + } + + test('resolveCapabilityRuntimeState: runtimeOverride="claude" bypasses persisted config.runtime:"codex"', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-override-')); + try { + writePersistedRuntime(tmpDir, 'codex'); + const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs'); + const expectedClaudeDir = runtimeHomes.getGlobalConfigDir('claude'); + const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex'); + // Persisted runtime is codex; explicit override is claude. The override + // MUST win (resolveRuntime is never consulted when an override is given, + // so GSD_RUNTIME env cannot interfere either). + const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, 'claude'); + assert.strictEqual(result.runtimeConfigDir, expectedClaudeDir, + '--runtime claude must override persisted runtime:"codex"'); + assert.notStrictEqual(result.runtimeConfigDir, expectedCodexDir, + 'must NOT resolve to the codex config dir when --runtime claude is explicit'); + } finally { + cleanup(tmpDir); + } + }); + + test('resolveCapabilityRuntimeState: no override still honours persisted config.runtime (unchanged, regression guard)', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-no-override-')); + // Control GSD_RUNTIME so resolveRuntime deterministically reads config.runtime. + const savedGsdRuntime = process.env.GSD_RUNTIME; + delete process.env.GSD_RUNTIME; + try { + writePersistedRuntime(tmpDir, 'codex'); + const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs'); + const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex'); + // No override → persisted codex wins (existing behavior preserved). + const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, undefined); + assert.strictEqual(result.runtimeConfigDir, expectedCodexDir, + 'without --runtime, persisted config.runtime:"codex" still drives resolution (unchanged)'); + } finally { + if (savedGsdRuntime === undefined) delete process.env.GSD_RUNTIME; + else process.env.GSD_RUNTIME = savedGsdRuntime; + cleanup(tmpDir); + } + }); + + test('resolveCapabilityRuntimeState: runtimeOverride canonicalizes aliases (codex-app -> codex)', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-alias-')); + try { + writePersistedRuntime(tmpDir, 'claude'); + const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs'); + const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex'); + // Alias "codex-app" canonicalizes to "codex" via runtime-name-policy. + const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, 'codex-app'); + assert.strictEqual(result.runtimeConfigDir, expectedCodexDir, + '--runtime codex-app (alias) must canonicalize to codex'); + } finally { + cleanup(tmpDir); + } + }); + + test('CLI: `capability state --runtime claude` reports the Claude config dir despite persisted runtime:"codex"', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-cli-')); + try { + writePersistedRuntime(tmpDir, 'codex'); + const result = runGsdTools('capability state --runtime claude --raw', tmpDir); + assert.ok(result.success, `capability state --runtime should succeed: ${result.error || ''}`); + const parsed = JSON.parse(result.output); + const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs'); + assert.strictEqual(parsed.runtimeConfigDir, runtimeHomes.getGlobalConfigDir('claude'), + '`capability state --runtime claude` must resolve to the Claude config dir, not the persisted codex dir'); + } finally { + cleanup(tmpDir); + } + }); +}); From ab82e73af32be7476b34cad2f6fb2cbabe67530d Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 22:57:05 -0400 Subject: [PATCH 65/75] fix(#2003): add --runtime override to capability state + loop render-hooks resolveCapabilityRuntimeState derived the config dir from resolveRuntime(cwd) (GSD_RUNTIME -> config.runtime -> 'claude') when no --config-dir was passed, so a repo with persisted runtime:'codex' resolved the config dir to ~/.codex where the Claude skill isn't installed -> surfaced:false / hooks silently no-op when the operator drove from Claude Code. capability state and loop render-hooks parsed only --config-dir, never --runtime, so there was no way to assert the actually-active runtime. Add a runtimeOverride param to resolveCapabilityRuntimeState (canonicalized via runtime-name-policy so aliases like codex-app work); when present it short-circuits the persisted-runtime fallback and resolves getGlobalConfigDir for the explicit runtime. Thread --runtime through cmdCapabilityState and cmdLoopRenderHooks, and parse it in gsd-tools.cjs for both commands (dual --runtime X / --runtime=X form, mirroring --config-dir and the existing capability-set --runtime precedent). Help text updated. Without the override, behavior is byte-identical to today (regression-guarded). --- gsd-core/bin/gsd-tools.cjs | 49 ++++++++++++++++++++++++++++++++++++-- src/capability-state.cts | 46 ++++++++++++++++++++++++++--------- src/loop-resolver.cts | 8 ++++++- 3 files changed, 89 insertions(+), 14 deletions(-) diff --git a/gsd-core/bin/gsd-tools.cjs b/gsd-core/bin/gsd-tools.cjs index c3cec6716..99c806ef3 100755 --- a/gsd-core/bin/gsd-tools.cjs +++ b/gsd-core/bin/gsd-tools.cjs @@ -179,14 +179,23 @@ * * Loop Extension Point Queries (ADR-857 phase 3c): * loop render-hooks Resolve + render active Capability hooks at a loop point + * [--config-dir ] [--runtime ] [--active-cap ] * Returns JSON envelope { point, activeHooks, rendered } * Valid points: discuss:pre/post, plan:pre/post, * execute:pre/wave:pre/wave:post/post, verify:pre/post, ship:pre/post + * --runtime: override the auto-detected runtime (#2003) so the config + * dir resolves to that runtime's home even when + * .planning/config.json persists a different runtime. * * Capability State (ADR-857 phase 4b): - * capability state [--config-dir ] Resolve per-capability install/surface/hook-activation state + * capability state [--config-dir ] [--runtime ] Resolve per-capability install/surface/hook-activation state * Returns JSON envelope { runtimeConfigDir, capabilities[] } * --config-dir: runtime config dir (default: auto-detect current runtime) + * --runtime: override the auto-detected runtime (#2003); bypasses the + * GSD_RUNTIME → config.runtime → 'claude' precedence so a + * repo with a persisted runtime can still resolve another + * runtime's config dir (e.g. driving Claude Code from a + * repo that persists runtime:"codex"). * * GSD-2 Migration: * from-gsd2 [--path ] [--force] [--dry-run] @@ -1598,9 +1607,28 @@ async function runCommand(command, args, cwd, raw, defaultValue, originalCommand } loopActiveCap = value; } + // --runtime (#2003): explicit runtime override so the config-dir + // resolution bypasses the persisted-runtime fallback (GSD_RUNTIME → + // config.runtime). Mirrors the --config-dir dual-form (--runtime X / + // --runtime=X) and the capability-set --runtime precedent. + let loopRuntime = undefined; + const runtimeEqArg = args.find(arg => arg.startsWith('--runtime=')); + const runtimeIdx = args.indexOf('--runtime'); + if (runtimeEqArg) { + const value = runtimeEqArg.slice('--runtime='.length).trim(); + if (!value) error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined); + loopRuntime = value; + } else if (runtimeIdx !== -1) { + const value = args[runtimeIdx + 1]; + if (!value || value.startsWith('--')) { + error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined); + } + loopRuntime = value; + } loopResolver.cmdLoopRenderHooks(cwd, args[2], raw, { configDir: loopConfigDir ? path.resolve(loopConfigDir) : undefined, activeCap: loopActiveCap, + runtime: loopRuntime, }); } else { error( @@ -1752,7 +1780,24 @@ async function runCommand(command, args, cwd, raw, defaultValue, originalCommand configDir = configDirVal; } const resolvedConfigDir = configDir ? path.resolve(configDir) : null; - capabilityState.cmdCapabilityState(cwd, resolvedConfigDir, raw, {}); + // --runtime (#2003): explicit runtime override so the config-dir + // resolution bypasses the persisted-runtime fallback. Dual-form like + // --config-dir (--runtime X / --runtime=X). + let stateRuntime = undefined; + const stateRuntimeEqArg = args.find(arg => arg.startsWith('--runtime=')); + const stateRuntimeIdx = args.indexOf('--runtime'); + if (stateRuntimeEqArg) { + const value = stateRuntimeEqArg.slice('--runtime='.length).trim(); + if (!value) error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined); + stateRuntime = value; + } else if (stateRuntimeIdx !== -1) { + const value = args[stateRuntimeIdx + 1]; + if (!value || value.startsWith('--')) { + error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined); + } + stateRuntime = value; + } + capabilityState.cmdCapabilityState(cwd, resolvedConfigDir, raw, { runtime: stateRuntime }); } else if (capSubcommand === 'set') { // capability set [--on|--off|--enable|--disable] [--gate =]... [--config-dir ] [--runtime ] [--scope ] const capId = args[2]; diff --git a/src/capability-state.cts b/src/capability-state.cts index a43b16f3b..55e9318aa 100644 --- a/src/capability-state.cts +++ b/src/capability-state.cts @@ -441,6 +441,7 @@ function resolveCapabilityRuntimeState( cwd: string, runtimeConfigDir: string | undefined | null, configOverride?: Record, + runtimeOverride?: string, ): ResolveCapabilityRuntimeStateResult { const warnings: string[] = []; @@ -460,15 +461,35 @@ function resolveCapabilityRuntimeState( const runtimeHomes = require('./runtime-homes.cjs') as { getGlobalConfigDir: (runtime: string) => string; }; - // eslint-disable-next-line @typescript-eslint/no-require-imports - const runtimeSlash = require('./runtime-slash.cjs') as { - resolveRuntime: (projectDir: string | null | undefined) => string; - }; - // Detect the active runtime via GSD_RUNTIME → config.runtime → 'claude'. - // resolveRuntime reads config.json directly (no side effects) and returns - // a lowercased canonical runtime name. - const detectedRuntime = runtimeSlash.resolveRuntime(cwd); - resolvedConfigDir = runtimeHomes.getGlobalConfigDir(detectedRuntime); + // #2003: an explicit --runtime override bypasses the persisted-runtime + // fallback (GSD_RUNTIME → config.runtime → 'claude') so, e.g., a repo with + // persisted runtime:"codex" resolves the Claude config dir when the operator + // is driving from Claude Code. Canonicalize via runtime-name-policy (handles + // aliases like codex-app → codex); if canonicalization yields nothing, fall + // through to the persisted-runtime resolution below. Mirrors the update- + // context / effort sync precedent (read/diagnostic paths accepting both + // --config-dir and --runtime). + if (typeof runtimeOverride === 'string' && runtimeOverride.trim() !== '') { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const runtimeNamePolicy = require('./runtime-name-policy.cjs') as { + canonicalizeRuntimeName: (value: unknown) => string | null; + }; + const canonical = runtimeNamePolicy.canonicalizeRuntimeName(runtimeOverride); + if (canonical) { + resolvedConfigDir = runtimeHomes.getGlobalConfigDir(canonical); + } + } + if (!resolvedConfigDir) { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const runtimeSlash = require('./runtime-slash.cjs') as { + resolveRuntime: (projectDir: string | null | undefined) => string; + }; + // Detect the active runtime via GSD_RUNTIME → config.runtime → 'claude'. + // resolveRuntime reads config.json directly (no side effects) and returns + // a lowercased canonical runtime name. + const detectedRuntime = runtimeSlash.resolveRuntime(cwd); + resolvedConfigDir = runtimeHomes.getGlobalConfigDir(detectedRuntime); + } } catch { // Defensive fallback: use ~/.claude if the canonical resolver throws. // eslint-disable-next-line @typescript-eslint/no-require-imports @@ -569,9 +590,12 @@ function cmdCapabilityState( cwd: string, runtimeConfigDir: string | undefined | null, raw: boolean, - _options: Record = {}, + options: Record = {}, ): void { - const result = resolveCapabilityRuntimeState(cwd, runtimeConfigDir); + // #2003: thread an explicit --runtime override so the config-dir resolution + // bypasses the persisted-runtime fallback (GSD_RUNTIME → config.runtime). + const runtimeOverride = typeof options['runtime'] === 'string' ? options['runtime'] : undefined; + const result = resolveCapabilityRuntimeState(cwd, runtimeConfigDir, undefined, runtimeOverride); for (const warning of result.warnings) { coreError(`capability state: ${warning}`); } diff --git a/src/loop-resolver.cts b/src/loop-resolver.cts index 7df0af4df..1b0d3b1aa 100644 --- a/src/loop-resolver.cts +++ b/src/loop-resolver.cts @@ -475,6 +475,12 @@ function cmdLoopRenderHooks( const runtimeConfigDir = typeof options['configDir'] === 'string' ? options['configDir'] : undefined; + // #2003: thread an explicit --runtime override into the capability-state + // resolver so the config-dir resolution bypasses the persisted-runtime + // fallback (GSD_RUNTIME → config.runtime). Without this, a repo with persisted + // runtime:"codex" resolves the config dir to ~/.codex and execute:post / + // verify:post hooks silently no-op when the operator drives from Claude Code. + const runtimeOverride = typeof options['runtime'] === 'string' ? options['runtime'] : undefined; // Load the config snapshot ONCE and share it with both the capability-state // resolver (via configOverride) and loop-hook resolution, so federated keys // present in loadConfig resolve identically for `active` and for hook when/ @@ -488,7 +494,7 @@ function cmdLoopRenderHooks( } catch { config = {}; } - const state = resolveCapabilityRuntimeState(cwd, runtimeConfigDir, config) as { + const state = resolveCapabilityRuntimeState(cwd, runtimeConfigDir, config, runtimeOverride) as { warnings?: string[]; capabilities: Array<{ id: string; enabled?: boolean; active: boolean }>; }; From 49552b3485ef67ab63b71e74ba25074ac606dc83 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 22:57:39 -0400 Subject: [PATCH 66/75] docs(#2003): add changeset fragment for --runtime override --- .changeset/noble-foxes-purr.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/noble-foxes-purr.md diff --git a/.changeset/noble-foxes-purr.md b/.changeset/noble-foxes-purr.md new file mode 100644 index 000000000..8f49e2e58 --- /dev/null +++ b/.changeset/noble-foxes-purr.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 0 +--- +**`capability state` and `loop render-hooks` now accept `--runtime` to override the auto-detected runtime** — previously both commands parsed only `--config-dir`, so the runtime config dir was derived from the persisted `.planning/config.json` runtime (precedence `GSD_RUNTIME` → `config.runtime` → `claude`). A repo that persisted `runtime:"codex"` resolved the config dir to `~/.codex`, where the Claude skill isn't installed, so every skill-bearing capability reported `surfaced:false` and `execute:post`/`verify:post` hooks silently no-op'd when the operator drove GSD from Claude Code. `--runtime ` (canonicalized, so aliases like `codex-app` work) now bypasses that fallback so the config dir resolves to the explicitly-named runtime's home. Behavior without the flag is unchanged. (#2003) From def745fa6bf384efb28327f90520d352c01a11d8 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 23:09:54 -0400 Subject: [PATCH 67/75] test(#2003): regenerate golden-install-parity fixtures for gsd-tools.cjs change The --runtime parsing + help-text edit to gsd-core/bin/gsd-tools.cjs changes the installed file's content (gsd-tools.cjs is installed and compared by the golden snapshot, unlike gsd-core/bin/lib/ which is excluded). Regenerated via UPDATE_GOLDEN=1; every runtime's manifest updates exactly one line (the gsd-tools.cjs hash). --- tests/fixtures/golden-install-parity/antigravity.json | 2 +- tests/fixtures/golden-install-parity/augment.json | 2 +- tests/fixtures/golden-install-parity/claude.json | 2 +- tests/fixtures/golden-install-parity/cline.json | 2 +- tests/fixtures/golden-install-parity/codebuddy.json | 2 +- tests/fixtures/golden-install-parity/codex.json | 2 +- tests/fixtures/golden-install-parity/copilot.json | 2 +- tests/fixtures/golden-install-parity/cursor.json | 2 +- tests/fixtures/golden-install-parity/hermes.json | 2 +- tests/fixtures/golden-install-parity/kilo.json | 2 +- tests/fixtures/golden-install-parity/kimi.json | 2 +- tests/fixtures/golden-install-parity/opencode.json | 2 +- tests/fixtures/golden-install-parity/qwen.json | 2 +- tests/fixtures/golden-install-parity/trae.json | 2 +- tests/fixtures/golden-install-parity/windsurf.json | 2 +- tests/fixtures/golden-install-parity/zcode.json | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index dfa090c3c..828b5aa55 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -38,7 +38,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", - "gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6", + "gsd-core/bin/gsd-tools.cjs": "f2dd7a6993dc12f1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index b8c79276f..b11068a30 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -108,7 +108,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 23232b818..61fab429f 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -37,7 +37,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index b4bee850c..57b75c397 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -41,7 +41,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf", - "gsd-core/bin/gsd-tools.cjs": "13640341aa311ae3", + "gsd-core/bin/gsd-tools.cjs": "c6818560fbd9f8e1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 5151d0025..ff6963ad3 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -108,7 +108,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 5dc6e7282..7e334a502 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -73,7 +73,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index e547fb848..608acbaad 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -39,7 +39,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", - "gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6", + "gsd-core/bin/gsd-tools.cjs": "f2dd7a6993dc12f1", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index e09f7dd30..01081c29a 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -108,7 +108,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828", - "gsd-core/bin/gsd-tools.cjs": "887e2cb9ebdb609d", + "gsd-core/bin/gsd-tools.cjs": "2493822b0ae27980", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 38fb62f79..6101532d4 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -38,7 +38,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f", - "gsd-core/bin/gsd-tools.cjs": "cbdd5da1b973c6ae", + "gsd-core/bin/gsd-tools.cjs": "3d032fe88d2dc09b", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index e3a6692da..5d890290e 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -108,7 +108,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 2e019bbd2..38a6bf88a 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -74,7 +74,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index 4e83858d7..2cd9274fd 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -108,7 +108,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 84c168619..7d69d0606 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -38,7 +38,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2", - "gsd-core/bin/gsd-tools.cjs": "1118403709188168", + "gsd-core/bin/gsd-tools.cjs": "6e2a3fff91bacb3e", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 837e7cf47..fffc076bb 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -38,7 +38,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527", - "gsd-core/bin/gsd-tools.cjs": "fa4db2ce1f77ef99", + "gsd-core/bin/gsd-tools.cjs": "2ed2d11d5be017e2", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index c242d071f..93396735f 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -38,7 +38,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2", - "gsd-core/bin/gsd-tools.cjs": "92e0f7b7eb55af51", + "gsd-core/bin/gsd-tools.cjs": "ba7396b5e12d9b70", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 2f09d5f90..d506e7cd6 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -108,7 +108,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47", + "gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb", From 327b6409e820c13647bb6b272989b4e0504c7300 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 23:32:06 -0400 Subject: [PATCH 68/75] fix(#2003): address code+security review findings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - warn (don't silently ignore) when --runtime is an unknown runtime that canonicalizeRuntimeName rejects; the warning surfaces via warnings[] so a typo like --runtime cluade or a runtime known to runtime-homes but not the alias manifest (e.g. grok) no longer silently resolves to the persisted runtime's config dir on this diagnostic command [M-1] - add end-to-end CLI test for loop render-hooks --runtime (the exact command the bug report calls out as silently no-op'ing) [L-2] - add closed-vocabulary rejection test: crafted --runtime values (../../etc/passwd, __proto__, --config-dir, garbage) are rejected, warn, and fall through to the persisted runtime — pins the security-load-bearing contract [NIT-01] - add boundary tests: --config-dir wins over --runtime (precedence); missing --runtime value errors with USAGE [N-1] Both orthogonal reviews returned APPROVE with no Critical/High findings. Security review confirmed --runtime cannot coerce getGlobalConfigDir into an arbitrary path (closed-vocabulary Map lookup + registry hash-key gate) and does not expand the trust surface beyond the existing operator-controlled --config-dir flag. --- src/capability-state.cts | 10 ++++ tests/capability-state.test.cjs | 83 +++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/src/capability-state.cts b/src/capability-state.cts index 55e9318aa..42fad2b9c 100644 --- a/src/capability-state.cts +++ b/src/capability-state.cts @@ -477,6 +477,16 @@ function resolveCapabilityRuntimeState( const canonical = runtimeNamePolicy.canonicalizeRuntimeName(runtimeOverride); if (canonical) { resolvedConfigDir = runtimeHomes.getGlobalConfigDir(canonical); + } else { + // #2003: unknown runtime override — warn (don't silently ignore the + // explicit input) and fall through to persisted-runtime resolution. + // Avoids a silent-wrong-result on this diagnostic command for typos + // (e.g. "cluade") or runtimes known to runtime-homes but not yet to + // the alias manifest (e.g. "grok"). The warning surfaces via the + // `warnings[]` channel consumed by cmdCapabilityState/cmdLoopRenderHooks. + warnings.push( + `--runtime "${runtimeOverride}" is not a known runtime; falling back to auto-detected/persisted runtime resolution`, + ); } } if (!resolvedConfigDir) { diff --git a/tests/capability-state.test.cjs b/tests/capability-state.test.cjs index 2757e3b5f..bd49f73ba 100644 --- a/tests/capability-state.test.cjs +++ b/tests/capability-state.test.cjs @@ -1900,4 +1900,87 @@ describe('regressions: --runtime override bypasses persisted runtime (#2003)', ( cleanup(tmpDir); } }); + + // L-2 (review): end-to-end CLI test for loop render-hooks --runtime — the exact + // command the bug report calls out as silently no-op'ing. Guards the copy-pasted + // arg parsing in gsd-tools.cjs from diverging from the capability-state branch. + test('CLI: `loop render-hooks verify:post --runtime claude` resolves against the Claude config dir', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-loop-cli-')); + try { + writePersistedRuntime(tmpDir, 'codex'); + const result = runGsdTools('loop render-hooks verify:post --runtime claude --raw', tmpDir); + assert.ok(result.success, `loop render-hooks --runtime should succeed: ${result.error || ''}`); + const parsed = JSON.parse(result.output); + // The envelope carries activeHooks/rendered; the key assertion is that it + // ran without silently no-op'ing against the codex dir. A non-empty + // point + a rendered string (even "_No active hooks..._") proves the + // command executed against the resolved (claude) config dir rather than + // erroring or emitting nothing. + assert.strictEqual(parsed.point, 'verify:post', 'render-hooks must echo the requested point'); + assert.ok(typeof parsed.rendered === 'string', 'render-hooks must produce a rendered string'); + } finally { + cleanup(tmpDir); + } + }); + + // M-1 + NIT-01 (review): unknown / crafted --runtime values are REJECTED by the + // closed-vocabulary canonicalizer, warn, and fall through to the persisted + // runtime (never embedded into a path). This is the security-load-bearing + // contract — pin it so a future refactor can't silently break it. + test('resolveCapabilityRuntimeState: unknown/crafted --runtime is rejected (closed vocabulary), warns, and falls through to persisted runtime', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-reject-')); + const savedGsdRuntime = process.env.GSD_RUNTIME; + delete process.env.GSD_RUNTIME; + try { + writePersistedRuntime(tmpDir, 'codex'); + const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs'); + const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex'); + const crafted = ['../../etc/passwd', '__proto__', 'constructor', '--config-dir', 'garbage', 'foo bar', 'cluade']; + for (const bad of crafted) { + const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, bad); + assert.strictEqual(result.runtimeConfigDir, expectedCodexDir, + `crafted --runtime "${bad}" must fall through to persisted codex dir, not be embedded in a path`); + assert.ok(result.warnings.some((w) => w.includes('--runtime') && w.includes(bad)), + `crafted --runtime "${bad}" must emit a warning naming the rejected value`); + } + } finally { + if (savedGsdRuntime === undefined) delete process.env.GSD_RUNTIME; + else process.env.GSD_RUNTIME = savedGsdRuntime; + cleanup(tmpDir); + } + }); + + // N-1 (review): CLI arg-parsing boundary — --config-dir wins over --runtime + // (most-explicit input takes precedence), and missing --runtime value errors. + test('CLI: --config-dir takes precedence over --runtime when both are given', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-precedence-')); + const explicitDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-explicit-cfg-')); + try { + writePersistedRuntime(tmpDir, 'codex'); + const result = runGsdTools( + `capability state --config-dir ${explicitDir} --runtime claude --raw`, + tmpDir, + ); + assert.ok(result.success, `capability state with both flags should succeed: ${result.error || ''}`); + const parsed = JSON.parse(result.output); + assert.strictEqual(parsed.runtimeConfigDir, explicitDir, + '--config-dir (explicit path) must win over --runtime when both are present'); + } finally { + cleanup(explicitDir); + cleanup(tmpDir); + } + }); + + test('CLI: `capability state --runtime` with no value errors with USAGE', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-missing-')); + try { + writePersistedRuntime(tmpDir, 'codex'); + const result = runGsdTools('capability state --runtime', tmpDir); + assert.ok(!result.success, 'missing --runtime value must produce a non-zero exit'); + assert.ok(/Missing value for --runtime/.test(result.error || ''), + `error must name the missing --runtime value: ${result.error || ''}`); + } finally { + cleanup(tmpDir); + } + }); }); From 579ad30eaec3fd0e1d83ebdbc19e2ce3444f2aba Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 23:44:25 -0400 Subject: [PATCH 69/75] docs(#2003): backfill changeset pr number to 2051 --- .changeset/noble-foxes-purr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/noble-foxes-purr.md b/.changeset/noble-foxes-purr.md index 8f49e2e58..e53da8a32 100644 --- a/.changeset/noble-foxes-purr.md +++ b/.changeset/noble-foxes-purr.md @@ -1,5 +1,5 @@ --- type: Fixed -pr: 0 +pr: 2051 --- **`capability state` and `loop render-hooks` now accept `--runtime` to override the auto-detected runtime** — previously both commands parsed only `--config-dir`, so the runtime config dir was derived from the persisted `.planning/config.json` runtime (precedence `GSD_RUNTIME` → `config.runtime` → `claude`). A repo that persisted `runtime:"codex"` resolved the config dir to `~/.codex`, where the Claude skill isn't installed, so every skill-bearing capability reported `surfaced:false` and `execute:post`/`verify:post` hooks silently no-op'd when the operator drove GSD from Claude Code. `--runtime ` (canonicalized, so aliases like `codex-app` work) now bypasses that fallback so the config dir resolves to the explicitly-named runtime's home. Behavior without the flag is unchanged. (#2003) From 3c7d722ed9ef2421115914e6537bc3c405bd7bf3 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 23:58:27 -0400 Subject: [PATCH 70/75] docs(#1990): add ADR-1990 onboard projection module --- docs/adr/1990-onboard-projection-module.md | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/adr/1990-onboard-projection-module.md diff --git a/docs/adr/1990-onboard-projection-module.md b/docs/adr/1990-onboard-projection-module.md new file mode 100644 index 000000000..8e67eb5a9 --- /dev/null +++ b/docs/adr/1990-onboard-projection-module.md @@ -0,0 +1,69 @@ +# Onboard Projection Module owns deterministic brownfield repo-state detection and onboarding route selection + +- **Status:** Proposed +- **Date:** 2026-07-06 +- **Issue:** #1990 +- **Implementation:** PR #1994 + +## Context + +GSD already ships strong individual primitives for adopting an existing codebase: `/gsd:map-codebase` (parallel codebase analysis), `/gsd:ingest-docs` (classify and consolidate existing ADR/PRD/SPEC/RFC docs), and `/gsd:new-project` (planning initialization). What it lacked was a single guided entry point that inspects a brownfield repository and tells the user *which primitive runs first*. + +Left to prose alone, that ordering is ambiguous and unsafe: a user can initialize planning before a codebase map exists, skip relevant design docs, or overwrite/duplicate `.planning/` context instead of reusing it. The ordering is not a matter of taste — it is a **dependency graph** (a map should exist before planning; existing design docs should be ingested before a fresh `/gsd:new-project`; nothing should clobber an in-progress `.planning/`). A dependency graph that decides the next safe action from filesystem state is a *projection*, not something a workflow's natural-language instructions can evaluate reliably or test. + +GSD already has the seam for this. The **Init Command Module** (`src/init.cts` → `gsd-core/bin/lib/init.cjs`) owns the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles that init workflows consume, alongside the projection-module precedent set by the **Planning Path Projection Module** (ADR-0006) and the **Shell Command Projection Module** (ADR-0009). Adding `/gsd:onboard` as free-form workflow prose that scans the tree inline would put untested, non-deterministic filesystem logic in markdown — precisely the anti-pattern those projection modules exist to prevent. + +## Decision + +Introduce the **Onboard Projection Module** (`src/onboard-projection.cts` → `gsd-core/bin/lib/onboard-projection.cjs`) as the Seam that owns **deterministic detection of brownfield repository state and the selection of the next onboarding action**. It is a pure, side-effect-free projection consumed by the Init Command Module's `initOnboard` handler and rendered by the `/gsd:onboard` workflow. It never writes; detection and route selection are a function of repository state only. + +**Detected state (inputs):** + +| Signal | Rule / invariant | +|---|---| +| Brownfield code present | Depth-capped recursive scan for source files (`hasCodeFilesInternal`) OR a recognized package manifest (`hasPackageFileInternal`). | +| Generated / vendor exclusion | Scan skips `CODE_SCAN_SKIP_DIRS` (`node_modules`, `dist`, `build`, `.next`, `.nuxt`, `.svelte-kit`, `coverage`, `vendor`, `.venv`, `venv`) so vendored trees never produce a false brownfield positive. | +| Codebase-map completeness | Whether `.planning/codebase/` holds the canonical map artifacts. | +| Existing design docs | Presence of ADR/PRD/SPEC/RFC-style candidates (root, nested, and segment-based). | +| Partial planning state | Whether some but not all of `PROJECT.md` / `REQUIREMENTS.md` / `ROADMAP.md` / `STATE.md` exist. | + +**Route selection (output), ordered by dependency, not by convenience:** + +1. Brownfield code without a complete `.planning/codebase/` map → hand off to `/gsd:map-codebase` (or `/gsd:map-codebase --fast` in fast mode). +2. Design-doc candidates present and no project yet → offer `/gsd:ingest-docs` **before** `/gsd:new-project`. +3. Otherwise → `/gsd:new-project`. + +The gate order is load-bearing: **partial-planning and fast-map-completeness are evaluated before the docs-ingest branch**, so a half-mapped or half-initialized repo is never routed past the step it still owes. Handoff commands are runtime-formatted (`buildHandoffCommands` / `formatGsdSlash`) so the projected next command is correct for the installed runtime's slash syntax. + +**Safety invariants (the reason this is a Module, not a helper):** + +- **Idempotent / no silent overwrite.** Onboarding never mutates existing tracked `.planning/` artifacts; re-running leaves them byte-unchanged. +- **`SUMMARY.md` is a trailing artifact.** `.planning/onboarding/SUMMARY.md` is written only *after* project setup exists, and only if absent. +- **"Complete" is a conjunction.** Onboarding does not report complete until `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist — no single-file short-circuit. +- **Text-mode parity.** `--text` renders the same gate decisions as numbered plain-text prompts, so runtimes without an interactive picker get identical routing. + +## What stays OUTSIDE this Module + +- **The primitives themselves.** `/gsd:map-codebase`, `/gsd:ingest-docs`, and `/gsd:new-project` retain their own behavior; the Module only *chooses and orders* them. It projects the route; it does not re-implement the destinations. +- **Writing planning artifacts.** All `.planning/` writes remain owned by the destination commands and the Installer/planning modules. The projection is read-only. +- **The workflow's rendering.** `gsd-core/workflows/onboard.md` owns menu/gate presentation; the command `commands/gsd/onboard.md` (and its skill mirror) owns delegation. The Module owns only the state→route decision they consume. + +## Consequences + +- Brownfield onboarding becomes a single, testable entry point with deterministic routing, rather than order-of-operations folklore in prose. The projection is unit-tested (`tests/onboard-command.test.cjs`) for brownfield/greenfield detection, vendor-dir exclusion, gate ordering (partial-planning before docs-ingest), idempotency/no-mutation, and runtime-formatted handoffs. +- The Init Command Module gains one more heavyweight handler (`initOnboard`) with the same `{ data: }` contract as its siblings — no new dispatch shape. +- **New maintenance coupling, now explicit.** The Module's completeness checks must track the canonical `.planning/codebase/` artifact list and the routing targets' identities; if `/gsd:map-codebase` / `/gsd:ingest-docs` / `/gsd:new-project` change their entry contracts, this projection must follow. This ADR records that coupling as the known cost of centralizing the routing decision (the alternative — duplicating the decision across each primitive — is worse). +- No new runtime dependencies; no change to existing command semantics (additive). + +## Open questions + +- Should codebase-map completeness be sourced from a single shared predicate (owned by the map module) rather than re-encoded here, so the two cannot drift? +- The `/gsd:onboard` workflow sources its `gsd_run` bootstrap from a shared `references/gsd-run-resolver.md` snippet rather than inlining it. If that delegation pattern is adopted by other workflows, it likely deserves its own short ADR — noting it here so the precedent is visible rather than silently established. + +## References + +- ADR-0006 — Planning Path Projection Module (projection-module precedent for `.planning` path resolution). +- ADR-0009 — Shell Command Projection Module (runtime-aware projection precedent). +- Init Command Module (`src/init.cts` → `gsd-core/bin/lib/init.cjs`) — owner of the `init.*` handler family that consumes this projection via `initOnboard`. +- `CONTEXT.md` § Init Command Module — where the onboarding projection is registered. +- Issue #1990 — feature spec and acceptance criteria. From e8fb05e9655f2d1a87fa1a6b8d1b5687e368f6eb Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 6 Jul 2026 23:58:50 -0400 Subject: [PATCH 71/75] docs(#1990): index ADR-1990 in adr README --- docs/adr/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/adr/README.md b/docs/adr/README.md index 5922a7422..945e088cc 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -64,6 +64,7 @@ See **[CONTRIBUTING.md — "Proposing an ADR or PRD"](../../CONTRIBUTING.md#prop | [1769-state-md-transition-module.md](1769-state-md-transition-module.md) | STATE.md Transition Module — intent-based transitions over scattered RMW callbacks | Proposed | | [1817-state-md-rebuild-derivability-contract.md](1817-state-md-rebuild-derivability-contract.md) | STATE.md rebuild — derivability contract (capstone 11th transition) | Accepted | | [2008-command-exit-zero-gate.md](2008-command-exit-zero-gate.md) | Generic gate-predicate evaluator with a `command-exit-zero` kind (#2008) | Accepted | +| [1990-onboard-projection-module.md](1990-onboard-projection-module.md) | Onboard Projection Module owns deterministic brownfield repo-state detection and onboarding route selection | Proposed | ## Seam map From d0b8eacd3ce404fe02b3fa6f57c48bb59f7306b5 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Tue, 7 Jul 2026 00:01:55 -0400 Subject: [PATCH 72/75] docs(#1990): rename ADR to Existing Code Onboarding --- docs/adr/1990-existing-code-onboarding.md | 69 +++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/adr/1990-existing-code-onboarding.md diff --git a/docs/adr/1990-existing-code-onboarding.md b/docs/adr/1990-existing-code-onboarding.md new file mode 100644 index 000000000..aa9b47c3f --- /dev/null +++ b/docs/adr/1990-existing-code-onboarding.md @@ -0,0 +1,69 @@ +# Existing Code Onboarding Module owns deterministic repo-state detection and onboarding route selection + +- **Status:** Proposed +- **Date:** 2026-07-06 +- **Issue:** #1990 +- **Implementation:** PR #1994 + +## Context + +GSD already ships strong individual primitives for adopting an existing codebase: `/gsd:map-codebase` (parallel codebase analysis), `/gsd:ingest-docs` (classify and consolidate existing ADR/PRD/SPEC/RFC docs), and `/gsd:new-project` (planning initialization). What it lacked was a single guided entry point that inspects a brownfield repository and tells the user *which primitive runs first*. + +Left to prose alone, that ordering is ambiguous and unsafe: a user can initialize planning before a codebase map exists, skip relevant design docs, or overwrite/duplicate `.planning/` context instead of reusing it. The ordering is not a matter of taste — it is a **dependency graph** (a map should exist before planning; existing design docs should be ingested before a fresh `/gsd:new-project`; nothing should clobber an in-progress `.planning/`). A dependency graph that decides the next safe action from filesystem state is a *projection*, not something a workflow's natural-language instructions can evaluate reliably or test. + +GSD already has the seam for this. The **Init Command Module** (`src/init.cts` → `gsd-core/bin/lib/init.cjs`) owns the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles that init workflows consume, alongside the projection-module precedent set by the **Planning Path Projection Module** (ADR-0006) and the **Shell Command Projection Module** (ADR-0009). Adding `/gsd:onboard` as free-form workflow prose that scans the tree inline would put untested, non-deterministic filesystem logic in markdown — precisely the anti-pattern those projection modules exist to prevent. + +## Decision + +Introduce the **Existing Code Onboarding Module** (implemented as the `src/onboard-projection.cts` → `gsd-core/bin/lib/onboard-projection.cjs` projection) as the Seam that owns **deterministic detection of brownfield repository state and the selection of the next onboarding action**. It is a pure, side-effect-free projection consumed by the Init Command Module's `initOnboard` handler and rendered by the `/gsd:onboard` workflow. It never writes; detection and route selection are a function of repository state only. + +**Detected state (inputs):** + +| Signal | Rule / invariant | +|---|---| +| Brownfield code present | Depth-capped recursive scan for source files (`hasCodeFilesInternal`) OR a recognized package manifest (`hasPackageFileInternal`). | +| Generated / vendor exclusion | Scan skips `CODE_SCAN_SKIP_DIRS` (`node_modules`, `dist`, `build`, `.next`, `.nuxt`, `.svelte-kit`, `coverage`, `vendor`, `.venv`, `venv`) so vendored trees never produce a false brownfield positive. | +| Codebase-map completeness | Whether `.planning/codebase/` holds the canonical map artifacts. | +| Existing design docs | Presence of ADR/PRD/SPEC/RFC-style candidates (root, nested, and segment-based). | +| Partial planning state | Whether some but not all of `PROJECT.md` / `REQUIREMENTS.md` / `ROADMAP.md` / `STATE.md` exist. | + +**Route selection (output), ordered by dependency, not by convenience:** + +1. Brownfield code without a complete `.planning/codebase/` map → hand off to `/gsd:map-codebase` (or `/gsd:map-codebase --fast` in fast mode). +2. Design-doc candidates present and no project yet → offer `/gsd:ingest-docs` **before** `/gsd:new-project`. +3. Otherwise → `/gsd:new-project`. + +The gate order is load-bearing: **partial-planning and fast-map-completeness are evaluated before the docs-ingest branch**, so a half-mapped or half-initialized repo is never routed past the step it still owes. Handoff commands are runtime-formatted (`buildHandoffCommands` / `formatGsdSlash`) so the projected next command is correct for the installed runtime's slash syntax. + +**Safety invariants (the reason this is a Module, not a helper):** + +- **Idempotent / no silent overwrite.** Onboarding never mutates existing tracked `.planning/` artifacts; re-running leaves them byte-unchanged. +- **`SUMMARY.md` is a trailing artifact.** `.planning/onboarding/SUMMARY.md` is written only *after* project setup exists, and only if absent. +- **"Complete" is a conjunction.** Onboarding does not report complete until `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist — no single-file short-circuit. +- **Text-mode parity.** `--text` renders the same gate decisions as numbered plain-text prompts, so runtimes without an interactive picker get identical routing. + +## What stays OUTSIDE this Module + +- **The primitives themselves.** `/gsd:map-codebase`, `/gsd:ingest-docs`, and `/gsd:new-project` retain their own behavior; the Module only *chooses and orders* them. It projects the route; it does not re-implement the destinations. +- **Writing planning artifacts.** All `.planning/` writes remain owned by the destination commands and the Installer/planning modules. The projection is read-only. +- **The workflow's rendering.** `gsd-core/workflows/onboard.md` owns menu/gate presentation; the command `commands/gsd/onboard.md` (and its skill mirror) owns delegation. The Module owns only the state→route decision they consume. + +## Consequences + +- Brownfield onboarding becomes a single, testable entry point with deterministic routing, rather than order-of-operations folklore in prose. The projection is unit-tested (`tests/onboard-command.test.cjs`) for brownfield/greenfield detection, vendor-dir exclusion, gate ordering (partial-planning before docs-ingest), idempotency/no-mutation, and runtime-formatted handoffs. +- The Init Command Module gains one more heavyweight handler (`initOnboard`) with the same `{ data: }` contract as its siblings — no new dispatch shape. +- **New maintenance coupling, now explicit.** The Module's completeness checks must track the canonical `.planning/codebase/` artifact list and the routing targets' identities; if `/gsd:map-codebase` / `/gsd:ingest-docs` / `/gsd:new-project` change their entry contracts, this projection must follow. This ADR records that coupling as the known cost of centralizing the routing decision (the alternative — duplicating the decision across each primitive — is worse). +- No new runtime dependencies; no change to existing command semantics (additive). + +## Open questions + +- Should codebase-map completeness be sourced from a single shared predicate (owned by the map module) rather than re-encoded here, so the two cannot drift? +- The `/gsd:onboard` workflow sources its `gsd_run` bootstrap from a shared `references/gsd-run-resolver.md` snippet rather than inlining it. If that delegation pattern is adopted by other workflows, it likely deserves its own short ADR — noting it here so the precedent is visible rather than silently established. + +## References + +- ADR-0006 — Planning Path Projection Module (projection-module precedent for `.planning` path resolution). +- ADR-0009 — Shell Command Projection Module (runtime-aware projection precedent). +- Init Command Module (`src/init.cts` → `gsd-core/bin/lib/init.cjs`) — owner of the `init.*` handler family that consumes this projection via `initOnboard`. +- `CONTEXT.md` § Init Command Module — where the onboarding projection is registered. +- Issue #1990 — feature spec and acceptance criteria. From 1171499f3842b77864e39be9a351f48f7c4c8257 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Tue, 7 Jul 2026 00:01:56 -0400 Subject: [PATCH 73/75] docs(#1990): remove pre-rename ADR filename --- docs/adr/1990-onboard-projection-module.md | 69 ---------------------- 1 file changed, 69 deletions(-) delete mode 100644 docs/adr/1990-onboard-projection-module.md diff --git a/docs/adr/1990-onboard-projection-module.md b/docs/adr/1990-onboard-projection-module.md deleted file mode 100644 index 8e67eb5a9..000000000 --- a/docs/adr/1990-onboard-projection-module.md +++ /dev/null @@ -1,69 +0,0 @@ -# Onboard Projection Module owns deterministic brownfield repo-state detection and onboarding route selection - -- **Status:** Proposed -- **Date:** 2026-07-06 -- **Issue:** #1990 -- **Implementation:** PR #1994 - -## Context - -GSD already ships strong individual primitives for adopting an existing codebase: `/gsd:map-codebase` (parallel codebase analysis), `/gsd:ingest-docs` (classify and consolidate existing ADR/PRD/SPEC/RFC docs), and `/gsd:new-project` (planning initialization). What it lacked was a single guided entry point that inspects a brownfield repository and tells the user *which primitive runs first*. - -Left to prose alone, that ordering is ambiguous and unsafe: a user can initialize planning before a codebase map exists, skip relevant design docs, or overwrite/duplicate `.planning/` context instead of reusing it. The ordering is not a matter of taste — it is a **dependency graph** (a map should exist before planning; existing design docs should be ingested before a fresh `/gsd:new-project`; nothing should clobber an in-progress `.planning/`). A dependency graph that decides the next safe action from filesystem state is a *projection*, not something a workflow's natural-language instructions can evaluate reliably or test. - -GSD already has the seam for this. The **Init Command Module** (`src/init.cts` → `gsd-core/bin/lib/init.cjs`) owns the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles that init workflows consume, alongside the projection-module precedent set by the **Planning Path Projection Module** (ADR-0006) and the **Shell Command Projection Module** (ADR-0009). Adding `/gsd:onboard` as free-form workflow prose that scans the tree inline would put untested, non-deterministic filesystem logic in markdown — precisely the anti-pattern those projection modules exist to prevent. - -## Decision - -Introduce the **Onboard Projection Module** (`src/onboard-projection.cts` → `gsd-core/bin/lib/onboard-projection.cjs`) as the Seam that owns **deterministic detection of brownfield repository state and the selection of the next onboarding action**. It is a pure, side-effect-free projection consumed by the Init Command Module's `initOnboard` handler and rendered by the `/gsd:onboard` workflow. It never writes; detection and route selection are a function of repository state only. - -**Detected state (inputs):** - -| Signal | Rule / invariant | -|---|---| -| Brownfield code present | Depth-capped recursive scan for source files (`hasCodeFilesInternal`) OR a recognized package manifest (`hasPackageFileInternal`). | -| Generated / vendor exclusion | Scan skips `CODE_SCAN_SKIP_DIRS` (`node_modules`, `dist`, `build`, `.next`, `.nuxt`, `.svelte-kit`, `coverage`, `vendor`, `.venv`, `venv`) so vendored trees never produce a false brownfield positive. | -| Codebase-map completeness | Whether `.planning/codebase/` holds the canonical map artifacts. | -| Existing design docs | Presence of ADR/PRD/SPEC/RFC-style candidates (root, nested, and segment-based). | -| Partial planning state | Whether some but not all of `PROJECT.md` / `REQUIREMENTS.md` / `ROADMAP.md` / `STATE.md` exist. | - -**Route selection (output), ordered by dependency, not by convenience:** - -1. Brownfield code without a complete `.planning/codebase/` map → hand off to `/gsd:map-codebase` (or `/gsd:map-codebase --fast` in fast mode). -2. Design-doc candidates present and no project yet → offer `/gsd:ingest-docs` **before** `/gsd:new-project`. -3. Otherwise → `/gsd:new-project`. - -The gate order is load-bearing: **partial-planning and fast-map-completeness are evaluated before the docs-ingest branch**, so a half-mapped or half-initialized repo is never routed past the step it still owes. Handoff commands are runtime-formatted (`buildHandoffCommands` / `formatGsdSlash`) so the projected next command is correct for the installed runtime's slash syntax. - -**Safety invariants (the reason this is a Module, not a helper):** - -- **Idempotent / no silent overwrite.** Onboarding never mutates existing tracked `.planning/` artifacts; re-running leaves them byte-unchanged. -- **`SUMMARY.md` is a trailing artifact.** `.planning/onboarding/SUMMARY.md` is written only *after* project setup exists, and only if absent. -- **"Complete" is a conjunction.** Onboarding does not report complete until `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` all exist — no single-file short-circuit. -- **Text-mode parity.** `--text` renders the same gate decisions as numbered plain-text prompts, so runtimes without an interactive picker get identical routing. - -## What stays OUTSIDE this Module - -- **The primitives themselves.** `/gsd:map-codebase`, `/gsd:ingest-docs`, and `/gsd:new-project` retain their own behavior; the Module only *chooses and orders* them. It projects the route; it does not re-implement the destinations. -- **Writing planning artifacts.** All `.planning/` writes remain owned by the destination commands and the Installer/planning modules. The projection is read-only. -- **The workflow's rendering.** `gsd-core/workflows/onboard.md` owns menu/gate presentation; the command `commands/gsd/onboard.md` (and its skill mirror) owns delegation. The Module owns only the state→route decision they consume. - -## Consequences - -- Brownfield onboarding becomes a single, testable entry point with deterministic routing, rather than order-of-operations folklore in prose. The projection is unit-tested (`tests/onboard-command.test.cjs`) for brownfield/greenfield detection, vendor-dir exclusion, gate ordering (partial-planning before docs-ingest), idempotency/no-mutation, and runtime-formatted handoffs. -- The Init Command Module gains one more heavyweight handler (`initOnboard`) with the same `{ data: }` contract as its siblings — no new dispatch shape. -- **New maintenance coupling, now explicit.** The Module's completeness checks must track the canonical `.planning/codebase/` artifact list and the routing targets' identities; if `/gsd:map-codebase` / `/gsd:ingest-docs` / `/gsd:new-project` change their entry contracts, this projection must follow. This ADR records that coupling as the known cost of centralizing the routing decision (the alternative — duplicating the decision across each primitive — is worse). -- No new runtime dependencies; no change to existing command semantics (additive). - -## Open questions - -- Should codebase-map completeness be sourced from a single shared predicate (owned by the map module) rather than re-encoded here, so the two cannot drift? -- The `/gsd:onboard` workflow sources its `gsd_run` bootstrap from a shared `references/gsd-run-resolver.md` snippet rather than inlining it. If that delegation pattern is adopted by other workflows, it likely deserves its own short ADR — noting it here so the precedent is visible rather than silently established. - -## References - -- ADR-0006 — Planning Path Projection Module (projection-module precedent for `.planning` path resolution). -- ADR-0009 — Shell Command Projection Module (runtime-aware projection precedent). -- Init Command Module (`src/init.cts` → `gsd-core/bin/lib/init.cjs`) — owner of the `init.*` handler family that consumes this projection via `initOnboard`. -- `CONTEXT.md` § Init Command Module — where the onboarding projection is registered. -- Issue #1990 — feature spec and acceptance criteria. From bc751a64ecde27071673b2e183f7d418c1ad9fe6 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Tue, 7 Jul 2026 00:01:57 -0400 Subject: [PATCH 74/75] docs(#1990): point adr index at renamed file --- docs/adr/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/adr/README.md b/docs/adr/README.md index 945e088cc..03038a5c9 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -64,7 +64,7 @@ See **[CONTRIBUTING.md — "Proposing an ADR or PRD"](../../CONTRIBUTING.md#prop | [1769-state-md-transition-module.md](1769-state-md-transition-module.md) | STATE.md Transition Module — intent-based transitions over scattered RMW callbacks | Proposed | | [1817-state-md-rebuild-derivability-contract.md](1817-state-md-rebuild-derivability-contract.md) | STATE.md rebuild — derivability contract (capstone 11th transition) | Accepted | | [2008-command-exit-zero-gate.md](2008-command-exit-zero-gate.md) | Generic gate-predicate evaluator with a `command-exit-zero` kind (#2008) | Accepted | -| [1990-onboard-projection-module.md](1990-onboard-projection-module.md) | Onboard Projection Module owns deterministic brownfield repo-state detection and onboarding route selection | Proposed | +| [1990-existing-code-onboarding.md](1990-existing-code-onboarding.md) | Existing Code Onboarding Module owns deterministic repo-state detection and onboarding route selection | Proposed | ## Seam map From a6263bba8a1e1c6204662c2d6634a5411ef6f1c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Jul 2026 06:08:27 +0000 Subject: [PATCH 75/75] chore: sync next package version to 1.7.0-rc.4 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- capabilities/ai-integration/capability.json | 2 +- capabilities/antigravity/capability.json | 2 +- capabilities/assumption-delta/capability.json | 2 +- capabilities/audit/capability.json | 2 +- capabilities/augment/capability.json | 2 +- .../claude-orchestration/capability.json | 2 +- capabilities/claude/capability.json | 2 +- capabilities/cline/capability.json | 2 +- capabilities/code-review/capability.json | 2 +- capabilities/codebuddy/capability.json | 2 +- capabilities/codex/capability.json | 2 +- capabilities/copilot/capability.json | 2 +- capabilities/cursor/capability.json | 2 +- capabilities/drift/capability.json | 2 +- capabilities/external-job/capability.json | 2 +- capabilities/gap-analysis/capability.json | 2 +- capabilities/graphify/capability.json | 2 +- capabilities/hermes/capability.json | 2 +- capabilities/intel/capability.json | 2 +- capabilities/kilo/capability.json | 2 +- capabilities/kimi/capability.json | 2 +- capabilities/mempalace/capability.json | 2 +- capabilities/nyquist/capability.json | 2 +- capabilities/opencode/capability.json | 2 +- capabilities/pattern-mapper/capability.json | 2 +- capabilities/profile-pipeline/capability.json | 2 +- capabilities/qwen/capability.json | 2 +- capabilities/research/capability.json | 2 +- capabilities/schema-gate/capability.json | 2 +- capabilities/security/capability.json | 2 +- capabilities/tdd/capability.json | 2 +- capabilities/trae/capability.json | 2 +- capabilities/ui/capability.json | 2 +- capabilities/windsurf/capability.json | 2 +- capabilities/zcode/capability.json | 2 +- gsd-core/bin/lib/capability-registry.cjs | 102 +++++++++--------- package-lock.json | 4 +- package.json | 2 +- vscode/package.json | 2 +- 41 files changed, 92 insertions(+), 92 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b99a81103..56ac0ddb5 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ { "name": "gsd-core", "description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "source": "./", "author": { "name": "open-gsd", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index de21c6772..a90b6c123 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "gsd-core", "displayName": "GSD Core", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.", "author": { "name": "open-gsd", diff --git a/capabilities/ai-integration/capability.json b/capabilities/ai-integration/capability.json index 679673d94..998933a2d 100644 --- a/capabilities/ai-integration/capability.json +++ b/capabilities/ai-integration/capability.json @@ -1,7 +1,7 @@ { "id": "ai-integration", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "AI design contract", "description": "AI-SPEC design contract workflow for phases that build AI systems; owns the AI integration command, agents, and workflow.ai_integration_phase activation key.", "tier": "full", diff --git a/capabilities/antigravity/capability.json b/capabilities/antigravity/capability.json index 96b69c82f..585346c69 100644 --- a/capabilities/antigravity/capability.json +++ b/capabilities/antigravity/capability.json @@ -1,7 +1,7 @@ { "id": "antigravity", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Antigravity", "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.", "tier": "core", diff --git a/capabilities/assumption-delta/capability.json b/capabilities/assumption-delta/capability.json index 23333f0b7..439a0101e 100644 --- a/capabilities/assumption-delta/capability.json +++ b/capabilities/assumption-delta/capability.json @@ -1,7 +1,7 @@ { "id": "assumption-delta", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Assumption-delta architecture checkpoint", "description": "Rarely-firing advisory checkpoint that triggers when a phase makes something plural, optional, or chosen that used to be singular, required, or derived. Surfaces one identity-model question (promote the new general representation to primary, or add it alongside?) so a silent primary-key drift does not accumulate into a later user-facing bug. Non-blocking; fires only on a detected signal.", "tier": "full", diff --git a/capabilities/audit/capability.json b/capabilities/audit/capability.json index 40fcdc0dc..b2a563640 100644 --- a/capabilities/audit/capability.json +++ b/capabilities/audit/capability.json @@ -1,7 +1,7 @@ { "id": "audit", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Audit", "description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `gsd-tools audit-uat` (cross-phase UAT outstanding items) and `gsd-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).", "tier": "full", diff --git a/capabilities/augment/capability.json b/capabilities/augment/capability.json index e3f498bb3..82c930e0d 100644 --- a/capabilities/augment/capability.json +++ b/capabilities/augment/capability.json @@ -1,7 +1,7 @@ { "id": "augment", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Augment Code", "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", diff --git a/capabilities/claude-orchestration/capability.json b/capabilities/claude-orchestration/capability.json index 95474d492..f93ec0438 100644 --- a/capabilities/claude-orchestration/capability.json +++ b/capabilities/claude-orchestration/capability.json @@ -1,7 +1,7 @@ { "id": "claude-orchestration", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Claude orchestration (Workflow backend)", "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", "tier": "full", diff --git a/capabilities/claude/capability.json b/capabilities/claude/capability.json index f87679b19..7bdf6bd40 100644 --- a/capabilities/claude/capability.json +++ b/capabilities/claude/capability.json @@ -1,7 +1,7 @@ { "id": "claude", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Claude Code", "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.", "tier": "core", diff --git a/capabilities/cline/capability.json b/capabilities/cline/capability.json index df94b1775..1b6ab6513 100644 --- a/capabilities/cline/capability.json +++ b/capabilities/cline/capability.json @@ -1,7 +1,7 @@ { "id": "cline", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Cline", "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.", "tier": "core", diff --git a/capabilities/code-review/capability.json b/capabilities/code-review/capability.json index 9682c230a..3068c5d8c 100644 --- a/capabilities/code-review/capability.json +++ b/capabilities/code-review/capability.json @@ -1,7 +1,7 @@ { "id": "code-review", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Code review", "description": "Source-file code review and review-fix workflow support for completed execution work.", "tier": "full", diff --git a/capabilities/codebuddy/capability.json b/capabilities/codebuddy/capability.json index 5f8d45a6d..94f498e38 100644 --- a/capabilities/codebuddy/capability.json +++ b/capabilities/codebuddy/capability.json @@ -1,7 +1,7 @@ { "id": "codebuddy", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "CodeBuddy", "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", diff --git a/capabilities/codex/capability.json b/capabilities/codex/capability.json index 7cc85f78b..db6e68df3 100644 --- a/capabilities/codex/capability.json +++ b/capabilities/codex/capability.json @@ -1,7 +1,7 @@ { "id": "codex", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "OpenAI Codex CLI", "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.", "tier": "core", diff --git a/capabilities/copilot/capability.json b/capabilities/copilot/capability.json index b4c5df53a..ce17f48eb 100644 --- a/capabilities/copilot/capability.json +++ b/capabilities/copilot/capability.json @@ -1,7 +1,7 @@ { "id": "copilot", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "GitHub Copilot", "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.", "tier": "core", diff --git a/capabilities/cursor/capability.json b/capabilities/cursor/capability.json index 50136585d..b4877e40f 100644 --- a/capabilities/cursor/capability.json +++ b/capabilities/cursor/capability.json @@ -1,7 +1,7 @@ { "id": "cursor", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Cursor", "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.", "tier": "core", diff --git a/capabilities/drift/capability.json b/capabilities/drift/capability.json index 5ebea9d1a..996fbdaad 100644 --- a/capabilities/drift/capability.json +++ b/capabilities/drift/capability.json @@ -1,7 +1,7 @@ { "id": "drift", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Drift detection gates", "description": "Drift detection gates for the planning loop. At execute:wave:post: a blocking schema drift gate (detects schema files changed without a database push) and a non-blocking codebase drift gate (detects structural additions not reflected in STRUCTURE.md). At plan:pre: a non-blocking, warn-only codebase drift gate (gated on workflow.plan_drift_precheck) that flags a stale codebase map before planning, so plans are authored against a fresh STRUCTURE.md instead of discovering drift mid-execution.", "tier": "full", diff --git a/capabilities/external-job/capability.json b/capabilities/external-job/capability.json index a75babb08..1e6d0132e 100644 --- a/capabilities/external-job/capability.json +++ b/capabilities/external-job/capability.json @@ -1,7 +1,7 @@ { "id": "external-job", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Async external-job scheduler adapter", "description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).", "tier": "full", diff --git a/capabilities/gap-analysis/capability.json b/capabilities/gap-analysis/capability.json index a8a2be422..4be113763 100644 --- a/capabilities/gap-analysis/capability.json +++ b/capabilities/gap-analysis/capability.json @@ -1,7 +1,7 @@ { "id": "gap-analysis", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Post-planning gap analysis", "description": "Proactive, non-blocking post-planning coverage report. After all PLAN.md files are generated, cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md against plan bodies. Emits a Source | Item | Status table. Does not block phase advancement.", "tier": "standard", diff --git a/capabilities/graphify/capability.json b/capabilities/graphify/capability.json index e9cac6524..9f9d2cd1e 100644 --- a/capabilities/graphify/capability.json +++ b/capabilities/graphify/capability.json @@ -1,7 +1,7 @@ { "id": "graphify", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Knowledge graph", "description": "Build, query, and inspect the project knowledge graph in `.planning/graphs/`; exposes graphify CLI subcommands (build, query, status, diff) and the /gsd-graphify skill.", "tier": "full", diff --git a/capabilities/hermes/capability.json b/capabilities/hermes/capability.json index e38f13d63..d8764429e 100644 --- a/capabilities/hermes/capability.json +++ b/capabilities/hermes/capability.json @@ -1,7 +1,7 @@ { "id": "hermes", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Hermes Agent", "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", diff --git a/capabilities/intel/capability.json b/capabilities/intel/capability.json index 361c5b8f6..b6700cfdc 100644 --- a/capabilities/intel/capability.json +++ b/capabilities/intel/capability.json @@ -1,7 +1,7 @@ { "id": "intel", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Codebase intelligence", "description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `gsd-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/gsd-map-codebase` and `gsd-intel-updater`.", "tier": "full", diff --git a/capabilities/kilo/capability.json b/capabilities/kilo/capability.json index bc15624fc..f6477ba4a 100644 --- a/capabilities/kilo/capability.json +++ b/capabilities/kilo/capability.json @@ -1,7 +1,7 @@ { "id": "kilo", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Kilo Code", "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.", "tier": "core", diff --git a/capabilities/kimi/capability.json b/capabilities/kimi/capability.json index 67ee60eb2..875a62f19 100644 --- a/capabilities/kimi/capability.json +++ b/capabilities/kimi/capability.json @@ -1,7 +1,7 @@ { "id": "kimi", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Kimi CLI", "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.", "tier": "core", diff --git a/capabilities/mempalace/capability.json b/capabilities/mempalace/capability.json index 69b6a726f..d9173c317 100644 --- a/capabilities/mempalace/capability.json +++ b/capabilities/mempalace/capability.json @@ -1,7 +1,7 @@ { "id": "mempalace", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "MemPalace memory", "description": "Cross-session, cross-project memory: deliberate recall before discuss/plan and verbatim capture + temporal-KG sync at phase boundaries, via the MemPalace MCP server and CLI.", "tier": "full", diff --git a/capabilities/nyquist/capability.json b/capabilities/nyquist/capability.json index 02f512966..d5d754a46 100644 --- a/capabilities/nyquist/capability.json +++ b/capabilities/nyquist/capability.json @@ -1,7 +1,7 @@ { "id": "nyquist", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Nyquist validation", "description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.", "tier": "full", diff --git a/capabilities/opencode/capability.json b/capabilities/opencode/capability.json index 43d1d8815..ff98fcd10 100644 --- a/capabilities/opencode/capability.json +++ b/capabilities/opencode/capability.json @@ -1,7 +1,7 @@ { "id": "opencode", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "OpenCode", "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.", "tier": "core", diff --git a/capabilities/pattern-mapper/capability.json b/capabilities/pattern-mapper/capability.json index 6603b8728..d8e8c0de0 100644 --- a/capabilities/pattern-mapper/capability.json +++ b/capabilities/pattern-mapper/capability.json @@ -1,7 +1,7 @@ { "id": "pattern-mapper", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Pattern mapping", "description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.", "tier": "full", diff --git a/capabilities/profile-pipeline/capability.json b/capabilities/profile-pipeline/capability.json index baf943bbc..30e1993bb 100644 --- a/capabilities/profile-pipeline/capability.json +++ b/capabilities/profile-pipeline/capability.json @@ -1,7 +1,7 @@ { "id": "profile-pipeline", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Developer profiling pipeline", "description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `gsd-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /gsd-profile-user skill and gsd-user-profiler agent.", "tier": "full", diff --git a/capabilities/qwen/capability.json b/capabilities/qwen/capability.json index f0c622497..5047c4227 100644 --- a/capabilities/qwen/capability.json +++ b/capabilities/qwen/capability.json @@ -1,7 +1,7 @@ { "id": "qwen", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Qwen Code", "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", diff --git a/capabilities/research/capability.json b/capabilities/research/capability.json index 1e17d45eb..f4f72e49c 100644 --- a/capabilities/research/capability.json +++ b/capabilities/research/capability.json @@ -1,7 +1,7 @@ { "id": "research", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Phase research", "description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.", "tier": "standard", diff --git a/capabilities/schema-gate/capability.json b/capabilities/schema-gate/capability.json index 8977f52f0..7da7a1e03 100644 --- a/capabilities/schema-gate/capability.json +++ b/capabilities/schema-gate/capability.json @@ -1,7 +1,7 @@ { "id": "schema-gate", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Schema push detection gate", "description": "Detects ORM schema-relevant files in the phase scope during planning and injects a mandatory [BLOCKING] schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.", "tier": "full", diff --git a/capabilities/security/capability.json b/capabilities/security/capability.json index 076925bf5..3b350184d 100644 --- a/capabilities/security/capability.json +++ b/capabilities/security/capability.json @@ -1,7 +1,7 @@ { "id": "security", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Security enforcement", "description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.", "tier": "full", diff --git a/capabilities/tdd/capability.json b/capabilities/tdd/capability.json index 3ba1beb73..1231ae07b 100644 --- a/capabilities/tdd/capability.json +++ b/capabilities/tdd/capability.json @@ -1,7 +1,7 @@ { "id": "tdd", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Test-driven development", "description": "Injects TDD heuristics into the planner and enforces RED/GREEN gate compliance on type:tdd plans after execution. Owns workflow.tdd_mode; the --tdd CLI flag is the ephemeral override.", "tier": "full", diff --git a/capabilities/trae/capability.json b/capabilities/trae/capability.json index 9d6a20a39..c9e6b6fa4 100644 --- a/capabilities/trae/capability.json +++ b/capabilities/trae/capability.json @@ -1,7 +1,7 @@ { "id": "trae", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Trae IDE", "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.", "tier": "core", diff --git a/capabilities/ui/capability.json b/capabilities/ui/capability.json index 600228e4a..f20406dbe 100644 --- a/capabilities/ui/capability.json +++ b/capabilities/ui/capability.json @@ -1,7 +1,7 @@ { "id": "ui", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "UI design contracts", "description": "UI-SPEC design contract + retrospective UI audit for frontend phases.", "tier": "full", diff --git a/capabilities/windsurf/capability.json b/capabilities/windsurf/capability.json index 7421c4a7a..52ae07d6e 100644 --- a/capabilities/windsurf/capability.json +++ b/capabilities/windsurf/capability.json @@ -1,7 +1,7 @@ { "id": "windsurf", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Windsurf", "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.", "tier": "core", diff --git a/capabilities/zcode/capability.json b/capabilities/zcode/capability.json index debc29f01..48060579f 100644 --- a/capabilities/zcode/capability.json +++ b/capabilities/zcode/capability.json @@ -1,7 +1,7 @@ { "id": "zcode", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "ZCode", "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills//SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.", "tier": "core", diff --git a/gsd-core/bin/lib/capability-registry.cjs b/gsd-core/bin/lib/capability-registry.cjs index 33e4b1ce1..23acba5ba 100644 --- a/gsd-core/bin/lib/capability-registry.cjs +++ b/gsd-core/bin/lib/capability-registry.cjs @@ -10,7 +10,7 @@ const capabilities = { "ai-integration": { "id": "ai-integration", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "AI design contract", "description": "AI-SPEC design contract workflow for phases that build AI systems; owns the AI integration command, agents, and workflow.ai_integration_phase activation key.", "tier": "full", @@ -63,7 +63,7 @@ const capabilities = { "antigravity": { "id": "antigravity", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Antigravity", "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.", "tier": "core", @@ -157,7 +157,7 @@ const capabilities = { "assumption-delta": { "id": "assumption-delta", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Assumption-delta architecture checkpoint", "description": "Rarely-firing advisory checkpoint that triggers when a phase makes something plural, optional, or chosen that used to be singular, required, or derived. Surfaces one identity-model question (promote the new general representation to primary, or add it alongside?) so a silent primary-key drift does not accumulate into a later user-facing bug. Non-blocking; fires only on a detected signal.", "tier": "full", @@ -203,7 +203,7 @@ const capabilities = { "audit": { "id": "audit", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Audit", "description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `gsd-tools audit-uat` (cross-phase UAT outstanding items) and `gsd-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).", "tier": "full", @@ -240,7 +240,7 @@ const capabilities = { "augment": { "id": "augment", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Augment Code", "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -343,7 +343,7 @@ const capabilities = { "claude": { "id": "claude", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Claude Code", "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.", "tier": "core", @@ -427,7 +427,7 @@ const capabilities = { "claude-orchestration": { "id": "claude-orchestration", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Claude orchestration (Workflow backend)", "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.", "tier": "full", @@ -514,7 +514,7 @@ const capabilities = { "cline": { "id": "cline", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Cline", "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.", "tier": "core", @@ -575,7 +575,7 @@ const capabilities = { "code-review": { "id": "code-review", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Code review", "description": "Source-file code review and review-fix workflow support for completed execution work.", "tier": "full", @@ -636,7 +636,7 @@ const capabilities = { "codebuddy": { "id": "codebuddy", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "CodeBuddy", "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -739,7 +739,7 @@ const capabilities = { "codex": { "id": "codex", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "OpenAI Codex CLI", "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.", "tier": "core", @@ -810,7 +810,7 @@ const capabilities = { "copilot": { "id": "copilot", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "GitHub Copilot", "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.", "tier": "core", @@ -897,7 +897,7 @@ const capabilities = { "cursor": { "id": "cursor", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Cursor", "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.", "tier": "core", @@ -1000,7 +1000,7 @@ const capabilities = { "drift": { "id": "drift", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Drift detection gates", "description": "Drift detection gates for the planning loop. At execute:wave:post: a blocking schema drift gate (detects schema files changed without a database push) and a non-blocking codebase drift gate (detects structural additions not reflected in STRUCTURE.md). At plan:pre: a non-blocking, warn-only codebase drift gate (gated on workflow.plan_drift_precheck) that flags a stale codebase map before planning, so plans are authored against a fresh STRUCTURE.md instead of discovering drift mid-execution.", "tier": "full", @@ -1078,7 +1078,7 @@ const capabilities = { "external-job": { "id": "external-job", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Async external-job scheduler adapter", "description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).", "tier": "full", @@ -1161,7 +1161,7 @@ const capabilities = { "gap-analysis": { "id": "gap-analysis", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Post-planning gap analysis", "description": "Proactive, non-blocking post-planning coverage report. After all PLAN.md files are generated, cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md against plan bodies. Emits a Source | Item | Status table. Does not block phase advancement.", "tier": "standard", @@ -1202,7 +1202,7 @@ const capabilities = { "graphify": { "id": "graphify", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Knowledge graph", "description": "Build, query, and inspect the project knowledge graph in `.planning/graphs/`; exposes graphify CLI subcommands (build, query, status, diff) and the /gsd-graphify skill.", "tier": "full", @@ -1243,7 +1243,7 @@ const capabilities = { "hermes": { "id": "hermes", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Hermes Agent", "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -1314,7 +1314,7 @@ const capabilities = { "intel": { "id": "intel", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Codebase intelligence", "description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `gsd-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/gsd-map-codebase` and `gsd-intel-updater`.", "tier": "full", @@ -1366,7 +1366,7 @@ const capabilities = { "kilo": { "id": "kilo", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Kilo Code", "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.", "tier": "core", @@ -1459,7 +1459,7 @@ const capabilities = { "kimi": { "id": "kimi", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Kimi CLI", "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.", "tier": "core", @@ -1533,7 +1533,7 @@ const capabilities = { "mempalace": { "id": "mempalace", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "MemPalace memory", "description": "Cross-session, cross-project memory: deliberate recall before discuss/plan and verbatim capture + temporal-KG sync at phase boundaries, via the MemPalace MCP server and CLI.", "tier": "full", @@ -1707,7 +1707,7 @@ const capabilities = { "nyquist": { "id": "nyquist", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Nyquist validation", "description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.", "tier": "full", @@ -1757,7 +1757,7 @@ const capabilities = { "opencode": { "id": "opencode", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "OpenCode", "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.", "tier": "core", @@ -1846,7 +1846,7 @@ const capabilities = { "pattern-mapper": { "id": "pattern-mapper", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Pattern mapping", "description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.", "tier": "full", @@ -1900,7 +1900,7 @@ const capabilities = { "profile-pipeline": { "id": "profile-pipeline", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Developer profiling pipeline", "description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `gsd-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /gsd-profile-user skill and gsd-user-profiler agent.", "tier": "full", @@ -1977,7 +1977,7 @@ const capabilities = { "qwen": { "id": "qwen", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Qwen Code", "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -2052,7 +2052,7 @@ const capabilities = { "research": { "id": "research", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Phase research", "description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.", "tier": "standard", @@ -2104,7 +2104,7 @@ const capabilities = { "schema-gate": { "id": "schema-gate", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Schema push detection gate", "description": "Detects ORM schema-relevant files in the phase scope during planning and injects a mandatory [BLOCKING] schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.", "tier": "full", @@ -2150,7 +2150,7 @@ const capabilities = { "security": { "id": "security", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Security enforcement", "description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.", "tier": "full", @@ -2249,7 +2249,7 @@ const capabilities = { "tdd": { "id": "tdd", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Test-driven development", "description": "Injects TDD heuristics into the planner and enforces RED/GREEN gate compliance on type:tdd plans after execution. Owns workflow.tdd_mode; the --tdd CLI flag is the ephemeral override.", "tier": "full", @@ -2302,7 +2302,7 @@ const capabilities = { "trae": { "id": "trae", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Trae IDE", "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.", "tier": "core", @@ -2388,7 +2388,7 @@ const capabilities = { "ui": { "id": "ui", "role": "feature", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "UI design contracts", "description": "UI-SPEC design contract + retrospective UI audit for frontend phases.", "tier": "full", @@ -2483,7 +2483,7 @@ const capabilities = { "windsurf": { "id": "windsurf", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Windsurf", "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.", "tier": "core", @@ -2562,7 +2562,7 @@ const capabilities = { "zcode": { "id": "zcode", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "ZCode", "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills//SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.", "tier": "core", @@ -3535,7 +3535,7 @@ const runtimes = { "antigravity": { "id": "antigravity", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Antigravity", "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.", "tier": "core", @@ -3629,7 +3629,7 @@ const runtimes = { "augment": { "id": "augment", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Augment Code", "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -3732,7 +3732,7 @@ const runtimes = { "claude": { "id": "claude", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Claude Code", "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.", "tier": "core", @@ -3816,7 +3816,7 @@ const runtimes = { "cline": { "id": "cline", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Cline", "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.", "tier": "core", @@ -3877,7 +3877,7 @@ const runtimes = { "codebuddy": { "id": "codebuddy", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "CodeBuddy", "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -3980,7 +3980,7 @@ const runtimes = { "codex": { "id": "codex", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "OpenAI Codex CLI", "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.", "tier": "core", @@ -4051,7 +4051,7 @@ const runtimes = { "copilot": { "id": "copilot", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "GitHub Copilot", "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.", "tier": "core", @@ -4138,7 +4138,7 @@ const runtimes = { "cursor": { "id": "cursor", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Cursor", "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.", "tier": "core", @@ -4241,7 +4241,7 @@ const runtimes = { "hermes": { "id": "hermes", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Hermes Agent", "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -4312,7 +4312,7 @@ const runtimes = { "kilo": { "id": "kilo", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Kilo Code", "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.", "tier": "core", @@ -4405,7 +4405,7 @@ const runtimes = { "kimi": { "id": "kimi", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Kimi CLI", "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.", "tier": "core", @@ -4479,7 +4479,7 @@ const runtimes = { "opencode": { "id": "opencode", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "OpenCode", "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.", "tier": "core", @@ -4568,7 +4568,7 @@ const runtimes = { "qwen": { "id": "qwen", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Qwen Code", "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.", "tier": "core", @@ -4643,7 +4643,7 @@ const runtimes = { "trae": { "id": "trae", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Trae IDE", "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.", "tier": "core", @@ -4729,7 +4729,7 @@ const runtimes = { "windsurf": { "id": "windsurf", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "Windsurf", "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.", "tier": "core", @@ -4808,7 +4808,7 @@ const runtimes = { "zcode": { "id": "zcode", "role": "runtime", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "title": "ZCode", "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills//SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.", "tier": "core", diff --git a/package-lock.json b/package-lock.json index 715dae9b9..17ac44d02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@opengsd/gsd-core", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@opengsd/gsd-core", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "license": "MIT", "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.2.84", diff --git a/package.json b/package.json index 3f8d060e4..844d518ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@opengsd/gsd-core", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.", "main": ".opencode/plugins/gsd-core.js", "bin": { diff --git a/vscode/package.json b/vscode/package.json index f441d977d..19e308b9e 100644 --- a/vscode/package.json +++ b/vscode/package.json @@ -2,7 +2,7 @@ "name": "gsd-core-vscode", "displayName": "GSD Core", "description": "GSD orchestration engine embedded in VS Code (ADR-1239 IDE profile).", - "version": "1.7.0-rc.3", + "version": "1.7.0-rc.4", "publisher": "opengsd", "engines": { "vscode": "^1.90.0"