Commit Graph

1658 Commits

Author SHA1 Message Date
Tom Boucher
4302d4404e fix(core): treat model_profile "inherit" as pass-through instead of falling back to balanced (#1833)
When model_profile is set to "inherit" in config.json, resolveModelInternal()
now returns "inherit" immediately instead of looking it up in MODEL_PROFILES
(where it has no entry) and silently falling back to balanced.

Also adds "inherit" to the valid profile list in verify.cjs so setting it
doesn't trigger a false validation error.

Closes #1829

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 18:20:11 -04:00
Tom Boucher
2ded61bf45 fix(cli): require --confirm flag before phases clear deletes directories (#1832)
phases clear now checks for phase dirs before deleting. If any exist and
--confirm is absent, the command exits non-zero with a message showing the
count and how to proceed. Empty phases dir (nothing to delete) succeeds
without --confirm unchanged.

Updates new-milestone.md workflow to pass --confirm (intentional programmatic
caller). Updates existing new-milestone-clear-phases tests to match new API.

Closes #1826

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 18:05:32 -04:00
Tom Boucher
b185529f48 fix(installer): guard .sh hook registration with fs.existsSync before writing settings.json (#1823)
Before registering each .sh hook (validate-commit, session-state, phase-boundary),
check that the target file was actually copied. If the .sh file is missing (e.g.
omitted from the npm package as in v1.32.0), skip registration and emit a warning
instead of writing a broken hook entry that errors on every tool invocation.

Closes #1817

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 17:49:20 -04:00
Tom Boucher
e881c91ef1 fix(cli): reject help/version flags instead of silently ignoring them (#1822)
* fix(cli): reject help/version flags instead of silently ignoring them (#1818)

AI agents can hallucinate --help or --version on gsd-tools invocations.
Without a guard, unknown flags were silently ignored and the command
proceeded — including destructive ones like `phases clear`. Add a
pre-dispatch check in main() that errors immediately if any never-valid
flag (-h, --help, -?, --version, -v, --usage) is present in args after
global flags are stripped. Regression test covers phases clear, generate-
slug, state load, and current-timestamp with both --help and -h variants.

Closes #1818

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

* fix(agents): convert gsd-verifier required_reading to inline wiring

The thinking-model-guidance test requires inline @-reference wiring at
decision points rather than a <required_reading> block. Convert
verification-overrides.md reference from the <required_reading> block
to an inline reference inside <verification_process> alongside the
existing thinking-models-verification.md reference.

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

* fix(tests): resolve conflict between thinking-model and verification-overrides tests

thinking-model-guidance.test prohibited <required_reading> entirely, but
verification-overrides.test requires gsd-verifier.md to have a
<required_reading> block for verification-overrides.md between </role>
and <project_context>. The tests were mutually exclusive.

Fix: narrow the thinking-model assertion to check that the thinking-models
reference is not *inside* a <required_reading> block (using regex extraction),
rather than asserting no <required_reading> block exists at all. Restore the
<required_reading> block in gsd-verifier.md. Both suites now pass (2345/2345).

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 17:32:18 -04:00
Tibsfox
3a277f8ba8 feat(next): add hard stop safety gates and consecutive-call guard (#1784)
Add three hard-stop checks to /gsd-next that prevent blind advancement:
1. Unresolved .continue-here.md checkpoint from a previous session
2. Error/failed state in STATE.md
3. Unresolved FAIL items in VERIFICATION.md

Also add a consecutive-call budget guard that prompts after 6
consecutive /gsd-next calls, preventing runaway automation loops.

All gates are bypassed with --force (prints a one-line warning).
Gates run in order and exit on the first hit to give clear,
actionable diagnostics.

Closes #1732

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 17:05:06 -04:00
Tibsfox
4c8719d84a feat(commands): add /gsd-scan for rapid single-focus codebase assessment (#1808)
Lightweight alternative to /gsd-map-codebase that spawns a single
mapper agent for one focus area instead of four parallel agents.
Supports --focus flag with 5 options: tech, arch, quality, concerns,
and tech+arch (default). Checks for existing documents and prompts
before overwriting.

Closes #1733

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 17:04:33 -04:00
Tibsfox
383007dca4 feat(workflows): add conditional thinking partner at decision points (#1816)
Integrate lightweight thinking partner analysis at two workflow decision
points, controlled by features.thinking_partner config (default: false):

1. discuss-phase: when developer answers reveal competing priorities
   (detected via keyword/structural signals), offers brief tradeoff
   analysis before locking decisions

2. plan-phase: when plan-checker flags architectural tradeoffs, analyzes
   options and recommends an approach aligned with phase goals before
   entering the revision loop

The thinking partner is opt-in, skippable (No, I have decided),
and brief (3-5 bullets). A third integration point for /gsd-explore
will be added when #1729 lands.

Closes #1726

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 17:04:08 -04:00
Tibsfox
a2a49ecd14 feat(model-profiles): add adaptive preset with role-based model assignment (#1806)
Add a fourth model profile preset that assigns models by agent role:
opus for planning and debugging (reasoning-critical), sonnet for
execution and research (follows instructions), haiku for mapping and
checking (high volume, structured output).

This gives solo developers on paid API tiers a cost-effective middle
ground — quality where it matters most (planning) without overspending
on mechanical tasks (mapping, checking).

Per-agent overrides via model_overrides continue to take precedence
over any profile preset, including adaptive.

Closes #1713

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 17:03:17 -04:00
Rezolv
6d5a66f64e docs(references): add common bug patterns reference for debugger (#1797) 2026-04-05 17:02:45 -04:00
Tibsfox
3143edaa36 fix(workflows): respect commit_docs:false in worktree merge and quick task commits (#1802)
Three locations in execute-phase.md and quick.md used raw `git add
.planning/` commands that bypassed the commit_docs config check. When
users set commit_docs: false during project setup, these raw git
commands still staged and committed .planning/ files.

Add commit_docs guards (via gsd-tools.cjs config-get) around all raw
git add .planning/ invocations. The gsd-tools.cjs commit wrapper
already respects this flag — these were the only paths that bypassed it.

Fixes #1783

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 17:02:20 -04:00
Tom Boucher
aa87993362 feat(agents): add thinking model guidance reference files (#1722) (#1820)
Combines implementation by @davesienkowski (inline @-reference wiring at
decision-point steps, named reasoning models with anti-patterns, sequencing
rules, Gap Closure Mode) and @Tibsfox (test suite covering file existence,
section structure, and agent wiring).

- 5 reference files in get-shit-done/references/ — each with named reasoning
  models, Counters annotations, Conflict Resolution sequencing, and When NOT
  to Think guidance
- Inline @-reference wiring placed inside the specific step/section blocks
  where thinking decisions occur (not at top-of-agent)
- Planning cluster includes Gap Closure Mode root-cause check section
- Test suite: 63 tests covering file existence, named models, Conflict
  Resolution sections, Gap Closure Mode, and inline wiring placement

Closes #1722

Co-authored-by: Tibsfox <tibsfox@users.noreply.github.com>
Co-authored-by: Rezolv <davesienkowski@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 17:01:25 -04:00
Tom Boucher
94a18df5dd feat(references): add verification override mechanism reference (#1747) (#1819)
Combines implementation by @Tibsfox (test suite, 80% fuzzy threshold)
and @davesienkowski (must_have schema, mandatory audit fields, full
lifecycle with re-verification carryforward and overrides_applied counter,
embedded verifier step 3b, When-NOT-to-use guardrails).

- New reference: get-shit-done/references/verification-overrides.md
  with must_have/accepted_by/accepted_at schema, 80% fuzzy match
  threshold, When to Use / When NOT to Use guardrails, full override
  lifecycle (re-verification carryforward, milestone audit surfacing)
- gsd-verifier.md updated with required_reading block, embedded Step 3b
  override check before FAIL marking, and overrides_applied frontmatter
- 27-assertion test suite covering reference structure, field names,
  threshold value, lifecycle fields, and agent cross-reference

Closes #1747

Co-authored-by: Tibsfox <tibsfox@users.noreply.github.com>
Co-authored-by: Rezolv <davesienkowski@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 17:00:30 -04:00
Tom Boucher
b602c1ddc7 fix: remove editorial parenthetical descriptions from product names (#1778)
Community PRs repeatedly add marketing commentary in parentheses next to
product names (licensing model, parent company, architecture). Product
listings should contain only the product name.

Cleaned across 8 files in 5 languages (EN, KO, JA, ZH, PT) plus
install.js code comments and CHANGELOG. Added static analysis guard
test that prevents this pattern from recurring.

Fixes #1777

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 12:41:17 -04:00
Tom Boucher
0b6ef6fa24 fix: register gsd-workflow-guard.js in settings.json during install (#1772)
The hook was built, copied to hooks/dist/, and installed to disk — but
never registered as a PreToolUse entry in settings.json, making the
hooks.workflow_guard config flag permanently inert.

Adds the registration block following the same pattern as the other
community hooks (prompt-guard, read-guard, validate-commit, etc.).

Includes regression test that verifies every JS hook in gsdHooks has a
corresponding command construction and registration block.

Fixes #1767

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 12:30:24 -04:00
Jeremy McSpadden
bdc143aa7f Merge pull request #1771 from gsd-build/fix/uninstall-hook-safety-1755
fix(install): uninstall hook safety — per-hook granularity and legacy migration
2026-04-05 10:49:53 -05:00
Jeremy McSpadden
175d89efa9 fix(install): uninstall hook safety — per-hook granularity, legacy migration, workflow-guard cleanup
Addresses three findings from Codex adversarial review of #1768:

- Uninstall settings cleanup now filters at per-hook granularity instead of
  per-entry. User hooks that share an entry with a GSD hook are preserved
  instead of being removed as collateral damage.
- Add gsd-workflow-guard to PreToolUse/BeforeTool uninstall settings filter
  so opt-in users don't get dangling references after uninstall.
- Codex install now strips legacy gsd-update-check.js hook entries before
  appending the corrected gsd-check-update.js, preventing duplicate hooks
  on upgrade from affected versions.
- 8 new regression tests covering per-hook filtering, legacy migration regex.

Fixes #1755
2026-04-05 10:46:40 -05:00
Jeremy McSpadden
84de0cc760 fix(install): comprehensive audit cleanup of hook copy, uninstall, and manifest (#1755) (#1768)
- Add chmod +x for .sh hooks during install (fixes #1755 permission denied)
- Fix Codex hook: wrong path (get-shit-done/hooks/) and inverted filename (gsd-update-check.js → gsd-check-update.js)
- Fix cache invalidation path from ~/cache/ to ~/.cache/gsd/
- Track .sh hooks in writeManifest so saveLocalPatches detects modifications
- Add gsd-workflow-guard.js to uninstall file cleanup list
- Add community hooks (session-state, validate-commit, phase-boundary) to uninstall settings.json cleanup
- Remove phantom gsd-check-update.sh from uninstall list
- Remove dead isCursor/isWindsurf branches in uninstall (already handled by combined branch)
- Warn when expected .sh hooks are missing after verifyInstalled
- Add 15 regression tests in install-hooks-copy.test.cjs
- Update codex-config.test.cjs assertions for corrected hook filename

Fixes #1755
2026-04-05 11:37:27 -04:00
Tom Boucher
c7d25b183a fix(commands): replace undefined $GSD_TOOLS with resolved path (#1766) (#1769)
workstreams.md referenced $GSD_TOOLS (6 occurrences) which is never
defined anywhere in the system. All other 60+ command files use the
standard $HOME/.claude/get-shit-done/bin/gsd-tools.cjs path. The
undefined variable resolves to empty string, causing all workstream
commands to fail with module not found.

Fixes #1766

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 11:30:38 -04:00
Tom Boucher
cfff82dcd2 fix(workflow): protect orchestrator files during worktree merge (#1756) (#1764)
When a worktree branch outlives a milestone transition, git merge
silently overwrites STATE.md and ROADMAP.md with stale content and
resurrects archived phase directories. Fix by backing up orchestrator
files before merge, restoring after, and detecting resurrected files.

Fixes #1761

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 11:11:38 -04:00
Tom Boucher
17c65424ad ci: auto-close draft PRs with policy message (#1765)
- Add close-draft-prs.yml workflow that auto-closes draft PRs with
  explanatory comment directing contributors to submit completed PRs
- Update CONTRIBUTING.md with "No draft PRs" policy
- Update default PR template with draft PR warning

Closes #1762

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 11:11:16 -04:00
Tom Boucher
6bd786bf88 test: add stale /gsd: colon reference regression guard (#1753)
* test: add stale /gsd: colon reference regression guard

Fixes #1748

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

* fix: replace 39 stale /gsd: colon references with /gsd- hyphen format

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 10:23:41 -04:00
Tom Boucher
b34da909a3 Revert "test: add stale /gsd: colon reference regression guard"
This reverts commit f2c9b30529.
2026-04-05 10:03:04 -04:00
Tom Boucher
f2c9b30529 test: add stale /gsd: colon reference regression guard
Fixes #1748

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 09:58:02 -04:00
Tom Boucher
6317603d75 docs: add welcome back notice and update highlights to v1.33.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 09:38:57 -04:00
Tom Boucher
949da16dbc chore(release): v1.33.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 09:25:43 -04:00
Tibsfox
89c2469ff2 feat(config): apply ~/.gsd/defaults.json as fallback for pre-project commands (#1738)
* feat(config): apply ~/.gsd/defaults.json as fallback for pre-project commands (#1683)

When .planning/config.json is missing (e.g., running GSD commands outside
a project), loadConfig() now checks ~/.gsd/defaults.json before returning
hardcoded defaults. This lets users set preferred model_profile,
context_window, subagent_timeout, and other settings globally.

Only whitelisted keys are merged — unknown keys in defaults.json are
silently ignored. If defaults.json is missing or contains invalid JSON,
the hardcoded defaults are returned as before.

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

* fix(config): scope defaults.json fallback to pre-project context only

Only consult ~/.gsd/defaults.json when .planning/ does not exist (truly
pre-project). When .planning/ exists but config.json is missing, return
hardcoded defaults — avoids interference with tests and initialized
projects. Use GSD_HOME env var for test isolation.

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-04-05 09:15:41 -04:00
Tom Boucher
381b4584f8 fix: stale hooks scanner ignores orphaned files from removed features (#1751)
The stale hooks detector in gsd-check-update.js used a broad
`startsWith('gsd-') && endsWith('.js')` filter that matched every
gsd-*.js file in the hooks directory. Orphaned hooks from removed
features (e.g., gsd-intel-*.js) lacked version headers and were
permanently flagged as stale, with no way to clear the warning.

Replace the broad wildcard with a MANAGED_HOOKS allowlist of the 6
JS hooks GSD currently ships. Orphaned files are now ignored.

Regression test verifies: (1) no broad wildcard filter, (2) managed
list matches build-hooks.js HOOKS_TO_COPY, (3) orphaned filenames
are excluded.

Fixes #1750

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 09:15:19 -04:00
Jeremy McSpadden
931fef5425 fix: add Kilo path replacement in copyFlattenedCommands (#1710)
Fixes #1709

copyFlattenedCommands replaced ~/.opencode/ paths but had no
equivalent ~/.kilo/ replacement. Adds kiloDirRegex for symmetric
path handling between the OpenCode and Kilo install pipelines.
2026-04-04 16:17:11 -04:00
Jeremy McSpadden
771259597b refactor: deduplicate config defaults into CONFIG_DEFAULTS constant (#1708)
Fixes #1707

Extracts config defaults from loadConfig() into an exported
CONFIG_DEFAULTS constant in core.cjs. config.cjs and verify.cjs
now reference CONFIG_DEFAULTS instead of duplicating values,
preventing future divergence.
2026-04-04 16:17:09 -04:00
Jeremy McSpadden
323ba83e2b docs: add /gsd-secure-phase and /gsd-docs-update to COMMANDS.md (#1706)
Fixes #1705

Both commands have command files, workflows, and backing agents but
were missing from the user-facing command reference.
2026-04-04 16:17:07 -04:00
Jeremy McSpadden
30a8777623 docs: add 3 missing agents to AGENTS.md and fix stale counts (#1703)
Fixes #1702

- Title: 18 → 21 agents
- Categories table: added Doc Writers (2), Profilers (1), bumped
  Auditors from 2 → 3 (security-auditor)
- Added full detail sections for gsd-doc-writer, gsd-doc-verifier,
  gsd-security-auditor with roles, tools, spawn patterns, and
  key behaviors
- Added 3 agents to tool permissions summary table
2026-04-04 16:17:05 -04:00
Jeremy McSpadden
4e2682b671 docs: update ARCHITECTURE.md with current component counts and missing entries (#1701)
Fixes #1700

- Commands: 44 → 60, Workflows: 46 → 60, Agents: 16 → 21
- Lib modules: 15 → 19, added docs, workstream, schema-detect,
  profile-pipeline, profile-output to CLI Tools table
- Added missing agent categories: security-auditor, doc-writer,
  doc-verifier, user-profiler, assumptions-analyzer
- Fixed stale hook names (gsd-read-before-edit → gsd-read-guard),
  removed non-existent gsd-commit-docs, added shell hooks
- Expanded references section from 8 to all 25 reference files
- Updated file system layout counts to match actual state
2026-04-04 16:17:02 -04:00
Tom Boucher
24c1949986 test: add MODEL_ALIAS_MAP regression test for #1690 (#1698)
Ensures opus, sonnet, and haiku aliases map to current Claude model
IDs (4-6, 4-6, 4-5). Prevents future regressions where aliases
silently resolve to outdated model versions.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 15:52:13 -04:00
Jeremy McSpadden
8d29ecd02f fix: add missing 'act as' injection pattern to prompt guard hook (#1697)
Fixes #1696

The gsd-prompt-guard.js hook was missing the 'act as a/an/the' prompt
injection pattern that security.cjs includes. Adds the pattern with
the same (?!plan|phase|wave) negative lookahead exception to allow
legitimate GSD workflow references.
2026-04-04 15:50:04 -04:00
Jeremy McSpadden
fa57a14ec7 fix: resolve REG-04 — frontmatter inline array parser now respects quoted commas (#1695)
Fixes #1694

The inline array parser used .split(',') which ignored quote boundaries,
splitting "a, b" into two items. Replaced with a quote-aware splitter
that tracks single/double quote state.

Updated REG-04 test to assert correct behavior and added coverage for
single-quoted and mixed-quote inline arrays.
2026-04-04 15:50:01 -04:00
Jeremy McSpadden
839ea22d06 fix: replace shell sleep with cross-platform Atomics.wait in planning lock (#1693)
Fixes #1692

spawnSync('sleep', ['0.1']) fails silently on Windows (ENOENT),
causing a tight busy-loop during lock contention. Atomics.wait()
provides a cross-platform 100ms blocking wait available in Node 22+.
2026-04-04 15:49:59 -04:00
Jeremy McSpadden
ade67cf9f9 fix: update MODEL_ALIAS_MAP to current Claude model IDs (#1691)
Fixes #1690

- opus: claude-opus-4-0 → claude-opus-4-6
- sonnet: claude-sonnet-4-5 → claude-sonnet-4-6
- haiku: claude-haiku-3-5 → claude-haiku-4-5

Also updates the stale haiku reference in sdk/src/session-runner.ts
and documentation examples in CONFIGURATION.md (en, ja-JP, ko-KR).
2026-04-04 15:49:56 -04:00
Tom Boucher
f6d2cf2a4a docs: add Chore / Maintenance issue template (#1689)
Internal improvements (refactoring, CI/CD, test quality, dependency
updates, tech debt) had no dedicated template, forcing contributors
to misuse Enhancement or Feature Request forms. This adds a focused
template with appropriate fields and auto-labels (type: chore,
needs-triage).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 15:38:21 -04:00
Tom Boucher
7185803543 fix(install): apply path replacement in copyCommandsAsClaudeSkills (#1677)
* ci: drop Windows runner, add static hardcoded-path detection

Replace the Windows CI runner with a static analysis test that catches
the same class of platform-specific path bugs (C:\, /home/, /Users/,
/tmp/) without requiring an actual Windows machine.

- tests/hardcoded-paths.test.cjs: new static scanner that checks string
  literals in all source JS/CJS files for hardcoded platform paths;
  runs on Linux/macOS in <100ms and fires on every PR
- .github/workflows/test.yml: remove windows-latest from matrix; switch
  macOS smoke-test runner from Node 22 → Node 24 (the declared standard)
- package.json: bump engines.node from >=20.0.0 to >=22.0.0 (Node 20
  reached EOL April 2026)

Matrix goes from 4 runners → 3 runners per run:
  ubuntu/22  ubuntu/24  macos/24

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

* fix(install): apply path replacement in copyCommandsAsClaudeSkills (#1653)

copyCommandsAsClaudeSkills received pathPrefix as a parameter but never
used it — all 51 SKILL.md files kept hardcoded ~/.claude/ paths even on
local (per-project) installs, causing every skill's @-file references
to resolve to a nonexistent global directory.

Add the same three regex replacements that copyCommandsAsCodexSkills
already applies: ~/.claude/ → pathPrefix, $HOME/.claude/ → pathPrefix,
./.claude/ → ./getDirName(runtime)/.

Closes #1653

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 15:12:58 -04:00
Tom Boucher
a6457a7688 ci: drop Windows runner, add static hardcoded-path detection (#1676)
Replace the Windows CI runner with a static analysis test that catches
the same class of platform-specific path bugs (C:\, /home/, /Users/,
/tmp/) without requiring an actual Windows machine.

- tests/hardcoded-paths.test.cjs: new static scanner that checks string
  literals in all source JS/CJS files for hardcoded platform paths;
  runs on Linux/macOS in <100ms and fires on every PR
- .github/workflows/test.yml: remove windows-latest from matrix; switch
  macOS smoke-test runner from Node 22 → Node 24 (the declared standard)
- package.json: bump engines.node from >=20.0.0 to >=22.0.0 (Node 20
  reached EOL April 2026)

Matrix goes from 4 runners → 3 runners per run:
  ubuntu/22  ubuntu/24  macos/24

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 14:37:54 -04:00
Tom Boucher
2703422be8 refactor(tests): standardize to node:assert/strict and t.after() per CONTRIBUTING.md (#1675)
* refactor(tests): standardize to node:assert/strict and t.after() per CONTRIBUTING.md

- Replace require('node:assert') with require('node:assert/strict') across
  all 73 test files to enforce strict equality (no type coercion)
- Replace try/finally cleanup blocks with t.after() hooks in core.test.cjs
  and hooks-opt-in.test.cjs per the test lifecycle standards
- Utility functions in codex-config and security-scan retain try/finally
  as that is appropriate for per-function resource guards, not lifecycle hooks

Closes #1674

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

* perf(tests): add --test-concurrency=4 to test runner for parallel file execution

Node.js --test-concurrency controls how many test files run as parallel child
processes. Set to 4 by default, configurable via TEST_CONCURRENCY env var.
Fixes tests at a known level rather than inheriting os.availableParallelism()
which varies across CI environments.

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

* fix(security): allowlist verify.test.cjs in prompt-injection scanner

tests/verify.test.cjs uses <human>...</human> as GSD phase task-type
XML (meaning "a human should verify this step"), which matches the
scanner's fake-message-boundary pattern for LLM APIs. This is a
false positive — add it to the allowlist alongside the other test files
that legitimately contain injection-adjacent patterns.

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 14:29:03 -04:00
Rezolv
9bf9fc295d feat(references): add shared behavioral docs and wire into workflows (#1658)
Add 6 shared reference docs that standardize agent behavior across all
GSD workflows:

- universal-anti-patterns.md: 27 behavioral rules across 8 categories
- context-budget.md: 4-tier system (PEAK/GOOD/DEGRADING/POOR) with
  read-depth rules based on context window size
- gate-prompts.md: 14 named prompt patterns for decision points
- revision-loop.md: Check-Revise-Escalate with stall detection (max 3)
- domain-probes.md: domain-specific follow-up questions for 10 domains
- agent-contracts.md: completion markers for all 21 GSD agents

Wire into existing workflows via @-reference includes:
- plan-phase.md: revision-loop, gate-prompts, agent-contracts
- execute-phase.md: agent-contracts, context-budget
- discuss-phase.md: domain-probes, gate-prompts, universal-anti-patterns
2026-04-04 14:16:27 -04:00
monokoo
840b9981d9 fix: add environment-based runtime detection for /gsd-review (#1463)
Replace AI self-identification with env var checks (ANTIGRAVITY_AGENT,
CLAUDE_CODE_ENTRYPOINT) to correctly determine which review CLI to skip.

Fixes incorrect skip behavior when running non-Claude models inside
the Antigravity client.
2026-04-04 14:15:56 -04:00
Tom Boucher
ca6a273685 fix: remove marketing text from runtime prompt, fix #1656 and #1657 (#1672)
* chore: ignore .worktrees directory

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

* fix(install): remove marketing taglines from runtime selection prompt

Closes #1654

The runtime selection menu had promotional copy appended to some
entries ("open source, the #1 AI coding platform on OpenRouter",
"open source, free models"). Replaced with just the name and path.

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

* test(kilo): update test to assert marketing tagline is removed

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

* fix(tests): use process.execPath so tests pass in shells without node on PATH

Three test patterns called bare `node` via shell, which fails in Claude Code
sessions where `node` is not on PATH:

- helpers.cjs string branch: execSync(`node ...`) → execFileSync(process.execPath)
  with a shell-style tokenizer that handles quoted args and inner-quote stripping
- hooks-opt-in.test.cjs: spawnSync('bash', ...) for hooks that call `node`
  internally → spawnHook() wrapper that injects process.execPath dir into PATH
- concurrency-safety.test.cjs: exec(`node ...`) for concurrent patch test
  → exec(`"${process.execPath}" ...`)

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

* fix: resolve #1656 and #1657 — bash hooks missing from dist, SDK install prompt

#1656: Community bash hooks (gsd-session-state.sh, gsd-validate-commit.sh,
gsd-phase-boundary.sh) were never included in HOOKS_TO_COPY in build-hooks.js,
so hooks/dist/ never contained them and the installer could not copy them to
user machines. Fixed by adding the three .sh files to the copy array with
chmod +x preservation and skipping JS syntax validation for shell scripts.

#1657: promptSdk() called installSdk() which ran `npm install -g @gsd-build/sdk`
— a package that does not exist on npm, causing visible errors during interactive
installs. Removed promptSdk(), installSdk(), --sdk flag, and all call sites.

Regression tests in tests/bugs-1656-1657.test.cjs guard both fixes.

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

* fix: sort runtime list alphabetically after Claude Code

- Claude Code stays pinned at position 1
- Remaining 10 runtimes sorted A-Z: Antigravity(2), Augment(3), Codex(4),
  Copilot(5), Cursor(6), Gemini(7), Kilo(8), OpenCode(9), Trae(10), Windsurf(11)
- Updated runtimeMap, allRuntimes, and prompt display in promptRuntime()
- Updated multi-runtime-select, kilo-install, copilot-install tests to match

Also fix #1656 regression test: run build-hooks.js in before() hook so
hooks/dist/ is populated on CI (directory is gitignored; build runs via
prepublishOnly before publish, not during npm ci).

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 14:15:30 -04:00
Tom Boucher
e66f7e889e docs: add typed contribution templates and tighten contributor guidelines (#1673)
Overhaul CONTRIBUTING.md and all GitHub issue/PR templates to enforce a
structured, approval-gated contribution process that cuts down on drive-by
feature submissions.

Changes:
- CONTRIBUTING.md: add Types of Contributions section defining Fix,
  Enhancement, and Feature with escalating requirements and explicit
  rejection criteria; add Issue-First Rule section making clear that
  enhancements require approved-enhancement and features require
  approved-feature label before any code is written; backport gsd-2
  testing standards (t.after() per-test cleanup, array join() fixture
  pattern, Node 24 as primary CI target, test requirements by change type,
  reviewer standards)

- .github/ISSUE_TEMPLATE/enhancement.yml: new template requiring current
  vs. proposed behavior, reason/benefit narrative, full scope of changes,
  and breaking changes assessment; cannot be clicked through

- .github/ISSUE_TEMPLATE/feature_request.yml: full rewrite requiring solo-
  developer problem statement, what is being added, full file-level scope,
  user stories, acceptance criteria, maintenance burden assessment, and
  alternatives considered; incomplete specs are closed, not revised

- .github/pull_request_template.md: converted from general template to a
  routing page directing contributors to the correct typed template;
  using the default template for a feature or enhancement is a rejection
  reason

- .github/PULL_REQUEST_TEMPLATE/fix.md: new typed template requiring
  confirmed-bug label on linked issue and regression test confirmation

- .github/PULL_REQUEST_TEMPLATE/enhancement.md: new typed template with
  hard gate on approved-enhancement label and scope confirmation section

- .github/PULL_REQUEST_TEMPLATE/feature.md: new typed template requiring
  file inventory, spec compliance checklist from the issue, and scope
  confirmation that nothing beyond the approved spec was added

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 14:03:56 -04:00
Tom Boucher
085f5b9c5b fix(install): remove marketing taglines from runtime selection prompt (#1655)
* chore: ignore .worktrees directory

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

* fix(install): remove marketing taglines from runtime selection prompt

Closes #1654

The runtime selection menu had promotional copy appended to some
entries ("open source, the #1 AI coding platform on OpenRouter",
"open source, free models"). Replaced with just the name and path.

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

* test(kilo): update test to assert marketing tagline is removed

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 13:23:15 -04:00
Lex Christopherson
3d4b660cd1 docs: remove npm publish workaround from README
v1.32.0 is now live on npm, so the manual install warning is no longer needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 09:24:51 -06:00
Tom Boucher
8d6577d101 fix: update Discord invite link from vanity URL to permanent link (#1648)
The discord.gg/gsd vanity link was lost due to a drop in server boosts.
Updated all references to the permanent invite link discord.gg/mYgfVNfA2r
across READMEs, issue templates, install script, and join-discord command.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 09:04:13 -04:00
Tom Boucher
05c08fdd79 docs: restore npm install notice on README, update docs/README.md for v1.32.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 08:55:07 -04:00
Tom Boucher
c8d7ab3501 docs: fill documentation gaps from v1.32.0 audit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 08:54:14 -04:00