fix(prompt): clarify execute-phase active flags#1
Conversation
- Add language switch link to root README - Translate README.md to docs/zh-CN/README.md - Translate USER-GUIDE.md to docs/zh-CN/USER-GUIDE.md - Translate all 13 reference documents to docs/zh-CN/references/ Key terminology mappings: - context engineering → 上下文工程 - spec-driven development → 规格驱动开发 - context rot → 上下文衰减 - phase → 阶段 - milestone → 里程碑 - roadmap → 路线图 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…d#769) Hook files (gsd-statusline.js, gsd-check-update.js, gsd-context-monitor.js) are installed during updates but were never included in gsd-file-manifest.json. This means saveLocalPatches() could not detect user modifications to hooks, causing them to be silently overwritten on update with no backup. Add hooks/gsd-*.js to writeManifest() so the existing local patch detection system automatically backs up modified hooks to gsd-local-patches/ before overwriting, matching the behavior already in place for workflows, commands, and agents. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- fix(core): getMilestoneInfo() version regex `\d+\.\d+` only matched 2-segment versions (v1.2). Changed to `\d+(?:\.\d+)+` to support 3+ segments (v1.2.1, v2.0.1). Same fix in roadmap.cjs milestone extraction pattern. - fix(state): stripFrontmatter() used `^---\n` (LF-only) which failed to strip CRLF frontmatter blocks. When STATE.md had dual frontmatter blocks from prior CRLF corruption, each writeStateMd() call preserved the stale block and prepended a new wrong one. Now handles CRLF and strips all stacked frontmatter blocks. - fix(frontmatter): extractFrontmatter() always used the first --- block. When dual blocks exist from corruption, the first is stale. Now uses the last block (most recent sync).
Add Cursor as a fifth supported runtime alongside Claude Code, OpenCode, Gemini, and Codex. Cursor uses skills (~/.cursor/skills/gsd-*/SKILL.md) like Codex, with tool name mappings (Bash→Shell, Edit→StrReplace), subagent type conversion, and full Claude-to-Cursor content adaptation including project conventions (CLAUDE.md→.cursor/rules/, .claude/skills/ →.cursor/skills/) and brand references. Includes install, uninstall, interactive prompt, help text, manifest tracking, and .cjs/.js utility script conversion. Made-with: Cursor
On Windows, install.js resolves $HOME to the absolute path (e.g. C:/Users/matte/.claude/) in all workflow .md files. This breaks when ~/.claude is mounted into a Docker container where the path doesn't exist — Node interprets the Windows path as relative to CWD, producing paths like: /workspace/project/C:/Users/matte/.claude/get-shit-done/bin/gsd-tools.cjs For global installs, replace os.homedir() with ~ in pathPrefix so that paths like ~/.claude/get-shit-done/bin/gsd-tools.cjs work correctly across all environments. Local installs keep using resolved absolute paths since they may be outside $HOME. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The workflow spawns 4 background agents but didn't tell Claude how to wait for them. Without explicit TaskOutput instructions, the orchestrator displays "Waiting for agents to complete..." indefinitely. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add `config-new-project` CLI command that writes a complete,
fully-materialized `.planning/config.json` with sane defaults
instead of the previous partial template (6-7 user-chosen keys
only). Unset keys are no longer silently resolved at read time —
every key GSD reads is written explicitly at project creation.
Previously, missing keys were resolved silently by loadConfig()
defaults, making the effective config non-discoverable. Now every
key that GSD reads is written explicitly at project creation.
- buildNewProjectConfig() — single source of truth for all
defaults; merges hardcoded ← ~/.gsd/defaults.json ← user choices
- ensureConfigFile() refactored to reuse buildNewProjectConfig({})
instead of duplicating default logic (~40 lines removed)
- new-project.md Steps 2a and 5 updated to call config-new-project
instead of writing a hardcoded partial JSON template
- Test coverage for config.cjs: 78.96% → 93.81% statements,
100% functions; adds config-set-model-profile test suite
FIXES:
- VALID_CONFIG_KEYS extended with workflow.auto_advance,
workflow.node_repair, workflow.node_repair_budget,
hooks.context_warnings — these keys had hardcoded defaults
but were not settable via config-set
buildNewProjectConfig() merges ~/.gsd/defaults.json when present, so tests asserting concrete config values (model_profile, commit_docs, brave_search) would fail on machines with a personal defaults file. - Pass HOME=cwd as env override in runGsdTools — child process resolves os.homedir() to the temp directory, which has no .gsd/ subtree - Update three tests that previously wrote to the real ~/.gsd/ using fragile save/restore logic; they now write to tmpDir/.gsd/ instead, which is cleaned up automatically by afterEach - Remove now-unused `os` import from config.test.cjs
Before this PR, Step 5 derived nyquist_validation from depth !== "quick" (now granularity !== "coarse"). The new config-new-project call omitted it, silently defaulting to true even when the user selected "Coarse" granularity. Adds nyquist_validation back to the Step 5 JSON payload with an explicit inline rule: false when granularity=coarse, true otherwise.
…#1036) (gsd-build#1185) Users on OpenRouter or local models get unexpected API costs because GSD's default 'balanced' profile spawns specific Anthropic models for subagents. The 'inherit' profile exists but wasn't well-documented for this use case. Changes: - model-profiles.md: add 'Using Non-Anthropic Models' section explaining when and how to use inherit profile - model-profiles.md: update inherit description to mention OpenRouter and local models - settings.md: update Inherit option description to mention OpenRouter and local models (was only mentioning OpenCode) Closes gsd-build#1036
…#1173) (gsd-build#1183) The version detection script in update.md used a space-separated string for RUNTIME_DIRS and iterated with `for entry in $RUNTIME_DIRS`. This relies on word-splitting which works in bash but fails in zsh (zsh does not word-split unquoted variables by default), causing the entire string to be treated as one entry and detection to fall through to UNKNOWN. Fix: convert RUNTIME_DIRS and ORDERED_RUNTIME_DIRS from space-separated strings to proper arrays, and iterate with ${array[@]} syntax which works correctly in both bash and zsh. Closes gsd-build#1173
…k tool (gsd-build#1174) (gsd-build#1184) Runtimes like Antigravity don't have a Task tool for spawning subagents. When the agent encounters Task() calls, it falls back to browser_subagent which is meant for web browsing, not code analysis — causing gsd-map-codebase to fail. This adds: 1. A detect_runtime_capabilities step before spawn_agents 2. An explicit warning to NEVER use browser_subagent for code analysis 3. A sequential_mapping fallback step that performs all 4 mapping passes inline using file system tools when Task is unavailable Closes gsd-build#1174
…ofile-output (gsd-build#1170) New test files for 4 previously untested modules: model-profiles.test.cjs (15 tests): - MODEL_PROFILES data integrity (all agents, all profiles, valid aliases) - VALID_PROFILES list validation - getAgentToModelMapForProfile (balanced, budget, quality, agent count) - formatAgentToModelMapAsTable (header, separator, column alignment) template.test.cjs (11 tests): - template select: minimal/standard/complex heuristics, fallback - template fill: summary/plan/verification generation, --plan option - Error paths: existing file, unknown type, missing phase profile-pipeline.test.cjs (7 tests): - scan-sessions: empty dir, synthetic project, multi-session - extract-messages: user message extraction, meta/internal filtering - profile-questionnaire: structure validation profile-output.test.cjs (13 tests): - PROFILING_QUESTIONS data (fields, options, uniqueness) - CLAUDE_INSTRUCTIONS coverage (dimensions, instruction mapping) - write-profile: analysis JSON → USER-PROFILE.md - generate-claude-md: --auto generation, --force protection - generate-dev-preferences: analysis → preferences command Test count: 744 → 798 (+54 new tests, 0 failures)
…ts, standardize helpers (gsd-build#1169) Test consolidation: - Merged gemini-config.test.cjs + opencode-agent-conversion.test.cjs into runtime-converters.test.cjs (single file for small runtime converters) - Removed 11 duplicate tests from core.test.cjs: - 5 comparePhaseNum tests (authoritative copies in phase.test.cjs) - 6 normalizePhaseName tests (authoritative copies in phase.test.cjs) - Added note in core.test.cjs pointing to phase.test.cjs as canonical location Standardization: - core.test.cjs now uses createTempProject()/cleanup() from helpers.cjs instead of inline fs.mkdtempSync/fs.rmSync patterns File count: 21 → 19 test files Test count: 755 → 744 (11 duplicates removed, 0 coverage lost)
…uild#927) (gsd-build#1167) Adds a zero-friction command that detects the current project state and automatically invokes the next logical workflow step: - No phases → discuss first phase - Phase has no context → discuss - Phase has context but no plans → plan - Phase has plans but incomplete → execute - All plans complete → verify and complete phase - All phases complete → complete milestone - Paused → resume work No arguments needed — reads STATE.md, ROADMAP.md, and phase directories to determine progression. Designed for multi-project workflows. Closes gsd-build#927
…ompatibility (gsd-build#899) (gsd-build#1166) MSYS curl on Windows has SSL/TLS failures and path mangling issues. Replaced curl references in checkpoint and phase-prompt templates with Node.js fetch() which works cross-platform. Changes: - checkpoints.md: server readiness check uses fetch() instead of curl - checkpoints.md: added cross-platform note about curl vs fetch - checkpoints.md: verify tags use fetch instead of curl - phase-prompt.md: verify tags use fetch instead of curl Partially addresses gsd-build#899 (patch 1 of 6)
Prevents shipping hooks with JavaScript SyntaxError (like the duplicate const cwd declaration that caused PostToolUse errors for all users in v1.25.1). The build script now validates each hook file's syntax via vm.Script before copying to dist/. If any hook has a SyntaxError, the build fails with a clear error message and exits non-zero, blocking npm publish. Refs gsd-build#1107, gsd-build#1109, gsd-build#1125, gsd-build#1161
…session-report command (gsd-build#1153, gsd-build#1157, gsd-build#1161, gsd-build#1162) (gsd-build#1163) * fix: hook version tracking, stale hook detection, and stdin timeout increase - Add gsd-hook-version header to all hook files for version tracking (gsd-build#1153) - Install.js now stamps current version into hooks during installation - gsd-check-update.js detects stale hooks by comparing version headers - gsd-statusline.js shows warning when stale hooks are detected - Increase context monitor stdin timeout from 3s to 10s (gsd-build#1162) - Set +x permission on hook files during installation (gsd-build#1162) Fixes gsd-build#1153, gsd-build#1162, gsd-build#1161 * feat: add /gsd:session-report command for post-session summary generation Adds a new command that generates SESSION_REPORT.md with: - Work performed summary (phases touched, commits, files changed) - Key outcomes and decisions made - Active blockers and open items - Estimated resource usage metrics Reports are written to .planning/reports/ with date-stamped filenames. Closes gsd-build#1157 * test: update expected skill count from 39 to 40 for new session-report command
…itive milestone lookup (gsd-build#1145) (gsd-build#1146) stripShippedMilestones() uses a negative heuristic: strip all <details> blocks, assume what remains is the current milestone. This breaks when agents accidentally wrap the current milestone in <details> for collapsibility — all downstream consumers then see an empty milestone. Observed failure: cmdPhaseComplete() returns is_last_phase: true and next_phase: null for non-final phases because the current milestone's phases were stripped along with shipped ones. Added extractCurrentMilestone(content, cwd) — a positive lookup that: 1. Reads the current milestone version from STATE.md frontmatter 2. Falls back to 🚧 in-progress marker in ROADMAP.md 3. Finds the section heading matching that version 4. Returns only that section's content 5. Falls back to stripShippedMilestones() if version can't be determined Updated 12 call sites across 6 files to use extractCurrentMilestone: - core.cjs: getRoadmapPhaseInternal(), getMilestonePhaseFilter() - phase.cjs: cmdPhaseAdd(), cmdPhaseInsert(), cmdPhaseComplete() (2 sites) - roadmap.cjs: cmdRoadmapGetPhase(), cmdRoadmapAnalyze() - commands.cjs: stats/progress display - verify.cjs: phase verification (2 sites) - init.cjs: project initialization Kept stripShippedMilestones() for: - getMilestoneInfo() — determines the version itself, can't use positive lookup - replaceInCurrentMilestone() — write operations, conservative boundary - extractCurrentMilestone() fallback — when no version available All 755 tests pass. Fixes gsd-build#1145
…sd-build#991) (gsd-build#1141) Claude Code's Task tool sometimes doesn't resolve short aliases (opus, sonnet, haiku) and passes them directly to the API, causing 404s. Tasks then inherit the parent session's model instead of the configured one. Added: - MODEL_ALIAS_MAP in core.cjs mapping aliases to full model IDs - resolve_model_ids config option (default: false for backward compat) - resolveModelInternal() maps aliases when resolve_model_ids is true Usage: { "resolve_model_ids": true } This causes gsd-tools resolve-model to return 'claude-sonnet-4-5' instead of 'sonnet', which the Task tool passes to the API without needing alias resolution on Claude Code's side. The alias map is maintained per release. Users can also use model_overrides for full control. All 755 tests pass. Fixes gsd-build#991
…#1009) (gsd-build#1140) When plan-phase invokes discuss-phase as a nested Skill call, AskUserQuestion calls auto-resolve with empty answers — the user never sees the question UI. This is a Claude Code runtime bug with nested subcontexts. Made the 'Run discuss-phase first' path explicitly exit the workflow with a display message instead of risking nested invocation: - Added explicit warning: do NOT invoke as nested Skill/Task - Show the command for user to run as top-level - Exit the plan-phase workflow immediately Fixes gsd-build#1009
gsd-build#949) (gsd-build#1139) After /clear, Claude Code sometimes loses awareness of custom agent types and falls back to 'general-purpose'. This happens because the model doesn't re-read .claude/agents/ after context reset. Added <available_agent_types> sections to: - execute-phase.md: lists all 12 valid GSD agent types with descriptions - plan-phase.md: lists the 3 agent types used during planning The explicit listing in workflow instructions ensures the model always has an unambiguous reference to valid agent types, regardless of whether .claude/agents/ was re-read after /clear. Fixes gsd-build#949
…ns-node24 Upgrade GitHub Actions for Node 24 compatibility
On Windows, os.homedir() reads USERPROFILE instead of HOME. The 6
tests using { HOME: tmpDir } to sandbox ~/.gsd/ lookups failed on
windows-latest because the child process still resolved homedir to
the real user profile.
Pass USERPROFILE alongside HOME in all sandboxed test calls.
…config-crlf-features fix(codex-config): safely manage codex_hooks in existing configs
…esearch feat: add Exa and Firecrawl MCP support for research agents
…ify-work (gsd-build#1238) cmdInitPlanPhase, cmdInitExecutePhase, and cmdInitVerifyWork returned phase_found: false when the phase existed in ROADMAP.md but no phase directory had been created yet. This caused workflows to fail silently after /gsd:new-project, producing directories named null-null. cmdInitPhaseOp (used by discuss-phase) already had a ROADMAP fallback. Applied the same pattern to the three missing commands: when findPhaseInternal returns null, fall back to getRoadmapPhaseInternal and construct phaseInfo from the ROADMAP entry. Added 5 regression tests covering: - plan-phase ROADMAP fallback - execute-phase ROADMAP fallback - verify-work ROADMAP fallback - phase_found false when neither directory nor ROADMAP entry exists - disk directory preferred over ROADMAP fallback
…build#1250) loadConfig() defaulted commit_docs to true regardless of whether .planning/ was gitignored. The documented auto-detection only existed inside cmdCommit, so init commands returned commit_docs: true even when .planning/ was in .gitignore. This caused LLM executors to bypass the cmdCommit gate and re-commit planning files with raw git. Now loadConfig() checks isGitIgnored(cwd, '.planning/') when no explicit commit_docs value is set in config.json. If .planning/ is gitignored, commit_docs defaults to false. An explicit commit_docs value in config.json is always respected. Added 5 regression tests covering auto-detection, explicit overrides, and the no-config-file edge case.
gsd-workflow-guard.js was missing the // gsd-hook-version: {{GSD_VERSION}}
header that all other hook files have. The stale hook detection in
gsd-check-update.js scans all gsd-*.js files for this header and flags
any without it as stale (hookVersion: 'unknown'). This caused a
persistent '⚠ stale hooks — run /gsd:update' warning in the statusline
even on the latest version.
Added the version header to gsd-workflow-guard.js. Running /gsd:update
will reinstall the hook with the correct version stamp.
…ild#1246) The gsd-context-monitor PostToolUse hook was configured without a matcher or timeout, causing it to fire on every tool use including Read, Glob, and Grep. When multiple Read calls happen in parallel, some hook processes failed with errors. Added matcher: 'Bash|Edit|Write|MultiEdit|Agent|Task' to limit the hook to tools that actually modify context significantly. Added timeout: 10 to prevent hangs. Includes migration logic: existing installations without matcher/timeout get them added on next /gsd:update.
…-build#1244) Enhanced gsd-verifier's anti-pattern detection to catch: - Hardcoded empty data props (={[]}, ={{}}, ={null}) - 'not available' and 'not yet implemented' placeholder text - Data stub classification guidance (only flag when value flows to rendering without a data-fetching path) Added stub tracking to gsd-executor's summary creation: - Before writing SUMMARY, scan files for stub patterns - Document stubs in a '## Known Stubs' section - Block plan completion if stubs prevent the plan's goal
…ity (gsd-build#1243) Decisions in CONTEXT.md are now numbered (D-01, D-02, etc.) so downstream agents can reference them and the plan-checker can verify 100% coverage. Changes: - templates/context.md: Decisions use **D-XX:** prefix format - workflows/discuss-phase.md: write_context step numbers decisions - agents/gsd-planner.md: Self-check verifies decision ID references in task actions; tasks reference D-XX IDs for traceability - agents/gsd-plan-checker.md: Dimension 7 (Context Compliance) extracts D-XX IDs and verifies every decision has a task
ensureConfigFile(): keep our refactored version that delegates to
buildNewProjectConfig({}) instead of upstream's duplicated logic.
buildNewProjectConfig(): add firecrawl and exa_search API key
detection alongside existing brave_search, matching upstream's
new integrations.
…lback-1238 fix(init): add ROADMAP fallback to plan-phase, execute-phase, and verify-work
…gnore-autodetect-1250 fix(core): auto-detect commit_docs from gitignore in loadConfig
…flow-guard-1249 fix(hooks): add version header to gsd-workflow-guard.js
…matcher-1246 fix(install): add matcher and timeout to context-monitor hook
…-stub-detection-1244 enhancement(agents): add stub detection to verifier and executor
…-traceability-1243 enhancement(workflow): add decision IDs for discuss-to-plan traceability
…ew-project-config feat: materialize full config on new-project initialization
feat: add advisor mode with research-backed discussion
… input validation Defense-in-depth security hardening for a codebase where markdown files become LLM system prompts. Adds centralized security module, PreToolUse hook for injection detection, and CI-ready codebase scan. New files: - security.cjs: path traversal prevention, prompt injection scanner/sanitizer, safe JSON parsing, field name validation, shell arg validation - gsd-prompt-guard.js: PreToolUse hook scans .planning/ writes for injection - security.test.cjs: 62 unit tests for all security functions - prompt-injection-scan.test.cjs: CI scan of all agent/workflow/command files Hardened code paths: - readTextArgOrFile: path traversal guard (--prd, --text-file) - cmdStateUpdate/Patch: field name validation prevents regex injection - cmdCommit: sanitizeForPrompt strips invisible chars from commit messages - gsd-tools --fields: safeJsonParse wraps unprotected JSON.parse - cmdFrontmatterGet/Set: null byte rejection - cmdVerifyPathExists: null byte rejection - install.js: registers prompt guard hook, updates uninstaller Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ction-guards security: prompt injection guards, path traversal prevention, input validation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add documentation for all new v1.27 features: - 7 new commands (/gsd:fast, /gsd:review, /gsd:plant-seed, /gsd:thread, /gsd:add-backlog, /gsd:review-backlog, /gsd:pr-branch) - Security hardening (security.cjs, prompt guard hook, workflow guard hook) - Multi-repo workspace support, discussion audit trail, advisor mode - New config options (research_before_questions, hooks.workflow_guard) - Updated component counts in ARCHITECTURE.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…otes docs: update README and docs/ for v1.27 release
There was a problem hiding this comment.
Pull request overview
This PR clarifies /gsd:execute-phase flag semantics (flags are only “active” when explicitly present in $ARGUMENTS) and adds regression coverage to prevent runtimes from inferring --gaps-only from documentation text. It also includes substantial additional platform/workflow additions (new commands/workflows, hooks hardening, Node engine bump, and docs expansion).
Changes:
- Clarify execute-phase prompt contract so optional flags are not treated as implicitly active.
- Expand GSD workflows/commands/docs (ship/review/next/fast/audit-uat, branching, UAT debt tracking, etc.) and add new hooks.
- Update runtime/tooling expectations (Node >= 20, CI matrix changes, hook build validation, updated counts in install tests).
Reviewed changes
Copilot reviewed 99 out of 138 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/copilot-install.test.cjs | Updates expected installed skill/agent counts and golden agent list |
| tests/commands.test.cjs | Adds command-level regression tests (summary extraction; todo match-phase) |
| tests/claude-md.test.cjs | Adds tests for generate-claude-md and new-project workflow references |
| tests/agent-frontmatter.test.cjs | Adds workflow content regression assertions (execute-phase fallback, discussion log) |
| scripts/build-hooks.js | Adds syntax validation before copying hooks to dist; expands hook list |
| package.json | Bumps version and raises Node engine requirement |
| hooks/gsd-workflow-guard.js | Adds advisory PreToolUse hook warning on edits outside workflow context |
| hooks/gsd-statusline.js | Adds hook version header and “stale hooks” warning display |
| hooks/gsd-prompt-guard.js | Adds advisory PreToolUse prompt-injection scanner for .planning/ writes |
| hooks/gsd-context-monitor.js | Adds hook version header and raises stdin timeout for reliability |
| hooks/gsd-check-update.js | Adds hook version headers and stale-hook detection in cache output |
| get-shit-done/workflows/verify-work.md | Adds “blocked” inference and final status computation (partial vs complete) |
| get-shit-done/workflows/update.md | Fixes shell iteration portability by switching to arrays |
| get-shit-done/workflows/transition.md | Marks transition as internal and adds verification-debt surfacing behavior |
| get-shit-done/workflows/stats.md | Changes stats command invocation path |
| get-shit-done/workflows/ship.md | Adds shipping workflow to create PRs via gh and update state |
| get-shit-done/workflows/settings.md | Extends settings schema (hooks, quick branching, text mode, research Qs) |
| get-shit-done/workflows/session-report.md | Adds workflow for generating session report markdown |
| get-shit-done/workflows/review.md | Adds workflow for cross-AI plan review via external CLIs |
| get-shit-done/workflows/resume-project.md | Adds HANDOFF.json structured resume path and updates routing copy |
| get-shit-done/workflows/quick.md | Adds quick-task branching step |
| get-shit-done/workflows/progress.md | Adds partial UAT handling and cross-phase verification debt warning |
| get-shit-done/workflows/pr-branch.md | Adds workflow to filter .planning/ commits into PR-ready branch |
| get-shit-done/workflows/plant-seed.md | Adds workflow to capture structured “seed” ideas with trigger conditions |
| get-shit-done/workflows/plan-phase.md | Adds agent type list, discuss-phase nesting warning, requirements coverage gate |
| get-shit-done/workflows/pause-work.md | Adds HANDOFF.json structured handoff and expands captured pause context |
| get-shit-done/workflows/next.md | Adds auto-routing “next step” workflow |
| get-shit-done/workflows/new-milestone.md | Adds --reset-phase-numbers and phase dir archival safety behavior |
| get-shit-done/workflows/map-codebase.md | Adds sequential fallback mode when Task tool is unavailable |
| get-shit-done/workflows/help.md | Documents new commands and flags |
| get-shit-done/workflows/health.md | Updates repair semantics and adds Windows stale task dir diagnostics |
| get-shit-done/workflows/fast.md | Adds inline trivial-task workflow (no planning artifacts) |
| get-shit-done/workflows/execute-plan.md | Expands init fields; adds MCP preference; adds sub-repo commit flow |
| get-shit-done/workflows/audit-uat.md | Adds workflow for cross-phase UAT/verification audit |
| get-shit-done/templates/project.md | Clarifies embedded evolution rules linkage |
| get-shit-done/templates/phase-prompt.md | Updates verification examples to use fetch |
| get-shit-done/templates/discussion-log.md | Adds discussion-log template with audit-only constraints |
| get-shit-done/templates/context.md | Adds numbered decision IDs formatting |
| get-shit-done/templates/config.json | Adds planning.sub_repos default |
| get-shit-done/templates/claude-md.md | Adds workflow enforcement section marker and updates section counts |
| get-shit-done/templates/UAT.md | Adds partial status and blocked result semantics |
| get-shit-done/references/planning-config.md | Adds quick-branch template documentation |
| get-shit-done/references/model-profiles.md | Documents inherit for non-Anthropic providers |
| get-shit-done/references/git-integration.md | Documents --no-verify in parallel runs; adds sub_repos support |
| get-shit-done/references/checkpoints.md | Switches examples from curl to fetch for Windows compatibility |
| docs/zh-CN/references/ui-brand.md | Adds Chinese UI brand reference |
| docs/zh-CN/references/tdd.md | Adds Chinese TDD reference |
| docs/zh-CN/references/questioning.md | Adds Chinese questioning reference |
| docs/zh-CN/references/planning-config.md | Adds Chinese planning config reference |
| docs/zh-CN/references/phase-argument-parsing.md | Adds Chinese phase parsing reference |
| docs/zh-CN/references/model-profiles.md | Adds Chinese model profiles reference |
| docs/zh-CN/references/model-profile-resolution.md | Adds Chinese model profile resolution reference |
| docs/zh-CN/references/git-planning-commit.md | Adds Chinese git planning commit reference |
| docs/zh-CN/references/git-integration.md | Adds Chinese git integration reference |
| docs/zh-CN/references/decimal-phase-calculation.md | Adds Chinese decimal phase calculation reference |
| docs/zh-CN/references/continuation-format.md | Adds Chinese continuation format reference |
| docs/CONFIGURATION.md | Extends config schema docs (hooks, quick branching, research toggle) |
| docs/COMMANDS.md | Documents new commands (next, ship, session-report, audit-uat, fast, review, etc.) |
| docs/CLI-TOOLS.md | Updates CLI module counts and documents --no-verify |
| docs/ARCHITECTURE.md | Updates counts, documents new hooks/modules/artifacts |
| commands/gsd/thread.md | Adds thread command entry point |
| commands/gsd/ship.md | Adds ship command entry point |
| commands/gsd/session-report.md | Adds session-report command entry point |
| commands/gsd/review.md | Adds review command entry point |
| commands/gsd/review-backlog.md | Adds review-backlog command entry point |
| commands/gsd/pr-branch.md | Adds pr-branch command entry point |
| commands/gsd/plant-seed.md | Adds plant-seed command entry point |
| commands/gsd/next.md | Adds next command entry point |
| commands/gsd/fast.md | Adds fast command entry point |
| commands/gsd/execute-phase.md | Updates execute-phase argument hint and explicit flag activation rules |
| commands/gsd/discuss-phase.md | Updates discuss-phase argument hint to include new flags |
| commands/gsd/audit-uat.md | Adds audit-uat command entry point |
| commands/gsd/add-backlog.md | Adds add-backlog command entry point |
| agents/gsd-verifier.md | Expands stub detection patterns and adds classification guidance |
| agents/gsd-ui-researcher.md | Adds Exa/Firecrawl MCP tools and ordering guidance |
| agents/gsd-project-researcher.md | Adds Exa/Firecrawl MCP research guidance and source priority |
| agents/gsd-planner.md | Requires decision ID traceability in tasks/self-check |
| agents/gsd-plan-checker.md | Enforces decision ID coverage checks |
| agents/gsd-phase-researcher.md | Adds Exa/Firecrawl guidance and runtime state inventory requirement |
| agents/gsd-executor.md | Adds sub_repos-aware commit-to-subrepo guidance and stub tracking |
| agents/gsd-advisor-researcher.md | Adds new advisor researcher agent |
| README.zh-CN.md | Updates Chinese readme to include new runtimes/commands |
| README.md | Adds language links and documents new commands/security hardening |
| CHANGELOG.md | Adds 1.27.0 release notes and updates comparison links |
| .release-monitor.sh | Adds script to monitor GitHub releases and signal updates |
| .github/workflows/test.yml | Updates CI node matrix and action versions |
| .github/workflows/auto-label-issues.yml | Bumps github-script action major version |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| { | ||
| "name": "get-shit-done-cc", | ||
| "version": "1.25.1", | ||
| "version": "1.27.0", |
There was a problem hiding this comment.
The PR title/description focus on clarifying execute-phase flag activation, but the diff also includes a major version bump and a Node engine floor change (plus many new commands/workflows/hooks). Please either (a) update the PR title/description to reflect the broader scope, or (b) split the unrelated feature/workflow additions into separate PRs so the flag-contract fix can be reviewed and shipped independently.
| }, | ||
| "engines": { | ||
| "node": ">=16.7.0" | ||
| "node": ">=20.0.0" |
There was a problem hiding this comment.
The PR title/description focus on clarifying execute-phase flag activation, but the diff also includes a major version bump and a Node engine floor change (plus many new commands/workflows/hooks). Please either (a) update the PR title/description to reflect the broader scope, or (b) split the unrelated feature/workflow additions into separate PRs so the flag-contract fix can be reviewed and shipped independently.
| @@ -625,7 +625,7 @@ describe('copyCommandsAsCopilotSkills', () => { | |||
| // Count gsd-* directories — should be 31 | |||
There was a problem hiding this comment.
The comment says the directory count “should be 31” but the assertion expects 50. Please update or remove the outdated comment so test intent matches the current expected counts.
| // Count gsd-* directories — should be 31 | |
| // Count gsd-* directories — should be 50 |
|
|
||
| ```bash | ||
| STATS=$(node "$GSD_TOOLS" stats json) | ||
| STATS=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" stats json) |
There was a problem hiding this comment.
This hard-codes the Claude install path and bypasses the previously parameterized $GSD_TOOLS invocation pattern, which will break non-Claude runtimes and local installs. Prefer using the already-provided $GSD_TOOLS variable (or the init-resolved tool path) so stats works across supported runtimes.
| STATS=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" stats json) | |
| STATS=$("$GSD_TOOLS" stats json) |
|
|
||
| This document evolves at phase transitions and milestone boundaries. | ||
|
|
||
| **After each phase transition** (via `/gsd:transition`): |
There was a problem hiding this comment.
This references a user-facing /gsd:transition command, but workflows/transition.md is explicitly marked as internal and says users should never be told to run /gsd:transition. Please reword this to reference phase transitions generically (or the actual user-facing commands that trigger transition behavior).
| **After each phase transition** (via `/gsd:transition`): | |
| **After each phase transition in the roadmap**: |
| # Append entry — workflow handles the format | ||
| echo "| $(date +%Y-%m-%d) | fast | $TASK | ✅ |" >> .planning/STATE.md |
There was a problem hiding this comment.
Appending $TASK directly into a markdown table can corrupt STATE.md if the task contains pipes (|), newlines, or shell-meaningful characters. It’s also bypassing any existing state update helpers/locking guarantees. A safer approach is to route this through gsd-tools state update/append functionality (or sanitize/escape table content) to avoid generating invalid markdown or introducing race/corruption in STATE.md.
| # Append entry — workflow handles the format | |
| echo "| $(date +%Y-%m-%d) | fast | $TASK | ✅ |" >> .planning/STATE.md | |
| # Append entry — sanitize task to avoid breaking markdown or shell | |
| sanitized_task=$(printf '%s' "$TASK" | tr '\n' ' ' | sed 's/|/\\|/g') | |
| printf '| %s | fast | %s | ✅ |\n' "$(date +%Y-%m-%d)" "$sanitized_task" >> .planning/STATE.md |
| // Allow edits to common config/docs files that don't need GSD tracking | ||
| const allowedPatterns = [ | ||
| /\.gitignore$/, | ||
| /\.env/, |
There was a problem hiding this comment.
The allowlist regex /.env/ is very broad and will match many non-env paths (e.g., src/dotenv.ts, docs/.env-notes.md), reducing the guard’s effectiveness. Tighten this pattern to only allow typical env file names (e.g., .env, .env.local, .env.production, etc.) and ideally anchor to path segments/end-of-string.
| /\.env/, | |
| /(?:^|[\\/])\.env(?:\.(?:local|production|development|test|staging))?$/, |
| function validateSyntax(filePath) { | ||
| const content = fs.readFileSync(filePath, 'utf8'); | ||
| try { | ||
| // Use vm.compileFunction to check syntax without executing |
There was a problem hiding this comment.
The comment says vm.compileFunction but the implementation uses new vm.Script(...). Please update the comment to match the actual mechanism to avoid confusion during future maintenance.
| // Use vm.compileFunction to check syntax without executing | |
| // Use vm.Script to check syntax without executing |
|
|
||
| **Solves context rot — the quality degradation that happens as Claude fills its context window.** | ||
|
|
||
| [**English**](README.md) | [**简体中文**](docs/zh-CN/README.md) |
There was a problem hiding this comment.
This link points to docs/zh-CN/README.md, but the diff updates README.zh-CN.md (at repo root). If docs/zh-CN/README.md doesn’t exist, this becomes a broken link. Please point this link at the actual Chinese README path (or add the target file at docs/zh-CN/README.md).
| [**English**](README.md) | [**简体中文**](docs/zh-CN/README.md) | |
| [**English**](README.md) | [**简体中文**](README.zh-CN.md) |
Closes gsd-build#673
Stacked On
Solvely/execute-specific-wavescommands/gsd/execute-phase.mdSummary
--waveand--gaps-onlyto be treated as active only when their literal tokens appear in$ARGUMENTS--gaps-onlyby mistakeWhy
Some runtimes were reading the flag documentation in the expanded command prompt and incorrectly assuming
--gaps-onlywas active even when the user only ran/gsd:execute-phase <phase>.Testing
npm test -- --test-name-pattern="execute-phase.*(wave|active flags)|active flags are explicit|wave flag"