* fix: clear phases directory when creating new milestone (#1588)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci: re-run CI with Windows pointer lifecycle fix in main
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Explicitly check that the directory is empty before removing it rather
than relying on rmdirSync throwing ENOTEMPTY when siblings remain.
On Windows that error is not raised reliably, causing the session tmp
directory to be deleted prematurely when sibling pointer files exist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fix(#1572): phase complete now marks bold-wrapped plan checkboxes in ROADMAP.md
(`- [ ] **01-01**` format) by allowing optional `**` around plan IDs in the
planCheckboxPattern regex in both phase.cjs and roadmap.cjs
- fix(#1569): manager init no longer recommends 999.x (BACKLOG) phases as next
actions; add guard in cmdManagerInit that skips phases matching /^999(?:\.|$)/
- fix(#1568): add regression tests confirming init execute-phase respects
model_overrides for executor_model, including when resolve_model_ids is 'omit'
- fix(#1533): reject session_id values containing path traversal sequences
(../, /, \) in gsd-context-monitor and gsd-statusline before constructing
/tmp file paths; add security tests covering both hooks
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When EnterWorktree creates a branch from main instead of the current HEAD
(a known issue on Windows), executor agents now detect the mismatch and
reset their branch base to the correct commit before starting work.
- execute-phase: capture EXPECTED_BASE before spawning, inject
<worktree_branch_check> block into executor prompts
- execute-plan: document Pattern A worktree_branch_check requirement
- quick.md: inject worktree_branch_check into executor prompt
- diagnose-issues: inject worktree_branch_check into debugger prompts
- settings: add workflow.use_worktrees option so Windows users can
disable worktree isolation via /gsd:settings without editing files
Closes#1510
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Detect runtime from execution_context path or env vars at workflow start,
then set INSTRUCTION_FILE (AGENTS.md for Codex, CLAUDE.md for all others).
Pass --output $INSTRUCTION_FILE to generate-claude-md so the helper writes
to the correct file instead of always defaulting to CLAUDE.md.
Also add .codex to skipDirs in init.cjs so Codex runtime directories are
not mistaken for project content during brownfield codebase analysis.
Closes#1521
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Addresses review feedback — checks if opencode output file is
non-empty after invocation, writes a failure message if empty
to prevent blank sections in REVIEWS.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove --copilot alias to avoid collision with existing Copilot concept
- Remove hardcoded model (-m) and variant flags; let user's OpenCode
config determine the model, consistent with other reviewer CLIs
- Use generic "OpenCode Review" section header since model varies by config
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Address review feedback: sanitize manager.flags values to allow only
CLI-safe tokens (--flag patterns and alphanumeric values). Invalid
tokens are dropped with a stderr warning. Prevents prompt injection
via compromised config.json.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds `manager.flags.{discuss,plan,execute}` config keys so users can
configure flags that /gsd:manager passes to each step when dispatching.
For example, `manager.flags.discuss: "--auto --analyze"` makes every
discuss dispatched from the manager include those flags.
Closes#1400
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a new `audit_test_quality` step between `scan_antipatterns` and
`identify_human_verification` that catches test-level deceptions:
- Disabled tests (it.skip/xit/test.todo) covering phase requirements
- Circular tests (system generating its own expected values)
- Weak assertions (existence-only when value-level proof needed)
- Expected value provenance tracking for parity/migration phases
Any blocker from this audit forces `gaps_found` status, preventing
phases from being marked complete with inadequate test evidence.
Fixes#1457
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bring the latest main branch updates into feat/kilo-runtime-support while preserving KILO_CONFIG resolution, Kilo agent permission conversion, and relative .claude path rewrites.
Honor KILO_CONFIG across installer and workflow resolution, preserve Claude agent tool intent as explicit Kilo permissions, and rewrite relative .claude references during Kilo conversion.
Wire withPlanningLock into all ROADMAP.md write paths (phase add/insert/complete/remove, roadmap update-plan-progress) to prevent concurrent corruption when parallel agents modify planning files.
Extract acquireStateLock/releaseStateLock from writeStateMd and add readModifyWriteStateMd helper that holds the lock across the entire read-modify-write cycle, preventing lost updates.
Replace O(n^2) normalizeMd fence detection with single-pass O(n) pre-computed fence state array.
Warn on must_haves parse failure and stateReplaceFieldWithFallback field miss.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add W011: detect when STATE.md says current phase is N but ROADMAP.md shows it as [x] complete (can happen after crash mid-phase-complete). Add W012-W015: validate branching_strategy against known values, context_window as positive integer, phase_branch_template has {phase} placeholder, milestone_branch_template has {milestone} placeholder.
Add stateReplaceFieldWithFallback diagnostic: warn when neither primary nor fallback field name matches in STATE.md (surfaces template drift from external edits).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Read context_window config (default 200000) in execute-phase and plan-phase workflows. When >= 500000 (1M-class models), subagent prompts include richer context: executor agents receive CONTEXT.md, RESEARCH.md, and prior wave SUMMARYs; verifier agents receive all PLANs, SUMMARYs, and REQUIREMENTS.md; planner receives prior phase CONTEXT.md for cross-phase decision consistency.
At 200k (default), behavior is unchanged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Both the gsd-executor and gsd-verifier Task() invocations were missing
the required `description` parameter, causing InputValidationError when
spawning agents in parallel during /gsd:execute-phase.
Reject project/workstream names containing path separators or ..
components. Covers both GSD_PROJECT and GSD_WORKSTREAM. Adds 9 tests
for the full resolution matrix and traversal rejection cases.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds OpenCode CLI as a 5th reviewer option, enabling teams with GitHub
Copilot subscriptions to leverage Copilot-routed models (e.g.
gpt-5.3-codex) for cross-AI plan reviews.
Closes#1520
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add check-commit command to gsd-tools that acts as a pre-commit guard.
When commit_docs is false, rejects commits that stage .planning/ files
with an actionable error message including the unstage command.
Recreated cleanly on current main — previous version carried stale
shared fixes that are now upstream.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The autonomous workflow previously had two extremes: full auto-answer
mode (--auto discuss, lean context but no user input) or manager mode
(interactive but bloated context from accumulating everything inline).
The --interactive flag bridges this gap:
- Discuss runs inline via gsd:discuss-phase (asks questions, waits for
user answers — preserving all design decisions)
- Plan and execute dispatch as background agents (fresh context per
phase — no accumulation in the main session)
- Pipeline parallelism: discuss Phase N+1 while Phase N builds in the
background
This keeps the main context lean (only discuss conversations accumulate)
while preserving user input on all decisions. Particularly helpful for
users hitting context limits with /gsd:manager on multi-phase milestones.
Usage:
/gsd:autonomous --interactive
/gsd:autonomous --interactive --from 3
/gsd:autonomous --interactive --only 5
Also adds --only N flag parsing to the upstream workflow (previously only
in PR #1444's branch).
Closes#1413
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The map-codebase workflow had a hardcoded 300000ms (5 minute) timeout
for parallel subagent tasks. On large codebases or with slower models
(e.g. GPT via Codex), subagents can need 10-20+ minutes, causing the
parent to kill still-working agents and fall back to sequential mode.
Changes:
- Add workflow.subagent_timeout config key (default: 300000ms)
- Register in VALID_CONFIG_KEYS (config.cjs)
- Add to loadConfig() defaults and return object (core.cjs)
- Emit in map-codebase init context (init.cjs)
- Update map-codebase.md to use config value instead of hardcoded 300000
- Document in planning-config.md reference
Users can now increase the timeout via:
/gsd:settings workflow.subagent_timeout 900000
Closes#1472
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds `git.base_branch` config option that controls the target branch
for PRs and merges. When unset, auto-detects from origin/HEAD and
falls back to "main".
This fixes projects using `master`, `develop`, or any other default
branch — previously `/gsd:ship` would create PRs targeting `main`
(which may not exist) and `/gsd:complete-milestone` would try to
checkout `main` and fail.
Changes:
- config.cjs: add git.base_branch to valid config keys
- planning-config.md: document the option with auto-detect behavior
- ship.md: detect base branch at init, use in PR create, branch
detection, push report, and completion report
- complete-milestone.md: detect base branch, use for squash merge
and merge-with-history checkout targets
- 1 new test for config-set git.base_branch
Usage:
gsd-tools config-set git.base_branch master
Or auto-detect (default — reads origin/HEAD):
git.base_branch: null
Closes#1466
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When phase numbers are globally sequential across milestones (e.g.,
phases 61-67), the banner showed "Phase 63/5" where 5 was the count of
remaining phases — easily mistaken for "63 out of 5 total." Clarify
that T must be total milestone phases and add fallback display format
for when phase numbers exceed the total count.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
workstream set with no argument silently cleared the active workstream,
a footgun for users who forgot the name. Now requires a name arg and
errors with usage hint. Explicit clearing via --clear flag, which also
reports the previous workstream in its output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>