Use extensions.worktreeConfig + --worktree flag so core.sparseCheckout
is set per-worktree only, preventing the main checkout from losing its
.story_kit/work/ directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Configures sparse checkout on new and existing worktrees to exclude
the pipeline state directory. This prevents feature branches from
containing .story_kit/work/ file moves that cause rename/delete merge
conflicts when merging back to master.
Also removes "pick up the story from .story_kit/work/" instruction
from agent prompts since the story content is already in the prompt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Keep master's quiet system/rate_limit_event handlers while preserving
the story-62 permission_request handler (the core feature).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When Claude Code requires user approval before executing a tool (file
writes, commits, etc.) the agent sends a permission_request message
over the WebSocket. The web UI now intercepts that message, surfaces a
modal dialog showing the tool name and input, and lets the user approve
or deny. The decision is sent back as a permission_response, allowing
the agent to continue or adjust its approach.
Backend changes:
- claude_code.rs: parse "permission_request" NDJSON events from the PTY,
block the PTY thread via a sync channel, and write the user's decision
back to the PTY stdin as a JSON permission_response.
- chat.rs: thread an optional UnboundedSender<PermissionReqMsg> through
to the provider.
- ws.rs: create a permission-request channel, forward requests to the
client, collect responses via a pending-perms map, and interleave all
of this with the active chat session using tokio::select!.
Frontend changes:
- client.ts: add permission_request to WsResponse, permission_response
to WsRequest, onPermissionRequest handler to ChatWebSocket.connect(),
and sendPermissionResponse() method.
- types.ts: mirror the same type additions.
- Chat.tsx: add permissionRequest state, wire onPermissionRequest
callback, and render an approval modal with tool name, input context,
Approve and Deny buttons.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When an agent process exits normally, the server now automatically runs
acceptance gates (uncommitted changes check + cargo clippy + tests) and
advances the pipeline based on results. This replaces the previous model
where agents had to explicitly call report_completion as an MCP tool.
Changes:
- Add run_server_owned_completion() free function in agents.rs that runs
gates on process exit, stores a CompletionReport, and advances pipeline
- Wire it into start_agent's spawned task (replaces simple status setting)
- Remove report_completion from MCP tools list and handler (mcp.rs)
- Update default_agent_prompt() to not reference report_completion
- Update all agent prompts in project.toml (supervisor, coders, qa,
mergemaster) to reflect server-owned completion
- Add guard: skip gates if completion was already recorded (legacy path)
- Add 4 new tests for server-owned completion behavior
- Update tools_list test (26 tools, report_completion excluded)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On agent completion, the server automatically runs script/test and
advances stories through the pipeline: coder → qa → mergemaster →
archive. Failed gates restart the agent with failure context. Agents
no longer need to call pipeline-advancing MCP tools.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents agent code edits in worktrees from being auto-committed
to master. Only work item file moves in .story_kit/work/ trigger
watcher commits.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Convert serde_yaml, toml, async-stream, bytes, and tempfile from
inline versions to workspace dependencies. Alphabetize both
workspace and server dependency lists.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add notify-based filesystem watcher for .story_kit/work/ that
auto-commits changes with deterministic messages and broadcasts
events over WebSocket. Push full pipeline state (Upcoming, Current,
QA, To Merge) to frontend on connect and after every watcher event.
Strip dead UI: remove ReviewPanel, GatePanel, TodoPanel,
UpcomingPanel and all associated REST polling. Replace with 4
generic StagePanel components driven by WebSocket. Simplify
AgentPanel to roster-only.
Delete all 11 workflow HTTP endpoints and 16 request/response types
from the server. Clean dead code from workflow module. MCP tools
call Rust functions directly and need none of the HTTP layer.
Net: ~4,100 lines deleted, ~400 added.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add `qa` agent entry to `.story_kit/project.toml` with a detailed
prompt covering code quality scan, test verification, manual testing
support, and structured report generation
- Add `move_story_to_qa` function in `agents.rs` that moves a work item
from `work/2_current/` to `work/3_qa/` and auto-commits (idempotent)
- Add `request_qa` MCP tool in `mcp.rs` that moves the story to
`work/3_qa/` and starts the QA agent on the existing worktree
- Add unit tests for `move_story_to_qa` (moves, idempotent, error cases)
- Update `tools_list_returns_all_tools` test to expect 27 tools
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Makefile with build-macos and build-linux targets
- build-macos: cargo build --release (native macOS binary)
- build-linux: cross build --release --target x86_64-unknown-linux-musl
(produces a fully static binary via Docker/cross; zero dynamic deps)
- Document cross-platform build process in README.md including
how to verify macOS dynamic deps (otool -L) and Linux static
linking (file + ldd)
- reqwest 0.13 already uses rustls by default (no OpenSSL); verified
in Cargo.lock – no Cargo.toml changes needed
- Add unit tests to http/assets.rs covering:
- SPA fallback routing for non-asset paths
- 404 for missing assets/ paths
- Panic-free behaviour on empty path
- rust-embed EmbeddedAssets iter compiles and runs correctly
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move current/ to .story_kit/current/ (out of stories/)
- Type-aware routing for bugs, spikes, stories
- close_bug_to_archive() for bug lifecycle
- All path references updated across agents.rs, workflow.rs, mcp.rs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- accept_story MCP tool moves current/ to archived/
- move_story_to_archived helper with idempotent behavior
- start_agent auto-moves upcoming/ to current/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- report_completion MCP tool for agents to signal done
- Rejects if worktree has uncommitted changes
- Runs acceptance gates (clippy, tests) automatically
- Stores completion status on agent record
- 10 new tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate Claude Code provider into the chat UI alongside regular
Ollama/Anthropic providers. Updates AgentPanel and Chat components.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add REST and MCP endpoints for creating, listing, and removing worktrees.
Includes worktree lifecycle management and cleanup operations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Server detects .story_kit/ in cwd or parent directories at startup and
automatically opens the project. MCP tools work immediately without
manual project-open step. Falls back to cwd when no .story_kit/ found.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Agent worktrees now get a .mcp.json written with the correct port from
the running server. AgentPool receives the port at construction and
passes it through to create_worktree, which writes .mcp.json on both
new creation and reuse.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bug 2: Expand triangle now works when no agents are started - shows
"No agents started" message. AgentPanel moved to top of panels.
Bug 3: Run `git worktree prune` before `git worktree add` to clean
stale references from externally-deleted worktree directories.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add wait_for_agent MCP tool that blocks until an agent reaches a terminal
state (completed, failed, stopped). Returns final status with session_id,
worktree_path, and git commits made by the agent.
- Subscribe-before-check pattern avoids race conditions
- Handles lagged receivers, channel closure, and configurable timeout
- Default timeout 5 minutes, includes git log of agent commits in response
- 11 new tests covering all paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add base_branch detection to WorktreeInfo (from project root HEAD)
- Expose base_branch in AgentInfo API response
- Add {{base_branch}} template variable to agent config rendering
- Show git difftool command with copy-to-clipboard in AgentPanel UI
- Add diff command instruction to coder agent prompts
- Add AgentPanel tests for diff command rendering and clipboard
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix CLAUDECODE env var blocking nested Claude Code sessions
- Add drain-based event_log for reliable get_agent_output polling
- Add non-SSE get_agent_output fallback (critical for MCP tool calls)
- Preserve worktrees on agent stop instead of destroying work
- Reap zombie processes with child.wait() after kill
- Increase broadcast buffer from 256 to 1024
- Engineer supervisor and coder prompts in project.toml
- Point .mcp.json to test port 3002
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use --resume <session_id> with claude -p so the web UI claude-code-pty
provider maintains full conversation context across messages, identical
to a long-running terminal Claude Code session.
Changes:
- Capture session_id from claude -p stream-json system event
- Pass --resume on subsequent messages in same chat session
- Thread session_id through ProviderConfig, ChatResult, WsResponse
- Frontend stores sessionId per chat, clears on New Session
- Unset CLAUDECODE env to allow nested spawning from server
- Wait for clean process exit to ensure transcript flush to disk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace single [agent] config with multi-agent [[agent]] roster system.
Each agent has name, role, model, allowed_tools, max_turns, max_budget_usd,
and system_prompt fields that map to Claude CLI flags at spawn time.
- AgentConfig expanded with structured fields, validated at startup (panics
on duplicate names, empty names, non-positive budgets/turns)
- Backwards-compatible: legacy [agent] format auto-wraps with deprecation warning
- AgentPool uses composite "story_id:agent_name" keys for concurrent agents
- agent_name added to AgentEvent variants, AgentInfo, start/stop/subscribe APIs
- GET /agents/config returns roster, POST /agents/config/reload hot-reloads
- POST /agents/start accepts optional agent_name, /agents/stop requires it
- SSE route updated to /agents/:story_id/:agent_name/stream
- Frontend: roster badges, agent selector dropdown, composite-key state
- Project root initialized to cwd at startup so config endpoints work immediately
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add POST /workflow/stories/create endpoint that auto-assigns story
numbers, generates correct front matter, and writes to upcoming/.
Add slugify_name and next_story_number helpers with full test coverage.
Add frontend createStory API method and types.
Update README to recommend creation API for agents.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>