Commit Graph

92 Commits

Author SHA1 Message Date
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
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
d77956f6bd Merge pull request #1192 from trek-e/feat/gsd-fast-command-609 2026-03-18 18:08:00 -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
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
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
e84999663c feat(discuss-phase): cross-reference pending todos against phase scope
Add a cross_reference_todos step to discuss-phase that surfaces relevant
backlog items before scope-setting decisions are made.

Implementation:
- New 'todo match-phase <N>' CLI command (commands.cjs) that scores
  pending todos against a phase's ROADMAP goal using three heuristics:
  keyword overlap, area match, and file path overlap
- New cross_reference_todos step in discuss-phase.md between
  load_prior_context and scout_codebase
- CONTEXT.md template gains 'Folded Todos' subsection in <decisions>
  and 'Reviewed Todos (not folded)' subsection in <deferred>

Design:
- No AI call for matching — pure keyword/area/file heuristics for speed
- Silent skip when todo_count is 0 or no matches (no workflow slowdown)
- Auto mode folds all todos with score >= 0.4 automatically
- Scoring: keywords (up to 0.6), area match (0.3), file overlap (0.4)

Tests: 5 new tests covering empty state, keyword matching, unrelated
todo exclusion, area matching, and score sorting.

Closes #1111
2026-03-18 12:25:04 -04:00
Tom Boucher
0f112abf55 fix: remove model:inherit from OpenCode agent conversion (#1156)
OpenCode does not recognize 'model: inherit' as a valid model identifier —
it throws ProviderModelNotFoundError when spawning any GSD subagent.

Changes:
- Remove 'model: inherit' injection for OpenCode agents in install.js
- Strip 'model:' field entirely during OpenCode frontmatter conversion
  (OpenCode uses its configured default model when no model is specified)
- Update tests to verify model: inherit is NOT added

This fixes all 15 GSD agent definitions and the gsd-set-profile command
for OpenCode users.

Fixes #1156
2026-03-18 12:23:41 -04:00
Lex Christopherson
fc468adb42 fix(tests): update copilot skill count assertions for ship and next commands
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:16:26 -06:00
Tom Boucher
41f8cd48ed feat: add /gsd:next command for automatic workflow advancement (#927) (#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 #927
2026-03-18 09:56:35 -06:00
Tom Boucher
1efc74af51 refactor(tests): consolidate runtime converters, remove duplicate tests, standardize helpers (#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)
2026-03-18 09:56:25 -06:00
Tom Boucher
93dc3d134f test: add coverage for model-profiles, template, profile-pipeline, profile-output (#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)
2026-03-18 09:55:55 -06:00
Tom Boucher
460f92e727 feat: normalize generated markdown for markdownlint compliance (#1112)
Add normalizeMd() utility that fixes common markdownlint violations
in GSD-generated .planning/ files, improving IDE readability:

  MD022 — Blank lines around headings
  MD031 — Blank lines around fenced code blocks
  MD032 — Blank lines around lists
  MD012 — No multiple consecutive blank lines (collapsed to max 2)
  MD047 — Files end with a single newline

Applied at key write points:
  - state.cjs: writeStateMd() normalizes STATE.md on every write
  - frontmatter.cjs: frontmatter set/merge commands normalize output
  - template.cjs: template fill normalizes generated plan/summary files
  - milestone.cjs: MILESTONES.md archive writes normalized

Includes 14 new tests covering all rules, edge cases (CRLF, frontmatter,
ordered lists, code blocks, real-world STATE.md patterns).

Closes #1040
2026-03-16 13:39:34 -06:00
Maxim Brashenko
f2adc0cec4 fix(milestone): make requirements mark-complete idempotent (#948)
Previously, calling `mark-complete` on already-completed requirements
reported them as `not_found`, since the regex only matched unchecked
`[ ]` checkboxes and `Pending` table cells.

Now detects `[x]` checkboxes and `Complete` table cells and returns
them in a new `already_complete` array instead of `not_found`.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 11:39:54 -06:00
Lex Christopherson
3da844af83 fix(tests): update copilot install count assertions for developer profiling
PR #1084 added profile-user command and gsd-user-profiler agent but
didn't bump the hardcoded count assertions in copilot-install tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 09:59:56 -06:00
jecanore
4cf6c04a3e feat: add developer profiling pipeline (#1084)
Analyze Claude Code session history to build behavioral profiles across
8 dimensions (communication, decisions, debugging, UX, vendor choices,
frustrations, learning style, explanation depth). Profiles generate
USER-PROFILE.md, dev-preferences command, and CLAUDE.md profile section.

New modules:
- profile-pipeline.cjs: session scanning, message extraction, sampling
- profile-output.cjs: profile rendering, questionnaire, artifact generation

New files:
- agents/gsd-user-profiler.md: profiler agent (8-dimension scoring)
- commands/gsd/profile-user.md: user-facing command
- workflows/profile-user.md: orchestration workflow
- templates/: user-profile, dev-preferences, claude-md templates
- references/user-profiling.md: detection heuristics reference

8 new CLI commands: scan-sessions, extract-messages, profile-sample,
write-profile, profile-questionnaire, generate-dev-preferences,
generate-claude-profile, generate-claude-md

Co-authored-by: TÂCHES <afromanguy@me.com>
2026-03-16 09:46:00 -06:00
Lex Christopherson
f722623a85 fix(tests): update model resolution assertions to match opus-direct behavior 2026-03-16 09:05:41 -06:00
Rezolv
e1f6d11655 feat(note): add zero-friction note capture command (#1080) 2026-03-16 08:50:19 -06:00
Colin Johnson
0fde04f561 fix(stats): correct git and roadmap reporting (#1066) 2026-03-15 19:31:28 -06:00
Berkay Karaman
a5f5d50f14 feat: add Antigravity runtime support (#1058)
* feat: add Antigravity runtime support

Add full installation support for the Antigravity AI agent, bringing
get-shit-done capabilities to the new runtime alongside Claude Code,
OpenCode, Gemini, Codex, and Copilot.

- New runtime installation capability in bin/install.js
- Commands natively copied to the unified skills directory
- New test integration suite: tests/antigravity-install.test.cjs
- Refactored copy utility to accommodate Antigravity syntax
- Documentation added into README.md

Co-authored-by: Antigravity <noreply@google.com>

* fix: add missing processAttribution call in copyCommandsAsAntigravitySkills

Antigravity SKILL.md files were written without commit attribution metadata,
inconsistent with the Copilot equivalent (copyCommandsAsCopilotSkills) which
calls processAttribution on each skill's content before writing it.

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

* fix: update Copilot install test assertions for 3 new UI agents

* docs: update CHANGELOG for Antigravity runtime support

---------

Co-authored-by: Antigravity <noreply@google.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-15 19:31:01 -06:00
Rezolv
4aea69e02c feat(do): add freeform text router command (#1067)
* feat(do): add freeform text router command

* test(do): update expected skill count from 36 to 37
2026-03-15 19:30:46 -06:00
Colin Johnson
6de816f68c fix(init): prefer current milestone phase-op targets (#1068) 2026-03-15 19:30:28 -06:00
Lex Christopherson
6b5704aa78 fix: remove invalid skills frontmatter from UI agents and update test counts
Strip unsupported `skills:` key from gsd-ui-auditor, gsd-ui-checker, and
gsd-ui-researcher agent frontmatter. Update Copilot install test expectations
to 36 skills / 15 agents.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 11:49:07 -06:00
TÂCHES
ddb9923df2 feat(quick): add --research flag for focused pre-planning research (#317) (#1063)
Add composable --research flag to /gsd:quick that spawns a focused
gsd-phase-researcher before planning. Investigates implementation
approaches, library options, and pitfalls for the task.

Addresses the middle-ground gap between quick (no quality agents) and
full milestone workflows. All three flags are composable:
--discuss --research --full gives the complete quality pipeline.

Made-with: Cursor

Co-authored-by: ralberts3 <ralberts3@gatech.edu>
2026-03-15 11:45:25 -06:00
Aly Thobani
44de7c210c feat: Programmatic implementation of /gsd:set-profile command (#1007)
* perf: make `/gsd:set-profile`'s implementation more programmatic

* perf: run the set-profile script without Claude needing to invoke it

- inject the script's output as dynamic context into the set-profile skill, so that Claude doesn't
  need to invoke it and can simply read + print the output to the user
  - reference: https://code.claude.com/docs/en/skills#inject-dynamic-context

* feat: improve output message for case where model profile wasn't changed

* feat: specify haiku model for set-profile command since it's so simple

* fix: remove ' (default)' from previousProfile to avoid false negative for didChange

* chore: add docstring to MODEL_PROFILES with note about the analogous markdown reference table

* chore: delete set-profile workflow file that's no longer needed
2026-03-15 11:45:14 -06:00
flongstaff
386fc0f40c fix: handle agent frontmatter correctly in OpenCode conversion (#981)
convertClaudeToOpencodeFrontmatter() was designed for commands but is
also called for agents. For agents it incorrectly strips name: (needed
by OpenCode agents), keeps color:/skills:/tools: (should strip), and
doesn't add model: inherit / mode: subagent (required by OpenCode).

Add isAgent option to convertClaudeToOpencodeFrontmatter() so agent
installs get correct frontmatter: name preserved, Claude-only fields
stripped, model/mode injected. Command conversion unchanged (default).

Includes 14 test cases covering agent and command conversion paths.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 11:42:12 -06:00
jorge g
698985feb1 feat: add inherit model profile for OpenCode /model (#951) 2026-03-15 11:40:08 -06:00
Shard
ca4ae7b3b8 fix: scope ROADMAP.md searches to current milestone (#1059)
Phase numbers reset per milestone (v1.0 Phase 1-26, v1.1 Phase 1-6,
v1.2 Phase 1-6). Functions that searched ROADMAP.md for phase headings
or checkboxes would match archived milestone entries inside <details>
blocks before reaching the current milestone's entries.

This caused:
- roadmap_complete: true for phases that aren't complete (checkbox
  regex matched the archived [x] Phase N from a previous milestone)
- phase-complete marking the wrong checkbox (archived instead of current)
- phase-add computing wrong maxPhase from archived headings
- progress not showing phases defined in ROADMAP but not yet on disk
2026-03-15 11:39:59 -06:00
Maxim Brashenko
eba9423ce0 fix(config): prevent workflow.research reset during milestone transitions
Two bugs caused workflow.research to silently reset to false:

1. new-milestone.md unconditionally overwrote workflow.research via
   config-set after asking about research — coupling a per-milestone
   decision to a persistent user preference. Now the research question
   is per-invocation only; persistent config changes via /gsd:settings.

2. verify.cjs health repair (createConfig/resetConfig) used flat keys
   (research, plan_checker, verifier) instead of the canonical nested
   workflow object from config.cjs, also missing branch templates,
   nyquist_validation, and brave_search fields.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 10:08:59 -06:00
Frank
63823c2e8a fix: skip no-research nyquist artifact gating (closes #980) 2026-03-15 10:08:57 -06:00
ashanuoc
944df19926 feat: add /gsd:stats command for project statistics
Add a new `/gsd:stats` command that displays comprehensive project
statistics including phase progress, plan execution metrics, requirements
completion, git history, and timeline information.

- New command definition: commands/gsd/stats.md
- New workflow: get-shit-done/workflows/stats.md
- CLI handler: `gsd-tools stats [json|table]`
- Stats function in commands.cjs with JSON and table output formats
- 5 new tests covering empty project, phase/plan counting, requirements
  counting, last activity, and table format rendering

Co-authored-by: ashanuoc <ashanuoc@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 21:58:09 -06:00
ashanuoc
c82c0a76b9 fix(phase-complete): improve REQUIREMENTS.md traceability updates (closes #848)
- Scope phase section regex to prevent cross-phase boundary matching
- Handle 'In Progress' status in traceability table (not just 'Pending')
- Add requirements_updated field to phase complete result object
- Add 3 new tests: result field, In Progress status, cross-boundary safety

Co-authored-by: ashanuoc <ashanuoc@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 21:57:48 -06:00
TÂCHES
b4781449f8 fix: remove deprecated Codex config keys causing UI instability (#1051)
* fix: remove deprecated Codex config keys causing UI instability (closes #1037)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: update codex config tests to match simplified config structure

Tests asserted the old config structure ([features] section, multi_agent,
default_mode_request_user_input, [agents] table with max_threads/max_depth)
that was deliberately removed. Tests now verify the new behavior: config
block contains only the GSD marker and per-agent [agents.gsd-*] sections.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:30:09 -06:00
TÂCHES
1d3d1f3f5e fix: strip skills: from agent frontmatter for Gemini compatibility (#1045)
* fix: remove dangling skills: from agent frontmatter and strip in Gemini converter (closes #1023, closes #953, closes #930)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: invert skills frontmatter test to assert absence (fixes CI)

The PR deliberately removed skills: from agent frontmatter (breaks
Gemini CLI), but the test still asserted its presence. Inverted the
assertion to ensure skills: stays removed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:25:02 -06:00
erre
c71c15c76e feat: add Copilot CLI runtime support and gsd-autonomous skill (#911)
* gsd: Installed

* docs: complete project research

Research for adding GitHub Copilot CLI as 5th runtime to installer.

Files:
- STACK.md: Zero new deps, Copilot reads from .github/, tool name mapping
- FEATURES.md: 18 table stakes, 4 differentiators, 6 anti-features
- ARCHITECTURE.md: Codex-parallel pattern, 5 new functions, 12 existing changes
- PITFALLS.md: 10 pitfalls with prevention strategies and phase mapping
- SUMMARY.md: Synthesized findings, 4-phase roadmap suggestion

* docs(01): create phase plan for core installer plumbing

* feat(01-01): add Copilot as 5th runtime across all install.js locations

- Add --copilot flag parsing and selectedRuntimes integration
- Add 'copilot' to --all array (5 runtimes)
- getDirName('copilot') returns '.github' (local path)
- getGlobalDir('copilot') returns ~/.copilot with COPILOT_CONFIG_DIR override
- getConfigDirFromHome handles copilot for both local/global
- Banner and help text updated to include Copilot
- promptRuntime: Copilot as option 5, All renumbered to option 6
- install(): isCopilot variable, runtimeLabel, skip hooks (Codex pattern)
- install(): Copilot early return before hooks/settings configuration
- finishInstall(): Copilot program name and /gsd-new-project command
- uninstall(): Copilot runtime label and isCopilot variable
- GSD_TEST_MODE exports: getDirName, getGlobalDir, getConfigDirFromHome

* test(01-01): add Copilot plumbing unit tests

- 19 tests covering getDirName, getGlobalDir, getConfigDirFromHome
- getGlobalDir: default path, explicit dir, COPILOT_CONFIG_DIR env var, priority
- Source code integration checks for CLI-01 through CLI-06
- Verifies --both flag unchanged, hooks skipped, prompt options correct
- All 481 tests pass (19 new + 462 existing, no regressions)

* docs(01-01): complete core installer plumbing plan

- Mark Phase 1 and Plan 01-01 as complete in ROADMAP.md
- All 6 requirements (CLI-01 through CLI-06) fulfilled

* gsd: planning

* docs(02): create phase 2 content conversion engine plans

* feat(02-01): add Copilot tool mapping constant and conversion functions

- Add claudeToCopilotTools constant (13 Claude→Copilot tool mappings)
- Add convertCopilotToolName() with mcp__context7__ wildcard handling
- Add convertClaudeToCopilotContent() for CONV-06 (4 path patterns) + CONV-07 (gsd:→gsd-)
- Add convertClaudeCommandToCopilotSkill() for skill frontmatter transformation
- Add convertClaudeAgentToCopilotAgent() with tool dedup and JSON array format
- Export all new functions + constant via GSD_TEST_MODE

* feat(02-01): wire Copilot conversion into install() flow

- Add copyCommandsAsCopilotSkills() for folder-per-skill structure
- Add isCopilot branch in install() skill copy section
- Add isCopilot branch in agent loop with .agent.md rename
- Skip generic path replacement for Copilot (converter handles it)
- Add isCopilot branch in copyWithPathReplacement for .md files
- Add .cjs/.js content transformation for CONV-06/CONV-07
- Export copyCommandsAsCopilotSkills via GSD_TEST_MODE
- CONV-09 not generated (discarded), CONV-10 confirmed working

* docs(02-01): complete content conversion engine plan

- Create 02-01-SUMMARY.md with execution results
- Update STATE.md with Phase 2 position and decisions
- Mark CONV-01 through CONV-10 requirements complete

* test(02-02): add unit tests for Copilot conversion functions

- 16 tests for convertCopilotToolName (all 12 direct mappings, mcp prefix, wildcard, unknown fallback, constant size)
- 8 tests for convertClaudeToCopilotContent (4 path patterns, gsd: conversion, mixed content, no double-replace, passthrough)
- 7 tests for convertClaudeCommandToCopilotSkill (all fields, missing optional fields, CONV-06/07, no frontmatter, agent field)
- 7 tests for convertClaudeAgentToCopilotAgent (dedup, JSON array, field preservation, mcp tools, no tools, CONV-06/07, no frontmatter)

* test(02-02): add integration tests for Copilot skill copy and agent conversion

- copyCommandsAsCopilotSkills produces 31 skill folders with SKILL.md files
- Skill content verified: comma-separated allowed-tools, no YAML multiline, CONV-06/07 applied
- Old skill directories cleaned up on re-run
- gsd-executor agent: 6 tools → 4 after dedup (Write+Edit→edit, Grep+Glob→search)
- gsd-phase-researcher: mcp__context7__* wildcard → io.github.upstash/context7/*
- All 11 agents convert without error, all have frontmatter and tools
- Engine .md and .cjs files: no ~/.claude/ or gsd: references after conversion
- Full suite: 527 tests pass, zero regressions

* docs(02-02): complete Copilot conversion test suite plan

- SUMMARY: 46 new tests covering all conversion functions
- STATE: Phase 02 complete, 3/3 plans done
- ROADMAP: Phase 02 marked complete

* docs(03): research phase domain

* docs(03-instructions-lifecycle): create phase plan

* feat(03-01): add copilot-instructions template and merge/strip functions

- Create get-shit-done/templates/copilot-instructions.md with 5 GSD instructions
- Add GSD_COPILOT_INSTRUCTIONS_MARKER and GSD_COPILOT_INSTRUCTIONS_CLOSE_MARKER constants
- Add mergeCopilotInstructions() with 3-case merge (create, replace, append)
- Add stripGsdFromCopilotInstructions() with null-return for GSD-only content

* feat(03-01): wire install, fix uninstall/manifest/patches for Copilot

- Wire mergeCopilotInstructions() into install() before Copilot early return
- Add else-if isCopilot uninstall branch: remove skills/gsd-*/ + clean instructions
- Fix writeManifest() to hash Copilot skills: (isCodex || isCopilot)
- Fix reportLocalPatches() to show /gsd-reapply-patches for Copilot
- Export new functions and constants in GSD_TEST_MODE
- All 527 existing tests pass with zero regressions

* docs(03-01): complete instructions lifecycle plan

- Create 03-01-SUMMARY.md with execution results
- Update STATE.md: Phase 3 Plan 1 position, decisions, session
- Update ROADMAP.md: Phase 03 progress (1/2 plans)
- Mark INST-01, INST-02, LIFE-01, LIFE-02, LIFE-03 complete

* test(03-02): add unit tests for mergeCopilotInstructions and stripGsdFromCopilotInstructions

- 10 new tests: 5 merge cases + 5 strip cases
- Tests cover create/replace/append merge scenarios
- Tests cover null-return, content preservation, no-markers passthrough
- Added beforeEach/afterEach imports for temp dir lifecycle
- Exported writeManifest and reportLocalPatches via GSD_TEST_MODE for Task 2

* test(03-02): add integration tests for uninstall, manifest, and patches Copilot fixes

- 3 uninstall tests: gsd-* skill identification, instructions cleanup, GSD-only deletion
- writeManifest hashes Copilot skills in manifest JSON (proves isCopilot fix)
- reportLocalPatches uses /gsd-reapply-patches for Copilot (dash format)
- reportLocalPatches uses /gsd:reapply-patches for Claude (no regression)
- Full suite: 543 tests pass, 0 failures

* docs(03-02): complete instructions lifecycle tests plan

- SUMMARY.md with 16 new tests documented
- STATE.md updated: Phase 3 complete, 5/5 plans done
- ROADMAP.md updated: Phase 03 marked complete

* docs(04): capture phase context

* docs(04): research phase domain

* docs(04): create phase plan — E2E integration tests for Copilot install/uninstall

* test(04-01): add E2E Copilot full install verification tests

- 9 tests: skills count/structure, agents count/names, instructions markers
- Manifest structure, categories, SHA256 integrity verification
- Engine directory completeness (bin, references, templates, workflows, CHANGELOG, VERSION)
- Uses execFileSync in isolated /tmp dirs with GSD_TEST_MODE stripped from env

* test(04-01): add E2E Copilot uninstall verification tests

- 6 tests: engine removal, instructions removal, GSD skills/agents cleanup
- Preserves non-GSD custom skills and agents after uninstall
- Standalone lifecycle tests for preservation (install → add custom → uninstall → verify)
- Full suite: 558 tests passing, 0 failures

* docs(04-01): complete E2E Copilot install/uninstall integration tests plan

- SUMMARY.md: 15 E2E tests, SHA256 integrity, 558 total tests passing
- STATE.md: Phase 4 complete, 6/6 plans done
- ROADMAP.md: Phase 4 marked complete
- REQUIREMENTS.md: QUAL-01 complete, QUAL-02 out of scope

* fix: use .github paths for Copilot --local instead of ~/.copilot

convertClaudeToCopilotContent() was hardcoded to always map ~/.claude/
and $HOME/.claude/ to ~/.copilot/ and $HOME/.copilot/ regardless of
install mode. For --local installs these should map to .github/ (repo-
relative, no ./ prefix) since Copilot resolves @file references from
the repo root.

Local mode:  ~/.claude/ → .github/  |  $HOME/.claude/ → .github/
Global mode: ~/.claude/ → ~/.copilot/  |  $HOME/.claude/ → $HOME/.copilot/

Added isGlobal parameter to convertClaudeToCopilotContent,
convertClaudeCommandToCopilotSkill, convertClaudeAgentToCopilotAgent,
copyCommandsAsCopilotSkills, and copyWithPathReplacement. All call
sites in install() now pass isGlobal through.

Tests updated to cover both local (default) and global modes.
565 tests passing, 0 failures.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: use double quotes for argument-hint in Copilot skills

The converter was hardcoding single quotes around argument-hint values
in skill frontmatter. This breaks YAML parsing when the value itself
contains single quotes (e.g., "e.g., 'v1.1 Notifications'").

Now uses yamlQuote() (JSON.stringify) which produces double-quoted
strings with proper escaping.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: complete v1.23 milestone — Copilot CLI Support

Archive milestone artifacts, retrospective, and update project docs.

- Archive: v1.23-ROADMAP.md, v1.23-REQUIREMENTS.md, v1.23-MILESTONE-AUDIT.md
- Create: MILESTONES.md, RETROSPECTIVE.md
- Evolve: PROJECT.md (validated reqs, key decisions, shipped context)
- Reorganize: ROADMAP.md (collapsed v1.23, progress table)
- Update: STATE.md (status: completed)
- Delete: REQUIREMENTS.md (archived, fresh for next milestone)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: archive phase directories from v1.23 milestone

* chore: Clean gsd tracking

* fix: update test counts for new upstream commands and agents

Upstream added validate-phase command (32 skills) and nyquist-auditor agent (12 agents).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: Remove copilot instructions

* chore: Improve loop

* gsd: installation

* docs: start milestone v1.24 Autonomous Skill

* docs: internal research for autonomous skill

* docs: define milestone v1.24 requirements

* docs: create milestone v1.24 roadmap (4 phases)

* docs: phase 5 context — skill scaffolding decisions

* docs(5): research phase domain

* docs(05): create phase plan — 2 plans in 2 waves

* docs(phase-5): add validation strategy

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test(05-01): add failing tests for colon-outside-bold regex format

- Test get-phase with **Goal**: format (colon outside bold)
- Test analyze with **Goal**: and **Depends on**: formats
- Test mixed colon-inside and colon-outside bold formats
- All 3 new tests fail confirming the regex bug

* fix(05-01): fix regex for goal/depends_on extraction in roadmap.cjs

- Fix 3 regex patterns to support both **Goal:** and **Goal**: formats
- Pattern: /\*\*Goal(?::\*\*|\*\*:)/ handles colon inside or outside bold
- Fix in both source (get-shit-done/) and runtime (.github/) copies
- All 28 tests pass including 4 new colon-outside-bold tests
- Live verification: all 4 phases return non-null goals from real ROADMAP.md

* feat(05-01): create gsd:autonomous command file

- name: gsd:autonomous with argument-hint: [--from N]
- Sections: objective, execution_context, context, process
- References workflows/autonomous.md and references/ui-brand.md
- Follows exact pattern of new-milestone.md (42 lines)

* docs(05-01): complete roadmap regex fix + autonomous command plan

* feat(05-02): create autonomous workflow with phase discovery and Skill() execution

- Initialize step with milestone-op bootstrap and --from N flag parsing
- Phase discovery via roadmap analyze with incomplete filtering and sort
- Execute step uses Skill() flat calls for discuss/plan/execute (not Task())
- Progress banner: GSD ► AUTONOMOUS ▸ Phase N/T format with bar
- Iterate step re-reads ROADMAP.md after each phase for dynamic phase detection
- Handle blocker step with retry/skip/stop user options

* test(05-02): add autonomous skill generation tests and fix skill count

- Test autonomous.md converts to gsd-autonomous Copilot skill with correct frontmatter
- Test CONV-07 converts gsd: to gsd- in autonomous command body content
- Update skill count from 32 to 33 (autonomous.md added in plan 01)
- All 645 tests pass across full suite

* docs(05-02): complete autonomous workflow plan

* docs: phase 5 complete — update roadmap and state

* docs: phase 6 context — smart discuss decisions

* docs(06): research smart discuss phase domain

* docs(06): create phase plan

* feat(06-01): replace Skill(discuss-phase) with inline smart discuss

- Add <step name="smart_discuss"> with 5 sub-steps: load prior context, scout codebase, analyze phase with infrastructure detection, present proposals per area in tables, write CONTEXT.md
- Rewire execute_phase step 3a: check has_context before/after, reference smart_discuss inline
- Remove Skill(gsd:discuss-phase) call entirely
- Preserve Skill(gsd:plan-phase) and Skill(gsd:execute-phase) calls unchanged
- Update success criteria to mention smart discuss
- Grey area proposals use table format with recommended/alternative columns
- AskUserQuestion offers Accept all, Change QN, Discuss deeper per area
- Infrastructure phases auto-detected and skip to minimal CONTEXT.md
- CONTEXT.md output uses identical XML-wrapped sections as discuss-phase.md

* docs(06-01): complete smart discuss inline logic plan

* docs(07): phase execution chain context — flag strategy, validation routing, error recovery

* docs(07): research phase execution chain domain

* docs(07): create phase plan

* feat(07-01): wire phase execution chain with verification routing

- Add --no-transition flag to execute-phase Skill() call in step 3c
- Replace step 3d transition with VERIFICATION.md-based routing
- Route on passed/human_needed/gaps_found with appropriate user prompts
- Add gap closure cycle with 1-retry limit to prevent infinite loops
- Route execute-phase failures (no VERIFICATION.md) to handle_blocker
- Update success_criteria with all new verification behaviors

* docs(07-01): complete phase execution chain plan

* docs(08): multi-phase orchestration & lifecycle context

* docs(08): research phase domain

* docs(08): create phase plan

* feat(08-01): add lifecycle step, fix progress bar, document smart_discuss

- Add lifecycle step (audit→complete→cleanup) after all phases complete
- Fix progress bar N/T to use phase number/total milestone phases
- Add smart_discuss CTRL-03 compliance documentation note
- Rewire iterate step to route to lifecycle instead of manual banner
- Renumber handle_blocker from step 5 to step 6
- Add 10 lifecycle-related items to success criteria
- File grows from 630 to 743 lines, 6 to 7 named steps

* docs(08-01): complete multi-phase orchestration & lifecycle plan

* docs: v1.24 milestone audit — passed (18/18 requirements)

* chore: complete v1.24 milestone — Autonomous Skill

* chore: archive phase directories from v1.24 milestone

* gsd: clean

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-14 17:41:19 -06:00
Frank
0f38e3467e fix: strip unsupported Gemini agent skills frontmatter (#971) 2026-03-12 11:36:43 -06:00
Fana
c81b20eb04 fix: plan-phase Nyquist validation when research is disabled (#980) (#1002)
* fix: plan-phase Nyquist validation when research is disabled (#980)

plan-phase step 5.5 required Nyquist artifacts even when research was
disabled, creating an impossible state: no RESEARCH.md to extract
Validation Architecture from. Step 7.5 then told Claude to "disable
Nyquist in config" without specifying the exact key, causing Claude to
guess wrong keys that config-set silently accepted.

Three fixes:
- plan-phase step 5.5: skip when research_enabled is false
- plan-phase step 7.5: specify exact config-set command for disabling
- config-set: reject unknown keys with whitelist validation

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

* test: update config-set tests for key whitelist validation

Tests that used arbitrary keys (some_number, some_string, a.b.c) now
use valid config keys to test the same coercion and nesting behavior.
Adds new test asserting unknown keys are rejected with error.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:36:11 -06:00
Artspark
bc3d6db1c0 fix: emit valid codex agent TOML (#1008) 2026-03-12 11:36:04 -06:00
闫冰
75d21866c8 feat(quick): replace auto-increment number with YYMMDD-xxx timestamp ID (#1012)
Quick task IDs were sequential integers (001, 002...) computed by reading
the local .planning/quick/ directory max value. Two users running /gsd:quick
simultaneously would get the same number, causing directory collisions on git.

Replace with a collision-resistant format: YYMMDD-xxx where xxx is the
number of 2-second blocks elapsed since midnight, encoded as 3 lowercase
Base36 characters (000–xbz). Practical collision window is ~2 seconds per
user — effectively zero for any realistic team workflow.

- init.cjs: remove nextNum scan logic, generate quickId from wall clock
- quick.md: rename all next_num refs to quick_id, update directory patterns
- init.test.cjs: rewrite cmdInitQuick tests for new ID format

Co-authored-by: yanbing <yanbing@corp.netease.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:35:59 -06:00
Fana
ef032bc8f1 feat: harden Nyquist defaults, add retroactive validation, compress prompts (#855)
* fix: change nyquist_validation default to true and harden absent-key skip conditions

new-project.md never wrote the key, so agents reading config directly
treated absent as falsy. Changed all agent skip conditions from "is false"
to "explicitly set to false; absent = enabled". Default changed from false
to true in core.cjs, config.cjs, and templates/config.json.

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

* fix: enforce VALIDATION.md creation with verification gate and Check 8e

Step 5.5 was narrative markdown that Claude skipped under context pressure.
Now MANDATORY with Write tool requirement and file-existence verification.
Step 7.5 gates planner spawn on VALIDATION.md presence. Check 8e blocks
Dimension 8 if file missing.

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

* feat: add W008/W009 health checks and addNyquistKey repair for Nyquist drift detection

W008 warns when workflow.nyquist_validation key is absent from config.json
(agents may skip validation). W009 warns when RESEARCH.md has Validation
Architecture section but no VALIDATION.md file exists. addNyquistKey repair
adds the missing key with default true value.

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

* feat: add /gsd:validate-phase command and gsd-nyquist-auditor agent

Retroactively applies Nyquist validation to already-executed phases.
Works mid-milestone and post-milestone. Detects existing test coverage,
maps gaps to phase requirements, writes missing tests, debugs failing
ones, and produces {phase}-VALIDATION.md from existing artifacts.

Handles three states: VALIDATION.md exists (audit + update), no
VALIDATION.md (reconstruct from PLAN.md + SUMMARY.md), phase not yet
executed (exit cleanly with guidance).

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

* feat: audit-milestone reports Nyquist compliance gaps across phases

Adds Nyquist coverage table to audit-milestone output when
workflow.nyquist_validation is true. Identifies phases missing
VALIDATION.md or with nyquist_compliant: false/partial.
Routes to /gsd:validate-phase for resolution. Updates USER-GUIDE
with retroactive validation documentation.

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

* refactor: compress Nyquist prompts to match GSD meta-prompt density conventions

Auditor agent: deleted philosophy section (35 lines), compressed execution
flow 60%, removed redundant constraints. Workflow: cut purpose bloat,
collapsed state narrative, compressed auditor spawn template. Command:
removed redundant process section. Plan-phase Steps 5.5/7.5: replaced
hedging language with directives. Audit-milestone Step 5.5: collapsed
sub-steps into inline instructions. Net: -376 lines.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 11:19:44 -06:00
Tibsfox
8b8d1074b8 fix(milestone): deduplicate phase filter and handle empty MILESTONES.md
Two hardening changes to cmdMilestoneComplete:

1. Replace 27 lines of inline isDirInMilestone logic (roadmap parsing,
   normalization, and matching) with a single call to the shared
   getMilestonePhaseFilter(cwd) from core.cjs. The inline copy was
   identical to the core version — deduplicating prevents future drift.

2. Handle empty MILESTONES.md files. Previously, an existing but empty
   file would fall into the headerMatch branch and produce malformed
   output. Now an empty file is treated the same as a missing one,
   writing the standard "# Milestones" header before the entry.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:01:54 -06:00
Tibsfox
3d926496d9 test(agents): add 47 agent frontmatter and spawn consistency tests
New test suite covering:
- HDOC: anti-heredoc instruction present in all 9 file-writing agents
- SKILL: skills: frontmatter present in all 11 agents
- HOOK: commented hooks pattern in file-writing agents
- SPAWN: no stale workaround patterns, valid agent type references
- AGENT: required frontmatter fields (name, description, tools, color)

509 total tests (462 existing + 47 new), 0 failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:01:54 -06:00
j2h4u
e1b3277869 fix(state): derive total_phases from ROADMAP when phases lack directories
Phases listed in ROADMAP.md but not yet planned (no directory on disk)
were excluded from total_phases, causing premature milestone completion.
Now uses Math.max(diskDirs, roadmapCount) via filter.phaseCount.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:07:53 -06:00
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
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
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
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