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
Adds a GitHub Actions cron job that runs every Monday, executes
generate-models.ts against live provider APIs, and opens a PR
automatically if models.generated.ts has changed.
Closes#3888
Co-Authored-By: Claude Code <noreply@anthropic.com>