Verifies auto.ts does not use a relative import reaching above
extensions/ for resource-loader (breaks on deployment to ~/.gsd/).
Guards against regression of the fix for #3899.
The relative import `../../../resource-loader.js` in auto.ts works from
the source tree (src/resources/extensions/gsd/ → src/resource-loader.js)
but breaks when extensions are deployed to ~/.gsd/agent/extensions/gsd/
(resolves to ~/.gsd/resource-loader.js which doesn't exist).
Use createRequire to resolve the gsd-pi package root and import
dist/resource-loader.js from there, which works in both source and
deployed contexts.
Regression introduced in #3899 (9ed543f1c8).
Verifies the flag returns true after openDatabase() is called and
persists after closeDatabase(), ensuring the "not yet initialized"
vs "genuinely unavailable" distinction works correctly.
deriveState() is called during before_agent_start context injection,
before any tool invocation has had a chance to open the DB. Previously,
isDbAvailable() returning false in this path triggered a misleading
"DB unavailable — using filesystem state derivation (degraded mode)"
warning, even though the DB was simply not yet initialized (not failed).
Add a _dbOpenAttempted flag in gsd-db.ts that tracks whether
openDatabase() has been called at least once. The degraded-mode warning
now only fires when the DB was actually attempted and failed to open,
not when it hasn't been initialized yet.
Supersedes #3922.
Three fixes to prevent cross-milestone contamination during parallel merge:
1. autoCommitDirtyState branch guard: only auto-commit when cwd is on the
milestone branch, not the integration branch. Prevents committing dirty
files from other milestones onto main.
2. process.chdir(previousCwd) before MergeConflictError throw: restores cwd
so the next merge in a parallel sequence doesn't inherit a leaked cwd.
3. Pre-teardown auto-commit branch guard: skip the safety-net commit when
cwd is on the integration branch, not the milestone branch.
Supersedes #3130.
- Stream tool results in real-time during Claude Code SDK sessions
instead of deferring until session end. Tool calls (read, bash, write,
etc.) now show their output as they complete, not collapsed as "..."
- Stop suppressing toolcall_start/delta/end events from stream adapter
so the TUI can render tool call progress during streaming
- On SDK turn boundary (user message with tool results), push synthetic
toolcall_end events with externalResult attached for immediate rendering
- Chat controller checks for externalResult on toolcall_end message
updates and calls updateResult on pending ToolExecutionComponents
- Fix case-sensitive tool name matching (Read vs read, Bash vs bash)
in TUI ToolExecutionComponent rendering
- Auto-discover and pass GSD_WORKFLOW_EXECUTORS_MODULE and
GSD_WORKFLOW_WRITE_GATE_MODULE env vars in MCP server launch config
- Add /gsd mcp init command and auto-bootstrap .mcp.json for Claude
Code provider during auto-start
- Add tool_execution_update event type for web UI streaming updates
- Add setStderrLoggingEnabled toggle for workflow logger
ensureDbOpen() returns false on failure instead of throwing, so the
try/catch alone was not catching the real failure path. Now check the
return value and notify the user with a visible warning when DB or
STATE.md generation fails, instead of silently claiming full success.
The init wizard created .gsd/milestones/ and PREFERENCES.md but never
called ensureDbOpen(), leaving GSD in degraded markdown-only mode on
every fresh install. 20+ DB-gated features were disabled until a tool
handler happened to trigger DB creation as a side effect.
- Call ensureDbOpen(basePath) after bootstrapGsdDirectory() so the
SQLite database exists immediately
- Create .gsd/runtime/ directory to match the headless bootstrap path
- Generate initial STATE.md via deriveState + buildStateMarkdown so
the explicit /gsd init path produces it (showSmartEntry would have
generated it, but ops.ts returns before entering that flow)
All three additions are wrapped in non-fatal try/catch — failures
log warnings but never block project init.
Closes#3880
- auto.ts: restore s.autoStartTime from meta.autoStartTime in both
custom workflow and milestone resume paths, with Date.now() fallback
and zero-guard
- auto.ts: replace 3 empty catch blocks with logWarning calls
- guided-flow.ts: replace empty catch with logWarning call
- interrupted-session.ts: add autoStartTime to PausedSessionMetadata