Commit graph

3535 commits

Author SHA1 Message Date
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
copilot-swe-agent[bot]
ce4720bad8 refactor: address review - extract RAPID_ITERATION_THRESHOLD_MS, simplify data access
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
Agent-Logs-Url: https://github.com/gsd-build/gsd-2/sessions/d648480a-42f4-4c41-81c7-85038609c717
2026-03-25 18:20:29 +00:00
copilot-swe-agent[bot]
1737b169b5 feat: enhance /gsd forensics with journal and activity log awareness
- Add journalSummary to ForensicReport: flow count, event type
  distribution, recent events timeline, date range
- Add activityLogMeta to ForensicReport: file count, total size,
  oldest/newest files
- Add journal-based anomaly detectors: stuck-detected, guard-block,
  rapid-iterations, worktree-failure events
- Update formatReportForPrompt and saveForensicReport to include
  journal timeline and activity log metadata
- Update forensics prompt template with journal format docs,
  investigation guidance for cross-referencing activity+journal
- Update web types (diagnostics-types.ts) and forensics-service.ts
  for new fields
- Add forensics-journal.test.ts with 11 contract tests

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
Agent-Logs-Url: https://github.com/gsd-build/gsd-2/sessions/d648480a-42f4-4c41-81c7-85038609c717
2026-03-25 18:19:08 +00: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
Lex Christopherson
3a12089355 fix(gsd): harden single-writer engine — close TOCTOU, intercept bypasses, status inconsistencies
- Write intercept: block edit + bash tools (not just write), case-insensitive
  patterns for macOS, resolve ".." path segments, use BLOCKED_WRITE_ERROR constant
- TOCTOU: move all guard reads inside transaction callbacks across all 5 handlers
  (complete-task, complete-slice, complete-milestone, reopen-task, reopen-slice)
- Wrap reopen-task in a transaction (was bare updateTaskStatus call)
- Fix "done" vs "complete" status inconsistency: complete-slice task filter,
  projection SUMMARY rendering, and regenerateIfMissing all accept both statuses
- Workflow reconcile: sync-lock for concurrent access, stable timestamp sort,
  write event log before DB replay, wrap replayEvents in transaction, include ts
  in event hash, add session_id to parsed conflict events, replay non-conflicting
  events after last conflict resolution
- Manifest: wrap snapshotState queries in deferred transaction for consistent
  snapshot, validate manifest structure on read
- Projections: fix regenerateIfMissing SUMMARY to check individual files not just
  directory, return false for async STATE regeneration, use logWarning consistently
- Logger: hasWarnings() checks for actual warnings (not just buffer.length > 0),
  stderr output on audit write failures

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 08:53:53 -06:00
Jeremy McSpadden
6ed5b01507 test(gsd): add tests for v3 reopen tools, unit ownership, and projection regression
37 new tests across 4 files covering v3 features that had no test
coverage, plus regression tests for the projection bug fixes:

- reopen-task.test.ts (8): success path (reset to pending, no side
  effects on other tasks) + 6 failure paths (empty ID, missing
  milestone/slice/task, closed parents, already pending)
- reopen-slice.test.ts (7): success path (reset slice + all tasks,
  single task variant) + 5 failure paths (empty ID, missing entities,
  closed milestone, already in_progress)
- unit-ownership.test.ts (14): key builders, claim/get/release CRUD,
  overwrite semantics, multi-unit independence, checkOwnership
  (opt-in when no actorName, null when unclaimed, pass when owner
  matches, error when mismatch)
- projection-regression.test.ts (8): renderPlanContent checkbox for
  "complete"/"done"/"pending" status + mixed, parsePlan-compatible
  bold format, renderRoadmapContent status icons

All 37 tests pass. Zero regressions.
2026-03-25 08:53:36 -06:00
Jeremy McSpadden
a1592c984b feat(gsd): single-writer engine v3 — state machine guards, actor identity, reversibility
Three work streams bundled into one phase to close the behavioral control
gaps identified in the v2 handler audit:

Stream 1 — State machine guards on all 8 tool handlers:
- Entity existence checks before mutations (milestone, slice, task)
- Valid status transition enforcement (can't double-complete, can't re-plan
  closed work, can't complete inside a closed parent)
- depends_on validation for plan-milestone (deps must exist + be complete)
- blockerTaskId verification in replan-slice (must exist + be complete)
- Deep task check in complete-milestone (all tasks, not just slice status)

Stream 2 — Actor identity + persistent audit log:
- WorkflowEvent extended with actor_name, trigger_reason, session_id
- Engine-generated UUID session_id stable per process lifetime
- All 8 handlers accept optional actorName/triggerReason and pass through
- workflow-logger now flushes to .gsd/audit-log.jsonl (survives context resets)
- New setLogBasePath() and readAuditLog() API

Stream 3 — Reversibility + unit ownership:
- New gsd_task_reopen handler (reset task to pending with full guards)
- New gsd_slice_reopen handler (reset slice + all tasks with transaction)
- Opt-in unit ownership via .gsd/unit-claims.json (claim/release/check)
- Ownership enforced in complete-task and complete-slice when claims exist
- insertReplanHistory converted to upsert via schema v11 unique index

Bug fixes (pre-existing):
- renderPlanContent checkbox: checked "done" but tasks are "complete"
- renderRoadmapContent: same "done" vs "complete" mismatch
- renderPlanContent format: **T01:** title didn't match parsePlan regex
- Tests updated to seed DB entities and match projection output format
2026-03-25 08:53:36 -06:00
Jeremy McSpadden
5130b04d5a fix(write-intercept): close bare-relative-path bypass in STATE.md regex
The previous regex `/[/\\]\.gsd[/\\]STATE\.md$/` required a path
separator *before* `.gsd`, so a bare relative path like `.gsd/STATE.md`
(no leading directory component) was not blocked. If the file doesn't
exist yet, `realpathSync` throws and the bare path slipped through
undetected.

Fix: change both patterns to `(^|[/\\])` so paths starting with `.gsd/`
are caught regardless of whether a separator precedes them.

Caught during e2e team verification (write-intercept-e2e agent).
Updated test to assert the bare path is now blocked.
2026-03-25 08:53:02 -06:00