Commit graph

3535 commits

Author SHA1 Message Date
TÂCHES
e9e36f9568 feat(gsd): Tool-driven write-side state transitions — replace markdown mutation with atomic SQLite tool calls (#2141) 2026-03-23 14:16:32 -06:00
Lex Christopherson
1194548d61 fix(gsd): wrap plan-task DB writes in transaction + untrack .gsd/ artifacts
plan-task.ts was the only planning tool handler not wrapping its
insertTask/upsertTaskPlanning calls in a transaction(), risking partial
DB state if the upsert failed after insert. Matches the pattern used by
plan-slice, replan-slice, reassess-roadmap, and plan-milestone.

Also removes 80 .gsd/ working artifacts that were force-added despite
being in .gitignore.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 13:42:38 -06:00
TÂCHES
108845dd4b chore(M001): auto-commit after complete-milestone 2026-03-23 13:32:31 -06:00
Jeremy McSpadden
47bedc5540 feat: add contextual tips system for TUI and web terminal
Add a session-scoped contextual tips system that shows non-intrusive
hints when user behavior suggests they'd benefit from knowing a feature.

Tips:
- Shell command prefix: nudge when bare ls/git/npm typed without !
- Large paste: warn when >2000 char input sent to agent
- Thinking level: hint when short question with high/xhigh thinking
- Double-bang reminder: after 3+ single-! commands, suggest !!
- Compaction nudge: when context >= 70% full

Each tip fires at most N times per session, resets on /new.
Wired into both TUI (dim inline text) and web terminal (system line).
31 unit tests covering all tips, suppression, reset, and priority.
2026-03-23 14:28:50 -05:00
TÂCHES
dff941b1dc chore(M001): auto-commit after validate-milestone 2026-03-23 13:19:14 -06:00
TÂCHES
6f156ed053 chore(M001/S06): auto-commit after complete-slice 2026-03-23 13:14:14 -06:00
TÂCHES
f76fe8ec1e feat(S06/T02): Strip all 16 lazy createRequire fallback paths from migr…
- src/resources/extensions/gsd/dispatch-guard.ts
- src/resources/extensions/gsd/auto-dispatch.ts
- src/resources/extensions/gsd/auto-verification.ts
- src/resources/extensions/gsd/parallel-eligibility.ts
- src/resources/extensions/gsd/doctor.ts
- src/resources/extensions/gsd/doctor-checks.ts
- src/resources/extensions/gsd/visualizer-data.ts
- src/resources/extensions/gsd/workspace-index.ts
2026-03-23 13:09:37 -06:00
TÂCHES
56efa72886 test(S06/T01): Extract parseRoadmap/parsePlan into parsers-legacy.ts, u…
- src/resources/extensions/gsd/parsers-legacy.ts
- src/resources/extensions/gsd/files.ts
- src/resources/extensions/gsd/state.ts
- src/resources/extensions/gsd/md-importer.ts
- src/resources/extensions/gsd/commands-maintenance.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/auto-recovery.ts
- src/resources/extensions/gsd/tests/parsers.test.ts
2026-03-23 12:53:49 -06:00
github-actions[bot]
b67ba7c086 release: v2.43.0 2026-03-23 18:50:53 +00:00
TÂCHES
3af95e601b chore(M001/S06): auto-commit after plan-slice 2026-03-23 12:35:52 -06:00
TÂCHES
aabd34fdd3 chore(M001/S06): auto-commit after research-slice 2026-03-23 12:27:45 -06:00
TÂCHES
f9c4d6bedc chore(M001/S05): auto-commit after complete-slice 2026-03-23 12:23:04 -06:00
TÂCHES
460f6f3933 feat(S05/T04): Migrate remaining 6 callers (auto-prompts, auto-recovery…
- src/resources/extensions/gsd/auto-prompts.ts
- src/resources/extensions/gsd/auto-recovery.ts
- src/resources/extensions/gsd/auto-direct-dispatch.ts
- src/resources/extensions/gsd/auto-worktree.ts
- src/resources/extensions/gsd/reactive-graph.ts
- src/resources/extensions/gsd/markdown-renderer.ts
2026-03-23 12:17:23 -06:00
TÂCHES
06a876676a feat(S05/T03): Migrate 7 warm/cold callers (doctor, doctor-checks, visu…
- src/resources/extensions/gsd/doctor.ts
- src/resources/extensions/gsd/doctor-checks.ts
- src/resources/extensions/gsd/visualizer-data.ts
- src/resources/extensions/gsd/workspace-index.ts
- src/resources/extensions/gsd/dashboard-overlay.ts
- src/resources/extensions/gsd/auto-dashboard.ts
- src/resources/extensions/gsd/guided-flow.ts
2026-03-23 12:07:01 -06:00
TÂCHES
4d3ccb5b08 feat(S05/T02): Extend migrateHierarchyToDb to populate v8 planning colu…
- src/resources/extensions/gsd/md-importer.ts
- src/resources/extensions/gsd/tests/gsd-recover.test.ts
2026-03-23 11:52:46 -06:00
mastertyko
b3d12628f9 fix: prevent banner from printing twice on first run (#2251)
On first launch (before ~/.gsd/ exists), loader.ts prints a branded
ASCII logo and welcome message. Later, cli.ts unconditionally calls
printWelcomeScreen(), resulting in a duplicate banner.

Set GSD_FIRST_RUN_BANNER env flag in loader.ts after printing the
first-run banner. cli.ts now checks for this flag and skips the
welcome screen when it is already set.

The session-restart banner in register-hooks.ts is unaffected because
it only fires on non-first sessions (isFirstSession guard).

Closes #2245
2026-03-23 11:51:08 -06:00
TÂCHES
012f1cf06a fix(test): Windows CI — use double quotes in git commit message (#2252)
The symlink test used single quotes in a commit message
(`-m 'add gitignore'`) inside a `&&`-chained shell command. On Windows,
`cmd.exe` doesn't treat single quotes as string delimiters, so git
received a mangled pathspec `gitignore'`. Split into two separate `run()`
calls with double-quoted commit message, matching every other test in
the file.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 11:49:50 -06:00
TÂCHES
64908fc822 feat(S05/T01): Schema v10 adds replan_triggered_at column; deriveStateF…
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/state.ts
- src/resources/extensions/gsd/triage-resolution.ts
- src/resources/extensions/gsd/tests/flag-file-db.test.ts
- src/resources/extensions/gsd/tests/derive-state-db.test.ts
2026-03-23 11:46:28 -06:00
TÂCHES
b8aaded95e chore(M001/S05): auto-commit after plan-slice 2026-03-23 11:37:37 -06:00
TÂCHES
4f829131f6 chore(M001/S05): auto-commit after research-slice 2026-03-23 11:29:45 -06:00
TÂCHES
953598524d fix(async-jobs): suppress duplicate follow-up for awaited job results (#2248) (#2250)
When await_job consumed async job results, onJobComplete still fired
follow-up messages for each job. Each follow-up triggered a wasteful
LLM turn where the agent could only say "Already captured...".

Add an `awaited` flag to Job. await_job sets it on all watched jobs
before waiting (avoiding a race with the promise .then() callback).
onJobComplete skips follow-up delivery for awaited jobs. Fire-and-forget
jobs still get follow-up messages as before.

Closes #2248

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 11:28:53 -06:00
TÂCHES
6e94a5693d chore(M001/S04): auto-commit after complete-slice 2026-03-23 11:22:11 -06:00
TÂCHES
d7994a1538 fix(S04/T04): Add planning-crossval tests proving DB↔rendered↔parsed pa…
- src/resources/extensions/gsd/tests/planning-crossval.test.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- .gsd/milestones/M001/slices/S04/tasks/T04-PLAN.md
2026-03-23 11:16:24 -06:00
TÂCHES
93e46c3712 feat(S04/T03): Migrate auto-dispatch.ts (3 rules), auto-verification.ts…
- src/resources/extensions/gsd/auto-dispatch.ts
- src/resources/extensions/gsd/auto-verification.ts
- src/resources/extensions/gsd/parallel-eligibility.ts
- .gsd/milestones/M001/slices/S04/tasks/T03-PLAN.md
2026-03-23 11:09:38 -06:00
TÂCHES
08c3fcc57c feat(S04/T02): Migrate dispatch-guard.ts to DB queries with isDbAvailab…
- src/resources/extensions/gsd/dispatch-guard.ts
- src/resources/extensions/gsd/tests/dispatch-guard.test.ts
- .gsd/milestones/M001/slices/S04/tasks/T02-PLAN.md
2026-03-23 11:03:42 -06:00
TÂCHES
61c9e62d37 fix(gsd): remove force-staging of .gsd/milestones/ through symlinks (#2247) (#2249)
smartStage() was using git hash-object + update-index to bypass .gitignore
and force-stage .gsd/milestones/ files when .gsd is a symlink. This
contradicts the external state design (symlink = state lives outside repo)
and the documented deprecation of commit_docs.

Remove the force-add block, finish the commit_docs deprecation in
auto-prompts (always emit "do not commit"), and clean up the commitDocs
parameter from all call sites. The deprecation warning in
preferences-validation remains so users are told to remove the setting.

Closes #2247

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 11:00:02 -06:00
TÂCHES
f86882bde5 fix(S04/T01): Add schema v9 migration with sequence column on slices/ta…
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts
- .gsd/milestones/M001/slices/S04/S04-PLAN.md
- .gsd/milestones/M001/slices/S04/tasks/T01-PLAN.md
2026-03-23 10:57:27 -06:00
TÂCHES
b73f525834 docs(S04): add slice plan 2026-03-23 10:52:22 -06:00
TÂCHES
5d93a71374 chore(M001/S04): auto-commit after research-slice 2026-03-23 10:45:24 -06:00
TÂCHES
50cc29f93b chore(M001/S03): auto-commit after complete-slice 2026-03-23 10:41:21 -06:00
TÂCHES
356d54431e test(S03/T03): Register gsd_replan_slice and gsd_reassess_roadmap tools…
- src/resources/extensions/gsd/bootstrap/db-tools.ts
- src/resources/extensions/gsd/prompts/replan-slice.md
- src/resources/extensions/gsd/prompts/reassess-roadmap.md
- src/resources/extensions/gsd/tests/prompt-contracts.test.ts
2026-03-23 10:37:08 -06:00
TÂCHES
46c5d37a8d test(S03/T02): Implement reassess_roadmap handler with structural enfor…
- src/resources/extensions/gsd/tools/reassess-roadmap.ts
- src/resources/extensions/gsd/tests/reassess-handler.test.ts
- src/resources/extensions/gsd/gsd-db.ts
2026-03-23 10:33:13 -06:00
TÂCHES
b8b441fce4 fix: remove .gsd/ milestone artifacts from git index
These files were being force-staged through the symlink by
_forceAddMilestoneArtifacts() bypassing .gitignore. External state
projects should not have .gsd/ in version control.
2026-03-23 10:29:22 -06:00
TÂCHES
1acf1a6f57 test(S03/T01): Implement replan_slice handler with structural enforceme…
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/tools/replan-slice.ts
- src/resources/extensions/gsd/tests/replan-handler.test.ts
- .gsd/milestones/M001/slices/S03/S03-PLAN.md
2026-03-23 10:28:33 -06:00
TÂCHES
6ffa069f2f chore(M001/S03): auto-commit after plan-slice 2026-03-23 10:24:49 -06:00
TÂCHES
e7e22d5eca fix(gsd): remove over-broad skill activation heuristic (#2239) (#2244)
Remove the blanket loop that auto-activated every visible skill whose
name/description substring-matched tokens from extraContext and
taskPlanContent. This caused 32+ irrelevant skills (xcode-build,
ableton-lom, etc.) to load every auto-mode turn.

Skill activation now uses only explicit preference sources:
always_use_skills, skill_rules, prefer_skills, and skills_used from
task plan frontmatter.

Closes #2239

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:19:28 -06:00
TÂCHES
c5305805b5 chore(M001/S03): auto-commit after research-slice 2026-03-23 10:17:47 -06:00
TÂCHES
8e946013f3 chore(M001/S02): auto-commit after complete-slice 2026-03-23 10:14:16 -06:00
TÂCHES
d53bf56bae test(S02/T03): Update plan-slice prompt to explicitly name gsd_plan_sli…
- src/resources/extensions/gsd/prompts/plan-slice.md
- src/resources/extensions/gsd/tests/prompt-contracts.test.ts
- src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts
- .gsd/milestones/M001/slices/S02/tasks/T03-PLAN.md
2026-03-23 10:08:44 -06:00
TÂCHES
a380b8ed77 test(S02/T02): Implement DB-backed gsd_plan_slice and gsd_plan_task han…
- .gsd/milestones/M001/slices/S02/S02-PLAN.md
- src/resources/extensions/gsd/tools/plan-slice.ts
- src/resources/extensions/gsd/tools/plan-task.ts
- src/resources/extensions/gsd/bootstrap/db-tools.ts
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/tests/plan-slice.test.ts
- src/resources/extensions/gsd/tests/plan-task.test.ts
2026-03-23 10:05:11 -06:00
Tom Boucher
e0c203c3e4 docs: update documentation for v2.42.0 release (#2093)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:03:32 -06:00
Tom Boucher
297845f10c fix(auth): fall through to env/fallback when OAuth credential has no registered provider (#2097)
Fixes #2083

When an OpenRouter API key is stored in auth.json as type:"oauth" (instead
of type:"api_key"), getApiKey() calls getOAuthProvider("openrouter") which
returns undefined — OpenRouter is not a registered OAuth provider. Previously,
resolveCredentialApiKey returned undefined and getApiKey returned that directly,
never reaching the env-var or fallback-resolver paths.

Now, when resolveCredentialApiKey returns undefined, getApiKey falls through
to OPENROUTER_API_KEY env var and the fallback resolver instead of silently
failing with "Authentication failed."

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:03:05 -06:00
Tom Boucher
f4ee51017a perf: startup optimizations — pre-compiled extensions, compile cache, batch discovery (#2125)
Skip jiti JIT compilation for bundled extensions that have pre-compiled .js
siblings, enable V8 bytecode caching on Node 22+, and batch directory
discovery to reduce syscalls during resource loading.

Fixes #2108

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:02:30 -06:00
TÂCHES
752b26d542 test(S02/T01): Add DB-backed slice and task plan renderers with compati…
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/tests/markdown-renderer.test.ts
- src/resources/extensions/gsd/tests/auto-recovery.test.ts
- .gsd/KNOWLEDGE.md
2026-03-23 09:58:52 -06:00
Juan Francisco Lebrero
c75f69610f fix(lsp): bound message buffer and clean up stale client state (#2171)
Fix three sources of unbounded memory growth in the LSP client:

1. Message buffer: Add a 10 MB cap on client.messageBuffer. If an LSP
   server sends incomplete or malformed data that causes the buffer to
   exceed this limit, the buffer is discarded and reset to prevent
   runaway memory usage.

2. Client/lock map eviction: clientLocks and fileOperationLocks entries
   were never removed when a client was shut down via shutdownClient().
   Now both maps are cleaned up alongside the clients map on shutdown.

3. Idle checker lifecycle: The idle check interval now stops itself when
   no clients remain, and shutdownAll() explicitly stops it and clears
   all global maps (clients, clientLocks, fileOperationLocks).
2026-03-23 09:54:12 -06:00
Tom Boucher
a3c7992a26 fix: clean up macOS numbered .gsd collision variants (#2205) (#2210)
macOS APFS silently renames `.gsd` to `.gsd 2`, `.gsd 3`, etc. when a
directory already exists at the symlink target path. This causes GSD to
lose its state directory, making tracked planning files appear deleted.

- Add `cleanNumberedGsdVariants()` to detect and remove `.gsd <N>` entries
- Call it early in `ensureGsdSymlink()` before any existence checks
- Add `numbered_gsd_variant` doctor check that detects and auto-fixes them
- Add 19-assertion test covering directories, symlinks, mixed scenarios,
  and selective removal (only `.gsd <digits>` pattern, not `.gsd-backup`)

Fixes #2205

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:53:51 -06:00
Tom Boucher
d83000d05d feat(forensics): opt-in duplicate detection before issue creation (#2105)
* feat(forensics): opt-in duplicate detection before issue creation

Adds forensics_dedup preference (default: false) that instructs the
forensics agent to search existing issues and PRs before filing.
First-time users see an opt-in notice explaining the token cost.

Fixes #2096

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

* ci: retrigger checks

* fix(build): summary must be string[] not string in showNextAction

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:53:34 -06:00
TÂCHES
b2a88d5645 chore(M001/S02): auto-commit after plan-slice 2026-03-23 09:53:26 -06:00
mastertyko
75d2ea7fb7 test(web): isolate onboarding contract env from host machine (#2119) 2026-03-23 09:53:02 -06:00
mastertyko
06901f1c76 fix(search): keep duplicate-search loop guard armed (#2117) 2026-03-23 09:52:34 -06:00