Commit Graph
100 Commits
Author SHA1 Message Date
Dave ca36de5d65 story-kit: queue 84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees for merge 2026-02-23 16:31:04 +00:00
Dave 530d5c4094 story-kit: queue 84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees for QA 2026-02-23 16:30:19 +00:00
Dave 30797a4279 story-kit: accept 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating 2026-02-23 16:29:24 +00:00
Dave 17635fb48b story-kit: queue 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating for merge 2026-02-23 16:29:09 +00:00
Dave c6026b9e22 story-kit: queue 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating for QA 2026-02-23 16:28:22 +00:00
Dave 61a3454585 story-kit: start 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating 2026-02-23 16:27:17 +00:00
Dave c1618d0f37 story-kit: create 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating 2026-02-23 16:27:01 +00:00
DaveandClaude Opus 4.6 0a404a7b88 Update sonnet agents to sonnet-4.6
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:22:33 +00:00
DaveandClaude Opus 4.6 d278c194fd fix: remove stray conflict marker in AgentPanel.test.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:19:38 +00:00
Dave 53ffd2af2d story-kit: start 84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees 2026-02-23 16:18:01 +00:00
Dave 3340d516ce story-kit: create 84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees 2026-02-23 16:17:49 +00:00
Dave 72f4ec9ab7 story-kit: remove 83_story_remove_active_work_list_from_agents_panel 2026-02-23 16:09:59 +00:00
DaveandClaude Opus 4.6 71ed6f429a Merge story 80: remove model/apikey and rate limit notifications from chat UI
Resolves conflict in claude_code.rs — keeps story 62's permission_request
handler alongside story 80's suppression of system/rate_limit events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:09:43 +00:00
DaveandClaude Opus 4.6 87c2e60dd4 Merge story 62: allow frontend UI to accept permission requests
Surfaces permission prompts in the web UI chat so the interactive
agent can request file writes, commits, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:07:38 +00:00
Dave d3bd26a4de story-kit: start 62_story_allow_frontend_ui_to_accept_permissions_requests 2026-02-23 16:07:24 +00:00
DaveandClaude Opus 4.6 72741f7ea2 Merge story 83: remove active work list from agents panel
Resolves conflict in AgentPanel.test.tsx (duplicate RosterBadge tests
from story 81 merge).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:07:19 +00:00
DaveandClaude Opus 4.6 202789f80a Merge story 82: shift+enter inserts newline instead of sending in chat input
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:06:24 +00:00
DaveandClaude Opus 4.6 8c2b6ee02c Merge story 81: agent roster badges show availability state
Green dot and styling for idle agents, blue pulsing dot for active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:06:16 +00:00
Dave 016ad7f359 story-kit: accept 83_story_remove_active_work_list_from_agents_panel 2026-02-23 16:04:18 +00:00
Dave 12c912e247 story-kit: remove 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui 2026-02-23 16:04:08 +00:00
Dave 29eff51182 story-kit: start 83_story_remove_active_work_list_from_agents_panel 2026-02-23 16:04:02 +00:00
Dave c42be5d12c story-kit: queue 83_story_remove_active_work_list_from_agents_panel for merge 2026-02-23 16:03:50 +00:00
Dave 0e8451c412 story-kit: accept 62_story_allow_frontend_ui_to_accept_permissions_requests 2026-02-23 16:01:43 +00:00
Dave 214ddcd7af story-kit: merge 62_story_allow_frontend_ui_to_accept_permissions_requests 2026-02-23 16:01:25 +00:00
DaveandClaude Sonnet 4.6 6962e92f0c fix: resolve merge conflict in claude_code.rs
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>
2026-02-23 16:01:22 +00:00
DaveandClaude Sonnet 4.6 1a73b88d85 story-83: remove active work list from Agents panel
Remove the "agents-at-work" list section from AgentPanel. The roster
badges with flying lozenge animations already convey which agents are
active, making the redundant list unnecessary.

