Commit graph

1962 commits

Author SHA1 Message Date
mastertyko
aee09a53ec fix(gsd): clear stale milestone ID reservations at session start
The module-level reservedMilestoneIds Set persists across /gsd
invocations within the same Node process. Each cancelled session
reserves an ID that is never claimed, permanently inflating the
next milestone number. Starting /gsd 3 times without completing
produces M011 instead of M009.

Call clearReservedMilestoneIds() at the top of showSmartEntry()
and showHeadlessMilestoneCreation() so stale reservations from
previous cancelled sessions are discarded before generating new IDs.
The function already existed but was never called outside tests.

Closes #2488
2026-03-25 21:47:18 +01:00
github-actions[bot]
55c8988900 release: v2.47.0 2026-03-25 19:53:13 +00:00
TÂCHES
91c1547856 Merge pull request #2532 from gsd-build/feat/external-tool-execution
feat(agent-core): external tool execution mode for Claude Code CLI
2026-03-25 13:09:21 -06:00
Lex Christopherson
bbea8460b5 fix(claude-code-cli): render tool calls above text response
- Filter toolcall_start/delta/end events from streaming to prevent
  out-of-order rendering in the TUI's accumulated message content
- Collect tool calls from intermediate SDK turns and include them
  BEFORE text content in the final AssistantMessage
- The agent loop's externalToolExecution path emits proper
  tool_execution_start/end events for each intermediate tool call
- Result: tool activity renders above the text response, not below

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:57:47 -06:00
Lex Christopherson
a0ee03d331 feat(agent-core): add externalToolExecution mode for external providers
Adds `externalToolExecution` flag to AgentLoopConfig. When true, the
agent loop emits tool_execution_start/end events for TUI rendering but
skips local tool dispatch. Used by providers that handle tool execution
internally (e.g., Claude Code CLI via Agent SDK).

The flag is dynamically evaluated per-loop via a callback on
AgentOptions, so model switches mid-session are handled correctly.
Providers with authMode "externalCli" automatically use this mode.

Also updates the Claude Code CLI stream adapter to preserve tool call
blocks in the final message instead of stripping them.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:57:47 -06:00
TÂCHES
d524454059 Merge pull request #2530 from gsd-build/fix/pr-risk-map-path
fix(ci): update FILE-SYSTEM-MAP.md path in pr-risk-check
2026-03-25 12:49:08 -06:00
TÂCHES
0ded615826 Merge pull request #2528 from gsd-build/copilot/fix-inherited-repo-check
fix: isInheritedRepo() false negative when parent dir has stale .gsd
2026-03-25 12:48:57 -06:00
Lex Christopherson
15d8974611 fix(ci): update FILE-SYSTEM-MAP.md path after docs→docs-internal move
The Mintlify docs migration renamed docs/ to docs-internal/ but
pr-risk-check.mjs still referenced the old path, causing every
PR Risk Report workflow to fail with an empty body.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:44:43 -06:00
copilot-swe-agent[bot]
cc7a0cd7c4 fix: isInheritedRepo false negative when parent has stale .gsd; defense-in-depth local .git check in bootstrap
Fix 1 (auto-start.ts): Replace nativeIsRepo(base) with existsSync(join(base, ".git"))
so bootstrap always creates .git locally even when parent repo makes git rev-parse succeed.

