Compare commits

...

1048 Commits

Author SHA1 Message Date
Timmy eb2b9f435a Bump version to 0.9.0 2026-04-03 17:07:30 +01:00
Timmy cd02fc1bd4 Ignoring old storkit files 2026-04-03 17:06:58 +01:00
Timmy 359cbc3c91 Ignoring timers 2026-04-03 17:05:35 +01:00
Timmy 00fa7bf50a Done rename merge 2026-04-03 17:04:02 +01:00
Timmy ba8de6847e Renamed storkit to huskies in mcp 2026-04-03 17:03:44 +01:00
Timmy 98e9f06564 Moving stories along 2026-04-03 17:03:31 +01:00
Timmy 2f5a7a271f Added some convenience scripts for Docker 2026-04-03 17:03:07 +01:00
Timmy 2d8ccb3eb6 huskies: rename project from storkit to huskies
Rename all references from storkit to huskies across the codebase:
- .storkit/ directory → .huskies/
- Binary name, Cargo package name, Docker image references
- Server code, frontend code, config files, scripts
- Fix script/test to build frontend before cargo clippy/test
  so merge worktrees have frontend/dist available for RustEmbed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:12:52 +01:00
dave a7035b6ba7 storkit: create 467_story_mcp_tool_to_return_current_time_in_project_timezone 2026-04-03 14:29:05 +00:00
dave 8ead452b73 storkit: accept 461_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 13:53:45 +00:00
dave 4036acbe59 storkit: accept 460_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 13:51:44 +00:00
dave c5dc938bdf storkit: create 455_story_rename_project_from_storkit_to_huskies 2026-04-03 13:31:12 +00:00
dave a091bec6d4 storkit: done 466_story_configurable_timezone_in_project_toml_for_timer_scheduling 2026-04-03 13:16:20 +00:00
dave e9954d244b storkit: merge 466_story_configurable_timezone_in_project_toml_for_timer_scheduling 2026-04-03 13:16:16 +00:00
dave e1cea8f958 storkit: create 466_story_configurable_timezone_in_project_toml_for_timer_scheduling 2026-04-03 13:01:46 +00:00
dave adee92c5e9 storkit: create 466_story_configurable_timezone_in_project_toml_for_timer_scheduling 2026-04-03 13:01:05 +00:00
dave daeac81e84 storkit: done 463_story_configurable_rate_limit_notification_suppression 2026-04-03 12:59:57 +00:00
dave 8059df8330 storkit: merge 463_story_configurable_rate_limit_notification_suppression 2026-04-03 12:59:54 +00:00
dave f199bf3979 storkit: delete 466_bug_timer_uses_container_utc_timezone_instead_of_host_local_timezone 2026-04-03 12:59:22 +00:00
dave d32bef5020 storkit: create 466_bug_timer_uses_container_utc_timezone_instead_of_host_local_timezone 2026-04-03 12:59:05 +00:00
dave 9f523b448d storkit: done 465_bug_timer_tick_loop_never_fires_due_entries 2026-04-03 12:48:34 +00:00
dave fade022b55 storkit: merge 465_bug_timer_tick_loop_never_fires_due_entries 2026-04-03 12:48:30 +00:00
dave 289092d88f storkit: create 465_bug_timer_tick_loop_never_fires_due_entries 2026-04-03 12:37:33 +00:00
dave 45f97167fd storkit: create 465_bug_timer_tick_loop_never_fires_due_entries 2026-04-03 12:31:55 +00:00
dave dae6486ada storkit: done 464_bug_timer_rejects_backlog_stories_should_move_to_current_on_fire 2026-04-03 12:08:43 +00:00
dave 1bf32c6537 storkit: merge 464_bug_timer_rejects_backlog_stories_should_move_to_current_on_fire 2026-04-03 12:08:39 +00:00
dave 199c8eb448 storkit: done 462_bug_stage_transition_notifications_can_arrive_out_of_order_and_show_wrong_story_name 2026-04-03 12:05:01 +00:00
dave 641384e794 storkit: merge 462_bug_stage_transition_notifications_can_arrive_out_of_order_and_show_wrong_story_name 2026-04-03 12:04:58 +00:00
dave 48a193484e storkit: done 461_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 12:01:46 +00:00
dave 9b05f94c4c storkit: create 464_bug_timer_rejects_backlog_stories_should_move_to_current_on_fire 2026-04-03 11:53:50 +00:00
dave 759c00556e fix: timer supports backlog stories — moves to current before starting
The timer tick loop now calls move_story_to_current() before
start_agent(), so stories scheduled from the backlog are moved into the
pipeline automatically when the timer fires. The timer bot command also
accepts backlog stories (previously required current).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 11:50:30 +00:00
dave 4808279873 storkit: create 463_story_configurable_rate_limit_notification_suppression 2026-04-03 11:38:07 +00:00
dave c7d6d568d3 storkit: create 462_bug_stage_transition_notifications_can_arrive_out_of_order_and_show_wrong_story_name 2026-04-03 11:31:29 +00:00
Timmy 0995c55a82 Bump version to 0.8.8 2026-04-03 11:07:39 +01:00
dave 41197c667a storkit: done 460_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 10:00:54 +00:00
dave 7da73aa435 storkit: merge 460_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 10:00:50 +00:00
dave 3d83cc61b6 storkit: create 461_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 09:53:38 +00:00
dave 334d52bd2b storkit: create 460_bug_strip_bot_mention_fails_on_element_markdown_mention_pill_format 2026-04-03 09:51:18 +00:00
dave 8ff1de73d4 storkit: accept 458_story_matrix_bot_ignores_messages_addressed_to_other_bots_in_ambient_mode 2026-04-02 21:06:38 +00:00
dave d37fdf8e10 fix: strip emoji between bot mention and command text
strip_mention_separator now skips all non-ASCII-alphanumeric chars
(emoji, colons, spaces) and returns a slice starting at the first
command character. Fixes mention pills with emoji display names
(e.g. "timmy ️ status") not matching bot commands.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 18:06:52 +00:00
dave 7ff88641c0 storkit: done 459_bug_matrix_history_json_and_timers_json_missing_from_scaffold_storkit_gitignore 2026-04-02 17:18:31 +00:00
dave b8ac5622d6 storkit: merge 459_bug_matrix_history_json_and_timers_json_missing_from_scaffold_storkit_gitignore 2026-04-02 17:18:28 +00:00
dave 4df3f8594c storkit: accept 457_bug_store_json_created_at_project_root_instead_of_inside_storkit 2026-04-02 17:15:50 +00:00
dave 56e71293d6 chore: remove debug log from verification handler 2026-04-02 17:10:09 +00:00
dave 2df214cad1 storkit: create 459_bug_matrix_history_json_and_timers_json_missing_from_scaffold_storkit_gitignore 2026-04-02 17:02:54 +00:00
dave f43b84a7ef storkit: done 458_story_matrix_bot_ignores_messages_addressed_to_other_bots_in_ambient_mode 2026-04-02 15:51:25 +00:00
dave ce4a0cb7f9 storkit: merge 458_story_matrix_bot_ignores_messages_addressed_to_other_bots_in_ambient_mode 2026-04-02 15:51:22 +00:00
dave 52e9fe2a87 storkit: accept 456_bug_matrix_bot_ignores_in_room_verification_requests_from_element 2026-04-02 15:41:28 +00:00
dave a22d67c36c storkit: create 458_story_matrix_bot_ignores_messages_addressed_to_other_bots_in_ambient_mode 2026-04-02 15:37:30 +00:00
dave 0cb98c2a3e storkit: accept 454_story_deduplicate_work_item_display_in_web_ui_story_panel 2026-04-02 15:17:41 +00:00
dave e6439238d2 storkit: done 457_bug_store_json_created_at_project_root_instead_of_inside_storkit 2026-04-02 13:27:49 +00:00
dave 967a306ea8 storkit: merge 457_bug_store_json_created_at_project_root_instead_of_inside_storkit 2026-04-02 13:27:46 +00:00
dave 46d09d4d45 storkit: create 457_bug_store_json_created_at_project_root_instead_of_inside_storkit 2026-04-02 13:15:04 +00:00
Timmy 13e3bd00f1 Bump version to 0.8.7 2026-04-02 14:09:25 +01:00
dave cd6d98b99f debug: log all room messages in verification handler to diagnose in-room verification 2026-04-02 13:08:02 +00:00
Timmy 358f177584 Bump version to 0.8.6 2026-04-02 13:39:49 +01:00
dave b60bb57aa4 storkit: done 456_bug_matrix_bot_ignores_in_room_verification_requests_from_element 2026-04-02 11:54:01 +00:00
dave 7003fca873 storkit: merge 456_bug_matrix_bot_ignores_in_room_verification_requests_from_element 2026-04-02 11:53:58 +00:00
dave b5d825356e storkit: create 456_bug_matrix_bot_ignores_in_room_verification_requests_from_element 2026-04-02 11:40:40 +00:00
dave 896eb4fc52 storkit: done 454_story_deduplicate_work_item_display_in_web_ui_story_panel 2026-04-02 11:00:55 +00:00
dave f8d7438eec storkit: merge 454_story_deduplicate_work_item_display_in_web_ui_story_panel 2026-04-02 11:00:52 +00:00
dave f7f4e8f95b storkit: create 455_story_rename_project_from_storkit_to_huskies 2026-04-02 10:58:03 +00:00
dave af76910f36 storkit: create 454_story_deduplicate_work_item_display_in_web_ui_story_panel 2026-04-02 10:43:24 +00:00
dave f06111f045 storkit: done 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-04-02 10:31:08 +00:00
dave c6020b7f43 storkit: merge 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-04-02 10:31:05 +00:00
dave 488b798275 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-04-02 10:17:28 +00:00
dave 0df19967ca storkit: accept 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-04-02 10:17:22 +00:00
dave 6e04015676 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-04-02 10:17:22 +00:00
dave acaf9477a1 storkit: done 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-04-02 10:15:55 +00:00
dave 46a89d481a storkit: accept 451_bug_chat_test_tsx_help_test_expects_removed_overlay_behavior 2026-04-02 10:11:49 +00:00
dave c51428414e storkit: done 451_bug_chat_test_tsx_help_test_expects_removed_overlay_behavior 2026-04-02 10:11:49 +00:00
Timmy 50405800c6 Bump version to 0.8.5 2026-04-02 11:08:18 +01:00
dave 4aca056bc9 storkit: accept 450_bug_web_ui_silently_swallows_chat_errors_including_oauth_login_link 2026-03-31 18:53:14 +00:00
dave 5e725340b4 storkit: accept 449_bug_oauth_callback_url_ignores_port_cli_flag 2026-03-31 18:52:13 +00:00
dave 3fa2064e3e storkit: done 450_bug_web_ui_silently_swallows_chat_errors_including_oauth_login_link 2026-03-31 14:59:41 +00:00
dave 16f9722851 storkit: merge 450_bug_web_ui_silently_swallows_chat_errors_including_oauth_login_link 2026-03-31 14:59:38 +00:00
dave 5f0680c6c1 storkit: done 449_bug_oauth_callback_url_ignores_port_cli_flag 2026-03-31 14:55:49 +00:00
dave 57e0197d75 storkit: merge 449_bug_oauth_callback_url_ignores_port_cli_flag 2026-03-31 14:55:46 +00:00
dave dc4bac3a85 fix: update /help test to expect botCommand dispatch, fix PTY fd leak in claude_code.rs (#451, #452)
The /help test expected the help overlay to appear, but /help now goes
through botCommand like other slash commands. Updated the test to match.

Also added reader thread join and child.wait() calls to
claude_code.rs to prevent PTY master fd leaks from web UI chat sessions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:48:47 +00:00
dave f16545ec36 fix: join PTY reader thread before returning to prevent stale fd leak (#453)
The reader thread spawned in run_agent_pty_blocking was never joined,
leaving a cloned PTY master fd open after the agent exited. When the
pipeline restarted the agent on the same worktree, the stale fd from
the previous session interfered with the new PTY allocation, causing
Claude Code's bundled ripgrep to crash with:
  fatal runtime error: assertion failed: output.write(&bytes).is_ok()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:41:00 +00:00
dave d132ed8e64 storkit: accept 448_story_send_oauth_login_link_via_chat_when_credentials_are_missing 2026-03-31 14:22:34 +00:00
dave 2a633d604a storkit: create 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-03-31 14:16:32 +00:00
dave 6a44c0b8ee storkit: accept 447_bug_element_tab_completion_display_name_breaks_bot_command_matching 2026-03-31 14:14:51 +00:00
dave 3f97e34f21 storkit: create 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-03-31 14:13:22 +00:00
dave 49a8a23d75 storkit: accept 446_story_oauth_login_button_in_web_ui 2026-03-31 14:08:30 +00:00
dave 1358a32476 storkit: create 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-03-31 14:04:40 +00:00
Dave 9b79160c95 storkit: create 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-03-31 12:25:40 +00:00
Timmy 0cbe99677f Using init: true in docker 2026-03-31 12:36:22 +01:00
dave 46b1609528 storkit: create 453_bug_agent_pty_crashes_with_fatal_runtime_error_on_restart_after_gate_failure 2026-03-31 11:31:05 +00:00
dave 2b0b08ceda storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:30:44 +00:00
dave 19cc684433 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:30:28 +00:00
dave fecb157291 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:25:59 +00:00
dave ac84e7240e storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:21:51 +00:00
dave d5d82bdb00 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:21:45 +00:00
dave f10edd6718 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:17:47 +00:00
dave 3f6cd55833 storkit: create 452_bug_claude_code_pty_crashes_with_fatal_runtime_error_on_agent_restart 2026-03-31 11:13:05 +00:00
dave a9e8bc4d87 storkit: create 451_bug_chat_test_tsx_help_test_expects_removed_overlay_behavior 2026-03-31 11:12:55 +00:00
dave 063e0fa76e storkit: create 450_bug_web_ui_silently_swallows_chat_errors_including_oauth_login_link 2026-03-31 10:55:02 +00:00
dave 9e7bd33822 storkit: create 449_bug_oauth_callback_url_ignores_port_cli_flag 2026-03-31 10:49:23 +00:00
Timmy 7427865e46 Adding more slash commands 2026-03-31 11:33:41 +01:00
Timmy ff5f9c76fd Bump version to 0.8.4 2026-03-31 11:32:10 +01:00
dave 641bbfbe2e storkit: done 448_story_send_oauth_login_link_via_chat_when_credentials_are_missing 2026-03-31 10:28:06 +00:00
dave 5516ec4595 storkit: merge 448_story_send_oauth_login_link_via_chat_when_credentials_are_missing 2026-03-31 10:28:02 +00:00
Timmy 762467efd4 Allowing stat in claude permissions 2026-03-31 11:22:15 +01:00
Timmy 3f54bda360 Updating sha2 2026-03-31 11:21:50 +01:00
dave 4d1e388a48 storkit: done 447_bug_element_tab_completion_display_name_breaks_bot_command_matching 2026-03-31 10:18:24 +00:00
dave 10be86587a storkit: merge 447_bug_element_tab_completion_display_name_breaks_bot_command_matching 2026-03-31 10:18:21 +00:00
dave 6a10591413 storkit: done 446_story_oauth_login_button_in_web_ui 2026-03-31 10:08:43 +00:00
dave 321c88e05e storkit: merge 446_story_oauth_login_button_in_web_ui 2026-03-31 10:08:40 +00:00
dave 23562dfa61 storkit: create 448_story_send_oauth_login_link_via_chat_when_credentials_are_missing 2026-03-31 10:04:26 +00:00
dave cb6ebf1d69 storkit: create 447_bug_element_tab_completion_display_name_breaks_bot_command_matching 2026-03-31 09:58:58 +00:00
Timmy a006985faf Bump version to 0.8.3 2026-03-30 18:17:09 +01:00
dave 3fce9ec082 feat: add Linux arm64 build to release script
Builds aarch64-unknown-linux-musl via cross alongside the existing
x86_64 Linux and macOS arm64 targets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 17:15:16 +00:00
dave 03026c70cc storkit: create 446_story_oauth_login_button_in_web_ui 2026-03-30 16:27:30 +00:00
Timmy b75679175b Bump version to 0.8.2 2026-03-30 11:57:05 +01:00
dave 440081016d storkit: accept 433_story_setup_wizard_interviews_user_on_bare_projects_with_no_existing_code 2026-03-29 04:29:58 +00:00
dave e8f3629c76 storkit: accept 438_story_slash_command_autocomplete_in_web_ui_text_input 2026-03-29 02:08:37 +00:00
dave c5cdc0f594 storkit: done 433_story_setup_wizard_interviews_user_on_bare_projects_with_no_existing_code 2026-03-29 00:46:08 +00:00
dave fec417cb16 storkit: merge 433_story_setup_wizard_interviews_user_on_bare_projects_with_no_existing_code 2026-03-29 00:46:05 +00:00
dave a70a06a5fb storkit: create 433_story_setup_wizard_interviews_user_on_bare_projects_with_no_existing_code 2026-03-29 00:29:17 +00:00
dave 0a617e1c18 storkit: accept 445_bug_rate_limited_mergemaster_exits_advance_stories_to_done_without_merging 2026-03-29 00:05:27 +00:00
dave 4527f71857 storkit: accept 444_refactor_extract_shared_test_helpers_test_ctx_write_story_file_make_api 2026-03-28 23:46:26 +00:00
dave 6e0d12d145 storkit: accept 440_refactor_consolidate_is_permission_approval_into_chat_util 2026-03-28 23:44:25 +00:00
dave d471d29c72 storkit: accept 434_story_wizard_auto_checks_completion_on_first_conversation 2026-03-28 23:34:10 +00:00
dave 0b652eec21 storkit: done 434_story_wizard_auto_checks_completion_on_first_conversation 2026-03-28 23:33:07 +00:00
dave b32fdf7d65 storkit: merge 434_story_wizard_auto_checks_completion_on_first_conversation 2026-03-28 23:33:05 +00:00
dave 2da0e1eb55 storkit: accept 442_refactor_deduplicate_stage_display_name_into_shared_module 2026-03-28 22:58:18 +00:00
dave 269124a1fd storkit: accept 443_refactor_extract_shared_find_story_name_from_commands 2026-03-28 22:40:14 +00:00
dave 5992f9bd19 storkit: merge 438_story_slash_command_autocomplete_in_web_ui_text_input 2026-03-28 22:27:40 +00:00
dave a53967453e storkit: done 438_story_slash_command_autocomplete_in_web_ui_text_input 2026-03-28 22:26:16 +00:00
dave ab4b218ac7 storkit: accept 441_refactor_deduplicate_get_project_root_wrappers_in_io_modules 2026-03-28 20:35:05 +00:00
dave d5b936c88d storkit: accept 439_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 20:28:04 +00:00
dave 07cc0e3f29 storkit: accept 437_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_input 2026-03-28 20:22:04 +00:00
dave db4a84c70f storkit: done 445_bug_rate_limited_mergemaster_exits_advance_stories_to_done_without_merging 2026-03-28 20:08:18 +00:00
dave 3048d26e66 storkit: merge 445_bug_rate_limited_mergemaster_exits_advance_stories_to_done_without_merging 2026-03-28 20:08:15 +00:00
dave 8e45b2a08d storkit: done 444_refactor_extract_shared_test_helpers_test_ctx_write_story_file_make_api 2026-03-28 19:51:20 +00:00
dave ddc4a57cd2 storkit: merge 444_refactor_extract_shared_test_helpers_test_ctx_write_story_file_make_api 2026-03-28 19:51:17 +00:00
dave d216f3c267 storkit: done 440_refactor_consolidate_is_permission_approval_into_chat_util 2026-03-28 19:47:36 +00:00
dave 8cd881c8f1 storkit: merge 440_refactor_consolidate_is_permission_approval_into_chat_util 2026-03-28 19:47:33 +00:00
dave 2867e1d15f storkit: accept 431_story_qa_agent_reviews_code_changes_against_acceptance_criteria 2026-03-28 19:30:48 +00:00
dave c2c9d3f9cb storkit: create 445_bug_rate_limited_mergemaster_exits_advance_stories_to_done_without_merging 2026-03-28 19:19:17 +00:00
dave f734b4a3c6 storkit: done 443_refactor_extract_shared_find_story_name_from_commands 2026-03-28 19:09:13 +00:00
dave 890693efda storkit: done 442_refactor_deduplicate_stage_display_name_into_shared_module 2026-03-28 18:57:31 +00:00
dave 5403b29261 storkit: done 439_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 18:36:45 +00:00
dave 8ee59f5dc1 storkit: merge 439_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 18:36:42 +00:00
dave 5dcc35a1b3 fix: gate runner delegates to script/test instead of hardcoding cargo clippy
The acceptance gate was hardcoded to run cargo clippy, which fails on
non-Rust projects (Go, Node, etc.). Now the gate only runs script/test
which is project-specific. Clippy is added to storkit's own script/test
so Rust linting is preserved for this project.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 18:15:29 +00:00
dave af70b68cd1 storkit: accept 432_story_complete_setup_wizard_with_mcp_tools_and_agent_driven_file_generation 2026-03-28 18:12:43 +00:00
dave e356f9b2dd storkit: accept 423_story_auto_schedule_timer_on_rate_limit_to_resume_after_reset 2026-03-28 17:42:42 +00:00
dave 96793de11b storkit: merge 441_refactor_deduplicate_get_project_root_wrappers_in_io_modules 2026-03-28 16:48:49 +00:00
dave bfe70f5599 storkit: done 439_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 16:48:42 +00:00
dave 98aedaddf0 storkit: done 442_refactor_deduplicate_stage_display_name_into_shared_module 2026-03-28 16:47:58 +00:00
dave 496ce864d7 storkit: done 441_refactor_deduplicate_get_project_root_wrappers_in_io_modules 2026-03-28 16:46:18 +00:00
dave 243738551c fix: wizard README instructions explicitly require LLM to generate and write files
The LLM was having the conversation with the user but never following
through with wizard_generate calls. The instructions now spell out
the full workflow: get hint, write content, stage it, show user, confirm.
Also adds "keep moving" instruction so the LLM auto-advances to the
next step after confirmation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 16:37:25 +00:00
dave 20f2d97f06 storkit: create 444_refactor_extract_shared_test_helpers_test_ctx_write_story_file_make_api 2026-03-28 16:34:45 +00:00
dave b6edc1bff7 storkit: create 443_refactor_extract_shared_find_story_name_from_commands 2026-03-28 16:34:41 +00:00
dave c45613a3ad storkit: create 442_refactor_deduplicate_stage_display_name_into_shared_module 2026-03-28 16:34:39 +00:00
dave 7efed33851 storkit: create 441_refactor_deduplicate_get_project_root_wrappers_in_io_modules 2026-03-28 16:34:36 +00:00
dave b00a477070 storkit: create 440_refactor_consolidate_is_permission_approval_into_chat_util 2026-03-28 16:34:35 +00:00
dave 52f2e89659 storkit: done 437_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_input 2026-03-28 16:33:29 +00:00
dave 08db28d9d6 storkit: merge 437_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_input 2026-03-28 16:33:26 +00:00
dave 77ff0ce093 storkit: create 439_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 16:27:51 +00:00
dave 0ab1b1232b storkit: create 439_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 16:27:36 +00:00
dave 209e01bc06 storkit: create 438_story_slash_command_autocomplete_in_web_ui_text_input 2026-03-28 16:24:44 +00:00
dave 2650b1a42e storkit: create 437_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_input 2026-03-28 16:21:19 +00:00
Timmy 3595df4d9d Bump version to 0.8.1 2026-03-28 15:37:08 +00:00
dave 5d84100c41 storkit: create 436_refactor_unify_story_stuck_states_into_a_single_status_field 2026-03-28 15:35:14 +00:00
dave dd436ad186 storkit: create 435_story_unblock_command_handles_all_stuck_states_not_just_blocked_flag 2026-03-28 15:33:39 +00:00
dave b811b9188f storkit: done 431_story_qa_agent_reviews_code_changes_against_acceptance_criteria 2026-03-28 15:33:19 +00:00
dave 9935311c35 storkit: merge 431_story_qa_agent_reviews_code_changes_against_acceptance_criteria 2026-03-28 15:33:16 +00:00
dave be0036922a fix: unblock command also clears merge_failure field
Previously unblock only checked for blocked=true. Stories stuck in
merge with a merge_failure field were not considered "blocked" and
unblock refused to act. Now it clears both blocked and merge_failure,
and reports which fields were cleared.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:33:01 +00:00
dave 361f9dff0d fix(426): also narrow pre-cherry-pick code change check to .storkit/work/
There were two places checking for code changes: the post-cherry-pick
verification (already fixed) and a pre-cherry-pick check in the
merge-queue worktree. The pre-cherry-pick check was still filtering
all of .storkit/ which rejected stories that only change project.toml.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:27:19 +00:00
dave fc160b5c5f feat: wizard detects bare projects and prompts user interview for context/stack
wizard_generate now checks if the project has no source code. On bare
projects, the generation hints tell the LLM to ask the user what they
want to build and what tech stack they plan to use, rather than trying
to read a nonexistent codebase.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:17:42 +00:00
dave 9092b8a2c9 fix: wizard hints address the LLM not the user, README adds bare project guidance
The format_wizard_state hints now tell the LLM what to do ("show it
to the user and ask if they're happy") rather than exposing tool names
to the user ("Run wizard_generate").

README wizard instructions now distinguish between existing-code projects
(read codebase, generate files) and bare projects (interview the user
about what they want to build).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:15:14 +00:00
dave dfe3d96313 docs: move wizard instructions to .storkit/README.md for LLM-agnostic access
The wizard check was only in CLAUDE.md which is Claude-specific.
Move the primary instruction to .storkit/README.md (step 1 of First
Steps) so any LLM reading the dev process docs will discover the wizard.
CLAUDE.md keeps a shorter pointer to the README.

Also fix stale .story_kit/ paths to .storkit/ in the README.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:12:54 +00:00
dave bcefa6a25d storkit: create 434_story_wizard_auto_checks_completion_on_first_conversation 2026-03-28 15:06:53 +00:00
dave 50bfeddcb5 fix: scaffold CLAUDE.md uses active wizard instruction
Change from passive "call wizard_status to check progress" to active
"On your first conversation, call wizard_status" with IMPORTANT prefix.
Without the direct instruction, Claude ignores the wizard tools.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:06:21 +00:00
dave 8e6b8ef338 storkit: create 433_story_setup_wizard_interviews_user_on_bare_projects_with_no_existing_code 2026-03-28 15:00:04 +00:00
dave d363eb63e2 fix: scaffold CLAUDE.md now mentions wizard and MCP tools
Without this, Claude Code in a freshly scaffolded project has no idea
storkit's wizard or MCP tools exist and gives generic setup advice.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:37:44 +00:00
dave 422cec370d docs: rewrite quickstart as a step-by-step with wizard flow
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:34:45 +00:00
dave 973b7d6f72 storkit: done 432_story_complete_setup_wizard_with_mcp_tools_and_agent_driven_file_generation 2026-03-28 14:24:02 +00:00
dave 49b78f3642 storkit: merge 432_story_complete_setup_wizard_with_mcp_tools_and_agent_driven_file_generation 2026-03-28 14:23:59 +00:00
dave 93576e3f83 fix(426): narrow merge verification exclude to .storkit/work/ only
The post-cherry-pick diff check was excluding all of .storkit/, which
rejected stories whose deliverable is .storkit/project.toml changes
(e.g. 431 updating QA agent prompts). Narrow the exclusion to
.storkit/work/ which is where pipeline file moves live.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:21:57 +00:00
dave dd7f71dd87 docs: add Claude Code quickstart, web UI, and chat transport sections to README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:03:23 +00:00
dave 9a8492c72f storkit: create 432_story_complete_setup_wizard_with_mcp_tools_and_agent_driven_file_generation 2026-03-28 14:00:20 +00:00
dave ac9bdde164 storkit: create 431_story_qa_agent_reviews_code_changes_against_acceptance_criteria 2026-03-28 13:58:38 +00:00
dave 0b2ec64c74 storkit: done 430_bug_status_command_traffic_light_dots_not_coloured_in_matrix 2026-03-28 13:57:41 +00:00
dave fe0a032e8e storkit: merge 430_bug_status_command_traffic_light_dots_not_coloured_in_matrix 2026-03-28 13:57:38 +00:00
dave eff8f6a6a6 feat(399): add --port CLI flag with project.toml persistence
Manual merge of story 399 feature branch, adapted for the current CLI
parser (which includes the init subcommand from 429).

- storkit --port 3000 sets the listening port
- storkit --port=3000 also works
- Port resolution: CLI flag > STORKIT_PORT env > default 3001
- Supports combining with init: storkit init --port 3000 /path
- Replaces CliDirective enum with CliArgs struct that handles both
  --port and init in a single pass

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:47:02 +00:00
Timmy e45eab82f2 Bump version to 0.8.0 2026-03-28 13:32:07 +00:00
dave 310ad365e6 storkit: done 429_story_interactive_project_setup_wizard_for_new_storkit_projects 2026-03-28 13:29:08 +00:00
dave 0b50c66caa storkit: merge 429_story_interactive_project_setup_wizard_for_new_storkit_projects 2026-03-28 13:29:05 +00:00
dave 9feed0f882 storkit: create 430_bug_status_command_traffic_light_dots_not_coloured_in_matrix 2026-03-28 13:27:45 +00:00
dave bb3301c5af fix: release script handles already-bumped version gracefully
Skip the version bump commit if nothing changed, so re-running
script/release for the same version doesn't fail on empty commit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:18:11 +00:00
dave a2123274a5 fix: release script exits silently when grep finds no matches
The changelog grep commands return exit code 1 when no commits match,
which set -euo pipefail treats as fatal. Add || true guards so the
script continues to the tag/push/release steps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:11:35 +00:00
dave 3cbbc5387a storkit: create 429_story_interactive_project_setup_wizard_for_new_storkit_projects 2026-03-28 13:06:19 +00:00
dave 4e828fbdd1 storkit: create 429_story_interactive_project_setup_wizard_for_new_storkit_projects 2026-03-28 13:03:11 +00:00
Timmy 6d88595e0d Adding GPL for the moment. 2026-03-28 13:02:12 +00:00
Timmy aa90646edf Bump version to 0.7.1 2026-03-28 12:51:39 +00:00
dave 7235ab7c7c storkit: done 427_story_server_side_text_normalization_for_chat_message_line_breaks 2026-03-28 12:44:52 +00:00
dave a0326dae78 storkit: done 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 12:37:43 +00:00
dave 953fce2ca6 fix(426): verify cherry-pick landed on master before marking story done
After the cherry-pick step in run_squash_merge, verify:
1. project_root is on the base branch (not a merge-queue branch)
2. HEAD commit has actual code changes (not an empty/story-only diff)

If either check fails, return success=false so the story stays in merge
stage for retry instead of being phantom-advanced to done.

Also rename move_story_to_archived → move_story_to_done.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 12:37:03 +00:00
dave 5035b84de5 storkit: create 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 12:29:48 +00:00
Timmy c2f477dde6 Bump version to 0.7.0 2026-03-28 12:20:00 +00:00
dave b098c8ff9f storkit: merge 428_refactor_split_pool_pipeline_rs_into_submodules 2026-03-28 11:50:15 +00:00
dave 7fea543f60 storkit: done 428_refactor_split_pool_pipeline_rs_into_submodules 2026-03-28 11:50:02 +00:00
dave f8bb23a6d4 fix(424): correct WatcherEvent::HardBlock to RateLimitHardBlock in pool/mod.rs
Story 424's merge used the wrong variant name HardBlock instead of
RateLimitHardBlock, breaking master compilation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 11:47:26 +00:00
dave 0016841770 storkit: create 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 11:35:03 +00:00
dave 3639d64da6 fix(424): add throttled field to all StoryAgent ctors and handle HardBlock in ws.rs
The initial commit added the `throttled` field to `StoryAgent` but missed
several construction sites in lifecycle.rs, test_helpers.rs, and scan.rs.
Also adds the `HardBlock` match arm in the WebSocket event conversion and
minor CSS/import ordering fixes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 11:33:43 +00:00
dave ebdcf18134 feat(424): rate-limit traffic-light dots and hard-block alerts
- Add HardBlock variant to WatcherEvent (story_id, agent_name, reset_time)
- In pty.rs, distinguish allowed_warning (throttle) from hard blocks;
  emit RateLimitWarning for throttles, HardBlock for actual 429s
- Add `throttled: bool` field to StoryAgent / AgentInfo
- Pool spawns a background listener that sets throttled=true on
  RateLimitWarning or HardBlock events and fires AgentStateChanged
- Status command shows traffic-light dots: ○ idle, ● running, ◑ throttled, ✗ blocked
- Read blocked flag from story front matter for the ✗ dot
- Notifications: RateLimitWarning silenced (too noisy); HardBlock sends
  urgent chat notification with optional reset time
- Tests added for traffic_light_dot, read_story_blocked, status output,
  and all notification paths
2026-03-28 11:33:01 +00:00
dave d83f2ae4c1 storkit: done 424_story_rate_limit_traffic_light_status_and_hard_block_alerts 2026-03-28 11:27:19 +00:00
dave f6c0d35f11 storkit: create 427_story_server_side_text_normalization_for_chat_message_line_breaks 2026-03-28 11:21:11 +00:00
dave facbf51f05 storkit: create 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 11:18:36 +00:00
dave 847ebc292f storkit: create 424_story_rate_limit_traffic_light_status_and_hard_block_alerts 2026-03-28 11:11:32 +00:00
Timmy 065ca2bd8f Bump version to 0.6.1 2026-03-28 11:07:06 +00:00
dave 34988855bc storkit: create 428_refactor_split_pool_pipeline_rs_into_submodules 2026-03-28 11:00:26 +00:00
dave 7fc788baea docs: rewrite README for 0.6.1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 10:56:36 +00:00
dave 40575924b5 chore: bump version to 0.6.1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 10:50:59 +00:00
dave 4f56fa6cbe storkit: done 427_story_server_side_text_normalization_for_chat_message_line_breaks 2026-03-28 10:41:46 +00:00
dave 52513b55ff storkit: merge 427_story_server_side_text_normalization_for_chat_message_line_breaks 2026-03-28 10:41:43 +00:00
dave 1ae2fa9b9b storkit: create 427_story_server_side_text_normalization_for_chat_message_line_breaks 2026-03-28 10:28:23 +00:00
dave 6077f74dbd storkit: accept 09_story_remove_scroll_bars 2026-03-28 10:12:53 +00:00
dave 8ab2e19e98 fix(423): handle RateLimitHardBlock in ws.rs match
The new WatcherEvent::RateLimitHardBlock variant added in the feature
commit was not covered in the ws.rs From<WatcherEvent> match, causing
a compile error. Add the missing arm returning None (same as
RateLimitWarning — handled by chat notifications only, not WebSocket).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 10:11:44 +00:00
dave b44f3a33e3 feat(423): auto-schedule timer on rate limit to resume after reset
- pty.rs: detect rate_limit_event hard blocks, parse reset_at, emit
  WatcherEvent::RateLimitHardBlock with story_id, agent_name, reset_at
- watcher.rs: add RateLimitHardBlock variant to WatcherEvent enum
- timer.rs: add TimerStore::upsert (add-or-update-to-later) and
  spawn_rate_limit_auto_scheduler (listens for RateLimitHardBlock,
  upserts timer for the blocked story)
- notifications.rs: handle RateLimitHardBlock events with a debounced
  chat notification including the scheduled resume time;
  add format_rate_limit_hard_block_notification helper
- matrix/mod.rs: subscribe second watcher_rx for auto-scheduler,
  pass it to run_bot
- matrix/bot/run.rs: wire spawn_rate_limit_auto_scheduler into bot startup

Tests cover: AC1 (hard block detection in pty), AC2 (auto-scheduler
adds timer), AC3 (upsert deduplication), AC5 (chat notification sent),
AC6 (worktree preserved — timer fires start_agent on existing worktree)
2026-03-28 10:11:08 +00:00
dave 57407aed51 storkit: create 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 10:09:41 +00:00
dave a29677b3c7 storkit: create 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 10:06:17 +00:00
dave 95df450fca storkit: create 426_bug_mergemaster_pipeline_marks_story_done_without_verifying_code_landed_on_master 2026-03-28 10:05:58 +00:00
dave 6c6bc35785 feat: add unblock command and MCP tool to reset blocked stories
- Add `unblock` bot command (chat + web UI slash command) that clears the
  `blocked` flag and resets `retry_count` to 0 in story front matter
- Works across all pipeline stages (1_backlog through 6_archived)
- Returns confirmation with story name and ID, or clear error if story
  is not found or not blocked
- Expose `unblock_story` MCP tool for programmatic use by agents
- Make `chat::commands::unblock` module pub(crate) so story_tools can
  call `unblock_by_number`
- Add 8 unit tests covering registration, validation, core logic, and
  edge cases (not-found, not-blocked, any stage, story ID in response)
- Update MCP tools list test: 49 → 50 tools
2026-03-28 10:05:51 +00:00
dave 7652bbba9c storkit: done 423_story_auto_schedule_timer_on_rate_limit_to_resume_after_reset 2026-03-28 09:50:07 +00:00
dave efd89a26ac config: increase max_retries from 2 to 3
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 09:41:25 +00:00
dave 71d4746009 storkit: done 425_story_chat_notification_when_a_story_blocks_with_reason 2026-03-28 09:38:50 +00:00
dave 98b5475160 storkit: merge 425_story_chat_notification_when_a_story_blocks_with_reason 2026-03-28 09:38:47 +00:00
dave 740f1b5e6e storkit: create 425_story_chat_notification_when_a_story_blocks_with_reason 2026-03-28 09:25:19 +00:00
dave c0bab1e671 storkit: create 425_story_chat_notification_when_a_story_blocks_with_reason 2026-03-28 09:23:45 +00:00
dave 306810e4d5 storkit: done 419_bug_matrix_bot_crashes_on_transient_network_error_instead_of_retrying 2026-03-28 09:11:29 +00:00
dave 1193b7ac9a storkit: merge 419_bug_matrix_bot_crashes_on_transient_network_error_instead_of_retrying 2026-03-28 09:11:26 +00:00
dave 05db012aaf storkit: done 422_story_unblock_command_to_reset_blocked_stories 2026-03-28 09:08:02 +00:00
dave bc3c852509 storkit: create 424_story_rate_limit_traffic_light_status_and_hard_block_alerts 2026-03-28 09:07:16 +00:00
dave 04051282da storkit: create 424_story_rate_limit_traffic_light_status_and_hard_block_alerts 2026-03-28 09:06:26 +00:00
dave 081b33a8a6 storkit: done 421_story_timer_command_for_deferred_agent_start 2026-03-28 09:02:23 +00:00
dave cf5424f9a6 storkit: merge 421_story_timer_command_for_deferred_agent_start 2026-03-28 09:02:20 +00:00
dave 1ec9aaab8a storkit: done 420_story_loc_for_a_specified_file_bot_command_and_web_ui_slash_command 2026-03-28 08:59:03 +00:00
dave d6f82393f5 storkit: merge 420_story_loc_for_a_specified_file_bot_command_and_web_ui_slash_command 2026-03-28 08:58:57 +00:00
dave f4ce0e017b storkit: create 423_story_auto_schedule_timer_on_rate_limit_to_resume_after_reset 2026-03-28 08:49:23 +00:00
dave c0ea5f0cb8 storkit: done 418_refactor_split_pool_auto_assign_rs_into_submodules 2026-03-28 08:48:05 +00:00
dave d375c4b1d3 storkit: merge 418_refactor_split_pool_auto_assign_rs_into_submodules 2026-03-28 08:48:02 +00:00
dave 4ea4be1462 storkit: create 422_story_unblock_command_to_reset_blocked_stories 2026-03-28 08:44:31 +00:00
dave bc1c1cd2c9 storkit: create 421_story_timer_command_for_deferred_agent_start 2026-03-28 08:35:41 +00:00
dave c1e4c40f31 storkit: create 421_story_timer_command_for_deferred_agent_start 2026-03-28 08:35:02 +00:00
dave 203e8f22be storkit: done 417_refactor_split_matrix_bot_rs_into_focused_modules 2026-03-28 08:30:04 +00:00
dave 665c036a56 storkit: merge 417_refactor_split_matrix_bot_rs_into_focused_modules 2026-03-28 08:30:01 +00:00
dave 73304f08ac storkit: create 420_story_loc_for_a_specified_file_bot_command_and_web_ui_slash_command 2026-03-28 08:17:32 +00:00
dave fe9fc69f96 storkit: create 420_story_loc_for_a_specified_file_bot_command_and_web_ui_slash_command 2026-03-28 08:17:05 +00:00
dave 3b0542cd41 storkit: create 419_bug_matrix_bot_crashes_on_transient_network_error_instead_of_retrying 2026-03-28 08:10:38 +00:00
dave 102919e0b3 storkit: accept 415_refactor_split_agents_pool_mod_rs_into_submodules 2026-03-27 19:53:40 +00:00
dave d63aa0a3c2 storkit: accept 416_refactor_split_io_fs_rs_into_submodules 2026-03-27 19:49:39 +00:00
dave 7f7db57933 storkit: accept 414_story_loc_command_filters_out_known_huge_files 2026-03-27 19:14:37 +00:00
dave 043791194f storkit: accept 413_refactor_split_slack_rs_into_focused_modules 2026-03-27 18:59:36 +00:00
dave 710f839c65 storkit: accept 409_refactor_split_whatsapp_rs_into_focused_modules 2026-03-27 18:38:35 +00:00
dave b0e21abb6e storkit: accept 410_story_loc_bot_command_top_files_by_line_count 2026-03-27 18:32:34 +00:00
dave 6b71c07f5b storkit: create 418_refactor_split_pool_auto_assign_rs_into_submodules 2026-03-27 16:53:50 +00:00
dave 9cff3c753d storkit: create 417_refactor_split_matrix_bot_rs_into_focused_modules 2026-03-27 16:52:05 +00:00
dave 6acd7f5249 storkit: done 416_refactor_split_io_fs_rs_into_submodules 2026-03-27 16:08:12 +00:00
dave 26f5b25f22 storkit: merge 416_refactor_split_io_fs_rs_into_submodules 2026-03-27 16:08:10 +00:00
dave 8bc0bd592e storkit: done 415_refactor_split_agents_pool_mod_rs_into_submodules 2026-03-27 15:56:03 +00:00
dave 7c25aca39b storkit: merge 415_refactor_split_agents_pool_mod_rs_into_submodules 2026-03-27 15:56:00 +00:00
dave 5173bf4aef storkit: create 416_refactor_split_io_fs_rs_into_submodules 2026-03-27 15:48:47 +00:00
dave 7f7f49d757 storkit: done 414_story_loc_command_filters_out_known_huge_files 2026-03-27 15:37:54 +00:00
dave e88b9bbc63 storkit: merge 414_story_loc_command_filters_out_known_huge_files 2026-03-27 15:37:51 +00:00
dave db22ab2229 storkit: create 415_refactor_split_agents_pool_mod_rs_into_submodules 2026-03-27 15:30:33 +00:00
dave c30ad79398 storkit: done 413_refactor_split_slack_rs_into_focused_modules 2026-03-27 15:29:26 +00:00
dave 16853328fa storkit: merge 413_refactor_split_slack_rs_into_focused_modules 2026-03-27 15:29:23 +00:00
dave 8ac8cdba88 storkit: create 414_story_loc_command_filters_out_known_huge_files 2026-03-27 15:14:08 +00:00
dave c046edebda storkit: accept 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-27 15:09:57 +00:00
dave eef9669c95 storkit: done 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-27 15:09:53 +00:00
dave a9cdd3a354 storkit: merge 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-27 15:09:50 +00:00
dave b4eeb499e9 storkit: create 413_refactor_split_slack_rs_into_focused_modules 2026-03-27 14:59:06 +00:00
dave fca46c3806 storkit: done 403_bug_whatsapp_and_slack_missing_rmtree_command_handler 2026-03-27 14:57:09 +00:00
dave 2510fe44bc storkit: done 409_refactor_split_whatsapp_rs_into_focused_modules 2026-03-27 14:40:18 +00:00
dave e152cf3cb8 storkit: create 412_story_recheck_bot_command_to_re_run_gates_without_restarting_agent 2026-03-27 14:37:05 +00:00
dave 7d3b256fff storkit: done 410_story_loc_bot_command_top_files_by_line_count 2026-03-27 14:36:11 +00:00
dave f6d632139e storkit: merge 410_story_loc_bot_command_top_files_by_line_count 2026-03-27 14:36:07 +00:00
dave 204a99c2e7 storkit: create 412_story_recheck_bot_command_to_re_run_gates_without_restarting_agent 2026-03-27 14:35:06 +00:00
Timmy f28a03e42e Added git variables to entry point 2026-03-27 14:26:49 +00:00
Timmy 26f4edadcc Ditching story kit port file 2026-03-27 14:11:55 +00:00
Timmy fd58631e65 Removed misleading comment on docker compose file 2026-03-27 14:11:35 +00:00
dave f70399a28f storkit: accept 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-27 13:41:29 +00:00
Timmy 02d08faaa2 Fixing build/test errors in master/ 2026-03-27 12:31:08 +00:00
dave 2dc77479ad storkit: done 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-27 11:20:32 +00:00
dave c5761ae968 storkit: create 410_story_loc_bot_command_top_files_by_line_count 2026-03-27 11:05:00 +00:00
dave 67754781ca storkit: create 409_refactor_split_whatsapp_rs_into_focused_modules 2026-03-27 10:58:13 +00:00
dave 3436507a21 storkit: create 410_story_loc_bot_command_top_files_by_line_count 2026-03-27 10:57:47 +00:00
dave 93bc08574b storkit: create 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-27 10:57:41 +00:00
Timmy 3571511349 restore: reset past source tree deletion, apply pending work 2026-03-27 10:49:39 +00:00
dave 04214ca155 storkit: create 408_spike_fly_io_machines_api_integration_for_multi_tenant_storkit_saas 2026-03-26 21:12:06 +00:00
dave 4d48df152c storkit: create 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-26 21:11:46 +00:00
dave e0a70a4c1c storkit: create 408_spike_fly_io_machines_api_integration_for_multi_tenant_storkit_saas 2026-03-26 21:11:31 +00:00
dave bae50fbc5b storkit: create 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-26 21:07:56 +00:00
dave 8998dac593 storkit: create 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-26 21:01:42 +00:00
dave e6b300e70e storkit: create 407_spike_fly_io_machines_for_multi_tenant_storkit_saas 2026-03-26 21:01:21 +00:00
dave b22e2b9274 storkit: done 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 20:51:54 +00:00
dave 24b1aa6e7f storkit: merge 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 20:51:52 +00:00
dave 85e37e03a8 storkit: done 399_story_cli_port_flag_with_project_toml_persistence 2026-03-26 20:46:59 +00:00
dave f22a2666b8 storkit: accept 396_story_whatsapp_bot_startup_announcement_after_restart 2026-03-26 20:23:33 +00:00
dave 507889627a storkit: done 396_story_whatsapp_bot_startup_announcement_after_restart 2026-03-26 20:22:29 +00:00
dave c4cee72938 storkit: merge 396_story_whatsapp_bot_startup_announcement_after_restart 2026-03-26 20:22:26 +00:00
dave 33cb363651 storkit: done 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 20:18:00 +00:00
dave cd3ded278d storkit: merge 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 20:17:57 +00:00
dave b5bf75aa5a storkit: delete 398_bug_whatsapp_and_slack_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-26 20:09:30 +00:00
dave f6b5b1b01a storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 20:07:54 +00:00
dave 26d34245f9 storkit: create 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 20:06:13 +00:00
dave de54265c35 storkit: create 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-26 20:05:40 +00:00
dave a52d1e098f storkit: create 403_bug_whatsapp_and_slack_missing_rmtree_command_handler 2026-03-26 20:05:33 +00:00
dave 015fa48c32 storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 20:05:27 +00:00
dave abc30c93d1 storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 20:04:41 +00:00
dave cf2faa9bff storkit: create 402_bug_whatsapp_and_slack_missing_rebuild_command_handler 2026-03-26 20:04:02 +00:00
dave 92aa1ebccf storkit: done 402_bug_whatsapp_and_slack_missing_rebuild_command_handler 2026-03-26 20:02:47 +00:00
Timmy 877f69c897 feat: browser-based OAuth login flow (story 406)
Add three HTTP endpoints for OAuth login without terminal access:
- GET /oauth/authorize — generates PKCE params, redirects to
  claude.com/cai/oauth/authorize with code=true and full scopes
- GET /callback — exchanges auth code for tokens via JSON POST to
  platform.claude.com/v1/oauth/token, writes ~/.claude/.credentials.json
- GET /oauth/status — returns current credential state as JSON

Uses SHA-256 (sha2 crate) for PKCE code challenge. The authorize URL
targets claude.com/cai/ (not platform.claude.com) which is required
for Max/Pro subscriptions to grant user:inference scope.

Users visit http://localhost:3001/oauth/authorize in their browser
to authenticate. Matrix/WhatsApp can send this link when auth fails.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:58:18 +00:00
Timmy 710b604b7c feat: auto-refresh expired OAuth token for Claude Code PTY (story 405)
Detect authentication_failed errors from the Claude Code PTY stream
and automatically refresh the OAuth access token using the stored
refresh token in ~/.claude/.credentials.json.

- New module server/src/llm/oauth.rs: reads credentials, calls
  platform.claude.com/v1/oauth/token with JSON body, writes back
- PTY provider detects "error":"authentication_failed" via AtomicBool
- chat_stream retries once after successful refresh
- Clear error message if refresh also fails

On success the retry is transparent. On failure the user sees:
"OAuth session expired. Please run claude login to re-authenticate."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:58:04 +00:00
Timmy ab4ce2db92 chore: archive bug 397, create story 399, fix platform-specific npm deps
- Archive completed bug 397
- Create story 399 (CLI port flag)
- Remove @biomejs/cli-darwin-arm64 and @rollup/rollup-darwin-arm64
  from package.json (breaks Docker builds on Linux)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:57:50 +00:00
Timmy 61f6fd60a8 storkit: merge 402_bug_whatsapp_and_slack_missing_rebuild_command_handler 2026-03-26 11:20:55 +00:00
Timmy e66149e07c storkit: done 397_bug_selection_screen_directory_picker_unreadable_in_dark_mode 2026-03-26 11:16:24 +00:00
Timmy 108a697483 storkit: merge 397_bug_selection_screen_directory_picker_unreadable_in_dark_mode 2026-03-26 11:16:21 +00:00
Timmy 1a7f419ecf storkit: create 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-26 11:12:18 +00:00
Timmy 96b1ce373b storkit: create 403_bug_whatsapp_and_slack_missing_rmtree_command_handler 2026-03-26 11:12:16 +00:00
Timmy 58e41f7e0b storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 11:12:13 +00:00
Timmy c9a2fa58eb storkit: create 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 11:12:11 +00:00
Timmy 64c0f190cf storkit: create 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-26 11:09:49 +00:00
Timmy fc443ed987 storkit: create 403_bug_whatsapp_and_slack_missing_rmtree_command_handler 2026-03-26 11:09:48 +00:00
Timmy 7939a19816 storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 11:09:46 +00:00
Timmy 46b5087157 storkit: create 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 11:09:45 +00:00
Timmy a8d6524b56 storkit: create 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-26 11:09:28 +00:00
Timmy 61d63db84c storkit: create 403_bug_whatsapp_and_slack_missing_rmtree_command_handler 2026-03-26 11:09:27 +00:00
Timmy aa4ec8c779 storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 11:09:25 +00:00
Timmy 3777042ad3 storkit: create 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 11:09:24 +00:00
Timmy feb340beba storkit: create 404_bug_whatsapp_and_slack_missing_assign_command_handler 2026-03-26 11:07:33 +00:00
Timmy 23369c514d storkit: create 403_bug_whatsapp_and_slack_missing_rmtree_command_handler 2026-03-26 11:07:31 +00:00
Timmy 832da16b6f storkit: create 402_bug_whatsapp_and_slack_missing_rebuild_command_handler 2026-03-26 11:07:29 +00:00
Timmy 131964cbc3 storkit: create 401_bug_whatsapp_and_slack_missing_start_command_handler 2026-03-26 11:07:27 +00:00
Timmy 81db0504ed storkit: create 400_bug_whatsapp_and_slack_missing_reset_command_handler 2026-03-26 11:07:25 +00:00
Timmy 584a44a516 storkit: create 399_story_cli_port_flag_with_project_toml_persistence 2026-03-26 11:05:12 +00:00
Timmy c7c4a57533 storkit: create 399_story_cli_port_flag_with_project_toml_persistence 2026-03-26 11:03:43 +00:00
Timmy 0a67c28f8c storkit: create 398_bug_whatsapp_and_slack_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-26 11:00:01 +00:00
Timmy 6476492caa storkit: create 397_bug_selection_screen_directory_picker_unreadable_in_dark_mode 2026-03-26 10:52:06 +00:00
dave faf8734ea8 storkit: accept 393_story_pipeline_stage_notifications_for_whatsapp_and_slack_transports 2026-03-25 19:35:57 +00:00
dave 862f0704be storkit: accept 394_story_whatsapp_and_slack_permission_prompt_forwarding 2026-03-25 19:31:56 +00:00
dave d3df1586c6 storkit: accept 395_refactor_fix_npm_deprecated_module_warnings 2026-03-25 19:27:55 +00:00
dave 8a1996e0e4 storkit: accept 390_bug_whatsapp_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-25 19:21:55 +00:00
dave 61f5a0c3be storkit: accept 392_refactor_extract_shared_transport_utilities_from_matrix_module_into_chat_submodule 2026-03-25 17:59:45 +00:00
dave d7bc785de1 storkit: accept 391_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_characters 2026-03-25 17:54:45 +00:00
dave eaac665a9f storkit: accept 389_story_whatsapp_phone_number_allowlist_authorization 2026-03-25 17:39:44 +00:00
dave d702aa59c4 storkit: accept 387_story_configurable_base_branch_name_in_project_toml 2026-03-25 17:30:43 +00:00
dave 9df9a1454a storkit: create 396_story_whatsapp_bot_startup_announcement_after_restart 2026-03-25 15:52:39 +00:00
dave 47163d235c storkit: done 390_bug_whatsapp_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-25 15:44:38 +00:00
dave a7342fc9d3 storkit: done 393_story_pipeline_stage_notifications_for_whatsapp_and_slack_transports 2026-03-25 15:37:57 +00:00
dave 5dd8feb75c storkit: merge 393_story_pipeline_stage_notifications_for_whatsapp_and_slack_transports 2026-03-25 15:37:54 +00:00
dave f5024b2648 storkit: done 394_story_whatsapp_and_slack_permission_prompt_forwarding 2026-03-25 15:34:54 +00:00
dave 6521c83eec storkit: merge 394_story_whatsapp_and_slack_permission_prompt_forwarding 2026-03-25 15:34:50 +00:00
dave 65e3643655 storkit: done 395_refactor_fix_npm_deprecated_module_warnings 2026-03-25 15:31:30 +00:00
dave fc95b57a78 storkit: merge 395_refactor_fix_npm_deprecated_module_warnings 2026-03-25 15:31:20 +00:00
dave 7c1a970b13 storkit: create 390_bug_whatsapp_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-25 15:21:39 +00:00
dave 64e2df20b7 storkit: create 390_bug_whatsapp_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-25 15:21:32 +00:00
dave 90e3612fd3 storkit: create 395_refactor_fix_npm_deprecated_module_warnings 2026-03-25 15:17:02 +00:00
dave 962bfe37c6 storkit: create 394_story_whatsapp_and_slack_permission_prompt_forwarding 2026-03-25 15:02:00 +00:00
dave f05c6a42b0 storkit: done 392_refactor_extract_shared_transport_utilities_from_matrix_module_into_chat_submodule 2026-03-25 14:46:06 +00:00
dave 077288e7b7 storkit: merge 392_refactor_extract_shared_transport_utilities_from_matrix_module_into_chat_submodule 2026-03-25 14:46:02 +00:00
dave 580ab1ce68 storkit: create 393_story_pipeline_stage_notifications_for_whatsapp_and_slack_transports 2026-03-25 14:35:32 +00:00
Timmy 71a6c72614 Adding in a holding page for a website 2026-03-25 14:27:06 +00:00
dave fae7b3be20 storkit: create 388_story_whatsapp_webhook_hmac_signature_verification 2026-03-25 14:08:00 +00:00
dave 775b9ac7e3 storkit: create 388_story_whatsapp_webhook_hmac_signature_verification 2026-03-25 14:07:37 +00:00
dave 5a87d55dd4 storkit: done 391_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_characters 2026-03-25 14:05:03 +00:00
dave 0457fbfecc storkit: merge 391_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_characters 2026-03-25 14:04:59 +00:00
dave 13b16138b5 storkit: create 392_refactor_extract_shared_transport_utilities_from_matrix_module_into_chat_submodule 2026-03-25 13:59:02 +00:00
dave 8249896449 storkit: create 392_refactor_extract_shared_transport_utilities_from_matrix_module_into_chat_submodule 2026-03-25 13:58:06 +00:00
dave dbd932bf46 storkit: create 392_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_characters 2026-03-25 13:55:49 +00:00
dave eef49678ce storkit: create 391_bug_strip_prefix_ci_panics_on_multi_byte_utf_8_characters 2026-03-25 13:54:13 +00:00
dave 58ee82c988 storkit: done 390_bug_whatsapp_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-25 13:47:24 +00:00
dave 49ac23044a storkit: done 389_story_whatsapp_phone_number_allowlist_authorization 2026-03-25 13:42:35 +00:00
dave 84a775be77 storkit: merge 389_story_whatsapp_phone_number_allowlist_authorization 2026-03-25 13:42:31 +00:00
dave 60c0c95f38 storkit: done 387_story_configurable_base_branch_name_in_project_toml 2026-03-25 13:33:45 +00:00
dave a1a30bcc42 storkit: merge 387_story_configurable_base_branch_name_in_project_toml 2026-03-25 13:33:38 +00:00
dave 96ebd7ecb8 storkit: create 390_bug_whatsapp_missing_async_command_handlers_for_start_rebuild_reset_rmtree_assign 2026-03-25 13:22:16 +00:00
dave 25c8b1ec25 storkit: accept 386_story_unreleased_command_shows_list_of_stories_since_last_release 2026-03-25 02:13:11 +00:00
dave bcb7cfabee storkit: accept 385_story_slack_markdown_to_mrkdwn_formatting_conversion 2026-03-25 02:02:10 +00:00
dave d4dad1d556 storkit: accept 384_story_whatsapp_markdown_to_whatsapp_formatting_conversion 2026-03-25 01:34:08 +00:00
dave 195c7c51c4 storkit: create 389_story_whatsapp_phone_number_allowlist_authorization 2026-03-24 22:25:59 +00:00
dave 968d973cff storkit: create 388_story_whatsapp_webhook_hmac_signature_verification 2026-03-24 22:25:55 +00:00
dave 4394ab3fed storkit: done 386_story_unreleased_command_shows_list_of_stories_since_last_release 2026-03-24 22:23:05 +00:00
dave 11bbfca3da storkit: merge 386_story_unreleased_command_shows_list_of_stories_since_last_release 2026-03-24 22:23:01 +00:00
dave a9aa88b655 storkit: create 387_story_configurable_base_branch_name_in_project_toml 2026-03-24 22:20:49 +00:00
dave b62974dd88 storkit: create 387_story_configurable_base_branch_name_in_project_toml 2026-03-24 22:17:46 +00:00
dave ac52a8bb4e storkit: done 385_story_slack_markdown_to_mrkdwn_formatting_conversion 2026-03-24 22:12:39 +00:00
dave 18755aac96 storkit: merge 385_story_slack_markdown_to_mrkdwn_formatting_conversion 2026-03-24 22:12:31 +00:00
dave 5d37421f70 storkit: create 386_story_unreleased_command_shows_list_of_stories_since_last_release 2026-03-24 22:12:16 +00:00
dave 224d269971 storkit: create 385_story_slack_markdown_to_mrkdwn_formatting_conversion 2026-03-24 22:01:58 +00:00
dave 6146a173f1 storkit: done 384_story_whatsapp_markdown_to_whatsapp_formatting_conversion 2026-03-24 21:54:19 +00:00
dave 821345d266 storkit: accept 383_refactor_reorganize_chat_system_into_chat_module_with_transport_submodules 2026-03-24 21:41:42 +00:00
dave 0fa63e2de3 storkit: accept 382_story_whatsapp_transport_supports_twilio_api_as_alternative_to_meta_cloud_api 2026-03-24 21:33:45 +00:00
dave d8cbec8268 storkit: create 384_story_whatsapp_markdown_to_whatsapp_formatting_conversion 2026-03-24 21:33:44 +00:00
Timmy 618a2779ff Bump version to 0.6.0 2026-03-24 21:27:38 +00:00
Timmy 721d12bcfe Fixing code warnings 2026-03-24 21:26:48 +00:00
Timmy df6d2db327 Upgrading toml and pulldown-cmark 2026-03-24 21:25:15 +00:00
Timmy 49285c1865 Binding promiscuously in Docker to make things happen 2026-03-24 21:24:57 +00:00
Timmy 0c15be43b8 Ignoring whatsapp history 2026-03-24 21:24:38 +00:00
Timmy 9408bd2cdf Bump version to 0.6.0 2026-03-24 21:06:15 +00:00
Timmy a24e4c5c85 Making Matrix config fields optional to meet Twilio login needs 2026-03-24 21:05:35 +00:00
Timmy c0133fe733 Ignoring backed up bot creds 2026-03-24 20:56:59 +00:00
dave 752c3904bf storkit: accept 380_story_assign_command_restarts_coder_when_story_is_already_in_progress 2026-03-24 19:02:42 +00:00
dave bac53ac09a storkit: accept 381_story_bot_command_to_delete_a_worktree 2026-03-24 18:49:41 +00:00
dave b2ef2eca5f storkit: accept 368_story_web_ui_oauth_flow_for_claude_authentication 2026-03-24 18:48:40 +00:00
dave fb05f71e76 storkit: accept 379_bug_start_agent_ignores_story_front_matter_agent_assignment 2026-03-24 18:44:36 +00:00
dave 438be196c9 feat: scaffold creates per-transport bot.toml example files
New projects now get bot.toml.matrix.example, bot.toml.whatsapp-meta.example,
bot.toml.whatsapp-twilio.example, and bot.toml.slack.example in .storkit/
during scaffolding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 18:13:32 +00:00
dave f1b4894d6e docs: split bot.toml.example into per-transport example files
Replace the monolithic bot.toml.example with separate files for each
transport: matrix, whatsapp-meta, whatsapp-twilio, and slack. Add a
chat bot configuration section to the README explaining that only one
transport can be active at a time and how to set up each one.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 18:10:37 +00:00
dave bd281fd749 storkit: done 383_refactor_reorganize_chat_system_into_chat_module_with_transport_submodules 2026-03-24 17:57:24 +00:00
dave 79edc28334 storkit: merge 383_refactor_reorganize_chat_system_into_chat_module_with_transport_submodules 2026-03-24 17:57:21 +00:00
dave 92c53704f0 storkit: create 383_refactor_reorganize_chat_system_into_chat_module_with_transport_submodules 2026-03-24 17:40:36 +00:00
dave 7223fa2f10 storkit: done 382_story_whatsapp_transport_supports_twilio_api_as_alternative_to_meta_cloud_api 2026-03-24 17:36:35 +00:00
dave dedf951b17 storkit: merge 382_story_whatsapp_transport_supports_twilio_api_as_alternative_to_meta_cloud_api 2026-03-24 17:36:32 +00:00
dave aad583defd storkit: create 382_story_whatsapp_transport_supports_twilio_api_as_alternative_to_meta_cloud_api 2026-03-24 16:41:13 +00:00
dave 88b02cf746 storkit: done 380_story_assign_command_restarts_coder_when_story_is_already_in_progress 2026-03-24 15:05:55 +00:00
dave 1a9833d820 storkit: merge 380_story_assign_command_restarts_coder_when_story_is_already_in_progress 2026-03-24 15:05:52 +00:00
dave a904cda629 storkit: done 381_story_bot_command_to_delete_a_worktree 2026-03-24 15:02:54 +00:00
dave c755c03f0e storkit: merge 381_story_bot_command_to_delete_a_worktree 2026-03-24 15:02:50 +00:00
dave a8630f3e1b storkit: done 379_bug_start_agent_ignores_story_front_matter_agent_assignment 2026-03-24 14:59:32 +00:00
dave 9fb1bd5711 storkit: merge 379_bug_start_agent_ignores_story_front_matter_agent_assignment 2026-03-24 14:59:28 +00:00
dave 0b3ce0f33e storkit: done 368_story_web_ui_oauth_flow_for_claude_authentication 2026-03-24 14:54:30 +00:00
dave f4b7573f0a storkit: create 381_story_bot_command_to_delete_a_worktree 2026-03-24 14:49:24 +00:00
dave bb801ba826 storkit: create 380_story_assign_command_restarts_coder_when_story_is_already_in_progress 2026-03-24 14:49:21 +00:00
dave 53634d638d storkit: create 379_bug_start_agent_ignores_story_front_matter_agent_assignment 2026-03-24 14:44:30 +00:00
dave b50e7cff00 storkit: create 368_story_web_ui_oauth_flow_for_claude_authentication 2026-03-24 14:40:50 +00:00
dave 68973b0bb8 storkit: create 368_story_web_ui_oauth_flow_for_claude_authentication 2026-03-24 13:36:24 +00:00
dave 34bbf5a122 storkit: accept 376_story_rename_mcp_whatsup_tool_to_status_for_consistency 2026-03-24 13:35:35 +00:00
dave ed3c5f9c95 storkit: accept 376_story_rename_mcp_whatsup_tool_to_status_for_consistency 2026-03-24 11:10:25 +00:00
dave 59d1a2c069 storkit: done 376_story_rename_mcp_whatsup_tool_to_status_for_consistency 2026-03-24 11:09:21 +00:00
dave 52e73bfbea storkit: merge 376_story_rename_mcp_whatsup_tool_to_status_for_consistency 2026-03-24 11:09:17 +00:00
Timmy 4e590401a5 Bump version to 0.5.1 2026-03-24 10:55:06 +00:00
dave 6b6815325d storkit: accept 378_story_status_command_shows_work_item_type_story_bug_spike_refactor_next_to_each_item 2026-03-23 22:33:10 +00:00
dave f874783b09 storkit: accept 377_bug_update_story_mcp_tool_writes_front_matter_values_as_yaml_strings_instead_of_native_types 2026-03-23 22:26:09 +00:00
dave 292f9cdfe2 storkit: accept 375_bug_default_project_toml_contains_rust_specific_setup_commands_for_non_rust_projects 2026-03-23 22:24:09 +00:00
dave 1cce46d3fa chore: bump version to 0.5.1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 18:49:54 +00:00
dave e85c06df19 storkit: done 377_bug_update_story_mcp_tool_writes_front_matter_values_as_yaml_strings_instead_of_native_types 2026-03-23 18:45:40 +00:00
dave 8b85ca743e storkit: merge 377_bug_update_story_mcp_tool_writes_front_matter_values_as_yaml_strings_instead_of_native_types 2026-03-23 18:45:37 +00:00
dave 1a7b6c7342 storkit: done 378_story_status_command_shows_work_item_type_story_bug_spike_refactor_next_to_each_item 2026-03-23 18:42:53 +00:00
dave 4a94158ef2 storkit: merge 378_story_status_command_shows_work_item_type_story_bug_spike_refactor_next_to_each_item 2026-03-23 18:42:49 +00:00
dave f10ea1ecf2 storkit: done 374_story_web_ui_implements_all_bot_commands_as_slash_commands 2026-03-23 18:35:56 +00:00
dave 1a3b69301a storkit: merge 374_story_web_ui_implements_all_bot_commands_as_slash_commands 2026-03-23 18:35:52 +00:00
dave 6d3eab92fd storkit: create 378_story_status_command_shows_work_item_type_story_bug_spike_refactor_next_to_each_item 2026-03-23 18:32:14 +00:00
dave f6920a87ad storkit: merge 375_bug_default_project_toml_contains_rust_specific_setup_commands_for_non_rust_projects 2026-03-23 18:32:05 +00:00
dave 5f9d903987 storkit: done 375_bug_default_project_toml_contains_rust_specific_setup_commands_for_non_rust_projects 2026-03-23 18:30:18 +00:00
dave ea916d27f4 storkit: create 377_bug_update_story_mcp_tool_writes_front_matter_values_as_yaml_strings_instead_of_native_types 2026-03-23 18:25:53 +00:00
dave 970b9bcd9d storkit: accept 373_bug_scaffold_gitignore_missing_transient_pipeline_stage_directories 2026-03-23 18:12:45 +00:00
dave a5ee6890f5 storkit: create 376_story_rename_mcp_whatsup_tool_to_status_for_consistency 2026-03-23 17:58:23 +00:00
dave 41dc3292bb storkit: accept 371_bug_no_arg_storkit_in_empty_directory_skips_scaffold 2026-03-23 17:56:56 +00:00
dave 3766f8b464 storkit: accept 370_bug_scaffold_does_not_create_mcp_json_in_project_root 2026-03-23 16:57:28 +00:00
dave 0c85ecc85c storkit: accept 369_bug_cli_treats_help_and_version_as_project_paths 2026-03-23 16:43:27 +00:00
dave 2c29a4d2b8 storkit: create 375_bug_default_project_toml_contains_rust_specific_setup_commands_for_non_rust_projects 2026-03-23 14:29:25 +00:00
dave 454d694d24 storkit: done 372_story_scaffold_auto_detects_tech_stack_and_configures_script_test 2026-03-23 14:25:58 +00:00
dave 96bedd70dc storkit: merge 372_story_scaffold_auto_detects_tech_stack_and_configures_script_test 2026-03-23 14:25:54 +00:00
dave fffdd5c5ea storkit: create 374_story_web_ui_implements_all_bot_commands_as_slash_commands 2026-03-23 14:22:11 +00:00
dave 4805598932 storkit: done 373_bug_scaffold_gitignore_missing_transient_pipeline_stage_directories 2026-03-23 14:15:36 +00:00
dave 3d55e2fcc6 Add transient pipeline stages to scaffold .gitignore
work/2_current/, work/3_qa/, work/4_merge/ are not committed to git
(only 1_backlog, 5_done, 6_archived are). New projects were missing
these entries in .storkit/.gitignore.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 14:13:15 +00:00
dave 96b31d1a48 storkit: create 372_story_scaffold_auto_detects_tech_stack_and_configures_script_test 2026-03-23 14:12:37 +00:00
dave 11168fa426 storkit: create 373_bug_scaffold_gitignore_missing_transient_pipeline_stage_directories 2026-03-23 14:12:03 +00:00
dave c2c2d65889 storkit: done 371_bug_no_arg_storkit_in_empty_directory_skips_scaffold 2026-03-23 14:08:46 +00:00
dave 5c8c4b7ff3 storkit: merge 371_bug_no_arg_storkit_in_empty_directory_skips_scaffold 2026-03-23 14:08:43 +00:00
dave fbab93f493 storkit: create 372_story_scaffold_auto_detects_tech_stack_and_configures_script_test 2026-03-23 14:08:16 +00:00
dave 78ff6d104e storkit: create 371_bug_no_arg_storkit_in_empty_directory_skips_scaffold 2026-03-23 13:56:02 +00:00
Timmy fcc2b9c3eb Bump version to 0.5.0 2026-03-23 13:11:57 +00:00
dave 0c4239501a storkit: done 370_bug_scaffold_does_not_create_mcp_json_in_project_root 2026-03-23 13:00:46 +00:00
dave 13b6ecd958 storkit: merge 370_bug_scaffold_does_not_create_mcp_json_in_project_root 2026-03-23 13:00:43 +00:00
dave 1816a94617 storkit: merge 369_bug_cli_treats_help_and_version_as_project_paths 2026-03-23 12:55:58 +00:00
dave 56d3373e69 Revert gVisor (runsc) from Docker setup
gVisor is incompatible with OrbStack bind mounts on macOS — writes to
/mnt/mac are blocked by the gVisor filesystem sandbox. Removing
runtime: runsc from docker-compose.yml, the gVisor setup docs from
README.md, and the runsc assertion test from rebuild.rs.

The existing Docker hardening (read-only root, cap_drop ALL,
no-new-privileges, resource limits) remains in place.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:53:10 +00:00
dave efdb0c5814 storkit: create 370_bug_scaffold_does_not_create_mcp_json_in_project_root 2026-03-23 12:43:48 +00:00
dave b8365275d8 storkit: create 370_bug_scaffold_does_not_create_mcp_json_in_project_root 2026-03-23 12:43:15 +00:00
dave 6ddfd29927 storkit: create 369_bug_cli_treats_help_and_version_as_project_paths 2026-03-23 12:43:04 +00:00
dave 01b157a2e4 storkit: create 369_bug_cli_treats_help_and_version_as_project_paths 2026-03-23 12:42:04 +00:00
dave 99a59d7ad1 storkit: create 369_bug_cli_treats_help_and_version_as_project_paths 2026-03-23 12:41:27 +00:00
dave eb8adb6225 storkit: create 369_bug_cli_treats_help_and_version_as_project_paths 2026-03-23 12:39:15 +00:00
dave 2262f2ca6b storkit: create 368_story_web_ui_oauth_flow_for_claude_authentication 2026-03-23 11:59:43 +00:00
dave 2bb36d0e68 storkit: accept 360_story_run_storkit_container_under_gvisor_runsc_runtime 2026-03-23 11:48:32 +00:00
dave 86102f8ad6 storkit: done 360_story_run_storkit_container_under_gvisor_runsc_runtime 2026-03-23 11:45:47 +00:00
dave edf47601c4 storkit: merge 360_story_run_storkit_container_under_gvisor_runsc_runtime 2026-03-23 11:45:43 +00:00
dave b606e1de92 storkit: accept 367_story_rename_bot_whatsup_command_to_status 2026-03-23 02:38:20 +00:00
dave 0d5f0de876 storkit: accept 365_story_surface_api_rate_limit_warnings_in_chat 2026-03-22 23:29:13 +00:00
dave bb41f3951c storkit: accept 366_story_bot_sends_shutdown_message_on_server_stop_or_rebuild 2026-03-22 23:11:51 +00:00
dave e3d7931f17 storkit: done 367_story_rename_bot_whatsup_command_to_status 2026-03-22 22:40:47 +00:00
dave 87b5648123 storkit: merge 367_story_rename_bot_whatsup_command_to_status 2026-03-22 22:40:43 +00:00
dave 506bdd4df8 storkit: accept 363_story_mcp_tool_for_whatsup_story_triage 2026-03-22 21:44:39 +00:00
dave a9bec3c29e storkit: accept 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-22 21:43:38 +00:00
dave 69936f457f storkit: done 365_story_surface_api_rate_limit_warnings_in_chat 2026-03-22 19:28:48 +00:00
dave 24dd3d9fa9 storkit: merge 365_story_surface_api_rate_limit_warnings_in_chat 2026-03-22 19:28:45 +00:00
dave bc45a91b3e Fix frontend tests failing in Docker due to wrong-platform rollup binary
The bind-mounted node_modules from macOS contains darwin-arm64 native
binaries which don't work in the Linux container. Run npm install on
container startup to get the correct platform binaries.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:28:21 +00:00
dave db7c11508e storkit: done 366_story_bot_sends_shutdown_message_on_server_stop_or_rebuild 2026-03-22 19:11:33 +00:00
dave 47173e0d3a storkit: merge 366_story_bot_sends_shutdown_message_on_server_stop_or_rebuild 2026-03-22 19:11:29 +00:00
dave f610ef6046 Restore codebase deleted by bad auto-commit e4227cf
Commit e4227cf (a story creation auto-commit) erroneously deleted 175
files from master's tree, likely due to a race condition between
concurrent git operations. This commit re-adds all files from the
working directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:07:07 +00:00
dave 89f776b978 storkit: create 367_story_rename_bot_whatsup_command_to_status 2026-03-22 19:01:22 +00:00
dave e4227cf673 storkit: create 365_story_surface_api_rate_limit_warnings_in_chat 2026-03-22 18:19:23 +00:00
dave f346712dd1 storkit: create 365_story_surface_api_rate_limit_warnings_in_chat 2026-03-22 18:19:23 +00:00
dave f9419e5ea7 Fix worktree cleanup looping on orphaned directories
When git worktree remove fails with "not a working tree", fall back to
removing the directory directly and run git worktree prune to clean
stale metadata. Fixes bug 364.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:18:08 +00:00
dave c32bab03a4 storkit: delete 364_bug_worktree_cleanup_loops_on_orphaned_directories 2026-03-22 18:17:43 +00:00
dave ea23042698 storkit: create 366_story_bot_sends_shutdown_message_on_server_stop_or_rebuild 2026-03-22 18:17:04 +00:00
dave 3825b03fda storkit: create 365_story_surface_api_rate_limit_warnings_in_chat 2026-03-22 18:12:37 +00:00
dave d6cfd18e6a storkit: create 364_bug_worktree_cleanup_loops_on_orphaned_directories 2026-03-22 18:07:37 +00:00
dave 01ac8a8345 Remove empty serve submodule reference
Blank folder, no longer needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:06:23 +00:00
dave 153f8812d7 Remove obsolete TIMMY_BRIEFING.md
One-time briefing doc from spike 329, no longer needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:06:15 +00:00
dave 01c7c39872 Update .ignore to use renamed storkit paths
.story_kit/ and .story_kit_port were stale references from before the
rename to storkit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:06:07 +00:00
dave eec8f3ac15 storkit: delete 364_bug_test_suite_incompatible_with_hardened_docker_environment 2026-03-22 17:54:48 +00:00
dave 28626ab80a storkit: done 363_story_mcp_tool_for_whatsup_story_triage 2026-03-22 17:47:08 +00:00
dave 4262af7faa storkit: merge 363_story_mcp_tool_for_whatsup_story_triage 2026-03-22 17:47:05 +00:00
dave 628b60ad15 storkit: done 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-22 17:43:01 +00:00
dave c504738949 storkit: merge 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-22 17:42:57 +00:00
Timmy 0d5b9724c1 Make ANTHROPIC_API_KEY optional in docker-compose
When unset, Claude Code falls back to OAuth credentials from
`claude login`, allowing agents to run on a Max subscription
instead of prepaid API credits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:31:09 +00:00
Timmy b189ca845c Pre-create target dirs with storkit ownership in Dockerfile
Docker named volumes inherit directory ownership when first created.
By creating /workspace/target and /app/target as storkit-owned before
the USER directive, the volumes will be writable by the storkit user.
Without this, cargo build/test/clippy all fail with Permission Denied.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 16:59:32 +00:00
Dave 8094d32cbb revert: remove Docker workarounds now that container is fixed
Reverts workarounds added by the 361 agent when the hardened Docker
container broke the test suite:

- gates.rs: restore tempfile::tempdir() (was changed to tempdir_in
  CARGO_MANIFEST_DIR to avoid noexec /tmp; noexec is now removed)
- pool/mod.rs: restore ps -p <pid> check in process_is_running (was
  changed to /proc/<pid> existence check; procps is now installed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 14:21:34 +00:00
Dave 1c2824fa31 fix: harden Docker environment so tests pass inside container
- Add procps to runtime stage so `ps` is available for process management
- Remove noexec from /tmp and /home/storkit tmpfs mounts so test scripts
  can be executed from tempdir
- Update coder agent system_prompt to run clippy --all-targets --all-features
  matching what the server acceptance gate actually runs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 14:21:27 +00:00
Dave af72f593e8 storkit: create 364_bug_test_suite_incompatible_with_hardened_docker_environment 2026-03-22 13:50:14 +00:00
Dave ac8112bf0b storkit: accept 361_story_remove_deprecated_manual_qa_front_matter_field 2026-03-22 01:48:51 +00:00
Dave 9bf4b65707 storkit: accept 359_story_harden_docker_setup_for_security 2026-03-22 00:23:40 +00:00
Dave 240ebf055a storkit: accept 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-22 00:22:39 +00:00
Dave 293a2fcfb6 storkit: done 361_story_remove_deprecated_manual_qa_front_matter_field 2026-03-21 21:51:31 +00:00
Dave 4ccc3d9149 storkit: merge 361_story_remove_deprecated_manual_qa_front_matter_field 2026-03-21 21:51:27 +00:00
Timmy eef0f3ee7d Add clippy to Docker image
Acceptance gates run cargo clippy but the component wasn't installed
in the build stage. Agents were doing real work then failing every
gate check because clippy wasn't available.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:43:09 +00:00
Dave 9dc7c21b05 storkit: create 363_story_mcp_tool_for_whatsup_story_triage 2026-03-21 21:29:42 +00:00
Dave 76369de391 storkit: create 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-21 21:26:02 +00:00
Dave b747cc0fab storkit: create 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-21 21:25:36 +00:00
Dave f74a0425a9 storkit: create 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-21 21:22:52 +00:00
Dave b0b21765d9 storkit: create 362_story_bot_whatsup_command_shows_in_progress_work_summary 2026-03-21 21:22:16 +00:00
Timmy 9075bc1a84 Fix tmpfs ownership so storkit user can write to home dir
The tmpfs at /home/storkit defaulted to root ownership (mode=755),
so Claude Code couldn't write ~/.claude.json or ~/.cache/. Set
uid=999,gid=999 to match the storkit user.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:19:16 +00:00
Timmy 9f873dc839 Fix Claude Code hanging in hardened container
Claude Code writes to ~/.claude.json, ~/.cache/, and ~/.npm/ which
failed silently on the read-only root filesystem. Add tmpfs at
/home/storkit so the home dir is writable (the claude-state volume
overlays on top for persistent .claude/ data).

Also fix .dockerignore: use **/target/ to match nested target dirs,
add .storkit/logs/ and **/node_modules/ to prevent multi-GB build
context transfers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:16:24 +00:00
Dave 3774c3dca7 storkit: done 359_story_harden_docker_setup_for_security 2026-03-21 20:57:07 +00:00
Timmy cd095f9a99 Fix rebuild_and_restart in Docker by using cargo output path
Use the known cargo build output path instead of current_exe() when
re-execing after a rebuild. In Docker, the running binary lives at
/usr/local/bin/storkit (read-only) while cargo writes the new binary
to /app/target/release/storkit (a writable volume), so current_exe()
would just restart the old binary.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 20:42:38 +00:00
Timmy fe0f560b58 Harden Docker container security
Run as non-root user (fixes Claude Code refusing bypassPermissions as
root, which caused all agent spawns to exit instantly with no session).
Add read-only root filesystem, drop all capabilities, set
no-new-privileges, bind port to localhost only, and require
GIT_USER_NAME/GIT_USER_EMAIL env vars at startup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 20:33:50 +00:00
Timmy 0416bf343c storkit: delete 57_story_live_test_gate_updates 2026-03-21 20:23:45 +00:00
Timmy c3e4f85903 storkit: done 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-21 20:22:02 +00:00
Timmy 52d9d0f9ce storkit: done 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-21 20:20:41 +00:00
Timmy 996ba82682 storkit: create 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-21 20:19:56 +00:00
Timmy 1f4152c894 storkit: create 361_story_remove_deprecated_manual_qa_front_matter_field 2026-03-21 19:59:52 +00:00
Timmy 02b481ee4c storkit: create 359_story_harden_docker_setup_for_security 2026-03-21 19:48:44 +00:00
Timmy 9c339c118f storkit: create 359_story_harden_docker_setup_for_security 2026-03-21 19:45:26 +00:00
Timmy 4790aac286 storkit: create 359_story_harden_docker_setup_for_security and 360_story_run_storkit_container_under_gvisor_runsc_runtime 2026-03-21 19:43:48 +00:00
Dave b2d92d6059 storkit: accept 90_story_fetch_real_context_window_size_from_anthropic_models_api 2026-03-21 15:58:15 +00:00
Dave 71887af2d3 storkit: accept 358_story_remove_makefile_and_make_script_release_the_single_entry_point_for_releases 2026-03-21 15:55:15 +00:00
Dave 5db9965962 storkit: done 358_story_remove_makefile_and_make_script_release_the_single_entry_point_for_releases 2026-03-21 12:04:11 +00:00
Dave e109e1ba5c storkit: merge 358_story_remove_makefile_and_make_script_release_the_single_entry_point_for_releases 2026-03-21 12:04:08 +00:00
Dave 3554594d8d storkit: done 90_story_fetch_real_context_window_size_from_anthropic_models_api 2026-03-21 12:01:24 +00:00
Dave a6c8cf0daf storkit: merge 90_story_fetch_real_context_window_size_from_anthropic_models_api 2026-03-21 12:01:21 +00:00
Dave 30a56d03e5 storkit: create 358_story_remove_makefile_and_make_script_release_the_single_entry_point_for_releases 2026-03-21 11:55:13 +00:00
Dave 4734bd943f Fixing release 2026-03-21 11:52:18 +00:00
Dave a1dd88579b storkit: accept 344_story_chatgpt_agent_backend_via_openai_api 2026-03-21 03:40:23 +00:00
Dave 759a289894 storkit: done 344_story_chatgpt_agent_backend_via_openai_api 2026-03-20 23:52:24 +00:00
Dave be3b5b0b60 storkit: merge 344_story_chatgpt_agent_backend_via_openai_api 2026-03-20 23:52:21 +00:00
Dave fbf391684a storkit: create 344_story_chatgpt_agent_backend_via_openai_api 2026-03-20 23:39:34 +00:00
Dave 65546a42b7 storkit: accept 343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends 2026-03-20 22:58:45 +00:00
Dave 4e014d45c3 storkit: accept 345_story_gemini_agent_backend_via_google_ai_api 2026-03-20 22:54:45 +00:00
Dave 4f39de437f storkit: done 345_story_gemini_agent_backend_via_google_ai_api 2026-03-20 22:53:44 +00:00
Dave 79ee6eb0dc storkit: merge 345_story_gemini_agent_backend_via_google_ai_api 2026-03-20 22:53:41 +00:00
Dave c930c537bc storkit: accept 357_story_bot_assign_command_to_pre_assign_a_model_to_a_story 2026-03-20 22:41:00 +00:00
Dave f129a38704 storkit: done 343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends 2026-03-20 22:07:52 +00:00
Dave 4344081b54 storkit: merge 343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends 2026-03-20 22:07:49 +00:00
Dave 52c5344ce5 storkit: accept 350_story_mcp_tool_for_code_definitions_lookup 2026-03-20 19:30:08 +00:00
Dave 35bd196790 storkit: accept 356_story_start_command_should_say_queued_not_error_when_all_coders_are_busy 2026-03-20 19:09:02 +00:00
Dave 65c8dc19d6 storkit: create 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-20 19:05:18 +00:00
Dave 645a141d2d storkit: create 343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends 2026-03-20 18:57:52 +00:00
Dave 11d1980920 storkit: done 357_story_bot_assign_command_to_pre_assign_a_model_to_a_story 2026-03-20 18:51:48 +00:00
Dave 83879cfa9e storkit: merge 357_story_bot_assign_command_to_pre_assign_a_model_to_a_story 2026-03-20 18:51:45 +00:00
Dave 972d8f3c12 storkit: create 357_story_bot_assign_command_to_pre_assign_a_model_to_a_story 2026-03-20 18:40:31 +00:00
Dave 4b1167025c storkit: accept 355_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 16:24:54 +00:00
Dave 23eb752e3b storkit: accept 354_story_make_help_command_output_alphabetical 2026-03-20 16:22:53 +00:00
Dave 7aa1d0e322 storkit: done 356_story_start_command_should_say_queued_not_error_when_all_coders_are_busy 2026-03-20 16:04:49 +00:00
Dave a6dcd48da9 storkit: merge 356_story_start_command_should_say_queued_not_error_when_all_coders_are_busy 2026-03-20 16:04:45 +00:00
Dave 87958b0a2a storkit: done 354_story_make_help_command_output_alphabetical 2026-03-20 15:39:35 +00:00
Dave ea061d868d storkit: merge 354_story_make_help_command_output_alphabetical 2026-03-20 15:39:32 +00:00
Dave 6a03ca725e storkit: done 350_story_mcp_tool_for_code_definitions_lookup 2026-03-20 15:36:30 +00:00
Dave 0cd7c15227 storkit: done 355_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 15:30:19 +00:00
Dave 0cb43a4de4 storkit: merge 355_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 15:30:16 +00:00
Dave cb663b620b storkit: accept 348_story_mcp_tools_for_code_search_grep_and_glob 2026-03-20 15:28:16 +00:00
Dave 0653af701c storkit: done 348_story_mcp_tools_for_code_search_grep_and_glob 2026-03-20 15:28:09 +00:00
Dave b1a96990c4 storkit: accept 349_story_mcp_tools_for_git_operations 2026-03-20 15:21:40 +00:00
Dave e46f855ab3 storkit: done 349_story_mcp_tools_for_git_operations 2026-03-20 15:20:39 +00:00
Dave d838dd7127 storkit: merge 349_story_mcp_tools_for_git_operations 2026-03-20 15:20:34 +00:00
Dave 02ee48911e storkit: accept 353_story_add_party_emoji_to_done_stage_notification_messages 2026-03-20 15:18:19 +00:00
Dave 6429b20974 storkit: accept 352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors 2026-03-20 15:16:38 +00:00
Dave dcf0be2998 storkit: create 356_story_start_command_should_say_queued_not_error_when_all_coders_are_busy 2026-03-20 15:08:05 +00:00
Dave efea81b487 storkit: accept 351_story_bot_reset_command_to_clear_conversation_context 2026-03-20 15:03:49 +00:00
Dave 491ca19a0b storkit: accept 347_story_mcp_tool_for_shell_command_execution 2026-03-20 13:19:25 +00:00
Dave 243b75e966 storkit: accept 346_story_mcp_tools_for_file_operations_read_write_edit_list 2026-03-20 13:18:24 +00:00
Dave 7693cc820c storkit: accept 340_story_web_ui_rebuild_and_restart_button 2026-03-20 13:04:21 +00:00
Dave ba4af4179e storkit: accept 339_story_web_ui_agent_assignment_dropdown_on_work_items 2026-03-20 12:59:20 +00:00
Dave d60ed18e0f storkit: accept 338_story_web_ui_button_to_move_stories_between_pipeline_stages 2026-03-20 12:52:17 +00:00
Dave 94f4ba831b storkit: accept 336_story_web_ui_button_to_start_a_coder_on_a_story 2026-03-20 12:50:16 +00:00
Dave c4a113b855 Bump version to 0.4.1 2026-03-20 12:48:35 +00:00
Dave 5510d9d19d storkit: accept 337_story_web_ui_button_to_stop_an_agent_on_a_story 2026-03-20 12:47:15 +00:00
Dave ca949aec46 Update package-lock.json for 0.4.1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 12:32:52 +00:00
Dave 9ceda6694d storkit: accept 342_story_web_ui_button_to_delete_a_story_from_the_pipeline 2026-03-20 12:32:13 +00:00
Dave b0a1eafd8d Bump to 0.4.1, fix release script to match legacy commit prefix and auto-bump versions
- Bumps server/Cargo.toml and frontend/package.json to 0.4.1
- Release script now auto-bumps both version files when run
- Changelog generation matches both "storkit:" and "story-kit:" prefixes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 12:31:50 +00:00
Dave b2c9ece9e4 Bump version to 0.4.1 2026-03-20 12:31:19 +00:00
Dave 24ca585fd0 storkit: accept 330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules 2026-03-20 12:29:12 +00:00
Dave c4e45b2841 The great storkit name conversion 2026-03-20 12:26:02 +00:00
Dave 51d878e117 storkit: create 355_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 12:24:08 +00:00
Dave cb991da84c storkit: create 354_story_make_help_command_output_alphabetical 2026-03-20 12:21:57 +00:00
Dave 28b78c4a32 storkit: accept 335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 12:15:37 +00:00
Dave 6f47943369 storkit: accept 331_story_bot_start_command_to_start_a_coder_on_a_story 2026-03-20 12:14:37 +00:00
Dave 8885543c25 fix overview command to match both storkit and legacy story-kit commit prefixes
The .story_kit → .storkit rename updated the grep pattern but all historical
merge commits still use the old "story-kit:" prefix, so overview could not
find any stories.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 12:13:42 +00:00
Dave 2208aba3fb story-kit: accept 40_story_mcp_server_obeys_storykit_port 2026-03-20 12:03:20 +00:00
Dave d3f462e518 story-kit: accept 49_story_deterministic_bug_lifecycle_management 2026-03-20 12:02:03 +00:00
Dave 9581e5d51a rename .story_kit directory to .storkit and update all references
Renames the config directory and updates 514 references across 42 Rust
source files, plus CLAUDE.md, .gitignore, Makefile, script/release,
and .mcp.json files. All 1205 tests pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 11:34:53 +00:00
Dave 375277f86e story-kit: done 353_story_add_party_emoji_to_done_stage_notification_messages 2026-03-20 11:25:03 +00:00
Dave c096488ba1 story-kit: merge 353_story_add_party_emoji_to_done_stage_notification_messages 2026-03-20 11:25:00 +00:00
Dave ab5fb734e5 story-kit: done 352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors 2026-03-20 11:19:26 +00:00
Dave d7e814c02c story-kit: merge 352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors 2026-03-20 11:19:22 +00:00
Dave 4268db8641 story-kit: create 353_story_add_party_emoji_to_done_stage_notification_messages 2026-03-20 11:17:32 +00:00
Dave 943bd38d19 story-kit: accept 328_refactor_split_commands_rs_into_individual_command_handler_modules 2026-03-20 11:16:26 +00:00
Dave 16df7b783d story-kit: done 351_story_bot_reset_command_to_clear_conversation_context 2026-03-20 11:16:26 +00:00
Dave 24eb20f985 story-kit: merge 351_story_bot_reset_command_to_clear_conversation_context 2026-03-20 11:16:23 +00:00
Dave 9f18cacbed story-kit: create 352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors 2026-03-20 11:03:07 +00:00
Dave 737ddca884 story-kit: create 351_story_bot_reset_command_to_clear_conversation_context 2026-03-20 11:02:50 +00:00
Dave 0e8963591e story-kit: done 346_story_mcp_tools_for_file_operations_read_write_edit_list 2026-03-20 09:57:38 +00:00
Dave 492a0fc749 story-kit: done 347_story_mcp_tool_for_shell_command_execution 2026-03-20 09:54:49 +00:00
Dave 287c64faf1 story-kit: merge 347_story_mcp_tool_for_shell_command_execution 2026-03-20 09:54:46 +00:00
Dave 31085e8c9f fix: rename story-kit references to storkit in server code and settings
Updates -p flag in rebuild_and_restart, MCP server name, enabledMcpjsonServers,
and test values to match the new binary/crate name.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 09:24:06 +00:00
Dave 1a22e0cb41 chore: remove supervisor agent from project.toml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 09:20:44 +00:00
Dave f653b51dd7 story-kit: create 350_story_mcp_tool_for_code_definitions_lookup 2026-03-20 09:19:19 +00:00
Dave 2f66c7d30e story-kit: create 349_story_mcp_tools_for_git_operations 2026-03-20 09:18:48 +00:00
Dave 3031c158e7 story-kit: create 348_story_mcp_tools_for_code_search_grep_and_glob 2026-03-20 09:18:38 +00:00
Dave 6aa932b349 story-kit: create 347_story_mcp_tool_for_shell_command_execution 2026-03-20 09:18:27 +00:00
Dave fb23e2218b story-kit: create 346_story_mcp_tools_for_file_operations_read_write_edit_list 2026-03-20 09:18:17 +00:00
Dave 01d1c15d91 story-kit: create 345_story_gemini_agent_backend_via_google_ai_api 2026-03-20 09:16:27 +00:00
Dave 9622a1a572 story-kit: create 344_story_chatgpt_agent_backend_via_openai_api 2026-03-20 09:16:10 +00:00
Dave e99a3da336 story-kit: done 342_story_web_ui_button_to_delete_a_story_from_the_pipeline 2026-03-20 09:13:13 +00:00
Dave 60e1d7bf64 story-kit: merge 342_story_web_ui_button_to_delete_a_story_from_the_pipeline 2026-03-20 09:13:10 +00:00
Dave 3cfe25f97a story-kit: create 345_story_gemini_agent_backend_via_google_ai_api 2026-03-20 09:11:23 +00:00
Dave ebb9df9780 story-kit: create 344_story_chatgpt_agent_backend_via_openai_api 2026-03-20 09:11:09 +00:00
Dave d0ec1eebd7 story-kit: create 343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends 2026-03-20 09:10:42 +00:00
Dave 19bb3a6b52 story-kit: done 340_story_web_ui_rebuild_and_restart_button 2026-03-20 09:10:29 +00:00
Dave 594114d671 story-kit: merge 340_story_web_ui_rebuild_and_restart_button 2026-03-20 09:10:26 +00:00
Dave 0897b36cc1 story-kit: done 339_story_web_ui_agent_assignment_dropdown_on_work_items 2026-03-20 09:07:46 +00:00
Dave 81e822642e story-kit: merge 339_story_web_ui_agent_assignment_dropdown_on_work_items 2026-03-20 09:07:44 +00:00
Dave 134cae216a story-kit: done 338_story_web_ui_button_to_move_stories_between_pipeline_stages 2026-03-20 09:05:12 +00:00
Dave 2b5c7578d3 story-kit: done 337_story_web_ui_button_to_stop_an_agent_on_a_story 2026-03-20 09:00:07 +00:00
Dave 3778162920 story-kit: merge 337_story_web_ui_button_to_stop_an_agent_on_a_story 2026-03-20 09:00:03 +00:00
Dave 8c3e92f936 story-kit: done 335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 08:57:22 +00:00
Dave 25711fc16b story-kit: done 336_story_web_ui_button_to_start_a_coder_on_a_story 2026-03-20 08:52:46 +00:00
Dave e33979aacb story-kit: merge 336_story_web_ui_button_to_start_a_coder_on_a_story 2026-03-20 08:52:43 +00:00
Dave 31e2f823f7 story-kit: done 333_story_bot_stop_command_to_stop_an_agent_on_a_story 2026-03-20 08:49:57 +00:00
Dave ec5f4afcfb story-kit: done 332_story_bot_assign_command_to_assign_a_specific_agent_to_a_story 2026-03-20 08:44:34 +00:00
Dave 75640c6ecf story-kit: done 334_story_bot_move_command_to_move_stories_between_pipeline_stages 2026-03-20 08:39:45 +00:00
Dave 69030599d3 story-kit: merge 334_story_bot_move_command_to_move_stories_between_pipeline_stages 2026-03-20 08:39:42 +00:00
Dave adab08f804 story-kit: done 330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules 2026-03-20 08:37:33 +00:00
Dave 3d59077a3c story-kit: delete 280_story_long_running_supervisor_agent_with_periodic_pipeline_polling 2026-03-20 08:32:18 +00:00
Dave 84acc82f8c story-kit: create 342_story_web_ui_button_to_delete_a_story_from_the_pipeline 2026-03-20 08:31:35 +00:00
Dave a2ea1d65aa story-kit: done 331_story_bot_start_command_to_start_a_coder_on_a_story 2026-03-20 08:30:20 +00:00
Dave 086eb908ee story-kit: merge 331_story_bot_start_command_to_start_a_coder_on_a_story 2026-03-20 08:30:17 +00:00
Dave c138246db3 story-kit: create 341_story_rename_story_kit_directory_to_storkit 2026-03-20 08:24:59 +00:00
Dave c7846c041c story-kit: create 341_story_rename_story_kit_directory_to_storkit 2026-03-20 08:23:10 +00:00
Dave 9b6bde95bc story-kit: create 340_story_web_ui_rebuild_and_restart_button 2026-03-20 08:16:20 +00:00
Dave f625534ff0 story-kit: create 339_story_web_ui_agent_assignment_dropdown_on_work_items 2026-03-20 08:16:11 +00:00
Dave 3f59420b2b story-kit: create 338_story_web_ui_button_to_move_stories_between_pipeline_stages 2026-03-20 08:15:57 +00:00
Dave 9730a923dd story-kit: create 337_story_web_ui_button_to_stop_an_agent_on_a_story 2026-03-20 08:15:48 +00:00
Dave c7b2b5820b story-kit: create 336_story_web_ui_button_to_start_a_coder_on_a_story 2026-03-20 08:15:40 +00:00
Dave 303fdbad6f story-kit: create 335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart 2026-03-20 08:14:53 +00:00
Dave c0a7f5fbfb story-kit: create 334_story_bot_move_command_to_move_stories_between_pipeline_stages 2026-03-20 08:14:42 +00:00
Dave 5215956314 story-kit: create 333_story_bot_stop_command_to_stop_an_agent_on_a_story 2026-03-20 08:14:05 +00:00
Dave 27b86da0aa story-kit: create 332_story_bot_assign_command_to_assign_a_specific_agent_to_a_story 2026-03-20 08:13:55 +00:00
Dave 2ce0166ea8 story-kit: create 331_story_bot_start_command_to_start_a_coder_on_a_story 2026-03-20 08:13:46 +00:00
Dave 2d377532df story-kit: create 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-20 08:10:59 +00:00
Dave 3885802d79 story-kit: create 330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules 2026-03-20 08:07:59 +00:00
Dave f650fef1e5 story-kit: create 330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules 2026-03-20 08:05:53 +00:00
Dave dbc8849681 story-kit: create 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-20 07:32:12 +00:00
Dave b17ba0c8dd story-kit: done 328_refactor_split_commands_rs_into_individual_command_handler_modules 2026-03-20 07:29:01 +00:00
Dave eea797975b story-kit: merge 328_refactor_split_commands_rs_into_individual_command_handler_modules 2026-03-20 07:28:59 +00:00
Dave 67e6a4afe6 story-kit: create 329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting 2026-03-20 07:24:53 +00:00
Dave 9c01bfebc8 story-kit: create 328_refactor_split_commands_rs_into_individual_command_handler_modules 2026-03-20 07:15:27 +00:00
Dave 8ea69fc70f story-kit: accept 327_story_bot_overview_command_shows_implementation_summary_for_a_story 2026-03-20 05:08:05 +00:00
Dave 1bd816f5a6 story-kit: accept 324_story_slack_bot_integration_for_bot_commands 2026-03-20 04:55:04 +00:00
Dave 5f3dcebfc3 story-kit: accept 321_story_whatsapp_htop_adaptation_for_no_edit_platforms 2026-03-20 04:26:00 +00:00
Dave ef9ec8bbbe story-kit: accept 322_story_whatsapp_24_hour_messaging_window_and_template_support 2026-03-20 04:22:57 +00:00
Dave 14a97ed4ed story-kit: accept 320_story_whatsapp_business_api_integration_for_bot_commands 2026-03-20 02:48:53 +00:00
Dave 3932aa65c2 story-kit: accept 317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules 2026-03-20 02:41:49 +00:00
Dave 9a77ffaa83 story-kit: done 325_story_slack_llm_passthrough_for_conversational_queries 2026-03-20 01:30:48 +00:00
Dave a9d5e9f6f8 story-kit: accept 319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules 2026-03-20 01:30:10 +00:00
Dave f5b1103bf6 story-kit: done 326_story_slack_slash_commands_for_pipeline_management 2026-03-20 01:26:09 +00:00
Dave 39707ce026 story-kit: merge 326_story_slack_slash_commands_for_pipeline_management 2026-03-20 01:26:06 +00:00
Dave ff1705f26c story-kit: done 327_story_bot_overview_command_shows_implementation_summary_for_a_story 2026-03-20 01:22:13 +00:00
Dave 14cab448cb story-kit: merge 327_story_bot_overview_command_shows_implementation_summary_for_a_story 2026-03-20 01:22:10 +00:00
Dave 973af81fa5 story-kit: done 324_story_slack_bot_integration_for_bot_commands 2026-03-20 01:12:11 +00:00
Dave 09890b5ea4 story-kit: merge 324_story_slack_bot_integration_for_bot_commands 2026-03-20 01:12:08 +00:00
Dave 4fe61c643b story-kit: create 327_story_bot_overview_command_shows_implementation_summary_for_a_story 2026-03-20 01:07:19 +00:00
Dave 665ffa9521 story-kit: create 326_story_slack_slash_commands_for_pipeline_management 2026-03-20 00:54:46 +00:00
Dave e558d716d8 story-kit: create 325_story_slack_llm_passthrough_for_conversational_queries 2026-03-20 00:54:36 +00:00
Dave cc403e7736 story-kit: create 324_story_slack_bot_integration_for_bot_commands 2026-03-20 00:54:26 +00:00
Dave 48edf6a94b chore: update problems.md and Cargo.lock after binary rename
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 00:50:01 +00:00
Dave 27c406330a rename binary from story-kit to storkit in Cargo.toml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 00:46:18 +00:00
Dave 48aad2323d story-kit: accept 316_refactor_abstract_bot_transport_layer_for_multi_platform_support 2026-03-20 00:43:26 +00:00
Dave 6c00f66894 story-kit: done 321_story_whatsapp_htop_adaptation_for_no_edit_platforms 2026-03-20 00:30:37 +00:00
Dave 90c98f5b47 story-kit: accept 315_story_rename_binary_and_all_references_from_story_kit_to_storkit 2026-03-20 00:07:51 +00:00
Dave a8cb851ba7 story-kit: done 322_story_whatsapp_24_hour_messaging_window_and_template_support 2026-03-20 00:00:48 +00:00
Dave 02947700ba story-kit: merge 322_story_whatsapp_24_hour_messaging_window_and_template_support 2026-03-20 00:00:45 +00:00
Dave e3ade4cca5 story-kit: done 323_story_whatsapp_llm_passthrough_for_conversational_queries 2026-03-19 23:57:56 +00:00
Dave e9a0858d53 story-kit: merge 323_story_whatsapp_llm_passthrough_for_conversational_queries 2026-03-19 23:57:53 +00:00
Dave c84c33a1a7 story-kit: accept 314_story_show_token_cost_per_story_in_bot_status_command_output 2026-03-19 23:50:42 +00:00
Dave 09a47ac224 story-kit: accept 313_story_improve_htop_output_formatting_for_mobile_matrix_clients 2026-03-19 23:20:52 +00:00
Dave a791b9f49c story-kit: done 320_story_whatsapp_business_api_integration_for_bot_commands 2026-03-19 23:05:52 +00:00
Dave 351f770516 story-kit: merge 320_story_whatsapp_business_api_integration_for_bot_commands 2026-03-19 23:05:49 +00:00
Dave cc0110e577 story-kit: create 323_story_whatsapp_llm_passthrough_for_conversational_queries 2026-03-19 22:48:41 +00:00
Dave 8eff849e83 story-kit: create 322_story_whatsapp_24_hour_messaging_window_and_template_support 2026-03-19 22:48:29 +00:00
Dave 7439c227a9 story-kit: create 321_story_whatsapp_htop_adaptation_for_no_edit_platforms 2026-03-19 22:48:18 +00:00
Dave 887ab81898 story-kit: create 320_story_whatsapp_business_api_integration_for_bot_commands 2026-03-19 22:48:08 +00:00
Dave ef6201b273 story-kit: done 317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules 2026-03-19 22:43:33 +00:00
Dave 5af3c17522 story-kit: merge 317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules 2026-03-19 22:43:30 +00:00
Dave 7cb95260aa story-kit: done 318_refactor_split_mcp_rs_into_domain_specific_tool_modules 2026-03-19 21:56:37 +00:00
Dave cf4a40a431 story-kit: merge 318_refactor_split_mcp_rs_into_domain_specific_tool_modules 2026-03-19 21:56:34 +00:00
Dave 6c03c4f9dc story-kit: done 319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules 2026-03-19 21:48:27 +00:00
Dave 4acf38f035 story-kit: merge 319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules 2026-03-19 21:48:24 +00:00
Dave d6d7fb3c59 story-kit: create 319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules 2026-03-19 21:29:44 +00:00
Dave 9e4587ceb4 story-kit: create 318_refactor_split_mcp_rs_into_domain_specific_tool_modules 2026-03-19 21:29:34 +00:00
Dave 72216fe7ce story-kit: create 317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules 2026-03-19 21:29:24 +00:00
Dave 9807eb6bb0 story-kit: done 316_refactor_abstract_bot_transport_layer_for_multi_platform_support 2026-03-19 20:45:53 +00:00
Dave 7eb9686bfb story-kit: merge 316_refactor_abstract_bot_transport_layer_for_multi_platform_support 2026-03-19 20:45:50 +00:00
Dave 3b9cea22bb story-kit: create 316_refactor_abstract_bot_transport_layer_for_multi_platform_support 2026-03-19 20:21:38 +00:00
Dave e2a8b978f7 story-kit: done 315_story_rename_binary_and_all_references_from_story_kit_to_storkit 2026-03-19 20:15:22 +00:00
Dave 748d86cf10 story-kit: done 314_story_show_token_cost_per_story_in_bot_status_command_output 2026-03-19 19:59:07 +00:00
Dave 060d5a40a4 story-kit: merge 314_story_show_token_cost_per_story_in_bot_status_command_output 2026-03-19 19:59:04 +00:00
Dave 3cb4f32634 story-kit: create 315_story_rename_binary_and_all_references_from_story_kit_to_storkit 2026-03-19 19:55:41 +00:00
Dave e00d780940 story-kit: create 314_story_show_token_cost_per_story_in_bot_status_command_output 2026-03-19 19:50:33 +00:00
Dave df7556c0f3 story-kit: accept 312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories 2026-03-19 19:49:53 +00:00
Dave 07f8defad0 story-kit: done 313_story_improve_htop_output_formatting_for_mobile_matrix_clients 2026-03-19 19:45:58 +00:00
Dave 1739c2ff58 story-kit: merge 313_story_improve_htop_output_formatting_for_mobile_matrix_clients 2026-03-19 19:45:55 +00:00
Dave e6eaa10c16 story-kit: accept 310_story_bot_delete_command_removes_a_story_from_the_pipeline 2026-03-19 19:43:35 +00:00
Dave 110db662a9 story-kit: accept 311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories 2026-03-19 19:42:34 +00:00
Dave 9998b3ed25 story-kit: done 312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories 2026-03-19 19:32:41 +00:00
Dave d27a389a21 story-kit: merge 312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories 2026-03-19 19:32:38 +00:00
Dave 11a6be4b45 story-kit: create 313_story_improve_htop_output_formatting_for_mobile_matrix_clients 2026-03-19 19:20:42 +00:00
Dave 8074e3b420 fix: suppress unused variable TS errors that block release build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:43:42 +00:00
Dave 8a6eeacb5e fix: suppress unused variable TS errors that block release build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:41:04 +00:00
Dave eb9707d8b6 story-kit: done 311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories 2026-03-19 16:36:21 +00:00
Dave 3b887e3085 story-kit: merge 311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories 2026-03-19 16:36:18 +00:00
Dave 662e00f94a fix: biome formatting and lint fixes in App.tsx and TokenUsagePage.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:14:44 +00:00
Dave 932325744c fix: return arrays for list endpoints in test fetch mock
Prevents "agentList is not iterable" warnings in test output.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:09:02 +00:00
Dave 3ced187aaa fix: mock fetch in test setup to suppress URL parse errors in jsdom
Also set jsdom base URL to http://localhost:3000 in vitest config.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:07:56 +00:00
Dave 64f73e24bf story-kit: done 310_story_bot_delete_command_removes_a_story_from_the_pipeline 2026-03-19 16:05:03 +00:00
Dave c4282ab2fa story-kit: merge 310_story_bot_delete_command_removes_a_story_from_the_pipeline 2026-03-19 16:05:00 +00:00
Dave a23fe71232 story-kit: accept 307_story_configurable_coder_pool_size_and_default_model_in_project_toml 2026-03-19 16:01:38 +00:00
Dave 84b1c24073 story-kit: done 307_story_configurable_coder_pool_size_and_default_model_in_project_toml 2026-03-19 16:00:37 +00:00
Dave 429597cbce story-kit: merge 307_story_configurable_coder_pool_size_and_default_model_in_project_toml 2026-03-19 16:00:35 +00:00
Dave 101b365354 story-kit: accept 309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel 2026-03-19 15:55:39 +00:00
Dave ca3d5ee7a6 story-kit: create 312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories 2026-03-19 15:49:38 +00:00
Dave 4af9507764 story-kit: create 312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories 2026-03-19 15:48:41 +00:00
Dave b71e8dd2be story-kit: create 310_story_bot_delete_command_removes_a_story_from_the_pipeline 2026-03-19 15:43:11 +00:00
Dave a6621a7095 story-kit: done 309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel 2026-03-19 15:42:50 +00:00
Dave ce380ffb52 story-kit: merge 309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel 2026-03-19 15:42:47 +00:00
Dave be9c15efe0 story-kit: create 311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories 2026-03-19 15:42:23 +00:00
Dave 76e3bf952e story-kit: accept 298_story_bot_htop_command_with_live_updating_process_dashboard 2026-03-19 15:33:32 +00:00
Dave d6858b690b story-kit: done 306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field 2026-03-19 11:58:50 +00:00
Dave 2067abb2e5 story-kit: merge 306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field 2026-03-19 11:58:47 +00:00
Dave a058fa5f19 story-kit: create 310_story_bot_delete_command_removes_a_story_from_the_pipeline 2026-03-19 11:57:28 +00:00
Dave 62c2c531e6 story-kit: create 309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel 2026-03-19 11:55:12 +00:00
Dave f266bb1d03 story-kit: create 308_bug_token_cost_breakdown_missing_from_expanded_work_item_detail_panel 2026-03-19 11:54:05 +00:00
Dave 7c9261da41 story-kit: create 307_story_configurable_coder_pool_size_and_default_model_in_project_toml 2026-03-19 11:42:35 +00:00
Dave 0eac4ca966 story-kit: done 303_story_bot_cost_command_with_story_filter_for_detailed_breakdown 2026-03-19 11:40:57 +00:00
Dave a70f6b01e0 story-kit: create 307_story_configurable_coder_pool_size_and_default_model_in_project_toml 2026-03-19 11:39:57 +00:00
Dave 4545b57160 story-kit: done 301_story_dedicated_token_usage_page_in_web_ui 2026-03-19 11:36:16 +00:00
Dave a6ac6497e9 story-kit: merge 301_story_dedicated_token_usage_page_in_web_ui 2026-03-19 11:36:12 +00:00
Dave 586d06b840 story-kit: create 306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field 2026-03-19 11:30:19 +00:00
Dave c67f148383 story-kit: done 305_story_bot_show_command_displays_story_text_in_chat 2026-03-19 11:12:37 +00:00
Dave f88114edbf story-kit: merge 305_story_bot_show_command_displays_story_text_in_chat 2026-03-19 11:12:35 +00:00
Dave 08c7a92d74 story-kit: done 300_story_show_token_cost_badge_on_pipeline_board_work_items 2026-03-19 11:02:14 +00:00
Dave 36535b639f story-kit: merge 300_story_show_token_cost_badge_on_pipeline_board_work_items 2026-03-19 11:02:12 +00:00
Dave b6f99ce7a2 story-kit: done 304_story_mcp_tool_to_move_stories_between_pipeline_stages 2026-03-19 10:59:50 +00:00
Dave f4376b01e1 story-kit: merge 304_story_mcp_tool_to_move_stories_between_pipeline_stages 2026-03-19 10:59:47 +00:00
Dave e7aa4e028e story-kit: create 305_story_bot_show_command_displays_story_text_in_chat 2026-03-19 10:56:25 +00:00
Dave 52c5cc9b72 story-kit: done 302_story_bot_cost_command_shows_total_and_per_story_token_spend 2026-03-19 10:54:09 +00:00
Dave c327263254 story-kit: merge 302_story_bot_cost_command_shows_total_and_per_story_token_spend 2026-03-19 10:54:04 +00:00
Dave 7c9b86c31b story-kit: create 304_story_mcp_tool_to_move_stories_between_pipeline_stages 2026-03-19 10:44:14 +00:00
Dave a2c893420b story-kit: create 304_story_mcp_tool_to_move_stories_between_pipeline_stages 2026-03-19 10:43:10 +00:00
Dave a1fe5356cf story-kit: create 301_story_dedicated_token_usage_page_in_web_ui 2026-03-19 10:41:49 +00:00
Dave 1477fbc02b story-kit: create 303_story_bot_cost_command_with_story_filter_for_detailed_breakdown 2026-03-19 10:40:42 +00:00
Dave 6a74eefd07 chore: gitignore token_usage.jsonl
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:35:37 +00:00
Dave 981fd3fd81 story-kit: merge 298_story_bot_htop_command_with_live_updating_process_dashboard
Adds htop bot command with live-updating Matrix message showing system
load and per-agent CPU/memory usage. Supports timeout override and
htop stop. Resolved conflict with git command in commands.rs registry.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:33:21 +00:00
Dave 99d301b467 story-kit: done 298_story_bot_htop_command_with_live_updating_process_dashboard 2026-03-19 10:29:35 +00:00
Dave 9ed80384d5 story-kit: create 302_story_bot_cost_command_shows_total_and_per_story_token_spend 2026-03-19 10:14:01 +00:00
Dave c2cda92337 story-kit: done 299_story_bot_git_status_command_shows_working_tree_and_branch_info 2026-03-19 10:11:30 +00:00
Dave b25ae42737 story-kit: merge 299_story_bot_git_status_command_shows_working_tree_and_branch_info 2026-03-19 10:11:28 +00:00
Dave 7811130a8b story-kit: create 300_story_show_token_cost_badge_on_pipeline_board_work_items 2026-03-19 10:10:27 +00:00
Dave ec212cb5a2 story-kit: create 303_story_bot_cost_command_with_story_filter_for_detailed_breakdown 2026-03-19 10:08:57 +00:00
Dave d174bb41e7 story-kit: create 302_story_bot_cost_command_shows_total_and_per_story_token_spend 2026-03-19 10:08:48 +00:00
Dave 40570888ff story-kit: create 301_story_dedicated_token_usage_page_in_web_ui 2026-03-19 10:08:35 +00:00
Dave dd75e9e0fa story-kit: create 300_story_show_token_cost_badge_on_pipeline_board_work_items 2026-03-19 10:08:26 +00:00
Dave c2aa9ef134 story-kit: accept 295_bug_stories_stuck_in_qa_when_qa_agent_is_busy 2026-03-19 09:58:55 +00:00
Dave 501d6d31ff story-kit: create 299_story_bot_git_status_command_shows_working_tree_and_branch_info 2026-03-19 09:58:06 +00:00
Dave db2f8fcfc5 story-kit: done 295_bug_stories_stuck_in_qa_when_qa_agent_is_busy 2026-03-19 09:57:32 +00:00
Dave f325ddf9fe story-kit: done 296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation 2026-03-19 09:55:28 +00:00
Dave 9cdb0d4ea8 story-kit: merge 296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation 2026-03-19 09:55:25 +00:00
Dave 6c413e1fc7 fix: call auto_assign_available_work after every pipeline advance (bug 295)
Stories got stuck in QA/merge when agents were busy at assignment time.
Consolidates auto_assign into a single unconditional call at the end of
run_pipeline_advance, so whenever any agent completes, the system
immediately scans for pending work and assigns free agents.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 09:53:41 +00:00
Dave 28b29b55a8 story-kit: accept 294_story_rename_app_title_from_story_kit_to_storkit 2026-03-19 09:47:31 +00:00
Dave 376de57252 story-kit: done 294_story_rename_app_title_from_story_kit_to_storkit 2026-03-19 09:46:31 +00:00
Dave 63f46751ac story-kit: merge 294_story_rename_app_title_from_story_kit_to_storkit 2026-03-19 09:46:28 +00:00
Dave dc9df6d497 story-kit: create 298_story_bot_htop_command_with_live_updating_process_dashboard 2026-03-19 09:41:26 +00:00
Dave ae7b04fac5 story-kit: create 298_story_bot_htop_command_with_live_updating_process_dashboard 2026-03-19 09:39:38 +00:00
Dave 50959e6b67 story-kit: done 297_story_improve_bot_status_command_formatting 2026-03-19 09:39:08 +00:00
Dave 6353b12c1d story-kit: merge 297_story_improve_bot_status_command_formatting 2026-03-19 09:39:05 +00:00
Dave 170fd53808 story-kit: create 296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation 2026-03-19 09:37:21 +00:00
Dave 597e6bf1c3 story-kit: create 298_story_bot_htop_command_with_live_updating_process_dashboard 2026-03-19 09:36:14 +00:00
Dave 7a5a56f211 story-kit: create 297_story_improve_bot_status_command_formatting 2026-03-19 09:26:32 +00:00
Dave 73c86b6946 story-kit: merge 293_story_register_all_bot_commands_in_the_command_registry
Moves status, ambient, and help commands into a unified command registry
in commands.rs. Help output now automatically lists all registered
commands. Resolved merge conflict with 1_backlog rename.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 09:14:04 +00:00
Dave 11afd21f17 story-kit: create 296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation 2026-03-19 09:03:46 +00:00
Dave 1d20cfc679 story-kit: create 296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation 2026-03-19 08:59:46 +00:00
Dave 959c680e10 story-kit: accept 293_story_register_all_bot_commands_in_the_command_registry 2026-03-19 08:37:52 +00:00
Dave dd377de7db story-kit: done 293_story_register_all_bot_commands_in_the_command_registry 2026-03-19 08:37:47 +00:00
Dave 9fee4d9478 story-kit: accept 292_story_show_server_logs_in_web_ui 2026-03-19 01:32:28 +00:00
Dave 40c04fcb28 story-kit: done 292_story_show_server_logs_in_web_ui 2026-03-19 01:31:28 +00:00
Dave 2f0d796b38 story-kit: merge 292_story_show_server_logs_in_web_ui 2026-03-19 01:31:25 +00:00
Dave 2346602b30 fix: default manual_qa to false so stories advance automatically
Bug 283 was implemented with manual_qa defaulting to true, causing all
stories to hold in QA for human review. Changed to default false as
originally specified — stories advance automatically unless explicitly
opted in with manual_qa: true.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 00:53:00 +00:00
Dave 13c0ee4c08 story-kit: create 295_bug_stories_stuck_in_qa_when_qa_agent_is_busy 2026-03-18 21:24:11 +00:00
Dave 483dca5b95 story-kit: create 295_bug_stories_stuck_in_qa_when_qa_agent_is_busy 2026-03-18 21:23:04 +00:00
Dave dc7d070101 story-kit: create 294_story_rename_app_title_from_story_kit_to_storkit 2026-03-18 20:43:09 +00:00
Dave 875d1f88aa story-kit: accept 291_story_show_test_results_in_work_item_detail_panel 2026-03-18 20:39:16 +00:00
Dave f550018987 Updated toml to 1.0.7 2026-03-18 16:38:16 +00:00
Dave 52ec989c3a Fixed some bot tests. 2026-03-18 16:37:23 +00:00
Dave d080e8b12d story-kit: accept 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-18 16:11:51 +00:00
Dave cfd85d3a0e story-kit: accept 284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability 2026-03-18 16:06:45 +00:00
Dave 070d53068e story-kit: accept 283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge 2026-03-18 16:00:44 +00:00
Dave fa8e0f39f6 story-kit: create 293_story_register_all_bot_commands_in_the_command_registry 2026-03-18 15:57:14 +00:00
Dave 503fa6b7bf fix: rename remaining 1_upcoming references to 1_backlog in bot.rs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:53:36 +00:00
Dave 51a0fb8297 story-kit: accept 282_story_matrix_bot_ambient_mode_toggle_via_chat_command 2026-03-18 15:52:35 +00:00
Dave 8ac85a0b67 chore: commit pending changes from session
- Add permission rules to .claude/settings.json
- Document empty merge and direct-to-master problems in problems.md
- Fix agent stream URL to use vite proxy instead of hardcoded host
- Add /agents proxy config to vite.config.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:50:20 +00:00
Dave aa4e042e32 story-kit: done 247_story_human_qa_gate_with_rejection_flow 2026-03-18 15:47:51 +00:00
Dave 9352443555 story-kit: merge 247_story_human_qa_gate_with_rejection_flow 2026-03-18 15:47:48 +00:00
Dave 1faacd7812 story-kit: done 291_story_show_test_results_in_work_item_detail_panel 2026-03-18 15:43:41 +00:00
Dave 7451cb7170 story-kit: done 290_story_show_agent_output_stream_in_expanded_work_item_detail_panel 2026-03-18 15:32:01 +00:00
Dave 83ccfece81 story-kit: merge 290_story_show_agent_output_stream_in_expanded_work_item_detail_panel 2026-03-18 15:31:58 +00:00
Dave 68bf179407 story-kit: create 292_story_show_server_logs_in_web_ui 2026-03-18 15:27:56 +00:00
Dave c35c05d02c story-kit: done 289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild 2026-03-18 15:27:37 +00:00
Dave 3adae6c475 story-kit: merge 289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild 2026-03-18 15:27:29 +00:00
Dave c4753b51de story-kit: accept 281_story_matrix_bot_announces_itself_when_it_comes_online 2026-03-18 15:26:36 +00:00
Dave e7a73e7322 story-kit: done 284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability 2026-03-18 15:22:34 +00:00
Dave e8ec84668f story-kit: merge 284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability 2026-03-18 15:22:19 +00:00
Dave 8d9cf4b283 story-kit: create 291_story_show_test_results_in_work_item_detail_panel 2026-03-18 15:18:47 +00:00
Dave a8cb38fe27 story-kit: done 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-18 15:17:50 +00:00
Dave dd83e0f4ee fix: biome formatting in Chat.test.tsx and ChatInput.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:07:49 +00:00
Dave 3923aafb71 story-kit: done 288_bug_ambient_mode_state_lost_on_server_restart 2026-03-18 15:01:44 +00:00
Dave 8fcfadcb04 story-kit: merge 288_bug_ambient_mode_state_lost_on_server_restart 2026-03-18 15:01:40 +00:00
Dave 7c023c6beb story-kit: done 285_story_matrix_bot_help_command_lists_available_bot_commands 2026-03-18 14:57:30 +00:00
Dave e7bb8db7c1 story-kit: merge 285_story_matrix_bot_help_command_lists_available_bot_commands 2026-03-18 14:57:27 +00:00
Dave 727da0c6d0 story-kit: create 290_story_show_agent_output_stream_in_expanded_work_item_detail_panel 2026-03-18 14:50:35 +00:00
Dave 257ee05ac6 story-kit: accept 266_story_matrix_bot_structured_conversation_history 2026-03-18 14:49:40 +00:00
Dave b9f3505738 story-kit: create 289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild 2026-03-18 14:42:24 +00:00
Dave be56792c6e story-kit: create 289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild 2026-03-18 14:41:46 +00:00
Dave 9daaae2d43 story-kit: create 288_bug_ambient_mode_state_lost_on_server_restart 2026-03-18 14:37:16 +00:00
Dave c85d02a3ef story-kit: done 287_story_rename_upcoming_pipeline_stage_to_backlog 2026-03-18 14:33:11 +00:00
Dave df6f792214 story-kit: merge 287_story_rename_upcoming_pipeline_stage_to_backlog 2026-03-18 14:33:08 +00:00
Dave 967ebd7a84 story-kit: accept 271_story_show_assigned_agent_in_expanded_work_item_view 2026-03-18 14:30:43 +00:00
Dave 3bc44289b9 story-kit: accept 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent 2026-03-18 14:18:28 +00:00
Dave 17f6bae573 story-kit: done 286_story_server_self_rebuild_and_restart_via_mcp_tool 2026-03-18 14:09:13 +00:00
Dave baa8bdcfda story-kit: merge 286_story_server_self_rebuild_and_restart_via_mcp_tool 2026-03-18 14:09:09 +00:00
Dave 33492c49fa fix: QA agents must not pkill -f story-kit (kills vite dev server)
Change pkill pattern to 'target.*story-kit' to only match the Rust
binary, not any process with story-kit in its working directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 14:08:07 +00:00
Dave 63a90195e7 Update Cargo.lock version to 0.3.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 14:06:58 +00:00
Dave 7bd390c762 story-kit: accept 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-03-18 14:06:26 +00:00
Dave 0d581ab459 story-kit: accept 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 14:02:46 +00:00
Dave 42f88cc172 story-kit: create 287_story_rename_upcoming_pipeline_stage_to_backlog 2026-03-18 13:52:06 +00:00
Dave 945648bf6e story-kit: create 280_story_long_running_supervisor_agent_with_periodic_pipeline_polling 2026-03-18 13:51:32 +00:00
Dave bc5a3da2c0 story-kit: create 286_story_server_self_rebuild_and_restart_via_mcp_tool 2026-03-18 13:43:54 +00:00
Dave 04e841643e story-kit: accept 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-18 13:25:50 +00:00
Dave 3d97b0b95a story-kit: done 285_story_matrix_bot_help_command_lists_available_bot_commands 2026-03-18 13:07:48 +00:00
Dave 8f4cb9475c story-kit: done 284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability 2026-03-18 13:01:51 +00:00
Dave 8f63cfda07 story-kit: done 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent 2026-03-18 12:58:08 +00:00
Dave 1b3843d913 story-kit: done 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 12:50:48 +00:00
Dave 4c898996a2 story-kit: done 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-18 12:50:21 +00:00
Dave 281531624d story-kit: done 283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge 2026-03-18 12:34:46 +00:00
Dave b09a2cbdf9 story-kit: done 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-18 12:30:30 +00:00
Dave a0c1457757 story-kit: done 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-03-18 12:16:09 +00:00
Dave e818ac986d story-kit: create 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-03-18 12:15:09 +00:00
Dave b29f6628f8 story-kit: create 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 12:15:02 +00:00
Dave 4dc4fef83b story-kit: create 247_story_human_qa_gate_with_rejection_flow 2026-03-18 12:14:54 +00:00
Dave 7ef85c459c story-kit: create 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent 2026-03-18 12:13:36 +00:00
Dave f6058a50b9 story-kit: create 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-18 12:13:20 +00:00
Dave d347ba084d story-kit: done 282_story_matrix_bot_ambient_mode_toggle_via_chat_command 2026-03-18 12:12:26 +00:00
Dave b50d007b40 story-kit: merge 282_story_matrix_bot_ambient_mode_toggle_via_chat_command 2026-03-18 12:12:19 +00:00
Dave ed3d7311d1 story-kit: create 285_story_matrix_bot_help_command_lists_available_bot_commands 2026-03-18 12:06:34 +00:00
Dave e7aef3edc7 story-kit: create 284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability 2026-03-18 12:06:02 +00:00
Dave d5a93fe726 story-kit: create 283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge 2026-03-18 12:00:08 +00:00
Dave 7e45a1fba0 Bump version to 0.3.1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:49:22 +00:00
Dave ad348e813f Update Cargo.lock
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:49:02 +00:00
Dave de5dcceeaf story-kit: done 281_story_matrix_bot_announces_itself_when_it_comes_online 2026-03-18 11:48:19 +00:00
Dave 53fdcfec75 story-kit: merge 281_story_matrix_bot_announces_itself_when_it_comes_online 2026-03-18 11:48:15 +00:00
Dave bad680cf24 story-kit: create 282_story_matrix_bot_ambient_mode_toggle_via_chat_command 2026-03-18 11:47:51 +00:00
Dave a5e64ded83 fix: unused system_prompt variable warning
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:44:16 +00:00
Dave 77e368d354 fix: --system is not a valid Claude Code CLI flag
Removed the --system argument from the PTY runner — Claude Code CLI
doesn't support it. Bot name instruction is now prepended to the user
prompt instead of passed as a system prompt argument.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:42:39 +00:00
Dave db92a78d2b story-kit: accept 276_story_detect_and_log_when_root_mcp_json_port_is_modified 2026-03-18 11:40:54 +00:00
Dave 420deebdb4 story-kit: done 276_story_detect_and_log_when_root_mcp_json_port_is_modified 2026-03-18 11:39:47 +00:00
Dave 0a6de3717a fix: Chat.test.tsx type errors from 271 merge
Cast lastSendChatArgs through unknown to satisfy TypeScript's
strict type narrowing on the nullable union type.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:33:54 +00:00
Dave 15645a2a3e Bump version to 0.3.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:31:19 +00:00
Dave eab65de723 story-kit: create 281_story_matrix_bot_announces_itself_when_it_comes_online 2026-03-18 11:26:29 +00:00
Dave 81a5660f11 story-kit: merge 277 - bot uses configured display_name
Adds system_prompt parameter to chat_stream so the Matrix bot
passes "Your name is {name}" to Claude Code. Reads display_name
from bot.toml config. Resolved conflicts by integrating bot_name
into master's permission-handling code structure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:23:50 +00:00
Dave 4bf01c6cca fix: session_id wiped on every trim, breaking --resume
The history trimming logic cleared session_id = None whenever entries
exceeded history_size. Since the history was always at capacity, every
new message wiped the session_id immediately after storing it. This
meant --resume was never passed to Claude Code, making every turn a
fresh conversation.

Fix: preserve session_id on trim. Claude Code's --resume loads the
full conversation from its own session transcript on disk, so trimming
our local tracking entries doesn't invalidate the session.

Also adds debug logging for session_id capture/storage (temporary).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 11:19:00 +00:00
Dave a799009720 story-kit: done 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent 2026-03-18 11:10:41 +00:00
Dave 549c23bd77 story-kit: done 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 11:05:14 +00:00
Dave 34be4d1e75 story-kit: done 277_story_matrix_bot_uses_its_configured_name_instead_of_claude 2026-03-18 11:00:39 +00:00
Dave a390861520 story-kit: done 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-18 10:55:58 +00:00
Dave ce9bdbbb9d story-kit: done 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:48:55 +00:00
Dave 5f4591f496 fix: update should_commit_stage test to match 5_done in COMMIT_WORTHY_STAGES
The test was asserting 5_done should NOT trigger commits, but commit 74dc42c
added 5_done to COMMIT_WORTHY_STAGES. Updated test to match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 10:46:11 +00:00
Dave dc7968ffbc story-kit: mergemaster conflict resolution, vite proxy fix, bug 279
- Upgrade mergemaster prompt to resolve complex conflicts itself
  instead of just reporting failure. Includes instructions to check
  git history and story files for context before resolving.
- Add proxy error handler to vite config to prevent crashes on
  backend ECONNREFUSED.
- Fix bug 279: auto-assign now checks that preferred agent's stage
  matches the pipeline stage. Coders won't be assigned to QA/merge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:44:10 +00:00
Dave 5fedd9130a story-kit: create 280_story_long_running_supervisor_agent_with_periodic_pipeline_polling 2026-03-18 10:39:51 +00:00
Dave c7e371c124 story-kit: create 280_story_long_running_supervisor_agent_with_periodic_pipeline_polling 2026-03-18 10:36:20 +00:00
Dave 8748d7d49a story-kit: create 280_story_long_running_supervisor_agent_with_periodic_pipeline_polling 2026-03-18 10:34:18 +00:00
Dave 825d36c204 fix: remove stale 266 from archived (came from 271 branch history)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:30:47 +00:00
Dave 65a8feff17 story-kit: done 271_story_show_assigned_agent_in_expanded_work_item_view 2026-03-18 10:29:45 +00:00
Dave 60dabae795 story-kit: merge 271_story_show_assigned_agent_in_expanded_work_item_view
Adds assigned agent display to the expanded work item detail panel.
Resolved conflicts by keeping master versions of bot.rs (permission
handling), ChatInput.tsx, and fs.rs. Removed duplicate list_project_files
endpoint and tests from io.rs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:29:37 +00:00
Dave 1bae7bd223 story-kit: create 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:21:55 +00:00
Dave a0091e81f9 story-kit: create 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:21:33 +00:00
Dave beb5ea9f53 fix: revert broken auto-merge of 266 in bot.rs
The mergemaster's auto-resolver inserted a duplicate chat_stream call
inside the tokio::select! permission loop, producing mismatched braces.
The 266 merge didn't contribute useful code changes to bot.rs — the
session_id handling was already present.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:20:40 +00:00
Dave 89e96dc0a6 story-kit: done 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:18:50 +00:00
Dave 0c686ba170 story-kit: merge 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:18:49 +00:00
Dave 74dc42c1fc story-kit: add 5_done to commit-worthy stages
Keep done stage committed so accepted work is in git history.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:13:35 +00:00
Dave a3d22fd874 story-kit: gitignore intermediate pipeline stages (spike 92 follow-up)
Ignore 2_current/, 3_qa/, and 4_merge/ in git since spike 92 stopped
committing intermediate pipeline moves. Keep 5_done/ tracked so
accepted work is in git history before sweep to archived.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:13:10 +00:00
Dave 8561910cd8 story-kit: start 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:09:26 +00:00
Dave e569c1bcad story-kit: start 266_story_matrix_bot_structured_conversation_history 2026-03-18 10:08:19 +00:00
Dave 4dcb24d5dd story-kit: queue 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response for merge 2026-03-18 10:07:12 +00:00
Dave 59f37e13b9 story-kit: done 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-03-18 10:07:05 +00:00
Dave 3a1d7012b4 spike(92): stop auto-committing intermediate pipeline moves
Filter flush_pending() to only git-commit for terminal stages
(1_upcoming and 6_archived) while still broadcasting WatcherEvents
for all stages so the frontend stays in sync.

Reduces pipeline commits from 5+ to 2 per story run. No system
dependencies on intermediate commits were found.

Preserves merge_failure front matter cleanup from master.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:06:58 +00:00
Dave 41b24e4b7a story-kit: queue 266_story_matrix_bot_structured_conversation_history for merge 2026-03-18 10:05:09 +00:00
Dave 06948dae74 story-kit: queue 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response for QA 2026-03-18 10:03:09 +00:00
Dave bbd4aee828 story-kit: start 271_story_show_assigned_agent_in_expanded_work_item_view 2026-03-18 10:03:06 +00:00
Dave d40f007818 story-kit: start 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 10:01:54 +00:00
Dave 3819a02159 story-kit: start 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 10:01:54 +00:00
Dave 9b65845c90 story-kit: start 277_story_matrix_bot_uses_its_configured_name_instead_of_claude 2026-03-18 10:01:52 +00:00
Dave 28176727d7 story-kit: queue 271_story_show_assigned_agent_in_expanded_work_item_view for merge 2026-03-18 10:00:38 +00:00
Dave 1d59cdcc25 story-kit: start 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-18 10:00:28 +00:00
Dave edc6b9ea05 story-kit: queue 271_story_show_assigned_agent_in_expanded_work_item_view for merge 2026-03-18 09:57:30 +00:00
Dave 8e4a8ce57a story-kit: queue 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent for merge 2026-03-18 09:54:32 +00:00
Dave c863ee4135 story-kit: queue 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent for merge 2026-03-18 09:53:48 +00:00
Dave dd4a1140fe story-kit: queue 278_story_auto_assign_agents_to_pipeline_items_on_server_startup for merge 2026-03-18 09:49:53 +00:00
Dave 895317330b story-kit: queue 278_story_auto_assign_agents_to_pipeline_items_on_server_startup for merge 2026-03-18 09:48:57 +00:00
Dave 11e32f9802 story-kit: queue 277_story_matrix_bot_uses_its_configured_name_instead_of_claude for merge 2026-03-18 09:44:22 +00:00
Dave 8b7ff6383f story-kit: queue 277_story_matrix_bot_uses_its_configured_name_instead_of_claude for merge 2026-03-18 09:43:30 +00:00
Dave 964a8bfcff story-kit: queue 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response for merge 2026-03-18 09:41:34 +00:00
Dave 978b84893c story-kit: queue 266_story_matrix_bot_structured_conversation_history for merge 2026-03-18 09:39:58 +00:00
Dave 7dd6821dc5 story-kit: queue 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response for merge 2026-03-18 09:38:05 +00:00
Dave 6abf5c87b2 story-kit: done 247_story_human_qa_gate_with_rejection_flow 2026-03-18 09:37:38 +00:00
Dave b682c67f97 story-kit: queue 278_story_auto_assign_agents_to_pipeline_items_on_server_startup for QA 2026-03-18 09:35:50 +00:00
Dave 81309a5559 story-kit: queue 277_story_matrix_bot_uses_its_configured_name_instead_of_claude for QA 2026-03-18 09:35:49 +00:00
Dave 2006ad6d8c story-kit: queue 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent for QA 2026-03-18 09:35:45 +00:00
Dave 41bafb80e4 story-kit: accept 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat 2026-03-18 09:33:21 +00:00
Dave 569380e133 story-kit: done 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat 2026-03-18 09:32:20 +00:00
Dave 10a5bea2b1 story-kit: merge 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat 2026-03-18 09:32:17 +00:00
Dave 110815c1c5 story-kit: queue 247_story_human_qa_gate_with_rejection_flow for merge 2026-03-18 09:31:02 +00:00
Dave 29fc761980 fix: skip frontend tests when frontend dir absent in sparse worktrees
script/test unconditionally cd'd into frontend/ and ran npm test, which
failed in sparse-checkout worktrees that only contain the server/ subtree.
Guard the frontend step with a directory existence check so acceptance
gates pass for worktrees that have no frontend checkout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 09:30:51 +00:00
Dave d537aceb63 story-kit: start 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 09:29:43 +00:00
Dave 72b89c8ccc story-kit: start 277_story_matrix_bot_uses_its_configured_name_instead_of_claude 2026-03-18 09:29:27 +00:00
Dave e19de02967 story-kit: start 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent 2026-03-18 09:29:00 +00:00
Dave 1c5f13e7eb story-kit: create 279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent 2026-03-18 09:28:33 +00:00
Dave 816c771a2a story-kit: queue 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat for merge 2026-03-18 09:28:30 +00:00
Dave 642a8486cd story-kit: queue 266_story_matrix_bot_structured_conversation_history for QA 2026-03-18 09:25:33 +00:00
Dave 605bcadea7 story-kit: done 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-18 09:25:29 +00:00
Dave ccc1ead8c9 story-kit: remove 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-18 09:25:07 +00:00
Dave 8bbbe8fbdd story-kit: start 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-18 09:25:01 +00:00
Dave d9775834ed story-kit: queue 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat for QA 2026-03-18 09:22:43 +00:00
Dave c32f0dce45 story-kit: queue 274_story_mcp_pipeline_status_tool_with_agent_assignments for merge 2026-03-18 09:22:39 +00:00
Dave d864941665 story-kit: start 266_story_matrix_bot_structured_conversation_history 2026-03-18 09:21:40 +00:00
Dave 9c2d831c65 story-kit: create 266_story_matrix_bot_structured_conversation_history 2026-03-18 09:21:26 +00:00
Dave 2ab91f933f story-kit: create 266_story_matrix_bot_structured_conversation_history 2026-03-18 09:21:00 +00:00
Dave 1fcb8cb332 story-kit: create 266_story_matrix_bot_structured_conversation_history 2026-03-18 09:20:36 +00:00
Dave 3439c16e66 story-kit: create 278_story_auto_assign_agents_to_pipeline_items_on_server_startup 2026-03-18 09:18:23 +00:00
Dave ce93987da8 story-kit: queue 274_story_mcp_pipeline_status_tool_with_agent_assignments for merge 2026-03-18 09:15:01 +00:00
Dave bd7b7cc34a story-kit: create 277_story_matrix_bot_uses_its_configured_name_instead_of_claude 2026-03-18 09:09:49 +00:00
Dave 855452b4a2 story-kit: queue 274_story_mcp_pipeline_status_tool_with_agent_assignments for merge 2026-03-18 09:09:06 +00:00
Dave 1fcfa9123f story-kit: queue 274_story_mcp_pipeline_status_tool_with_agent_assignments for merge 2026-03-18 09:07:42 +00:00
Dave e66b811436 story-kit: queue 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response for merge 2026-03-18 09:06:00 +00:00
Dave 8d5fa85a3a story-kit: accept 264_bug_claude_code_session_id_not_persisted_across_browser_refresh 2026-03-18 09:05:30 +00:00
Dave a4e7a23ca6 story-kit: queue 274_story_mcp_pipeline_status_tool_with_agent_assignments for QA 2026-03-17 18:43:05 +00:00
Dave b67eea7b9a story-kit: queue 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response for QA 2026-03-17 18:42:03 +00:00
Dave 4a89b46857 story-kit: start 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat 2026-03-17 18:33:23 +00:00
Dave 047bf83b76 story-kit: start 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-17 18:32:43 +00:00
Dave 62aa142409 story-kit: start 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-17 18:32:37 +00:00
Dave c93a2e80f9 story-kit: queue 92_spike_stop_auto_committing_intermediate_pipeline_moves for QA 2026-03-17 18:32:30 +00:00
Dave 9176fe3303 story-kit: create 276_story_detect_and_log_when_root_mcp_json_port_is_modified 2026-03-17 18:26:07 +00:00
Dave 296a59def3 story-kit: create 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat 2026-03-17 18:23:52 +00:00
Dave 90bb2fb137 story-kit: done 272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage 2026-03-17 18:21:59 +00:00
Dave bc0bb91a83 story-kit: merge 272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage 2026-03-17 18:21:56 +00:00
Dave 0b39b2acfc story-kit: create 275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat 2026-03-17 18:21:40 +00:00
Dave 75c27f5853 story-kit: create 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-17 18:18:29 +00:00
Dave 349866606c story-kit: done 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port 2026-03-17 18:16:30 +00:00
Dave 901f7a65d3 story-kit: merge 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port 2026-03-17 18:16:13 +00:00
Dave c52b41b99c story-kit: queue 272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage for merge 2026-03-17 18:15:18 +00:00
Dave ec76005c63 story-kit: create 274_story_mcp_pipeline_status_tool_with_agent_assignments 2026-03-17 18:10:26 +00:00
Dave 1736f8d924 story-kit: queue 92_spike_stop_auto_committing_intermediate_pipeline_moves for QA 2026-03-17 18:08:42 +00:00
Dave f8b5e11c27 story-kit: done 269_story_file_references_in_web_ui_chat_input 2026-03-17 18:04:48 +00:00
Dave 12c500ee90 story-kit: remove 269_story_file_references_in_web_ui_chat_input 2026-03-17 18:03:21 +00:00
Dave 81c9cf797f story-kit: done 269_story_file_references_in_web_ui_chat_input 2026-03-17 18:03:10 +00:00
Dave d18c1105c7 story-kit: start 269_story_file_references_in_web_ui_chat_input 2026-03-17 18:01:09 +00:00
Dave ca8e6dc51c story-kit: accept 245_bug_chat_history_persistence_lost_on_page_refresh_story_145_regression 2026-03-17 17:58:30 +00:00
Dave 30ad59c6eb story-kit: queue 269_story_file_references_in_web_ui_chat_input for merge 2026-03-17 17:57:29 +00:00
Dave 123f140244 story-kit: start 269_story_file_references_in_web_ui_chat_input 2026-03-17 17:56:24 +00:00
Dave 8db23f77cd story-kit: start 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-03-17 17:55:34 +00:00
Dave 6bfa10b0e5 story-kit: queue 269_story_file_references_in_web_ui_chat_input for merge 2026-03-17 17:55:15 +00:00
Dave 65036b2ce7 story-kit: start 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-03-17 17:54:03 +00:00
Dave 76d73b2d0b story-kit: gitignore matrix_history.json
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 17:53:33 +00:00
Dave 78618a1b76 story-kit: queue 269_story_file_references_in_web_ui_chat_input for merge 2026-03-17 17:51:06 +00:00
Dave 47e07b23d1 story-kit: queue 272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage for QA 2026-03-17 17:50:17 +00:00
Dave 45ae7b8f01 story-kit: queue 269_story_file_references_in_web_ui_chat_input for merge 2026-03-17 17:49:46 +00:00
Dave e1c30b5953 story-kit: accept 262_story_bot_error_notifications_for_story_failures 2026-03-17 17:49:07 +00:00
Dave b0d9fb4f39 story-kit: queue 269_story_file_references_in_web_ui_chat_input for merge 2026-03-17 17:47:07 +00:00
Dave dcc11c2b0f story-kit: queue 271_story_show_assigned_agent_in_expanded_work_item_view for QA 2026-03-17 17:46:43 +00:00
Dave 7f21454880 story-kit: queue 269_story_file_references_in_web_ui_chat_input for merge 2026-03-17 17:45:44 +00:00
Dave a893a1cef7 story-kit: merge 266_story_matrix_bot_structured_conversation_history 2026-03-17 17:42:08 +00:00
Dave 3fb48cdf51 story-kit: queue 269_story_file_references_in_web_ui_chat_input for QA 2026-03-17 17:41:55 +00:00
Dave f1bb1216bf story-kit: done 266_story_matrix_bot_structured_conversation_history 2026-03-17 17:41:29 +00:00
Dave b3faf7b810 story-kit: queue 247_story_human_qa_gate_with_rejection_flow for merge 2026-03-17 17:40:54 +00:00
Dave 89e4ee1c9c story-kit: queue 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port for merge 2026-03-17 17:37:50 +00:00
Dave 4df39eb1f2 story-kit: create 273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response 2026-03-17 17:37:41 +00:00
Dave a7d23143ef story-kit: done 267_story_mcp_update_story_tool_should_support_front_matter_fields 2026-03-17 17:36:00 +00:00
Dave f72666b39e story-kit: merge 267_story_mcp_update_story_tool_should_support_front_matter_fields 2026-03-17 17:35:57 +00:00
Dave 1f8ffee38e story-kit: start 272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage 2026-03-17 17:35:23 +00:00
Dave 798f841b9a story-kit: queue 267_story_mcp_update_story_tool_should_support_front_matter_fields for merge 2026-03-17 17:34:26 +00:00
Dave 25c3dbb3d1 story-kit: start 271_story_show_assigned_agent_in_expanded_work_item_view 2026-03-17 17:33:34 +00:00
Dave 71cbc21b01 story-kit: queue 266_story_matrix_bot_structured_conversation_history for merge 2026-03-17 17:31:57 +00:00
Dave 6deeba81a8 story-kit: queue 266_story_matrix_bot_structured_conversation_history for merge 2026-03-17 17:30:53 +00:00
Dave b862a7a6d0 story-kit: queue 267_story_mcp_update_story_tool_should_support_front_matter_fields for merge 2026-03-17 17:29:36 +00:00
Dave fe1f76957d story-kit: queue 267_story_mcp_update_story_tool_should_support_front_matter_fields for merge 2026-03-17 17:28:38 +00:00
Dave 266e676dd4 story-kit: queue 247_story_human_qa_gate_with_rejection_flow for QA 2026-03-17 17:27:04 +00:00
Dave 402159c19a story-kit: queue 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port for QA 2026-03-17 17:26:23 +00:00
Dave 6d1b36e515 story-kit: start 269_story_file_references_in_web_ui_chat_input 2026-03-17 17:25:42 +00:00
Dave 81d4889cee Expand vite watch ignore list to prevent silent crashes on merge
Vite only needs to watch frontend/ sources. Ignore git objects,
Rust source, Cargo files, node_modules, and vendor directories
that change in bulk during squash merges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 17:17:47 +00:00
Dave 0eb2cd8ec3 Stop tracking .mcp.json — it is generated at runtime
The server writes .mcp.json with its current port on startup and
during worktree creation. Tracking it in git causes QA gate failures
when the worktree copy diverges from master (e.g. different port).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 17:15:35 +00:00
Dave b251ed7421 story-kit: create 272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage 2026-03-17 17:14:19 +00:00
Dave 4a600e9954 story-kit: create 271_story_show_assigned_agent_in_expanded_work_item_view 2026-03-17 17:13:08 +00:00
Dave cfb810b061 story-kit: start 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port 2026-03-17 17:10:45 +00:00
Dave 71bd999586 story-kit: create 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port 2026-03-17 17:10:30 +00:00
Dave 10d0cdeeae story-kit: accept 256_story_bot_must_verify_other_users_cross_signing_identity_before_checking_device_verification 2026-03-17 17:09:27 +00:00
Dave 6e375aaab5 story-kit: create 270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port 2026-03-17 17:08:26 +00:00
Dave e7edf9a8d5 story-kit: done 268_refactor_upgrade_tokio_tungstenite_to_0_29_0 2026-03-17 17:02:34 +00:00
Dave 20431f625b story-kit: merge 268_refactor_upgrade_tokio_tungstenite_to_0_29_0 2026-03-17 17:02:31 +00:00
Dave d35f0f19fb story-kit: queue 268_refactor_upgrade_tokio_tungstenite_to_0_29_0 for merge 2026-03-17 16:59:54 +00:00
Dave 4303b33b90 story-kit: queue 266_story_matrix_bot_structured_conversation_history for QA 2026-03-17 16:58:19 +00:00
Dave f9c0d24d7a story-kit: accept 259_story_move_story_kit_ignores_into_story_kit_gitignore 2026-03-17 16:57:12 +00:00
Dave ec3277234c story-kit: queue 267_story_mcp_update_story_tool_should_support_front_matter_fields for QA 2026-03-17 16:53:12 +00:00
Dave 0a28aae041 story-kit: queue 268_refactor_upgrade_tokio_tungstenite_to_0_29_0 for QA 2026-03-17 16:47:46 +00:00
Dave a7a8358cbb story-kit: create 269_story_file_references_in_web_ui_chat_input 2026-03-17 16:46:55 +00:00
Dave 6b6cb525a7 story-kit: start 268_refactor_upgrade_tokio_tungstenite_to_0_29_0 2026-03-17 16:43:45 +00:00
Dave 27465b1130 story-kit: create 268_refactor_upgrade_tokio_tungstenite_to_0_29_0 2026-03-17 16:43:34 +00:00
Dave e74c370c7e Improve release changelog and fix MCP port
Generate structured changelogs from completed stories instead of raw
commit messages. Group by features, bug fixes, and refactors. Filter
out story-kit automation commits.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 16:42:48 +00:00
Dave 8defd5c671 story-kit: start 267_story_mcp_update_story_tool_should_support_front_matter_fields 2026-03-17 16:42:08 +00:00
Dave a5c4fb553a story-kit: create 267_story_mcp_update_story_tool_should_support_front_matter_fields 2026-03-17 16:41:47 +00:00
Dave a7772d1421 story-kit: start 247_story_human_qa_gate_with_rejection_flow 2026-03-17 16:41:27 +00:00
Dave ed967403fb story-kit: start 247_story_human_qa_gate_with_rejection_flow 2026-03-17 16:40:09 +00:00
Dave 998b188ac7 story-kit: start 266_story_matrix_bot_structured_conversation_history 2026-03-17 16:39:42 +00:00
Dave 115c9fd6df story-kit: done 265_story_spikes_skip_merge_and_stop_for_human_review 2026-03-17 16:36:03 +00:00
Dave 86694a4383 story-kit: merge 265_story_spikes_skip_merge_and_stop_for_human_review 2026-03-17 16:36:00 +00:00
Dave 7b324ea96e story-kit: accept 257_story_rename_storkit_to_story_kit_in_header 2026-03-17 16:35:37 +00:00
Dave 744a12eeea story-kit: queue 265_story_spikes_skip_merge_and_stop_for_human_review for merge 2026-03-17 16:33:37 +00:00
689 changed files with 62959 additions and 25541 deletions
+16 -6
View File
@@ -1,12 +1,12 @@
{ {
"enabledMcpjsonServers": [ "enabledMcpjsonServers": [
"story-kit" "huskies"
], ],
"permissions": { "permissions": {
"allow": [ "allow": [
"Bash(./server/target/debug/story-kit:*)", "Bash(./server/target/debug/huskies:*)",
"Bash(./target/debug/story-kit:*)", "Bash(./target/debug/huskies:*)",
"Bash(STORYKIT_PORT=*)", "Bash(HUSKIES_PORT=*)",
"Bash(cargo build:*)", "Bash(cargo build:*)",
"Bash(cargo check:*)", "Bash(cargo check:*)",
"Bash(cargo clippy:*)", "Bash(cargo clippy:*)",
@@ -56,11 +56,21 @@
"WebFetch(domain:portkey.ai)", "WebFetch(domain:portkey.ai)",
"WebFetch(domain:www.shuttle.dev)", "WebFetch(domain:www.shuttle.dev)",
"WebSearch", "WebSearch",
"mcp__story-kit__*", "mcp__huskies__*",
"Edit", "Edit",
"Write", "Write",
"Bash(find *)", "Bash(find *)",
"Bash(sqlite3 *)" "Bash(sqlite3 *)",
"Bash(cat <<:*)",
"Bash(cat <<'ENDJSON:*)",
"Bash(make release:*)",
"Bash(npm test:*)",
"Bash(head *)",
"Bash(tail *)",
"Bash(wc *)",
"Bash(npx vite:*)",
"Bash(npm run dev:*)",
"Bash(stat *)"
] ]
} }
} }
+11
View File
@@ -0,0 +1,11 @@
# Docker build context exclusions
**/target/
**/node_modules/
frontend/dist/
.huskies/worktrees/
.huskies/logs/
.huskies/work/6_archived/
.git/
*.swp
*.swo
.DS_Store
+9 -2
View File
@@ -1,12 +1,14 @@
# Claude Code # Claude Code
.claude/settings.local.json .claude/settings.local.json
.mcp.json
# Local environment (secrets) # Local environment (secrets)
.env .env
# App specific (root-level; story-kit subdirectory patterns live in .story_kit/.gitignore) # App specific (root-level; huskies subdirectory patterns live in .huskies/.gitignore)
store.json store.json
.story_kit_port .huskies_port
.huskies/bot.toml.bak
# Rust stuff # Rust stuff
target target
@@ -25,6 +27,7 @@ frontend/node_modules
frontend/dist frontend/dist
frontend/dist-ssr frontend/dist-ssr
frontend/test-results frontend/test-results
frontend/serve
frontend/*.local frontend/*.local
server/target server/target
@@ -42,3 +45,7 @@ server/target
*.sln *.sln
*.sw? *.sw?
/test-results/.last-run.json /test-results/.last-run.json
# Ignore old story files until we feel like deleting them
.storkit
.storkit_port
@@ -4,10 +4,25 @@ bot.toml
# Matrix SDK state store # Matrix SDK state store
matrix_store/ matrix_store/
matrix_device_id matrix_device_id
matrix_history.json
# Agent worktrees and merge workspace (managed by the server, not tracked in git) # Agent worktrees and merge workspace (managed by the server, not tracked in git)
worktrees/ worktrees/
merge_workspace/ merge_workspace/
# Intermediate pipeline stages (transient, not committed per spike 92)
work/2_current/
work/3_qa/
work/4_merge/
# Coverage reports (generated by cargo-llvm-cov, not tracked in git) # Coverage reports (generated by cargo-llvm-cov, not tracked in git)
coverage/ coverage/
# Token usage log (generated at runtime, contains cost data)
token_usage.jsonl
# Chat service logs
whatsapp_history.json
# Timers
timers.json
+41 -13
View File
@@ -9,16 +9,22 @@
When you start a new session with this project: When you start a new session with this project:
1. **Check for MCP Tools:** Read `.mcp.json` to discover the MCP server endpoint. Then list available tools by calling: 1. **Check Setup Wizard:** Call `wizard_status` to check if project setup is complete. If the wizard is not complete, guide the user through the remaining steps. Important rules for the wizard flow:
- **Be conversational.** Don't show tool names, step numbers, or raw wizard output to the user.
- **On projects with existing code:** Read the codebase and generate each file, then show the user what you wrote and ask if it looks right.
- **On bare projects with no code:** Ask the user what they want to build, what language/framework they plan to use, and generate files from their answers.
- **You must actually generate the files.** The workflow for each step is: (1) call `wizard_generate` with no args to get a hint, (2) write the file content yourself based on the conversation, (3) call `wizard_generate` again with the `content` argument containing the full file body, (4) show the user what you wrote, (5) call `wizard_confirm` (they approve), `wizard_retry` (they want changes), or `wizard_skip` (they want to skip). Do not stop after discussing — follow through and write the files.
- **Keep moving.** After each step is confirmed, immediately proceed to the next wizard step without waiting for the user to ask.
2. **Check for MCP Tools:** Read `.mcp.json` to discover the MCP server endpoint. Then list available tools by calling:
```bash ```bash
curl -s "$(jq -r '.mcpServers["story-kit"].url' .mcp.json)" \ curl -s "$(jq -r '.mcpServers["huskies"].url' .mcp.json)" \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
``` ```
This returns the full tool catalog (create stories, spawn agents, record tests, manage worktrees, etc.). Familiarize yourself with the available tools before proceeding. These tools allow you to directly manipulate the workflow and spawn subsidiary agents without manual file manipulation. This returns the full tool catalog (create stories, spawn agents, record tests, manage worktrees, etc.). Familiarize yourself with the available tools before proceeding. These tools allow you to directly manipulate the workflow and spawn subsidiary agents without manual file manipulation.
2. **Read Context:** Check `.story_kit/specs/00_CONTEXT.md` for high-level project goals. 3. **Read Context:** Check `.huskies/specs/00_CONTEXT.md` for high-level project goals.
3. **Read Stack:** Check `.story_kit/specs/tech/STACK.md` for technical constraints and patterns. 4. **Read Stack:** Check `.huskies/specs/tech/STACK.md` for technical constraints and patterns.
4. **Check Work Items:** Look at `.story_kit/work/1_upcoming/` and `.story_kit/work/2_current/` to see what work is pending. 5. **Check Work Items:** Look at `.huskies/work/1_backlog/` and `.huskies/work/2_current/` to see what work is pending.
--- ---
@@ -52,7 +58,7 @@ project_root/
├── README.md # This document ├── README.md # This document
├── project.toml # Agent configuration (roles, models, prompts) ├── project.toml # Agent configuration (roles, models, prompts)
├── work/ # Unified work item pipeline (stories, bugs, spikes) ├── work/ # Unified work item pipeline (stories, bugs, spikes)
│ ├── 1_upcoming/ # New work items awaiting implementation │ ├── 1_backlog/ # New work items awaiting implementation
│ ├── 2_current/ # Work in progress │ ├── 2_current/ # Work in progress
│ ├── 3_qa/ # QA review │ ├── 3_qa/ # QA review
│ ├── 4_merge/ # Ready to merge to master │ ├── 4_merge/ # Ready to merge to master
@@ -78,7 +84,7 @@ All work items (stories, bugs, spikes) live in the same `work/` pipeline. Items
Items move through stages by moving the file between directories: Items move through stages by moving the file between directories:
`1_upcoming``2_current``3_qa``4_merge``5_done``6_archived` `1_backlog``2_current``3_qa``4_merge``5_done``6_archived`
Items in `5_done` are auto-swept to `6_archived` after 4 hours by the server. Items in `5_done` are auto-swept to `6_archived` after 4 hours by the server.
@@ -87,7 +93,7 @@ Items in `5_done` are auto-swept to `6_archived` after 4 hours by the server.
The server watches `.story_kit/work/` for changes. When a file is created, moved, or modified, the watcher auto-commits with a deterministic message and broadcasts a WebSocket notification to the frontend. This means: The server watches `.story_kit/work/` for changes. When a file is created, moved, or modified, the watcher auto-commits with a deterministic message and broadcasts a WebSocket notification to the frontend. This means:
* MCP tools only need to write/move files — the watcher handles git commits * MCP tools only need to write/move files — the watcher handles git commits
* IDE drag-and-drop works (drag a story from `1_upcoming/` to `2_current/`) * IDE drag-and-drop works (drag a story from `1_backlog/` to `2_current/`)
* The frontend updates automatically without manual refresh * The frontend updates automatically without manual refresh
--- ---
@@ -156,7 +162,7 @@ Not everything needs to be a full story. Simple bugs can skip the story process:
* Performance issues with known fixes * Performance issues with known fixes
### Bug Process ### Bug Process
1. **Document Bug:** Create a bug file in `work/1_upcoming/` named `{id}_bug_{slug}.md` with: 1. **Document Bug:** Create a bug file in `work/1_backlog/` named `{id}_bug_{slug}.md` with:
* **Symptom:** What the user observes * **Symptom:** What the user observes
* **Root Cause:** Technical explanation (if known) * **Root Cause:** Technical explanation (if known)
* **Reproduction Steps:** How to trigger the bug * **Reproduction Steps:** How to trigger the bug
@@ -186,7 +192,7 @@ Not everything needs a story or bug fix. Spikes are time-boxed investigations to
* Need to validate performance constraints * Need to validate performance constraints
### Spike Process ### Spike Process
1. **Document Spike:** Create a spike file in `work/1_upcoming/` named `{id}_spike_{slug}.md` with: 1. **Document Spike:** Create a spike file in `work/1_backlog/` named `{id}_spike_{slug}.md` with:
* **Question:** What you need to answer * **Question:** What you need to answer
* **Hypothesis:** What you expect to be true * **Hypothesis:** What you expect to be true
* **Timebox:** Strict limit for the research * **Timebox:** Strict limit for the research
@@ -209,7 +215,7 @@ When the LLM context window fills up (or the chat gets slow/confused):
1. **Stop Coding.** 1. **Stop Coding.**
2. **Instruction:** Tell the user to open a new chat. 2. **Instruction:** Tell the user to open a new chat.
3. **Handoff:** The only context the new LLM needs is in the `specs/` folder and `.mcp.json`. 3. **Handoff:** The only context the new LLM needs is in the `specs/` folder and `.mcp.json`.
* *Prompt for New Session:* "I am working on Project X. Read `.mcp.json` to discover available tools, then read `specs/00_CONTEXT.md` and `specs/tech/STACK.md`. Then look at `work/1_upcoming/` and `work/2_current/` to see what is pending." * *Prompt for New Session:* "I am working on Project X. Read `.mcp.json` to discover available tools, then read `specs/00_CONTEXT.md` and `specs/tech/STACK.md`. Then look at `work/1_backlog/` and `work/2_current/` to see what is pending."
--- ---
@@ -221,14 +227,36 @@ If a user hands you this document and says "Apply this process to my project":
1. **Check for MCP Tools:** Look for `.mcp.json` in the project root. If it exists, you have programmatic access to workflow tools and agent spawning capabilities. 1. **Check for MCP Tools:** Look for `.mcp.json` in the project root. If it exists, you have programmatic access to workflow tools and agent spawning capabilities.
2. **Analyze the Request:** Ask for the high-level goal ("What are we building?") and the tech preferences ("Rust or Python?"). 2. **Analyze the Request:** Ask for the high-level goal ("What are we building?") and the tech preferences ("Rust or Python?").
3. **Git Check:** Check if the directory is a git repository (`git status`). If not, run `git init`. 3. **Git Check:** Check if the directory is a git repository (`git status`). If not, run `git init`.
4. **Scaffold:** Run commands to create the `work/` and `specs/` folders with the 6-stage pipeline (`work/1_upcoming/` through `work/6_archived/`). 4. **Scaffold:** Run commands to create the `work/` and `specs/` folders with the 6-stage pipeline (`work/1_backlog/` through `work/6_archived/`).
5. **Draft Context:** Write `specs/00_CONTEXT.md` based on the user's answer. 5. **Draft Context:** Write `specs/00_CONTEXT.md` based on the user's answer.
6. **Draft Stack:** Write `specs/tech/STACK.md` based on best practices for that language. 6. **Draft Stack:** Write `specs/tech/STACK.md` based on best practices for that language.
7. **Wait:** Ask the user for "Story #1". 7. **Wait:** Ask the user for "Story #1".
--- ---
## 6. Code Quality ## 6. Chat Bot Configuration
Story Kit includes a chat bot that can be connected to one messaging platform at a time. The bot handles commands, LLM conversations, and pipeline notifications.
**Only one transport can be active at a time.** To configure the bot, copy the appropriate example file to `.huskies/bot.toml`:
| Transport | Example file | Webhook endpoint |
|-----------|-------------|-----------------|
| Matrix | `bot.toml.matrix.example` | *(uses Matrix sync, no webhook)* |
| WhatsApp (Meta Cloud API) | `bot.toml.whatsapp-meta.example` | `/webhook/whatsapp` |
| WhatsApp (Twilio) | `bot.toml.whatsapp-twilio.example` | `/webhook/whatsapp` |
| Slack | `bot.toml.slack.example` | `/webhook/slack` |
```bash
cp .huskies/bot.toml.matrix.example .huskies/bot.toml
# Edit bot.toml with your credentials
```
The `bot.toml` file is gitignored (it contains secrets). The example files are checked in for reference.
---
## 7. Code Quality
**MANDATORY:** Before completing Step 3 (Verification) of any story, you MUST run all applicable linters, formatters, and test suites and fix ALL errors and warnings. Zero tolerance for warnings or errors. **MANDATORY:** Before completing Step 3 (Verification) of any story, you MUST run all applicable linters, formatters, and test suites and fix ALL errors and warnings. Zero tolerance for warnings or errors.
+26
View File
@@ -0,0 +1,26 @@
# Matrix Transport
# Copy this file to bot.toml and fill in your values.
# Only one transport can be active at a time.
enabled = true
transport = "matrix"
homeserver = "https://matrix.example.com"
username = "@botname:example.com"
password = "your-bot-password"
# List one or more rooms to listen in.
room_ids = ["!roomid:example.com"]
# Users allowed to interact with the bot (fail-closed: empty = nobody).
allowed_users = ["@youruser:example.com"]
# Bot display name in chat.
# display_name = "Assistant"
# Maximum conversation turns to remember per room (default: 20).
# history_size = 20
# Rooms where the bot responds to all messages (not just addressed ones).
# This list is updated automatically when users toggle ambient mode at runtime.
# ambient_rooms = ["!roomid:example.com"]
+23
View File
@@ -0,0 +1,23 @@
# Slack Transport
# Copy this file to bot.toml and fill in your values.
# Only one transport can be active at a time.
#
# Setup:
# 1. Create a Slack App at api.slack.com/apps
# 2. Add OAuth scopes: chat:write, chat:update
# 3. Subscribe to bot events: message.channels, message.groups, message.im
# 4. Install the app to your workspace
# 5. Set your webhook URL in Event Subscriptions: https://your-server/webhook/slack
enabled = true
transport = "slack"
slack_bot_token = "xoxb-..."
slack_signing_secret = "your-signing-secret"
slack_channel_ids = ["C01ABCDEF"]
# Bot display name (used in formatted messages).
# display_name = "Assistant"
# Maximum conversation turns to remember per channel (default: 20).
# history_size = 20
+33
View File
@@ -0,0 +1,33 @@
# WhatsApp Transport (Meta Cloud API)
# Copy this file to bot.toml and fill in your values.
# Only one transport can be active at a time.
#
# Setup:
# 1. Create a Meta Business App at developers.facebook.com
# 2. Add the WhatsApp product
# 3. Copy your Phone Number ID and generate a permanent access token
# 4. Register your webhook URL: https://your-server/webhook/whatsapp
# 5. Set the verify token below to match what you configure in Meta's dashboard
enabled = true
transport = "whatsapp"
whatsapp_provider = "meta"
whatsapp_phone_number_id = "123456789012345"
whatsapp_access_token = "EAAx..."
whatsapp_verify_token = "my-secret-verify-token"
# Optional: name of the approved Meta message template used for notifications
# sent outside the 24-hour messaging window (default: "pipeline_notification").
# whatsapp_notification_template = "pipeline_notification"
# Bot display name (used in formatted messages).
# display_name = "Assistant"
# Maximum conversation turns to remember per user (default: 20).
# history_size = 20
# Optional: restrict which phone numbers can interact with the bot.
# When set, only listed numbers are processed; all others are silently ignored.
# When absent or empty, all numbers are allowed (open by default).
# whatsapp_allowed_phones = ["+15551234567", "+15559876543"]
+29
View File
@@ -0,0 +1,29 @@
# WhatsApp Transport (Twilio)
# Copy this file to bot.toml and fill in your values.
# Only one transport can be active at a time.
#
# Setup:
# 1. Sign up at twilio.com
# 2. Activate the WhatsApp sandbox (Messaging > Try it out > Send a WhatsApp message)
# 3. Send the sandbox join code from your WhatsApp to the sandbox number
# 4. Copy your Account SID, Auth Token, and sandbox number below
# 5. Set your webhook URL in the Twilio console: https://your-server/webhook/whatsapp
enabled = true
transport = "whatsapp"
whatsapp_provider = "twilio"
twilio_account_sid = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
twilio_auth_token = "your_auth_token"
twilio_whatsapp_number = "+14155238886"
# Bot display name (used in formatted messages).
# display_name = "Assistant"
# Maximum conversation turns to remember per user (default: 20).
# history_size = 20
# Optional: restrict which phone numbers can interact with the bot.
# When set, only listed numbers are processed; all others are silently ignored.
# When absent or empty, all numbers are allowed (open by default).
# whatsapp_allowed_phones = ["+15551234567", "+15559876543"]
+28
View File
@@ -0,0 +1,28 @@
# Problems
Recurring issues observed during pipeline operation. Review periodically and create stories for systemic problems.
## 2026-03-18: Stories graduating to "done" with empty merges (7 of 10)
Pipeline allows stories to move through coding → QA → merge → done without any actual code changes landing on master. The squash-merge produces an empty diff but the pipeline still marks the story as done. Affected stories: 247, 273, 274, 278, 279, 280, 92. Only 266, 271, 277, and 281 actually shipped code. Root cause: no check that the merge commit contains a non-empty diff. Filed bug 283 for the manual_qa gate issue specifically, but the empty-merge-to-done problem is broader and needs its own fix.
## 2026-03-18: Agent committed directly to master instead of worktree
Multiple agents have committed directly to master instead of their worktree/feature branch:
- Commit `5f4591f` ("fix: update should_commit_stage test to match 5_done") — likely mergemaster
- Commit `a32cfbd` ("Add bot-level command registry with help command") — story 285 coder committed code + Cargo.lock directly to master
Agents should only commit to their feature branch or merge-queue branch, never to master directly. Suspect agents are running `git commit` in the project root instead of the worktree directory. This can also revert uncommitted fixes on master (e.g. project.toml pkill fix was overwritten). Frequency: at least 2 confirmed cases. This is a recurring and serious problem — needs a guard in the server or agent prompts.
## 2026-03-19: Auto-assign re-assigns mergemaster to failed merge stories in a loop
After bug 295 fix (`auto_assign_available_work` after every pipeline advance), mergemaster gets re-assigned to stories that already have a merge failure flag. Story 310 had an empty diff merge failure — mergemaster correctly reported the failure, but auto-assign immediately re-assigned mergemaster to the same story, creating an infinite retry loop. The auto-assign logic needs to check for the `merge_failure` front matter flag before re-assigning agents to stories in `4_merge/`.
## 2026-03-19: Coder produces no code (complete ghost — story 310)
Story 310 (Bot delete command) went through the full pipeline — coder session ran, passed QA/gates, moved to merge — but the coder produced zero code. No commits on the feature branch, no commits on master. The entire agent session was a no-op. This is different from the "committed to master instead of worktree" problem — in this case, the coder simply did nothing. Need to investigate the coder logs to understand what happened. The empty-diff merge check would catch this at merge time, but ideally the server should detect "coder finished with no commits on feature branch" at the gate-check stage and fail early.
## 2026-03-19: Auto-assign assigns mergemaster to coding-stage stories
Auto-assign picked mergemaster for story 310 which was in `2_current/`. Mergemaster should only work on stories in `4_merge/`. The `auto_assign_available_work` function doesn't enforce that the agent's configured stage matches the pipeline stage of the story it's being assigned to. Story 279 (auto-assign respects agent stage from front matter) was supposed to fix this, but the check may only apply to front-matter preferences, not the fallback assignment path.
+343
View File
@@ -0,0 +1,343 @@
# Project-wide default QA mode: "server", "agent", or "human".
# Per-story `qa` front matter overrides this setting.
default_qa = "server"
# Default model for coder agents. Only agents with this model are auto-assigned.
# Opus coders are reserved for explicit per-story `agent:` front matter requests.
default_coder_model = "sonnet"
# Maximum concurrent coder agents. Stories wait in 2_current/ when all slots are full.
max_coders = 3
# Maximum retries per story per pipeline stage before marking as blocked.
# Set to 0 to disable retry limits.
max_retries = 3
# Base branch name for this project. Worktree creation, merges, and agent prompts
# use this value for {{base_branch}}. When not set, falls back to auto-detection
# (reads current HEAD branch).
base_branch = "master"
[[component]]
name = "frontend"
path = "frontend"
setup = ["npm ci", "npm run build"]
teardown = []
[[component]]
name = "server"
path = "."
setup = ["mkdir -p frontend/dist", "cargo check"]
teardown = []
[[agent]]
name = "coder-1"
stage = "coder"
role = "Full-stack engineer. Implements features across all components."
model = "sonnet"
max_turns = 50
max_budget_usd = 5.00
prompt = "You are working in a git worktree on story {{story_id}}. Read CLAUDE.md first, then .story_kit/README.md to understand the dev process. The story details are in your prompt above. Follow the SDTW process through implementation and verification (Steps 1-3). The worktree and feature branch already exist - do not create them. Check .mcp.json for MCP tools. Do NOT accept the story or merge - commit your work and stop. If the user asks to review your changes, tell them to run: cd \"{{worktree_path}}\" && git difftool {{base_branch}}...HEAD\n\nIMPORTANT: Commit all your work before your process exits. The server will automatically run acceptance gates (cargo clippy + tests) when your process exits and advance the pipeline based on the results.\n\n## Bug Workflow: Root Cause First\nWhen working on bugs:\n1. Investigate the root cause before writing any fix. Use `git bisect` to find the breaking commit or `git log` to trace history. Read the relevant code before touching anything.\n2. Fix the root cause with a surgical, minimal change. Do NOT add new abstractions, wrappers, or workarounds when a targeted fix to the original code is possible.\n3. Write commit messages that explain what broke and why, not just what was changed.\n4. If you cannot determine the root cause after thorough investigation, document what you tried and why it was inconclusive — do not guess and ship a speculative fix."
system_prompt = "You are a full-stack engineer working autonomously in a git worktree. Follow the Story-Driven Test Workflow strictly. Run cargo clippy --all-targets --all-features and biome checks before considering work complete. Commit all your work before finishing - use a descriptive commit message. Do not accept stories, move them to archived, or merge to master - a human will do that. Do not coordinate with other agents - focus on your assigned story. The server automatically runs acceptance gates when your process exits. For bugs, always find and fix the root cause. Use git bisect to find breaking commits. Do not layer new code on top of existing code when a surgical fix is possible. If root cause is unclear after investigation, document what you tried rather than guessing."
[[agent]]
name = "coder-2"
stage = "coder"
role = "Full-stack engineer. Implements features across all components."
model = "sonnet"
max_turns = 50
max_budget_usd = 5.00
prompt = "You are working in a git worktree on story {{story_id}}. Read CLAUDE.md first, then .story_kit/README.md to understand the dev process. The story details are in your prompt above. Follow the SDTW process through implementation and verification (Steps 1-3). The worktree and feature branch already exist - do not create them. Check .mcp.json for MCP tools. Do NOT accept the story or merge - commit your work and stop. If the user asks to review your changes, tell them to run: cd \"{{worktree_path}}\" && git difftool {{base_branch}}...HEAD\n\nIMPORTANT: Commit all your work before your process exits. The server will automatically run acceptance gates (cargo clippy + tests) when your process exits and advance the pipeline based on the results.\n\n## Bug Workflow: Root Cause First\nWhen working on bugs:\n1. Investigate the root cause before writing any fix. Use `git bisect` to find the breaking commit or `git log` to trace history. Read the relevant code before touching anything.\n2. Fix the root cause with a surgical, minimal change. Do NOT add new abstractions, wrappers, or workarounds when a targeted fix to the original code is possible.\n3. Write commit messages that explain what broke and why, not just what was changed.\n4. If you cannot determine the root cause after thorough investigation, document what you tried and why it was inconclusive — do not guess and ship a speculative fix."
system_prompt = "You are a full-stack engineer working autonomously in a git worktree. Follow the Story-Driven Test Workflow strictly. Run cargo clippy --all-targets --all-features and biome checks before considering work complete. Commit all your work before finishing - use a descriptive commit message. Do not accept stories, move them to archived, or merge to master - a human will do that. Do not coordinate with other agents - focus on your assigned story. The server automatically runs acceptance gates when your process exits. For bugs, always find and fix the root cause. Use git bisect to find breaking commits. Do not layer new code on top of existing code when a surgical fix is possible. If root cause is unclear after investigation, document what you tried rather than guessing."
[[agent]]
name = "coder-3"
stage = "coder"
role = "Full-stack engineer. Implements features across all components."
model = "sonnet"
max_turns = 50
max_budget_usd = 5.00
prompt = "You are working in a git worktree on story {{story_id}}. Read CLAUDE.md first, then .story_kit/README.md to understand the dev process. The story details are in your prompt above. Follow the SDTW process through implementation and verification (Steps 1-3). The worktree and feature branch already exist - do not create them. Check .mcp.json for MCP tools. Do NOT accept the story or merge - commit your work and stop. If the user asks to review your changes, tell them to run: cd \"{{worktree_path}}\" && git difftool {{base_branch}}...HEAD\n\nIMPORTANT: Commit all your work before your process exits. The server will automatically run acceptance gates (cargo clippy + tests) when your process exits and advance the pipeline based on the results.\n\n## Bug Workflow: Root Cause First\nWhen working on bugs:\n1. Investigate the root cause before writing any fix. Use `git bisect` to find the breaking commit or `git log` to trace history. Read the relevant code before touching anything.\n2. Fix the root cause with a surgical, minimal change. Do NOT add new abstractions, wrappers, or workarounds when a targeted fix to the original code is possible.\n3. Write commit messages that explain what broke and why, not just what was changed.\n4. If you cannot determine the root cause after thorough investigation, document what you tried and why it was inconclusive — do not guess and ship a speculative fix."
system_prompt = "You are a full-stack engineer working autonomously in a git worktree. Follow the Story-Driven Test Workflow strictly. Run cargo clippy --all-targets --all-features and biome checks before considering work complete. Commit all your work before finishing - use a descriptive commit message. Do not accept stories, move them to archived, or merge to master - a human will do that. Do not coordinate with other agents - focus on your assigned story. The server automatically runs acceptance gates when your process exits. For bugs, always find and fix the root cause. Use git bisect to find breaking commits. Do not layer new code on top of existing code when a surgical fix is possible. If root cause is unclear after investigation, document what you tried rather than guessing."
[[agent]]
name = "qa-2"
stage = "qa"
role = "Reviews coder work in worktrees: runs quality gates, verifies acceptance criteria, and reports findings."
model = "sonnet"
max_turns = 40
max_budget_usd = 4.00
prompt = """You are the QA agent for story {{story_id}}. Your job is to verify the coder's work satisfies the story's acceptance criteria and produce a structured QA report.
Read CLAUDE.md first, then .story_kit/README.md to understand the dev process.
## Your Workflow
### 0. Read the Story
- Read the story file at `.huskies/work/3_qa/{{story_id}}.md`
- Extract every acceptance criterion (the `- [ ]` checkbox lines)
- Keep this list in mind for Step 3
### 1. Deterministic Gates (Prerequisites)
Run these first — if any fail, reject immediately without proceeding to AC review:
- Run `cargo clippy --all-targets --all-features` — must show 0 errors, 0 warnings
- Run `cargo test` and verify all tests pass
- If a `frontend/` directory exists:
- Run `npm run build` and note any TypeScript errors
- Run `npx @biomejs/biome check src/` and note any linting issues
- Run `npm test` and verify all frontend tests pass
### 2. Code Change Review
- Run `git diff master...HEAD --stat` to see what files changed
- Run `git diff master...HEAD` to review the actual changes
- Flag any incomplete implementations:
- `todo!()`, `unimplemented!()`, `panic!()` used as stubs
- Placeholder strings like "TODO", "FIXME", "not implemented"
- Empty match arms or arms that just return `Default::default()`
- Hardcoded values where real logic is expected
- Note any obvious coding mistakes (unused imports, dead code, unhandled errors)
### 3. Acceptance Criteria Review
For each AC extracted in Step 0:
- Review the diff and test files to determine if the code addresses this AC
- PASS: describe specifically how the code addresses it (which file/function/test)
- FAIL: explain exactly what is missing or incorrect
An AC fails if:
- No code change or test relates to it
- The implementation is stubbed out (todo!/unimplemented!)
- A test exists but doesn't actually assert the behaviour described
### 4. Manual Testing Support (only if all gates PASS and all ACs PASS)
- Build the server: run `cargo build` and note success/failure
- If build succeeds: find a free port (try 3010-3020) and attempt to start the server
- Generate a testing plan including:
- URL to visit in the browser
- Things to check in the UI
- curl commands to exercise relevant API endpoints
- Kill the test server when done: `pkill -f 'target.*huskies' || true` (NEVER use `pkill -f huskies` — it kills the vite dev server)
### 5. Produce Structured Report and Verdict
Print your QA report to stdout. Then call `approve_qa` or `reject_qa` via the MCP tool based on the overall result. Use this format:
```
## QA Report for {{story_id}}
### Code Quality
- clippy: PASS/FAIL (details)
- TypeScript build: PASS/FAIL/SKIP (details)
- Biome lint: PASS/FAIL/SKIP (details)
- cargo test: PASS/FAIL (N tests)
- npm test: PASS/FAIL/SKIP (N tests)
- Incomplete implementations: (list any todo!/unimplemented!/stubs found, or "None")
- Other code review findings: (list any issues found, or "None")
### Acceptance Criteria Review
- AC: <criterion text>
Result: PASS/FAIL
Evidence: <how the code addresses it, or what is missing>
(repeat for each AC)
### Manual Testing Plan
- Server URL: http://localhost:PORT (or "Skipped gate/AC failure" or "Build failed")
- Pages to visit: (list, or "N/A")
- Things to check: (list, or "N/A")
- curl commands: (list, or "N/A")
### Overall: PASS/FAIL
Reason: (summary of why it passed or the primary reason it failed)
```
After printing the report:
- If Overall is PASS: call `approve_qa(story_id='{{story_id}}')` via MCP
- If Overall is FAIL: call `reject_qa(story_id='{{story_id}}', notes='<concise reason>')` via MCP so the coder knows exactly what to fix
## Rules
- Do NOT modify any code — read-only review only
- Gates must pass before AC review — a gate failure is an automatic reject
- If any AC is not met, the overall result is FAIL
- Always call approve_qa or reject_qa — never leave the story without a verdict"""
system_prompt = "You are a QA agent. Your job is read-only: run quality gates, verify each acceptance criterion against the diff, and produce a structured QA report. Always call approve_qa or reject_qa via MCP to record your verdict. Do not modify code."
[[agent]]
name = "coder-opus"
stage = "coder"
role = "Senior full-stack engineer for complex tasks. Implements features across all components."
model = "opus"
max_turns = 80
max_budget_usd = 20.00
prompt = "You are working in a git worktree on story {{story_id}}. Read CLAUDE.md first, then .story_kit/README.md to understand the dev process. The story details are in your prompt above. Follow the SDTW process through implementation and verification (Steps 1-3). The worktree and feature branch already exist - do not create them. Check .mcp.json for MCP tools. Do NOT accept the story or merge - commit your work and stop. If the user asks to review your changes, tell them to run: cd \"{{worktree_path}}\" && git difftool {{base_branch}}...HEAD\n\nIMPORTANT: Commit all your work before your process exits. The server will automatically run acceptance gates (cargo clippy + tests) when your process exits and advance the pipeline based on the results.\n\n## Bug Workflow: Root Cause First\nWhen working on bugs:\n1. Investigate the root cause before writing any fix. Use `git bisect` to find the breaking commit or `git log` to trace history. Read the relevant code before touching anything.\n2. Fix the root cause with a surgical, minimal change. Do NOT add new abstractions, wrappers, or workarounds when a targeted fix to the original code is possible.\n3. Write commit messages that explain what broke and why, not just what was changed.\n4. If you cannot determine the root cause after thorough investigation, document what you tried and why it was inconclusive — do not guess and ship a speculative fix."
system_prompt = "You are a senior full-stack engineer working autonomously in a git worktree. You handle complex tasks requiring deep architectural understanding. Follow the Story-Driven Test Workflow strictly. Run cargo clippy --all-targets --all-features and biome checks before considering work complete. Commit all your work before finishing - use a descriptive commit message. Do not accept stories, move them to archived, or merge to master - a human will do that. Do not coordinate with other agents - focus on your assigned story. The server automatically runs acceptance gates when your process exits. For bugs, always find and fix the root cause. Use git bisect to find breaking commits. Do not layer new code on top of existing code when a surgical fix is possible. If root cause is unclear after investigation, document what you tried rather than guessing."
[[agent]]
name = "qa"
stage = "qa"
role = "Reviews coder work in worktrees: runs quality gates, verifies acceptance criteria, and reports findings."
model = "sonnet"
max_turns = 40
max_budget_usd = 4.00
prompt = """You are the QA agent for story {{story_id}}. Your job is to verify the coder's work satisfies the story's acceptance criteria and produce a structured QA report.
Read CLAUDE.md first, then .story_kit/README.md to understand the dev process.
## Your Workflow
### 0. Read the Story
- Read the story file at `.huskies/work/3_qa/{{story_id}}.md`
- Extract every acceptance criterion (the `- [ ]` checkbox lines)
- Keep this list in mind for Step 3
### 1. Deterministic Gates (Prerequisites)
Run these first — if any fail, reject immediately without proceeding to AC review:
- Run `cargo clippy --all-targets --all-features` — must show 0 errors, 0 warnings
- Run `cargo test` and verify all tests pass
- If a `frontend/` directory exists:
- Run `npm run build` and note any TypeScript errors
- Run `npx @biomejs/biome check src/` and note any linting issues
- Run `npm test` and verify all frontend tests pass
### 2. Code Change Review
- Run `git diff master...HEAD --stat` to see what files changed
- Run `git diff master...HEAD` to review the actual changes
- Flag any incomplete implementations:
- `todo!()`, `unimplemented!()`, `panic!()` used as stubs
- Placeholder strings like "TODO", "FIXME", "not implemented"
- Empty match arms or arms that just return `Default::default()`
- Hardcoded values where real logic is expected
- Note any obvious coding mistakes (unused imports, dead code, unhandled errors)
### 3. Acceptance Criteria Review
For each AC extracted in Step 0:
- Review the diff and test files to determine if the code addresses this AC
- PASS: describe specifically how the code addresses it (which file/function/test)
- FAIL: explain exactly what is missing or incorrect
An AC fails if:
- No code change or test relates to it
- The implementation is stubbed out (todo!/unimplemented!)
- A test exists but doesn't actually assert the behaviour described
### 4. Manual Testing Support (only if all gates PASS and all ACs PASS)
- Build the server: run `cargo build` and note success/failure
- If build succeeds: find a free port (try 3010-3020) and attempt to start the server
- Generate a testing plan including:
- URL to visit in the browser
- Things to check in the UI
- curl commands to exercise relevant API endpoints
- Kill the test server when done: `pkill -f 'target.*huskies' || true` (NEVER use `pkill -f huskies` — it kills the vite dev server)
### 5. Produce Structured Report and Verdict
Print your QA report to stdout. Then call `approve_qa` or `reject_qa` via the MCP tool based on the overall result. Use this format:
```
## QA Report for {{story_id}}
### Code Quality
- clippy: PASS/FAIL (details)
- TypeScript build: PASS/FAIL/SKIP (details)
- Biome lint: PASS/FAIL/SKIP (details)
- cargo test: PASS/FAIL (N tests)
- npm test: PASS/FAIL/SKIP (N tests)
- Incomplete implementations: (list any todo!/unimplemented!/stubs found, or "None")
- Other code review findings: (list any issues found, or "None")
### Acceptance Criteria Review
- AC: <criterion text>
Result: PASS/FAIL
Evidence: <how the code addresses it, or what is missing>
(repeat for each AC)
### Manual Testing Plan
- Server URL: http://localhost:PORT (or "Skipped gate/AC failure" or "Build failed")
- Pages to visit: (list, or "N/A")
- Things to check: (list, or "N/A")
- curl commands: (list, or "N/A")
### Overall: PASS/FAIL
Reason: (summary of why it passed or the primary reason it failed)
```
After printing the report:
- If Overall is PASS: call `approve_qa(story_id='{{story_id}}')` via MCP
- If Overall is FAIL: call `reject_qa(story_id='{{story_id}}', notes='<concise reason>')` via MCP so the coder knows exactly what to fix
## Rules
- Do NOT modify any code — read-only review only
- Gates must pass before AC review — a gate failure is an automatic reject
- If any AC is not met, the overall result is FAIL
- Always call approve_qa or reject_qa — never leave the story without a verdict"""
system_prompt = "You are a QA agent. Your job is read-only: run quality gates, verify each acceptance criterion against the diff, and produce a structured QA report. Always call approve_qa or reject_qa via MCP to record your verdict. Do not modify code."
[[agent]]
name = "mergemaster"
stage = "mergemaster"
role = "Merges completed coder work into master, runs quality gates, archives stories, and cleans up worktrees."
model = "opus"
max_turns = 30
max_budget_usd = 5.00
prompt = """You are the mergemaster agent for story {{story_id}}. Your job is to merge the completed coder work into master.
Read CLAUDE.md first, then .story_kit/README.md to understand the dev process.
## Your Workflow
1. Call merge_agent_work(story_id='{{story_id}}') via the MCP tool to trigger the full merge pipeline
2. Review the result: check success, had_conflicts, conflicts_resolved, gates_passed, and gate_output
3. If merge succeeded and gates passed: report success to the human
4. If conflicts were auto-resolved (conflicts_resolved=true) and gates passed: report success, noting which conflicts were resolved
5. If conflicts could not be auto-resolved: **resolve them yourself** in the merge worktree (see below)
6. If merge failed for any other reason: call report_merge_failure(story_id='{{story_id}}', reason='<details>') and report to the human
7. If gates failed after merge: attempt to fix the issues yourself in the merge worktree, then re-trigger merge_agent_work. After 3 fix attempts, call report_merge_failure and stop.
## Resolving Complex Conflicts Yourself
When the auto-resolver fails, you have access to the merge worktree at `.story_kit/merge_workspace/`. Go in there and resolve the conflicts manually:
1. Run `git diff --name-only --diff-filter=U` in the merge worktree to list conflicted files
2. **Build context before touching code.** Run `git log --oneline master...HEAD` on the feature branch to see its commits. Then run `git log --oneline --since="$(git log -1 --format=%ci <feature-branch-base-commit>)" master` to see what landed on master since the branch was created. Read the story files in `.story_kit/work/` for any recently merged stories that touch the same files — this tells you WHY master changed and what must be preserved.
3. Read each conflicted file and understand both sides of the conflict
4. **Understand intent, not just syntax.** The feature branch may be behind master — master's version of shared infrastructure is almost always correct. The feature branch's contribution is the NEW functionality it adds. Your job is to integrate the new into master's structure, not pick one side.
5. Resolve by integrating the feature's new functionality into master's code structure
5. Stage resolved files with `git add`
6. Run `cargo check` (and `npm run build` if frontend changed) to verify compilation
7. If it compiles, commit and re-trigger merge_agent_work
### Common conflict patterns in this project:
**Story file rename/rename conflicts:** Both branches moved the story .md file to different pipeline directories. Resolution: `git rm` both sides — story files in `work/2_current/`, `work/3_qa/`, `work/4_merge/` are gitignored and don't need to be committed.
**bot.rs tokio::select! conflicts:** Master has a `tokio::select!` loop in `handle_message()` that handles permission forwarding (story 275). Feature branches created before story 275 have a simpler direct `provider.chat_stream().await` call. Resolution: KEEP master's tokio::select! loop. Integrate only the feature's new logic (e.g. typing indicators, new callbacks) into the existing loop structure. Do NOT replace the loop with the old direct call.
**Duplicate functions/imports:** The auto-resolver keeps both sides, producing duplicates. Resolution: keep one copy (prefer master's version), delete the duplicate.
**Formatting-only conflicts:** Both sides reformatted the same code differently. Resolution: pick either side (prefer master).
## Fixing Gate Failures
If quality gates fail (cargo clippy, cargo test, npm run build, npm test), attempt to fix issues yourself in the merge worktree.
**Fix yourself (up to 3 attempts total):**
- Syntax errors (missing semicolons, brackets, commas)
- Duplicate definitions from merge artifacts
- Simple type annotation errors
- Unused import warnings flagged by clippy
- Mismatched braces from bad conflict resolution
- Trivial formatting issues that block compilation or linting
**Report to human without attempting a fix:**
- Logic errors or incorrect business logic
- Missing function implementations
- Architectural changes required
- Non-trivial refactoring needed
**Max retry limit:** If gates still fail after 3 fix attempts, call report_merge_failure to record the failure, then stop immediately and report the full gate output to the human.
## CRITICAL Rules
- NEVER manually move story files between pipeline stages (e.g. from 4_merge/ to 5_done/)
- NEVER call accept_story — only merge_agent_work can move stories to done after a successful merge
- When merge fails after exhausting your fix attempts, ALWAYS call report_merge_failure
- Report conflict resolution outcomes clearly
- Report gate failures with full output so the human can act if needed
- The server automatically runs acceptance gates when your process exits"""
system_prompt = "You are the mergemaster agent. Your primary job is to merge feature branches to master. First try the merge_agent_work MCP tool. If the auto-resolver fails on complex conflicts, resolve them yourself in the merge worktree — you are an opus-class agent capable of understanding both sides of a conflict and producing correct merged code. Common patterns: keep master's tokio::select! permission loop in bot.rs, discard story file rename conflicts (gitignored), remove duplicate definitions. After resolving, verify compilation before re-triggering merge. CRITICAL: Never manually move story files or call accept_story. After 3 failed fix attempts, call report_merge_failure and stop."
+43
View File
@@ -0,0 +1,43 @@
# Example project.toml — copy to .huskies/project.toml and customise.
# This file is checked in; project.toml itself is gitignored (it may contain
# instance-specific settings).
# Project-wide default QA mode: "server", "agent", or "human".
# Per-story `qa` front matter overrides this setting.
default_qa = "server"
# Default model for coder agents. Only agents with this model are auto-assigned.
# Opus coders are reserved for explicit per-story `agent:` front matter requests.
default_coder_model = "sonnet"
# Maximum concurrent coder agents. Stories wait in 2_current/ when all slots are full.
max_coders = 3
# Maximum retries per story per pipeline stage before marking as blocked.
# Set to 0 to disable retry limits.
max_retries = 2
# Base branch name for this project. Worktree creation, merges, and agent prompts
# use this value for {{base_branch}}. When not set, falls back to auto-detection
# (reads current HEAD branch).
base_branch = "main"
[[component]]
name = "server"
path = "."
setup = ["cargo build"]
teardown = []
[[agent]]
name = "coder-1"
role = "Full-stack engineer"
stage = "coder"
model = "sonnet"
max_turns = 50
max_budget_usd = 5.00
prompt = """
You are working in a git worktree on story {{story_id}}.
Read CLAUDE.md first, then .huskies/README.md to understand the dev process.
Run: cd "{{worktree_path}}" && git difftool {{base_branch}}...HEAD
Commit all your work before your process exits.
"""
+44
View File
@@ -0,0 +1,44 @@
# Slack Integration Setup
## Bot Configuration
Slack integration is configured via `bot.toml` in the project's `.story_kit/` directory:
```toml
transport = "slack"
display_name = "Huskies"
slack_bot_token = "xoxb-..."
slack_signing_secret = "..."
slack_channel_ids = ["C01ABCDEF"]
```
## Slack App Configuration
### Event Subscriptions
1. In your Slack app settings, enable **Event Subscriptions**.
2. Set the **Request URL** to: `https://<your-host>/webhook/slack`
3. Subscribe to the `message.channels` and `message.im` bot events.
### Slash Commands
Slash commands provide quick access to pipeline commands without mentioning the bot.
1. In your Slack app settings, go to **Slash Commands**.
2. Create the following commands, all pointing to the same **Request URL**: `https://<your-host>/webhook/slack/command`
| Command | Description |
|---------|-------------|
| `/huskies-status` | Show pipeline status and agent availability |
| `/huskies-cost` | Show token spend: 24h total, top stories, and breakdown |
| `/huskies-show` | Display the full text of a work item (e.g. `/huskies-show 42`) |
| `/huskies-git` | Show git status: branch, changes, ahead/behind |
| `/huskies-htop` | Show system and agent process dashboard |
All slash command responses are **ephemeral** — only the user who invoked the command sees the response.
### OAuth & Permissions
Required bot token scopes:
- `chat:write` — send messages
- `commands` — handle slash commands
@@ -118,8 +118,8 @@ To support both Remote and Local models, the system implements a `ModelProvider`
Multiple instances can run simultaneously in different worktrees. To avoid port conflicts: Multiple instances can run simultaneously in different worktrees. To avoid port conflicts:
- **Backend:** Set `STORYKIT_PORT` to a unique port (default is 3001). Example: `STORYKIT_PORT=3002 cargo run` - **Backend:** Set `HUSKIES_PORT` to a unique port (default is 3001). Example: `HUSKIES_PORT=3002 cargo run`
- **Frontend:** Run `npm run dev` from `frontend/`. It auto-selects the next unused port. It reads `STORYKIT_PORT` to know which backend to talk to, so export it before running: `export STORYKIT_PORT=3002 && cd frontend && npm run dev` - **Frontend:** Run `npm run dev` from `frontend/`. It auto-selects the next unused port. It reads `HUSKIES_PORT` to know which backend to talk to, so export it before running: `export HUSKIES_PORT=3002 && cd frontend && npm run dev`
When running in a worktree, use a port that won't conflict with the main instance (3001). Ports 3002+ are good choices. When running in a worktree, use a port that won't conflict with the main instance (3001). Ports 3002+ are good choices.
@@ -0,0 +1,24 @@
---
name: "WhatsApp webhook HMAC signature verification"
retry_count: 3
blocked: true
---
# Story 388: WhatsApp webhook HMAC signature verification
## User Story
As a bot operator, I want incoming WhatsApp webhook requests to be cryptographically verified, so that forged requests from unauthorized sources are rejected.
## Acceptance Criteria
- [ ] Meta webhooks: validate X-Hub-Signature-256 HMAC-SHA256 header using the app secret before processing
- [ ] Twilio webhooks: validate request signature using the auth token before processing
- [ ] Requests with missing or invalid signatures are rejected with 403 Forbidden
- [ ] Verification is fail-closed: if signature checking is configured, unsigned requests are rejected
- [ ] Existing bot.toml config is extended with any needed secrets (e.g. Meta app_secret for HMAC verification)
- [ ] MUST use audited crypto crates (hmac, sha2, sha1, base64) — no hand-rolled cryptographic primitives
## Out of Scope
- TBD
@@ -0,0 +1,40 @@
---
name: "Fly.io Machines API integration for multi-tenant huskies SaaS"
---
# Spike 408: Fly.io Machines API integration for multi-tenant huskies SaaS
## Question
Can we build a working Rust integration that creates and manages per-tenant Fly.io Machines, attaches volumes, injects Claude credentials, and proxies JWT-authenticated HTTP/WebSocket traffic to the right machine?
## Hypothesis
A thin Rust service using `reqwest` for the Machines API and `axum` for the reverse proxy is sufficient. No heavyweight orchestration framework needed.
## Prerequisites
- Fly.io account with API token (set `FLY_API_TOKEN` env var)
- Spike 407 findings reviewed
## Timebox
4 hours
## Investigation Plan
- [ ] Create a minimal Rust crate in `spikes/fly_machines/` — do not touch production code
- [ ] Implement machine lifecycle: create, start, stop, destroy via Fly Machines REST API using `reqwest`
- [ ] Test attaching a persistent volume to a machine and verify it persists across stop/start
- [ ] Test secret injection — pass a dummy `credentials.json` as a Fly secret and verify it's readable inside the machine
- [ ] Sketch the auth proxy: JWT validation → machine lookup → reverse proxy to machine's private IP; verify WebSocket proxying works
- [ ] Measure actual cold start time for a minimal huskies container image
- [ ] Document any API quirks, rate limits, or sharp edges discovered during testing
## Findings
- TBD
## Recommendation
- TBD
@@ -0,0 +1,22 @@
---
name: "Multi-account OAuth token rotation on rate limit"
---
# Story 411: Multi-account OAuth token rotation on rate limit
## User Story
As a huskies user with multiple Claude Max subscriptions, I want the system to automatically rotate to a different account when one gets rate limited, so that agents and chat don't stall out waiting for limits to reset.
## Acceptance Criteria
- [ ] OAuth login flow stores credentials per-account (keyed by email), not overwriting previous accounts
- [ ] GET /oauth/status returns all stored accounts and their status (active, rate-limited, expired)
- [ ] When the active account hits a rate limit, huskies automatically swaps to the next available account's refresh token, refreshes, and retries
- [ ] The bot sends a notification in Matrix/WhatsApp when it swaps accounts
- [ ] If all accounts are rate limited, the bot surfaces a clear message with the time until the earliest reset
- [ ] A new /oauth/authorize login adds to the account pool rather than replacing the current credentials
## Out of Scope
- TBD
@@ -0,0 +1,24 @@
---
name: "Recheck bot command to re-run gates without restarting agent"
---
# Story 412: Recheck bot command to re-run gates without restarting agent
## User Story
As a user, I want to send `recheck <number>` to the bot so that it re-runs acceptance gates on an existing worktree without spawning a new agent, so I can unblock stories that failed due to environment issues without wasting agent turns.
## Acceptance Criteria
- [ ] recheck command is registered in chat/commands/mod.rs and appears in help output
- [ ] `recheck <number>` runs run_acceptance_gates on the story's existing worktree
- [ ] If gates pass, the story advances through the pipeline (same as if a coder completed successfully)
- [ ] If gates fail, the error output is returned to the user (not silently retried)
- [ ] If no worktree exists for the story, returns a clear error
- [ ] Does not spawn a new agent or increment retry_count
- [ ] Works from all transports (Matrix, WhatsApp, Slack)
- [ ] Works from web UI slash commands
## Out of Scope
- TBD
@@ -0,0 +1,21 @@
---
name: "Unblock command handles all stuck states not just blocked flag"
---
# Story 435: Unblock command handles all stuck states not just blocked flag
## User Story
As a project owner, I want the unblock command to clear any stuck state on a story — not just the blocked flag — so that I have a single command to unstick stories regardless of why they're stuck.
## Acceptance Criteria
- [ ] Unblock clears merge_failure field in addition to blocked flag
- [ ] Unblock clears review_hold field
- [ ] Unblock reports which fields were cleared in the confirmation message
- [ ] Unblock works on stories in any pipeline stage (backlog, current, qa, merge, done)
- [ ] If no stuck state is found (no blocked, merge_failure, or review_hold), returns a clear message saying so
## Out of Scope
- TBD
@@ -0,0 +1,26 @@
---
name: "Unify story stuck states into a single status field"
---
# Refactor 436: Unify story stuck states into a single status field
## Current State
- TBD
## Desired State
Replace the separate blocked, merge_failure, and review_hold front matter fields with a single status field (e.g. status: blocked, status: merge_failure, status: review_hold). Simplifies the unblock command, auto-assign checks, and pipeline advance logic.
## Acceptance Criteria
- [ ] Replace blocked: true, merge_failure: string, and review_hold: true with a single status: field in story front matter
- [ ] Auto-assign checks a single field instead of three separate ones
- [ ] Pipeline advance and lifecycle code reads/writes the unified status field
- [ ] Unblock command clears the status field regardless of which stuck state it was
- [ ] retry_count remains a separate field (it's a counter, not a state)
- [ ] Migration: existing stories with old fields are handled gracefully on read
## Out of Scope
- TBD
@@ -0,0 +1,31 @@
---
name: "Rename project from \"huskies\" to \"huskies\""
---
# Story 455: Rename project from "huskies" to "huskies"
## User Story
As a project maintainer, I want to rename the project from \"huskies\" to \"huskies\" so that the product has its new identity throughout the codebase, tooling, and documentation. The new domain is huskies.dev — update all references to huskies.dev accordingly (website, contact email hello@huskies.dev, etc).
## Acceptance Criteria
- [ ] Rust crate name in server/Cargo.toml changed from 'huskies' to 'huskies'
- [ ] Binary name changed to 'huskies' (Dockerfile CMD, release script binary names)
- [ ] Environment variables renamed: STORKIT_PORT → HUSKIES_PORT, STORKIT_HOST → HUSKIES_HOST
- [ ] Docker service name, container_name, image name, and volume names updated in docker-compose.yml
- [ ] Docker user/group renamed from 'huskies' to 'huskies' in Dockerfile (groupadd, useradd, home dir /home/huskies/.claude)
- [ ] MCP server registration renamed from 'huskies' to 'huskies' in scaffold-generated .mcp.json and in server/src/http/mcp/mod.rs serverInfo name
- [ ] All 35+ MCP tool permission patterns updated from mcp__huskies__* to mcp__huskies__* across code and permission configs
- [ ] The .huskies/ project directory marker renamed to .huskies/ throughout all Rust source (paths.rs, config.rs, scaffold.rs, watcher.rs, prompts.rs, and all agent/pipeline code)
- [ ] Release script updated: Gitea repo path dave/huskies → dave/huskies, changelog regex updated to match ^(huskies|huskies|story-kit): for backwards-compatible history parsing, binary artifact names updated
- [ ] Git commit prefix convention updated from 'huskies:' to 'huskies:' in huskies README and agent prompts
- [ ] Website updated: page title, headings, and contact email (hello@huskies.dev) if domain changes
- [ ] README.md updated: all CLI examples use 'huskies' binary name, all .huskies/ references become .huskies/
- [ ] A migration path exists for existing installs: either huskies auto-detects and migrates .huskies/ → .huskies/, or a migration script (script/migrate) is provided
- [ ] All Claude Code .mcp.json files in existing worktrees are regenerated via scaffold or migration
- [ ] Gitea repository renamed from dave/huskies to dave/huskies (external action required, noted in story)
## Out of Scope
- TBD
@@ -0,0 +1,41 @@
---
name: "Stage transition notifications can arrive out of order and show wrong story name"
agent: coder-opus
---
# Bug 462: Stage transition notifications can arrive out of order and show wrong story name
## Description
When a story moves through stages quickly (e.g. QA → Merge → Done), the stage transition notifications can arrive out of order in Matrix chat. The Done notification appears before the Merge notification.
Two issues:
1. **Out-of-order delivery**: When two notifications are sent close together, the Matrix homeserver can deliver them in the wrong order. The notification handler processes events sequentially and awaits each send, but the homeserver does not guarantee ordering for near-simultaneous messages.
2. **Missing story name on stale notifications**: The second notification shows the raw item_id instead of the story name because `read_story_name` looks in the stage directory from the event (e.g. `4_merge/`), but the file has already moved to the next stage (e.g. `5_done/`).
3. **`inferred_from_stage` guesses the source stage** instead of tracking the actual from-stage. This means skipped stages would show incorrect transitions.
## How to Reproduce
1. Have a story in QA that passes quickly
2. Story moves QA → Merge → Done in rapid succession
3. Observe notifications in Matrix
## Actual Result
Notifications arrive in wrong order (Done before Merge). The later notification shows the raw item_id instead of the story name:
🎉 #32 upgrade TypeScript... — Merge → Done
#32 32_story_upgrade_typescript_and_tsconfig... — QA → Merge
## Expected Result
Notifications arrive in chronological order. All notifications show the story name. Ideally, rapid transitions are coalesced into a single notification for the final stage.
## Acceptance Criteria
- [ ] read_story_name falls back to searching all stages when the expected stage directory has no match
- [ ] Consider deduplicating rapid transitions within a short window (e.g. only notify for the final stage)
- [ ] Track actual from-stage in WatcherEvent instead of guessing via inferred_from_stage
@@ -0,0 +1,21 @@
---
name: "Configurable rate limit notification suppression"
---
# Story 463: Configurable rate limit notification suppression
## User Story
As a ..., I want ..., so that ...
## Acceptance Criteria
- [ ] New boolean config field in project.toml (e.g. rate_limit_notifications) defaults to true
- [ ] When false, RateLimitWarning chat notifications are suppressed
- [ ] RateLimitHardBlock and StoryBlocked notifications are always sent regardless of the setting
- [ ] Stage transition notifications are unaffected
- [ ] Config is hot-reloaded when project.toml changes
## Out of Scope
- TBD
@@ -0,0 +1,33 @@
---
name: "Timer rejects backlog stories — should move to current on fire"
---
# Bug 464: Timer rejects backlog stories — should move to current on fire
## Description
The `timer` bot command requires stories to be in `work/2_current/` before scheduling. When a user tries to schedule a backlog story (e.g. `timer 463 12:45`), it returns:
"Story **463_story_...** is not in `work/2_current/`. Move it to current before scheduling a timer."
The timer should accept backlog stories. When the timer fires, it should move the story from backlog to current and let auto-assign start an agent.
## How to Reproduce
1. Have a story in backlog (e.g. 463)
2. Run `timer 463 12:45`
3. Observe rejection message
## Actual Result
Timer command rejects stories not in `work/2_current/`.
## Expected Result
Timer command accepts backlog stories. When the timer fires, it moves the story to current and auto-assign picks it up.
## Acceptance Criteria
- [ ] Timer bot command accepts stories in backlog or current
- [ ] Timer tick loop calls move_story_to_current before start_agent for backlog stories
- [ ] Unit tests cover scheduling and firing for backlog stories
@@ -0,0 +1,36 @@
---
name: "Timer tick loop never fires due entries"
agent: coder-opus
---
# Bug 465: Timer tick loop never fires due entries
## Description
The timer tick loop (`spawn_timer_tick_loop`) is spawned by the Matrix bot runner, the Matrix bot is confirmed running (processing messages), but timers never fire. Past-due entries remain in `.huskies/timers.json` indefinitely — `take_due` never consumes them.
The tick loop uses `tokio::spawn` which swallows panics silently. If `move_story_to_current` or `start_agent` panics on the first tick (when all past-due entries fire at once), the entire task dies with no log output. The PTY debug spam may also push any `[timer]` log entries out of the ring buffer.
The bot command successfully adds entries to the in-memory store and persists them to disk, but the tick loop never processes them.
## How to Reproduce
1. Set a timer via bot command: `timer 463 HH:MM` (a time in the near future)
2. Wait past the scheduled time
3. Check `.huskies/timers.json` — entries are still present
4. Check server logs for `[timer]` — no entries found
## Actual Result
Timer entries remain in timers.json indefinitely. No `[timer] Timer fired` log entries appear. The story is never moved to current and no agent is started.
## Expected Result
Within 30 seconds of the scheduled time, the tick loop should call `take_due`, remove the entry from disk, move the story to current (if in backlog), and start an agent.
## Acceptance Criteria
- [ ] Add panic-catching (catch_unwind or tokio CancellationToken) to the tick loop so failures are logged
- [ ] Add a startup log line confirming the tick loop is running and how many pending timers were loaded
- [ ] Verify take_due runs on each 30-second tick by adding periodic debug logging
- [ ] Integration test: create a past-due timer entry, run the tick loop, assert the entry is consumed
@@ -0,0 +1,21 @@
---
name: "Configurable timezone in project.toml for timer scheduling"
---
# Story 466: Configurable timezone in project.toml for timer scheduling
## User Story
As a user running huskies in a container where TZ defaults to UTC, I want to configure my project's timezone in project.toml so that timer HH:MM inputs are interpreted in my actual timezone.
## Acceptance Criteria
- [ ] Add a `timezone` field to project.toml (e.g. `timezone = "Europe/London"`)
- [ ] next_occurrence_of_hhmm uses the configured timezone instead of chrono::Local
- [ ] Falls back to chrono::Local if no timezone is configured
- [ ] Timer confirmation message displays the time in the configured timezone
- [ ] timer list command shows times in the configured timezone
## Out of Scope
- TBD
@@ -10,7 +10,7 @@ The `prompt_permission` MCP tool returns plain text ("Permission granted for '..
## How to Reproduce ## How to Reproduce
1. Start the story-kit server and open the web UI 1. Start the huskies server and open the web UI
2. Chat with the claude-code-pty model 2. Chat with the claude-code-pty model
3. Ask it to do something that requires a tool NOT in `.claude/settings.json` allow list (e.g. `wc -l /etc/hosts`, or WebFetch to a non-allowed domain) 3. Ask it to do something that requires a tool NOT in `.claude/settings.json` allow list (e.g. `wc -l /etc/hosts`, or WebFetch to a non-allowed domain)
4. The permission dialog appears — click Approve 4. The permission dialog appears — click Approve
@@ -6,7 +6,7 @@ name: "Retry limit for mergemaster and pipeline restarts"
## User Story ## User Story
As a developer using story-kit, I want pipeline auto-restarts to have a configurable retry limit so that failing agents don't loop infinitely consuming CPU and API credits. As a developer using huskies, I want pipeline auto-restarts to have a configurable retry limit so that failing agents don't loop infinitely consuming CPU and API credits.
## Acceptance Criteria ## Acceptance Criteria
@@ -23,7 +23,7 @@ The watcher should periodically check `5_done/` and move items older than 4 hour
- All MCP tools and pipeline logic that reference `5_archived` need updating to use `5_done` - All MCP tools and pipeline logic that reference `5_archived` need updating to use `5_done`
- Frontend pipeline display if it shows archived/done items - Frontend pipeline display if it shows archived/done items
- `.story_kit/README.md`: update pipeline stage documentation - `.story_kit/README.md`: update pipeline stage documentation
- Story 116's init scaffolding: `story-kit init` must create `5_done/` and `6_archived/` directories - Story 116's init scaffolding: `huskies init` must create `5_done/` and `6_archived/` directories
- Any templates or scaffold code that creates the `.story_kit/work/` directory structure - Any templates or scaffold code that creates the `.story_kit/work/` directory structure
## Acceptance Criteria ## Acceptance Criteria
@@ -35,7 +35,7 @@ The watcher should periodically check `5_done/` and move items older than 4 hour
- [ ] Existing items in old `5_archived/` are migrated to `6_archived/` - [ ] Existing items in old `5_archived/` are migrated to `6_archived/`
- [ ] Frontend pipeline display updated if applicable - [ ] Frontend pipeline display updated if applicable
- [ ] `.story_kit/README.md` updated to reflect the new pipeline stages - [ ] `.story_kit/README.md` updated to reflect the new pipeline stages
- [ ] `story-kit init` scaffolding creates `5_done/` and `6_archived/` (coordinate with story 116) - [ ] `huskies init` scaffolding creates `5_done/` and `6_archived/` (coordinate with story 116)
## Out of Scope ## Out of Scope

Some files were not shown because too many files have changed in this diff Show More