Commit graph

1560 commits

Author SHA1 Message Date
Marek Hovadík
f2bcd049ae fix: lazy-open GSD database on first tool call in manual sessions (#1606)
In manual sessions (no auto-mode), bootstrapAutoSession never runs, so the
GSD database is never opened. This causes gsd_save_decision,
gsd_update_requirement, and gsd_save_summary tools to always fail with
'GSD database is not available'.

Add ensureDbOpen() helper that checks isDbAvailable() first, then tries to
open the DB from the expected .gsd/gsd.db path if it exists. All three tool
handlers now use this helper instead of the check-only pattern.

The fix is backward-compatible: in auto-mode the DB is already open, so
ensureDbOpen() returns true immediately on the isDbAvailable() check.
2026-03-20 10:27:04 -06:00
TÂCHES
7c25036ed9 feat(gsd): GitHub sync extension — auto-sync to Issues, PRs, Milestones (#1603)
* feat(gsd): GitHub sync extension — auto-sync lifecycle events to Issues, PRs, Milestones

Standalone opt-in extension at src/resources/extensions/github-sync/ that
syncs GSD lifecycle events to GitHub as a presentation layer. Local .gsd/
files remain source of truth; GitHub is fire-and-forget.

Lifecycle mapping:
- plan-milestone → GH Milestone + tracking Issue (roadmap body)
- plan-slice → slice branch + draft PR + task sub-issues
- execute-task → summary comment + close task issue + Resolves #N commit
- complete-slice → mark PR ready + squash-merge into milestone branch
- complete-milestone → close GH Milestone + tracking issue

GSD core changes (minimal):
- preferences: add `github` config key with validation and merge logic
- auto-post-unit: single dynamic import integration point after auto-commit
- git-service: `issueNumber` field on TaskCommitContext for Resolves #N trailer

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

* fix: strict TS casts for SummaryFrontmatter and GitHubSyncConfig

CI tsconfig requires double-cast through unknown for interfaces
without index signatures.

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-03-20 10:10:37 -06:00
Iouri Goussev
485003777f refactor(auto-loop): 5 code smell fixes (#1602)
- Extract closeoutAndStop helper, replace 4 duplicated patterns
- Fix isRetry variable shadowing → isRetryForOutcome
- Replace budget alert if/else cascade with BUDGET_THRESHOLDS table
- Extract generateMilestoneReport, deduplicate basename import
- Remove unused _prefs param from runUnit and all call sites
2026-03-20 10:02:24 -06:00
TÂCHES
65dca68242 refactor(gsd): replace session-scoped promise bridge with per-unit one-shot (#1595)
Move `pendingResolve` and `sessionSwitchInFlight` from AutoSession to
module-level variables in auto-loop.ts (`_currentResolve`,
`_sessionSwitchInFlight`). Remove `pendingAgentEndQueue` entirely —
agent_end events arriving with no pending resolver are now dropped
(with a debug warning) instead of queued.

This eliminates the `_activeSession` singleton, the queue drain logic
in `runUnit`, and three properties from `AutoSession.reset()`.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 09:56:43 -06:00
TÂCHES
900d2fbd7c fix(gsd): detect anthropic-vertex in provider doctor (#1598)
* fix(gsd): detect anthropic-vertex in provider doctor

* test(gsd): avoid secret-scan false positives
2026-03-20 09:56:29 -06:00
Glen
0bceb689a7 feat: add GSD_PROJECT_ID env var to override project hash (#1600)
Extract validateProjectId() and validate at startup in
bootstrapAutoSession() so users get immediate feedback on invalid
values. repoIdentity() returns the custom ID directly when set.
2026-03-20 09:56:19 -06:00
TÂCHES
912dab1d81 refactor(gsd): remove prompt compression subsystem (~4,100 lines) (#1597)
Delete prompt-compressor, summary-distiller, and semantic-chunker modules
plus all associated tests. Replace all compression/distillation/chunking
call sites with section-boundary truncation via truncateAtSectionBoundary.
Remove compression_strategy preference, validation, and documentation.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 09:55:07 -06:00
TÂCHES
e14eee14fe refactor(gsd): crashproof stopAuto with independent try/catch per cleanup step (#1596)
Each cleanup group in stopAuto is wrapped in its own try/catch so a
failure in one step (e.g., worktree exit, DB close, model restore)
cannot abort remaining cleanup. Critical invariants (s.active=false,
s.paused=false, UI reset, pendingResolve=null) are moved into a
finally block that executes unconditionally.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 09:54:55 -06:00
TÂCHES
2fa8728740 fix(gsd): tighten prompt automation contracts (#1556)
* fix(gsd): tighten prompt automation contracts

* fix(gsd): restore confirmation gates for reflection/requirements/roadmap, scope workflow autonomy by complexity

Amends PR #1556 to address two behavioral risks:

1. discuss.md: Remove "treat continuation as confirmation" fallthrough —
   elaboration is not confirmation. Restore explicit confirmation gates
   for requirements and roadmap preview.

2. workflow-start.md: Gate autonomy on {{complexity}} — low/medium
   workflows keep moving by default, high complexity workflows confirm
   at phase transitions.

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-03-20 09:33:38 -06:00
TÂCHES
f421157056 fix(gsd): harden auto-mode agent loop — session teardown, unit correlation, sidecar perf (#1592)
Address six convergent audit findings in the auto-mode agent loop:

1. Move rewriteAttemptCount to AutoSession — eliminates module-level state
   that leaked across stop/start cycles in auto-dispatch.ts
2. Add unit correlation to agent_end queue — tag events with unitId so late
   completions from unit A cannot falsely resolve unit B
3. Split post-unit into heavy/light paths — sidecars skip settle delay,
   doctor, state rebuild, and worktree sync; reduce sleep 500ms→100ms
4. Data-driven budget thresholds — consolidate 75/80/90% copy-pasted
   notification blocks into BUDGET_THRESHOLDS array lookup
5. Fix session teardown — stopAuto() restores model first then calls
   s.reset() replacing 36 lines of manual field clearing
6. Add debugLog to 12 silent catch blocks in auto-post-unit.ts

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 09:13:23 -06:00
Glen
869e037202 feat: add GSD_HOME env var to override global ~/.gsd directory (#1566)
Centralise all ~/.gsd path construction through app-paths.ts (compiled
code) or a module-level `gsdHome` const (runtime extensions that cannot
import app-paths). When GSD_HOME is set, every path that previously
resolved under ~/.gsd now resolves under the override.

Existing overrides (GSD_STATE_DIR, GSD_CODING_AGENT_DIR) continue to
take precedence when set.
2026-03-20 08:29:01 -06:00
Jeremy McSpadden
21a9ab2bcf fix: break remaining shared/mod.js barrel imports in report generation chain (#1588)
PR #1527 fixed metrics.ts but missed several other paths that still
reach shared/mod.js → ui.js → @gsd/pi-tui during report generation
via native dynamic import() (which bypasses jiti alias resolution).

Remaining chains fixed:
- preferences.ts, preferences-validation.ts, export.ts, forensics.ts,
  migrate/parsers.ts: import from shared/format-utils.js directly
- state.ts, visualizer-data.ts, files.ts: import from milestone-ids.js
  instead of guided-flow.js (which pulls in shared/mod.js)
- files.ts: import checkExistingEnvKeys from new env-utils.ts instead
  of get-secrets-from-user.ts (which imports @gsd/pi-tui)

New file: env-utils.ts extracts the pure checkExistingEnvKeys function.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 08:28:53 -06:00
Jeremy McSpadden
e35ad9d194 feat(gsd): add 13 enhancements to /gsd doctor (#1583)
New detections:
- Circular dependency detection (DFS cycle check on slice depends:[])
- Orphaned slice directories (dirs not in roadmap)
- Duplicate task IDs in plan files
- Task summary files on disk not in plan (info)
- Stale REPLAN.md when all tasks are done (info)
- Metrics ledger corruption (version != 1 or units not array)
- Large planning files >100KB (warning)
- Future completed_at timestamps >24h ahead (warning)

New modes and output:
- --dry-run flag: reports [dry-run] would fix entries without writing
- --json flag: formatDoctorReportJson() for CI/tooling integration
- --build / --test flags: opt-in slow checkBuildHealth/checkTestHealth
- Per-check timing: timing.{git,runtime,environment,gsdState} on DoctorReport
- Doctor history: appends compact JSONL entry to .gsd/doctor-history.jsonl;
  exports readDoctorHistory() for programmatic access

Tests: 27 new test scenarios in doctor-enhancements.test.ts covering all features
2026-03-20 08:12:09 -06:00
Jeremy McSpadden
b580f64144 fix: apply pi manifest opt-out to extension-discovery.ts (#1545)
* fix: apply pi manifest opt-out to extension-discovery.ts (#1537 follow-up)

The cmux fix in #1537 patched resolveExtensionEntries() in
packages/pi-coding-agent/src/core/extensions/loader.ts to honor
"pi": {} as an opt-out from auto-discovery. However, there is a
second copy of resolveExtensionEntries() in src/extension-discovery.ts
that was not updated. This is the version actually used at startup
by loader.js via discoverExtensionEntryPaths().

As a result, cmux/index.js is still discovered and loaded as an
extension on startup, producing:
  Extension does not export a valid factory function: .../cmux/index.js

Fix: Apply the same authoritative-manifest logic to the
extension-discovery.ts copy. When a package.json has a "pi" field,
treat it as authoritative and return early — either with declared
extension paths or an empty array for library opt-out.

Tests: 7 new tests covering resolveExtensionEntries and
discoverExtensionEntryPaths behavior for opt-out, declared
extensions, and fallback discovery.

* fix: apply pi manifest opt-out to package-manager.ts (third copy)

There are THREE copies of resolveExtensionEntries():
1. packages/pi-coding-agent/src/core/extensions/loader.ts (fixed in #1537)
2. src/extension-discovery.ts (fixed in previous commit)
3. packages/pi-coding-agent/src/core/package-manager.ts (THIS commit)

Copy #3 is used by collectAutoExtensionEntries() which is called from
addAutoDiscoveredResources() during DefaultPackageManager.resolve().
This is the actual code path that discovers ~/.gsd/agent/extensions/cmux
and passes it to loadExtensions(), producing the factory function error.

* fix: rewrite pi.extensions .ts paths to .js during resource copy

copy-resources.cjs compiles .ts → .js via tsc but copies package.json
files verbatim. Extensions with pi.extensions: ["./index.ts"] end up
in dist/ pointing to a .ts file that doesn't exist (only .js does).

This causes resolveExtensionEntries() to find no valid entry points,
silently skipping the extension. Affected: gsd, browser-tools, context7,
google-search, universal-config — all extensions with pi manifests.

Fix: When copying package.json files, rewrite .ts/.tsx extensions in
pi.extensions arrays to .js so they match the compiled output.

* fix: add missing commands to /gsd description and rate sub-completions

- Add 9 missing commands to the description string: widget, rate, park,
  unpark, init, setup, logs, inspect, extensions
- Add sub-completions for /gsd rate (over/ok/under)

* feat: grid layout for parallel cmux splits and completion trailing-space fix

CmuxClient.createGridLayout(count) pre-creates a tiled grid of surfaces
before launching parallel agents, instead of the previous approach of
creating splits per-agent with alternating right/down directions.

Grid layout strategy:
  1 agent:  [gsd | A]
  2 agents: [gsd | A]    (A split down)
            [    | B]
  3 agents: [gsd | A]    (2x2 grid)
            [ C  | B]
  4 agents: [gsd | A]    (additional splits from bottom-right)
            [ C  | B]
            [    | D]

Changes:
- Add CmuxClient.createSplitFrom(sourceSurfaceId, direction) to split
  from a specific surface rather than always the gsd surface
- Add CmuxClient.createGridLayout(count) that builds the grid and
  returns surface IDs in order
- Update runSingleAgentInCmuxSplit to accept a pre-created surface ID
  (string) or a direction for backward compatibility
- Parallel dispatch pre-creates grid, assigns each agent a surface
- Fix getArgumentCompletions trailing-space handling so sub-completions
  work (e.g., /gsd cmux <tab> now shows status/on/off/etc.)
- 5 new tests for grid layout logic
2026-03-20 08:11:51 -06:00
Jeremy McSpadden
1b6b16f2d5 feat: feat(ui): minimal GSD welcome screen on startup (#1584)
* feat(ui): add GSD welcome screen on interactive startup

Renders a two-panel boxed welcome screen to stderr before the TUI
takes over, mirroring the style of the Claude Code welcome screen.

Left panel  — personalized greeting, GSD ASCII logo, active model + cwd
Right panel — getting-started tips, recent session activity

The screen is printed to stderr immediately before InteractiveMode.run(),
so it appears on launch and reappears when the TUI exits (alternate-screen
buffer swap). It silently skips when not a TTY or terminal < 60 cols.

Files:
  src/welcome-screen.ts          — printWelcomeScreen() implementation
  src/cli.ts                     — call site before interactiveMode.run()
  src/tests/welcome-screen.test.ts — 11 unit tests (all passing)

* refactor(ui): minimal welcome screen — logo + metadata, no box

Replace two-panel boxed layout with a minimal design:
logo block with version/model/cwd alongside it, dim hint below.
No box borders, no tips panel. Clean and fast.

* feat(ui): show tool status line (Brave/Jina/Tavily) when keys are configured
2026-03-20 08:11:06 -06:00
Juan Francisco Lebrero
f1a27b02b8 fix: detect worktree paths resolved through .gsd symlinks (#1585)
When .gsd is a symlink (e.g., openclip/.gsd -> ~/.gsd/projects/<hash>),
worktrees resolve to ~/.gsd/projects/<hash>/worktrees/<name> instead of
the expected <repo>/.gsd/worktrees/<name>. All worktree detection
functions used the marker /.gsd/worktrees/ which did not match the
resolved path /.gsd/projects/<hash>/worktrees/.

This caused three cascading failures:
1. escapeStaleWorktree failed to detect stale worktree CWD
2. isUnderGsdWorktrees returned false, causing nested worktrees
3. Empty registry was conflated with "all milestones complete"

Changes:
- Add findWorktreeSegment helper matching both direct and symlink layouts
- Refactor detectWorktreeName and resolveProjectRoot to use the helper
- Fix escapeStaleWorktree in auto-worktree-sync.ts for symlink paths
- Fix isUnderGsdWorktrees in auto-start.ts for symlink paths
- Fix resolveCapturesPath in captures.ts for symlink paths
- Distinguish empty registry from all-complete in auto-loop.ts
- Add tests for symlink-resolved path detection
2026-03-20 08:10:45 -06:00
github-actions[bot]
1b2ff19615 release: v2.38.0 2026-03-20 07:07:25 +00:00
TÂCHES
ebd2408ffc fix(ci): reduce GitHub Actions minutes ~60-70% (~10k → ~3-4k/month) (#1552)
- Remove feat/** push trigger (PRs already cover feature branches)
- Add concurrency groups with cancel-in-progress to kill stale runs
- Add paths-ignore for docs/markdown/license/unrelated workflow changes
- Consolidate secret-scan, no-gsd-dir, skill-references into single lint job
- Restrict Windows runner (2x minute multiplier) to main push only

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 00:31:49 -06:00
TÂCHES
1bd53a4c87 fix(gsd): reactive batch verification + dependency-based carry-forward (#1549)
* fix(gsd): batch-specific artifact verification for reactive-execute

The reactive-execute artifact verifier previously checked only that
'at least one task summary exists' in the slice. This meant the unit
could report success even when none of the dispatched tasks actually
completed — a pre-existing T01 summary would satisfy the check.

Fix:
- Encode dispatched task IDs in the unitId: M001/S01/reactive+T02,T03
- Persist dispatched batch in ReactiveExecutionState before dispatch
- Verify each dispatched task's summary file exists individually
- Legacy unitId format (no +batch suffix) falls back to old behavior

The verifier now answers 'did the tasks we dispatched actually finish?'
instead of 'does any summary exist?'

Added ReactiveExecutionState.dispatched field to track the batch.
5 new tests covering: all-pass, partial-fail, pre-existing-irrelevant,
legacy fallback, and unitId round-trip encoding.

* fix(gsd): dependency-based carry-forward for reactive task execution

In reactive mode, each subagent task was getting order-based carry-forward
(all prior task summaries by number), not dependency-based. T05 depending
only on T02 would still receive T01, T03, T04 summaries — noise context
that wastes tokens and could confuse execution.

Fix:
- Add getDependencyTaskSummaryPaths() — returns only summaries for tasks
  in the derived dependsOn set, falling back to order-based for root tasks
  with no dependencies (preserves continuity)
- Add ExecuteTaskPromptOptions with carryForwardPaths override
- buildExecuteTaskPrompt accepts optional override, sequential callers
  unchanged (no options = order-based, backward compatible)
- buildReactiveExecutePrompt now passes dependency-scoped paths per task

Sequential execute-task dispatch is completely unchanged — the new code
path only activates when carryForwardPaths is explicitly provided.

3 new tests: dependency-only filtering, root task fallback, missing
dependency summary handling.
2026-03-19 23:59:03 -06:00
Copilot
596b941475 Fix health widget false 'Anthropic key missing' when authenticated via GitHub Copilot (#1522)
* Initial plan

* Fix health widget false 'Anthropic key missing' when authenticated via GitHub Copilot

- Use getEnvApiKey() from @gsd/pi-ai for authoritative env var resolution
  (checks ANTHROPIC_OAUTH_TOKEN, COPILOT_GITHUB_TOKEN, GH_TOKEN, etc.)
- Add cross-provider routing: GitHub Copilot auth satisfies Anthropic/OpenAI requirements
- Add github-copilot to modelToProviderId prefix map
- Keep PROVIDER_REGISTRY env var fallback for non-LLM providers (search/tools)
- Add tests for cross-provider routing and multi-env-var detection

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-19 23:33:05 -06:00
TÂCHES
e4cd141503 fix(gsd): enforce backtick file paths in task plan IO sections (#1548)
* fix(gsd): enforce backtick file paths in task plan IO sections

The reactive task graph (ADR-004) derives dependencies from backtick-wrapped
file paths in ## Inputs and ## Expected Output sections. Without concrete
paths, the graph is ambiguous and falls back to sequential execution.

Changes:
- task-plan.md template: add comments explaining paths are machine-parsed
- plan-slice.md prompt: explicitly instruct planner to write backtick file
  paths in IO sections, add self-audit check for path presence
- observability-validator.ts: new validation rules missing_output_file_paths
  (warning) and missing_input_file_paths (info) catch plans without paths
- plan-quality-validator.test.ts: 4 new test cases for IO path validation

* fix(ci): increase max_tokens and add JSON parse error handling in ai-triage

max_tokens: 300 was too low, causing truncated JSON responses from Claude
that failed to parse. Bumped to 1024 and added try/catch with raw text
logging for easier debugging.

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-03-19 23:28:44 -06:00
TÂCHES
567751471a feat(gsd): ADR-004 — derived-graph reactive task execution (#1546)
Add reactive (graph-derived parallel) task execution within slices.
When enabled via preferences, the dispatch table derives a task dependency
graph from IO annotations in task plans and dispatches multiple ready,
non-conflicting tasks in parallel via subagent.

Architecture:
- Graph derivation happens at dispatch time (auto-dispatch.ts)
- A new reactive-execute prompt instructs the agent to use subagent
  parallel mode to dispatch all currently-ready tasks
- The auto-loop treats reactive-execute as a single unit type
- After agent_end, the orchestrator checks which tasks completed and loops

New files:
- reactive-graph.ts: pure graph derivation, ready-set resolution,
  conflict detection, deadlock detection, IO loader, state persistence
- prompts/reactive-execute.md: prompt template for parallel dispatch
- tests/reactive-graph.test.ts: 22 unit tests for graph functions
- tests/reactive-executor.test.ts: 11 integration tests for dispatch
  rules, preferences validation, state persistence, re-entry

Modified files:
- types.ts: TaskIO, DerivedTaskNode, ReactiveExecutionConfig,
  ReactiveExecutionState interfaces
- files.ts: parseTaskPlanIO() extracts IO from task plan sections
- preferences-types.ts: reactive_execution config + known keys
- preferences-validation.ts: validation with range checks
- auto-dispatch.ts: new reactive-execute dispatch rule
- auto-prompts.ts: buildReactiveExecutePrompt()
- auto-recovery.ts: artifact verification for reactive-execute
- auto-post-unit.ts: reactive state cleanup on slice completion

Backward compatible: disabled by default, falls through to sequential
execution when disabled, ambiguous, or only 1 task is ready.
2026-03-19 23:19:46 -06:00
Nathan Roe
39cd932abb feat: add anthropic-vertex provider for Claude on Vertex AI (#1533)
* feat: add anthropic-vertex provider for Claude models on Google Vertex AI

Add a new anthropic-vertex provider that enables using Claude models
(Opus 4.6, Sonnet 4.6, Haiku 4.5) through Google Vertex AI using the
@anthropic-ai/vertex-sdk package. Follows the same pattern as the
existing google/google-vertex provider split.

Detection uses ANTHROPIC_VERTEX_PROJECT_ID (same env var as Claude Code)
with CLOUD_ML_REGION for region selection, falling back to us-central1.

Extracts shared Anthropic utilities into anthropic-shared.ts (message
conversion, tool conversion, param building, stream processing) to
avoid duplication between anthropic.ts and anthropic-vertex.ts.

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

* feat: add full Claude model set for anthropic-vertex provider

Add 200K context window variants for Opus 4.6 and Sonnet 4.6, plus
older models (Sonnet 4.5, Sonnet 4, Opus 4.5, Opus 4.1, Opus 4, Haiku 4.5).

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

* fix: add @anthropic-ai/vertex-sdk to root dependencies

Required for the published package to resolve the vertex SDK at runtime.

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

* chore: remove unnecessary comments to match codebase style

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

* fix: remove duplicate stream functions after rebase

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

---------

Co-authored-by: Nathan Roe <nathan.roe@carvana.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 23:14:13 -06:00
Jeremy McSpadden
111537f460 docs: fix stale references across documentation (#1543)
* docs: update README for v2.37 — changelog, extensions, stale refs

- Update "What's New" section from v2.33 to v2.37
- Update extensions table: add Async Jobs and GitHub, remove LSP (Pi SDK core)
- Fix extension count in architecture section (12 → 18)
- Remove stale v2.17 version tags from Token Optimization section

* docs: fix stale references across documentation

- commands.md: update version example from v2.28 to v2.37
- troubleshooting.md: fix Node.js requirement from ≥20.6.0 to ≥22.0.0
- skills.md: fix project-local skills path from .pi/ to .gsd/
- CONTRIBUTING.md: fix scope area paths to include packages/ prefix,
  remove incorrect PR #1232 supply chain attack reference
- vscode-extension: fix Node.js requirement, remove hardcoded RPC
  command count (changes over time)

* docs: add troubleshooting for command not found after install

Addresses #1542 — npm global bin directory not in PATH is a common
issue on macOS, especially with Homebrew Node, version managers, or
oh-my-zsh git aliases.

- Add "command not found: gsd" section to troubleshooting.md
- Add callout to getting-started.md install section
2026-03-19 22:14:03 -06:00
github-actions[bot]
65647f83af release: v2.37.1 2026-03-20 04:08:02 +00:00
Jeremy McSpadden
1309e96d5d docs: update README for v2.37 — changelog, extensions, stale refs (#1540)
- Update "What's New" section from v2.33 to v2.37
- Update extensions table: add Async Jobs and GitHub, remove LSP (Pi SDK core)
- Fix extension count in architecture section (12 → 18)
- Remove stale v2.17 version tags from Token Optimization section
2026-03-19 21:55:47 -06:00
Bhumit Chaudhry
e856ac96af Update installation command for gsd-pi to latest version (#1538)
Just a minor edit to make sure the user doesn't have to update after launching
2026-03-19 21:41:00 -06:00
TÂCHES
2822a2954f fix: interactive guard menu for remote auto-mode sessions (#1507) (#1524)
Replace the simple notifyRemoteAutoActive notification with an interactive
guardRemoteSession menu that shows session details and offers actionable
choices (view status, steer, stop, or force start). Guards all auto-mode
entry points: bare /gsd, /gsd next, and /gsd auto.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:32:55 -06:00
Lex Christopherson
2a87687483 fix: use pull_request_target so AI triage has secret access on PRs
pull_request events from forks/branches cannot access repo secrets,
causing 401 auth failures on every PR triage. pull_request_target runs
in the base repo context. Safe because the workflow only reads event
payload data and sparse-checks base branch docs — no PR code executes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:23:27 -06:00
Jeremy McSpadden
71c3b12e70 fix: cmux library directory incorrectly loaded as extension (#1537)
* fix(#1526): auto-mode worktree commits land on main instead of milestone branch

GitServiceImpl.getMainBranch() was designed to detect manual /worktree worktrees
(worktree/<name> branches) but incorrectly applied the same logic to auto-mode
worktrees (milestone/<MID> branches). When no worktree/<name> branch existed,
it fell back to the current branch, which in certain contexts could be main,
causing slice commits to land on main instead of the milestone branch.

Fix: Detect if currently on a milestone/* branch first (auto-mode case) and
return it, before checking for worktree/* branches (manual worktree case).

- Modify getMainBranch() to detect milestone branches first
- Add test verifying getMainBranch() returns correct branch in auto-worktree
- All tests pass, build succeeds

Fixes #1526

* fix: cmux library directory incorrectly loaded as extension

The extension auto-discovery in resolveExtensionEntries() finds
index.js files in subdirectories and treats them as extensions.
The cmux directory has an index.js but it's a utility library
(imported by gsd and subagent extensions), not an extension itself.

Two changes:
1. When a package.json has a "pi" manifest, treat it as authoritative
   and don't fall through to index.ts/index.js auto-detection. This
   lets library directories opt out with "pi": {}.
2. Add package.json to cmux directory with empty pi manifest.
2026-03-19 21:14:25 -06:00
Jeremy McSpadden
aa8d3ee059 fix: separate pi-tui-dependent layout utils to fix report generation (#1527)
Report generation in auto-loop uses native dynamic import() which
bypasses jiti's alias resolution. The import chain
metrics.js → mod.js → ui.js → @gsd/pi-tui failed because Node
cannot resolve @gsd/pi-tui from ~/.gsd/agent/extensions/.

Split ANSI-aware layout helpers (padRight, joinColumns, centerLine,
fitColumns) into layout-utils.ts and keep format-utils.ts pure so
report modules can import formatting functions without pulling in
the @gsd/pi-tui dependency.
2026-03-19 21:14:03 -06:00
Jeremy McSpadden
2fcbb40c09 fix: clarify session lock loss diagnostics (#1535) 2026-03-19 21:13:38 -06:00
Jeremy McSpadden
df76eea764 fix(#1526): auto-mode worktree commits land on main instead of milestone branch (#1534)
GitServiceImpl.getMainBranch() was designed to detect manual /worktree worktrees
(worktree/<name> branches) but incorrectly applied the same logic to auto-mode
worktrees (milestone/<MID> branches). When no worktree/<name> branch existed,
it fell back to the current branch, which in certain contexts could be main,
causing slice commits to land on main instead of the milestone branch.

Fix: Detect if currently on a milestone/* branch first (auto-mode case) and
return it, before checking for worktree/* branches (manual worktree case).

- Modify getMainBranch() to detect milestone branches first
- Add test verifying getMainBranch() returns correct branch in auto-worktree
- All tests pass, build succeeds

Fixes #1526
2026-03-19 21:13:25 -06:00
github-actions[bot]
f83a85eb7c release: v2.37.0 2026-03-20 02:50:52 +00:00
Tom Boucher
7afefc73ac fix: add session-level search budget to prevent unbounded native web search (#1309) (#1529)
The Anthropic API's max_uses resets per request — when pause_turn triggers
a resubmit, the model gets a fresh budget each time. This allowed unlimited
total searches across a research unit, overwhelming the TUI render buffer.

Fix:
- Count web_search_tool_result blocks in conversation history on each
  before_provider_request to track cumulative searches per session
- Cap total native searches at 15 per session (3 full turns of 5)
- Dynamically set max_uses to min(5, remaining) — preserves per-turn cap
  while enforcing session ceiling
- When budget exhausted, omit web_search tool entirely instead of letting
  the model hit max_uses_exceeded repeatedly
- Reset counter on session_start (new agent unit)
- Add web search budget guidance to research prompts (defense in depth)

Tests: 5 new tests covering budget tracking, exhaustion, and reset.
All 35 native-search tests pass.
2026-03-19 20:08:15 -06:00
Jeremy McSpadden
c9d79a829c feat(dashboard): two-column layout with redesigned widget (#1530)
* feat(dashboard): two-column layout with redesigned widget

- Two-column layout: progress bar left, task checklist right
- 4 widget modes: full → small → min → off (cycle with /gsd widget)
- Health indicator and ETA in header line for immediate visibility
- Simplified stats: 3 items (hit rate, cost, context %) instead of 7
- Short PWD (last 2 segments), git worktree name with ⎇ prefix
- Last commit time + message in footer (cached every 15s)
- Preview script with mock data for all modes

* docs: add dashboard widget screenshots for PR #1530

* docs: update dashboard screenshots with wider renders

* docs: wider full-width dashboard screenshots

* feat(dashboard): persist widget_mode in preferences

- Add widget_mode to GSDPreferences and KNOWN_PREFERENCE_KEYS
- Load saved widget_mode from preferences on first access
- Persist to global PREFERENCES.md on /gsd widget change
- Default remains "full" when no preference is set
2026-03-19 20:07:18 -06:00
Jeremy McSpadden
b247c3510e feat: integrate cmux with gsd runtime (#1532) 2026-03-19 20:05:06 -06:00
github-actions[bot]
37d657b949 release: v2.36.0 2026-03-20 01:26:46 +00:00
TÂCHES
d57c6d4e46 fix: preserve user messages during abort with origin-aware queue clearing (#1439) (#1521)
When a user presses Escape during streaming, the abort flow clears all
queued messages indiscriminately. User messages typed during streaming
are silently discarded. This adds a QueueEntry wrapper in the Agent class
to track message origin ("user" vs "system"), so that clearQueue() can
preserve user-typed messages while discarding system-generated ones.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 18:05:04 -06:00
TÂCHES
816383a399 fix: remove broken SwiftUI skill and add CI reference check (#1476) (#1520)
Remove the bundled SwiftUI skill which had 13+ broken references to a
non-existent `../macos-apps/references/` directory. Add a CI script
that validates all relative .md file references in bundled skills,
preventing this class of bug from shipping again. Fix 5 additional
pre-existing broken references in other skills.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 18:04:37 -06:00
TÂCHES
69c0f68ac8 fix: wire escalateTier into auto-loop retry path (#1505) (#1519)
When a unit fails and is retried, the model tier is now escalated
(light -> standard -> heavy) if dynamic routing is enabled and
escalate_on_failure is not explicitly disabled. This connects the
existing escalateTier() function, which was fully implemented and
tested but never called at runtime.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 18:01:25 -06:00
TÂCHES
eb2939760f fix: prevent bare /gsd from stealing session lock from running auto-mode (#1507) (#1517)
Bare /gsd and /gsd next now check for a remote auto-mode session via
readSessionLockData before attempting to start step-mode. If another
process holds the lock, a steering menu is shown instead of competing
for the lock and killing the running session.

Also fixes the guided-flow "all slices discussed" message to detect
active auto-mode and direct users to /gsd status instead of bare /gsd.

Closes #1507

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:59:10 -06:00
TÂCHES
c2d46a951b fix: wire dead token-profile defaults and add /gsd rate command (#1505) (#1516)
- Wire resolveProfileDefaults into loadEffectiveGSDPreferences so
  token_profile: budget actually sets cheaper models and skips phases
- Add /gsd rate <over|ok|under> command to submit user feedback on
  model tier assignments, completing the adaptive routing feedback loop
- Document that models config is required for dynamic routing activation
- Document ceiling behavior when dynamic routing is active
- Document reassess_after_slice as required for reassessment

Closes #1505 (partial — escalateTier wiring deferred to follow-up)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:53:00 -06:00
TÂCHES
5424a169d9 fix: prevent false-positive session lock loss during sleep/event loop stalls (#1512) (#1513)
The onCompromised callback in the retry acquisition path lacked the
elapsed-time suppression that the primary path had, causing unconditional
_lockCompromised=true on benign mtime drift. Additionally, validateSessionLock
now attempts PID-based recovery and re-acquisition before declaring the lock
lost, preventing sessions from stopping when no other process has taken over.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:47:23 -06:00
TÂCHES
c680e2d90c feat: deprecate agent-instructions.md in favor of AGENTS.md / CLAUDE.md (#1492) (#1514)
Replace loadAgentInstructions() with a deprecation warning that fires when
legacy agent-instructions.md files are detected. Pi core already supports
AGENTS.md (with CLAUDE.md fallback) per directory, making the custom GSD
mechanism redundant.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:47:06 -06:00
TÂCHES
bae9cf83ba fix(gsd): filter non-milestone directories from findMilestoneIds (#1494) (#1508)
Directories under .gsd/milestones/ that don't match the M\d+ pattern
(e.g. slices/, temp-backup/) are now excluded instead of being returned
with their raw name. This prevents rogue directories from blocking
auto-mode milestone discovery.

Closes #1494

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:33:24 -06:00
TÂCHES
95f585d183 fix(gsd): accept 'passed' as terminal validation verdict (#1429) (#1509)
isValidationTerminal() now normalizes verdict: passed → pass before
comparison. LLM-generated validation files that write "passed" instead
of "pass" are accepted as terminal, preventing milestones from being
treated as incomplete.

Closes #1429

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:33:15 -06:00
TÂCHES
4c081fa556 feat: AI-powered issue and PR triage via Claude Haiku (#1510)
Adds a GitHub Actions workflow that automatically triages new issues and
PRs using Claude Haiku 4.5. Classifies with type and priority labels,
and flags items that violate VISION.md or CONTRIBUTING.md guidelines
with a `needs-review` label and explanatory comment. No auto-closing —
maintainer makes all final decisions.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:32:54 -06:00
TÂCHES
aa9e1cfea9 fix: add missing imports breaking CI build (#1511)
- Add missing `parseRoadmap` import in `auto-dispatch.ts`
- Add missing `unlinkSync` import in `auto.ts`
- Add missing `syncGsdStateToWorktree` import in `worktree-sync-milestones.test.ts`

All three were dropped during the PR #1419 merge.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:26:31 -06:00
TÂCHES
93fb33de28 docs: add VISION.md, CONTRIBUTING.md, and update PR template (#1506)
Establishes contributor guidelines based on maintainer team discussion.
VISION.md defines project identity, principles, and explicit rejection
criteria. CONTRIBUTING.md covers assign-then-PR workflow, RFC process
for architectural changes, AI disclosure policy, and testing standards.
PR template restructured around TL;DR + What/Why/How format.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:08:23 -06:00