Commit Graph

1163 Commits

Author SHA1 Message Date
Tom Boucher
86cbd5442b Merge pull request #1217 from j2h4u/fix/task-count-pattern
fix(milestone): read task count from **Tasks:** field in summary body
2026-03-19 12:04:37 -04:00
Tom Boucher
841da5a80d Merge pull request #1155 from gsd-build/Solvely/quick-task-branching
feat(quick): add quick-task branch support
2026-03-19 12:03:58 -04:00
Tom Boucher
37ae2bc936 Merge pull request #1154 from gsd-build/Solvely/soft-gsd-workflow-enforcement
feat(new-project): add soft GSD workflow enforcement
2026-03-19 12:03:31 -04:00
Tom Boucher
9506b895c1 Merge pull request #1151 from 0Shard/fix/semver-and-frontmatter-parsing
fix: semver 3+ segment parsing and CRLF frontmatter corruption recovery
2026-03-19 12:02:43 -04:00
Tom Boucher
0342ce33c6 Merge pull request #1149 from Solvely-Colin/Solvely/health-non-destructive-state-repair
fix(health): preserve state on phase mismatch repair
2026-03-19 12:02:11 -04:00
Tom Boucher
b0523d6cbe Merge pull request #1148 from Solvely-Colin/Solvely/reset-milestone-phase-numbers
feat(milestones): support safe phase-number resets
2026-03-19 12:01:52 -04:00
Tom Boucher
acca569abb Merge pull request #1135 from trek-e/feat/backlog-and-threads-1005
feat: add backlog parking lot and persistent context threads (#1005)
2026-03-19 12:01:31 -04:00
Tom Boucher
e0e74ada73 Merge pull request #1134 from trek-e/feat/ticket-based-phase-ids-1019
feat: support ticket-based phase identifiers for team workflows (#1019)
2026-03-19 12:00:57 -04:00
j2h4u
b34bf532ef fix(milestone): read task count from **Tasks:** field in summary body
The summary template writes task count as `**Tasks:** N` in the
Performance section, but `cmdMilestoneComplete` only counted
`## Task N` markdown headers — which don't exist in that format.

Now checks three patterns in order: `**Tasks:** N` field (primary),
`<task` XML tags, then `## Task N` headers (legacy fallback).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 14:37:21 +05:00
Tom Boucher
1427aab41b Merge pull request #1070 from MenglongFan/docs/zh-cn-translation
docs: add Chinese (zh-CN) documentation
2026-03-18 23:58:15 -04:00
Tom Boucher
ed7c7375ee Merge pull request #1193 from trek-e/feat/research-before-questions-1186
feat: research-before-questions config option (#1186)
2026-03-18 23:56:45 -04:00
Tom Boucher
1192c0ae02 Merge pull request #1203 from trek-e/fix/stale-hooks-filter-1200
fix: filter stale hooks check to gsd-prefixed files only (#1200)
2026-03-18 23:56:33 -04:00
Tom Boucher
cd8c406a7c Merge pull request #1204 from trek-e/fix/codex-config-toml-1202
fix: prevent Codex config.toml corruption from non-boolean [features] keys (#1202)
2026-03-18 23:56:18 -04:00
Tom Boucher
b0c78fa9bc Merge pull request #1205 from trek-e/refactor/adopt-planning-paths
refactor: adopt planningPaths() across 4 modules, standardize test assertions
2026-03-18 23:56:05 -04:00
Tom Boucher
7f864ce87d Merge pull request #1206 from trek-e/chore/node-24-ci-update
chore: update CI to Node 20, 22, 24 — drop EOL Node 18
2026-03-18 23:55:47 -04:00
Tom Boucher
7cd3824c81 Merge pull request #1207 from trek-e/feat/community-requested-commands
feat: community-requested commands — /gsd:review, /gsd:plant-seed, /gsd:pr-branch
2026-03-18 23:55:32 -04:00
Tom Boucher
c41a9f5908 feat: community-requested commands — /gsd:review, /gsd:plant-seed, /gsd:pr-branch
Three commands reimplemented from positively-received community PRs:

1. /gsd:review (#925) — Cross-AI peer review
   Invoke external AI CLIs (Gemini, Claude, Codex) to independently
   review phase plans. Produces REVIEWS.md with per-reviewer feedback
   and consensus summary. Feed back into planning via --reviews flag.
   Multiple users praised the adversarial review concept.

2. /gsd:plant-seed (#456) — Forward-looking idea capture
   Capture ideas with trigger conditions that auto-surface during
   /gsd:new-milestone. Seeds preserve WHY, WHEN to surface, and
   breadcrumbs to related code. Better than deferred items because
   triggers are checked, not forgotten.

3. /gsd:pr-branch (#470) — Clean PR branches
   Create a branch for pull requests by filtering out .planning/
   commits. Classifies commits as code-only, planning-only, or mixed,
   then cherry-picks only code changes. Reviewers see clean diffs.

All three are standalone command+workflow additions with no core code
changes. Help workflow updated. Test skill counts updated.

797/797 tests pass.
2026-03-18 23:53:13 -04:00
Tom Boucher
f656dcbd6f chore: update CI matrix to Node 20, 22, 24 — drop EOL Node 18
Node 18 reached EOL April 2025. Node 24 is the current LTS target.

Changes:
- CI matrix: [18, 20, 22] → [20, 22, 24]
- package.json engines: >=16.7.0 → >=20.0.0
- Removed Node 18 conditional in CI (c8 coverage works on all 20+)
- Simplified CI to single test:coverage step for all versions

797/797 tests pass on Node 24.
2026-03-18 23:43:28 -04:00
Tom Boucher
1d4deb0f8b refactor: adopt planningPaths() across 4 modules — eliminate 34 inline path constructions
Consolidates repeated path.join(cwd, '.planning', ...) patterns into
calls to the shared planningPaths() helper from core.cjs.

Modules updated:
- state.cjs: 16 → planningPaths() (2 remain for non-standard paths)
- commands.cjs: 8 → planningPaths() (4 remain for todos dir)
- milestone.cjs: 5 → planningPaths() (3 remain for archive/milestones)
- roadmap.cjs: 4 → planningPaths()

Benefits:
- Single source of truth for .planning/ directory structure
- Easier to change planning dir location in the future
- Consistent path construction across the codebase
- No behavioral changes — pure refactor

797/797 tests pass.
2026-03-18 23:39:47 -04:00
Tom Boucher
862f6b91ba fix: prevent Codex config.toml corruption from non-boolean [features] keys (#1202)
When GSD installs codex_hooks = true under [features], any non-boolean
keys already in that section (e.g. model = "gpt-5.4") cause Codex's
TOML parser to fail with 'invalid type: string, expected a boolean'.

Root cause: TOML sections extend until the next [section] header. If
the user placed model/model_reasoning_effort under [features] (common
since Codex's own config format encourages this), GSD's installer
didn't detect or correct the structural issue.

Fix: After injecting codex_hooks, scan the [features] section for
non-boolean values and move them above [features] to the top level.
This preserves the user's keys while keeping [features] clean for
Codex's strict boolean parser.

Includes 2 regression tests:
- Detects non-boolean keys under [features] (model, model_reasoning_effort)
- Confirms boolean keys (codex_hooks, multi_agent) are not flagged

Closes #1202
2026-03-18 23:32:05 -04:00
Tom Boucher
9ca03ec35e fix: filter stale hooks check to gsd-prefixed files only (#1200)
gsd-check-update.js scanned ALL .js files in the hooks directory and
flagged any without a gsd-hook-version header as stale. This incorrectly
flagged user-created hooks (e.g. guard-edits-outside-project.js),
producing a persistent 'stale hooks' warning that /gsd:update couldn't
resolve.

Fix: filter hookFiles to f.startsWith('gsd-') && f.endsWith('.js')
since all GSD hooks follow the gsd-* naming convention.

Includes regression test validating the filter excludes user hooks.

Closes #1200
2026-03-18 23:29:38 -04:00
Tom Boucher
12e4cfe041 fix: update Copilot skill count in tests for 3 new commands
Tests expected 39 skill folders but got 42 after adding add-backlog,
review-backlog, and thread commands. Updated both the hardcoded count
and EXPECTED_SKILLS constant.
2026-03-18 20:29:50 -04:00
Tom Boucher
b136396610 feat: add backlog parking lot and persistent context threads (#1005)
Three new commands for managing ideas and cross-session context:

/gsd:add-backlog <description>
  Adds a 999.x numbered backlog item to ROADMAP.md. Creates phase directory
  immediately so /gsd:discuss-phase and /gsd:plan-phase work on them.
  No dependencies, no sequencing — pure parking lot.

/gsd:review-backlog
  Lists all 999.x items, lets user promote to active milestone, keep, or
  remove. Promotion renumbers to next sequential phase with proper deps.

/gsd:thread [name | description]
  Three modes:
  - No args: list all threads with status
  - Existing name: resume thread, load context
  - New description: create thread from current conversation context

  Threads live in .planning/threads/ as lightweight markdown files with
  Goal, Context, References, and Next Steps sections.

Design:
- Self-contained command files, no core changes needed
- 999.x numbering keeps backlog out of active sequence
- Threads are independent of phases — cross-session knowledge stores
- Both features compose with existing GSD commands

Fixes #1005
2026-03-18 20:28:40 -04:00
Tom Boucher
42a2c15b39 feat: research-before-questions config option (#1186)
Adds workflow.research_questions config toggle (default: false) that
enables web research before asking questions during /gsd:new-project
and /gsd:discuss-phase.

When enabled:
- discuss-phase: searches best practices for each gray area before
  presenting questions, showing 2-3 bullet points of findings
- new-project: researches the user's described domain before asking
  follow-up questions, weaving findings into the conversation

Added to /gsd:settings as a toggle ('Research Qs' section).

Closes #1186
2026-03-18 20:27:51 -04:00
Tom Boucher
a4da216523 feat: support ticket-based phase identifiers for team workflows (#1019)
Teams sharing a GSD repo collide on sequential phase numbers when multiple
people create phases concurrently. This adds support for arbitrary string
IDs (e.g. PROJ-42, AUTH-101) as phase identifiers.

New config option:
  { "phase_naming": "custom" }

Changes:
- core.cjs: normalizePhaseName() handles non-numeric IDs gracefully
- core.cjs: comparePhaseNum() falls back to string comparison for custom IDs
- core.cjs: searchPhaseInDir() matches custom ID prefixes case-insensitively
- core.cjs: getMilestonePhaseFilter() recognizes custom ID directory names
- core.cjs: getRoadmapPhaseInternal() matches Phase headers with any word chars
- core.cjs: loadConfig() adds phase_naming option (default: 'sequential')
- phase.cjs: cmdPhaseAdd() accepts --id flag for custom phase IDs
- verify.cjs: health check skips sequential numbering validation in custom mode
- gsd-tools.cjs: phase add --id PROJ-42 "description" wired up

Usage:
  # Sequential mode (default, backward compatible)
  gsd-tools phase add "User Authentication"  # → Phase 3

  # Custom mode (config: phase_naming: custom)
  gsd-tools phase add --id PROJ-42 "User Authentication"
  # Creates: .planning/phases/PROJ-42-user-authentication/
  # ROADMAP: ### Phase PROJ-42: User Authentication

All 755 existing tests pass.

Fixes #1019
2026-03-18 20:27:12 -04:00
Tom Boucher
5fd384f336 fix: universal agent name replacement for non-Claude runtimes (#766) (#1195)
* fix: universal agent name replacement for non-Claude runtimes (#766)

Adds neutralizeAgentReferences() shared function that all non-Claude
runtime converters call to replace Claude-specific references:

- 'Claude' (standalone agent name) → 'the agent'
- 'CLAUDE.md' → runtime-specific file (AGENTS.md, GEMINI.md, COPILOT.md)
- Removes 'Do NOT load full AGENTS.md' (harmful for AGENTS.md runtimes)

Preserves: 'Claude Code' (product), 'Claude Opus/Sonnet/Haiku' (models),
'claude-' prefixes (packages, CSS classes).

Integrated into: OpenCode, Gemini, Copilot, Antigravity, and Codex
converters. Claude Code converter unchanged (references are correct).

Includes 7 new tests covering all replacement rules.

Closes #766

* fix: use copilot-instructions.md instead of COPILOT.md for Copilot runtime

Addresses review from Solvely-Colin: Copilot's actual instruction file
is copilot-instructions.md, not COPILOT.md. The neutralizer was mapping
CLAUDE.md -> COPILOT.md which would reference a non-existent file.

- install.js: pass 'copilot-instructions.md' to neutralizeAgentReferences
- runtime-converters.test.cjs: update test to validate correct filename
2026-03-18 19:20:58 -04:00
Tom Boucher
973c6b267d Merge pull request #1115 from trek-e/feat/discuss-phase-todo-crossref 2026-03-18 18:09:42 -04:00
Tom Boucher
7424b3448d Merge pull request #1117 from trek-e/fix/parallel-commit-no-verify-1116 2026-03-18 18:09:17 -04:00
Tom Boucher
16444d7c23 Merge pull request #1118 from trek-e/fix/evolution-block-visibility-1039 2026-03-18 18:08:59 -04:00
Tom Boucher
73d6ec06cc Merge pull request #1132 from trek-e/feat/1m-context-awareness-1086 2026-03-18 18:08:19 -04:00
Tom Boucher
d77956f6bd Merge pull request #1192 from trek-e/feat/gsd-fast-command-609 2026-03-18 18:08:00 -04:00
Tom Boucher
ae3ff4f123 Merge pull request #1194 from trek-e/feat/discuss-pre-analysis-833 2026-03-18 18:07:40 -04:00
Tom Boucher
a61228eddc Merge pull request #1124 from trek-e/refactor/deduplicate-and-cleanup 2026-03-18 18:06:25 -04:00
Tom Boucher
a8539a1779 Merge pull request #1164 from trek-e/fix/opencode-model-inherit-1156 2026-03-18 18:06:03 -04:00
Tom Boucher
62afbb56e0 Merge pull request #1196 from trek-e/fix/windows-subagent-timeout-732 2026-03-18 18:05:14 -04:00
Tom Boucher
a2bcbd55d3 Merge pull request #1158 from mitchelladam/feat/cursor-cli-support 2026-03-18 18:04:04 -04:00
Tom Boucher
a6ba3e268e feat: PreToolUse workflow guard hook for rogue edit prevention (#678) (#1197)
New opt-in PreToolUse hook that warns when Claude edits files outside
a GSD workflow context (no active /gsd: command or subagent).

Soft guard — advises, does not block. The edit proceeds but Claude
sees a reminder to use /gsd:fast or /gsd:quick for state tracking.

Enable: set hooks.workflow_guard: true in .planning/config.json
Default: disabled (false)

Allows without warning:
- .planning/ files (GSD state management)
- Config files (.gitignore, .env, CLAUDE.md, settings.json)
- Subagent contexts (executor, planner, etc.)

Includes 3s stdin timeout guard and silent fail-safe.

Closes #678
2026-03-18 17:36:07 -04:00
Tom Boucher
214a621cb2 docs: update changelog, architecture, CLI tools, config, features, and user guide for parallel execution fixes
Documentation updates for #1116 fixes and code review findings:

- CHANGELOG.md: Add --no-verify commit flag, post-wave hook validation,
  STATE.md file locking, duplicate function removal, cross-platform init
- docs/ARCHITECTURE.md: Add 'Parallel Commit Safety' section explaining
  --no-verify strategy and STATE.md lockfile mechanism
- docs/CLI-TOOLS.md: Document --no-verify flag on commit command with
  usage guidance
- docs/CONFIGURATION.md: Add note about pre-commit hooks and parallel
  execution behavior under parallelization settings
- docs/FEATURES.md: Add --no-verify to executor capabilities, add
  'Parallel Safety' section
- docs/USER-GUIDE.md: Add troubleshooting entries for parallel execution
  build lock errors and Windows EPERM crashes, update recovery table
2026-03-18 17:18:01 -04:00
Tom Boucher
60f38cdb9e fix: remove duplicate stateExtractField, cross-platform code detection, STATE.md file locking
Code review fixes from codebase pattern analysis:

1. state.cjs: Remove duplicate stateExtractField() definition (lines 12 vs 184).
   The second definition shadowed the first with identical logic. Keeps the
   original that uses escapeRegex() from core.cjs.

2. init.cjs: Replace Unix-only 'find' pipe with cross-platform fs.readdirSync
   recursive walk for code file detection. The execSync('find ... | grep ...')
   command fails on Windows where these Unix utilities aren't available.
   Removes unused child_process import.

3. state.cjs: Add lockfile-based mutual exclusion to writeStateMd() to prevent
   parallel executor agents from overwriting each other's STATE.md changes.
   Uses O_EXCL atomic file creation for lock acquisition, stale lock detection
   (10s timeout), and spin-wait with jitter. Ensures data integrity during
   wave-based parallel execution where multiple agents update STATE.md
   concurrently.

All 755 existing tests pass.
2026-03-18 17:17:34 -04:00
Tom Boucher
3bfc0f6845 fix: add --no-verify support for parallel executor commits (#1116)
Parallel executor agents trigger pre-commit hooks on every commit, causing
build lock contention (e.g., cargo lock fights in Rust projects) and 40+
minute delays from cascading retries.

Changes:
- Add --no-verify flag to gsd-tools commit command (commands.cjs)
- Wire --no-verify through gsd-tools.cjs CLI parser
- Update execute-phase.md to instruct parallel agents to use --no-verify
- Add post-wave hook validation step so orchestrator runs hooks once
- Update execute-plan.md pre-commit handling: parallel agents skip hooks,
  sequential agents still handle hooks normally
- Add parallel agent note to git-integration.md reference

Fixes #1116
2026-03-18 17:17:34 -04:00
Tom Boucher
a99caaeb59 feat: /gsd:fast command for trivial inline tasks (#609)
New lightweight command for tasks too small to justify planning overhead:
typo fixes, config changes, forgotten commits, simple additions.

- Runs inline in current context (no subagent spawn)
- No PLAN.md or SUMMARY.md generated
- Scope guard: redirects to /gsd:quick if task needs >3 file edits
- Atomic commit with conventional commit format
- Logs to STATE.md quick tasks table if present

Complements /gsd:quick (which spawns planner+executor) for cases where
the planning overhead exceeds the actual work.

Closes #609
2026-03-18 17:17:28 -04:00
Tom Boucher
297adf8425 fix: add Windows troubleshooting for plan-phase freezes (#732)
Windows users experience plan-phase freezes due to Claude Code stdio
deadlocks with MCP servers. When a subagent hangs, the orchestrator
blocks indefinitely with no timeout or error.

Adds:
- Windows troubleshooting section to plan-phase.md with:
  - Orphaned process cleanup (PowerShell commands)
  - Stale task directory cleanup (~/.claude/tasks/)
  - MCP server reduction advice
  - --skip-research fallback to reduce agent chain
- Stale task directory detection to health.md (I002 diagnostic)
  - Reports count of stale dirs on --repair
  - Safe cleanup guidance

Closes #732
2026-03-18 17:13:55 -04:00
Tom Boucher
be302f02bb feat: --analyze flag for discuss-phase trade-off analysis (#833)
Adds --analyze flag to /gsd:discuss-phase that provides a trade-off
analysis before each question (or question group in --batch mode).

When active, each question is preceded by:
- 2-3 options with pros/cons based on codebase context
- A recommended approach with reasoning
- Known pitfalls or constraints from prior phases

Composable with existing flags: --batch --analyze gives grouped
questions each with trade-off tables.

Closes #833
2026-03-18 17:07:33 -04:00
Tom Boucher
a9be67f504 docs: comprehensive v1.26 release documentation update (#1187)
Updates all docs to reflect v1.26.0 features and changes:

README.md:
- Add /gsd:ship and /gsd:next to command tables
- Add /gsd:session-report to Session section
- Update workflow to show ship step and auto-advance
- Update inherit profile description for non-Anthropic providers

docs/COMMANDS.md:
- Add /gsd:next command reference with full state detection logic
- Add /gsd:session-report command reference with report contents

docs/FEATURES.md:
- Add Auto-Advance (Next) feature (#14)
- Add Cross-Phase Regression Gate feature (#20)
- Add Requirements Coverage Gate feature (#21)
- Add Session Reporting feature (#24)
- Fix all section numbering (was broken with duplicates)
- Update inherit profile to mention non-Anthropic providers
- Renumber all 39 features consistently

docs/USER-GUIDE.md:
- Add /gsd:ship to workflow diagram
- Add /gsd:next and /gsd:session-report to command tables
- Add HANDOFF.json and reports/ to file structure
- Add troubleshooting for non-Anthropic model providers
- Add recovery entries for session-report and next
- Update example workflow to include ship and session-report

docs/CONFIGURATION.md:
- Update inherit profile to mention non-Anthropic providers
2026-03-18 14:54:02 -04:00
mitchelladam
69cfae2011 fix(cursor): preserve slash-prefixed gsd commands in converted markdown
Keep `/gsd-*` command examples slash-prefixed during Cursor conversion while still normalizing legacy `gsd:` syntax, and add regression coverage for Next Up markdown output.

Made-with: Cursor
2026-03-18 18:49:28 +00:00
adam.mitchell
7172d16447 Merge branch 'main' into feat/cursor-cli-support 2026-03-18 18:34:04 +00:00
mitchelladam
026a1b013e fix(cursor): write unquoted skill and subagent names
Prevent Cursor from treating frontmatter quotes as part of skill/subagent identifiers by emitting plain name scalars, and add regression tests to lock the conversion behavior.

Made-with: Cursor
2026-03-18 18:29:47 +00:00
Tom Boucher
c7954d1ad7 refactor: deduplicate code, add planningPaths helper, annotate empty catches
Code quality refactoring across 9 lib modules:

1. state.cjs: Remove duplicate stateExtractField() definition (lines 12
   vs 184). Replace 3 inline regex escape patterns with escapeRegex()
   from core.cjs. Add getStatePath() local helper for the 15 repeated
   statePath declarations. Import planningPaths from core.

2. core.cjs: Add planningPaths(cwd) helper returning an object with all
   common .planning paths (state, roadmap, project, config, phases,
   requirements). Add planningDir(cwd) shorthand. Export both.

3. init.cjs: Replace Unix-only execSync('find . | grep | head') with
   cross-platform fs.readdirSync recursive walk for code file detection.
   Remove unused child_process import. Fixes Windows compatibility.

4. All lib modules: Annotate 48 empty catch blocks with
   /* intentionally empty */ to distinguish deliberate error swallowing
   from accidental missing handlers. Affected: commands.cjs (8),
   config.cjs (1), core.cjs (4), init.cjs (13), milestone.cjs (3),
   phase.cjs (6), roadmap.cjs (1), state.cjs (3), verify.cjs (9).

All 755 tests pass.
2026-03-18 12:31:20 -04:00
Tom Boucher
0377951a04 feat: context window size awareness for 1M+ models (#1086)
GSD was designed around 200k context windows. With Opus 4.6 / Sonnet 4.6
shipping 1M context at standard pricing, GSD should adapt its strategies.

Changes:
- Add context_window config option (default: 200000, configurable to 1000000)
- Expose context_window in init output so workflows can adapt behavior
- Update execute-phase.md to note context-size-dependent strategies:
  - 200k: paths-only executor context, 10-15% orchestrator budget
  - 1M+: richer context passing, inline small phases, relaxed /clear
- Context monitor already uses percentage-based thresholds (adaptive)

Users can opt in via config.json:
  { "context_window": 1000000 }

Addresses #1086
2026-03-18 12:27:55 -04:00
Tom Boucher
6e612c54d7 fix: embed evolution rules in generated PROJECT.md so agents see them at runtime (#1039)
The <evolution> block in templates/project.md defined requirement lifecycle
rules (validate, invalidate, add, log decisions) but these instructions
only existed in the template — they never made it into the generated
PROJECT.md that agents actually read during phase transitions.

Changes:
- new-project.md: Add ## Evolution section to generated PROJECT.md with
  the phase transition and milestone review checklists
- new-milestone.md: Ensure ## Evolution section exists in PROJECT.md
  (backfills for projects created before this feature)
- execute-phase.md: Add .planning/PROJECT.md to executor <files_to_read>
  so executors have project context (core value, requirements, evolution)
- templates/project.md: Add comment noting the <evolution> block is
  implemented by transition.md and complete-milestone.md
- docs/ARCHITECTURE.md, docs/FEATURES.md: Note evolution rules in
  PROJECT.md descriptions
- CHANGELOG.md: Document the new Evolution section and executor context

Fixes #1039

All 755 tests pass.
2026-03-18 12:26:04 -04:00