Fix 2 (repo-identity.ts): Start walk-up loop at dirname(normalizedBase) instead of
normalizedBase — finding .gsd at basePath itself is irrelevant to inheritance detection.

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
Agent-Logs-Url: https://github.com/gsd-build/gsd-2/sessions/99fdcddc-7e44-4a64-a1ec-a536806216f6
2026-03-25 18:42:27 +00:00
TÂCHES
12e48f1e2a Merge pull request #2512 from trek-e/docs/update-v2.45-v2.46
docs: update README and Mintlify docs for v2.45.0 and v2.46.0
2026-03-25 12:39:47 -06:00
TÂCHES
8ac7bebded Merge pull request #2515 from ahwlsqja/fix/reconcile-stale-task-units
fix: reconcile stale task DB status from disk artifacts (#2514)
2026-03-25 12:39:37 -06:00
TÂCHES
9b548ba7f3 Merge pull request #2516 from jeremymcs/fix/packages-test-coverage
ci(test): wire packages/pi-coding-agent tests into CI
2026-03-25 12:38:57 -06:00
copilot-swe-agent[bot]
86e6054833 Initial plan 2026-03-25 18:38:42 +00:00
TÂCHES
92fbe26239 Merge pull request #2523 from gsd-build/feat/claude-code-cli-provider
feat(provider): Claude Code CLI provider via Agent SDK
2026-03-25 12:26:43 -06:00
Lex Christopherson
e8a7881307 fix(claude-code-cli): resolve SDK executable path and update model IDs
- Add pathToClaudeCodeExecutable to SDK query options, resolving the
  system `claude` binary via `which claude`. Without this, the SDK
  looks for a bundled cli.js that doesn't exist when installed as a
  library dependency.
- Remove env option that was replacing the subprocess environment and
  stripping auth credentials, causing "Not logged in" errors.
- Update model IDs to current versions: claude-opus-4-6 (1M ctx),
  claude-sonnet-4-6 (1M ctx), claude-haiku-4-5 (200K ctx).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:22:40 -06:00
TÂCHES
4170c639a4 Merge pull request #2525 from gsd-build/fix/planning-doctrine-demoable-definition
fix: make planning doctrine demoable definition audience-appropriate
2026-03-25 12:21:34 -06:00
TÂCHES
97e27634d8 Merge pull request #2522 from gsd-build/copilot/fix-bypass-single-writer-api
fix(prompts): migrate remaining 4 prompts to DB-backed tool API
2026-03-25 12:17:19 -06:00
Lex Christopherson
524e9dd258 fix: make planning doctrine demoable definition audience-appropriate
The old "demoable" definition was biased toward GUI/SaaS products —
it explicitly penalized terminal commands and curl as demo surfaces.
For developer tools (CLIs, APIs, frameworks), the terminal IS the
product interface and curl IS a legitimate demo.

Redefines "demoable" as audience-appropriate: the intended user
exercising the capability through its real interface. Adds a carve-out
for infrastructure-as-product slices (protocols, extension APIs,
provider interfaces) to the foundation-only rule.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:17:00 -06:00
copilot-swe-agent[bot]
8a0e1dea00 fix(prompts): migrate remaining 4 prompts to use DB-backed tool API instead of direct write
- research-milestone.md: replace direct write with gsd_summary_save (artifact_type: RESEARCH)
- plan-slice.md: update contradictory footer to reference gsd_plan_slice tool
- run-uat.md: replace direct write with gsd_summary_save (artifact_type: ASSESSMENT)
- complete-slice.md: update footer to reference gsd_complete_slice tool

Closes #2513

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
Agent-Logs-Url: https://github.com/gsd-build/gsd-2/sessions/350eb36b-b2d7-4e1a-bd2f-debd7b9b13a3
2026-03-25 18:08:33 +00:00
Lex Christopherson
c55d409991 feat(provider): add Claude Code CLI provider extension
Implements Phase 1 of the Claude Code subscription-as-provider integration
(issue #2509). Users with a Claude Code subscription (Pro/Max/Team) can
use subsidized inference through GSD's UI via the official Agent SDK.

The extension registers a provider with authMode: "externalCli" that
delegates to the user's locally-installed claude CLI. The SDK runs the
full agentic loop (multi-turn, tool execution) in one streamSimple call.
Tool calls stream in real-time for TUI visibility but are stripped from
the final AssistantMessage so the agent loop ends cleanly without local
tool dispatch.

Zero core changes — pure extension-based implementation.

Closes #2509

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:07:08 -06:00
copilot-swe-agent[bot]
5e934a0949 Initial plan 2026-03-25 18:01:02 +00:00
Lex Christopherson
811680f5b6 fix: make workflow event hash platform-deterministic
The hash included `ts` in the input despite the docstring promising
it was "independent of ts/actor/session". On Windows, millisecond
timer resolution caused two calls within the same tick to get
different timestamps, producing different hashes for identical
cmd+params.

Remove `ts` from the hash input to match documented behavior.
Revert continue-on-error on windows-portability now that the
root cause is fixed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:20:35 -06:00
Jeremy McSpadden
d6bd17298f ci(test): add test:packages script and wire packages/pi-coding-agent tests into CI
The 13 test files in packages/pi-coding-agent/src/core/ were never executed
in CI or by `npm test`. The test:unit glob only covers src/resources/extensions/gsd/tests/
and src/tests/, leaving lifecycle-hooks, model-registry-auth-mode, auth-storage,
and 10 other suites with zero enforcement.

- Add `test:packages` script that runs compiled dist tests after build
- Wire into both the linux build job and windows-portability job in CI
- Fix two env-isolation bugs in auth-storage.test.ts: the "returns undefined"
  and "falls through to fallback resolver" tests were not clearing
  OPENROUTER_API_KEY before calling getApiKey, causing failures when the
  env var is set in the caller's environment
2026-03-25 12:14:17 -05:00
github-actions[bot]
652811212a release: v2.46.1 2026-03-25 17:13:41 +00:00
Lex Christopherson
ab5444fec8 fix(ci): prevent windows-portability from blocking pipeline
continue-on-error allows CI to conclude as success even when
windows-portability fails, unblocking the Pipeline workflow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:05:22 -06:00
ahwlsqja
0e7a01f49c fix: reconcile stale task DB status from disk artifacts (#2514)
When a session disconnects after the agent writes SUMMARY + VERIFY
files but before postUnitPostVerification updates the DB, tasks
remain 'pending' in the DB despite being complete on disk.

deriveStateFromDb now checks each non-done task for a SUMMARY file
on disk before selecting the active task. If found, it updates the
DB to 'complete' and logs to stderr for observability.

Fixes #2514
2026-03-26 02:01:57 +09:00
Lex Christopherson
5821e3dce9 chore: trigger CI to pick up pipeline race condition fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 10:59:49 -06:00
Lex Christopherson
382c53e592 chore: trigger pipeline with race condition fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 10:57:33 -06:00
Lex Christopherson
c6328a229f fix(ci): prevent pipeline race condition on release push
Serialize pipeline runs with a fixed concurrency group (pipeline-main)
instead of per-SHA groups that allowed parallel races. Pull --rebase
before pushing the release commit so intervening main commits don't
cause non-fast-forward failures.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 10:47:48 -06:00
Tom Boucher
147a141d4d docs: update README and Mintlify docs for v2.45.0 and v2.46.0
- Replace v2.44.0 "What's New" section with v2.46.0 covering single-writer
  state engine, /gsd rethink, /gsd mcp, offline mode, global KNOWLEDGE.md,
  mobile-responsive web UI, and key fixes
- Update default git.isolation from worktree to none across all docs
- Add /gsd rethink and /gsd mcp to command tables (README + commands.mdx)
- Add offline mode and /gsd mcp to getting-started.mdx
- Add troubleshooting entries for isolation default change and startup checks
- Reference Mintlify documentation site (gsd.build) in README
- Update git-strategy.mdx with reordered isolation modes and migration note
- Update auto-mode.mdx isolation mode listing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 12:43:08 -04:00
TÂCHES
cebdc77ffd Add $GSD Token badge to README
Added badge for $GSD token on Dexscreener to README.
2026-03-25 10:38:40 -06:00
TÂCHES
b1300160f3 Merge pull request #2511 from gsd-build/fix/ensure-db-open-empty-gsd
fix(gsd): create empty DB for fresh projects with empty .gsd/
2026-03-25 10:34:03 -06:00
Lex Christopherson
ae0029b49f fix(gsd): create empty DB for fresh projects with empty .gsd/ (#2510)
ensureDbOpen() and the auto-start DB lifecycle block both gated DB
creation on the presence of Markdown files (DECISIONS.md, REQUIREMENTS.md,
milestones/). In a brand new project, .gsd/ exists but contains no
Markdown yet, so gsd_decision_save returned db_unavailable and the
agent derailed.

Create an empty DB whenever .gsd/ exists, regardless of Markdown content.
Migration runs only when Markdown files are present.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 10:29:53 -06:00
TÂCHES
9490f2c45c Merge pull request #2439 from jeremymcs/fix/remote-token-hydration-on-startup
fix(remote-questions): hydrate remote channel tokens from auth.json on startup
2026-03-25 10:10:00 -06:00
TÂCHES
5c834c8b8b Merge pull request #2508 from gsd-build/docs/mintlify-site
docs: add Mintlify documentation site
2026-03-25 10:09:43 -06:00
Lex Christopherson
d20d5e8fb5 docs: add Mintlify documentation site and move internal docs
Add a proper public-facing documentation site using Mintlify with 19 MDX
pages covering getting started, auto mode, commands, configuration, and
all user-facing features. Move internal/SDK documentation (Pi SDK, TUI,
context & hooks, research notes, ADRs) to docs-internal/ since they
should not be part of the public documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:54:41 -06:00
github-actions[bot]
e21526496e release: v2.46.0 2026-03-25 15:50:08 +00:00
TÂCHES
57fe2e08cf Merge pull request #2507 from jeremymcs/fix/prompt-single-writer-tool-api-alignment
fix(gsd): align prompts with single-writer tool API
2026-03-25 09:36:45 -06:00
TÂCHES
050bfd4f8b Merge pull request #2497 from gsd-build/feat/single-writer-engine-v3-control-plane
feat(gsd): single-writer engine — write discipline, state guards, actor identity, reversibility
2026-03-25 09:35:59 -06:00
Jeremy McSpadden
2fada22c63 fix(gsd): align prompts with single-writer tool API
Replace direct file writes and manual DECISIONS.md/REQUIREMENTS.md
mutations in GSD prompts with the correct gsd_* tool calls:

- `gsd_summary_save` for RESEARCH, CONTEXT, and SUMMARY artifacts
- `gsd_requirement_update` instead of direct REQUIREMENTS.md edits
- `gsd_decision_save` instead of append-to-DECISIONS.md
- `gsd_plan_slice` instead of manual plan file writes in guided-plan-slice

Also document intentional exceptions: quick-task (no milestone context,
outside auto-mode lifecycle) and rethink park/unpark/reorder/discard
(no tool API exists for these milestone-lifecycle operations yet).

Adds "never edited manually" clarification to system.md checkbox docs.
2026-03-25 10:34:34 -05:00
Lex Christopherson
5c34ab2e60 merge: resolve conflict in complete-milestone.ts — keep verificationPassed + TOCTOU guards
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:31:50 -06:00
TÂCHES
ec1ddce480 Merge pull request #2504 from gsd-build/fix/pretest-typecheck-gate
fix(ci): add pretest typecheck gate to prevent silent type drift
2026-03-25 09:29:21 -06:00
Lex Christopherson
1d44a89634 fix(gsd): integration-proof — check DB state not roadmap projection after reset
After slice completion + reset, the roadmap projection may not be re-rendered
in the new table format. DB state is authoritative — assert on DB status
instead of parsing projection files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:27:28 -06:00
Jeremy McSpadden
ddbf3105a3 fix(gsd): block milestone completion when verification fails (#2500)
Closes #2499
2026-03-25 09:25:54 -06:00
Lex Christopherson
9fac1a77d5 fix(ci): add typecheck:extensions to pretest to prevent silent type drift
Vitest/node --test uses esbuild for transpilation and skips type-checking,
so type errors in extension tests accumulate silently until CI runs
tsc --noEmit. Adding typecheck:extensions as a pretest gate catches drift
locally before it reaches CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:25:14 -06:00
Lex Christopherson
887d940a2c fix(gsd): relax integration-proof cross-validation for table-format roadmap
DB state is authoritative (single-writer engine). The filesystem parser
doesn't parse the new table-format roadmap projections, so cross-validation
is relaxed to check DB correctness only. Undo/reset roadmap check accepts
either checkbox or emoji format.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:23:15 -06:00
Lex Christopherson
5a24f1df80 fix(gsd): update integration-proof tests for table-format roadmap projections
Roadmap now uses emoji table (/) instead of markdown checkboxes ([x]/[ ]).
Plan checkbox format changed from **T01:** to **T01: title**.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:17:05 -06:00
Lex Christopherson
a23c19e77e fix(gsd): update test assertions for schema v11, prompt changes, and removed completedUnits
- Schema version assertions: 10→11 in gsd-db, md-importer, memory-store tests
- Prompt contract tests: update for gsd_complete_task/gsd_complete_slice tool names
- Milestone transition test: update for archive-then-clear pattern
- Plan-milestone test: update for table-format roadmap projection

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 09:12:15 -06:00
Lex Christopherson
8119e12ce9 fix(gsd): update test files for removed completedUnits, writeLock signature, and type changes
- Remove completedUnits from WorkerInfo/SessionLockData test object literals
- Remove verifyExpectedArtifact/writeUnitRuntimeRecord from LoopDeps mocks
- Fix writeLock call signatures (remove numeric completedUnits arg)
- Fix idle-recovery imports (moved to auto-recovery.ts)
- Add full_plan_md to TaskRow test objects
- Fix WorkflowEvent type in test (exclude session_id from Omit)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 08:54:29 -06:00
Lex Christopherson
63dea156c3 fix(gsd): remove stale completedUnits refs, fix writeLock callers, add missing imports
- Remove completedUnits from dashboard, context, parallel, guided-flow, merge
- Fix writeLock callers to match new (basePath, unitType, unitId, sessionFile?) signature
- Add gsdRoot, atomicWriteSync, verifyExpectedArtifact, writeUnitRuntimeRecord imports to phases.ts
- Add full_plan_md to workflow-manifest snapshot mapping

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 08:54:29 -06:00