Commit Graph

1212 Commits

Author SHA1 Message Date
Tom Boucher
9bf85fb97d fix(install): add matcher and timeout to context-monitor hook (#1246)
The gsd-context-monitor PostToolUse hook was configured without a
matcher or timeout, causing it to fire on every tool use including
Read, Glob, and Grep. When multiple Read calls happen in parallel,
some hook processes failed with errors.

Added matcher: 'Bash|Edit|Write|MultiEdit|Agent|Task' to limit the
hook to tools that actually modify context significantly. Added
timeout: 10 to prevent hangs.

Includes migration logic: existing installations without matcher/timeout
get them added on next /gsd:update.
2026-03-20 10:45:56 -04:00
Tom Boucher
40993dd8b0 Merge pull request #1248 from benzntech/feat/exa-firecrawl-research
feat: add Exa and Firecrawl MCP support for research agents
2026-03-20 10:20:42 -04:00
Tom Boucher
1d5233a21b Merge pull request #1237 from Disaster-Terminator/fix-codex-config-crlf-features
fix(codex-config): safely manage codex_hooks in existing configs
2026-03-20 10:18:59 -04:00
Tom Boucher
020e764774 Merge pull request #1247 from salmanmkc/upgrade-github-actions-node24
Upgrade GitHub Actions for Node 24 compatibility
2026-03-20 08:39:19 -04:00
benzntech
b621d556f0 feat: add Exa and Firecrawl MCP support for research agents
Integrate Exa (semantic search) and Firecrawl (deep web scraping) as
MCP-based research tools, following the existing Brave Search pattern.

- Add tool declarations to all 3 researcher agents
- Add tool strategy sections with usage guidance and priority
- Add config detection for FIRECRAWL_API_KEY and EXA_API_KEY env vars
- Add firecrawl/exa_search config keys to core defaults and init output
- Update source priority hierarchy across all researchers
2026-03-20 14:53:46 +05:30
Salman Muin Kayser Chishti
d673283cb1 Upgrade GitHub Actions for Node 24 compatibility
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
2026-03-20 09:17:40 +00:00
Disaster-Terminator
b6a49163ea fix(codex-config): preserve EOL when enabling codex hooks 2026-03-20 13:24:19 +08:00
Flo Kempenich
f12a40015e fix(stats): replace undefined $GSD_TOOLS with standard gsd-tools path (#1236)
The stats workflow was the only file using $GSD_TOOLS, which is never
defined anywhere. This caused the LLM to improvise the path at runtime,
producing the wrong directory (tools/) and extension (.mjs) instead of
the correct bin/gsd-tools.cjs used by all other workflows.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 23:23:13 -06:00
Tom Boucher
d213bdcaa2 Merge pull request #1191 from eli-herman/feat/runtime-state-inventory 2026-03-19 17:28:33 -04:00
Tom Boucher
e79a6f4e92 Merge pull request #1213 from skoduri-epic/feat/multi-repo-workspace-v2 2026-03-19 17:26:18 -04:00
Srinivas Koduri
32c6d880bf fix: address maintainer review — gate findProjectRoot, warn on unmatched files
1. Gate findProjectRoot to commands that access .planning/ — skip for
   pure-utility commands (generate-slug, current-timestamp, template,
   frontmatter, verify-path-exists, verify-summary) to avoid unnecessary
   filesystem traversal on every invocation.

2. Warn to stderr when commit-to-subrepo encounters files that don't
   match any configured sub-repo prefix.

3. Document that loadConfig auto-syncs sub_repos with the filesystem,
   so config.json may be rewritten when repos are added or removed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:19:00 -07:00
Srinivas Koduri
fd0d546484 fix(new-project): remove invalid commit step for multi-repo config
The workflow set commit_docs to false for multi-repo workspaces then
immediately ran gsd-tools commit on config.json, which would be
skipped. Replace with a note that config changes are local-only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:18:20 -07:00
Srinivas Koduri
99b239dbaf fix(executor): record per-repo commit hashes in multi-repo mode
The hash recording step used `git rev-parse --short HEAD` which fails
when the project root is not a git repo (multi-repo workspaces). Update
the protocol to extract hashes from commit-to-subrepo JSON output and
record all sub-repo hashes in the SUMMARY.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:18:20 -07:00
Srinivas Koduri
d0aae7b63c fix: address PR review — nested path resolution, sub_repos in init, depth-1 detection
- findProjectRoot: use isInsideGitRepo() to walk up and find .git in
  ancestor dirs, fixing nested paths like backend/src/modules/
- Add sub_repos to cmdInitExecutePhase output so execute-plan.md and
  gsd-executor.md can route commits correctly
- Align new-project.md sub-repo detection to maxdepth 1 matching
  detectSubRepos() behavior
- Add 3 nested path tests for .git heuristic, sub_repos, and multiRepo

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:18:20 -07:00
Srinivas Koduri
21081dc821 feat: multi-repo workspace support with auto-detection and project root resolution
Add support for workspaces with multiple independent git repositories.
When configured, GSD routes commits to the correct sub-repo and ensures
.planning/ stays at the project root.

Core features:
- detectSubRepos(): scans child directories for .git to discover repos
- findProjectRoot(): walks up from CWD to find the project root that
  owns .planning/, preventing orphaned .planning/ in sub-repos
- loadConfig auto-syncs sub_repos when repos are added or removed
- Migrates legacy "multiRepo: true" to sub_repos array automatically
- All init commands include project_root in output
- cmdCommitToSubrepo: groups files by sub-repo prefix, commits independently

Zero impact on single-repo workflows — sub_repos defaults to empty array.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:18:20 -07:00
Tom Boucher
1f08939eb5 Merge pull request #1234 from trek-e/refactor/state-field-helpers-and-test-standardization
refactor: consolidate STATE.md field helpers, fix command injection in isGitIgnored
2026-03-19 15:10:36 -04:00
Tom Boucher
3e2c85e6fd refactor: consolidate STATE.md field helpers, fix command injection in isGitIgnored
Refactoring:
- Extract stateReplaceFieldWithFallback() to state.cjs as single source of truth
  for the try-primary-then-fallback pattern that was duplicated inline across
  phase.cjs, milestone.cjs, and state.cjs
- Replace all inline bold-only regex patterns in cmdPhaseComplete with shared
  stateReplaceField/stateExtractField helpers — now supports both **Bold:**
  and plain Field: STATE.md formats (fixes the same bug as #924)
- Replace inline bold-only regex patterns in cmdMilestoneComplete with shared helpers
- Replace inline bold-only regex for Completed Phases/Total Phases/Progress
  counters in cmdPhaseComplete with stateExtractField/stateReplaceField
- Replace inline bold-only Total Phases regex in cmdPhaseRemove with shared helpers

Security:
- Fix command injection surface in isGitIgnored (core.cjs): replace execSync with
  string concatenation with execFileSync using array arguments — prevents shell
  interpretation of special characters in file paths

Tests (7 new):
- 5 tests for stateReplaceFieldWithFallback: primary field, fallback, neither,
  preference, and plain format
- 1 regression test: phase complete with plain-format STATE.md fields
- 1 regression test: milestone complete with plain-format STATE.md fields

854 tests pass (was 847). No behavioral regressions.
2026-03-19 15:05:20 -04:00
Tom Boucher
4a8e1fef10 Merge pull request #1225 from trek-e/feat/worktree-support-1215
feat(core): worktree-aware .planning/ resolution and file locking
2026-03-19 13:46:31 -04:00
Tom Boucher
0afffb15f5 feat(core): worktree-aware .planning/ resolution and file locking (#1215)
- Add resolveWorktreeRoot() that detects linked worktrees via
  git rev-parse --git-common-dir and resolves to the main worktree
  where .planning/ lives
- Add withPlanningLock() file-based locking mechanism to prevent
  concurrent worktrees from corrupting shared planning files
- Wire worktree root resolution into gsd-tools.cjs main entry point
- Add regression tests for resolveWorktreeRoot (non-git, normal repo)
  and withPlanningLock (normal execution, error cleanup, stale lock
  recovery)
2026-03-19 13:41:11 -04:00
Tom Boucher
d585612afa Merge pull request #1229 from tonymfer/fix/commit-stage-deletions
fix(commit): stage file deletions when passed non-existent paths
2026-03-19 13:01:06 -04:00
Tom Boucher
78fa8f4052 Merge pull request #1224 from trek-e/feat/discussion-log-1209
feat(discuss-phase): auto-generate DISCUSSION-LOG.md audit trail
2026-03-19 13:00:13 -04:00
Tom Boucher
44e141c043 Merge pull request #1218 from j2h4u/fix/one-liner-extraction
fix(lifecycle): extract one-liner from summary body when not in frontmatter
2026-03-19 12:59:52 -04:00
Tom Boucher
aa29c46ca6 Merge pull request #947 from j2h4u/fix/state-advance-plan-compound
fix(state): parse compound Plan field in advance-plan command
2026-03-19 12:59:18 -04:00
Tom Boucher
6d7f9e35e5 Merge pull request #923 from j2h4u/fix/progress-table-columns
fix(roadmap): handle 5-column progress tables with Milestone column
2026-03-19 12:58:47 -04:00
Tony Park
6dc8caa0d5 fix(commit): stage file deletions when passed non-existent paths
When check-todos moves a file from pending/ to done/, the commit only
staged the new destination. The deletion of the source was never staged
because `git add` on a non-existent path is a no-op. Now we detect
missing files and use `git rm --cached` to stage the deletion.

Closes #1228

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 01:51:33 +09:00
j2h4u
e3bc614eb7 fix(roadmap): handle 5-column progress tables with Milestone column
The regex-based table parser captured a fixed number of columns,
so 5-column tables (Phase | Milestone | Plans | Status | Completed)
had the Milestone column eaten and Status/Date written to wrong cells.

Replaced regex with cell-based `split('|')` parsing that detects
column count (4 or 5) and updates the correct cells by index.
Affects both `cmdRoadmapUpdatePlanProgress` and `cmdPhaseComplete`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 21:30:41 +05:00
j2h4u
104a39e573 fix(lifecycle): extract one-liner from summary body when not in frontmatter
The summary template puts the one-liner as a `**bold**` line after the
`# Phase N` heading, but `cmdSummaryExtract` and `cmdMilestoneComplete`
only checked frontmatter `one-liner` field — which is often empty.

Adds `extractOneLinerFromBody()` to core.cjs as a fallback that parses
the first `**...**` line after the heading.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 21:29:25 +05:00
j2h4u
85a65fd384 fix(state): parse compound Plan field in advance-plan command
`cmdStateAdvancePlan` expected separate `Current Plan` and
`Total Plans in Phase` fields, but the current STATE.md template
uses a single compound field: `Plan: X of Y in current phase`.

Now tries legacy separate fields first, then falls back to parsing
the compound format. Preserves the compound format when writing back
(replaces only the plan number). Also handles `Last activity`
(lowercase) field name from current template.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 21:28:26 +05:00
Tom Boucher
61d82dc3c0 feat(discuss-phase): auto-generate DISCUSSION-LOG.md for audit trail (#1209)
- Generate {phase_num}-DISCUSSION-LOG.md alongside CONTEXT.md during
  discuss-phase sessions
- Log captures all options presented per gray area (not just the
  selected one), user's choice, notes, Claude's discretion items,
  and deferred ideas
- File is explicitly marked as audit-only — not for agent consumption
- Add discussion-log.md template with format specification
- Track Q&A data accumulation instruction in discuss_areas step
- Commit discussion log alongside CONTEXT.md in same git commit
- Add regression tests for workflow reference and template existence
2026-03-19 12:25:59 -04:00
Tom Boucher
342ca5929d fix(tests): update expected Copilot skill count from 47 to 50
Three new commands were added (add-backlog, review-backlog, thread)
but the Copilot install test counts were not updated.
2026-03-19 12:25:47 -04:00
Tom Boucher
efc398c554 Merge pull request #1223 from trek-e/fix/remote-session-menu-fallback-1214
fix(workflows): text_mode config for Claude Code remote session compatibility
2026-03-19 12:13:10 -04:00
Tom Boucher
0f9908ae77 Merge pull request #1222 from trek-e/fix/copilot-executor-completion-1128
fix(execute-phase): Copilot sequential fallback and spot-check completion detection
2026-03-19 12:12:54 -04:00
Tom Boucher
52f6c71bdf Merge pull request #1144 from ChaptersOfFloatingLife/fix/codex-agent-toml-metadata
fix(codex): include required agent metadata in TOML
2026-03-19 12:12:08 -04:00
Tom Boucher
1f2e17923a Merge pull request #1142 from medhatgalal/AI/fix-codex-markerless-gsd-merge
Fix duplicate Codex GSD agent blocks without marker
2026-03-19 12:11:48 -04:00
Tom Boucher
62a1d5186f Merge pull request #1126 from ElliotDrel/fix/track-hooks-in-manifest
fix: track hook files in manifest for local patch detection
2026-03-19 12:11:25 -04:00
Tom Boucher
ea1797d362 Merge pull request #922 from j2h4u/fix/plan-checkboxes-progress
fix(roadmap): mark individual plan checkboxes when summaries exist
2026-03-19 12:09:03 -04:00
Tom Boucher
a44094018b Merge pull request #1177 from matteo-michele-bianchini/fix/windows-absolute-paths
fix: use ~/ instead of resolved absolute paths in global install
2026-03-19 12:08:34 -04:00
Tom Boucher
b813e7d821 Merge pull request #1178 from matteo-michele-bianchini/fix/map-codebase-taskoutput-instructions
fix(workflows): add explicit TaskOutput instructions to map-codebase
2026-03-19 12:08:04 -04:00
Tom Boucher
f9434f7ffc Merge pull request #1212 from jecanore/feat/audit-uat
feat: add verification debt tracking and /gsd:audit-uat command
2026-03-19 12:05:36 -04:00
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
Tom Boucher
0487151142 fix(workflows): add text_mode config for Claude Code remote session compatibility (#1214)
- Add workflow.text_mode config option (default: false) that replaces
  AskUserQuestion TUI menus with plain-text numbered lists
- Document --text flag and config-set workflow.text_mode true as the
  fix for /rc remote sessions where the Claude App cannot forward TUI
  menu selections
- Update discuss-phase.md with text mode parsing and answer_validation
  fallback documentation
- Add text_mode to loadConfig defaults and VALID_CONFIG_KEYS
- Add regression tests for config-set and loadConfig
2026-03-19 09:19:01 -04:00
Tom Boucher
8a6cdf5f25 fix(execute-phase): add Copilot sequential fallback and spot-check completion detection (#1128)
- Default Copilot runtime to sequential inline execution instead of
  unreliable subagent spawning
- Add spot-check fallback in step 3 (SUMMARY.md exists + git commits
  found) so orchestrator never blocks indefinitely on missing completion
  signals
- Add runtime detection guidance in init step to force sequential mode
  under Copilot
- Add regression test verifying execute-phase contains Copilot fallback
  and spot-check documentation
2026-03-19 09:15:06 -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