- Remove StatusBadge, DiffCommand, EditorCommand components
- Remove expandedKey, logEndRefs, fade-timer state and effects
- Remove handleStop (no more Stop buttons)
- Keep agents state + SSE subscriptions (roster badges still need it)
- Delete diff-command and fade-out tests (feature removed)
- Add test asserting no agent-entry divs are rendered

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 16:00:14 +00:00
Dave 026ba3cbcf story-kit: queue 62_story_allow_frontend_ui_to_accept_permissions_requests for merge 2026-02-23 15:59:32 +00:00
Dave cbc1c8819c story-kit: accept 82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input 2026-02-23 15:59:21 +00:00
Dave 76e5c40134 story-kit: merge 82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input 2026-02-23 15:59:01 +00:00
Dave 0a5fcd8db9 story-kit: queue 82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input for merge 2026-02-23 15:58:44 +00:00
Dave a2409c2ace story-kit: queue 82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input for QA 2026-02-23 15:57:21 +00:00
DaveandClaude Sonnet 4.6 17e9599334 feat: Shift+Enter inserts newline in chat input (story 82)
Change chat input from <input> to <textarea> so multi-line messages
are supported. Enter (without Shift) still sends; Shift+Enter inserts
a newline via the native textarea behavior.

- Replace <input> with <textarea rows={1}> in Chat.tsx
- Update onKeyDown: guard sendMessage() with !e.shiftKey check
  and call e.preventDefault() to suppress the default newline on Enter
