Tom Boucher
a9f49f8f9d
fix(phase-lifecycle): prevent plan-line overwrite when **Plans:** is bare
...
\s* after **Plans:** matches newlines, causing [^\n]+ to consume the first
plan checkbox when the **Plans:** field has no value on the same line.
Additionally, the lazy [\s\S]*? could cross section boundaries when the
current section had no **Plans:** value, corrupting a later section.
Fix 1: replace \s* with [ \t]* to restrict post-colon match to horizontal
whitespace only.
Fix 2: replace [\s\S]*? with (?:(?!\n#{2,4})[\s\S])*? to prevent the
pattern from crossing into a new section heading.
Closes #2728
2026-04-26 09:46:57 -04:00
Jeremy McSpadden
fc1fa9172b
fix(install): build gsd-sdk from in-repo sdk/ source, not stale npm package
...
PR #2386 v1 installed the published @gsd-build/sdk from npm, which ships an
older version that lacks query handlers needed by current workflows. Every
GSD release would drift further from what the installer put on PATH.
This commit rewires installSdkIfNeeded() to build from the in-repo sdk/
source tree instead:
1. cd sdk && npm install (build-time deps incl. tsc)
2. npm run build (tsc → sdk/dist/)
3. npm install -g . (global install; gsd-sdk on PATH)
Each step is a hard gate — failures warn loudly and point users at the
manual equivalent command. No more silent drift between installed SDK and
the rest of the GSD system.
Root package.json `files` now ships sdk/src, sdk/prompts, sdk/package.json,
sdk/package-lock.json, and sdk/tsconfig.json so npm-registry installs also
carry the source tree needed to build gsd-sdk locally.
Also fixes a blocking tsc error in sdk/src/event-stream.ts:313 — the cast
to `Array<{ type: string; [key: string]: unknown }>` needed a double-cast
via `unknown` because BetaContentBlock's variants don't carry an index
signature. Runtime-neutral type-widening; sdk vitest suite unchanged
(1256 passing; the lone failure is a pre-existing integration test that
requires external API access).
Updates the #1657/#2385 regression test to assert the new build-from-source
path (path.resolve(__dirname, '..', 'sdk') + `npm run build` + `npm install
-g .`) plus a new assertion that root package.json files array ships sdk
source.
Refs #2385
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-17 19:53:16 -05:00
TÂCHES
89f95c43ba
feat: auto --init flag, headless prompts, and prompt sanitizer ( #1417 )
...
* fix: Created 10 headless prompt files (5 workflows + 5 agents) in sdk/p…
- "sdk/prompts/workflows/execute-plan.md"
- "sdk/prompts/workflows/research-phase.md"
- "sdk/prompts/workflows/plan-phase.md"
- "sdk/prompts/workflows/verify-phase.md"
- "sdk/prompts/workflows/discuss-phase.md"
- "sdk/prompts/agents/gsd-executor.md"
- "sdk/prompts/agents/gsd-phase-researcher.md"
- "sdk/prompts/agents/gsd-planner.md"
GSD-Task: S01/T02
* feat: Created prompt-sanitizer.ts, wired headless prompt loading into P…
- "sdk/src/prompt-sanitizer.ts"
- "sdk/src/phase-prompt.ts"
- "sdk/src/gsd-tools.ts"
- "sdk/src/gsd-tools.test.ts"
- "sdk/src/phase-runner-types.test.ts"
GSD-Task: S01/T01
* test: Added 111 unit tests covering sanitizePrompt(), headless prompt l…
- "sdk/src/prompt-sanitizer.test.ts"
- "sdk/src/headless-prompts.test.ts"
- "sdk/src/phase-prompt.test.ts"
GSD-Task: S01/T03
* feat: Wired sdkPromptsDir preference and sanitizePrompt into InitRunner…
- "sdk/src/init-runner.ts"
- "sdk/package.json"
GSD-Task: S02/T01
* feat: add --init flag to auto command for single-command PRD-to-execution
gsd-sdk auto --init @path/to/prd.md now bootstraps the project (init)
then immediately runs the autonomous phase execution loop.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* chore: add remaining headless prompt files and templates
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* test: Extended init-runner.test.ts with 7 sdkPromptsDir preference and…
- "sdk/src/init-runner.test.ts"
GSD-Task: S02/T03
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 22:40:34 -06:00
TÂCHES
596ce2d252
feat: GSD SDK — headless CLI with init + auto commands ( #1407 )
...
* test: Bootstrapped sdk/ as TypeScript ESM package with full GSD-1 PLAN.…
- "sdk/package.json"
- "sdk/tsconfig.json"
- "sdk/vitest.config.ts"
- "sdk/src/types.ts"
- "sdk/src/plan-parser.ts"
- "sdk/src/plan-parser.test.ts"
GSD-Task: S01/T01
* test: Implemented config reader and gsd-tools bridge with 25 unit tests…
- "sdk/src/config.ts"
- "sdk/src/config.test.ts"
- "sdk/src/gsd-tools.ts"
- "sdk/src/gsd-tools.test.ts"
GSD-Task: S01/T02
* test: Built prompt-builder, session-runner, and GSD class — 85 total un…
- "sdk/src/prompt-builder.ts"
- "sdk/src/prompt-builder.test.ts"
- "sdk/src/session-runner.ts"
- "sdk/src/index.ts"
- "sdk/src/types.ts"
GSD-Task: S01/T03
* test: Created E2E integration test with fixtures proving full SDK pipel…
- "sdk/src/e2e.integration.test.ts"
- "sdk/test-fixtures/sample-plan.md"
- "sdk/test-fixtures/.planning/config.json"
- "sdk/test-fixtures/.planning/STATE.md"
- "vitest.config.ts"
- "tsconfig.json"
GSD-Task: S01/T04
* test: Added PhaseType/GSDEventType enums, 16-variant GSDEvent union, GS…
- "sdk/src/types.ts"
- "sdk/src/event-stream.ts"
- "sdk/src/logger.ts"
- "sdk/src/event-stream.test.ts"
- "sdk/src/logger.test.ts"
GSD-Task: S02/T01
* test: Built ContextEngine for phase-aware context file resolution, getT…
- "sdk/src/context-engine.ts"
- "sdk/src/tool-scoping.ts"
- "sdk/src/phase-prompt.ts"
- "sdk/src/context-engine.test.ts"
- "sdk/src/tool-scoping.test.ts"
- "sdk/src/phase-prompt.test.ts"
GSD-Task: S02/T02
* test: Wired event stream into session runner, added onEvent()/addTransp…
- "sdk/src/session-runner.ts"
- "sdk/src/index.ts"
- "sdk/src/e2e.integration.test.ts"
GSD-Task: S02/T03
* feat: Added PhaseStepType enum, PhaseOpInfo interface, phase lifecycle…
- "sdk/src/types.ts"
- "sdk/src/gsd-tools.ts"
- "sdk/src/session-runner.ts"
- "sdk/src/index.ts"
- "sdk/src/phase-runner-types.test.ts"
GSD-Task: S03/T01
* test: Implemented PhaseRunner state machine with 39 unit tests covering…
- "sdk/src/phase-runner.ts"
- "sdk/src/phase-runner.test.ts"
GSD-Task: S03/T02
* test: Wired PhaseRunner into GSD.runPhase() public API with full re-exp…
- "sdk/src/index.ts"
- "sdk/src/phase-runner.integration.test.ts"
- "sdk/src/phase-runner.ts"
GSD-Task: S03/T03
* test: Expanded runVerifyStep with full gap closure cycle (plan → execut…
- "sdk/src/types.ts"
- "sdk/src/phase-runner.ts"
- "sdk/src/phase-runner.test.ts"
GSD-Task: S04/T02
* fix: Added 3 integration tests proving phasePlanIndex returns correct t…
- "sdk/src/phase-runner.integration.test.ts"
- "sdk/src/index.ts"
GSD-Task: S04/T03
* test: Add milestone-level types, typed roadmapAnalyze(), GSD.run() orch…
- "sdk/src/types.ts"
- "sdk/src/gsd-tools.ts"
- "sdk/src/index.ts"
- "sdk/src/milestone-runner.test.ts"
GSD-Task: S05/T01
* test: Added CLITransport (structured stdout log lines) and WSTransport…
- "sdk/src/cli-transport.ts"
- "sdk/src/cli-transport.test.ts"
- "sdk/src/ws-transport.ts"
- "sdk/src/ws-transport.test.ts"
- "sdk/src/index.ts"
- "sdk/package.json"
GSD-Task: S05/T02
* test: Added gsd-sdk CLI entry point with argument parsing, bin field, p…
- "sdk/src/cli.ts"
- "sdk/src/cli.test.ts"
- "sdk/package.json"
GSD-Task: S05/T03
* feat: Add InitNewProjectInfo type, initNewProject()/configSet() GSDTool…
- "sdk/src/types.ts"
- "sdk/src/gsd-tools.ts"
- "sdk/src/cli.ts"
- "sdk/src/cli.test.ts"
- "sdk/src/gsd-tools.test.ts"
GSD-Task: S01/T01
* chore: Created InitRunner orchestrator with setup → config → PROJECT.md…
- "sdk/src/init-runner.ts"
- "sdk/src/types.ts"
- "sdk/src/index.ts"
GSD-Task: S01/T02
* test: Wired InitRunner into CLI main() for full gsd-sdk init dispatch a…
- "sdk/src/cli.ts"
- "sdk/src/init-runner.test.ts"
- "sdk/src/cli.test.ts"
GSD-Task: S01/T03
* test: Add PlanCheck step, AI self-discuss, and retryOnce wrapper to Pha…
- "sdk/src/types.ts"
- "sdk/src/phase-runner.ts"
- "sdk/src/session-runner.ts"
- "sdk/src/phase-runner.test.ts"
- "sdk/src/phase-runner-types.test.ts"
GSD-Task: S02/T01
* feat: Rewrite CLITransport with ANSI colors, phase banners, spawn indic…
- "sdk/src/cli-transport.ts"
- "sdk/src/cli-transport.test.ts"
GSD-Task: S02/T02
* test: Add `gsd-sdk auto` command with autoMode config override, USAGE t…
- "sdk/src/cli.ts"
- "sdk/src/cli.test.ts"
- "sdk/src/index.ts"
- "sdk/src/types.ts"
GSD-Task: S02/T03
* fix: CLI shebang + gsd-tools non-JSON output handling
Three bugs found during first real gsd-sdk run:
1. cli.ts shebang was commented out — shell executed JS as bash,
triggering ImageMagick's import command instead of Node
2. configSet() called exec() which JSON.parse()d the output, but
gsd-tools config-set returns 'key=value' text, not JSON.
Added execRaw() method for commands that return plain text.
3. Same JSON parse bug affected commit() (returns git SHA),
stateLoad(), verifySummary(), initExecutePhase(), stateBeginPhase(),
and phaseComplete(). All switched to execRaw().
Tests updated to match real gsd-tools output format (plain text
instead of mocked JSON). 376/376 tests pass.
2026-03-26 20:27:51 -06:00