Commit Graph

954 Commits

Author SHA1 Message Date
j2h4u
b863ed6de5 fix(state): scope phase counting to current milestone
Extract getMilestonePhaseFilter() from milestone.cjs closure into core.cjs
as a shared helper. Apply it in buildStateFrontmatter and cmdPhaseComplete
so multi-milestone projects count only current milestone's phases instead
of all directories on disk.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:07:49 -06:00
Lex Christopherson
29beea437e 1.22.1 2026-03-02 14:38:58 -06:00
Lex Christopherson
addb07e799 docs: update changelog for v1.22.1 2026-03-02 14:38:53 -06:00
Lex Christopherson
30ecb56706 feat(discuss-phase): load prior context before gray area identification
Prevents re-asking questions already decided in earlier phases by reading
PROJECT.md, REQUIREMENTS.md, STATE.md, and all prior CONTEXT.md files
before generating gray areas. Prior decisions annotate options and skip
already-decided areas.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-02 14:36:03 -06:00
TÂCHES
268f363539 Merge pull request #868 from gsd-build/fix/echo-jq-control-char-escape
fix: replace echo with printf to prevent jq parse errors
2026-03-02 12:11:41 -06:00
Lex Christopherson
4010e3ff0e fix: replace echo with printf in shell snippets to prevent jq parse errors
zsh's built-in echo interprets \n escape sequences in JSON strings,
converting properly-escaped \\n back into literal newlines. This breaks
jq parsing with "control characters U+0000 through U+001F must be escaped".
printf '%s\n' preserves the JSON verbatim.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 12:07:45 -06:00
Lex Christopherson
1c58e84eb3 1.22.0 2026-02-27 21:31:15 -06:00
Lex Christopherson
c91a1ead38 docs: update changelog for v1.22.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 21:31:11 -06:00
TÂCHES
cf60f47f35 Merge pull request #791 from gsd-build/feat/codex-multi-agent-parity
feat(codex): request_user_input + multi-agent support
2026-02-27 21:05:36 -06:00
Lex Christopherson
1455931f79 feat(codex): add request_user_input mapping, multi-agent config, and agent role generation
Expand Codex adapter with AskUserQuestion → request_user_input parameter
mapping (including multiSelect workaround and Execute mode fallback) and
Task() → spawn_agent mapping (parallel fan-out, result parsing).

Add convertClaudeAgentToCodexAgent() that generates <codex_agent_role>
headers with role/tools/purpose and cleans agent frontmatter.

Generate config.toml with [features] (multi_agent, request_user_input)
and [agents.gsd-*] role sections pointing to per-agent .toml configs
with sandbox_mode (workspace-write/read-only) and developer_instructions.

Config merge handles 3 cases: new file, existing with GSD marker
(truncate + re-append), existing without marker (inject features +
append agents). Uninstall strips all GSD content including injected
feature keys while preserving user settings.