- Update inputRef type from HTMLInputElement to HTMLTextAreaElement
- Add style props: resize:none, overflowY:auto, fontFamily:inherit
- Add 3 new Vitest tests covering all 3 acceptance criteria (AC1-AC3)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:56:44 +00:00
Dave 3c5dbf7050 story-kit: queue 62_story_allow_frontend_ui_to_accept_permissions_requests for QA 2026-02-23 15:56:35 +00:00
DaveandClaude Sonnet 4.6 e0bc4bdc90 feat(story-62): add permission request prompts to web UI
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>
2026-02-23 15:56:01 +00:00
Dave d19a548b96 story-kit: start 83_story_remove_active_work_list_from_agents_panel 2026-02-23 15:53:48 +00:00
Dave f380a41fce story-kit: create 83_story_remove_active_work_list_from_agents_panel 2026-02-23 15:53:29 +00:00
Dave 4294b48af0 story-kit: remove 66_spike_pipeline_stage_state_machine 2026-02-23 15:52:02 +00:00
Dave 980b7f880a story-kit: start 82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input 2026-02-23 15:50:26 +00:00
Dave 3a0004d212 story-kit: create 82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input 2026-02-23 15:50:01 +00:00
Dave 8a4914e6b2 story-kit: accept 81_story_agent_roster_badges_show_availability_state 2026-02-23 15:47:41 +00:00
Dave 285b63ec66 story-kit: merge 81_story_agent_roster_badges_show_availability_state 2026-02-23 15:47:28 +00:00
Dave fe064c1b99 story-kit: queue 81_story_agent_roster_badges_show_availability_state for merge 2026-02-23 15:47:14 +00:00
Dave b62ccc9573 story-kit: queue 81_story_agent_roster_badges_show_availability_state for QA 2026-02-23 15:44:03 +00:00
DaveandClaude Sonnet 4.6 0ef5e99d1b feat(story-81): agent roster badges show availability state with green idle styling
- Add data-testid="roster-dot-{name}" to both active and idle dot spans for testability
- Change idle badge from grey (#888, #555, #333) to green (#3fb950, #3fb95015, #3fb95040)
- Update idle label from "idle" to "available" to reinforce positive availability signal
- Update tooltip from "— idle" to "— available" for consistency
- Active/running agents retain blue (#58a6ff) pulsing dot styling unchanged
- Add 4 new Vitest tests covering green idle dot, green badge styling, blue active dot, and blue active badge

Closes story 81: Agent roster badges show availability state

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:43:25 +00:00
Dave 2386484c49 story-kit: start 81_story_agent_roster_badges_show_availability_state 2026-02-23 15:40:11 +00:00
Dave 2cc5907501 story-kit: start 81_story_agent_roster_badges_show_availability_state 2026-02-23 15:37:40 +00:00
Dave db60ed0d65 story-kit: create 81_story_agent_roster_badges_show_availability_state 2026-02-23 15:37:30 +00:00
Dave be3db53524 story-kit: accept 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui 2026-02-23 15:36:25 +00:00
Dave 8133ef2847 story-kit: queue 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui for merge 2026-02-23 15:36:09 +00:00
Dave 42a47a2645 story-kit: queue 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui for merge 2026-02-23 15:36:01 +00:00
Dave 6afad0d10b story-kit: start 62_story_allow_frontend_ui_to_accept_permissions_requests 2026-02-23 15:34:56 +00:00
Dave 5e33a0c0b3 story-kit: create 62_story_allow_frontend_ui_to_accept_permissions_requests 2026-02-23 15:34:34 +00:00
Dave 377b8144a9 story-kit: accept 79_story_agents_panel_skips_archived_work_on_startup 2026-02-23 15:31:55 +00:00
Dave c76f0b100c story-kit: merge 79_story_agents_panel_skips_archived_work_on_startup 2026-02-23 15:31:38 +00:00
Dave e118c6240f story-kit: queue 79_story_agents_panel_skips_archived_work_on_startup for merge 2026-02-23 15:31:25 +00:00
DaveandClaude Sonnet 4.6 722a63949c story-80: approve test plan
Updates test_plan status to approved in the story file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:31:23 +00:00
Dave 42d520fc80 story-kit: remove 58_story_live_agent_panel_updates 2026-02-23 15:30:37 +00:00
Dave 2f09ce2584 story-kit: queue 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui for QA 2026-02-23 15:29:59 +00:00
DaveandClaude Sonnet 4.6 2833cbcda9 story-80: remove model/apiKey and rate limit notifications from chat UI
Suppresses the noisy system-init notification '[model | apiKey: source]'
and rate limit notifications that were being streamed into the chat UI
from the claude_code provider. Normal chat functionality is unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:29:41 +00:00
Dave 1d011d9041 story-kit: queue 79_story_agents_panel_skips_archived_work_on_startup for QA 2026-02-23 15:27:51 +00:00
Dave de0f06dd4d story-kit: start 79_story_agents_panel_skips_archived_work_on_startup 2026-02-23 15:27:14 +00:00
Dave e8153eabfa story-kit: start 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui 2026-02-23 15:26:34 +00:00
Dave 90936173ce story-kit: create 80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui 2026-02-23 15:26:20 +00:00
Dave 7e8d0573ce story-kit: remove 76_story_story_with_colon_testing_the_fix 2026-02-23 15:20:13 +00:00
Dave 4e418f806c story-kit: start 79_story_agents_panel_skips_archived_work_on_startup 2026-02-23 15:19:29 +00:00
Dave 44e641966d story-kit: remove 70_story_server_owned_agent_completion_remove_report_completion_dependency 2026-02-23 15:18:39 +00:00
DaveandClaude Opus 4.6 eaa3453395 Add coder-opus agent to project.toml
Adds an opus-tier coder agent for complex tasks requiring deep
architectural understanding (80 max turns, $20 budget).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:18:29 +00:00
Dave 2c1ccebbf1 story-kit: create 79_story_agents_panel_skips_archived_work_on_startup 2026-02-23 15:17:06 +00:00
Dave e141ab2c59 story-kit: accept 74_story_agent_lozenges_float_across_ui_during_assignment 2026-02-23 15:15:56 +00:00
DaveandClaude Opus 4.6 66534480f7 Merge story 74: agent lozenges float across UI during assignment
Resolves conflict in AgentPanel.test.tsx between story 73 (fade-out)
and story 74 (lozenge fly animation) - kept both the assertion and
the comment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:15:50 +00:00
Dave a18d78e7ac story-kit: remove 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name 2026-02-23 15:14:08 +00:00
Dave 31e66d7b46 story-kit: start 70_story_server_owned_agent_completion_remove_report_completion_dependency 2026-02-23 15:14:01 +00:00
Dave a02b78fccc story-kit: queue 74_story_agent_lozenges_float_across_ui_during_assignment for merge 2026-02-23 15:12:19 +00:00
Dave 83bffed78c story-kit: queue 74_story_agent_lozenges_float_across_ui_during_assignment for QA 2026-02-23 15:09:26 +00:00
DaveandClaude Sonnet 4.6 3b3104ba2c fix: use act instead of waitFor in fake-timer test for agent fade-out
waitFor's internal polling setInterval is itself faked when vi.useFakeTimers()
is active, causing it to hang indefinitely. Replace the affected assertions
with act + multiple Promise.resolve() to flush React state updates, and a
direct assertion after act+vi.advanceTimersByTime instead of a second waitFor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:09:11 +00:00
DaveandClaude Sonnet 4.6 8b912d1e9d style: biome format AgentPanel.test.tsx imports
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:04:23 +00:00
DaveandClaude Sonnet 4.6 ef728331cf feat: FLIP-style lozenge fly animation when agents are assigned to stories
Implements Story 74: agent lozenges now animate as fixed-position overlays
that fly from the roster badge in AgentPanel to the story slot in StagePanel
(and back when the agent is removed), satisfying all acceptance criteria.

Key changes:
- LozengeFlyContext.tsx (new): coordinates FLIP animations via React context.
  LozengeFlyProvider tracks pipeline changes, hides slot lozenges during
  fly-in (useLayoutEffect before paint), then creates a portal-rendered
  fixed-position clone that transitions from roster → slot (or reverse).
  z-index 9999 ensures the clone travels above all other UI elements.
- AgentPanel.tsx: RosterBadge registers its DOM element with the context
  so fly animations know the correct start/end coordinates.
- StagePanel.tsx: AgentLozenge registers its DOMRect on every render via
  useLayoutEffect (for fly-out) and reads pendingFlyIns to stay hidden
  while a fly-in clone is in flight. Added align-self: flex-start so the
  lozenge maintains its intrinsic width and never stretches in the panel.
- Chat.tsx: right-column panels wrapped in LozengeFlyProvider.
- LozengeFlyContext.test.tsx (new): 10 tests covering fixed width,
  fly-in/fly-out clone creation, portal placement, opacity lifecycle,
  and idle vs active visual distinction.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:04:10 +00:00
Dave 1c787a29da story-kit: queue 70_story_server_owned_agent_completion_remove_report_completion_dependency for merge 2026-02-23 15:03:41 +00:00
Dave 771d1bd39e story-kit: queue 70_story_server_owned_agent_completion_remove_report_completion_dependency for QA 2026-02-23 15:00:48 +00:00
DaveandClaude Opus 4.6 8bdbe8193c chore: sync pipeline story/bug files in worktree
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:00:33 +00:00
DaveandClaude Opus 4.6 9bd266eb3f Server-owned agent completion: remove report_completion dependency
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>
2026-02-23 15:00:10 +00:00
Dave 641fd5420a story-kit: accept 77_bug_create_bug_file_writes_no_yaml_front_matter 2026-02-23 14:56:22 +00:00
Dave 6e9b5da458 story-kit: merge 77_bug_create_bug_file_writes_no_yaml_front_matter 2026-02-23 14:56:08 +00:00
Dave 532031102d story-kit: queue 77_bug_create_bug_file_writes_no_yaml_front_matter for merge 2026-02-23 14:55:57 +00:00
Dave f0849ba647 story-kit: start 74_story_agent_lozenges_float_across_ui_during_assignment 2026-02-23 14:55:22 +00:00
Dave 953cc909f1 story-kit: queue 77_bug_create_bug_file_writes_no_yaml_front_matter for QA 2026-02-23 14:53:02 +00:00
Dave 1f5a384cbb story-kit: create 78_story_create_spike_mcp_tool 2026-02-23 14:49:40 +00:00
Dave 7fd9388b69 story-kit: remove 75_story_test_story_with_colon 2026-02-23 14:47:41 +00:00
Dave f51c2e0268 story-kit: start 77_bug_create_bug_file_writes_no_yaml_front_matter 2026-02-23 14:47:10 +00:00
Dave 1f0120d2d4 story-kit: accept 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name 2026-02-23 14:46:55 +00:00
Dave 31be646cc7 story-kit: create 77_bug_create_bug_file_writes_no_yaml_front_matter 2026-02-23 14:46:50 +00:00
Dave ef1591dbd7 story-kit: create 77_bug_create_bug_file_writes_no_yaml_front_matter 2026-02-23 14:46:39 +00:00
Dave e2dc56fc96 story-kit: create 76_story_story_with_colon_testing_the_fix 2026-02-23 14:46:16 +00:00
Dave 3109282b3b story-kit: start 74_story_agent_lozenges_float_across_ui_during_assignment 2026-02-23 14:45:23 +00:00
Dave d5efbc0a53 story-kit: queue 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name for QA 2026-02-23 14:44:46 +00:00
Dave ebbaed50ac story-kit: start 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name 2026-02-23 14:42:38 +00:00
Dave 2ab9d1e57b story-kit: start 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name 2026-02-23 14:42:20 +00:00
Dave 5142584691 story-kit: start 70_story_server_owned_agent_completion_remove_report_completion_dependency 2026-02-23 14:39:11 +00:00
Dave d6fd446ca5 story-kit: remove 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name 2026-02-23 14:34:42 +00:00
Dave 37fef66fa1 story-kit: start 72_bug_story_creation_does_not_quote_yaml_special_characters_in_name 2026-02-23 14:34:01 +00:00