Closes #779

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 15:29:35 -06:00
Alex Foster
19ac77e25d fix: clear both cache paths after update (#663) (#664)
The SessionStart hook always writes to ~/.claude/cache/ via os.homedir()
regardless of install type. The update workflow previously only cleared
the install-type-specific path, leaving stale cache at the global path
for local installs.

Clear both ./.claude/cache/ and ~/.claude/cache/ unconditionally.

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-27 13:34:31 -06:00
dungan
dba401fe54 fix: statusline migration regex too broad, clobbers third-party statuslines (#670)
The #330 migration that renames `statusline.js` → `gsd-statusline.js`
uses `.includes('statusline.js')` which matches ANY file containing
that substring. For example, a user's custom `ted-statusline.js` gets
silently rewritten to `ted-gsd-statusline.js` (which doesn't exist).

This happens inside `cleanupOrphanedHooks()` which runs before the
interactive "Keep existing / Replace" prompt, so even choosing "Keep
existing" doesn't prevent the damage.

Fix: narrow the regex to only match the specific old GSD path pattern
`hooks/statusline.js` (or `hooks\statusline.js` on Windows).

Co-authored-by: ddungan <sckim@mococo.co.kr>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:33:53 -06:00
Lex Christopherson
69b28eeca4 fix: use $HOME instead of ~ for gsd-tools.cjs paths to prevent subagent MODULE_NOT_FOUND (#786)
Claude Code subagents sometimes rewrite ~/. paths to relative paths,
causing MODULE_NOT_FOUND when CWD is the project directory. $HOME is a
shell variable resolved at runtime, immune to model path rewriting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:11:19 -06:00
CyPack
aaea14efd6 feat(agents): add analysis paralysis guard, exhaustive cross-check, and task-level TDD (#736)
- gsd-executor: Add <analysis_paralysis_guard> block after deviation_rules.
  If executor makes 5+ consecutive Read/Grep/Glob calls without any
  Edit/Write/Bash action, it must stop and either write or report blocked.
  Prevents infinite analysis loops that stall execution.

- gsd-plan-checker: Add exhaustive cross-check in Step 4 requirement coverage.
  Checker now also reads PROJECT.md requirements (not just phase goal) to
  verify no relevant requirement is silently dropped. Unmapped requirements
  become automatic blockers listed explicitly in issues.

- gsd-planner: Add task-level TDD guidance alongside existing TDD Detection.
  For code-producing tasks in standard plans, tdd="true" + <behavior> block
  makes test expectations explicit before implementation. Complements the
  existing dedicated TDD plan approach — both can coexist.

Co-authored-by: CyPack <GITHUB_EMAIL_ADRESIN>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 12:59:21 -06:00
min-k-khant
37582f8fca feat: code-aware discuss phase with codebase scouting (#727)
Add lightweight codebase scanning before gray area identification:
- New scout_codebase step checks for existing maps or does targeted grep
- Gray areas annotated with code context (existing components, patterns)
- Discussion options informed by what already exists in the codebase
- Context7 integration for library-specific questions
- CONTEXT.md template includes code_context section

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 12:59:15 -06:00
Stephen Miller
eb1388c29d fix: support both .claude/skills/ and .agents/skills/ for skill discovery (#759)
* fix: use `.claude/skills/` instead of `.agents/skills/` in agent and workflow skill references

Claude Code resolves project skills from `.claude/skills/` (project-level)
and `~/.claude/skills/` (user-level). The `.agents/skills/` path is the
universal/IDE-agnostic convention that Claude Code does not resolve, causing
project skills to be silently ignored by all affected agents and workflows.

Fixes #758

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: support both `.claude/skills/` and `.agents/skills/` for cross-IDE compatibility

Instead of replacing `.agents/skills/` with `.claude/skills/`, reference both
paths so GSD works with Claude Code (`.claude/skills/`) and other IDE agents
like OpenCode (`.agents/skills/`).

Addresses review feedback from begna112 on #758.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Stephen Miller <Stephen@betterbox.pw>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 12:59:07 -06:00
Ethan Hurst
b5bd9c2bad fix: align resolve-model variable names with template placeholders (#737)
DEBUGGER_MODEL and CHECKER_MODEL used uppercase bash convention but the
Task() calls referenced {debugger_model} and {integration_checker_model}
(lowercase). The mismatch caused Claude to skip substitution and fall back
to the parent session model, ignoring the configured GSD profile.

Co-authored-by: Ethan Hurst <ethan.hurst@outlook.com.au>
2026-02-27 12:59:01 -06:00
Ethan Hurst
ff3e2fd5eb fix: escape regex metacharacters in stateExtractField (#741)
stateReplaceField properly escaped fieldName before building the regex,
but stateExtractField did not. Field names containing regex metacharacters
could cause incorrect matches or regex errors.

Co-authored-by: Ethan Hurst <ethan.hurst@outlook.com.au>
2026-02-27 12:58:55 -06:00
Ethan Hurst
31c8a91ee4 fix: load model_overrides from config and use resolveModelInternal in CLI (#739)
loadConfig() never returned model_overrides, so resolveModelInternal()
could never find per-agent overrides — they were silently ignored.

Additionally, cmdResolveModel duplicated model resolution logic but
skipped the override check entirely. Now delegates to resolveModelInternal
so both code paths behave consistently.

Co-authored-by: Ethan Hurst <ethan.hurst@outlook.com.au>
2026-02-27 12:58:48 -06:00
Ethan Hurst
93c9def0ef fix: load nyquist_validation from config (#740)
loadConfig() didn't include nyquist_validation in its return object, so
cmdInitPlanPhase always set nyquist_validation_enabled to undefined. The
plan-phase workflow could never detect whether Nyquist validation was
enabled or disabled via config.

Co-authored-by: Ethan Hurst <ethan.hurst@outlook.com.au>
2026-02-27 12:58:42 -06:00
ROMB
3a417522c9 fix: phase-plan-index returns null/empty for files_modified, objective, task_count (#734)
cmdPhasePlanIndex had 3 mismatches with the canonical XML plan format
defined in templates/phase-prompt.md:

- files_modified: looked up fm['files-modified'] (hyphen) but plans use
  files_modified (underscore). Now checks underscore first, hyphen fallback.
- objective: read from YAML frontmatter but plans put it in <objective>
  XML tag. Now extracts first line from the tag, falls back to frontmatter.
- task_count: matched ## Task N markdown headings but plans use <task>
  XML tags. Now counts XML tags first, markdown fallback.

All three fixes preserve backward compat with legacy markdown-style plans.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 12:58:36 -06:00
Lex Christopherson
b69a8de83b 1.21.1 2026-02-27 11:52:13 -06:00
Lex Christopherson
5492b68d65 docs: update changelog for v1.21.1 2026-02-27 11:52:09 -06:00
Lex Christopherson
011df21dd0 fix(test): expect forward-slash paths in cmdInitTodos assertion
The source now outputs posix paths; update the test to match instead
of using path.join (which produces backslashes on Windows).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:38:24 -06:00
Lex Christopherson
9c27da0261 fix(windows): cross-platform path separators, JSON quoting, and dollar signs
- Add toPosixPath() helper to normalize output paths to forward slashes
- Use string concatenation for relative base paths instead of path.join()
- Apply toPosixPath() to all user-facing file paths in init.cjs output
- Use array-based execFileSync in test helpers to bypass shell quoting
  issues with JSON args and dollar signs on Windows cmd.exe

Fixes 7 test failures on Windows: frontmatter set/merge (3), init
path assertions (2), and state dollar-amount corruption (2).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:34:36 -06:00
Lex Christopherson
02a5319777 fix(ci): propagate coverage env in cross-platform test runner
The run-tests.cjs child process now inherits NODE_V8_COVERAGE from the
parent so c8 collects coverage data. Also restores npm scripts to use
the cross-platform runner for both test and test:coverage commands.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:07:02 -06:00
Lex Christopherson
ccb8ae1d18 fix(ci): cross-platform test runner for Windows glob expansion
npm scripts pass `tests/*.test.cjs` to node/c8 as a literal string on
Windows (PowerShell/cmd don't expand globs). Adding `shell: bash` to CI
steps doesn't help because c8 spawns node as a child process using the
system shell. Use a Node script to enumerate test files cross-platform.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:00:26 -06:00
Lex Christopherson
ffc1a2efa0 fix(ci): use bash shell on Windows for glob expansion in test steps
Windows PowerShell doesn't expand `tests/*.test.cjs` globs, causing
the test runner to fail with "Could not find" on Windows Node 20.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 09:45:27 -06:00
TÂCHES
3affa48306 Merge pull request #783 from Hnturk/claude/laughing-haslett
fix: getMilestoneInfo() returns wrong version after milestone complet…
2026-02-27 09:26:15 -06:00
TÂCHES
10576a58da Merge pull request #785 from Tibsfox/fix/milestones-reverse-chronological
fix(milestone): insert MILESTONES.md entries in reverse chronological order
2026-02-27 09:23:14 -06:00
TÂCHES
d64b0e43d1 Merge pull request #784 from Tibsfox/fix/milestone-stats-scoping
fix(milestone): scope stats and archive to current milestone phases
2026-02-27 09:22:45 -06:00
Tibsfox
732ea09f81 fix(milestone): insert MILESTONES.md entries in reverse chronological order
cmdMilestoneComplete previously appended new milestone entries at the
end of MILESTONES.md. Over successive milestones this produced
chronological order (oldest first), which is counterintuitive — users
expect the most recent milestone at the top.

This fix detects the file header (h1-h3) and inserts the new entry
immediately after it, pushing older entries down. Files without a
recognizable header get the entry prepended. New files still get a
default '# Milestones' header.

Adds 2 tests: single insertion ordering assertion and three-sequential-
completions verification (v1.2 < v1.1 < v1.0 in file order).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:46:37 -08:00
Tibsfox
367149d0b2 fix(milestone): scope stats, accomplishments, and archive to current milestone phases
cmdMilestoneComplete previously iterated ALL phase directories in
.planning/phases/, including phases from prior milestones that remain on
disk. This produced inflated stats, stale accomplishments from old
summaries, and --archive-phases moving directories that belong to
earlier milestones.

This fix parses ROADMAP.md to extract phase numbers for the current
milestone, builds a normalized Set for O(1) lookup, and filters all
phase directory operations through an isDirInMilestone() helper.

The helper handles edge cases: leading zeros (01 -> 1), letter suffixes
(3A), decimal phases (3.1), large numbers (456), and excludes
non-numeric directories (notes/, misc/).

Adds 5 tests covering scoped stats, scoped archive, prefix collision
guard, non-numeric directory exclusion, and large phase numbers.

Complements upstream PRs #756 and #783 which fix getMilestoneInfo()
milestone detection — this fix addresses milestone completion scoping.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:45:42 -08:00
Hnturk
38c19466ae fix: getMilestoneInfo() returns wrong version after milestone completion (#768)
Strip <details> blocks (shipped milestones) before matching, and extract
both version and name from the same ## heading for consistency.
2026-02-27 11:17:36 +03:00
Lex Christopherson
f9fc2a3f33 fix(ci): pin action SHAs and enforce coverage on all events
- Pin actions/checkout and actions/setup-node to SHA for supply chain safety
- Run coverage threshold on all events (not just PRs) so direct pushes to main
  are also gated
- Remove .planning/ artifact that was dev bookkeeping

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 23:39:29 -06:00
TÂCHES
735c3fcc0c Merge pull request #763 from ethan-hurst/feat/coverage-hardening
test: comprehensive test suite — 433 tests, 94% line coverage across all modules
2026-02-26 23:38:21 -06:00
Ethan Hurst
896499120b fix(ci): add Node 18 skip condition for c8 v11 coverage step
c8 v11 requires Node 20+ (engines: ^20.0.0 || >=22.0.0).
Node 18 now runs plain npm test on PRs to avoid engine mismatch.
Also removes redundant --exclude flag from test:coverage script.

Also: fix ROADMAP.md progress table alignment (rows 7-12), mark
Phase 7 complete, add requirements-completed to 09-01-SUMMARY.md.
2026-02-26 05:49:31 +10:00
Ethan Hurst
898b82dee0 fix(quick-1): remove MEDIUM severity test overfitting in config.test.cjs
- branching_strategy assertion changed from strictEqual 'none' to typeof string check
- plan_check and verifier assertions changed from strictEqual true to typeof boolean checks
- Add isolation comments to three tests that touch ~/.gsd/ on real filesystem
- Full test suite passes: 433 tests, all modules above 70% coverage
2026-02-26 05:49:31 +10:00
Ethan Hurst
c9e73e9c94 fix(quick-1): remove HIGH severity test overfitting in 4 test files
- frontmatter.test.cjs: delete FRONTMATTER_SCHEMAS describe block (4 tests asserting on lookup table shape)
- core.test.cjs: replace 12 per-profile per-agent matrix tests with 1 structural validation test
- commands.test.cjs: URL test uses URL.searchParams.get() instead of raw string includes
- state.test.cjs: date assertion uses before/after window to handle midnight boundary safely
2026-02-26 05:49:31 +10:00
Ethan Hurst
21c898b2cc ci(12-02): run coverage check on PRs with 70% line threshold 2026-02-26 05:49:31 +10:00
Ethan Hurst
97d2136c5d feat(12-01): add c8 coverage tooling with 70% line threshold 2026-02-26 05:49:31 +10:00
Ethan Hurst
17299b6819 test(11-02): add cmdRoadmapUpdatePlanProgress tests
- Missing phase number error path
- Nonexistent phase error path
- No plans found returns updated:false
- Partial completion updates progress table
- Full completion checks checkbox and adds date
- Missing ROADMAP.md returns updated:false
- 6 new tests (24 total in roadmap suite)
- roadmap.cjs coverage jumps from 71% to 99.32%

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:49:31 +10:00
Ethan Hurst
5d0e42d69d test(11-01): add cmdRoadmapAnalyze edge-case and cmdRoadmapGetPhase success_criteria tests
- Disk status variants: researched, discussed, empty branches covered
- Milestone extraction: version numbers and headings from ## headings
- Missing phase details: checklist-only phases without detail sections
- Success criteria: array extraction from phase sections
- 7 new tests (18 total in roadmap suite)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:49:31 +10:00
Ethan Hurst
74a4851421 test(10-01): add dispatcher error paths and routing branch tests
- No-command and unknown-command error path tests
- Unknown subcommand tests for all 11 command groups
- --cwd= form parsing tests (valid, empty, invalid path)
- Routing branch tests: find-phase, init resume, init verify-work,
  roadmap update-plan-progress, state default load, summary-extract
- 22 new tests covering DISP-01 and DISP-02 requirements
2026-02-26 05:49:31 +10:00
Ethan Hurst
d5ef3b4f1f test(09-02): add cmdStateResolveBlocker and cmdStateRecordSession tests
- 5 tests for cmdStateResolveBlocker: case-insensitive removal, None placeholder on empty, missing text error, missing STATE.md, no-match succeeds
- 5 tests for cmdStateRecordSession: update all fields, timestamp-only update, None default resume-file, missing STATE.md, no session fields returns false
2026-02-26 05:49:31 +10:00
Ethan Hurst
763ff97764 test(09-02): add cmdStateAdvancePlan, cmdStateRecordMetric, cmdStateUpdateProgress tests
- 4 tests for cmdStateAdvancePlan: advance, last-plan complete, missing STATE.md, unparseable fields
- 4 tests for cmdStateRecordMetric: append row, None-yet placeholder, missing fields error, missing STATE.md
- 4 tests for cmdStateUpdateProgress: percent calculation, zero plans, missing Progress field, missing STATE.md
2026-02-26 05:49:31 +10:00
Ethan Hurst
29a87cba7c test(09-01): add cmdStateLoad, cmdStateGet, cmdStatePatch, cmdStateUpdate CLI tests
- 3 cmdStateLoad tests: state+config+roadmap detection, missing STATE.md, --raw flag output
- 5 cmdStateGet tests: full content, bold field extraction, section extraction, missing field error, missing file error
- 5 cmdStatePatch/cmdStateUpdate tests: batch update, failed fields reporting, single field update, field not found, missing STATE.md
2026-02-26 05:49:31 +10:00
Ethan Hurst
1ca7df13a0 test(09-01): add stateExtractField and stateReplaceField unit tests
- 4 stateExtractField tests: simple extraction, colon-in-value, null on missing, case-insensitive
- 4 stateReplaceField tests: replace value, null on missing, preserves surrounding content, round-trip
2026-02-26 05:49:31 +10:00
Ethan Hurst
ec943fec72 test(08-02): add cmdInitProgress, cmdInitQuick, cmdInitMapCodebase, cmdInitNewProject, cmdInitNewMilestone tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:47:33 +10:00
Ethan Hurst
add7799cee test(08-01): add cmdInitTodos, cmdInitMilestoneOp, cmdInitPhaseOp fallback tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:47:33 +10:00