diff --git a/.gitignore b/.gitignore index c050bce..76b33e7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,9 @@ # Local environment (secrets) .env -# App specific (root-level; story-kit subdirectory patterns live in .story_kit/.gitignore) +# App specific (root-level; story-kit subdirectory patterns live in .storkit/.gitignore) store.json -.story_kit_port +.storkit_port # Rust stuff target diff --git a/.story_kit/.gitignore b/.storkit/.gitignore similarity index 100% rename from .story_kit/.gitignore rename to .storkit/.gitignore diff --git a/.story_kit/README.md b/.storkit/README.md similarity index 100% rename from .story_kit/README.md rename to .storkit/README.md diff --git a/.story_kit/bot.toml.example b/.storkit/bot.toml.example similarity index 100% rename from .story_kit/bot.toml.example rename to .storkit/bot.toml.example diff --git a/.story_kit/problems.md b/.storkit/problems.md similarity index 100% rename from .story_kit/problems.md rename to .storkit/problems.md diff --git a/.story_kit/project.toml b/.storkit/project.toml similarity index 100% rename from .story_kit/project.toml rename to .storkit/project.toml diff --git a/.story_kit/specs/00_CONTEXT.md b/.storkit/specs/00_CONTEXT.md similarity index 100% rename from .story_kit/specs/00_CONTEXT.md rename to .storkit/specs/00_CONTEXT.md diff --git a/.story_kit/specs/functional/SLACK_SETUP.md b/.storkit/specs/functional/SLACK_SETUP.md similarity index 100% rename from .story_kit/specs/functional/SLACK_SETUP.md rename to .storkit/specs/functional/SLACK_SETUP.md diff --git a/.story_kit/specs/functional/UI_LAYOUT.md b/.storkit/specs/functional/UI_LAYOUT.md similarity index 100% rename from .story_kit/specs/functional/UI_LAYOUT.md rename to .storkit/specs/functional/UI_LAYOUT.md diff --git a/.story_kit/specs/functional/UI_UX.md b/.storkit/specs/functional/UI_UX.md similarity index 100% rename from .story_kit/specs/functional/UI_UX.md rename to .storkit/specs/functional/UI_UX.md diff --git a/.story_kit/specs/tech/STACK.md b/.storkit/specs/tech/STACK.md similarity index 100% rename from .story_kit/specs/tech/STACK.md rename to .storkit/specs/tech/STACK.md diff --git a/.story_kit/work/1_backlog/.gitkeep b/.storkit/work/1_backlog/.gitkeep similarity index 100% rename from .story_kit/work/1_backlog/.gitkeep rename to .storkit/work/1_backlog/.gitkeep diff --git a/.story_kit/work/1_backlog/169_story_gate_pipeline_transitions_on_ensure_acceptance.md b/.storkit/work/1_backlog/169_story_gate_pipeline_transitions_on_ensure_acceptance.md similarity index 100% rename from .story_kit/work/1_backlog/169_story_gate_pipeline_transitions_on_ensure_acceptance.md rename to .storkit/work/1_backlog/169_story_gate_pipeline_transitions_on_ensure_acceptance.md diff --git a/.story_kit/work/1_backlog/260_refactor_upgrade_libsqlite3_sys.md b/.storkit/work/1_backlog/260_refactor_upgrade_libsqlite3_sys.md similarity index 100% rename from .story_kit/work/1_backlog/260_refactor_upgrade_libsqlite3_sys.md rename to .storkit/work/1_backlog/260_refactor_upgrade_libsqlite3_sys.md diff --git a/.story_kit/work/1_backlog/329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting.md b/.storkit/work/1_backlog/329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting.md similarity index 100% rename from .story_kit/work/1_backlog/329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting.md rename to .storkit/work/1_backlog/329_spike_evaluate_docker_orbstack_for_agent_isolation_and_resource_limiting.md diff --git a/.story_kit/work/1_backlog/343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends.md b/.storkit/work/1_backlog/343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends.md similarity index 100% rename from .story_kit/work/1_backlog/343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends.md rename to .storkit/work/1_backlog/343_refactor_abstract_agent_runtime_to_support_non_claude_code_backends.md diff --git a/.story_kit/work/1_backlog/344_story_chatgpt_agent_backend_via_openai_api.md b/.storkit/work/1_backlog/344_story_chatgpt_agent_backend_via_openai_api.md similarity index 100% rename from .story_kit/work/1_backlog/344_story_chatgpt_agent_backend_via_openai_api.md rename to .storkit/work/1_backlog/344_story_chatgpt_agent_backend_via_openai_api.md diff --git a/.story_kit/work/1_backlog/345_story_gemini_agent_backend_via_google_ai_api.md b/.storkit/work/1_backlog/345_story_gemini_agent_backend_via_google_ai_api.md similarity index 100% rename from .story_kit/work/1_backlog/345_story_gemini_agent_backend_via_google_ai_api.md rename to .storkit/work/1_backlog/345_story_gemini_agent_backend_via_google_ai_api.md diff --git a/.story_kit/work/1_backlog/348_story_mcp_tools_for_code_search_grep_and_glob.md b/.storkit/work/1_backlog/348_story_mcp_tools_for_code_search_grep_and_glob.md similarity index 100% rename from .story_kit/work/1_backlog/348_story_mcp_tools_for_code_search_grep_and_glob.md rename to .storkit/work/1_backlog/348_story_mcp_tools_for_code_search_grep_and_glob.md diff --git a/.story_kit/work/1_backlog/349_story_mcp_tools_for_git_operations.md b/.storkit/work/1_backlog/349_story_mcp_tools_for_git_operations.md similarity index 100% rename from .story_kit/work/1_backlog/349_story_mcp_tools_for_git_operations.md rename to .storkit/work/1_backlog/349_story_mcp_tools_for_git_operations.md diff --git a/.story_kit/work/1_backlog/350_story_mcp_tool_for_code_definitions_lookup.md b/.storkit/work/1_backlog/350_story_mcp_tool_for_code_definitions_lookup.md similarity index 100% rename from .story_kit/work/1_backlog/350_story_mcp_tool_for_code_definitions_lookup.md rename to .storkit/work/1_backlog/350_story_mcp_tool_for_code_definitions_lookup.md diff --git a/.story_kit/work/1_backlog/35_story_agent_security_and_sandboxing.md b/.storkit/work/1_backlog/35_story_agent_security_and_sandboxing.md similarity index 100% rename from .story_kit/work/1_backlog/35_story_agent_security_and_sandboxing.md rename to .storkit/work/1_backlog/35_story_agent_security_and_sandboxing.md diff --git a/.story_kit/work/1_backlog/57_story_live_test_gate_updates.md b/.storkit/work/1_backlog/57_story_live_test_gate_updates.md similarity index 100% rename from .story_kit/work/1_backlog/57_story_live_test_gate_updates.md rename to .storkit/work/1_backlog/57_story_live_test_gate_updates.md diff --git a/.story_kit/work/1_backlog/90_story_fetch_real_context_window_size_from_anthropic_models_api.md b/.storkit/work/1_backlog/90_story_fetch_real_context_window_size_from_anthropic_models_api.md similarity index 100% rename from .story_kit/work/1_backlog/90_story_fetch_real_context_window_size_from_anthropic_models_api.md rename to .storkit/work/1_backlog/90_story_fetch_real_context_window_size_from_anthropic_models_api.md diff --git a/.story_kit/work/2_current/.gitkeep b/.storkit/work/5_done/.gitkeep similarity index 100% rename from .story_kit/work/2_current/.gitkeep rename to .storkit/work/5_done/.gitkeep diff --git a/.story_kit/work/5_done/330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules.md b/.storkit/work/5_done/330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules.md similarity index 100% rename from .story_kit/work/5_done/330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules.md rename to .storkit/work/5_done/330_refactor_consolidate_chat_transports_into_a_chat_module_with_transport_submodules.md diff --git a/.story_kit/work/5_done/331_story_bot_start_command_to_start_a_coder_on_a_story.md b/.storkit/work/5_done/331_story_bot_start_command_to_start_a_coder_on_a_story.md similarity index 100% rename from .story_kit/work/5_done/331_story_bot_start_command_to_start_a_coder_on_a_story.md rename to .storkit/work/5_done/331_story_bot_start_command_to_start_a_coder_on_a_story.md diff --git a/.story_kit/work/5_done/332_story_bot_assign_command_to_assign_a_specific_agent_to_a_story.md b/.storkit/work/5_done/332_story_bot_assign_command_to_assign_a_specific_agent_to_a_story.md similarity index 100% rename from .story_kit/work/5_done/332_story_bot_assign_command_to_assign_a_specific_agent_to_a_story.md rename to .storkit/work/5_done/332_story_bot_assign_command_to_assign_a_specific_agent_to_a_story.md diff --git a/.story_kit/work/5_done/333_story_bot_stop_command_to_stop_an_agent_on_a_story.md b/.storkit/work/5_done/333_story_bot_stop_command_to_stop_an_agent_on_a_story.md similarity index 100% rename from .story_kit/work/5_done/333_story_bot_stop_command_to_stop_an_agent_on_a_story.md rename to .storkit/work/5_done/333_story_bot_stop_command_to_stop_an_agent_on_a_story.md diff --git a/.story_kit/work/5_done/334_story_bot_move_command_to_move_stories_between_pipeline_stages.md b/.storkit/work/5_done/334_story_bot_move_command_to_move_stories_between_pipeline_stages.md similarity index 100% rename from .story_kit/work/5_done/334_story_bot_move_command_to_move_stories_between_pipeline_stages.md rename to .storkit/work/5_done/334_story_bot_move_command_to_move_stories_between_pipeline_stages.md diff --git a/.story_kit/work/5_done/335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart.md b/.storkit/work/5_done/335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart.md similarity index 100% rename from .story_kit/work/5_done/335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart.md rename to .storkit/work/5_done/335_story_bot_rebuild_command_to_trigger_server_rebuild_and_restart.md diff --git a/.story_kit/work/5_done/336_story_web_ui_button_to_start_a_coder_on_a_story.md b/.storkit/work/5_done/336_story_web_ui_button_to_start_a_coder_on_a_story.md similarity index 100% rename from .story_kit/work/5_done/336_story_web_ui_button_to_start_a_coder_on_a_story.md rename to .storkit/work/5_done/336_story_web_ui_button_to_start_a_coder_on_a_story.md diff --git a/.story_kit/work/5_done/337_story_web_ui_button_to_stop_an_agent_on_a_story.md b/.storkit/work/5_done/337_story_web_ui_button_to_stop_an_agent_on_a_story.md similarity index 100% rename from .story_kit/work/5_done/337_story_web_ui_button_to_stop_an_agent_on_a_story.md rename to .storkit/work/5_done/337_story_web_ui_button_to_stop_an_agent_on_a_story.md diff --git a/.story_kit/work/5_done/338_story_web_ui_button_to_move_stories_between_pipeline_stages.md b/.storkit/work/5_done/338_story_web_ui_button_to_move_stories_between_pipeline_stages.md similarity index 100% rename from .story_kit/work/5_done/338_story_web_ui_button_to_move_stories_between_pipeline_stages.md rename to .storkit/work/5_done/338_story_web_ui_button_to_move_stories_between_pipeline_stages.md diff --git a/.story_kit/work/5_done/339_story_web_ui_agent_assignment_dropdown_on_work_items.md b/.storkit/work/5_done/339_story_web_ui_agent_assignment_dropdown_on_work_items.md similarity index 100% rename from .story_kit/work/5_done/339_story_web_ui_agent_assignment_dropdown_on_work_items.md rename to .storkit/work/5_done/339_story_web_ui_agent_assignment_dropdown_on_work_items.md diff --git a/.story_kit/work/5_done/340_story_web_ui_rebuild_and_restart_button.md b/.storkit/work/5_done/340_story_web_ui_rebuild_and_restart_button.md similarity index 100% rename from .story_kit/work/5_done/340_story_web_ui_rebuild_and_restart_button.md rename to .storkit/work/5_done/340_story_web_ui_rebuild_and_restart_button.md diff --git a/.story_kit/work/5_done/342_story_web_ui_button_to_delete_a_story_from_the_pipeline.md b/.storkit/work/5_done/342_story_web_ui_button_to_delete_a_story_from_the_pipeline.md similarity index 100% rename from .story_kit/work/5_done/342_story_web_ui_button_to_delete_a_story_from_the_pipeline.md rename to .storkit/work/5_done/342_story_web_ui_button_to_delete_a_story_from_the_pipeline.md diff --git a/.story_kit/work/5_done/346_story_mcp_tools_for_file_operations_read_write_edit_list.md b/.storkit/work/5_done/346_story_mcp_tools_for_file_operations_read_write_edit_list.md similarity index 100% rename from .story_kit/work/5_done/346_story_mcp_tools_for_file_operations_read_write_edit_list.md rename to .storkit/work/5_done/346_story_mcp_tools_for_file_operations_read_write_edit_list.md diff --git a/.story_kit/work/5_done/347_story_mcp_tool_for_shell_command_execution.md b/.storkit/work/5_done/347_story_mcp_tool_for_shell_command_execution.md similarity index 100% rename from .story_kit/work/5_done/347_story_mcp_tool_for_shell_command_execution.md rename to .storkit/work/5_done/347_story_mcp_tool_for_shell_command_execution.md diff --git a/.story_kit/work/5_done/351_story_bot_reset_command_to_clear_conversation_context.md b/.storkit/work/5_done/351_story_bot_reset_command_to_clear_conversation_context.md similarity index 100% rename from .story_kit/work/5_done/351_story_bot_reset_command_to_clear_conversation_context.md rename to .storkit/work/5_done/351_story_bot_reset_command_to_clear_conversation_context.md diff --git a/.story_kit/work/5_done/352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors.md b/.storkit/work/5_done/352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors.md similarity index 100% rename from .story_kit/work/5_done/352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors.md rename to .storkit/work/5_done/352_bug_ambient_on_off_command_not_intercepted_by_bot_after_refactors.md diff --git a/.story_kit/work/5_done/353_story_add_party_emoji_to_done_stage_notification_messages.md b/.storkit/work/5_done/353_story_add_party_emoji_to_done_stage_notification_messages.md similarity index 100% rename from .story_kit/work/5_done/353_story_add_party_emoji_to_done_stage_notification_messages.md rename to .storkit/work/5_done/353_story_add_party_emoji_to_done_stage_notification_messages.md diff --git a/.story_kit/work/6_archived/01_story_project_selection.md b/.storkit/work/6_archived/01_story_project_selection.md similarity index 100% rename from .story_kit/work/6_archived/01_story_project_selection.md rename to .storkit/work/6_archived/01_story_project_selection.md diff --git a/.story_kit/work/6_archived/02_story_core_agent_tools.md b/.storkit/work/6_archived/02_story_core_agent_tools.md similarity index 100% rename from .story_kit/work/6_archived/02_story_core_agent_tools.md rename to .storkit/work/6_archived/02_story_core_agent_tools.md diff --git a/.story_kit/work/6_archived/03_story_llm_ollama.md b/.storkit/work/6_archived/03_story_llm_ollama.md similarity index 100% rename from .story_kit/work/6_archived/03_story_llm_ollama.md rename to .storkit/work/6_archived/03_story_llm_ollama.md diff --git a/.story_kit/work/6_archived/04_story_ollama_model_detection.md b/.storkit/work/6_archived/04_story_ollama_model_detection.md similarity index 100% rename from .story_kit/work/6_archived/04_story_ollama_model_detection.md rename to .storkit/work/6_archived/04_story_ollama_model_detection.md diff --git a/.story_kit/work/6_archived/05_story_persist_project_selection.md b/.storkit/work/6_archived/05_story_persist_project_selection.md similarity index 100% rename from .story_kit/work/6_archived/05_story_persist_project_selection.md rename to .storkit/work/6_archived/05_story_persist_project_selection.md diff --git a/.story_kit/work/6_archived/06_story_fix_ui_responsiveness.md b/.storkit/work/6_archived/06_story_fix_ui_responsiveness.md similarity index 100% rename from .story_kit/work/6_archived/06_story_fix_ui_responsiveness.md rename to .storkit/work/6_archived/06_story_fix_ui_responsiveness.md diff --git a/.story_kit/work/6_archived/07_story_ui_polish_sticky_header.md b/.storkit/work/6_archived/07_story_ui_polish_sticky_header.md similarity index 100% rename from .story_kit/work/6_archived/07_story_ui_polish_sticky_header.md rename to .storkit/work/6_archived/07_story_ui_polish_sticky_header.md diff --git a/.story_kit/work/6_archived/08_story_collapsible_tool_outputs.md b/.storkit/work/6_archived/08_story_collapsible_tool_outputs.md similarity index 100% rename from .story_kit/work/6_archived/08_story_collapsible_tool_outputs.md rename to .storkit/work/6_archived/08_story_collapsible_tool_outputs.md diff --git a/.story_kit/work/6_archived/09_story_remove_scroll_bars.md b/.storkit/work/6_archived/09_story_remove_scroll_bars.md similarity index 100% rename from .story_kit/work/6_archived/09_story_remove_scroll_bars.md rename to .storkit/work/6_archived/09_story_remove_scroll_bars.md diff --git a/.story_kit/work/6_archived/09_story_system_prompt_persona.md b/.storkit/work/6_archived/09_story_system_prompt_persona.md similarity index 100% rename from .story_kit/work/6_archived/09_story_system_prompt_persona.md rename to .storkit/work/6_archived/09_story_system_prompt_persona.md diff --git a/.story_kit/work/6_archived/100_story_test_coverage_http_context_rs_to_100.md b/.storkit/work/6_archived/100_story_test_coverage_http_context_rs_to_100.md similarity index 100% rename from .story_kit/work/6_archived/100_story_test_coverage_http_context_rs_to_100.md rename to .storkit/work/6_archived/100_story_test_coverage_http_context_rs_to_100.md diff --git a/.story_kit/work/6_archived/101_story_test_coverage_http_chat_rs_to_80.md b/.storkit/work/6_archived/101_story_test_coverage_http_chat_rs_to_80.md similarity index 100% rename from .story_kit/work/6_archived/101_story_test_coverage_http_chat_rs_to_80.md rename to .storkit/work/6_archived/101_story_test_coverage_http_chat_rs_to_80.md diff --git a/.story_kit/work/6_archived/102_story_test_coverage_http_model_rs_to_80.md b/.storkit/work/6_archived/102_story_test_coverage_http_model_rs_to_80.md similarity index 100% rename from .story_kit/work/6_archived/102_story_test_coverage_http_model_rs_to_80.md rename to .storkit/work/6_archived/102_story_test_coverage_http_model_rs_to_80.md diff --git a/.story_kit/work/6_archived/103_story_test_coverage_http_project_rs_to_80.md b/.storkit/work/6_archived/103_story_test_coverage_http_project_rs_to_80.md similarity index 100% rename from .story_kit/work/6_archived/103_story_test_coverage_http_project_rs_to_80.md rename to .storkit/work/6_archived/103_story_test_coverage_http_project_rs_to_80.md diff --git a/.story_kit/work/6_archived/104_story_test_coverage_io_search_rs_to_95.md b/.storkit/work/6_archived/104_story_test_coverage_io_search_rs_to_95.md similarity index 100% rename from .story_kit/work/6_archived/104_story_test_coverage_io_search_rs_to_95.md rename to .storkit/work/6_archived/104_story_test_coverage_io_search_rs_to_95.md diff --git a/.story_kit/work/6_archived/105_story_test_coverage_io_shell_rs_to_95.md b/.storkit/work/6_archived/105_story_test_coverage_io_shell_rs_to_95.md similarity index 100% rename from .story_kit/work/6_archived/105_story_test_coverage_io_shell_rs_to_95.md rename to .storkit/work/6_archived/105_story_test_coverage_io_shell_rs_to_95.md diff --git a/.story_kit/work/6_archived/106_story_test_coverage_http_settings_rs_to_80.md b/.storkit/work/6_archived/106_story_test_coverage_http_settings_rs_to_80.md similarity index 100% rename from .story_kit/work/6_archived/106_story_test_coverage_http_settings_rs_to_80.md rename to .storkit/work/6_archived/106_story_test_coverage_http_settings_rs_to_80.md diff --git a/.story_kit/work/6_archived/107_story_test_coverage_http_assets_rs_to_85.md b/.storkit/work/6_archived/107_story_test_coverage_http_assets_rs_to_85.md similarity index 100% rename from .story_kit/work/6_archived/107_story_test_coverage_http_assets_rs_to_85.md rename to .storkit/work/6_archived/107_story_test_coverage_http_assets_rs_to_85.md diff --git a/.story_kit/work/6_archived/108_story_test_coverage_http_agents_rs_to_70.md b/.storkit/work/6_archived/108_story_test_coverage_http_agents_rs_to_70.md similarity index 100% rename from .story_kit/work/6_archived/108_story_test_coverage_http_agents_rs_to_70.md rename to .storkit/work/6_archived/108_story_test_coverage_http_agents_rs_to_70.md diff --git a/.story_kit/work/6_archived/109_story_add_test_coverage_for_lozengeflycontext_selectionscreen_and_chatheader_components.md b/.storkit/work/6_archived/109_story_add_test_coverage_for_lozengeflycontext_selectionscreen_and_chatheader_components.md similarity index 100% rename from .story_kit/work/6_archived/109_story_add_test_coverage_for_lozengeflycontext_selectionscreen_and_chatheader_components.md rename to .storkit/work/6_archived/109_story_add_test_coverage_for_lozengeflycontext_selectionscreen_and_chatheader_components.md diff --git a/.story_kit/work/6_archived/10_story_persist_model_selection.md b/.storkit/work/6_archived/10_story_persist_model_selection.md similarity index 100% rename from .story_kit/work/6_archived/10_story_persist_model_selection.md rename to .storkit/work/6_archived/10_story_persist_model_selection.md diff --git a/.story_kit/work/6_archived/110_story_add_test_coverage_for_api_settings_ts.md b/.storkit/work/6_archived/110_story_add_test_coverage_for_api_settings_ts.md similarity index 100% rename from .story_kit/work/6_archived/110_story_add_test_coverage_for_api_settings_ts.md rename to .storkit/work/6_archived/110_story_add_test_coverage_for_api_settings_ts.md diff --git a/.story_kit/work/6_archived/111_story_add_test_coverage_for_api_agents_ts.md b/.storkit/work/6_archived/111_story_add_test_coverage_for_api_agents_ts.md similarity index 100% rename from .story_kit/work/6_archived/111_story_add_test_coverage_for_api_agents_ts.md rename to .storkit/work/6_archived/111_story_add_test_coverage_for_api_agents_ts.md diff --git a/.story_kit/work/6_archived/112_story_add_test_coverage_for_app_tsx.md b/.storkit/work/6_archived/112_story_add_test_coverage_for_app_tsx.md similarity index 100% rename from .story_kit/work/6_archived/112_story_add_test_coverage_for_app_tsx.md rename to .storkit/work/6_archived/112_story_add_test_coverage_for_app_tsx.md diff --git a/.story_kit/work/6_archived/113_story_add_test_coverage_for_usepathcompletion_hook.md b/.storkit/work/6_archived/113_story_add_test_coverage_for_usepathcompletion_hook.md similarity index 100% rename from .story_kit/work/6_archived/113_story_add_test_coverage_for_usepathcompletion_hook.md rename to .storkit/work/6_archived/113_story_add_test_coverage_for_usepathcompletion_hook.md diff --git a/.story_kit/work/6_archived/114_bug_web_ui_sse_socket_stops_updating_after_a_while.md b/.storkit/work/6_archived/114_bug_web_ui_sse_socket_stops_updating_after_a_while.md similarity index 100% rename from .story_kit/work/6_archived/114_bug_web_ui_sse_socket_stops_updating_after_a_while.md rename to .storkit/work/6_archived/114_bug_web_ui_sse_socket_stops_updating_after_a_while.md diff --git a/.story_kit/work/6_archived/115_story_hot_reload_project_toml_agent_config_without_server_restart.md b/.storkit/work/6_archived/115_story_hot_reload_project_toml_agent_config_without_server_restart.md similarity index 100% rename from .story_kit/work/6_archived/115_story_hot_reload_project_toml_agent_config_without_server_restart.md rename to .storkit/work/6_archived/115_story_hot_reload_project_toml_agent_config_without_server_restart.md diff --git a/.story_kit/work/6_archived/116_story_story_kit_init_command_scaffolds_a_new_project.md b/.storkit/work/6_archived/116_story_story_kit_init_command_scaffolds_a_new_project.md similarity index 100% rename from .story_kit/work/6_archived/116_story_story_kit_init_command_scaffolds_a_new_project.md rename to .storkit/work/6_archived/116_story_story_kit_init_command_scaffolds_a_new_project.md diff --git a/.story_kit/work/6_archived/117_story_show_startup_reconciliation_progress_in_ui.md b/.storkit/work/6_archived/117_story_show_startup_reconciliation_progress_in_ui.md similarity index 100% rename from .story_kit/work/6_archived/117_story_show_startup_reconciliation_progress_in_ui.md rename to .storkit/work/6_archived/117_story_show_startup_reconciliation_progress_in_ui.md diff --git a/.story_kit/work/6_archived/118_bug_agent_pool_retains_stale_running_state_after_completion_blocking_auto_assign.md b/.storkit/work/6_archived/118_bug_agent_pool_retains_stale_running_state_after_completion_blocking_auto_assign.md similarity index 100% rename from .story_kit/work/6_archived/118_bug_agent_pool_retains_stale_running_state_after_completion_blocking_auto_assign.md rename to .storkit/work/6_archived/118_bug_agent_pool_retains_stale_running_state_after_completion_blocking_auto_assign.md diff --git a/.story_kit/work/6_archived/119_story_mergemaster_should_resolve_merge_conflicts_instead_of_leaving_conflict_markers_on_master.md b/.storkit/work/6_archived/119_story_mergemaster_should_resolve_merge_conflicts_instead_of_leaving_conflict_markers_on_master.md similarity index 100% rename from .story_kit/work/6_archived/119_story_mergemaster_should_resolve_merge_conflicts_instead_of_leaving_conflict_markers_on_master.md rename to .storkit/work/6_archived/119_story_mergemaster_should_resolve_merge_conflicts_instead_of_leaving_conflict_markers_on_master.md diff --git a/.story_kit/work/6_archived/11_story_make_text_not_centred.md b/.storkit/work/6_archived/11_story_make_text_not_centred.md similarity index 100% rename from .story_kit/work/6_archived/11_story_make_text_not_centred.md rename to .storkit/work/6_archived/11_story_make_text_not_centred.md diff --git a/.story_kit/work/6_archived/120_story_test_coverage_llm_chat_rs.md b/.storkit/work/6_archived/120_story_test_coverage_llm_chat_rs.md similarity index 100% rename from .story_kit/work/6_archived/120_story_test_coverage_llm_chat_rs.md rename to .storkit/work/6_archived/120_story_test_coverage_llm_chat_rs.md diff --git a/.story_kit/work/6_archived/121_story_test_coverage_io_watcher_rs.md b/.storkit/work/6_archived/121_story_test_coverage_io_watcher_rs.md similarity index 100% rename from .story_kit/work/6_archived/121_story_test_coverage_io_watcher_rs.md rename to .storkit/work/6_archived/121_story_test_coverage_io_watcher_rs.md diff --git a/.story_kit/work/6_archived/122_story_test_coverage_http_ws_rs.md b/.storkit/work/6_archived/122_story_test_coverage_http_ws_rs.md similarity index 100% rename from .story_kit/work/6_archived/122_story_test_coverage_http_ws_rs.md rename to .storkit/work/6_archived/122_story_test_coverage_http_ws_rs.md diff --git a/.story_kit/work/6_archived/123_story_test_coverage_llm_providers_anthropic_rs.md b/.storkit/work/6_archived/123_story_test_coverage_llm_providers_anthropic_rs.md similarity index 100% rename from .story_kit/work/6_archived/123_story_test_coverage_llm_providers_anthropic_rs.md rename to .storkit/work/6_archived/123_story_test_coverage_llm_providers_anthropic_rs.md diff --git a/.story_kit/work/6_archived/124_story_test_coverage_llm_providers_claude_code_rs.md b/.storkit/work/6_archived/124_story_test_coverage_llm_providers_claude_code_rs.md similarity index 100% rename from .story_kit/work/6_archived/124_story_test_coverage_llm_providers_claude_code_rs.md rename to .storkit/work/6_archived/124_story_test_coverage_llm_providers_claude_code_rs.md diff --git a/.story_kit/work/6_archived/125_story_test_coverage_http_io_rs.md b/.storkit/work/6_archived/125_story_test_coverage_http_io_rs.md similarity index 100% rename from .story_kit/work/6_archived/125_story_test_coverage_http_io_rs.md rename to .storkit/work/6_archived/125_story_test_coverage_http_io_rs.md diff --git a/.story_kit/work/6_archived/126_story_test_coverage_http_anthropic_rs.md b/.storkit/work/6_archived/126_story_test_coverage_http_anthropic_rs.md similarity index 100% rename from .story_kit/work/6_archived/126_story_test_coverage_http_anthropic_rs.md rename to .storkit/work/6_archived/126_story_test_coverage_http_anthropic_rs.md diff --git a/.story_kit/work/6_archived/127_story_test_coverage_http_mod_rs.md b/.storkit/work/6_archived/127_story_test_coverage_http_mod_rs.md similarity index 100% rename from .story_kit/work/6_archived/127_story_test_coverage_http_mod_rs.md rename to .storkit/work/6_archived/127_story_test_coverage_http_mod_rs.md diff --git a/.story_kit/work/6_archived/128_story_test_coverage_worktree_rs.md b/.storkit/work/6_archived/128_story_test_coverage_worktree_rs.md similarity index 100% rename from .story_kit/work/6_archived/128_story_test_coverage_worktree_rs.md rename to .storkit/work/6_archived/128_story_test_coverage_worktree_rs.md diff --git a/.story_kit/work/6_archived/129_story_test_coverage_http_mcp_rs.md b/.storkit/work/6_archived/129_story_test_coverage_http_mcp_rs.md similarity index 100% rename from .story_kit/work/6_archived/129_story_test_coverage_http_mcp_rs.md rename to .storkit/work/6_archived/129_story_test_coverage_http_mcp_rs.md diff --git a/.story_kit/work/6_archived/12_story_be_able_to_use_claude.md b/.storkit/work/6_archived/12_story_be_able_to_use_claude.md similarity index 100% rename from .story_kit/work/6_archived/12_story_be_able_to_use_claude.md rename to .storkit/work/6_archived/12_story_be_able_to_use_claude.md diff --git a/.story_kit/work/6_archived/130_bug_permission_approval_returns_wrong_format_tools_fail_after_user_approves.md b/.storkit/work/6_archived/130_bug_permission_approval_returns_wrong_format_tools_fail_after_user_approves.md similarity index 100% rename from .story_kit/work/6_archived/130_bug_permission_approval_returns_wrong_format_tools_fail_after_user_approves.md rename to .storkit/work/6_archived/130_bug_permission_approval_returns_wrong_format_tools_fail_after_user_approves.md diff --git a/.story_kit/work/6_archived/131_bug_get_agent_output_stream_always_times_out_for_running_agents.md b/.storkit/work/6_archived/131_bug_get_agent_output_stream_always_times_out_for_running_agents.md similarity index 100% rename from .story_kit/work/6_archived/131_bug_get_agent_output_stream_always_times_out_for_running_agents.md rename to .storkit/work/6_archived/131_bug_get_agent_output_stream_always_times_out_for_running_agents.md diff --git a/.story_kit/work/6_archived/132_story_fix_toctou_race_in_agent_check_and_insert.md b/.storkit/work/6_archived/132_story_fix_toctou_race_in_agent_check_and_insert.md similarity index 100% rename from .story_kit/work/6_archived/132_story_fix_toctou_race_in_agent_check_and_insert.md rename to .storkit/work/6_archived/132_story_fix_toctou_race_in_agent_check_and_insert.md diff --git a/.story_kit/work/6_archived/133_story_clean_up_agent_state_on_story_archive_and_add_ttl_for_completed_entries.md b/.storkit/work/6_archived/133_story_clean_up_agent_state_on_story_archive_and_add_ttl_for_completed_entries.md similarity index 100% rename from .story_kit/work/6_archived/133_story_clean_up_agent_state_on_story_archive_and_add_ttl_for_completed_entries.md rename to .storkit/work/6_archived/133_story_clean_up_agent_state_on_story_archive_and_add_ttl_for_completed_entries.md diff --git a/.story_kit/work/6_archived/134_story_add_process_health_monitoring_and_timeout_to_agent_pty_sessions.md b/.storkit/work/6_archived/134_story_add_process_health_monitoring_and_timeout_to_agent_pty_sessions.md similarity index 100% rename from .story_kit/work/6_archived/134_story_add_process_health_monitoring_and_timeout_to_agent_pty_sessions.md rename to .storkit/work/6_archived/134_story_add_process_health_monitoring_and_timeout_to_agent_pty_sessions.md diff --git a/.story_kit/work/6_archived/135_story_update_mergemaster_prompt_to_allow_conflict_resolution_and_code_fixes.md b/.storkit/work/6_archived/135_story_update_mergemaster_prompt_to_allow_conflict_resolution_and_code_fixes.md similarity index 100% rename from .story_kit/work/6_archived/135_story_update_mergemaster_prompt_to_allow_conflict_resolution_and_code_fixes.md rename to .storkit/work/6_archived/135_story_update_mergemaster_prompt_to_allow_conflict_resolution_and_code_fixes.md diff --git a/.story_kit/work/6_archived/136_bug_broadcast_channel_silently_drops_events_on_subscriber_lag.md b/.storkit/work/6_archived/136_bug_broadcast_channel_silently_drops_events_on_subscriber_lag.md similarity index 100% rename from .story_kit/work/6_archived/136_bug_broadcast_channel_silently_drops_events_on_subscriber_lag.md rename to .storkit/work/6_archived/136_bug_broadcast_channel_silently_drops_events_on_subscriber_lag.md diff --git a/.story_kit/work/6_archived/137_bug_lozengeflycontext_animation_queue_race_condition_on_rapid_updates.md b/.storkit/work/6_archived/137_bug_lozengeflycontext_animation_queue_race_condition_on_rapid_updates.md similarity index 100% rename from .story_kit/work/6_archived/137_bug_lozengeflycontext_animation_queue_race_condition_on_rapid_updates.md rename to .storkit/work/6_archived/137_bug_lozengeflycontext_animation_queue_race_condition_on_rapid_updates.md diff --git a/.story_kit/work/6_archived/138_bug_no_heartbeat_to_detect_stale_websocket_connections.md b/.storkit/work/6_archived/138_bug_no_heartbeat_to_detect_stale_websocket_connections.md similarity index 100% rename from .story_kit/work/6_archived/138_bug_no_heartbeat_to_detect_stale_websocket_connections.md rename to .storkit/work/6_archived/138_bug_no_heartbeat_to_detect_stale_websocket_connections.md diff --git a/.story_kit/work/6_archived/139_story_retry_limit_for_mergemaster_and_pipeline_restarts.md b/.storkit/work/6_archived/139_story_retry_limit_for_mergemaster_and_pipeline_restarts.md similarity index 100% rename from .story_kit/work/6_archived/139_story_retry_limit_for_mergemaster_and_pipeline_restarts.md rename to .storkit/work/6_archived/139_story_retry_limit_for_mergemaster_and_pipeline_restarts.md diff --git a/.story_kit/work/6_archived/13_story_stop_button.md b/.storkit/work/6_archived/13_story_stop_button.md similarity index 100% rename from .story_kit/work/6_archived/13_story_stop_button.md rename to .storkit/work/6_archived/13_story_stop_button.md diff --git a/.story_kit/work/6_archived/140_bug_activity_status_indicator_never_visible_due_to_display_condition.md b/.storkit/work/6_archived/140_bug_activity_status_indicator_never_visible_due_to_display_condition.md similarity index 100% rename from .story_kit/work/6_archived/140_bug_activity_status_indicator_never_visible_due_to_display_condition.md rename to .storkit/work/6_archived/140_bug_activity_status_indicator_never_visible_due_to_display_condition.md diff --git a/.story_kit/work/6_archived/141_story_improve_server_logging_with_timestamps_and_error_visibility.md b/.storkit/work/6_archived/141_story_improve_server_logging_with_timestamps_and_error_visibility.md similarity index 100% rename from .story_kit/work/6_archived/141_story_improve_server_logging_with_timestamps_and_error_visibility.md rename to .storkit/work/6_archived/141_story_improve_server_logging_with_timestamps_and_error_visibility.md diff --git a/.story_kit/work/6_archived/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md b/.storkit/work/6_archived/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md similarity index 100% rename from .story_kit/work/6_archived/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md rename to .storkit/work/6_archived/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md diff --git a/.story_kit/work/6_archived/143_story_remove_0_running_count_from_agents_panel_header.md b/.storkit/work/6_archived/143_story_remove_0_running_count_from_agents_panel_header.md similarity index 100% rename from .story_kit/work/6_archived/143_story_remove_0_running_count_from_agents_panel_header.md rename to .storkit/work/6_archived/143_story_remove_0_running_count_from_agents_panel_header.md diff --git a/.story_kit/work/6_archived/144_story_add_build_timestamp_and_persist_chat_history_across_rebuilds.md b/.storkit/work/6_archived/144_story_add_build_timestamp_and_persist_chat_history_across_rebuilds.md similarity index 100% rename from .story_kit/work/6_archived/144_story_add_build_timestamp_and_persist_chat_history_across_rebuilds.md rename to .storkit/work/6_archived/144_story_add_build_timestamp_and_persist_chat_history_across_rebuilds.md diff --git a/.story_kit/work/6_archived/145_story_persist_chat_history_to_localstorage_across_rebuilds.md b/.storkit/work/6_archived/145_story_persist_chat_history_to_localstorage_across_rebuilds.md similarity index 100% rename from .story_kit/work/6_archived/145_story_persist_chat_history_to_localstorage_across_rebuilds.md rename to .storkit/work/6_archived/145_story_persist_chat_history_to_localstorage_across_rebuilds.md diff --git a/.story_kit/work/6_archived/146_bug_permission_approval_still_returns_wrong_format_needs_updatedinput_not_behavior_allow.md b/.storkit/work/6_archived/146_bug_permission_approval_still_returns_wrong_format_needs_updatedinput_not_behavior_allow.md similarity index 100% rename from .story_kit/work/6_archived/146_bug_permission_approval_still_returns_wrong_format_needs_updatedinput_not_behavior_allow.md rename to .storkit/work/6_archived/146_bug_permission_approval_still_returns_wrong_format_needs_updatedinput_not_behavior_allow.md diff --git a/.story_kit/work/6_archived/147_bug_activity_indicator_still_only_shows_thinking_despite_bug_140_fix.md b/.storkit/work/6_archived/147_bug_activity_indicator_still_only_shows_thinking_despite_bug_140_fix.md similarity index 100% rename from .story_kit/work/6_archived/147_bug_activity_indicator_still_only_shows_thinking_despite_bug_140_fix.md rename to .storkit/work/6_archived/147_bug_activity_indicator_still_only_shows_thinking_despite_bug_140_fix.md diff --git a/.story_kit/work/6_archived/148_story_interactive_onboarding_guides_user_through_project_setup_after_init.md b/.storkit/work/6_archived/148_story_interactive_onboarding_guides_user_through_project_setup_after_init.md similarity index 100% rename from .story_kit/work/6_archived/148_story_interactive_onboarding_guides_user_through_project_setup_after_init.md rename to .storkit/work/6_archived/148_story_interactive_onboarding_guides_user_through_project_setup_after_init.md diff --git a/.story_kit/work/6_archived/149_bug_web_ui_does_not_update_when_agents_are_started_or_stopped.md b/.storkit/work/6_archived/149_bug_web_ui_does_not_update_when_agents_are_started_or_stopped.md similarity index 100% rename from .story_kit/work/6_archived/149_bug_web_ui_does_not_update_when_agents_are_started_or_stopped.md rename to .storkit/work/6_archived/149_bug_web_ui_does_not_update_when_agents_are_started_or_stopped.md diff --git a/.story_kit/work/6_archived/14_story_put_cursor_in_chat_box_on_startup.md b/.storkit/work/6_archived/14_story_put_cursor_in_chat_box_on_startup.md similarity index 100% rename from .story_kit/work/6_archived/14_story_put_cursor_in_chat_box_on_startup.md rename to .storkit/work/6_archived/14_story_put_cursor_in_chat_box_on_startup.md diff --git a/.story_kit/work/6_archived/150_bug_qa_2_agent_never_auto_assigned_because_pipeline_stage_only_matches_exact_qa.md b/.storkit/work/6_archived/150_bug_qa_2_agent_never_auto_assigned_because_pipeline_stage_only_matches_exact_qa.md similarity index 100% rename from .story_kit/work/6_archived/150_bug_qa_2_agent_never_auto_assigned_because_pipeline_stage_only_matches_exact_qa.md rename to .storkit/work/6_archived/150_bug_qa_2_agent_never_auto_assigned_because_pipeline_stage_only_matches_exact_qa.md diff --git a/.story_kit/work/6_archived/151_story_split_archived_into_done_and_archived_with_time_based_promotion.md b/.storkit/work/6_archived/151_story_split_archived_into_done_and_archived_with_time_based_promotion.md similarity index 100% rename from .story_kit/work/6_archived/151_story_split_archived_into_done_and_archived_with_time_based_promotion.md rename to .storkit/work/6_archived/151_story_split_archived_into_done_and_archived_with_time_based_promotion.md diff --git a/.story_kit/work/6_archived/152_bug_ollama_not_running_kills_the_entire_web_ui.md b/.storkit/work/6_archived/152_bug_ollama_not_running_kills_the_entire_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/152_bug_ollama_not_running_kills_the_entire_web_ui.md rename to .storkit/work/6_archived/152_bug_ollama_not_running_kills_the_entire_web_ui.md diff --git a/.story_kit/work/6_archived/153_bug_auto_assign_broken_after_stage_field_was_added_to_agent_config.md b/.storkit/work/6_archived/153_bug_auto_assign_broken_after_stage_field_was_added_to_agent_config.md similarity index 100% rename from .story_kit/work/6_archived/153_bug_auto_assign_broken_after_stage_field_was_added_to_agent_config.md rename to .storkit/work/6_archived/153_bug_auto_assign_broken_after_stage_field_was_added_to_agent_config.md diff --git a/.story_kit/work/6_archived/154_bug_mergemaster_quality_gates_fail_because_merge_worktree_has_no_frontend_deps.md b/.storkit/work/6_archived/154_bug_mergemaster_quality_gates_fail_because_merge_worktree_has_no_frontend_deps.md similarity index 100% rename from .story_kit/work/6_archived/154_bug_mergemaster_quality_gates_fail_because_merge_worktree_has_no_frontend_deps.md rename to .storkit/work/6_archived/154_bug_mergemaster_quality_gates_fail_because_merge_worktree_has_no_frontend_deps.md diff --git a/.story_kit/work/6_archived/155_story_queue_messages_while_agent_is_busy.md b/.storkit/work/6_archived/155_story_queue_messages_while_agent_is_busy.md similarity index 100% rename from .story_kit/work/6_archived/155_story_queue_messages_while_agent_is_busy.md rename to .storkit/work/6_archived/155_story_queue_messages_while_agent_is_busy.md diff --git a/.story_kit/work/6_archived/156_bug_onboarding_welcome_screen_triggers_on_already_configured_projects.md b/.storkit/work/6_archived/156_bug_onboarding_welcome_screen_triggers_on_already_configured_projects.md similarity index 100% rename from .story_kit/work/6_archived/156_bug_onboarding_welcome_screen_triggers_on_already_configured_projects.md rename to .storkit/work/6_archived/156_bug_onboarding_welcome_screen_triggers_on_already_configured_projects.md diff --git a/.story_kit/work/6_archived/157_story_make_start_agent_non_blocking_by_deferring_worktree_creation.md b/.storkit/work/6_archived/157_story_make_start_agent_non_blocking_by_deferring_worktree_creation.md similarity index 100% rename from .story_kit/work/6_archived/157_story_make_start_agent_non_blocking_by_deferring_worktree_creation.md rename to .storkit/work/6_archived/157_story_make_start_agent_non_blocking_by_deferring_worktree_creation.md diff --git a/.story_kit/work/6_archived/158_bug_pty_debug_log_panics_on_multi_byte_utf_8_characters.md b/.storkit/work/6_archived/158_bug_pty_debug_log_panics_on_multi_byte_utf_8_characters.md similarity index 100% rename from .story_kit/work/6_archived/158_bug_pty_debug_log_panics_on_multi_byte_utf_8_characters.md rename to .storkit/work/6_archived/158_bug_pty_debug_log_panics_on_multi_byte_utf_8_characters.md diff --git a/.story_kit/work/6_archived/159_bug_server_restart_leaves_orphaned_claude_code_pty_processes_running.md b/.storkit/work/6_archived/159_bug_server_restart_leaves_orphaned_claude_code_pty_processes_running.md similarity index 100% rename from .story_kit/work/6_archived/159_bug_server_restart_leaves_orphaned_claude_code_pty_processes_running.md rename to .storkit/work/6_archived/159_bug_server_restart_leaves_orphaned_claude_code_pty_processes_running.md diff --git a/.story_kit/work/6_archived/15_story_new_session_cancellation.md b/.storkit/work/6_archived/15_story_new_session_cancellation.md similarity index 100% rename from .story_kit/work/6_archived/15_story_new_session_cancellation.md rename to .storkit/work/6_archived/15_story_new_session_cancellation.md diff --git a/.story_kit/work/6_archived/160_story_constrain_thinking_trace_height_in_agent_stream_ui.md b/.storkit/work/6_archived/160_story_constrain_thinking_trace_height_in_agent_stream_ui.md similarity index 100% rename from .story_kit/work/6_archived/160_story_constrain_thinking_trace_height_in_agent_stream_ui.md rename to .storkit/work/6_archived/160_story_constrain_thinking_trace_height_in_agent_stream_ui.md diff --git a/.story_kit/work/6_archived/161_bug_auto_assign_only_triggers_on_agent_completion_not_on_failure_or_periodically.md b/.storkit/work/6_archived/161_bug_auto_assign_only_triggers_on_agent_completion_not_on_failure_or_periodically.md similarity index 100% rename from .story_kit/work/6_archived/161_bug_auto_assign_only_triggers_on_agent_completion_not_on_failure_or_periodically.md rename to .storkit/work/6_archived/161_bug_auto_assign_only_triggers_on_agent_completion_not_on_failure_or_periodically.md diff --git a/.story_kit/work/6_archived/162_story_colored_server_terminal_log_output.md b/.storkit/work/6_archived/162_story_colored_server_terminal_log_output.md similarity index 100% rename from .story_kit/work/6_archived/162_story_colored_server_terminal_log_output.md rename to .storkit/work/6_archived/162_story_colored_server_terminal_log_output.md diff --git a/.story_kit/work/6_archived/163_story_remove_bubble_styling_from_streaming_chat_messages.md b/.storkit/work/6_archived/163_story_remove_bubble_styling_from_streaming_chat_messages.md similarity index 100% rename from .story_kit/work/6_archived/163_story_remove_bubble_styling_from_streaming_chat_messages.md rename to .storkit/work/6_archived/163_story_remove_bubble_styling_from_streaming_chat_messages.md diff --git a/.story_kit/work/6_archived/164_bug_dev_process_readme_documents_wrong_pipeline_stages.md b/.storkit/work/6_archived/164_bug_dev_process_readme_documents_wrong_pipeline_stages.md similarity index 100% rename from .story_kit/work/6_archived/164_bug_dev_process_readme_documents_wrong_pipeline_stages.md rename to .storkit/work/6_archived/164_bug_dev_process_readme_documents_wrong_pipeline_stages.md diff --git a/.story_kit/work/6_archived/165_bug_pipeline_log_message_says_archived_instead_of_done.md b/.storkit/work/6_archived/165_bug_pipeline_log_message_says_archived_instead_of_done.md similarity index 100% rename from .story_kit/work/6_archived/165_bug_pipeline_log_message_says_archived_instead_of_done.md rename to .storkit/work/6_archived/165_bug_pipeline_log_message_says_archived_instead_of_done.md diff --git a/.story_kit/work/6_archived/166_story_add_done_column_to_pipeline_board.md b/.storkit/work/6_archived/166_story_add_done_column_to_pipeline_board.md similarity index 100% rename from .story_kit/work/6_archived/166_story_add_done_column_to_pipeline_board.md rename to .storkit/work/6_archived/166_story_add_done_column_to_pipeline_board.md diff --git a/.story_kit/work/6_archived/167_bug_thinking_trace_height_constraint_not_working_in_web_ui.md b/.storkit/work/6_archived/167_bug_thinking_trace_height_constraint_not_working_in_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/167_bug_thinking_trace_height_constraint_not_working_in_web_ui.md rename to .storkit/work/6_archived/167_bug_thinking_trace_height_constraint_not_working_in_web_ui.md diff --git a/.story_kit/work/6_archived/168_bug_agent_message_queue_limited_to_one_line.md b/.storkit/work/6_archived/168_bug_agent_message_queue_limited_to_one_line.md similarity index 100% rename from .story_kit/work/6_archived/168_bug_agent_message_queue_limited_to_one_line.md rename to .storkit/work/6_archived/168_bug_agent_message_queue_limited_to_one_line.md diff --git a/.story_kit/work/6_archived/170_story_add_test_first_requirements_to_agent_role_descriptions.md b/.storkit/work/6_archived/170_story_add_test_first_requirements_to_agent_role_descriptions.md similarity index 100% rename from .story_kit/work/6_archived/170_story_add_test_first_requirements_to_agent_role_descriptions.md rename to .storkit/work/6_archived/170_story_add_test_first_requirements_to_agent_role_descriptions.md diff --git a/.story_kit/work/6_archived/171_story_persist_test_results_to_story_files.md b/.storkit/work/6_archived/171_story_persist_test_results_to_story_files.md similarity index 100% rename from .story_kit/work/6_archived/171_story_persist_test_results_to_story_files.md rename to .storkit/work/6_archived/171_story_persist_test_results_to_story_files.md diff --git a/.story_kit/work/6_archived/172_bug_setup_command_failure_prevents_agent_from_starting_creating_unrecoverable_deadlock.md b/.storkit/work/6_archived/172_bug_setup_command_failure_prevents_agent_from_starting_creating_unrecoverable_deadlock.md similarity index 100% rename from .story_kit/work/6_archived/172_bug_setup_command_failure_prevents_agent_from_starting_creating_unrecoverable_deadlock.md rename to .storkit/work/6_archived/172_bug_setup_command_failure_prevents_agent_from_starting_creating_unrecoverable_deadlock.md diff --git a/.story_kit/work/6_archived/173_bug_pipeline_board_lozenges_dont_update_on_agent_state_changes.md b/.storkit/work/6_archived/173_bug_pipeline_board_lozenges_dont_update_on_agent_state_changes.md similarity index 100% rename from .story_kit/work/6_archived/173_bug_pipeline_board_lozenges_dont_update_on_agent_state_changes.md rename to .storkit/work/6_archived/173_bug_pipeline_board_lozenges_dont_update_on_agent_state_changes.md diff --git a/.story_kit/work/6_archived/174_story_constrain_thinking_traces_in_chat_panel.md b/.storkit/work/6_archived/174_story_constrain_thinking_traces_in_chat_panel.md similarity index 100% rename from .story_kit/work/6_archived/174_story_constrain_thinking_traces_in_chat_panel.md rename to .storkit/work/6_archived/174_story_constrain_thinking_traces_in_chat_panel.md diff --git a/.story_kit/work/6_archived/174_story_matrix_chatbot_interface_for_story_kit.md b/.storkit/work/6_archived/174_story_matrix_chatbot_interface_for_story_kit.md similarity index 100% rename from .story_kit/work/6_archived/174_story_matrix_chatbot_interface_for_story_kit.md rename to .storkit/work/6_archived/174_story_matrix_chatbot_interface_for_story_kit.md diff --git a/.story_kit/work/6_archived/175_story_add_rust_test_coverage_reporting_with_cargo_llvm_cov.md b/.storkit/work/6_archived/175_story_add_rust_test_coverage_reporting_with_cargo_llvm_cov.md similarity index 100% rename from .story_kit/work/6_archived/175_story_add_rust_test_coverage_reporting_with_cargo_llvm_cov.md rename to .storkit/work/6_archived/175_story_add_rust_test_coverage_reporting_with_cargo_llvm_cov.md diff --git a/.story_kit/work/6_archived/176_bug_stories_moved_to_current_get_supervisor_instead_of_coder.md b/.storkit/work/6_archived/176_bug_stories_moved_to_current_get_supervisor_instead_of_coder.md similarity index 100% rename from .story_kit/work/6_archived/176_bug_stories_moved_to_current_get_supervisor_instead_of_coder.md rename to .storkit/work/6_archived/176_bug_stories_moved_to_current_get_supervisor_instead_of_coder.md diff --git a/.story_kit/work/6_archived/177_bug_no_mcp_tool_to_edit_story_acceptance_criteria.md b/.storkit/work/6_archived/177_bug_no_mcp_tool_to_edit_story_acceptance_criteria.md similarity index 100% rename from .story_kit/work/6_archived/177_bug_no_mcp_tool_to_edit_story_acceptance_criteria.md rename to .storkit/work/6_archived/177_bug_no_mcp_tool_to_edit_story_acceptance_criteria.md diff --git a/.story_kit/work/6_archived/178_story_fix_chat_textarea_input_lag.md b/.storkit/work/6_archived/178_story_fix_chat_textarea_input_lag.md similarity index 100% rename from .story_kit/work/6_archived/178_story_fix_chat_textarea_input_lag.md rename to .storkit/work/6_archived/178_story_fix_chat_textarea_input_lag.md diff --git a/.story_kit/work/6_archived/179_story_add_configurable_chat_history_pruning.md b/.storkit/work/6_archived/179_story_add_configurable_chat_history_pruning.md similarity index 100% rename from .story_kit/work/6_archived/179_story_add_configurable_chat_history_pruning.md rename to .storkit/work/6_archived/179_story_add_configurable_chat_history_pruning.md diff --git a/.story_kit/work/6_archived/17_story_display_remaining_context.md b/.storkit/work/6_archived/17_story_display_remaining_context.md similarity index 100% rename from .story_kit/work/6_archived/17_story_display_remaining_context.md rename to .storkit/work/6_archived/17_story_display_remaining_context.md diff --git a/.story_kit/work/6_archived/180_bug_web_ui_permissions_handling_unreliable.md b/.storkit/work/6_archived/180_bug_web_ui_permissions_handling_unreliable.md similarity index 100% rename from .story_kit/work/6_archived/180_bug_web_ui_permissions_handling_unreliable.md rename to .storkit/work/6_archived/180_bug_web_ui_permissions_handling_unreliable.md diff --git a/.story_kit/work/6_archived/181_story_live_pipeline_updates_in_matrix.md b/.storkit/work/6_archived/181_story_live_pipeline_updates_in_matrix.md similarity index 100% rename from .story_kit/work/6_archived/181_story_live_pipeline_updates_in_matrix.md rename to .storkit/work/6_archived/181_story_live_pipeline_updates_in_matrix.md diff --git a/.story_kit/work/6_archived/182_story_matrix_bot_conversation_context_and_multi_room.md b/.storkit/work/6_archived/182_story_matrix_bot_conversation_context_and_multi_room.md similarity index 100% rename from .story_kit/work/6_archived/182_story_matrix_bot_conversation_context_and_multi_room.md rename to .storkit/work/6_archived/182_story_matrix_bot_conversation_context_and_multi_room.md diff --git a/.story_kit/work/6_archived/183_story_refactor_matrix_bot_to_use_claude_code_provider_instead_of_direct_anthropic_api.md b/.storkit/work/6_archived/183_story_refactor_matrix_bot_to_use_claude_code_provider_instead_of_direct_anthropic_api.md similarity index 100% rename from .story_kit/work/6_archived/183_story_refactor_matrix_bot_to_use_claude_code_provider_instead_of_direct_anthropic_api.md rename to .storkit/work/6_archived/183_story_refactor_matrix_bot_to_use_claude_code_provider_instead_of_direct_anthropic_api.md diff --git a/.story_kit/work/6_archived/184_story_stream_bot_responses_to_matrix_on_double_newline_boundaries.md b/.storkit/work/6_archived/184_story_stream_bot_responses_to_matrix_on_double_newline_boundaries.md similarity index 100% rename from .story_kit/work/6_archived/184_story_stream_bot_responses_to_matrix_on_double_newline_boundaries.md rename to .storkit/work/6_archived/184_story_stream_bot_responses_to_matrix_on_double_newline_boundaries.md diff --git a/.story_kit/work/6_archived/185_bug_stale_completed_qa_agent_not_reaped_from_agent_list.md b/.storkit/work/6_archived/185_bug_stale_completed_qa_agent_not_reaped_from_agent_list.md similarity index 100% rename from .story_kit/work/6_archived/185_bug_stale_completed_qa_agent_not_reaped_from_agent_list.md rename to .storkit/work/6_archived/185_bug_stale_completed_qa_agent_not_reaped_from_agent_list.md diff --git a/.story_kit/work/6_archived/186_story_add_storkit_branding_to_header.md b/.storkit/work/6_archived/186_story_add_storkit_branding_to_header.md similarity index 100% rename from .story_kit/work/6_archived/186_story_add_storkit_branding_to_header.md rename to .storkit/work/6_archived/186_story_add_storkit_branding_to_header.md diff --git a/.story_kit/work/6_archived/187_story_preserve_queued_messages_in_chat_input_on_cancel.md b/.storkit/work/6_archived/187_story_preserve_queued_messages_in_chat_input_on_cancel.md similarity index 100% rename from .story_kit/work/6_archived/187_story_preserve_queued_messages_in_chat_input_on_cancel.md rename to .storkit/work/6_archived/187_story_preserve_queued_messages_in_chat_input_on_cancel.md diff --git a/.story_kit/work/6_archived/188_story_render_matrix_bot_messages_with_html_formatting.md b/.storkit/work/6_archived/188_story_render_matrix_bot_messages_with_html_formatting.md similarity index 100% rename from .story_kit/work/6_archived/188_story_render_matrix_bot_messages_with_html_formatting.md rename to .storkit/work/6_archived/188_story_render_matrix_bot_messages_with_html_formatting.md diff --git a/.story_kit/work/6_archived/189_story_surface_claude_code_compaction_notices_in_matrix_chat.md b/.storkit/work/6_archived/189_story_surface_claude_code_compaction_notices_in_matrix_chat.md similarity index 100% rename from .story_kit/work/6_archived/189_story_surface_claude_code_compaction_notices_in_matrix_chat.md rename to .storkit/work/6_archived/189_story_surface_claude_code_compaction_notices_in_matrix_chat.md diff --git a/.story_kit/work/6_archived/18_story_streaming_responses.md b/.storkit/work/6_archived/18_story_streaming_responses.md similarity index 100% rename from .story_kit/work/6_archived/18_story_streaming_responses.md rename to .storkit/work/6_archived/18_story_streaming_responses.md diff --git a/.story_kit/work/6_archived/190_story_auto_select_available_agent_for_stage_in_start_agent.md b/.storkit/work/6_archived/190_story_auto_select_available_agent_for_stage_in_start_agent.md similarity index 100% rename from .story_kit/work/6_archived/190_story_auto_select_available_agent_for_stage_in_start_agent.md rename to .storkit/work/6_archived/190_story_auto_select_available_agent_for_stage_in_start_agent.md diff --git a/.story_kit/work/6_archived/191_story_matrix_bot_should_only_respond_when_directly_addressed.md b/.storkit/work/6_archived/191_story_matrix_bot_should_only_respond_when_directly_addressed.md similarity index 100% rename from .story_kit/work/6_archived/191_story_matrix_bot_should_only_respond_when_directly_addressed.md rename to .storkit/work/6_archived/191_story_matrix_bot_should_only_respond_when_directly_addressed.md diff --git a/.story_kit/work/6_archived/192_bug_code_fences_lose_newlines_when_pasted_from_agent_output.md b/.storkit/work/6_archived/192_bug_code_fences_lose_newlines_when_pasted_from_agent_output.md similarity index 100% rename from .story_kit/work/6_archived/192_bug_code_fences_lose_newlines_when_pasted_from_agent_output.md rename to .storkit/work/6_archived/192_bug_code_fences_lose_newlines_when_pasted_from_agent_output.md diff --git a/.story_kit/work/6_archived/193_story_clickable_code_references_in_frontend.md b/.storkit/work/6_archived/193_story_clickable_code_references_in_frontend.md similarity index 100% rename from .story_kit/work/6_archived/193_story_clickable_code_references_in_frontend.md rename to .storkit/work/6_archived/193_story_clickable_code_references_in_frontend.md diff --git a/.story_kit/work/6_archived/194_story_enable_matrix_e2ee_with_cross_signing_verification_on_bot.md b/.storkit/work/6_archived/194_story_enable_matrix_e2ee_with_cross_signing_verification_on_bot.md similarity index 100% rename from .story_kit/work/6_archived/194_story_enable_matrix_e2ee_with_cross_signing_verification_on_bot.md rename to .storkit/work/6_archived/194_story_enable_matrix_e2ee_with_cross_signing_verification_on_bot.md diff --git a/.story_kit/work/6_archived/195_story_preserve_newlines_in_chat_message_submission.md b/.storkit/work/6_archived/195_story_preserve_newlines_in_chat_message_submission.md similarity index 100% rename from .story_kit/work/6_archived/195_story_preserve_newlines_in_chat_message_submission.md rename to .storkit/work/6_archived/195_story_preserve_newlines_in_chat_message_submission.md diff --git a/.story_kit/work/6_archived/196_story_render_code_fences_in_user_chat_messages.md b/.storkit/work/6_archived/196_story_render_code_fences_in_user_chat_messages.md similarity index 100% rename from .story_kit/work/6_archived/196_story_render_code_fences_in_user_chat_messages.md rename to .storkit/work/6_archived/196_story_render_code_fences_in_user_chat_messages.md diff --git a/.story_kit/work/6_archived/197_bug_cancel_button_discards_queued_messages_instead_of_preserving_them_in_chat_input.md b/.storkit/work/6_archived/197_bug_cancel_button_discards_queued_messages_instead_of_preserving_them_in_chat_input.md similarity index 100% rename from .story_kit/work/6_archived/197_bug_cancel_button_discards_queued_messages_instead_of_preserving_them_in_chat_input.md rename to .storkit/work/6_archived/197_bug_cancel_button_discards_queued_messages_instead_of_preserving_them_in_chat_input.md diff --git a/.story_kit/work/6_archived/198_story_distinguish_work_item_types_in_web_ui.md b/.storkit/work/6_archived/198_story_distinguish_work_item_types_in_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/198_story_distinguish_work_item_types_in_web_ui.md rename to .storkit/work/6_archived/198_story_distinguish_work_item_types_in_web_ui.md diff --git a/.story_kit/work/6_archived/199_story_web_ui_submits_all_queued_items_at_once.md b/.storkit/work/6_archived/199_story_web_ui_submits_all_queued_items_at_once.md similarity index 100% rename from .story_kit/work/6_archived/199_story_web_ui_submits_all_queued_items_at_once.md rename to .storkit/work/6_archived/199_story_web_ui_submits_all_queued_items_at_once.md diff --git a/.story_kit/work/6_archived/1_bug_anthropic_models_fetch_without_key.md b/.storkit/work/6_archived/1_bug_anthropic_models_fetch_without_key.md similarity index 100% rename from .story_kit/work/6_archived/1_bug_anthropic_models_fetch_without_key.md rename to .storkit/work/6_archived/1_bug_anthropic_models_fetch_without_key.md diff --git a/.story_kit/work/6_archived/200_story_auto_prune_worktrees_for_archived_stories_in_watcher_sweep.md b/.storkit/work/6_archived/200_story_auto_prune_worktrees_for_archived_stories_in_watcher_sweep.md similarity index 100% rename from .story_kit/work/6_archived/200_story_auto_prune_worktrees_for_archived_stories_in_watcher_sweep.md rename to .storkit/work/6_archived/200_story_auto_prune_worktrees_for_archived_stories_in_watcher_sweep.md diff --git a/.story_kit/work/6_archived/201_story_make_watcher_sweep_interval_configurable_via_project_toml.md b/.storkit/work/6_archived/201_story_make_watcher_sweep_interval_configurable_via_project_toml.md similarity index 100% rename from .story_kit/work/6_archived/201_story_make_watcher_sweep_interval_configurable_via_project_toml.md rename to .storkit/work/6_archived/201_story_make_watcher_sweep_interval_configurable_via_project_toml.md diff --git a/.story_kit/work/6_archived/202_story_make_agent_watchdog_interval_configurable_via_project_toml.md b/.storkit/work/6_archived/202_story_make_agent_watchdog_interval_configurable_via_project_toml.md similarity index 100% rename from .story_kit/work/6_archived/202_story_make_agent_watchdog_interval_configurable_via_project_toml.md rename to .storkit/work/6_archived/202_story_make_agent_watchdog_interval_configurable_via_project_toml.md diff --git a/.story_kit/work/6_archived/203_story_move_story_to_current_before_checking_agent_availability_in_start_agent.md b/.storkit/work/6_archived/203_story_move_story_to_current_before_checking_agent_availability_in_start_agent.md similarity index 100% rename from .story_kit/work/6_archived/203_story_move_story_to_current_before_checking_agent_availability_in_start_agent.md rename to .storkit/work/6_archived/203_story_move_story_to_current_before_checking_agent_availability_in_start_agent.md diff --git a/.story_kit/work/6_archived/204_story_rename_storkit_branding_to_story_kit.md b/.storkit/work/6_archived/204_story_rename_storkit_branding_to_story_kit.md similarity index 100% rename from .story_kit/work/6_archived/204_story_rename_storkit_branding_to_story_kit.md rename to .storkit/work/6_archived/204_story_rename_storkit_branding_to_story_kit.md diff --git a/.story_kit/work/6_archived/205_bug_mergemaster_marks_stories_as_done_without_squash_merging_code.md b/.storkit/work/6_archived/205_bug_mergemaster_marks_stories_as_done_without_squash_merging_code.md similarity index 100% rename from .story_kit/work/6_archived/205_bug_mergemaster_marks_stories_as_done_without_squash_merging_code.md rename to .storkit/work/6_archived/205_bug_mergemaster_marks_stories_as_done_without_squash_merging_code.md diff --git a/.story_kit/work/6_archived/206_story_claude_pty_should_be_selected_by_default_on_first_use.md b/.storkit/work/6_archived/206_story_claude_pty_should_be_selected_by_default_on_first_use.md similarity index 100% rename from .story_kit/work/6_archived/206_story_claude_pty_should_be_selected_by_default_on_first_use.md rename to .storkit/work/6_archived/206_story_claude_pty_should_be_selected_by_default_on_first_use.md diff --git a/.story_kit/work/6_archived/207_story_rename_llm_provider_labels_claude_pty_to_claude_code_anthropic_to_anthropic_api.md b/.storkit/work/6_archived/207_story_rename_llm_provider_labels_claude_pty_to_claude_code_anthropic_to_anthropic_api.md similarity index 100% rename from .story_kit/work/6_archived/207_story_rename_llm_provider_labels_claude_pty_to_claude_code_anthropic_to_anthropic_api.md rename to .storkit/work/6_archived/207_story_rename_llm_provider_labels_claude_pty_to_claude_code_anthropic_to_anthropic_api.md diff --git a/.story_kit/work/6_archived/208_bug_project_scaffold_does_not_write_mcp_json_to_project_root.md b/.storkit/work/6_archived/208_bug_project_scaffold_does_not_write_mcp_json_to_project_root.md similarity index 100% rename from .story_kit/work/6_archived/208_bug_project_scaffold_does_not_write_mcp_json_to_project_root.md rename to .storkit/work/6_archived/208_bug_project_scaffold_does_not_write_mcp_json_to_project_root.md diff --git a/.story_kit/work/6_archived/209_story_accept_optional_positional_path_argument_on_startup.md b/.storkit/work/6_archived/209_story_accept_optional_positional_path_argument_on_startup.md similarity index 100% rename from .story_kit/work/6_archived/209_story_accept_optional_positional_path_argument_on_startup.md rename to .storkit/work/6_archived/209_story_accept_optional_positional_path_argument_on_startup.md diff --git a/.story_kit/work/6_archived/20_story_start_new_session.md b/.storkit/work/6_archived/20_story_start_new_session.md similarity index 100% rename from .story_kit/work/6_archived/20_story_start_new_session.md rename to .storkit/work/6_archived/20_story_start_new_session.md diff --git a/.story_kit/work/6_archived/210_bug_pipeline_moves_story_to_done_even_when_mergemaster_reports_merge_failure.md b/.storkit/work/6_archived/210_bug_pipeline_moves_story_to_done_even_when_mergemaster_reports_merge_failure.md similarity index 100% rename from .story_kit/work/6_archived/210_bug_pipeline_moves_story_to_done_even_when_mergemaster_reports_merge_failure.md rename to .storkit/work/6_archived/210_bug_pipeline_moves_story_to_done_even_when_mergemaster_reports_merge_failure.md diff --git a/.story_kit/work/6_archived/211_story_skip_selection_screen_when_cli_path_argument_provided.md b/.storkit/work/6_archived/211_story_skip_selection_screen_when_cli_path_argument_provided.md similarity index 100% rename from .story_kit/work/6_archived/211_story_skip_selection_screen_when_cli_path_argument_provided.md rename to .storkit/work/6_archived/211_story_skip_selection_screen_when_cli_path_argument_provided.md diff --git a/.story_kit/work/6_archived/213_story_remove_colored_left_border_from_work_item_cards.md b/.storkit/work/6_archived/213_story_remove_colored_left_border_from_work_item_cards.md similarity index 100% rename from .story_kit/work/6_archived/213_story_remove_colored_left_border_from_work_item_cards.md rename to .storkit/work/6_archived/213_story_remove_colored_left_border_from_work_item_cards.md diff --git a/.story_kit/work/6_archived/214_story_scaffold_creates_complete_project_structure.md b/.storkit/work/6_archived/214_story_scaffold_creates_complete_project_structure.md similarity index 100% rename from .story_kit/work/6_archived/214_story_scaffold_creates_complete_project_structure.md rename to .storkit/work/6_archived/214_story_scaffold_creates_complete_project_structure.md diff --git a/.story_kit/work/6_archived/215_bug_cancel_button_still_discards_queued_messages_197_regression.md b/.storkit/work/6_archived/215_bug_cancel_button_still_discards_queued_messages_197_regression.md similarity index 100% rename from .story_kit/work/6_archived/215_bug_cancel_button_still_discards_queued_messages_197_regression.md rename to .storkit/work/6_archived/215_bug_cancel_button_still_discards_queued_messages_197_regression.md diff --git a/.story_kit/work/6_archived/216_story_merge_quality_gates_should_use_project_toml_components_and_script_test_instead_of_hardcoded_frontend_pnpm.md b/.storkit/work/6_archived/216_story_merge_quality_gates_should_use_project_toml_components_and_script_test_instead_of_hardcoded_frontend_pnpm.md similarity index 100% rename from .story_kit/work/6_archived/216_story_merge_quality_gates_should_use_project_toml_components_and_script_test_instead_of_hardcoded_frontend_pnpm.md rename to .storkit/work/6_archived/216_story_merge_quality_gates_should_use_project_toml_components_and_script_test_instead_of_hardcoded_frontend_pnpm.md diff --git a/.story_kit/work/6_archived/217_story_scaffold_generates_claude_md.md b/.storkit/work/6_archived/217_story_scaffold_generates_claude_md.md similarity index 100% rename from .story_kit/work/6_archived/217_story_scaffold_generates_claude_md.md rename to .storkit/work/6_archived/217_story_scaffold_generates_claude_md.md diff --git a/.story_kit/work/6_archived/218_story_hide_thinking_traces_from_agents_panel.md b/.storkit/work/6_archived/218_story_hide_thinking_traces_from_agents_panel.md similarity index 100% rename from .story_kit/work/6_archived/218_story_hide_thinking_traces_from_agents_panel.md rename to .storkit/work/6_archived/218_story_hide_thinking_traces_from_agents_panel.md diff --git a/.story_kit/work/6_archived/219_story_add_always_allow_option_to_web_ui_permission_dialog.md b/.storkit/work/6_archived/219_story_add_always_allow_option_to_web_ui_permission_dialog.md similarity index 100% rename from .story_kit/work/6_archived/219_story_add_always_allow_option_to_web_ui_permission_dialog.md rename to .storkit/work/6_archived/219_story_add_always_allow_option_to_web_ui_permission_dialog.md diff --git a/.story_kit/work/6_archived/220_story_acceptance_gates_in_current_stage_should_use_script_test_instead_of_hardcoded_cargo_clippy.md b/.storkit/work/6_archived/220_story_acceptance_gates_in_current_stage_should_use_script_test_instead_of_hardcoded_cargo_clippy.md similarity index 100% rename from .story_kit/work/6_archived/220_story_acceptance_gates_in_current_stage_should_use_script_test_instead_of_hardcoded_cargo_clippy.md rename to .storkit/work/6_archived/220_story_acceptance_gates_in_current_stage_should_use_script_test_instead_of_hardcoded_cargo_clippy.md diff --git a/.story_kit/work/6_archived/221_story_replace_llm_driven_qa_stage_with_deterministic_rust_pipeline.md b/.storkit/work/6_archived/221_story_replace_llm_driven_qa_stage_with_deterministic_rust_pipeline.md similarity index 100% rename from .story_kit/work/6_archived/221_story_replace_llm_driven_qa_stage_with_deterministic_rust_pipeline.md rename to .storkit/work/6_archived/221_story_replace_llm_driven_qa_stage_with_deterministic_rust_pipeline.md diff --git a/.story_kit/work/6_archived/222_story_scaffolded_agent_permissions_should_be_tech_stack_agnostic.md b/.storkit/work/6_archived/222_story_scaffolded_agent_permissions_should_be_tech_stack_agnostic.md similarity index 100% rename from .story_kit/work/6_archived/222_story_scaffolded_agent_permissions_should_be_tech_stack_agnostic.md rename to .storkit/work/6_archived/222_story_scaffolded_agent_permissions_should_be_tech_stack_agnostic.md diff --git a/.story_kit/work/6_archived/223_bug_qa_agent_not_stopped_when_story_moves_to_merge_stage.md b/.storkit/work/6_archived/223_bug_qa_agent_not_stopped_when_story_moves_to_merge_stage.md similarity index 100% rename from .story_kit/work/6_archived/223_bug_qa_agent_not_stopped_when_story_moves_to_merge_stage.md rename to .storkit/work/6_archived/223_bug_qa_agent_not_stopped_when_story_moves_to_merge_stage.md diff --git a/.story_kit/work/6_archived/224_story_expand_work_item_to_full_screen_detail_view.md b/.storkit/work/6_archived/224_story_expand_work_item_to_full_screen_detail_view.md similarity index 100% rename from .story_kit/work/6_archived/224_story_expand_work_item_to_full_screen_detail_view.md rename to .storkit/work/6_archived/224_story_expand_work_item_to_full_screen_detail_view.md diff --git a/.story_kit/work/6_archived/225_story_surface_merge_conflicts_and_failures_in_the_web_ui.md b/.storkit/work/6_archived/225_story_surface_merge_conflicts_and_failures_in_the_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/225_story_surface_merge_conflicts_and_failures_in_the_web_ui.md rename to .storkit/work/6_archived/225_story_surface_merge_conflicts_and_failures_in_the_web_ui.md diff --git a/.story_kit/work/6_archived/226_bug_mergemaster_accepts_stories_without_squash_merging_code.md b/.storkit/work/6_archived/226_bug_mergemaster_accepts_stories_without_squash_merging_code.md similarity index 100% rename from .story_kit/work/6_archived/226_bug_mergemaster_accepts_stories_without_squash_merging_code.md rename to .storkit/work/6_archived/226_bug_mergemaster_accepts_stories_without_squash_merging_code.md diff --git a/.story_kit/work/6_archived/227_bug_thinking_traces_visible_in_agents_panel_in_release_builds_only.md b/.storkit/work/6_archived/227_bug_thinking_traces_visible_in_agents_panel_in_release_builds_only.md similarity index 100% rename from .story_kit/work/6_archived/227_bug_thinking_traces_visible_in_agents_panel_in_release_builds_only.md rename to .storkit/work/6_archived/227_bug_thinking_traces_visible_in_agents_panel_in_release_builds_only.md diff --git a/.story_kit/work/6_archived/228_story_auto_detect_tech_stack_and_generate_component_sections_during_scaffolding.md b/.storkit/work/6_archived/228_story_auto_detect_tech_stack_and_generate_component_sections_during_scaffolding.md similarity index 100% rename from .story_kit/work/6_archived/228_story_auto_detect_tech_stack_and_generate_component_sections_during_scaffolding.md rename to .storkit/work/6_archived/228_story_auto_detect_tech_stack_and_generate_component_sections_during_scaffolding.md diff --git a/.story_kit/work/6_archived/229_story_coder_agents_should_check_off_acceptance_criteria_as_they_fulfill_them.md b/.storkit/work/6_archived/229_story_coder_agents_should_check_off_acceptance_criteria_as_they_fulfill_them.md similarity index 100% rename from .story_kit/work/6_archived/229_story_coder_agents_should_check_off_acceptance_criteria_as_they_fulfill_them.md rename to .storkit/work/6_archived/229_story_coder_agents_should_check_off_acceptance_criteria_as_they_fulfill_them.md diff --git a/.story_kit/work/6_archived/22_story_smart_autoscroll.md b/.storkit/work/6_archived/22_story_smart_autoscroll.md similarity index 100% rename from .story_kit/work/6_archived/22_story_smart_autoscroll.md rename to .storkit/work/6_archived/22_story_smart_autoscroll.md diff --git a/.story_kit/work/6_archived/230_story_prevent_duplicate_stage_agents_on_same_story.md b/.storkit/work/6_archived/230_story_prevent_duplicate_stage_agents_on_same_story.md similarity index 100% rename from .story_kit/work/6_archived/230_story_prevent_duplicate_stage_agents_on_same_story.md rename to .storkit/work/6_archived/230_story_prevent_duplicate_stage_agents_on_same_story.md diff --git a/.story_kit/work/6_archived/231_bug_agent_silently_disappears_when_worktree_creation_fails.md b/.storkit/work/6_archived/231_bug_agent_silently_disappears_when_worktree_creation_fails.md similarity index 100% rename from .story_kit/work/6_archived/231_bug_agent_silently_disappears_when_worktree_creation_fails.md rename to .storkit/work/6_archived/231_bug_agent_silently_disappears_when_worktree_creation_fails.md diff --git a/.story_kit/work/6_archived/232_story_fix_incorrect_bug_tool_descriptions_in_mcp_tools_list.md b/.storkit/work/6_archived/232_story_fix_incorrect_bug_tool_descriptions_in_mcp_tools_list.md similarity index 100% rename from .story_kit/work/6_archived/232_story_fix_incorrect_bug_tool_descriptions_in_mcp_tools_list.md rename to .storkit/work/6_archived/232_story_fix_incorrect_bug_tool_descriptions_in_mcp_tools_list.md diff --git a/.story_kit/work/6_archived/233_story_auto_assign_backoff_for_failed_merge_items.md b/.storkit/work/6_archived/233_story_auto_assign_backoff_for_failed_merge_items.md similarity index 100% rename from .story_kit/work/6_archived/233_story_auto_assign_backoff_for_failed_merge_items.md rename to .storkit/work/6_archived/233_story_auto_assign_backoff_for_failed_merge_items.md diff --git a/.story_kit/work/6_archived/235_story_show_agent_logs_for_a_story_in_expanded_work_item.md b/.storkit/work/6_archived/235_story_show_agent_logs_for_a_story_in_expanded_work_item.md similarity index 100% rename from .story_kit/work/6_archived/235_story_show_agent_logs_for_a_story_in_expanded_work_item.md rename to .storkit/work/6_archived/235_story_show_agent_logs_for_a_story_in_expanded_work_item.md diff --git a/.story_kit/work/6_archived/236_story_show_test_results_for_a_story_in_expanded_work_item.md b/.storkit/work/6_archived/236_story_show_test_results_for_a_story_in_expanded_work_item.md similarity index 100% rename from .story_kit/work/6_archived/236_story_show_test_results_for_a_story_in_expanded_work_item.md rename to .storkit/work/6_archived/236_story_show_test_results_for_a_story_in_expanded_work_item.md diff --git a/.story_kit/work/6_archived/237_bug_work_item_titles_render_too_large_in_expanded_view.md b/.storkit/work/6_archived/237_bug_work_item_titles_render_too_large_in_expanded_view.md similarity index 100% rename from .story_kit/work/6_archived/237_bug_work_item_titles_render_too_large_in_expanded_view.md rename to .storkit/work/6_archived/237_bug_work_item_titles_render_too_large_in_expanded_view.md diff --git a/.story_kit/work/6_archived/238_story_mergemaster_handles_merge_conflicts_by_resolving_them_automatically.md b/.storkit/work/6_archived/238_story_mergemaster_handles_merge_conflicts_by_resolving_them_automatically.md similarity index 100% rename from .story_kit/work/6_archived/238_story_mergemaster_handles_merge_conflicts_by_resolving_them_automatically.md rename to .storkit/work/6_archived/238_story_mergemaster_handles_merge_conflicts_by_resolving_them_automatically.md diff --git a/.story_kit/work/6_archived/23_story_alphabetize_llm_dropdown.md b/.storkit/work/6_archived/23_story_alphabetize_llm_dropdown.md similarity index 100% rename from .story_kit/work/6_archived/23_story_alphabetize_llm_dropdown.md rename to .storkit/work/6_archived/23_story_alphabetize_llm_dropdown.md diff --git a/.story_kit/work/6_archived/240_story_btw_side_question_slash_command.md b/.storkit/work/6_archived/240_story_btw_side_question_slash_command.md similarity index 100% rename from .story_kit/work/6_archived/240_story_btw_side_question_slash_command.md rename to .storkit/work/6_archived/240_story_btw_side_question_slash_command.md diff --git a/.story_kit/work/6_archived/241_story_help_slash_command.md b/.storkit/work/6_archived/241_story_help_slash_command.md similarity index 100% rename from .story_kit/work/6_archived/241_story_help_slash_command.md rename to .storkit/work/6_archived/241_story_help_slash_command.md diff --git a/.story_kit/work/6_archived/242_story_status_slash_command.md b/.storkit/work/6_archived/242_story_status_slash_command.md similarity index 100% rename from .story_kit/work/6_archived/242_story_status_slash_command.md rename to .storkit/work/6_archived/242_story_status_slash_command.md diff --git a/.story_kit/work/6_archived/243_bug_replace_pnpm_with_npm.md b/.storkit/work/6_archived/243_bug_replace_pnpm_with_npm.md similarity index 100% rename from .story_kit/work/6_archived/243_bug_replace_pnpm_with_npm.md rename to .storkit/work/6_archived/243_bug_replace_pnpm_with_npm.md diff --git a/.story_kit/work/6_archived/245_bug_chat_history_persistence_lost_on_page_refresh_story_145_regression.md b/.storkit/work/6_archived/245_bug_chat_history_persistence_lost_on_page_refresh_story_145_regression.md similarity index 100% rename from .story_kit/work/6_archived/245_bug_chat_history_persistence_lost_on_page_refresh_story_145_regression.md rename to .storkit/work/6_archived/245_bug_chat_history_persistence_lost_on_page_refresh_story_145_regression.md diff --git a/.story_kit/work/6_archived/246_story_enforce_cryptographic_identity_verification_for_matrix_commands.md b/.storkit/work/6_archived/246_story_enforce_cryptographic_identity_verification_for_matrix_commands.md similarity index 100% rename from .story_kit/work/6_archived/246_story_enforce_cryptographic_identity_verification_for_matrix_commands.md rename to .storkit/work/6_archived/246_story_enforce_cryptographic_identity_verification_for_matrix_commands.md diff --git a/.story_kit/work/6_archived/247_story_human_qa_gate_with_rejection_flow.md b/.storkit/work/6_archived/247_story_human_qa_gate_with_rejection_flow.md similarity index 100% rename from .story_kit/work/6_archived/247_story_human_qa_gate_with_rejection_flow.md rename to .storkit/work/6_archived/247_story_human_qa_gate_with_rejection_flow.md diff --git a/.story_kit/work/6_archived/248_bug_chat_does_not_auto_scroll_to_new_messages.md b/.storkit/work/6_archived/248_bug_chat_does_not_auto_scroll_to_new_messages.md similarity index 100% rename from .story_kit/work/6_archived/248_bug_chat_does_not_auto_scroll_to_new_messages.md rename to .storkit/work/6_archived/248_bug_chat_does_not_auto_scroll_to_new_messages.md diff --git a/.story_kit/work/6_archived/249_story_agent_assignment_via_story_front_matter.md b/.storkit/work/6_archived/249_story_agent_assignment_via_story_front_matter.md similarity index 100% rename from .story_kit/work/6_archived/249_story_agent_assignment_via_story_front_matter.md rename to .storkit/work/6_archived/249_story_agent_assignment_via_story_front_matter.md diff --git a/.story_kit/work/6_archived/24_story_tauri_to_browser_ui.md b/.storkit/work/6_archived/24_story_tauri_to_browser_ui.md similarity index 100% rename from .story_kit/work/6_archived/24_story_tauri_to_browser_ui.md rename to .storkit/work/6_archived/24_story_tauri_to_browser_ui.md diff --git a/.story_kit/work/6_archived/250_bug_merge_pipeline_cherry_pick_fails_with_bad_revision_on_merge_queue_branch.md b/.storkit/work/6_archived/250_bug_merge_pipeline_cherry_pick_fails_with_bad_revision_on_merge_queue_branch.md similarity index 100% rename from .story_kit/work/6_archived/250_bug_merge_pipeline_cherry_pick_fails_with_bad_revision_on_merge_queue_branch.md rename to .storkit/work/6_archived/250_bug_merge_pipeline_cherry_pick_fails_with_bad_revision_on_merge_queue_branch.md diff --git a/.story_kit/work/6_archived/251_bug_archive_sweep_not_moving_stories_from_done_to_archived.md b/.storkit/work/6_archived/251_bug_archive_sweep_not_moving_stories_from_done_to_archived.md similarity index 100% rename from .story_kit/work/6_archived/251_bug_archive_sweep_not_moving_stories_from_done_to_archived.md rename to .storkit/work/6_archived/251_bug_archive_sweep_not_moving_stories_from_done_to_archived.md diff --git a/.story_kit/work/6_archived/252_story_coder_agents_must_find_root_causes_for_bugs.md b/.storkit/work/6_archived/252_story_coder_agents_must_find_root_causes_for_bugs.md similarity index 100% rename from .story_kit/work/6_archived/252_story_coder_agents_must_find_root_causes_for_bugs.md rename to .storkit/work/6_archived/252_story_coder_agents_must_find_root_causes_for_bugs.md diff --git a/.story_kit/work/6_archived/253_bug_watcher_and_auto_assign_do_not_reinitialize_when_project_root_changes.md b/.storkit/work/6_archived/253_bug_watcher_and_auto_assign_do_not_reinitialize_when_project_root_changes.md similarity index 100% rename from .story_kit/work/6_archived/253_bug_watcher_and_auto_assign_do_not_reinitialize_when_project_root_changes.md rename to .storkit/work/6_archived/253_bug_watcher_and_auto_assign_do_not_reinitialize_when_project_root_changes.md diff --git a/.story_kit/work/6_archived/254_story_add_refactor_work_item_type.md b/.storkit/work/6_archived/254_story_add_refactor_work_item_type.md similarity index 100% rename from .story_kit/work/6_archived/254_story_add_refactor_work_item_type.md rename to .storkit/work/6_archived/254_story_add_refactor_work_item_type.md diff --git a/.story_kit/work/6_archived/255_story_show_agent_logs_in_expanded_story_popup.md b/.storkit/work/6_archived/255_story_show_agent_logs_in_expanded_story_popup.md similarity index 100% rename from .story_kit/work/6_archived/255_story_show_agent_logs_in_expanded_story_popup.md rename to .storkit/work/6_archived/255_story_show_agent_logs_in_expanded_story_popup.md diff --git a/.story_kit/work/6_archived/256_story_bot_must_verify_other_users_cross_signing_identity_before_checking_device_verification.md b/.storkit/work/6_archived/256_story_bot_must_verify_other_users_cross_signing_identity_before_checking_device_verification.md similarity index 100% rename from .story_kit/work/6_archived/256_story_bot_must_verify_other_users_cross_signing_identity_before_checking_device_verification.md rename to .storkit/work/6_archived/256_story_bot_must_verify_other_users_cross_signing_identity_before_checking_device_verification.md diff --git a/.story_kit/work/6_archived/257_story_rename_storkit_to_story_kit_in_header.md b/.storkit/work/6_archived/257_story_rename_storkit_to_story_kit_in_header.md similarity index 100% rename from .story_kit/work/6_archived/257_story_rename_storkit_to_story_kit_in_header.md rename to .storkit/work/6_archived/257_story_rename_storkit_to_story_kit_in_header.md diff --git a/.story_kit/work/6_archived/258_bug_auto_assign_not_called_after_merge_failure.md b/.storkit/work/6_archived/258_bug_auto_assign_not_called_after_merge_failure.md similarity index 100% rename from .story_kit/work/6_archived/258_bug_auto_assign_not_called_after_merge_failure.md rename to .storkit/work/6_archived/258_bug_auto_assign_not_called_after_merge_failure.md diff --git a/.story_kit/work/6_archived/259_story_move_story_kit_ignores_into_story_kit_gitignore.md b/.storkit/work/6_archived/259_story_move_story_kit_ignores_into_story_kit_gitignore.md similarity index 100% rename from .story_kit/work/6_archived/259_story_move_story_kit_ignores_into_story_kit_gitignore.md rename to .storkit/work/6_archived/259_story_move_story_kit_ignores_into_story_kit_gitignore.md diff --git a/.story_kit/work/6_archived/25_story_auto_scaffold_story_kit.md b/.storkit/work/6_archived/25_story_auto_scaffold_story_kit.md similarity index 100% rename from .story_kit/work/6_archived/25_story_auto_scaffold_story_kit.md rename to .storkit/work/6_archived/25_story_auto_scaffold_story_kit.md diff --git a/.story_kit/work/6_archived/261_story_bot_notifications_when_stories_move_between_stages.md b/.storkit/work/6_archived/261_story_bot_notifications_when_stories_move_between_stages.md similarity index 100% rename from .story_kit/work/6_archived/261_story_bot_notifications_when_stories_move_between_stages.md rename to .storkit/work/6_archived/261_story_bot_notifications_when_stories_move_between_stages.md diff --git a/.story_kit/work/6_archived/262_story_bot_error_notifications_for_story_failures.md b/.storkit/work/6_archived/262_story_bot_error_notifications_for_story_failures.md similarity index 100% rename from .story_kit/work/6_archived/262_story_bot_error_notifications_for_story_failures.md rename to .storkit/work/6_archived/262_story_bot_error_notifications_for_story_failures.md diff --git a/.story_kit/work/6_archived/263_story_matrix_bot_self_signs_device_keys_at_startup_for_verified_encryption.md b/.storkit/work/6_archived/263_story_matrix_bot_self_signs_device_keys_at_startup_for_verified_encryption.md similarity index 100% rename from .story_kit/work/6_archived/263_story_matrix_bot_self_signs_device_keys_at_startup_for_verified_encryption.md rename to .storkit/work/6_archived/263_story_matrix_bot_self_signs_device_keys_at_startup_for_verified_encryption.md diff --git a/.story_kit/work/6_archived/264_bug_claude_code_session_id_not_persisted_across_browser_refresh.md b/.storkit/work/6_archived/264_bug_claude_code_session_id_not_persisted_across_browser_refresh.md similarity index 100% rename from .story_kit/work/6_archived/264_bug_claude_code_session_id_not_persisted_across_browser_refresh.md rename to .storkit/work/6_archived/264_bug_claude_code_session_id_not_persisted_across_browser_refresh.md diff --git a/.story_kit/work/6_archived/265_story_spikes_skip_merge_and_stop_for_human_review.md b/.storkit/work/6_archived/265_story_spikes_skip_merge_and_stop_for_human_review.md similarity index 100% rename from .story_kit/work/6_archived/265_story_spikes_skip_merge_and_stop_for_human_review.md rename to .storkit/work/6_archived/265_story_spikes_skip_merge_and_stop_for_human_review.md diff --git a/.story_kit/work/6_archived/266_story_matrix_bot_structured_conversation_history.md b/.storkit/work/6_archived/266_story_matrix_bot_structured_conversation_history.md similarity index 100% rename from .story_kit/work/6_archived/266_story_matrix_bot_structured_conversation_history.md rename to .storkit/work/6_archived/266_story_matrix_bot_structured_conversation_history.md diff --git a/.story_kit/work/6_archived/267_story_mcp_update_story_tool_should_support_front_matter_fields.md b/.storkit/work/6_archived/267_story_mcp_update_story_tool_should_support_front_matter_fields.md similarity index 100% rename from .story_kit/work/6_archived/267_story_mcp_update_story_tool_should_support_front_matter_fields.md rename to .storkit/work/6_archived/267_story_mcp_update_story_tool_should_support_front_matter_fields.md diff --git a/.story_kit/work/6_archived/268_refactor_upgrade_tokio_tungstenite_to_0_29_0.md b/.storkit/work/6_archived/268_refactor_upgrade_tokio_tungstenite_to_0_29_0.md similarity index 100% rename from .story_kit/work/6_archived/268_refactor_upgrade_tokio_tungstenite_to_0_29_0.md rename to .storkit/work/6_archived/268_refactor_upgrade_tokio_tungstenite_to_0_29_0.md diff --git a/.story_kit/work/6_archived/269_story_file_references_in_web_ui_chat_input.md b/.storkit/work/6_archived/269_story_file_references_in_web_ui_chat_input.md similarity index 100% rename from .story_kit/work/6_archived/269_story_file_references_in_web_ui_chat_input.md rename to .storkit/work/6_archived/269_story_file_references_in_web_ui_chat_input.md diff --git a/.story_kit/work/6_archived/26_story_establish_tdd_workflow_and_gates.md b/.storkit/work/6_archived/26_story_establish_tdd_workflow_and_gates.md similarity index 100% rename from .story_kit/work/6_archived/26_story_establish_tdd_workflow_and_gates.md rename to .storkit/work/6_archived/26_story_establish_tdd_workflow_and_gates.md diff --git a/.story_kit/work/6_archived/270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port.md b/.storkit/work/6_archived/270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port.md similarity index 100% rename from .story_kit/work/6_archived/270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port.md rename to .storkit/work/6_archived/270_bug_qa_test_server_overwrites_root_mcp_json_with_wrong_port.md diff --git a/.story_kit/work/6_archived/271_story_show_assigned_agent_in_expanded_work_item_view.md b/.storkit/work/6_archived/271_story_show_assigned_agent_in_expanded_work_item_view.md similarity index 100% rename from .story_kit/work/6_archived/271_story_show_assigned_agent_in_expanded_work_item_view.md rename to .storkit/work/6_archived/271_story_show_assigned_agent_in_expanded_work_item_view.md diff --git a/.story_kit/work/6_archived/272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage.md b/.storkit/work/6_archived/272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage.md similarity index 100% rename from .story_kit/work/6_archived/272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage.md rename to .storkit/work/6_archived/272_story_clear_merge_error_front_matter_when_story_leaves_merge_stage.md diff --git a/.story_kit/work/6_archived/273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response.md b/.storkit/work/6_archived/273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response.md similarity index 100% rename from .story_kit/work/6_archived/273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response.md rename to .storkit/work/6_archived/273_story_matrix_bot_sends_typing_indicator_while_waiting_for_claude_response.md diff --git a/.story_kit/work/6_archived/274_story_mcp_pipeline_status_tool_with_agent_assignments.md b/.storkit/work/6_archived/274_story_mcp_pipeline_status_tool_with_agent_assignments.md similarity index 100% rename from .story_kit/work/6_archived/274_story_mcp_pipeline_status_tool_with_agent_assignments.md rename to .storkit/work/6_archived/274_story_mcp_pipeline_status_tool_with_agent_assignments.md diff --git a/.story_kit/work/6_archived/275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat.md b/.storkit/work/6_archived/275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat.md similarity index 100% rename from .story_kit/work/6_archived/275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat.md rename to .storkit/work/6_archived/275_story_matrix_bot_surfaces_claude_code_permission_prompts_to_chat.md diff --git a/.story_kit/work/6_archived/276_story_detect_and_log_when_root_mcp_json_port_is_modified.md b/.storkit/work/6_archived/276_story_detect_and_log_when_root_mcp_json_port_is_modified.md similarity index 100% rename from .story_kit/work/6_archived/276_story_detect_and_log_when_root_mcp_json_port_is_modified.md rename to .storkit/work/6_archived/276_story_detect_and_log_when_root_mcp_json_port_is_modified.md diff --git a/.story_kit/work/6_archived/277_story_matrix_bot_uses_its_configured_name_instead_of_claude.md b/.storkit/work/6_archived/277_story_matrix_bot_uses_its_configured_name_instead_of_claude.md similarity index 100% rename from .story_kit/work/6_archived/277_story_matrix_bot_uses_its_configured_name_instead_of_claude.md rename to .storkit/work/6_archived/277_story_matrix_bot_uses_its_configured_name_instead_of_claude.md diff --git a/.story_kit/work/6_archived/278_story_auto_assign_agents_to_pipeline_items_on_server_startup.md b/.storkit/work/6_archived/278_story_auto_assign_agents_to_pipeline_items_on_server_startup.md similarity index 100% rename from .story_kit/work/6_archived/278_story_auto_assign_agents_to_pipeline_items_on_server_startup.md rename to .storkit/work/6_archived/278_story_auto_assign_agents_to_pipeline_items_on_server_startup.md diff --git a/.story_kit/work/6_archived/279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent.md b/.storkit/work/6_archived/279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent.md similarity index 100% rename from .story_kit/work/6_archived/279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent.md rename to .storkit/work/6_archived/279_story_auto_assign_should_respect_agent_stage_when_front_matter_specifies_agent.md diff --git a/.story_kit/work/6_archived/27_story_protect_tests_and_coverage.md b/.storkit/work/6_archived/27_story_protect_tests_and_coverage.md similarity index 100% rename from .story_kit/work/6_archived/27_story_protect_tests_and_coverage.md rename to .storkit/work/6_archived/27_story_protect_tests_and_coverage.md diff --git a/.story_kit/work/6_archived/281_story_matrix_bot_announces_itself_when_it_comes_online.md b/.storkit/work/6_archived/281_story_matrix_bot_announces_itself_when_it_comes_online.md similarity index 100% rename from .story_kit/work/6_archived/281_story_matrix_bot_announces_itself_when_it_comes_online.md rename to .storkit/work/6_archived/281_story_matrix_bot_announces_itself_when_it_comes_online.md diff --git a/.story_kit/work/6_archived/282_story_matrix_bot_ambient_mode_toggle_via_chat_command.md b/.storkit/work/6_archived/282_story_matrix_bot_ambient_mode_toggle_via_chat_command.md similarity index 100% rename from .story_kit/work/6_archived/282_story_matrix_bot_ambient_mode_toggle_via_chat_command.md rename to .storkit/work/6_archived/282_story_matrix_bot_ambient_mode_toggle_via_chat_command.md diff --git a/.story_kit/work/6_archived/283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge.md b/.storkit/work/6_archived/283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge.md similarity index 100% rename from .story_kit/work/6_archived/283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge.md rename to .storkit/work/6_archived/283_bug_pipeline_does_not_check_manual_qa_flag_before_advancing_from_qa_to_merge.md diff --git a/.story_kit/work/6_archived/284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability.md b/.storkit/work/6_archived/284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability.md similarity index 100% rename from .story_kit/work/6_archived/284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability.md rename to .storkit/work/6_archived/284_story_matrix_bot_status_command_shows_pipeline_and_agent_availability.md diff --git a/.story_kit/work/6_archived/285_story_matrix_bot_help_command_lists_available_bot_commands.md b/.storkit/work/6_archived/285_story_matrix_bot_help_command_lists_available_bot_commands.md similarity index 100% rename from .story_kit/work/6_archived/285_story_matrix_bot_help_command_lists_available_bot_commands.md rename to .storkit/work/6_archived/285_story_matrix_bot_help_command_lists_available_bot_commands.md diff --git a/.story_kit/work/6_archived/286_story_server_self_rebuild_and_restart_via_mcp_tool.md b/.storkit/work/6_archived/286_story_server_self_rebuild_and_restart_via_mcp_tool.md similarity index 100% rename from .story_kit/work/6_archived/286_story_server_self_rebuild_and_restart_via_mcp_tool.md rename to .storkit/work/6_archived/286_story_server_self_rebuild_and_restart_via_mcp_tool.md diff --git a/.story_kit/work/6_archived/287_story_rename_upcoming_pipeline_stage_to_backlog.md b/.storkit/work/6_archived/287_story_rename_upcoming_pipeline_stage_to_backlog.md similarity index 100% rename from .story_kit/work/6_archived/287_story_rename_upcoming_pipeline_stage_to_backlog.md rename to .storkit/work/6_archived/287_story_rename_upcoming_pipeline_stage_to_backlog.md diff --git a/.story_kit/work/6_archived/288_bug_ambient_mode_state_lost_on_server_restart.md b/.storkit/work/6_archived/288_bug_ambient_mode_state_lost_on_server_restart.md similarity index 100% rename from .story_kit/work/6_archived/288_bug_ambient_mode_state_lost_on_server_restart.md rename to .storkit/work/6_archived/288_bug_ambient_mode_state_lost_on_server_restart.md diff --git a/.story_kit/work/6_archived/289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild.md b/.storkit/work/6_archived/289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild.md similarity index 100% rename from .story_kit/work/6_archived/289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild.md rename to .storkit/work/6_archived/289_bug_rebuild_and_restart_mcp_tool_does_not_rebuild.md diff --git a/.story_kit/work/6_archived/28_story_ui_show_test_todos.md b/.storkit/work/6_archived/28_story_ui_show_test_todos.md similarity index 100% rename from .story_kit/work/6_archived/28_story_ui_show_test_todos.md rename to .storkit/work/6_archived/28_story_ui_show_test_todos.md diff --git a/.story_kit/work/6_archived/290_story_show_agent_output_stream_in_expanded_work_item_detail_panel.md b/.storkit/work/6_archived/290_story_show_agent_output_stream_in_expanded_work_item_detail_panel.md similarity index 100% rename from .story_kit/work/6_archived/290_story_show_agent_output_stream_in_expanded_work_item_detail_panel.md rename to .storkit/work/6_archived/290_story_show_agent_output_stream_in_expanded_work_item_detail_panel.md diff --git a/.story_kit/work/6_archived/291_story_show_test_results_in_work_item_detail_panel.md b/.storkit/work/6_archived/291_story_show_test_results_in_work_item_detail_panel.md similarity index 100% rename from .story_kit/work/6_archived/291_story_show_test_results_in_work_item_detail_panel.md rename to .storkit/work/6_archived/291_story_show_test_results_in_work_item_detail_panel.md diff --git a/.story_kit/work/6_archived/292_story_show_server_logs_in_web_ui.md b/.storkit/work/6_archived/292_story_show_server_logs_in_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/292_story_show_server_logs_in_web_ui.md rename to .storkit/work/6_archived/292_story_show_server_logs_in_web_ui.md diff --git a/.story_kit/work/6_archived/293_story_register_all_bot_commands_in_the_command_registry.md b/.storkit/work/6_archived/293_story_register_all_bot_commands_in_the_command_registry.md similarity index 100% rename from .story_kit/work/6_archived/293_story_register_all_bot_commands_in_the_command_registry.md rename to .storkit/work/6_archived/293_story_register_all_bot_commands_in_the_command_registry.md diff --git a/.story_kit/work/6_archived/294_story_rename_app_title_from_story_kit_to_storkit.md b/.storkit/work/6_archived/294_story_rename_app_title_from_story_kit_to_storkit.md similarity index 100% rename from .story_kit/work/6_archived/294_story_rename_app_title_from_story_kit_to_storkit.md rename to .storkit/work/6_archived/294_story_rename_app_title_from_story_kit_to_storkit.md diff --git a/.story_kit/work/6_archived/295_bug_stories_stuck_in_qa_when_qa_agent_is_busy.md b/.storkit/work/6_archived/295_bug_stories_stuck_in_qa_when_qa_agent_is_busy.md similarity index 100% rename from .story_kit/work/6_archived/295_bug_stories_stuck_in_qa_when_qa_agent_is_busy.md rename to .storkit/work/6_archived/295_bug_stories_stuck_in_qa_when_qa_agent_is_busy.md diff --git a/.story_kit/work/6_archived/296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation.md b/.storkit/work/6_archived/296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation.md similarity index 100% rename from .story_kit/work/6_archived/296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation.md rename to .storkit/work/6_archived/296_story_track_per_agent_token_usage_for_cost_visibility_and_optimisation.md diff --git a/.story_kit/work/6_archived/297_story_improve_bot_status_command_formatting.md b/.storkit/work/6_archived/297_story_improve_bot_status_command_formatting.md similarity index 100% rename from .story_kit/work/6_archived/297_story_improve_bot_status_command_formatting.md rename to .storkit/work/6_archived/297_story_improve_bot_status_command_formatting.md diff --git a/.story_kit/work/6_archived/298_story_bot_htop_command_with_live_updating_process_dashboard.md b/.storkit/work/6_archived/298_story_bot_htop_command_with_live_updating_process_dashboard.md similarity index 100% rename from .story_kit/work/6_archived/298_story_bot_htop_command_with_live_updating_process_dashboard.md rename to .storkit/work/6_archived/298_story_bot_htop_command_with_live_updating_process_dashboard.md diff --git a/.story_kit/work/6_archived/299_story_bot_git_status_command_shows_working_tree_and_branch_info.md b/.storkit/work/6_archived/299_story_bot_git_status_command_shows_working_tree_and_branch_info.md similarity index 100% rename from .story_kit/work/6_archived/299_story_bot_git_status_command_shows_working_tree_and_branch_info.md rename to .storkit/work/6_archived/299_story_bot_git_status_command_shows_working_tree_and_branch_info.md diff --git a/.story_kit/work/6_archived/29_story_backfill_tests_high_coverage.md b/.storkit/work/6_archived/29_story_backfill_tests_high_coverage.md similarity index 100% rename from .story_kit/work/6_archived/29_story_backfill_tests_high_coverage.md rename to .storkit/work/6_archived/29_story_backfill_tests_high_coverage.md diff --git a/.story_kit/work/6_archived/2_bug_agent_panel_expand_does_nothing.md b/.storkit/work/6_archived/2_bug_agent_panel_expand_does_nothing.md similarity index 100% rename from .story_kit/work/6_archived/2_bug_agent_panel_expand_does_nothing.md rename to .storkit/work/6_archived/2_bug_agent_panel_expand_does_nothing.md diff --git a/.story_kit/work/6_archived/300_story_show_token_cost_badge_on_pipeline_board_work_items.md b/.storkit/work/6_archived/300_story_show_token_cost_badge_on_pipeline_board_work_items.md similarity index 100% rename from .story_kit/work/6_archived/300_story_show_token_cost_badge_on_pipeline_board_work_items.md rename to .storkit/work/6_archived/300_story_show_token_cost_badge_on_pipeline_board_work_items.md diff --git a/.story_kit/work/6_archived/301_story_dedicated_token_usage_page_in_web_ui.md b/.storkit/work/6_archived/301_story_dedicated_token_usage_page_in_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/301_story_dedicated_token_usage_page_in_web_ui.md rename to .storkit/work/6_archived/301_story_dedicated_token_usage_page_in_web_ui.md diff --git a/.story_kit/work/6_archived/302_story_bot_cost_command_shows_total_and_per_story_token_spend.md b/.storkit/work/6_archived/302_story_bot_cost_command_shows_total_and_per_story_token_spend.md similarity index 100% rename from .story_kit/work/6_archived/302_story_bot_cost_command_shows_total_and_per_story_token_spend.md rename to .storkit/work/6_archived/302_story_bot_cost_command_shows_total_and_per_story_token_spend.md diff --git a/.story_kit/work/6_archived/303_story_bot_cost_command_with_story_filter_for_detailed_breakdown.md b/.storkit/work/6_archived/303_story_bot_cost_command_with_story_filter_for_detailed_breakdown.md similarity index 100% rename from .story_kit/work/6_archived/303_story_bot_cost_command_with_story_filter_for_detailed_breakdown.md rename to .storkit/work/6_archived/303_story_bot_cost_command_with_story_filter_for_detailed_breakdown.md diff --git a/.story_kit/work/6_archived/304_story_mcp_tool_to_move_stories_between_pipeline_stages.md b/.storkit/work/6_archived/304_story_mcp_tool_to_move_stories_between_pipeline_stages.md similarity index 100% rename from .story_kit/work/6_archived/304_story_mcp_tool_to_move_stories_between_pipeline_stages.md rename to .storkit/work/6_archived/304_story_mcp_tool_to_move_stories_between_pipeline_stages.md diff --git a/.story_kit/work/6_archived/305_story_bot_show_command_displays_story_text_in_chat.md b/.storkit/work/6_archived/305_story_bot_show_command_displays_story_text_in_chat.md similarity index 100% rename from .story_kit/work/6_archived/305_story_bot_show_command_displays_story_text_in_chat.md rename to .storkit/work/6_archived/305_story_bot_show_command_displays_story_text_in_chat.md diff --git a/.story_kit/work/6_archived/306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field.md b/.storkit/work/6_archived/306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field.md similarity index 100% rename from .story_kit/work/6_archived/306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field.md rename to .storkit/work/6_archived/306_story_replace_manual_qa_boolean_with_configurable_qa_mode_field.md diff --git a/.story_kit/work/6_archived/307_story_configurable_coder_pool_size_and_default_model_in_project_toml.md b/.storkit/work/6_archived/307_story_configurable_coder_pool_size_and_default_model_in_project_toml.md similarity index 100% rename from .story_kit/work/6_archived/307_story_configurable_coder_pool_size_and_default_model_in_project_toml.md rename to .storkit/work/6_archived/307_story_configurable_coder_pool_size_and_default_model_in_project_toml.md diff --git a/.story_kit/work/6_archived/309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel.md b/.storkit/work/6_archived/309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel.md similarity index 100% rename from .story_kit/work/6_archived/309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel.md rename to .storkit/work/6_archived/309_story_show_token_cost_breakdown_in_expanded_work_item_detail_panel.md diff --git a/.story_kit/work/6_archived/30_story_worktree_agent_orchestration.md b/.storkit/work/6_archived/30_story_worktree_agent_orchestration.md similarity index 100% rename from .story_kit/work/6_archived/30_story_worktree_agent_orchestration.md rename to .storkit/work/6_archived/30_story_worktree_agent_orchestration.md diff --git a/.story_kit/work/6_archived/310_story_bot_delete_command_removes_a_story_from_the_pipeline.md b/.storkit/work/6_archived/310_story_bot_delete_command_removes_a_story_from_the_pipeline.md similarity index 100% rename from .story_kit/work/6_archived/310_story_bot_delete_command_removes_a_story_from_the_pipeline.md rename to .storkit/work/6_archived/310_story_bot_delete_command_removes_a_story_from_the_pipeline.md diff --git a/.story_kit/work/6_archived/311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories.md b/.storkit/work/6_archived/311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories.md similarity index 100% rename from .story_kit/work/6_archived/311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories.md rename to .storkit/work/6_archived/311_story_server_enforced_retry_limits_for_failed_merge_and_empty_diff_stories.md diff --git a/.story_kit/work/6_archived/312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories.md b/.storkit/work/6_archived/312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories.md similarity index 100% rename from .story_kit/work/6_archived/312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories.md rename to .storkit/work/6_archived/312_bug_auto_assign_assigns_mergemaster_to_coding_stage_stories.md diff --git a/.story_kit/work/6_archived/313_story_improve_htop_output_formatting_for_mobile_matrix_clients.md b/.storkit/work/6_archived/313_story_improve_htop_output_formatting_for_mobile_matrix_clients.md similarity index 100% rename from .story_kit/work/6_archived/313_story_improve_htop_output_formatting_for_mobile_matrix_clients.md rename to .storkit/work/6_archived/313_story_improve_htop_output_formatting_for_mobile_matrix_clients.md diff --git a/.story_kit/work/6_archived/314_story_show_token_cost_per_story_in_bot_status_command_output.md b/.storkit/work/6_archived/314_story_show_token_cost_per_story_in_bot_status_command_output.md similarity index 100% rename from .story_kit/work/6_archived/314_story_show_token_cost_per_story_in_bot_status_command_output.md rename to .storkit/work/6_archived/314_story_show_token_cost_per_story_in_bot_status_command_output.md diff --git a/.story_kit/work/6_archived/315_story_rename_binary_and_all_references_from_story_kit_to_storkit.md b/.storkit/work/6_archived/315_story_rename_binary_and_all_references_from_story_kit_to_storkit.md similarity index 100% rename from .story_kit/work/6_archived/315_story_rename_binary_and_all_references_from_story_kit_to_storkit.md rename to .storkit/work/6_archived/315_story_rename_binary_and_all_references_from_story_kit_to_storkit.md diff --git a/.story_kit/work/6_archived/316_refactor_abstract_bot_transport_layer_for_multi_platform_support.md b/.storkit/work/6_archived/316_refactor_abstract_bot_transport_layer_for_multi_platform_support.md similarity index 100% rename from .story_kit/work/6_archived/316_refactor_abstract_bot_transport_layer_for_multi_platform_support.md rename to .storkit/work/6_archived/316_refactor_abstract_bot_transport_layer_for_multi_platform_support.md diff --git a/.story_kit/work/6_archived/317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules.md b/.storkit/work/6_archived/317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules.md similarity index 100% rename from .story_kit/work/6_archived/317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules.md rename to .storkit/work/6_archived/317_refactor_split_pool_rs_into_pipeline_auto_assign_and_agent_management_modules.md diff --git a/.story_kit/work/6_archived/318_refactor_split_mcp_rs_into_domain_specific_tool_modules.md b/.storkit/work/6_archived/318_refactor_split_mcp_rs_into_domain_specific_tool_modules.md similarity index 100% rename from .story_kit/work/6_archived/318_refactor_split_mcp_rs_into_domain_specific_tool_modules.md rename to .storkit/work/6_archived/318_refactor_split_mcp_rs_into_domain_specific_tool_modules.md diff --git a/.story_kit/work/6_archived/319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules.md b/.storkit/work/6_archived/319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules.md similarity index 100% rename from .story_kit/work/6_archived/319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules.md rename to .storkit/work/6_archived/319_refactor_split_workflow_rs_into_story_bug_and_test_result_modules.md diff --git a/.story_kit/work/6_archived/31_story_view_upcoming_stories.md b/.storkit/work/6_archived/31_story_view_upcoming_stories.md similarity index 100% rename from .story_kit/work/6_archived/31_story_view_upcoming_stories.md rename to .storkit/work/6_archived/31_story_view_upcoming_stories.md diff --git a/.story_kit/work/6_archived/320_story_whatsapp_business_api_integration_for_bot_commands.md b/.storkit/work/6_archived/320_story_whatsapp_business_api_integration_for_bot_commands.md similarity index 100% rename from .story_kit/work/6_archived/320_story_whatsapp_business_api_integration_for_bot_commands.md rename to .storkit/work/6_archived/320_story_whatsapp_business_api_integration_for_bot_commands.md diff --git a/.story_kit/work/6_archived/321_story_whatsapp_htop_adaptation_for_no_edit_platforms.md b/.storkit/work/6_archived/321_story_whatsapp_htop_adaptation_for_no_edit_platforms.md similarity index 100% rename from .story_kit/work/6_archived/321_story_whatsapp_htop_adaptation_for_no_edit_platforms.md rename to .storkit/work/6_archived/321_story_whatsapp_htop_adaptation_for_no_edit_platforms.md diff --git a/.story_kit/work/6_archived/322_story_whatsapp_24_hour_messaging_window_and_template_support.md b/.storkit/work/6_archived/322_story_whatsapp_24_hour_messaging_window_and_template_support.md similarity index 100% rename from .story_kit/work/6_archived/322_story_whatsapp_24_hour_messaging_window_and_template_support.md rename to .storkit/work/6_archived/322_story_whatsapp_24_hour_messaging_window_and_template_support.md diff --git a/.story_kit/work/6_archived/323_story_whatsapp_llm_passthrough_for_conversational_queries.md b/.storkit/work/6_archived/323_story_whatsapp_llm_passthrough_for_conversational_queries.md similarity index 100% rename from .story_kit/work/6_archived/323_story_whatsapp_llm_passthrough_for_conversational_queries.md rename to .storkit/work/6_archived/323_story_whatsapp_llm_passthrough_for_conversational_queries.md diff --git a/.story_kit/work/6_archived/324_story_slack_bot_integration_for_bot_commands.md b/.storkit/work/6_archived/324_story_slack_bot_integration_for_bot_commands.md similarity index 100% rename from .story_kit/work/6_archived/324_story_slack_bot_integration_for_bot_commands.md rename to .storkit/work/6_archived/324_story_slack_bot_integration_for_bot_commands.md diff --git a/.story_kit/work/6_archived/325_story_slack_llm_passthrough_for_conversational_queries.md b/.storkit/work/6_archived/325_story_slack_llm_passthrough_for_conversational_queries.md similarity index 100% rename from .story_kit/work/6_archived/325_story_slack_llm_passthrough_for_conversational_queries.md rename to .storkit/work/6_archived/325_story_slack_llm_passthrough_for_conversational_queries.md diff --git a/.story_kit/work/6_archived/326_story_slack_slash_commands_for_pipeline_management.md b/.storkit/work/6_archived/326_story_slack_slash_commands_for_pipeline_management.md similarity index 100% rename from .story_kit/work/6_archived/326_story_slack_slash_commands_for_pipeline_management.md rename to .storkit/work/6_archived/326_story_slack_slash_commands_for_pipeline_management.md diff --git a/.story_kit/work/6_archived/327_story_bot_overview_command_shows_implementation_summary_for_a_story.md b/.storkit/work/6_archived/327_story_bot_overview_command_shows_implementation_summary_for_a_story.md similarity index 100% rename from .story_kit/work/6_archived/327_story_bot_overview_command_shows_implementation_summary_for_a_story.md rename to .storkit/work/6_archived/327_story_bot_overview_command_shows_implementation_summary_for_a_story.md diff --git a/.story_kit/work/6_archived/328_refactor_split_commands_rs_into_individual_command_handler_modules.md b/.storkit/work/6_archived/328_refactor_split_commands_rs_into_individual_command_handler_modules.md similarity index 100% rename from .story_kit/work/6_archived/328_refactor_split_commands_rs_into_individual_command_handler_modules.md rename to .storkit/work/6_archived/328_refactor_split_commands_rs_into_individual_command_handler_modules.md diff --git a/.story_kit/work/6_archived/32_story_multi_instance_worktree_support.md b/.storkit/work/6_archived/32_story_multi_instance_worktree_support.md similarity index 100% rename from .story_kit/work/6_archived/32_story_multi_instance_worktree_support.md rename to .storkit/work/6_archived/32_story_multi_instance_worktree_support.md diff --git a/.story_kit/work/6_archived/33_story_worktree_diff_integration.md b/.storkit/work/6_archived/33_story_worktree_diff_integration.md similarity index 100% rename from .story_kit/work/6_archived/33_story_worktree_diff_integration.md rename to .storkit/work/6_archived/33_story_worktree_diff_integration.md diff --git a/.story_kit/work/6_archived/34_story_agent_configuration_and_roles.md b/.storkit/work/6_archived/34_story_agent_configuration_and_roles.md similarity index 100% rename from .story_kit/work/6_archived/34_story_agent_configuration_and_roles.md rename to .storkit/work/6_archived/34_story_agent_configuration_and_roles.md diff --git a/.story_kit/work/6_archived/36_story_enforce_story_front_matter.md b/.storkit/work/6_archived/36_story_enforce_story_front_matter.md similarity index 100% rename from .story_kit/work/6_archived/36_story_enforce_story_front_matter.md rename to .storkit/work/6_archived/36_story_enforce_story_front_matter.md diff --git a/.story_kit/work/6_archived/37_story_editor_command_for_worktrees.md b/.storkit/work/6_archived/37_story_editor_command_for_worktrees.md similarity index 100% rename from .story_kit/work/6_archived/37_story_editor_command_for_worktrees.md rename to .storkit/work/6_archived/37_story_editor_command_for_worktrees.md diff --git a/.story_kit/work/6_archived/38_story_auto_open_project_on_server_startup.md b/.storkit/work/6_archived/38_story_auto_open_project_on_server_startup.md similarity index 100% rename from .story_kit/work/6_archived/38_story_auto_open_project_on_server_startup.md rename to .storkit/work/6_archived/38_story_auto_open_project_on_server_startup.md diff --git a/.story_kit/work/6_archived/39_story_persistent_claude_code_sessions_in_web_ui.md b/.storkit/work/6_archived/39_story_persistent_claude_code_sessions_in_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/39_story_persistent_claude_code_sessions_in_web_ui.md rename to .storkit/work/6_archived/39_story_persistent_claude_code_sessions_in_web_ui.md diff --git a/.story_kit/work/6_archived/3_bug_stale_worktree_blocks_agent_start.md b/.storkit/work/6_archived/3_bug_stale_worktree_blocks_agent_start.md similarity index 100% rename from .story_kit/work/6_archived/3_bug_stale_worktree_blocks_agent_start.md rename to .storkit/work/6_archived/3_bug_stale_worktree_blocks_agent_start.md diff --git a/.story_kit/work/6_archived/40_story_mcp_server_obeys_storykit_port.md b/.storkit/work/6_archived/40_story_mcp_server_obeys_storykit_port.md similarity index 100% rename from .story_kit/work/6_archived/40_story_mcp_server_obeys_storykit_port.md rename to .storkit/work/6_archived/40_story_mcp_server_obeys_storykit_port.md diff --git a/.story_kit/work/6_archived/41_story_agent_completion_notification_via_mcp.md b/.storkit/work/6_archived/41_story_agent_completion_notification_via_mcp.md similarity index 100% rename from .story_kit/work/6_archived/41_story_agent_completion_notification_via_mcp.md rename to .storkit/work/6_archived/41_story_agent_completion_notification_via_mcp.md diff --git a/.story_kit/work/6_archived/42_story_deterministic_worktree_management_via_rest_mcp_api.md b/.storkit/work/6_archived/42_story_deterministic_worktree_management_via_rest_mcp_api.md similarity index 100% rename from .story_kit/work/6_archived/42_story_deterministic_worktree_management_via_rest_mcp_api.md rename to .storkit/work/6_archived/42_story_deterministic_worktree_management_via_rest_mcp_api.md diff --git a/.story_kit/work/6_archived/43_story_unified_chat_ui_for_claude_code_and_regular_chat.md b/.storkit/work/6_archived/43_story_unified_chat_ui_for_claude_code_and_regular_chat.md similarity index 100% rename from .story_kit/work/6_archived/43_story_unified_chat_ui_for_claude_code_and_regular_chat.md rename to .storkit/work/6_archived/43_story_unified_chat_ui_for_claude_code_and_regular_chat.md diff --git a/.story_kit/work/6_archived/44_story_agent_completion_report_via_mcp.md b/.storkit/work/6_archived/44_story_agent_completion_report_via_mcp.md similarity index 100% rename from .story_kit/work/6_archived/44_story_agent_completion_report_via_mcp.md rename to .storkit/work/6_archived/44_story_agent_completion_report_via_mcp.md diff --git a/.story_kit/work/6_archived/45_story_deterministic_story_lifecycle_management.md b/.storkit/work/6_archived/45_story_deterministic_story_lifecycle_management.md similarity index 100% rename from .story_kit/work/6_archived/45_story_deterministic_story_lifecycle_management.md rename to .storkit/work/6_archived/45_story_deterministic_story_lifecycle_management.md diff --git a/.story_kit/work/6_archived/46_story_deterministic_story_mutations_with_auto_commit.md b/.storkit/work/6_archived/46_story_deterministic_story_mutations_with_auto_commit.md similarity index 100% rename from .story_kit/work/6_archived/46_story_deterministic_story_mutations_with_auto_commit.md rename to .storkit/work/6_archived/46_story_deterministic_story_mutations_with_auto_commit.md diff --git a/.story_kit/work/6_archived/48_story_two_column_layout.md b/.storkit/work/6_archived/48_story_two_column_layout.md similarity index 100% rename from .story_kit/work/6_archived/48_story_two_column_layout.md rename to .storkit/work/6_archived/48_story_two_column_layout.md diff --git a/.story_kit/work/6_archived/49_story_deterministic_bug_lifecycle_management.md b/.storkit/work/6_archived/49_story_deterministic_bug_lifecycle_management.md similarity index 100% rename from .story_kit/work/6_archived/49_story_deterministic_bug_lifecycle_management.md rename to .storkit/work/6_archived/49_story_deterministic_bug_lifecycle_management.md diff --git a/.story_kit/work/6_archived/50_story_unified_current_work_directory.md b/.storkit/work/6_archived/50_story_unified_current_work_directory.md similarity index 100% rename from .story_kit/work/6_archived/50_story_unified_current_work_directory.md rename to .storkit/work/6_archived/50_story_unified_current_work_directory.md diff --git a/.story_kit/work/6_archived/52_story_mergemaster_agent_role.md b/.storkit/work/6_archived/52_story_mergemaster_agent_role.md similarity index 100% rename from .story_kit/work/6_archived/52_story_mergemaster_agent_role.md rename to .storkit/work/6_archived/52_story_mergemaster_agent_role.md diff --git a/.story_kit/work/6_archived/53_story_qa_agent_role.md b/.storkit/work/6_archived/53_story_qa_agent_role.md similarity index 100% rename from .story_kit/work/6_archived/53_story_qa_agent_role.md rename to .storkit/work/6_archived/53_story_qa_agent_role.md diff --git a/.story_kit/work/6_archived/55_story_live_story_panel_updates.md b/.storkit/work/6_archived/55_story_live_story_panel_updates.md similarity index 100% rename from .story_kit/work/6_archived/55_story_live_story_panel_updates.md rename to .storkit/work/6_archived/55_story_live_story_panel_updates.md diff --git a/.story_kit/work/6_archived/56_story_auto_increment_work_item_ids.md b/.storkit/work/6_archived/56_story_auto_increment_work_item_ids.md similarity index 100% rename from .story_kit/work/6_archived/56_story_auto_increment_work_item_ids.md rename to .storkit/work/6_archived/56_story_auto_increment_work_item_ids.md diff --git a/.story_kit/work/6_archived/59_story_current_work_panel.md b/.storkit/work/6_archived/59_story_current_work_panel.md similarity index 100% rename from .story_kit/work/6_archived/59_story_current_work_panel.md rename to .storkit/work/6_archived/59_story_current_work_panel.md diff --git a/.story_kit/work/6_archived/5_bug_fix_collect_coverage_button_error.md b/.storkit/work/6_archived/5_bug_fix_collect_coverage_button_error.md similarity index 100% rename from .story_kit/work/6_archived/5_bug_fix_collect_coverage_button_error.md rename to .storkit/work/6_archived/5_bug_fix_collect_coverage_button_error.md diff --git a/.story_kit/work/6_archived/60_story_status_based_directory_layout.md b/.storkit/work/6_archived/60_story_status_based_directory_layout.md similarity index 100% rename from .story_kit/work/6_archived/60_story_status_based_directory_layout.md rename to .storkit/work/6_archived/60_story_status_based_directory_layout.md diff --git a/.story_kit/work/6_archived/61_spike_filesystem_watcher_architecture.md b/.storkit/work/6_archived/61_spike_filesystem_watcher_architecture.md similarity index 100% rename from .story_kit/work/6_archived/61_spike_filesystem_watcher_architecture.md rename to .storkit/work/6_archived/61_spike_filesystem_watcher_architecture.md diff --git a/.story_kit/work/6_archived/62_story_allow_frontend_ui_to_accept_permissions_requests.md b/.storkit/work/6_archived/62_story_allow_frontend_ui_to_accept_permissions_requests.md similarity index 100% rename from .story_kit/work/6_archived/62_story_allow_frontend_ui_to_accept_permissions_requests.md rename to .storkit/work/6_archived/62_story_allow_frontend_ui_to_accept_permissions_requests.md diff --git a/.story_kit/work/6_archived/63_story_auto_spawn_mergemaster_on_merge.md b/.storkit/work/6_archived/63_story_auto_spawn_mergemaster_on_merge.md similarity index 100% rename from .story_kit/work/6_archived/63_story_auto_spawn_mergemaster_on_merge.md rename to .storkit/work/6_archived/63_story_auto_spawn_mergemaster_on_merge.md diff --git a/.story_kit/work/6_archived/64_story_watcher_should_ignore_worktree_code_changes.md b/.storkit/work/6_archived/64_story_watcher_should_ignore_worktree_code_changes.md similarity index 100% rename from .story_kit/work/6_archived/64_story_watcher_should_ignore_worktree_code_changes.md rename to .storkit/work/6_archived/64_story_watcher_should_ignore_worktree_code_changes.md diff --git a/.story_kit/work/6_archived/65_story_standardised_script_test_entry_point_for_all_projects.md b/.storkit/work/6_archived/65_story_standardised_script_test_entry_point_for_all_projects.md similarity index 100% rename from .story_kit/work/6_archived/65_story_standardised_script_test_entry_point_for_all_projects.md rename to .storkit/work/6_archived/65_story_standardised_script_test_entry_point_for_all_projects.md diff --git a/.story_kit/work/6_archived/67_story_server_drives_pipeline_as_state_machine.md b/.storkit/work/6_archived/67_story_server_drives_pipeline_as_state_machine.md similarity index 100% rename from .story_kit/work/6_archived/67_story_server_drives_pipeline_as_state_machine.md rename to .storkit/work/6_archived/67_story_server_drives_pipeline_as_state_machine.md diff --git a/.story_kit/work/6_archived/68_story_frontend_pipeline_state_stale_after_server_restart.md b/.storkit/work/6_archived/68_story_frontend_pipeline_state_stale_after_server_restart.md similarity index 100% rename from .story_kit/work/6_archived/68_story_frontend_pipeline_state_stale_after_server_restart.md rename to .storkit/work/6_archived/68_story_frontend_pipeline_state_stale_after_server_restart.md diff --git a/.story_kit/work/6_archived/69_story_test_coverage_qa_gate.md b/.storkit/work/6_archived/69_story_test_coverage_qa_gate.md similarity index 100% rename from .story_kit/work/6_archived/69_story_test_coverage_qa_gate.md rename to .storkit/work/6_archived/69_story_test_coverage_qa_gate.md diff --git a/.story_kit/work/6_archived/70_story_server_owned_agent_completion_remove_report_completion_dependency.md b/.storkit/work/6_archived/70_story_server_owned_agent_completion_remove_report_completion_dependency.md similarity index 100% rename from .story_kit/work/6_archived/70_story_server_owned_agent_completion_remove_report_completion_dependency.md rename to .storkit/work/6_archived/70_story_server_owned_agent_completion_remove_report_completion_dependency.md diff --git a/.story_kit/work/6_archived/71_bug_server_health_endpoint_missing.md b/.storkit/work/6_archived/71_bug_server_health_endpoint_missing.md similarity index 100% rename from .story_kit/work/6_archived/71_bug_server_health_endpoint_missing.md rename to .storkit/work/6_archived/71_bug_server_health_endpoint_missing.md diff --git a/.story_kit/work/6_archived/72_bug_story_creation_does_not_quote_yaml_special_characters_in_name.md b/.storkit/work/6_archived/72_bug_story_creation_does_not_quote_yaml_special_characters_in_name.md similarity index 100% rename from .story_kit/work/6_archived/72_bug_story_creation_does_not_quote_yaml_special_characters_in_name.md rename to .storkit/work/6_archived/72_bug_story_creation_does_not_quote_yaml_special_characters_in_name.md diff --git a/.story_kit/work/6_archived/73_story_fade_out_completed_agents.md b/.storkit/work/6_archived/73_story_fade_out_completed_agents.md similarity index 100% rename from .story_kit/work/6_archived/73_story_fade_out_completed_agents.md rename to .storkit/work/6_archived/73_story_fade_out_completed_agents.md diff --git a/.story_kit/work/6_archived/74_story_agent_lozenges_float_across_ui_during_assignment.md b/.storkit/work/6_archived/74_story_agent_lozenges_float_across_ui_during_assignment.md similarity index 100% rename from .story_kit/work/6_archived/74_story_agent_lozenges_float_across_ui_during_assignment.md rename to .storkit/work/6_archived/74_story_agent_lozenges_float_across_ui_during_assignment.md diff --git a/.story_kit/work/6_archived/77_bug_create_bug_file_writes_no_yaml_front_matter.md b/.storkit/work/6_archived/77_bug_create_bug_file_writes_no_yaml_front_matter.md similarity index 100% rename from .story_kit/work/6_archived/77_bug_create_bug_file_writes_no_yaml_front_matter.md rename to .storkit/work/6_archived/77_bug_create_bug_file_writes_no_yaml_front_matter.md diff --git a/.story_kit/work/6_archived/78_story_create_spike_mcp_tool.md b/.storkit/work/6_archived/78_story_create_spike_mcp_tool.md similarity index 100% rename from .story_kit/work/6_archived/78_story_create_spike_mcp_tool.md rename to .storkit/work/6_archived/78_story_create_spike_mcp_tool.md diff --git a/.story_kit/work/6_archived/79_story_agents_panel_skips_archived_work_on_startup.md b/.storkit/work/6_archived/79_story_agents_panel_skips_archived_work_on_startup.md similarity index 100% rename from .story_kit/work/6_archived/79_story_agents_panel_skips_archived_work_on_startup.md rename to .storkit/work/6_archived/79_story_agents_panel_skips_archived_work_on_startup.md diff --git a/.story_kit/work/6_archived/80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui.md b/.storkit/work/6_archived/80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui.md similarity index 100% rename from .story_kit/work/6_archived/80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui.md rename to .storkit/work/6_archived/80_story_remove_model_apikey_and_rate_limit_notifications_from_chat_ui.md diff --git a/.story_kit/work/6_archived/81_story_agent_roster_badges_show_availability_state.md b/.storkit/work/6_archived/81_story_agent_roster_badges_show_availability_state.md similarity index 100% rename from .story_kit/work/6_archived/81_story_agent_roster_badges_show_availability_state.md rename to .storkit/work/6_archived/81_story_agent_roster_badges_show_availability_state.md diff --git a/.story_kit/work/6_archived/82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input.md b/.storkit/work/6_archived/82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input.md similarity index 100% rename from .story_kit/work/6_archived/82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input.md rename to .storkit/work/6_archived/82_story_shift_enter_inserts_newline_instead_of_sending_in_chat_input.md diff --git a/.story_kit/work/6_archived/83_story_remove_active_work_list_from_agents_panel.md b/.storkit/work/6_archived/83_story_remove_active_work_list_from_agents_panel.md similarity index 100% rename from .story_kit/work/6_archived/83_story_remove_active_work_list_from_agents_panel.md rename to .storkit/work/6_archived/83_story_remove_active_work_list_from_agents_panel.md diff --git a/.story_kit/work/6_archived/84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees.md b/.storkit/work/6_archived/84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees.md similarity index 100% rename from .story_kit/work/6_archived/84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees.md rename to .storkit/work/6_archived/84_story_sparse_checkout_excludes_pipeline_files_from_agent_worktrees.md diff --git a/.story_kit/work/6_archived/85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating.md b/.storkit/work/6_archived/85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating.md similarity index 100% rename from .story_kit/work/6_archived/85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating.md rename to .storkit/work/6_archived/85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating.md diff --git a/.story_kit/work/6_archived/86_story_show_live_activity_status_instead_of_static_thinking_indicator_in_chat.md b/.storkit/work/6_archived/86_story_show_live_activity_status_instead_of_static_thinking_indicator_in_chat.md similarity index 100% rename from .story_kit/work/6_archived/86_story_show_live_activity_status_instead_of_static_thinking_indicator_in_chat.md rename to .storkit/work/6_archived/86_story_show_live_activity_status_instead_of_static_thinking_indicator_in_chat.md diff --git a/.story_kit/work/6_archived/87_story_update_agent_lozenge_colour_scheme_across_panels.md b/.storkit/work/6_archived/87_story_update_agent_lozenge_colour_scheme_across_panels.md similarity index 100% rename from .story_kit/work/6_archived/87_story_update_agent_lozenge_colour_scheme_across_panels.md rename to .storkit/work/6_archived/87_story_update_agent_lozenge_colour_scheme_across_panels.md diff --git a/.story_kit/work/6_archived/88_story_auto_assign_agents_to_available_work_on_server_startup.md b/.storkit/work/6_archived/88_story_auto_assign_agents_to_available_work_on_server_startup.md similarity index 100% rename from .story_kit/work/6_archived/88_story_auto_assign_agents_to_available_work_on_server_startup.md rename to .storkit/work/6_archived/88_story_auto_assign_agents_to_available_work_on_server_startup.md diff --git a/.story_kit/work/6_archived/89_story_persistent_per_session_agent_logs.md b/.storkit/work/6_archived/89_story_persistent_per_session_agent_logs.md similarity index 100% rename from .story_kit/work/6_archived/89_story_persistent_per_session_agent_logs.md rename to .storkit/work/6_archived/89_story_persistent_per_session_agent_logs.md diff --git a/.story_kit/work/6_archived/91_bug_permissions_dialog_never_triggers_in_web_ui.md b/.storkit/work/6_archived/91_bug_permissions_dialog_never_triggers_in_web_ui.md similarity index 100% rename from .story_kit/work/6_archived/91_bug_permissions_dialog_never_triggers_in_web_ui.md rename to .storkit/work/6_archived/91_bug_permissions_dialog_never_triggers_in_web_ui.md diff --git a/.story_kit/work/6_archived/92_spike_stop_auto_committing_intermediate_pipeline_moves.md b/.storkit/work/6_archived/92_spike_stop_auto_committing_intermediate_pipeline_moves.md similarity index 100% rename from .story_kit/work/6_archived/92_spike_stop_auto_committing_intermediate_pipeline_moves.md rename to .storkit/work/6_archived/92_spike_stop_auto_committing_intermediate_pipeline_moves.md diff --git a/.story_kit/work/6_archived/93_bug_agent_session_id_is_null_while_running.md b/.storkit/work/6_archived/93_bug_agent_session_id_is_null_while_running.md similarity index 100% rename from .story_kit/work/6_archived/93_bug_agent_session_id_is_null_while_running.md rename to .storkit/work/6_archived/93_bug_agent_session_id_is_null_while_running.md diff --git a/.story_kit/work/6_archived/93_story_expose_server_logs_to_agents_via_mcp.md b/.storkit/work/6_archived/93_story_expose_server_logs_to_agents_via_mcp.md similarity index 100% rename from .story_kit/work/6_archived/93_story_expose_server_logs_to_agents_via_mcp.md rename to .storkit/work/6_archived/93_story_expose_server_logs_to_agents_via_mcp.md diff --git a/.story_kit/work/6_archived/94_bug_stale_agent_state_persists_after_server_restart.md b/.storkit/work/6_archived/94_bug_stale_agent_state_persists_after_server_restart.md similarity index 100% rename from .story_kit/work/6_archived/94_bug_stale_agent_state_persists_after_server_restart.md rename to .storkit/work/6_archived/94_bug_stale_agent_state_persists_after_server_restart.md diff --git a/.story_kit/work/6_archived/95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop.md b/.storkit/work/6_archived/95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop.md similarity index 100% rename from .story_kit/work/6_archived/95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop.md rename to .storkit/work/6_archived/95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop.md diff --git a/.story_kit/work/6_archived/96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster.md b/.storkit/work/6_archived/96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster.md similarity index 100% rename from .story_kit/work/6_archived/96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster.md rename to .storkit/work/6_archived/96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster.md diff --git a/.story_kit/work/6_archived/97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently.md b/.storkit/work/6_archived/97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently.md similarity index 100% rename from .story_kit/work/6_archived/97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently.md rename to .storkit/work/6_archived/97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently.md diff --git a/.story_kit/work/6_archived/98_story_expand_work_item_to_full_screen_detail_view.md b/.storkit/work/6_archived/98_story_expand_work_item_to_full_screen_detail_view.md similarity index 100% rename from .story_kit/work/6_archived/98_story_expand_work_item_to_full_screen_detail_view.md rename to .storkit/work/6_archived/98_story_expand_work_item_to_full_screen_detail_view.md diff --git a/.story_kit/work/6_archived/99_story_test_coverage_http_health_rs_to_100.md b/.storkit/work/6_archived/99_story_test_coverage_http_health_rs_to_100.md similarity index 100% rename from .story_kit/work/6_archived/99_story_test_coverage_http_health_rs_to_100.md rename to .storkit/work/6_archived/99_story_test_coverage_http_health_rs_to_100.md diff --git a/.story_kit/work/3_qa/.gitkeep b/.story_kit/work/3_qa/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/.story_kit/work/4_merge/.gitkeep b/.story_kit/work/4_merge/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/.story_kit/work/5_done/.gitkeep b/.story_kit/work/5_done/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/.story_kit_port b/.story_kit_port new file mode 100644 index 0000000..6fc99cf --- /dev/null +++ b/.story_kit_port @@ -0,0 +1 @@ +3001 \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index 37a7d23..e6ccd08 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,3 +1,3 @@ Never chain shell commands with `&&`, `||`, or `;` in a single Bash call. The permission system validates the entire command string, and chained commands won't match allow rules like `Bash(git *)`. Use separate Bash calls instead — parallel calls work fine. -Read .story_kit/README.md to see our dev process. +Read .storkit/README.md to see our dev process. diff --git a/Makefile b/Makefile index 753f5f1..4f1841d 100644 --- a/Makefile +++ b/Makefile @@ -12,12 +12,12 @@ help: @echo " build-linux: cargo install cross AND Docker Desktop running" @echo "" @echo "Output:" - @echo " macOS : target/release/story-kit" - @echo " Linux : target/x86_64-unknown-linux-musl/release/story-kit" + @echo " macOS : target/release/storkit" + @echo " Linux : target/x86_64-unknown-linux-musl/release/storkit" ## Build a native macOS release binary. ## The frontend is compiled by build.rs (npm run build) and embedded via rust-embed. -## Verify dynamic deps afterwards: otool -L target/release/story-kit +## Verify dynamic deps afterwards: otool -L target/release/storkit build-macos: cargo build --release diff --git a/script/release b/script/release index 41b4ef0..377b991 100755 --- a/script/release +++ b/script/release @@ -3,8 +3,8 @@ set -euo pipefail # ── Configuration ────────────────────────────────────────────── GITEA_URL="https://code.crashlabs.io" -REPO="dave/story-kit" -BINARY_NAME="story-kit" +REPO="dave/storkit" +BINARY_NAME="storkit" # ── Load .env if present ─────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" @@ -78,14 +78,14 @@ else RANGE="initial...${TAG}" fi -# Extract completed stories/bugs/refactors from "story-kit: merge " commits. +# Extract completed stories/bugs/refactors from "storkit: merge " commits. # Deduplicate (a story may have been merged more than once after reverts). if [ -n "$LOG_RANGE" ]; then MERGED_RAW=$(git log "$LOG_RANGE" --pretty=format:"%s" --no-merges \ - | grep "^story-kit: merge " | sed 's/^story-kit: merge //' | sort -u) + | grep "^storkit: merge " | sed 's/^storkit: merge //' | sort -u) else MERGED_RAW=$(git log --pretty=format:"%s" --no-merges \ - | grep "^story-kit: merge " | sed 's/^story-kit: merge //' | sort -u) + | grep "^storkit: merge " | sed 's/^storkit: merge //' | sort -u) fi # Categorise merged work items and format names. @@ -108,14 +108,14 @@ done <<< "$MERGED_RAW" # Collect non-automation manual commits (direct fixes, version bumps, etc). if [ -n "$LOG_RANGE" ]; then MANUAL=$(git log "$LOG_RANGE" --pretty=format:"%s" --no-merges \ - | grep -v "^story-kit: " \ - | grep -v "^Revert \"story-kit: " \ + | grep -v "^storkit: " \ + | grep -v "^Revert \"storkit: " \ | grep -v "^Bump version" \ | sed 's/^/- /') else MANUAL=$(git log --pretty=format:"%s" --no-merges \ - | grep -v "^story-kit: " \ - | grep -v "^Revert \"story-kit: " \ + | grep -v "^storkit: " \ + | grep -v "^Revert \"storkit: " \ | grep -v "^Bump version" \ | sed 's/^/- /') fi diff --git a/server/.mcp.json b/server/.mcp.json index a36a88a..dff133c 100644 --- a/server/.mcp.json +++ b/server/.mcp.json @@ -1,6 +1,6 @@ { "mcpServers": { - "story-kit": { + "storkit": { "type": "http", "url": "http://localhost:3001/mcp" } diff --git a/server/src/agent_log.rs b/server/src/agent_log.rs index 1d0c4e7..842c54e 100644 --- a/server/src/agent_log.rs +++ b/server/src/agent_log.rs @@ -17,7 +17,7 @@ pub struct LogEntry { /// Writes agent events to a persistent log file (JSONL format). /// /// Each agent session gets its own log file at: -/// `.story_kit/logs/{story_id}/{agent_name}-{session_id}.log` +/// `.storkit/logs/{story_id}/{agent_name}-{session_id}.log` pub struct AgentLogWriter { file: File, } @@ -72,7 +72,7 @@ impl AgentLogWriter { /// Return the log directory for a story. fn log_dir(project_root: &Path, story_id: &str) -> PathBuf { project_root - .join(".story_kit") + .join(".storkit") .join("logs") .join(story_id) } @@ -110,7 +110,7 @@ pub fn read_log(path: &Path) -> Result, String> { /// Find the most recent log file for a given story+agent combination. /// -/// Scans `.story_kit/logs/{story_id}/` for files matching `{agent_name}-*.log` +/// Scans `.storkit/logs/{story_id}/` for files matching `{agent_name}-*.log` /// and returns the one with the most recent modification time. pub fn find_latest_log( project_root: &Path, @@ -162,7 +162,7 @@ mod tests { AgentLogWriter::new(root, "42_story_foo", "coder-1", "sess-abc123").unwrap(); let expected_path = root - .join(".story_kit") + .join(".storkit") .join("logs") .join("42_story_foo") .join("coder-1-sess-abc123.log"); diff --git a/server/src/agents/lifecycle.rs b/server/src/agents/lifecycle.rs index 0d449cd..9e33018 100644 --- a/server/src/agents/lifecycle.rs +++ b/server/src/agents/lifecycle.rs @@ -18,12 +18,12 @@ pub(super) fn item_type_from_id(item_id: &str) -> &'static str { /// Return the source directory path for a work item (always work/1_backlog/). fn item_source_dir(project_root: &Path, _item_id: &str) -> PathBuf { - project_root.join(".story_kit").join("work").join("1_backlog") + project_root.join(".storkit").join("work").join("1_backlog") } /// Return the done directory path for a work item (always work/5_done/). fn item_archive_dir(project_root: &Path, _item_id: &str) -> PathBuf { - project_root.join(".story_kit").join("work").join("5_done") + project_root.join(".storkit").join("work").join("5_done") } /// Move a work item (story, bug, or spike) from `work/1_backlog/` to `work/2_current/`. @@ -31,7 +31,7 @@ fn item_archive_dir(project_root: &Path, _item_id: &str) -> PathBuf { /// Idempotent: if the item is already in `2_current/`, returns Ok without committing. /// If the item is not found in `1_backlog/`, logs a warning and returns Ok. pub fn move_story_to_current(project_root: &Path, story_id: &str) -> Result<(), String> { - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let current_dir = sk.join("2_current"); let current_path = current_dir.join(format!("{story_id}.md")); @@ -103,7 +103,7 @@ pub fn feature_branch_has_unmerged_changes(project_root: &Path, story_id: &str) /// * If the story is already in `5_done/` or `6_archived/`, this is a no-op (idempotent). /// * If the story is not found in `2_current/`, `4_merge/`, `5_done/`, or `6_archived/`, an error is returned. pub fn move_story_to_archived(project_root: &Path, story_id: &str) -> Result<(), String> { - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let current_path = sk.join("2_current").join(format!("{story_id}.md")); let merge_path = sk.join("4_merge").join(format!("{story_id}.md")); let done_dir = sk.join("5_done"); @@ -153,7 +153,7 @@ pub fn move_story_to_archived(project_root: &Path, story_id: &str) -> Result<(), /// This stages a work item as ready for the mergemaster to pick up and merge into master. /// Idempotent: if already in `4_merge/`, returns Ok without committing. pub fn move_story_to_merge(project_root: &Path, story_id: &str) -> Result<(), String> { - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let current_path = sk.join("2_current").join(format!("{story_id}.md")); let qa_path = sk.join("3_qa").join(format!("{story_id}.md")); let merge_dir = sk.join("4_merge"); @@ -203,7 +203,7 @@ pub fn move_story_to_merge(project_root: &Path, story_id: &str) -> Result<(), St /// This stages a work item for QA review before merging to master. /// Idempotent: if already in `3_qa/`, returns Ok without committing. pub fn move_story_to_qa(project_root: &Path, story_id: &str) -> Result<(), String> { - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let current_path = sk.join("2_current").join(format!("{story_id}.md")); let qa_dir = sk.join("3_qa"); let qa_path = qa_dir.join(format!("{story_id}.md")); @@ -246,7 +246,7 @@ pub fn reject_story_from_qa( story_id: &str, notes: &str, ) -> Result<(), String> { - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let qa_path = sk.join("3_qa").join(format!("{story_id}.md")); let current_dir = sk.join("2_current"); let current_path = current_dir.join(format!("{story_id}.md")); @@ -311,7 +311,7 @@ pub fn move_story_to_stage( ) })?; - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let target_dir = sk.join(target_dir_name); let target_path = target_dir.join(format!("{story_id}.md")); @@ -362,7 +362,7 @@ pub fn move_story_to_stage( /// * If the bug is already in `5_done/`, this is a no-op (idempotent). /// * If the bug is not found anywhere, an error is returned. pub fn close_bug_to_archive(project_root: &Path, bug_id: &str) -> Result<(), String> { - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let current_path = sk.join("2_current").join(format!("{bug_id}.md")); let backlog_path = sk.join("1_backlog").join(format!("{bug_id}.md")); let archive_dir = item_archive_dir(project_root, bug_id); @@ -405,8 +405,8 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let backlog = root.join(".story_kit/work/1_backlog"); - let current = root.join(".story_kit/work/2_current"); + let backlog = root.join(".storkit/work/1_backlog"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(&backlog).unwrap(); fs::create_dir_all(¤t).unwrap(); fs::write(backlog.join("10_story_foo.md"), "test").unwrap(); @@ -422,7 +422,7 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("11_story_foo.md"), "test").unwrap(); @@ -441,8 +441,8 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let backlog = root.join(".story_kit/work/1_backlog"); - let current = root.join(".story_kit/work/2_current"); + let backlog = root.join(".storkit/work/1_backlog"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(&backlog).unwrap(); fs::create_dir_all(¤t).unwrap(); fs::write(backlog.join("1_bug_test.md"), "# Bug 1\n").unwrap(); @@ -460,14 +460,14 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("2_bug_test.md"), "# Bug 2\n").unwrap(); close_bug_to_archive(root, "2_bug_test").unwrap(); assert!(!current.join("2_bug_test.md").exists()); - assert!(root.join(".story_kit/work/5_done/2_bug_test.md").exists()); + assert!(root.join(".storkit/work/5_done/2_bug_test.md").exists()); } #[test] @@ -475,14 +475,14 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let backlog = root.join(".story_kit/work/1_backlog"); + let backlog = root.join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); fs::write(backlog.join("3_bug_test.md"), "# Bug 3\n").unwrap(); close_bug_to_archive(root, "3_bug_test").unwrap(); assert!(!backlog.join("3_bug_test.md").exists()); - assert!(root.join(".story_kit/work/5_done/3_bug_test.md").exists()); + assert!(root.join(".storkit/work/5_done/3_bug_test.md").exists()); } // ── item_type_from_id tests ──────────────────────────────────────────────── @@ -502,14 +502,14 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("20_story_foo.md"), "test").unwrap(); move_story_to_merge(root, "20_story_foo").unwrap(); assert!(!current.join("20_story_foo.md").exists()); - assert!(root.join(".story_kit/work/4_merge/20_story_foo.md").exists()); + assert!(root.join(".storkit/work/4_merge/20_story_foo.md").exists()); } #[test] @@ -517,14 +517,14 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let qa_dir = root.join(".story_kit/work/3_qa"); + let qa_dir = root.join(".storkit/work/3_qa"); fs::create_dir_all(&qa_dir).unwrap(); fs::write(qa_dir.join("40_story_test.md"), "test").unwrap(); move_story_to_merge(root, "40_story_test").unwrap(); assert!(!qa_dir.join("40_story_test.md").exists()); - assert!(root.join(".story_kit/work/4_merge/40_story_test.md").exists()); + assert!(root.join(".storkit/work/4_merge/40_story_test.md").exists()); } #[test] @@ -532,7 +532,7 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let merge_dir = root.join(".story_kit/work/4_merge"); + let merge_dir = root.join(".storkit/work/4_merge"); fs::create_dir_all(&merge_dir).unwrap(); fs::write(merge_dir.join("21_story_test.md"), "test").unwrap(); @@ -554,14 +554,14 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("30_story_qa.md"), "test").unwrap(); move_story_to_qa(root, "30_story_qa").unwrap(); assert!(!current.join("30_story_qa.md").exists()); - assert!(root.join(".story_kit/work/3_qa/30_story_qa.md").exists()); + assert!(root.join(".storkit/work/3_qa/30_story_qa.md").exists()); } #[test] @@ -569,7 +569,7 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let qa_dir = root.join(".story_kit/work/3_qa"); + let qa_dir = root.join(".storkit/work/3_qa"); fs::create_dir_all(&qa_dir).unwrap(); fs::write(qa_dir.join("31_story_test.md"), "test").unwrap(); @@ -591,14 +591,14 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let merge_dir = root.join(".story_kit/work/4_merge"); + let merge_dir = root.join(".storkit/work/4_merge"); fs::create_dir_all(&merge_dir).unwrap(); fs::write(merge_dir.join("22_story_test.md"), "test").unwrap(); move_story_to_archived(root, "22_story_test").unwrap(); assert!(!merge_dir.join("22_story_test.md").exists()); - assert!(root.join(".story_kit/work/5_done/22_story_test.md").exists()); + assert!(root.join(".storkit/work/5_done/22_story_test.md").exists()); } #[test] @@ -696,8 +696,8 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let qa_dir = root.join(".story_kit/work/3_qa"); - let current_dir = root.join(".story_kit/work/2_current"); + let qa_dir = root.join(".storkit/work/3_qa"); + let current_dir = root.join(".storkit/work/2_current"); fs::create_dir_all(&qa_dir).unwrap(); fs::create_dir_all(¤t_dir).unwrap(); fs::write( @@ -728,7 +728,7 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current_dir = root.join(".story_kit/work/2_current"); + let current_dir = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t_dir).unwrap(); fs::write(current_dir.join("51_story_test.md"), "---\nname: Test\n---\n# Story\n").unwrap(); @@ -743,8 +743,8 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let backlog = root.join(".story_kit/work/1_backlog"); - let current = root.join(".story_kit/work/2_current"); + let backlog = root.join(".storkit/work/1_backlog"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(&backlog).unwrap(); fs::create_dir_all(¤t).unwrap(); fs::write(backlog.join("60_story_move.md"), "test").unwrap(); @@ -762,8 +762,8 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); - let backlog = root.join(".story_kit/work/1_backlog"); + let current = root.join(".storkit/work/2_current"); + let backlog = root.join(".storkit/work/1_backlog"); fs::create_dir_all(¤t).unwrap(); fs::create_dir_all(&backlog).unwrap(); fs::write(current.join("61_story_back.md"), "test").unwrap(); @@ -781,7 +781,7 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("62_story_idem.md"), "test").unwrap(); @@ -813,8 +813,8 @@ mod tests { use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let qa_dir = root.join(".story_kit/work/3_qa"); - let backlog = root.join(".story_kit/work/1_backlog"); + let qa_dir = root.join(".storkit/work/3_qa"); + let backlog = root.join(".storkit/work/1_backlog"); fs::create_dir_all(&qa_dir).unwrap(); fs::create_dir_all(&backlog).unwrap(); fs::write(qa_dir.join("63_story_qa.md"), "test").unwrap(); diff --git a/server/src/agents/merge.rs b/server/src/agents/merge.rs index 5e5af55..b3e1df0 100644 --- a/server/src/agents/merge.rs +++ b/server/src/agents/merge.rs @@ -10,7 +10,7 @@ use super::gates::run_project_tests; /// Global lock ensuring only one squash-merge runs at a time. /// -/// The merge pipeline uses a shared `.story_kit/merge_workspace` directory and +/// The merge pipeline uses a shared `.storkit/merge_workspace` directory and /// temporary `merge-queue/{story_id}` branches. If two merges run concurrently, /// the second call's initial cleanup destroys the first call's branch mid-flight, /// causing `git cherry-pick merge-queue/…` to fail with "bad revision". @@ -89,7 +89,7 @@ pub(crate) fn run_squash_merge( let mut all_output = String::new(); let merge_branch = format!("merge-queue/{story_id}"); let merge_wt_path = project_root - .join(".story_kit") + .join(".storkit") .join("merge_workspace"); // Ensure we start clean: remove any leftover merge workspace. @@ -250,7 +250,7 @@ pub(crate) fn run_squash_merge( } // ── Bug 226: Verify the commit contains real code changes ───── - // If the merge only brought in .story_kit/ files (pipeline file moves), + // If the merge only brought in .storkit/ files (pipeline file moves), // there are no actual code changes to land on master. Abort. { let diff_check = Command::new("git") @@ -261,10 +261,10 @@ pub(crate) fn run_squash_merge( let changed_files = String::from_utf8_lossy(&diff_check.stdout); let has_code_changes = changed_files .lines() - .any(|f| !f.starts_with(".story_kit/")); + .any(|f| !f.starts_with(".storkit/")); if !has_code_changes { all_output.push_str( - "=== Merge commit contains only .story_kit/ file moves, no code changes ===\n", + "=== Merge commit contains only .storkit/ file moves, no code changes ===\n", ); cleanup_merge_workspace(project_root, &merge_wt_path, &merge_branch); return Ok(SquashMergeResult { @@ -272,7 +272,7 @@ pub(crate) fn run_squash_merge( had_conflicts, conflicts_resolved, conflict_details: Some( - "Feature branch has no code changes outside .story_kit/ — only \ + "Feature branch has no code changes outside .storkit/ — only \ pipeline file moves were found." .to_string(), ), @@ -960,7 +960,7 @@ after\n"; // Verify no leftover merge workspace directory. assert!( - !repo.join(".story_kit/merge_workspace").exists(), + !repo.join(".storkit/merge_workspace").exists(), "merge workspace should be cleaned up" ); } @@ -1076,7 +1076,7 @@ after\n"; .current_dir(repo) .output() .unwrap(); - let sk_dir = repo.join(".story_kit/work/4_merge"); + let sk_dir = repo.join(".storkit/work/4_merge"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("diverge_test.md"), @@ -1135,7 +1135,7 @@ after\n"; "merge-queue branch should be cleaned up, got: {branch_list}" ); assert!( - !repo.join(".story_kit/merge_workspace").exists(), + !repo.join(".storkit/merge_workspace").exists(), "merge workspace should be cleaned up" ); } @@ -1188,13 +1188,13 @@ after\n"; // Cleanup should still happen. assert!( - !repo.join(".story_kit/merge_workspace").exists(), + !repo.join(".storkit/merge_workspace").exists(), "merge workspace should be cleaned up" ); } /// Bug 226: Verifies that `run_squash_merge` fails when the feature branch - /// only contains .story_kit/ file moves with no real code changes. + /// only contains .storkit/ file moves with no real code changes. #[tokio::test] async fn squash_merge_md_only_changes_fails() { use std::fs; @@ -1204,13 +1204,13 @@ after\n"; let repo = tmp.path(); init_git_repo(repo); - // Create a feature branch that only moves a .story_kit/ file. + // Create a feature branch that only moves a .storkit/ file. Command::new("git") .args(["checkout", "-b", "feature/story-md_only_test"]) .current_dir(repo) .output() .unwrap(); - let sk_dir = repo.join(".story_kit/work/2_current"); + let sk_dir = repo.join(".storkit/work/2_current"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("md_only_test.md"), @@ -1236,17 +1236,17 @@ after\n"; let result = run_squash_merge(repo, "feature/story-md_only_test", "md_only_test").unwrap(); - // The squash merge will commit the .story_kit/ file, but should fail because - // there are no code changes outside .story_kit/. + // The squash merge will commit the .storkit/ file, but should fail because + // there are no code changes outside .storkit/. assert!( !result.success, - "merge with only .story_kit/ changes must fail: {}", + "merge with only .storkit/ changes must fail: {}", result.output ); // Cleanup should still happen. assert!( - !repo.join(".story_kit/merge_workspace").exists(), + !repo.join(".storkit/merge_workspace").exists(), "merge workspace should be cleaned up" ); } @@ -1359,7 +1359,7 @@ after\n"; "merge-queue branch must be cleaned up" ); assert!( - !repo.join(".story_kit/merge_workspace").exists(), + !repo.join(".storkit/merge_workspace").exists(), "merge workspace must be cleaned up" ); } @@ -1463,7 +1463,7 @@ after\n"; // Cleanup must still happen. assert!( - !repo.join(".story_kit/merge_workspace").exists(), + !repo.join(".storkit/merge_workspace").exists(), "merge workspace must be cleaned up even on gate failure" ); } @@ -1503,7 +1503,7 @@ after\n"; .unwrap(); // Simulate a stale merge workspace left from a previous failed merge. - let stale_ws = repo.join(".story_kit/merge_workspace"); + let stale_ws = repo.join(".storkit/merge_workspace"); fs::create_dir_all(&stale_ws).unwrap(); fs::write(stale_ws.join("leftover.txt"), "stale").unwrap(); @@ -1524,7 +1524,7 @@ after\n"; // ── story 216: merge worktree uses project.toml component setup ─────────── - /// When the project has `[[component]]` entries in `.story_kit/project.toml`, + /// When the project has `[[component]]` entries in `.storkit/project.toml`, /// `run_squash_merge` must run their setup commands in the merge worktree /// before quality gates — matching the behaviour of `create_worktree`. #[cfg(unix)] @@ -1537,9 +1537,9 @@ after\n"; let repo = tmp.path(); init_git_repo(repo); - // Add a .story_kit/project.toml with a component whose setup writes a + // Add a .storkit/project.toml with a component whose setup writes a // sentinel file so we can confirm the command ran. - let sk_dir = repo.join(".story_kit"); + let sk_dir = repo.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1612,7 +1612,7 @@ after\n"; let repo = tmp.path(); init_git_repo(repo); - // No .story_kit/project.toml — no component setup. + // No .storkit/project.toml — no component setup. fs::write(repo.join("file.txt"), "initial").unwrap(); Command::new("git") .args(["add", "."]) diff --git a/server/src/agents/pool/auto_assign.rs b/server/src/agents/pool/auto_assign.rs index 6e676be..a8c35af 100644 --- a/server/src/agents/pool/auto_assign.rs +++ b/server/src/agents/pool/auto_assign.rs @@ -72,7 +72,7 @@ impl AgentPool { on feature branch. Writing merge_failure and blocking." ); let story_path = project_root - .join(".story_kit/work") + .join(".storkit/work") .join(stage_dir) .join(format!("{story_id}.md")); let _ = crate::io::story_metadata::write_merge_failure( @@ -209,7 +209,7 @@ impl AgentPool { /// (called immediately after) picks up the right next-stage agents. /// /// Algorithm: - /// 1. List all worktree directories under `{project_root}/.story_kit/worktrees/`. + /// 1. List all worktree directories under `{project_root}/.storkit/worktrees/`. /// 2. For each worktree, check whether its feature branch has commits ahead of the /// base branch (`master` / `main`). /// 3. If committed work is found AND the story is in `2_current/` or `3_qa/`: @@ -344,7 +344,7 @@ impl AgentPool { .unwrap_or_default() .default_qa_mode(); let story_path = project_root - .join(".story_kit/work/2_current") + .join(".storkit/work/2_current") .join(format!("{story_id}.md")); crate::io::story_metadata::resolve_qa_mode(&story_path, default_qa) } @@ -395,7 +395,7 @@ impl AgentPool { }); } else { let story_path = project_root - .join(".story_kit/work/3_qa") + .join(".storkit/work/3_qa") .join(format!("{story_id}.md")); if let Err(e) = crate::io::story_metadata::write_review_hold(&story_path) { eprintln!( @@ -451,7 +451,7 @@ impl AgentPool { true } else { let story_path = project_root - .join(".story_kit/work/3_qa") + .join(".storkit/work/3_qa") .join(format!("{story_id}.md")); let default_qa = crate::config::ProjectConfig::load(project_root) .unwrap_or_default() @@ -465,7 +465,7 @@ impl AgentPool { if needs_human_review { let story_path = project_root - .join(".story_kit/work/3_qa") + .join(".storkit/work/3_qa") .join(format!("{story_id}.md")); if let Err(e) = crate::io::story_metadata::write_review_hold(&story_path) { eprintln!( @@ -567,7 +567,7 @@ fn read_story_front_matter_agent( ) -> Option { use crate::io::story_metadata::parse_front_matter; let path = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage_dir) .join(format!("{story_id}.md")); @@ -579,7 +579,7 @@ fn read_story_front_matter_agent( fn has_review_hold(project_root: &Path, stage_dir: &str, story_id: &str) -> bool { use crate::io::story_metadata::parse_front_matter; let path = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage_dir) .join(format!("{story_id}.md")); @@ -597,7 +597,7 @@ fn has_review_hold(project_root: &Path, stage_dir: &str, story_id: &str) -> bool fn is_story_blocked(project_root: &Path, stage_dir: &str, story_id: &str) -> bool { use crate::io::story_metadata::parse_front_matter; let path = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage_dir) .join(format!("{story_id}.md")); @@ -615,7 +615,7 @@ fn is_story_blocked(project_root: &Path, stage_dir: &str, story_id: &str) -> boo fn has_merge_failure(project_root: &Path, stage_dir: &str, story_id: &str) -> bool { use crate::io::story_metadata::parse_front_matter; let path = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage_dir) .join(format!("{story_id}.md")); @@ -638,7 +638,7 @@ pub(super) fn is_agent_free(agents: &HashMap, agent_name: &s } fn scan_stage_items(project_root: &Path, stage_dir: &str) -> Vec { - let dir = project_root.join(".story_kit").join("work").join(stage_dir); + let dir = project_root.join(".storkit").join("work").join(stage_dir); if !dir.is_dir() { return Vec::new(); } @@ -875,7 +875,7 @@ mod tests { fn scan_stage_items_returns_sorted_story_ids() { use std::fs; let tmp = tempfile::tempdir().unwrap(); - let stage_dir = tmp.path().join(".story_kit").join("work").join("2_current"); + let stage_dir = tmp.path().join(".storkit").join("work").join("2_current"); fs::create_dir_all(&stage_dir).unwrap(); fs::write(stage_dir.join("42_story_foo.md"), "---\nname: foo\n---").unwrap(); fs::write(stage_dir.join("10_story_bar.md"), "---\nname: bar\n---").unwrap(); @@ -1199,7 +1199,7 @@ stage = "coder" #[tokio::test] async fn auto_assign_picks_up_story_queued_in_current() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); let current = sk.join("work/2_current"); std::fs::create_dir_all(¤t).unwrap(); std::fs::write( @@ -1238,7 +1238,7 @@ stage = "coder" let root = tmp.path(); // Create project.toml with a QA agent. - let sk = root.join(".story_kit"); + let sk = root.join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), @@ -1247,7 +1247,7 @@ stage = "coder" .unwrap(); // Put a spike in 3_qa/ with review_hold: true. - let qa_dir = root.join(".story_kit/work/3_qa"); + let qa_dir = root.join(".storkit/work/3_qa"); std::fs::create_dir_all(&qa_dir).unwrap(); std::fs::write( qa_dir.join("20_spike_test.md"), @@ -1276,7 +1276,7 @@ stage = "coder" #[tokio::test] async fn auto_assign_ignores_coder_preference_when_story_is_in_qa_stage() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); let qa_dir = sk.join("work/3_qa"); std::fs::create_dir_all(&qa_dir).unwrap(); std::fs::write( @@ -1323,7 +1323,7 @@ stage = "coder" #[tokio::test] async fn auto_assign_respects_coder_preference_when_story_is_in_current_stage() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); let current_dir = sk.join("work/2_current"); std::fs::create_dir_all(¤t_dir).unwrap(); std::fs::write( @@ -1370,7 +1370,7 @@ stage = "coder" #[tokio::test] async fn auto_assign_stage_mismatch_with_no_fallback_starts_no_agent() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); let qa_dir = sk.join("work/3_qa"); std::fs::create_dir_all(&qa_dir).unwrap(); // Only a coder agent is configured — no QA agent exists. @@ -1409,7 +1409,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); // Two stories waiting in 2_current, one coder agent. fs::create_dir_all(sk_dir.join("work/2_current")).unwrap(); fs::write( @@ -1463,7 +1463,7 @@ stage = "coder" #[test] fn has_review_hold_returns_true_when_set() { let tmp = tempfile::tempdir().unwrap(); - let qa_dir = tmp.path().join(".story_kit/work/3_qa"); + let qa_dir = tmp.path().join(".storkit/work/3_qa"); std::fs::create_dir_all(&qa_dir).unwrap(); let spike_path = qa_dir.join("10_spike_research.md"); std::fs::write( @@ -1477,7 +1477,7 @@ stage = "coder" #[test] fn has_review_hold_returns_false_when_not_set() { let tmp = tempfile::tempdir().unwrap(); - let qa_dir = tmp.path().join(".story_kit/work/3_qa"); + let qa_dir = tmp.path().join(".storkit/work/3_qa"); std::fs::create_dir_all(&qa_dir).unwrap(); let spike_path = qa_dir.join("10_spike_research.md"); std::fs::write(&spike_path, "---\nname: Research spike\n---\n# Spike\n").unwrap(); @@ -1702,13 +1702,13 @@ stage = "coder" let root = tmp.path(); // Set up story in 2_current/. - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("60_story_test.md"), "test").unwrap(); // Create a worktree directory that is a fresh git repo with no commits // ahead of its own base branch (simulates a worktree where no work was done). - let wt_dir = root.join(".story_kit/worktrees/60_story_test"); + let wt_dir = root.join(".storkit/worktrees/60_story_test"); fs::create_dir_all(&wt_dir).unwrap(); init_git_repo(&wt_dir); @@ -1733,7 +1733,7 @@ stage = "coder" init_git_repo(root); // Set up story in 2_current/ and commit it so the project root is clean. - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("61_story_test.md"), "test").unwrap(); Command::new("git") @@ -1756,7 +1756,7 @@ stage = "coder" .unwrap(); // Create a real git worktree for the story. - let wt_dir = root.join(".story_kit/worktrees/61_story_test"); + let wt_dir = root.join(".storkit/worktrees/61_story_test"); fs::create_dir_all(wt_dir.parent().unwrap()).unwrap(); Command::new("git") .args([ @@ -1804,7 +1804,7 @@ stage = "coder" // and the story stays in 2_current/. The important assertion is that // reconcile ran without panicking and the story is in a consistent state. let in_current = current.join("61_story_test.md").exists(); - let in_qa = root.join(".story_kit/work/3_qa/61_story_test.md").exists(); + let in_qa = root.join(".storkit/work/3_qa/61_story_test.md").exists(); assert!( in_current || in_qa, "story should be in 2_current/ or 3_qa/ after reconciliation" diff --git a/server/src/agents/pool/mod.rs b/server/src/agents/pool/mod.rs index dce39cd..0b63661 100644 --- a/server/src/agents/pool/mod.rs +++ b/server/src/agents/pool/mod.rs @@ -1037,7 +1037,7 @@ fn find_active_story_stage(project_root: &Path, story_id: &str) -> Option<&'stat const STAGES: [&str; 3] = ["2_current", "3_qa", "4_merge"]; for stage in &STAGES { let path = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage) .join(format!("{story_id}.md")); @@ -1301,7 +1301,7 @@ stage = "coder" #[tokio::test] async fn start_agent_auto_selects_second_coder_when_first_busy() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), @@ -1347,7 +1347,7 @@ stage = "coder" #[tokio::test] async fn start_agent_returns_busy_when_all_coders_occupied() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), @@ -1379,7 +1379,7 @@ stage = "coder" #[tokio::test] async fn start_agent_moves_story_to_current_when_coders_busy() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); let backlog = sk.join("work/1_backlog"); std::fs::create_dir_all(&backlog).unwrap(); std::fs::write( @@ -1424,7 +1424,7 @@ stage = "coder" #[tokio::test] async fn start_agent_story_already_in_current_is_noop() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); let current = sk.join("work/2_current"); std::fs::create_dir_all(¤t).unwrap(); std::fs::write( @@ -1451,7 +1451,7 @@ stage = "coder" #[tokio::test] async fn start_agent_explicit_name_unchanged_when_busy() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), @@ -1490,7 +1490,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write(sk_dir.join("project.toml"), "[[agent]]\nname = \"qa\"\n").unwrap(); @@ -1517,7 +1517,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write(sk_dir.join("project.toml"), "[[agent]]\nname = \"qa\"\n").unwrap(); @@ -1543,7 +1543,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1551,7 +1551,7 @@ stage = "coder" ) .unwrap(); - let upcoming = root.join(".story_kit/work/1_backlog"); + let upcoming = root.join(".storkit/work/1_backlog"); fs::create_dir_all(&upcoming).unwrap(); fs::write(upcoming.join("50_story_test.md"), "---\nname: Test\n---\n").unwrap(); @@ -1609,7 +1609,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write(sk_dir.join("project.toml"), "[[agent]]\nname = \"qa\"\n").unwrap(); @@ -1635,7 +1635,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1666,20 +1666,20 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/1_backlog")).unwrap(); fs::write( - root.join(".story_kit/project.toml"), + root.join(".storkit/project.toml"), "[[agent]]\nname = \"coder-1\"\n", ) .unwrap(); fs::write( - root.join(".story_kit/work/1_backlog/86_story_foo.md"), + root.join(".storkit/work/1_backlog/86_story_foo.md"), "---\nname: Foo\n---\n", ) .unwrap(); fs::write( - root.join(".story_kit/work/1_backlog/130_story_bar.md"), + root.join(".storkit/work/1_backlog/130_story_bar.md"), "---\nname: Bar\n---\n", ) .unwrap(); @@ -1731,7 +1731,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1768,7 +1768,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1800,15 +1800,15 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/2_current")).unwrap(); fs::write( - root.join(".story_kit/project.toml"), + root.join(".storkit/project.toml"), "[[agent]]\nname = \"coder-1\"\n\n[[agent]]\nname = \"coder-2\"\n", ) .unwrap(); fs::write( - root.join(".story_kit/work/2_current/42_story_foo.md"), + root.join(".storkit/work/2_current/42_story_foo.md"), "---\nname: Foo\n---\n", ) .unwrap(); @@ -1854,15 +1854,15 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/1_backlog")).unwrap(); fs::write( - root.join(".story_kit/project.toml"), + root.join(".storkit/project.toml"), "[[agent]]\nname = \"coder-1\"\n\n[[agent]]\nname = \"coder-2\"\n", ) .unwrap(); fs::write( - root.join(".story_kit/work/1_backlog/99_story_baz.md"), + root.join(".storkit/work/1_backlog/99_story_baz.md"), "---\nname: Baz\n---\n", ) .unwrap(); @@ -1892,7 +1892,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/2_current")).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1929,7 +1929,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/3_qa")).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -1966,7 +1966,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/4_merge")).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -2003,7 +2003,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/2_current")).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -2039,7 +2039,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); fs::create_dir_all(sk_dir.join("work/4_merge")).unwrap(); fs::write( sk_dir.join("project.toml"), @@ -2075,7 +2075,7 @@ stage = "coder" use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("10_story_test.md"), "test").unwrap(); @@ -2090,7 +2090,7 @@ stage = "coder" use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let qa = root.join(".story_kit/work/3_qa"); + let qa = root.join(".storkit/work/3_qa"); fs::create_dir_all(&qa).unwrap(); fs::write(qa.join("11_story_test.md"), "test").unwrap(); @@ -2102,7 +2102,7 @@ stage = "coder" use std::fs; let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let merge = root.join(".story_kit/work/4_merge"); + let merge = root.join(".storkit/work/4_merge"); fs::create_dir_all(&merge).unwrap(); fs::write(merge.join("12_story_test.md"), "test").unwrap(); @@ -2157,7 +2157,7 @@ stage = "coder" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("60_story_cleanup.md"), "test").unwrap(); @@ -2180,7 +2180,7 @@ stage = "coder" assert_eq!(remaining[0].story_id, "61_story_other"); assert!( - root.join(".story_kit/work/5_done/60_story_cleanup.md") + root.join(".storkit/work/5_done/60_story_cleanup.md") .exists() ); } diff --git a/server/src/agents/pool/pipeline.rs b/server/src/agents/pool/pipeline.rs index fa77a19..7bd671a 100644 --- a/server/src/agents/pool/pipeline.rs +++ b/server/src/agents/pool/pipeline.rs @@ -56,7 +56,7 @@ impl AgentPool { let default_qa = config.default_qa_mode(); // Story is in 2_current/ when a coder completes. let story_path = project_root - .join(".story_kit/work/2_current") + .join(".storkit/work/2_current") .join(format!("{story_id}.md")); crate::io::story_metadata::resolve_qa_mode(&story_path, default_qa) } @@ -105,7 +105,7 @@ impl AgentPool { if let Err(e) = super::super::lifecycle::move_story_to_qa(&project_root, story_id) { slog_error!("[pipeline] Failed to move '{story_id}' to 3_qa/: {e}"); } else { - let qa_dir = project_root.join(".story_kit/work/3_qa"); + let qa_dir = project_root.join(".storkit/work/3_qa"); let story_path = qa_dir.join(format!("{story_id}.md")); if let Err(e) = crate::io::story_metadata::write_review_hold(&story_path) @@ -120,7 +120,7 @@ impl AgentPool { } else { // Increment retry count and check if blocked. let story_path = project_root - .join(".story_kit/work/2_current") + .join(".storkit/work/2_current") .join(format!("{story_id}.md")); if should_block_story(&story_path, config.max_retries, story_id, "coder") { // Story has exceeded retry limit — do not restart. @@ -171,7 +171,7 @@ impl AgentPool { if item_type == "spike" { true // Spikes always need human review. } else { - let qa_dir = project_root.join(".story_kit/work/3_qa"); + let qa_dir = project_root.join(".storkit/work/3_qa"); let story_path = qa_dir.join(format!("{story_id}.md")); let default_qa = config.default_qa_mode(); matches!( @@ -183,7 +183,7 @@ impl AgentPool { if needs_human_review { // Hold in 3_qa/ for human review. - let qa_dir = project_root.join(".story_kit/work/3_qa"); + let qa_dir = project_root.join(".storkit/work/3_qa"); let story_path = qa_dir.join(format!("{story_id}.md")); if let Err(e) = crate::io::story_metadata::write_review_hold(&story_path) @@ -219,7 +219,7 @@ impl AgentPool { } } else { let story_path = project_root - .join(".story_kit/work/3_qa") + .join(".storkit/work/3_qa") .join(format!("{story_id}.md")); if should_block_story(&story_path, config.max_retries, story_id, "qa-coverage") { // Story has exceeded retry limit — do not restart. @@ -243,7 +243,7 @@ impl AgentPool { } } else { let story_path = project_root - .join(".story_kit/work/3_qa") + .join(".storkit/work/3_qa") .join(format!("{story_id}.md")); if should_block_story(&story_path, config.max_retries, story_id, "qa") { // Story has exceeded retry limit — do not restart. @@ -319,7 +319,7 @@ impl AgentPool { ); } else { let story_path = project_root - .join(".story_kit/work/4_merge") + .join(".storkit/work/4_merge") .join(format!("{story_id}.md")); if should_block_story(&story_path, config.max_retries, story_id, "mergemaster") { // Story has exceeded retry limit — do not restart. @@ -1125,7 +1125,7 @@ mod tests { let root = tmp.path(); // Set up story in 2_current/ (no qa frontmatter → uses project default "server") - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("50_story_test.md"), "test").unwrap(); @@ -1146,7 +1146,7 @@ mod tests { // With default qa: server, story skips QA and goes straight to 4_merge/ assert!( - root.join(".story_kit/work/4_merge/50_story_test.md") + root.join(".storkit/work/4_merge/50_story_test.md") .exists(), "story should be in 4_merge/" ); @@ -1163,7 +1163,7 @@ mod tests { let root = tmp.path(); // Set up story in 2_current/ with qa: agent frontmatter - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write( current.join("50_story_test.md"), @@ -1188,7 +1188,7 @@ mod tests { // With qa: agent, story should move to 3_qa/ assert!( - root.join(".story_kit/work/3_qa/50_story_test.md").exists(), + root.join(".storkit/work/3_qa/50_story_test.md").exists(), "story should be in 3_qa/" ); assert!( @@ -1204,7 +1204,7 @@ mod tests { let root = tmp.path(); // Set up story in 3_qa/ - let qa_dir = root.join(".story_kit/work/3_qa"); + let qa_dir = root.join(".storkit/work/3_qa"); fs::create_dir_all(&qa_dir).unwrap(); // qa: server so the story skips human review and goes straight to merge. fs::write( @@ -1230,7 +1230,7 @@ mod tests { // Story should have moved to 4_merge/ assert!( - root.join(".story_kit/work/4_merge/51_story_test.md") + root.join(".storkit/work/4_merge/51_story_test.md") .exists(), "story should be in 4_merge/" ); @@ -1246,7 +1246,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("52_story_test.md"), "test").unwrap(); @@ -1280,18 +1280,18 @@ mod tests { let root = tmp.path(); // Set up story in 2_current/ - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("173_story_test.md"), "test").unwrap(); // Ensure 3_qa/ exists for the move target - fs::create_dir_all(root.join(".story_kit/work/3_qa")).unwrap(); + fs::create_dir_all(root.join(".storkit/work/3_qa")).unwrap(); // Ensure 1_backlog/ exists (start_agent calls move_story_to_current) - fs::create_dir_all(root.join(".story_kit/work/1_backlog")).unwrap(); + fs::create_dir_all(root.join(".storkit/work/1_backlog")).unwrap(); // Write a project.toml with a qa agent so start_agent can resolve it. - fs::create_dir_all(root.join(".story_kit")).unwrap(); + fs::create_dir_all(root.join(".storkit")).unwrap(); fs::write( - root.join(".story_kit/project.toml"), + root.join(".storkit/project.toml"), r#" default_qa = "agent" @@ -1426,7 +1426,7 @@ stage = "qa" .unwrap(); // Create the story file in 4_merge/ so we can test archival - let merge_dir = repo.join(".story_kit/work/4_merge"); + let merge_dir = repo.join(".storkit/work/4_merge"); fs::create_dir_all(&merge_dir).unwrap(); let story_file = merge_dir.join("23_test.md"); fs::write(&story_file, "---\nname: Test\n---\n").unwrap(); @@ -1454,7 +1454,7 @@ stage = "qa" "report should be coherent: {report:?}" ); if report.story_archived { - let done = repo.join(".story_kit/work/5_done/23_test.md"); + let done = repo.join(".storkit/work/5_done/23_test.md"); assert!(done.exists(), "done file should exist"); } } @@ -1639,7 +1639,7 @@ stage = "qa" .unwrap(); // Create story file in 4_merge. - let merge_dir = repo.join(".story_kit/work/4_merge"); + let merge_dir = repo.join(".storkit/work/4_merge"); fs::create_dir_all(&merge_dir).unwrap(); fs::write(merge_dir.join("42_story_foo.md"), "---\nname: Test\n---\n").unwrap(); Command::new("git") @@ -1689,7 +1689,7 @@ stage = "qa" let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let sk = root.join(".story_kit"); + let sk = root.join(".storkit"); let qa_dir = sk.join("work/3_qa"); fs::create_dir_all(&qa_dir).unwrap(); diff --git a/server/src/agents/token_usage.rs b/server/src/agents/token_usage.rs index b1ae0a1..74c7a7c 100644 --- a/server/src/agents/token_usage.rs +++ b/server/src/agents/token_usage.rs @@ -20,7 +20,7 @@ pub struct TokenUsageRecord { /// Append a token usage record to the persistent JSONL file. /// /// Each line is a self-contained JSON object, making appends atomic and -/// reads simple. The file lives at `.story_kit/token_usage.jsonl`. +/// reads simple. The file lives at `.storkit/token_usage.jsonl`. pub fn append_record(project_root: &Path, record: &TokenUsageRecord) -> Result<(), String> { let path = token_usage_path(project_root); if let Some(parent) = path.parent() { @@ -87,7 +87,7 @@ pub fn build_record( } fn token_usage_path(project_root: &Path) -> std::path::PathBuf { - project_root.join(".story_kit").join("token_usage.jsonl") + project_root.join(".storkit").join("token_usage.jsonl") } #[cfg(test)] @@ -147,7 +147,7 @@ mod tests { fn malformed_lines_are_skipped() { let dir = TempDir::new().unwrap(); let root = dir.path(); - let path = root.join(".story_kit").join("token_usage.jsonl"); + let path = root.join(".storkit").join("token_usage.jsonl"); fs::create_dir_all(path.parent().unwrap()).unwrap(); fs::write(&path, "not json\n{\"bad\":true}\n").unwrap(); diff --git a/server/src/config.rs b/server/src/config.rs index e43580d..838c0e3 100644 --- a/server/src/config.rs +++ b/server/src/config.rs @@ -137,7 +137,7 @@ fn default_agent_command() -> String { fn default_agent_prompt() -> String { "You are working in a git worktree on story {{story_id}}. \ - Read .story_kit/README.md to understand the dev process, then pick up the story. \ + Read .storkit/README.md to understand the dev process, then pick up the story. \ Commit all your work when done — the server will automatically run acceptance \ gates (cargo clippy + tests) when your process exits." .to_string() @@ -189,13 +189,13 @@ impl Default for ProjectConfig { } impl ProjectConfig { - /// Load from `.story_kit/project.toml` relative to the given root. + /// Load from `.storkit/project.toml` relative to the given root. /// Falls back to sensible defaults if the file doesn't exist. /// /// Supports both the new `[[agent]]` array format and the legacy /// `[agent]` single-table format (with a deprecation warning). pub fn load(project_root: &Path) -> Result { - let config_path = project_root.join(".story_kit/project.toml"); + let config_path = project_root.join(".storkit/project.toml"); if !config_path.exists() { return Ok(Self::default()); } @@ -582,7 +582,7 @@ name = "second" #[test] fn parse_project_toml_from_file() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("project.toml"), @@ -663,7 +663,7 @@ name = "coder" #[test] fn watcher_config_from_file() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("project.toml"), diff --git a/server/src/http/agents.rs b/server/src/http/agents.rs index 849b623..3c80a51 100644 --- a/server/src/http/agents.rs +++ b/server/src/http/agents.rs @@ -158,7 +158,7 @@ struct AllTokenUsageResponse { /// response so the agents panel is not cluttered with old completed items on /// frontend startup. pub fn story_is_archived(project_root: &path::Path, story_id: &str) -> bool { - let work = project_root.join(".story_kit").join("work"); + let work = project_root.join(".storkit").join("work"); let filename = format!("{story_id}.md"); work.join("5_done").join(&filename).exists() || work.join("6_archived").join(&filename).exists() @@ -316,7 +316,7 @@ impl AgentsApi { )) } - /// Create a git worktree for a story under .story_kit/worktrees/{story_id}. + /// Create a git worktree for a story under .storkit/worktrees/{story_id}. #[oai(path = "/agents/worktrees", method = "post")] async fn create_worktree( &self, @@ -343,7 +343,7 @@ impl AgentsApi { })) } - /// List all worktrees under .story_kit/worktrees/. + /// List all worktrees under .storkit/worktrees/. #[oai(path = "/agents/worktrees", method = "get")] async fn list_worktrees(&self) -> OpenApiResult>> { let project_root = self @@ -389,7 +389,7 @@ impl AgentsApi { ("6_archived", "archived"), ]; - let work_dir = project_root.join(".story_kit").join("work"); + let work_dir = project_root.join(".storkit").join("work"); let filename = format!("{}.md", story_id.0); for (stage_dir, stage_name) in &stages { @@ -604,7 +604,7 @@ mod tests { fn make_work_dirs(tmp: &TempDir) -> path::PathBuf { let root = tmp.path().to_path_buf(); for stage in &["5_done", "6_archived"] { - std::fs::create_dir_all(root.join(".story_kit").join("work").join(stage)).unwrap(); + std::fs::create_dir_all(root.join(".storkit").join("work").join(stage)).unwrap(); } root } @@ -621,7 +621,7 @@ mod tests { let tmp = TempDir::new().unwrap(); let root = make_work_dirs(&tmp); std::fs::write( - root.join(".story_kit/work/5_done/79_story_foo.md"), + root.join(".storkit/work/5_done/79_story_foo.md"), "---\nname: test\n---\n", ) .unwrap(); @@ -633,7 +633,7 @@ mod tests { let tmp = TempDir::new().unwrap(); let root = make_work_dirs(&tmp); std::fs::write( - root.join(".story_kit/work/6_archived/79_story_foo.md"), + root.join(".storkit/work/6_archived/79_story_foo.md"), "---\nname: test\n---\n", ) .unwrap(); @@ -647,7 +647,7 @@ mod tests { // Place an archived story file in 6_archived std::fs::write( - root.join(".story_kit/work/6_archived/79_story_archived.md"), + root.join(".storkit/work/6_archived/79_story_archived.md"), "---\nname: archived story\n---\n", ) .unwrap(); @@ -694,7 +694,7 @@ mod tests { } fn make_project_toml(root: &path::Path, content: &str) { - let sk_dir = root.join(".story_kit"); + let sk_dir = root.join(".storkit"); std::fs::create_dir_all(&sk_dir).unwrap(); std::fs::write(sk_dir.join("project.toml"), content).unwrap(); } @@ -830,7 +830,7 @@ allowed_tools = ["Read", "Bash"] #[tokio::test] async fn list_worktrees_returns_entries_from_dir() { let tmp = TempDir::new().unwrap(); - let worktrees_dir = tmp.path().join(".story_kit").join("worktrees"); + let worktrees_dir = tmp.path().join(".storkit").join("worktrees"); std::fs::create_dir_all(worktrees_dir.join("42_story_foo")).unwrap(); std::fs::create_dir_all(worktrees_dir.join("43_story_bar")).unwrap(); @@ -935,7 +935,7 @@ allowed_tools = ["Read", "Bash"] // --- get_work_item_content tests --- fn make_stage_dir(root: &path::Path, stage: &str) { - std::fs::create_dir_all(root.join(".story_kit").join("work").join(stage)).unwrap(); + std::fs::create_dir_all(root.join(".storkit").join("work").join(stage)).unwrap(); } #[tokio::test] @@ -944,7 +944,7 @@ allowed_tools = ["Read", "Bash"] let root = tmp.path(); make_stage_dir(root, "1_backlog"); std::fs::write( - root.join(".story_kit/work/1_backlog/42_story_foo.md"), + root.join(".storkit/work/1_backlog/42_story_foo.md"), "---\nname: \"Foo Story\"\n---\n\n# Story 42: Foo Story\n\nSome content.", ) .unwrap(); @@ -968,7 +968,7 @@ allowed_tools = ["Read", "Bash"] let root = tmp.path(); make_stage_dir(root, "2_current"); std::fs::write( - root.join(".story_kit/work/2_current/43_story_bar.md"), + root.join(".storkit/work/2_current/43_story_bar.md"), "---\nname: \"Bar Story\"\n---\n\nBar content.", ) .unwrap(); @@ -1244,7 +1244,7 @@ allowed_tools = ["Read", "Bash"] let root = tmp.path().to_path_buf(); // Create work dirs including 2_current for the story file. for stage in &["1_backlog", "2_current", "5_done", "6_archived"] { - std::fs::create_dir_all(root.join(".story_kit").join("work").join(stage)).unwrap(); + std::fs::create_dir_all(root.join(".storkit").join("work").join(stage)).unwrap(); } // Write a story file with persisted test results. @@ -1258,7 +1258,7 @@ name: "Test story" "#; std::fs::write( - root.join(".story_kit/work/2_current/42_story_foo.md"), + root.join(".storkit/work/2_current/42_story_foo.md"), story_content, ) .unwrap(); diff --git a/server/src/http/context.rs b/server/src/http/context.rs index 3002ac1..c0150c2 100644 --- a/server/src/http/context.rs +++ b/server/src/http/context.rs @@ -59,7 +59,7 @@ impl AppContext { pub fn new_test(project_root: std::path::PathBuf) -> Self { let state = SessionState::default(); *state.project_root.lock().unwrap() = Some(project_root.clone()); - let store_path = project_root.join(".story_kit_store.json"); + let store_path = project_root.join(".storkit_store.json"); let (watcher_tx, _) = broadcast::channel(64); let (reconciliation_tx, _) = broadcast::channel(64); let (perm_tx, perm_rx) = mpsc::unbounded_channel(); diff --git a/server/src/http/mcp/agent_tools.rs b/server/src/http/mcp/agent_tools.rs index ca167b8..a948f52 100644 --- a/server/src/http/mcp/agent_tools.rs +++ b/server/src/http/mcp/agent_tools.rs @@ -42,11 +42,11 @@ pub(super) async fn tool_start_agent(args: &Value, ctx: &AppContext) -> Result Option { let path = project_root - .join(".story_kit") + .join(".storkit") .join("coverage") .join("server.json"); let contents = std::fs::read_to_string(&path).ok()?; @@ -489,7 +489,7 @@ mod tests { // Config has only a supervisor — start_agent without agent_name should // refuse rather than silently assigning supervisor. let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), @@ -517,7 +517,7 @@ stage = "other" // missing git repo / worktree, but the error must NOT be about // "No coder agent configured". let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), @@ -713,7 +713,7 @@ stage = "coder" fn read_coverage_percent_from_json_parses_llvm_cov_format() { use std::fs; let tmp = tempfile::tempdir().unwrap(); - let cov_dir = tmp.path().join(".story_kit/coverage"); + let cov_dir = tmp.path().join(".storkit/coverage"); fs::create_dir_all(&cov_dir).unwrap(); let json_content = r#"{"data":[{"totals":{"lines":{"count":100,"covered":78,"percent":78.0}}}]}"#; fs::write(cov_dir.join("server.json"), json_content).unwrap(); diff --git a/server/src/http/mcp/diagnostics.rs b/server/src/http/mcp/diagnostics.rs index e14efe5..768f71f 100644 --- a/server/src/http/mcp/diagnostics.rs +++ b/server/src/http/mcp/diagnostics.rs @@ -98,13 +98,13 @@ pub(super) async fn tool_rebuild_and_restart(ctx: &AppContext) -> Result Resul // survives server restarts and is visible in the web UI. if let Ok(project_root) = ctx.state.get_project_root() { let story_file = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join("4_merge") .join(format!("{story_id}.md")); @@ -247,7 +247,7 @@ mod tests { async fn tool_move_story_to_merge_moves_file() { let tmp = tempfile::tempdir().unwrap(); setup_git_repo_in(tmp.path()); - let current_dir = tmp.path().join(".story_kit/work/2_current"); + let current_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(¤t_dir).unwrap(); let story_file = current_dir.join("24_story_test.md"); std::fs::write(&story_file, "---\nname: Test\n---\n").unwrap(); @@ -268,7 +268,7 @@ mod tests { // File should have been moved regardless of agent start outcome assert!(!story_file.exists(), "2_current file should be gone"); assert!( - tmp.path().join(".story_kit/work/4_merge/24_story_test.md").exists(), + tmp.path().join(".storkit/work/4_merge/24_story_test.md").exists(), "4_merge file should exist" ); // Result is either Ok (agent started) or Err (agent failed - acceptable in tests) diff --git a/server/src/http/mcp/mod.rs b/server/src/http/mcp/mod.rs index 75927ca..185a897 100644 --- a/server/src/http/mcp/mod.rs +++ b/server/src/http/mcp/mod.rs @@ -534,7 +534,7 @@ fn handle_tools_list(id: Option) -> JsonRpcResponse { }, { "name": "create_worktree", - "description": "Create a git worktree for a story under .story_kit/worktrees/{story_id} with deterministic naming. Writes .mcp.json and runs component setup. Returns the worktree path.", + "description": "Create a git worktree for a story under .storkit/worktrees/{story_id} with deterministic naming. Writes .mcp.json and runs component setup. Returns the worktree path.", "inputSchema": { "type": "object", "properties": { @@ -548,7 +548,7 @@ fn handle_tools_list(id: Option) -> JsonRpcResponse { }, { "name": "list_worktrees", - "description": "List all worktrees under .story_kit/worktrees/ for the current project.", + "description": "List all worktrees under .storkit/worktrees/ for the current project.", "inputSchema": { "type": "object", "properties": {} @@ -667,7 +667,7 @@ fn handle_tools_list(id: Option) -> JsonRpcResponse { }, { "name": "create_spike", - "description": "Create a spike file in .story_kit/work/1_backlog/ with a deterministic filename and YAML front matter. Returns the spike_id.", + "description": "Create a spike file in .storkit/work/1_backlog/ with a deterministic filename and YAML front matter. Returns the spike_id.", "inputSchema": { "type": "object", "properties": { @@ -891,7 +891,7 @@ fn handle_tools_list(id: Option) -> JsonRpcResponse { }, { "name": "launch_qa_app", - "description": "Launch the app from a story's worktree for manual QA testing. Automatically assigns a free port, writes it to .story_kit_port, and starts the backend server. Only one QA app instance runs at a time.", + "description": "Launch the app from a story's worktree for manual QA testing. Automatically assigns a free port, writes it to .storkit_port, and starts the backend server. Only one QA app instance runs at a time.", "inputSchema": { "type": "object", "properties": { @@ -1006,7 +1006,7 @@ fn handle_tools_list(id: Option) -> JsonRpcResponse { }, { "name": "run_command", - "description": "Execute a shell command in an agent's worktree directory. The working_dir must be inside .story_kit/worktrees/. Returns stdout, stderr, exit_code, and timed_out. Supports SSE streaming (send Accept: text/event-stream) for long-running commands. Dangerous commands (rm -rf /, sudo, etc.) are blocked.", + "description": "Execute a shell command in an agent's worktree directory. The working_dir must be inside .storkit/worktrees/. Returns stdout, stderr, exit_code, and timed_out. Supports SSE streaming (send Accept: text/event-stream) for long-running commands. Dangerous commands (rm -rf /, sudo, etc.) are blocked.", "inputSchema": { "type": "object", "properties": { @@ -1016,7 +1016,7 @@ fn handle_tools_list(id: Option) -> JsonRpcResponse { }, "working_dir": { "type": "string", - "description": "Absolute path to the worktree directory to run the command in. Must be inside .story_kit/worktrees/." + "description": "Absolute path to the worktree directory to run the command in. Must be inside .storkit/worktrees/." }, "timeout": { "type": "integer", diff --git a/server/src/http/mcp/qa_tools.rs b/server/src/http/mcp/qa_tools.rs index 2498bf6..0a9c940 100644 --- a/server/src/http/mcp/qa_tools.rs +++ b/server/src/http/mcp/qa_tools.rs @@ -48,7 +48,7 @@ pub(super) async fn tool_approve_qa(args: &Value, ctx: &AppContext) -> Result Result Result // Find a free port starting from 3100 let port = find_free_port(3100); - // Write .story_kit_port so the frontend dev server knows where to connect - let port_file = wt_path.join(".story_kit_port"); + // Write .storkit_port so the frontend dev server knows where to connect + let port_file = wt_path.join(".storkit_port"); std::fs::write(&port_file, port.to_string()) - .map_err(|e| format!("Failed to write .story_kit_port: {e}"))?; + .map_err(|e| format!("Failed to write .storkit_port: {e}"))?; // Launch the server from the worktree let child = std::process::Command::new("cargo") diff --git a/server/src/http/mcp/shell_tools.rs b/server/src/http/mcp/shell_tools.rs index 50046f3..a24f945 100644 --- a/server/src/http/mcp/shell_tools.rs +++ b/server/src/http/mcp/shell_tools.rs @@ -59,7 +59,7 @@ fn is_dangerous(command: &str) -> Option { } /// Validates that `working_dir` exists and is inside the project's -/// `.story_kit/worktrees/` directory. Returns the canonicalized path. +/// `.storkit/worktrees/` directory. Returns the canonicalized path. fn validate_working_dir(working_dir: &str, ctx: &AppContext) -> Result { let wd = PathBuf::from(working_dir); @@ -71,7 +71,7 @@ fn validate_working_dir(working_dir: &str, ctx: &AppContext) -> Result Result Result Result< } // 4. Find and delete the story file from any pipeline stage - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); let stage_dirs = ["1_backlog", "2_current", "3_qa", "4_merge", "5_done", "6_archived"]; let mut deleted = false; for stage in &stage_dirs { @@ -626,7 +626,7 @@ mod tests { ("4_merge", "40_story_merge", "Merge Story"), ("5_done", "50_story_done", "Done Story"), ] { - let dir = root.join(".story_kit/work").join(stage); + let dir = root.join(".storkit/work").join(stage); std::fs::create_dir_all(&dir).unwrap(); std::fs::write( dir.join(format!("{id}.md")), @@ -661,7 +661,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let root = tmp.path(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); std::fs::create_dir_all(¤t).unwrap(); std::fs::write( current.join("20_story_active.md"), @@ -701,7 +701,7 @@ mod tests { #[test] fn tool_get_story_todos_returns_unchecked() { let tmp = tempfile::tempdir().unwrap(); - let current_dir = tmp.path().join(".story_kit").join("work").join("2_current"); + let current_dir = tmp.path().join(".storkit").join("work").join("2_current"); fs::create_dir_all(¤t_dir).unwrap(); fs::write( current_dir.join("1_test.md"), @@ -795,8 +795,8 @@ mod tests { "create_bug description should reference work/1_backlog/, got: {desc}" ); assert!( - !desc.contains(".story_kit/bugs"), - "create_bug description should not reference nonexistent .story_kit/bugs/, got: {desc}" + !desc.contains(".storkit/bugs"), + "create_bug description should not reference nonexistent .storkit/bugs/, got: {desc}" ); let required = t["inputSchema"]["required"].as_array().unwrap(); let req_names: Vec<&str> = required.iter().map(|v| v.as_str().unwrap()).collect(); @@ -821,8 +821,8 @@ mod tests { "list_bugs description should reference work/1_backlog/, got: {desc}" ); assert!( - !desc.contains(".story_kit/bugs"), - "list_bugs description should not reference nonexistent .story_kit/bugs/, got: {desc}" + !desc.contains(".storkit/bugs"), + "list_bugs description should not reference nonexistent .storkit/bugs/, got: {desc}" ); } @@ -836,8 +836,8 @@ mod tests { let t = tool.unwrap(); let desc = t["description"].as_str().unwrap(); assert!( - !desc.contains(".story_kit/bugs"), - "close_bug description should not reference nonexistent .story_kit/bugs/, got: {desc}" + !desc.contains(".storkit/bugs"), + "close_bug description should not reference nonexistent .storkit/bugs/, got: {desc}" ); assert!( desc.contains("work/5_done/"), @@ -903,7 +903,7 @@ mod tests { assert!(result.contains("1_bug_login_crash")); let bug_file = tmp .path() - .join(".story_kit/work/1_backlog/1_bug_login_crash.md"); + .join(".storkit/work/1_backlog/1_bug_login_crash.md"); assert!(bug_file.exists()); } @@ -919,7 +919,7 @@ mod tests { #[test] fn tool_list_bugs_returns_open_bugs() { let tmp = tempfile::tempdir().unwrap(); - let backlog_dir = tmp.path().join(".story_kit/work/1_backlog"); + let backlog_dir = tmp.path().join(".storkit/work/1_backlog"); std::fs::create_dir_all(&backlog_dir).unwrap(); std::fs::write( backlog_dir.join("1_bug_crash.md"), @@ -955,7 +955,7 @@ mod tests { fn tool_close_bug_moves_to_archive() { let tmp = tempfile::tempdir().unwrap(); setup_git_repo_in(tmp.path()); - let backlog_dir = tmp.path().join(".story_kit/work/1_backlog"); + let backlog_dir = tmp.path().join(".storkit/work/1_backlog"); std::fs::create_dir_all(&backlog_dir).unwrap(); let bug_file = backlog_dir.join("1_bug_crash.md"); std::fs::write(&bug_file, "# Bug 1: Crash\n").unwrap(); @@ -975,7 +975,7 @@ mod tests { let result = tool_close_bug(&json!({"bug_id": "1_bug_crash"}), &ctx).unwrap(); assert!(result.contains("1_bug_crash")); assert!(!bug_file.exists()); - assert!(tmp.path().join(".story_kit/work/5_done/1_bug_crash.md").exists()); + assert!(tmp.path().join(".storkit/work/5_done/1_bug_crash.md").exists()); } #[test] @@ -1026,7 +1026,7 @@ mod tests { assert!(result.contains("1_spike_compare_encoders")); let spike_file = tmp .path() - .join(".story_kit/work/1_backlog/1_spike_compare_encoders.md"); + .join(".storkit/work/1_backlog/1_spike_compare_encoders.md"); assert!(spike_file.exists()); let contents = std::fs::read_to_string(&spike_file).unwrap(); assert!(contents.starts_with("---\nname: \"Compare Encoders\"\n---")); @@ -1041,7 +1041,7 @@ mod tests { let result = tool_create_spike(&json!({"name": "My Spike"}), &ctx).unwrap(); assert!(result.contains("1_spike_my_spike")); - let spike_file = tmp.path().join(".story_kit/work/1_backlog/1_spike_my_spike.md"); + let spike_file = tmp.path().join(".storkit/work/1_backlog/1_spike_my_spike.md"); assert!(spike_file.exists()); let contents = std::fs::read_to_string(&spike_file).unwrap(); assert!(contents.starts_with("---\nname: \"My Spike\"\n---")); @@ -1087,7 +1087,7 @@ mod tests { #[test] fn tool_validate_stories_with_valid_story() { let tmp = tempfile::tempdir().unwrap(); - let current_dir = tmp.path().join(".story_kit").join("work").join("2_current"); + let current_dir = tmp.path().join(".storkit").join("work").join("2_current"); fs::create_dir_all(¤t_dir).unwrap(); fs::write( current_dir.join("1_test.md"), @@ -1104,7 +1104,7 @@ mod tests { #[test] fn tool_validate_stories_with_invalid_front_matter() { let tmp = tempfile::tempdir().unwrap(); - let current_dir = tmp.path().join(".story_kit").join("work").join("2_current"); + let current_dir = tmp.path().join(".storkit").join("work").join("2_current"); fs::create_dir_all(¤t_dir).unwrap(); fs::write( current_dir.join("1_test.md"), @@ -1121,7 +1121,7 @@ mod tests { #[test] fn record_tests_persists_to_story_file() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("1_story_persist.md"), "---\nname: Persist\n---\n# Story\n").unwrap(); @@ -1145,7 +1145,7 @@ mod tests { #[test] fn ensure_acceptance_reads_from_file_when_not_in_memory() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); // Write a story file with a pre-populated Test Results section (simulating a restart) @@ -1164,7 +1164,7 @@ mod tests { #[test] fn ensure_acceptance_file_with_failures_still_blocks() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let story_content = "---\nname: Fail\n---\n# Story\n\n## Test Results\n\n\n"; @@ -1197,7 +1197,7 @@ mod tests { #[tokio::test] async fn tool_delete_story_deletes_file_from_backlog() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); let story_file = backlog.join("10_story_cleanup.md"); fs::write(&story_file, "---\nname: Cleanup\n---\n").unwrap(); @@ -1211,7 +1211,7 @@ mod tests { #[tokio::test] async fn tool_delete_story_deletes_file_from_current() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let story_file = current.join("11_story_active.md"); fs::write(&story_file, "---\nname: Active\n---\n").unwrap(); @@ -1271,7 +1271,7 @@ mod tests { .unwrap(); // Create story file in current/ so move_story_to_archived would work. - let current_dir = tmp.path().join(".story_kit/work/2_current"); + let current_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(¤t_dir).unwrap(); std::fs::write( current_dir.join("50_story_test.md"), @@ -1297,7 +1297,7 @@ mod tests { setup_git_repo_in(tmp.path()); // Create story file in current/ (no feature branch). - let current_dir = tmp.path().join(".story_kit/work/2_current"); + let current_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(¤t_dir).unwrap(); std::fs::write( current_dir.join("51_story_no_branch.md"), @@ -1333,7 +1333,7 @@ mod tests { fn tool_check_criterion_marks_unchecked_item() { let tmp = tempfile::tempdir().unwrap(); setup_git_repo_in(tmp.path()); - let current_dir = tmp.path().join(".story_kit").join("work").join("2_current"); + let current_dir = tmp.path().join(".storkit").join("work").join("2_current"); fs::create_dir_all(¤t_dir).unwrap(); fs::write( current_dir.join("1_test.md"), diff --git a/server/src/http/mod.rs b/server/src/http/mod.rs index 4123819..0f4bdac 100644 --- a/server/src/http/mod.rs +++ b/server/src/http/mod.rs @@ -45,7 +45,7 @@ pub fn resolve_port() -> u16 { } pub fn write_port_file(dir: &Path, port: u16) -> Option { - let path = dir.join(".story_kit_port"); + let path = dir.join(".storkit_port"); std::fs::write(&path, port.to_string()).ok()?; Some(path) } diff --git a/server/src/http/settings.rs b/server/src/http/settings.rs index b7c9260..87a5860 100644 --- a/server/src/http/settings.rs +++ b/server/src/http/settings.rs @@ -241,7 +241,7 @@ mod tests { #[test] fn editor_command_survives_reload() { let dir = TempDir::new().unwrap(); - let store_path = dir.path().join(".story_kit_store.json"); + let store_path = dir.path().join(".storkit_store.json"); { let ctx = AppContext::new_test(dir.path().to_path_buf()); diff --git a/server/src/http/workflow/bug_ops.rs b/server/src/http/workflow/bug_ops.rs index 494b3ae..1750e6c 100644 --- a/server/src/http/workflow/bug_ops.rs +++ b/server/src/http/workflow/bug_ops.rs @@ -24,7 +24,7 @@ pub fn create_bug_file( } let filename = format!("{bug_number}_bug_{slug}.md"); - let bugs_dir = root.join(".story_kit").join("work").join("1_backlog"); + let bugs_dir = root.join(".storkit").join("work").join("1_backlog"); fs::create_dir_all(&bugs_dir) .map_err(|e| format!("Failed to create backlog directory: {e}"))?; @@ -88,7 +88,7 @@ pub fn create_spike_file( } let filename = format!("{spike_number}_spike_{slug}.md"); - let backlog_dir = root.join(".story_kit").join("work").join("1_backlog"); + let backlog_dir = root.join(".storkit").join("work").join("1_backlog"); fs::create_dir_all(&backlog_dir) .map_err(|e| format!("Failed to create backlog directory: {e}"))?; @@ -151,7 +151,7 @@ pub fn create_refactor_file( } let filename = format!("{refactor_number}_refactor_{slug}.md"); - let backlog_dir = root.join(".story_kit").join("work").join("1_backlog"); + let backlog_dir = root.join(".storkit").join("work").join("1_backlog"); fs::create_dir_all(&backlog_dir) .map_err(|e| format!("Failed to create backlog directory: {e}"))?; @@ -227,7 +227,7 @@ fn extract_bug_name(path: &Path) -> Option { /// /// Returns a sorted list of `(bug_id, name)` pairs. pub fn list_bug_files(root: &Path) -> Result, String> { - let backlog_dir = root.join(".story_kit").join("work").join("1_backlog"); + let backlog_dir = root.join(".storkit").join("work").join("1_backlog"); if !backlog_dir.exists() { return Ok(Vec::new()); } @@ -277,7 +277,7 @@ fn is_refactor_item(stem: &str) -> bool { /// /// Returns a sorted list of `(refactor_id, name)` pairs. pub fn list_refactor_files(root: &Path) -> Result, String> { - let backlog_dir = root.join(".story_kit").join("work").join("1_backlog"); + let backlog_dir = root.join(".storkit").join("work").join("1_backlog"); if !backlog_dir.exists() { return Ok(Vec::new()); } @@ -357,7 +357,7 @@ mod tests { #[test] fn next_item_number_increments_from_existing_bugs() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); fs::write(backlog.join("1_bug_crash.md"), "").unwrap(); fs::write(backlog.join("3_bug_another.md"), "").unwrap(); @@ -367,8 +367,8 @@ mod tests { #[test] fn next_item_number_scans_archived_too() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); - let archived = tmp.path().join(".story_kit/work/5_done"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); + let archived = tmp.path().join(".storkit/work/5_done"); fs::create_dir_all(&backlog).unwrap(); fs::create_dir_all(&archived).unwrap(); fs::write(archived.join("5_bug_old.md"), "").unwrap(); @@ -385,8 +385,8 @@ mod tests { #[test] fn list_bug_files_excludes_archive_subdir() { let tmp = tempfile::tempdir().unwrap(); - let backlog_dir = tmp.path().join(".story_kit/work/1_backlog"); - let archived_dir = tmp.path().join(".story_kit/work/5_done"); + let backlog_dir = tmp.path().join(".storkit/work/1_backlog"); + let archived_dir = tmp.path().join(".storkit/work/5_done"); fs::create_dir_all(&backlog_dir).unwrap(); fs::create_dir_all(&archived_dir).unwrap(); fs::write(backlog_dir.join("1_bug_open.md"), "# Bug 1: Open Bug\n").unwrap(); @@ -401,7 +401,7 @@ mod tests { #[test] fn list_bug_files_sorted_by_id() { let tmp = tempfile::tempdir().unwrap(); - let backlog_dir = tmp.path().join(".story_kit/work/1_backlog"); + let backlog_dir = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog_dir).unwrap(); fs::write(backlog_dir.join("3_bug_third.md"), "# Bug 3: Third\n").unwrap(); fs::write(backlog_dir.join("1_bug_first.md"), "# Bug 1: First\n").unwrap(); @@ -443,7 +443,7 @@ mod tests { let filepath = tmp .path() - .join(".story_kit/work/1_backlog/1_bug_login_crash.md"); + .join(".storkit/work/1_backlog/1_bug_login_crash.md"); assert!(filepath.exists()); let contents = fs::read_to_string(&filepath).unwrap(); assert!( @@ -487,7 +487,7 @@ mod tests { ) .unwrap(); - let filepath = tmp.path().join(".story_kit/work/1_backlog/1_bug_some_bug.md"); + let filepath = tmp.path().join(".storkit/work/1_backlog/1_bug_some_bug.md"); let contents = fs::read_to_string(&filepath).unwrap(); assert!( contents.starts_with("---\nname: \"Some Bug\"\n---"), @@ -509,7 +509,7 @@ mod tests { let filepath = tmp .path() - .join(".story_kit/work/1_backlog/1_spike_filesystem_watcher_architecture.md"); + .join(".storkit/work/1_backlog/1_spike_filesystem_watcher_architecture.md"); assert!(filepath.exists()); let contents = fs::read_to_string(&filepath).unwrap(); assert!( @@ -533,7 +533,7 @@ mod tests { create_spike_file(tmp.path(), "FS Watcher Spike", Some(description)).unwrap(); let filepath = - tmp.path().join(".story_kit/work/1_backlog/1_spike_fs_watcher_spike.md"); + tmp.path().join(".storkit/work/1_backlog/1_spike_fs_watcher_spike.md"); let contents = fs::read_to_string(&filepath).unwrap(); assert!(contents.contains(description)); } @@ -543,7 +543,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); create_spike_file(tmp.path(), "My Spike", None).unwrap(); - let filepath = tmp.path().join(".story_kit/work/1_backlog/1_spike_my_spike.md"); + let filepath = tmp.path().join(".storkit/work/1_backlog/1_spike_my_spike.md"); let contents = fs::read_to_string(&filepath).unwrap(); // Should have placeholder TBD in Question section assert!(contents.contains("## Question\n\n- TBD\n")); @@ -564,7 +564,7 @@ mod tests { let result = create_spike_file(tmp.path(), name, None); assert!(result.is_ok(), "create_spike_file failed: {result:?}"); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); let spike_id = result.unwrap(); let filename = format!("{spike_id}.md"); let contents = fs::read_to_string(backlog.join(&filename)).unwrap(); @@ -576,7 +576,7 @@ mod tests { #[test] fn create_spike_file_increments_from_existing_items() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); fs::write(backlog.join("5_story_existing.md"), "").unwrap(); diff --git a/server/src/http/workflow/mod.rs b/server/src/http/workflow/mod.rs index ca15c43..14466dd 100644 --- a/server/src/http/workflow/mod.rs +++ b/server/src/http/workflow/mod.rs @@ -121,7 +121,7 @@ fn load_stage_items( agent_map: &HashMap, ) -> Result, String> { let root = ctx.state.get_project_root()?; - let dir = root.join(".story_kit").join("work").join(stage_dir); + let dir = root.join(".storkit").join("work").join(stage_dir); if !dir.exists() { return Ok(Vec::new()); @@ -166,8 +166,8 @@ pub fn validate_story_dirs( // Directories to validate: work/2_current/ + work/1_backlog/ let dirs_to_validate: Vec = vec![ - root.join(".story_kit").join("work").join("2_current"), - root.join(".story_kit").join("work").join("1_backlog"), + root.join(".storkit").join("work").join("2_current"), + root.join(".storkit").join("work").join("1_backlog"), ]; for dir in &dirs_to_validate { @@ -230,7 +230,7 @@ pub fn validate_story_dirs( /// Searches in priority order: 2_current, 1_backlog, 3_qa, 4_merge, 5_done, 6_archived. pub(super) fn find_story_file(project_root: &Path, story_id: &str) -> Result { let filename = format!("{story_id}.md"); - let sk = project_root.join(".story_kit").join("work"); + let sk = project_root.join(".storkit").join("work"); for stage in &["2_current", "1_backlog", "3_qa", "4_merge", "5_done", "6_archived"] { let path = sk.join(stage).join(&filename); if path.exists() { @@ -370,7 +370,7 @@ pub(super) fn slugify_name(name: &str) -> String { /// Scan all `work/` subdirectories for the highest item number across all types (stories, bugs, spikes). pub(super) fn next_item_number(root: &std::path::Path) -> Result { - let work_base = root.join(".story_kit").join("work"); + let work_base = root.join(".storkit").join("work"); let mut max_num: u32 = 0; for subdir in &["1_backlog", "2_current", "3_qa", "4_merge", "5_done", "6_archived"] { @@ -413,7 +413,7 @@ mod tests { ("4_merge", "40_story_merge"), ("5_done", "50_story_done"), ] { - let dir = root.join(".story_kit").join("work").join(stage); + let dir = root.join(".storkit").join("work").join(stage); fs::create_dir_all(&dir).unwrap(); fs::write( dir.join(format!("{id}.md")), @@ -445,7 +445,7 @@ mod tests { fn load_upcoming_returns_empty_when_no_dir() { let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - // No .story_kit directory at all + // No .storkit directory at all let ctx = crate::http::context::AppContext::new_test(root); let result = load_upcoming_stories(&ctx).unwrap(); assert!(result.is_empty()); @@ -456,7 +456,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write( current.join("10_story_test.md"), @@ -482,7 +482,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write( current.join("11_story_done.md"), @@ -507,7 +507,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let root = tmp.path().to_path_buf(); - let current = root.join(".story_kit/work/2_current"); + let current = root.join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write( current.join("12_story_pending.md"), @@ -529,7 +529,7 @@ mod tests { #[test] fn load_upcoming_parses_metadata() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); fs::write( backlog.join("31_story_view_upcoming.md"), @@ -554,7 +554,7 @@ mod tests { #[test] fn load_upcoming_skips_non_md_files() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); fs::write(backlog.join(".gitkeep"), "").unwrap(); fs::write( @@ -572,8 +572,8 @@ mod tests { #[test] fn validate_story_dirs_valid_files() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let current = tmp.path().join(".storkit/work/2_current"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(¤t).unwrap(); fs::create_dir_all(&backlog).unwrap(); fs::write( @@ -596,7 +596,7 @@ mod tests { #[test] fn validate_story_dirs_missing_front_matter() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("28_story_todos.md"), "# No front matter\n").unwrap(); @@ -609,7 +609,7 @@ mod tests { #[test] fn validate_story_dirs_missing_required_fields() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("28_story_todos.md"), "---\n---\n# Story\n").unwrap(); @@ -667,7 +667,7 @@ mod tests { #[test] fn next_item_number_empty_dirs() { let tmp = tempfile::tempdir().unwrap(); - let base = tmp.path().join(".story_kit/work/1_backlog"); + let base = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&base).unwrap(); assert_eq!(next_item_number(tmp.path()).unwrap(), 1); } @@ -675,9 +675,9 @@ mod tests { #[test] fn next_item_number_scans_all_dirs() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); - let current = tmp.path().join(".story_kit/work/2_current"); - let archived = tmp.path().join(".story_kit/work/5_done"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); + let current = tmp.path().join(".storkit/work/2_current"); + let archived = tmp.path().join(".storkit/work/5_done"); fs::create_dir_all(&backlog).unwrap(); fs::create_dir_all(¤t).unwrap(); fs::create_dir_all(&archived).unwrap(); @@ -690,7 +690,7 @@ mod tests { #[test] fn next_item_number_no_work_dirs() { let tmp = tempfile::tempdir().unwrap(); - // No .story_kit at all + // No .storkit at all assert_eq!(next_item_number(tmp.path()).unwrap(), 1); } @@ -699,8 +699,8 @@ mod tests { #[test] fn find_story_file_searches_current_then_backlog() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let current = tmp.path().join(".storkit/work/2_current"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(¤t).unwrap(); fs::create_dir_all(&backlog).unwrap(); diff --git a/server/src/http/workflow/story_ops.rs b/server/src/http/workflow/story_ops.rs index 2147050..48f317b 100644 --- a/server/src/http/workflow/story_ops.rs +++ b/server/src/http/workflow/story_ops.rs @@ -24,7 +24,7 @@ pub fn create_story_file( } let filename = format!("{story_number}_story_{slug}.md"); - let backlog_dir = root.join(".story_kit").join("work").join("1_backlog"); + let backlog_dir = root.join(".storkit").join("work").join("1_backlog"); fs::create_dir_all(&backlog_dir) .map_err(|e| format!("Failed to create backlog directory: {e}"))?; @@ -269,7 +269,7 @@ mod tests { #[test] fn create_story_writes_correct_content() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); fs::write(backlog.join("36_story_existing.md"), "").unwrap(); @@ -312,7 +312,7 @@ mod tests { let result = create_story_file(tmp.path(), name, None, None, false); assert!(result.is_ok(), "create_story_file failed: {result:?}"); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); let story_id = result.unwrap(); let filename = format!("{story_id}.md"); let contents = fs::read_to_string(backlog.join(&filename)).unwrap(); @@ -324,7 +324,7 @@ mod tests { #[test] fn create_story_rejects_duplicate() { let tmp = tempfile::tempdir().unwrap(); - let backlog = tmp.path().join(".story_kit/work/1_backlog"); + let backlog = tmp.path().join(".storkit/work/1_backlog"); fs::create_dir_all(&backlog).unwrap(); let filepath = backlog.join("1_story_my_feature.md"); @@ -340,7 +340,7 @@ mod tests { fn check_criterion_marks_first_unchecked() { let tmp = tempfile::tempdir().unwrap(); setup_git_repo(tmp.path()); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("1_test.md"); fs::write(&filepath, story_with_criteria(3)).unwrap(); @@ -367,7 +367,7 @@ mod tests { fn check_criterion_marks_second_unchecked() { let tmp = tempfile::tempdir().unwrap(); setup_git_repo(tmp.path()); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("2_test.md"); fs::write(&filepath, story_with_criteria(3)).unwrap(); @@ -394,7 +394,7 @@ mod tests { fn check_criterion_out_of_range_returns_error() { let tmp = tempfile::tempdir().unwrap(); setup_git_repo(tmp.path()); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("3_test.md"); fs::write(&filepath, story_with_criteria(2)).unwrap(); @@ -428,7 +428,7 @@ mod tests { #[test] fn add_criterion_appends_after_last_criterion() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("10_test.md"); fs::write(&filepath, story_with_ac_section(&["First", "Second"])).unwrap(); @@ -448,7 +448,7 @@ mod tests { #[test] fn add_criterion_to_empty_section() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("11_test.md"); let content = "---\nname: Test\n---\n\n## Acceptance Criteria\n\n## Out of Scope\n\n- N/A\n"; @@ -463,7 +463,7 @@ mod tests { #[test] fn add_criterion_missing_section_returns_error() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("12_test.md"); fs::write(&filepath, "---\nname: Test\n---\n\nNo AC section here.\n").unwrap(); @@ -478,7 +478,7 @@ mod tests { #[test] fn update_story_replaces_user_story_section() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("20_test.md"); let content = "---\nname: T\n---\n\n## User Story\n\nOld text\n\n## Acceptance Criteria\n\n- [ ] AC\n"; @@ -495,7 +495,7 @@ mod tests { #[test] fn update_story_replaces_description_section() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("21_test.md"); let content = "---\nname: T\n---\n\n## Description\n\nOld description\n\n## Acceptance Criteria\n\n- [ ] AC\n"; @@ -511,7 +511,7 @@ mod tests { #[test] fn update_story_no_args_returns_error() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("22_test.md"), "---\nname: T\n---\n").unwrap(); @@ -523,7 +523,7 @@ mod tests { #[test] fn update_story_missing_section_returns_error() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write( current.join("23_test.md"), @@ -539,7 +539,7 @@ mod tests { #[test] fn update_story_sets_agent_front_matter_field() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("24_test.md"); fs::write(&filepath, "---\nname: T\n---\n\n## User Story\n\nSome story\n").unwrap(); @@ -556,7 +556,7 @@ mod tests { #[test] fn update_story_sets_arbitrary_front_matter_fields() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let filepath = current.join("25_test.md"); fs::write(&filepath, "---\nname: T\n---\n\n## User Story\n\nSome story\n").unwrap(); @@ -575,7 +575,7 @@ mod tests { #[test] fn update_story_front_matter_only_no_section_required() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); // File without a User Story section — front matter update should succeed let filepath = current.join("26_test.md"); diff --git a/server/src/http/workflow/test_results.rs b/server/src/http/workflow/test_results.rs index ad670fb..61b77f5 100644 --- a/server/src/http/workflow/test_results.rs +++ b/server/src/http/workflow/test_results.rs @@ -144,7 +144,7 @@ mod tests { #[test] fn write_and_read_test_results_roundtrip() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("1_story_test.md"), "---\nname: Test\n---\n# Story\n").unwrap(); @@ -163,7 +163,7 @@ mod tests { #[test] fn write_test_results_creates_readable_section() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let story_path = current.join("2_story_check.md"); fs::write(&story_path, "---\nname: Check\n---\n# Story\n\n## Acceptance Criteria\n\n- [ ] AC1\n").unwrap(); @@ -184,7 +184,7 @@ mod tests { #[test] fn write_test_results_overwrites_existing_section() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); let story_path = current.join("3_story_overwrite.md"); fs::write( @@ -206,7 +206,7 @@ mod tests { #[test] fn read_test_results_returns_none_when_no_section() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("4_story_empty.md"), "---\nname: Empty\n---\n# Story\n").unwrap(); @@ -224,7 +224,7 @@ mod tests { #[test] fn write_test_results_finds_story_in_any_stage() { let tmp = tempfile::tempdir().unwrap(); - let qa_dir = tmp.path().join(".story_kit/work/3_qa"); + let qa_dir = tmp.path().join(".storkit/work/3_qa"); fs::create_dir_all(&qa_dir).unwrap(); fs::write(qa_dir.join("5_story_qa.md"), "---\nname: QA Story\n---\n# Story\n").unwrap(); @@ -241,7 +241,7 @@ mod tests { #[test] fn write_coverage_baseline_to_story_file_updates_front_matter() { let tmp = tempfile::tempdir().unwrap(); - let current = tmp.path().join(".story_kit/work/2_current"); + let current = tmp.path().join(".storkit/work/2_current"); fs::create_dir_all(¤t).unwrap(); fs::write(current.join("6_story_cov.md"), "---\nname: Cov Story\n---\n# Story\n").unwrap(); diff --git a/server/src/http/ws.rs b/server/src/http/ws.rs index 79a75fb..32794f4 100644 --- a/server/src/http/ws.rs +++ b/server/src/http/ws.rs @@ -53,8 +53,8 @@ enum WsRequest { /// - `token` streams partial model output. /// - `update` pushes the updated message history. /// - `error` reports a request or processing failure. -/// - `work_item_changed` notifies that a `.story_kit/work/` file changed. -/// - `agent_config_changed` notifies that `.story_kit/project.toml` was modified. +/// - `work_item_changed` notifies that a `.storkit/work/` file changed. +/// - `agent_config_changed` notifies that `.storkit/project.toml` was modified. enum WsResponse { Token { content: String, @@ -86,7 +86,7 @@ enum WsResponse { merge: Vec, done: Vec, }, - /// `.story_kit/project.toml` was modified; the frontend should re-fetch the + /// `.storkit/project.toml` was modified; the frontend should re-fetch the /// agent roster. Does NOT trigger a pipeline state refresh. AgentConfigChanged, /// An agent's state changed (started, stopped, completed, etc.). @@ -1111,7 +1111,7 @@ mod tests { // Create minimal pipeline dirs so load_pipeline_state succeeds. for stage in &["1_backlog", "2_current", "3_qa", "4_merge"] { - std::fs::create_dir_all(root.join(".story_kit").join("work").join(stage)).unwrap(); + std::fs::create_dir_all(root.join(".storkit").join("work").join(stage)).unwrap(); } let ctx = Arc::new(AppContext::new_test(root)); diff --git a/server/src/io/fs.rs b/server/src/io/fs.rs index 945e1ab..a2e64c9 100644 --- a/server/src/io/fs.rs +++ b/server/src/io/fs.rs @@ -9,7 +9,7 @@ const KEY_LAST_PROJECT: &str = "last_project_path"; const KEY_SELECTED_MODEL: &str = "selected_model"; const KEY_KNOWN_PROJECTS: &str = "known_projects"; -const STORY_KIT_README: &str = include_str!("../../../.story_kit/README.md"); +const STORY_KIT_README: &str = include_str!("../../../.storkit/README.md"); const STORY_KIT_CONTEXT: &str = "\n\ # Project Context\n\ @@ -57,7 +57,7 @@ The permission system validates the entire command string, and chained commands won't match allow rules like `Bash(git *)`. Use separate Bash calls instead — \ parallel calls work fine.\n\ \n\ -Read .story_kit/README.md to see our dev process.\n"; +Read .storkit/README.md to see our dev process.\n"; const STORY_KIT_CLAUDE_SETTINGS: &str = r#"{ "permissions": { @@ -110,7 +110,7 @@ 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. Follow the workflow through implementation and verification. 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.\n\nIMPORTANT: Commit all your work before your process exits. The server will automatically run acceptance gates when your process exits." +prompt = "You are working in a git worktree on story {{story_id}}. Read CLAUDE.md first, then .storkit/README.md to understand the dev process. Follow the workflow through implementation and verification. 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.\n\nIMPORTANT: Commit all your work before your process exits. The server will automatically run acceptance gates when your process exits." system_prompt = "You are a full-stack engineer working autonomously in a git worktree. Follow the Story-Driven Test Workflow strictly. Commit all your work before finishing. Do not accept stories, move them to archived, or merge to master." [[agent]] @@ -238,11 +238,11 @@ pub fn resolve_cli_path(cwd: &Path, path_arg: &str) -> PathBuf { } /// Walk from `start` up through parent directories, returning the first -/// directory that contains a `.story_kit/` subdirectory, or `None`. +/// directory that contains a `.storkit/` subdirectory, or `None`. pub fn find_story_kit_root(start: &Path) -> Option { let mut current = start.to_path_buf(); loop { - if current.join(".story_kit").is_dir() { + if current.join(".storkit").is_dir() { return Some(current); } if !current.pop() { @@ -316,12 +316,12 @@ fn write_script_if_missing(path: &Path, content: &str) -> Result<(), String> { Ok(()) } -/// Write (or idempotently update) `.story_kit/.gitignore` with Story Kit–specific -/// ignore patterns for files that live inside the `.story_kit/` directory. -/// Patterns are relative to `.story_kit/` as git resolves `.gitignore` files +/// Write (or idempotently update) `.storkit/.gitignore` with Story Kit–specific +/// ignore patterns for files that live inside the `.storkit/` directory. +/// Patterns are relative to `.storkit/` as git resolves `.gitignore` files /// relative to the directory that contains them. fn write_story_kit_gitignore(root: &Path) -> Result<(), String> { - // Entries that belong inside .story_kit/.gitignore (relative to .story_kit/). + // Entries that belong inside .storkit/.gitignore (relative to .storkit/). let entries = [ "bot.toml", "matrix_store/", @@ -331,10 +331,10 @@ fn write_story_kit_gitignore(root: &Path) -> Result<(), String> { "coverage/", ]; - let gitignore_path = root.join(".story_kit").join(".gitignore"); + let gitignore_path = root.join(".storkit").join(".gitignore"); let existing = if gitignore_path.exists() { fs::read_to_string(&gitignore_path) - .map_err(|e| format!("Failed to read .story_kit/.gitignore: {}", e))? + .map_err(|e| format!("Failed to read .storkit/.gitignore: {}", e))? } else { String::new() }; @@ -359,17 +359,17 @@ fn write_story_kit_gitignore(root: &Path) -> Result<(), String> { } fs::write(&gitignore_path, new_content) - .map_err(|e| format!("Failed to write .story_kit/.gitignore: {}", e))?; + .map_err(|e| format!("Failed to write .storkit/.gitignore: {}", e))?; Ok(()) } /// Append root-level Story Kit entries to the project `.gitignore`. -/// Only `store.json` and `.story_kit_port` remain here because they live at +/// Only `store.json` and `.storkit_port` remain here because they live at /// the project root and git does not support `../` patterns in `.gitignore` -/// files, so they cannot be expressed in `.story_kit/.gitignore`. +/// files, so they cannot be expressed in `.storkit/.gitignore`. fn append_root_gitignore_entries(root: &Path) -> Result<(), String> { - let entries = [".story_kit_port", "store.json"]; + let entries = [".storkit_port", "store.json"]; let gitignore_path = root.join(".gitignore"); let existing = if gitignore_path.exists() { @@ -405,7 +405,7 @@ fn append_root_gitignore_entries(root: &Path) -> Result<(), String> { } fn scaffold_story_kit(root: &Path) -> Result<(), String> { - let story_kit_root = root.join(".story_kit"); + let story_kit_root = root.join(".storkit"); let specs_root = story_kit_root.join("specs"); let tech_root = specs_root.join("tech"); let functional_root = specs_root.join("functional"); @@ -464,7 +464,7 @@ fn scaffold_story_kit(root: &Path) -> Result<(), String> { } let add_output = std::process::Command::new("git") - .args(["add", ".story_kit", "script", ".gitignore", "CLAUDE.md", ".claude"]) + .args(["add", ".storkit", "script", ".gitignore", "CLAUDE.md", ".claude"]) .current_dir(root) .output() .map_err(|e| format!("Failed to run git add: {}", e))?; @@ -505,7 +505,7 @@ async fn ensure_project_root_with_story_kit(path: PathBuf) -> Result<(), String> fs::create_dir_all(&path) .map_err(|e| format!("Failed to create project directory: {}", e))?; } - if !path.join(".story_kit").is_dir() { + if !path.join(".storkit").is_dir() { scaffold_story_kit(&path)?; } Ok(()) @@ -1032,7 +1032,7 @@ mod tests { #[test] fn find_story_kit_root_returns_cwd_when_story_kit_in_cwd() { let tmp = tempfile::tempdir().unwrap(); - std::fs::create_dir_all(tmp.path().join(".story_kit")).unwrap(); + std::fs::create_dir_all(tmp.path().join(".storkit")).unwrap(); let result = find_story_kit_root(tmp.path()); assert_eq!(result, Some(tmp.path().to_path_buf())); @@ -1041,7 +1041,7 @@ mod tests { #[test] fn find_story_kit_root_returns_parent_when_story_kit_in_parent() { let tmp = tempfile::tempdir().unwrap(); - std::fs::create_dir_all(tmp.path().join(".story_kit")).unwrap(); + std::fs::create_dir_all(tmp.path().join(".storkit")).unwrap(); let child = tmp.path().join("subdir").join("nested"); std::fs::create_dir_all(&child).unwrap(); @@ -1060,9 +1060,9 @@ mod tests { #[test] fn find_story_kit_root_prefers_nearest_ancestor() { let tmp = tempfile::tempdir().unwrap(); - std::fs::create_dir_all(tmp.path().join(".story_kit")).unwrap(); + std::fs::create_dir_all(tmp.path().join(".storkit")).unwrap(); let child = tmp.path().join("inner"); - std::fs::create_dir_all(child.join(".story_kit")).unwrap(); + std::fs::create_dir_all(child.join(".storkit")).unwrap(); let result = find_story_kit_root(&child); assert_eq!(result, Some(child)); @@ -1075,12 +1075,12 @@ mod tests { let dir = tempdir().unwrap(); scaffold_story_kit(dir.path()).unwrap(); - assert!(dir.path().join(".story_kit/README.md").exists()); - assert!(dir.path().join(".story_kit/project.toml").exists()); - assert!(dir.path().join(".story_kit/specs/00_CONTEXT.md").exists()); - assert!(dir.path().join(".story_kit/specs/tech/STACK.md").exists()); + assert!(dir.path().join(".storkit/README.md").exists()); + assert!(dir.path().join(".storkit/project.toml").exists()); + assert!(dir.path().join(".storkit/specs/00_CONTEXT.md").exists()); + assert!(dir.path().join(".storkit/specs/tech/STACK.md").exists()); // Old stories/ dirs should NOT be created - assert!(!dir.path().join(".story_kit/stories").exists()); + assert!(!dir.path().join(".storkit/stories").exists()); assert!(dir.path().join("script/test").exists()); } @@ -1091,7 +1091,7 @@ mod tests { let stages = ["1_backlog", "2_current", "3_qa", "4_merge", "5_done", "6_archived"]; for stage in &stages { - let path = dir.path().join(".story_kit/work").join(stage); + let path = dir.path().join(".storkit/work").join(stage); assert!(path.is_dir(), "work/{} should be a directory", stage); assert!( path.join(".gitkeep").exists(), @@ -1107,7 +1107,7 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let content = - fs::read_to_string(dir.path().join(".story_kit/project.toml")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/project.toml")).unwrap(); assert!(content.contains("[[agent]]")); assert!(content.contains("stage = \"coder\"")); assert!(content.contains("stage = \"qa\"")); @@ -1121,7 +1121,7 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let content = - fs::read_to_string(dir.path().join(".story_kit/specs/00_CONTEXT.md")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/specs/00_CONTEXT.md")).unwrap(); assert!(content.contains("")); assert!(content.contains("## High-Level Goal")); assert!(content.contains("## Core Features")); @@ -1138,7 +1138,7 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let content = - fs::read_to_string(dir.path().join(".story_kit/specs/tech/STACK.md")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/specs/tech/STACK.md")).unwrap(); assert!(content.contains("")); assert!(content.contains("## Core Stack")); assert!(content.contains("## Coding Standards")); @@ -1169,7 +1169,7 @@ mod tests { #[test] fn scaffold_story_kit_does_not_overwrite_existing() { let dir = tempdir().unwrap(); - let readme = dir.path().join(".story_kit/README.md"); + let readme = dir.path().join(".storkit/README.md"); fs::create_dir_all(readme.parent().unwrap()).unwrap(); fs::write(&readme, "custom content").unwrap(); @@ -1184,24 +1184,24 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let readme_content = - fs::read_to_string(dir.path().join(".story_kit/README.md")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/README.md")).unwrap(); let toml_content = - fs::read_to_string(dir.path().join(".story_kit/project.toml")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/project.toml")).unwrap(); // Run again — must not change content or add duplicate .gitignore entries scaffold_story_kit(dir.path()).unwrap(); assert_eq!( - fs::read_to_string(dir.path().join(".story_kit/README.md")).unwrap(), + fs::read_to_string(dir.path().join(".storkit/README.md")).unwrap(), readme_content ); assert_eq!( - fs::read_to_string(dir.path().join(".story_kit/project.toml")).unwrap(), + fs::read_to_string(dir.path().join(".storkit/project.toml")).unwrap(), toml_content ); let story_kit_gitignore = - fs::read_to_string(dir.path().join(".story_kit/.gitignore")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/.gitignore")).unwrap(); let count = story_kit_gitignore .lines() .filter(|l| l.trim() == "worktrees/") @@ -1209,7 +1209,7 @@ mod tests { assert_eq!( count, 1, - ".story_kit/.gitignore should not have duplicate entries" + ".storkit/.gitignore should not have duplicate entries" ); } @@ -1260,32 +1260,32 @@ mod tests { let dir = tempdir().unwrap(); scaffold_story_kit(dir.path()).unwrap(); - // .story_kit/.gitignore must contain relative patterns for files under .story_kit/ + // .storkit/.gitignore must contain relative patterns for files under .storkit/ let sk_content = - fs::read_to_string(dir.path().join(".story_kit/.gitignore")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/.gitignore")).unwrap(); assert!(sk_content.contains("worktrees/")); assert!(sk_content.contains("merge_workspace/")); assert!(sk_content.contains("coverage/")); - // Must NOT contain absolute .story_kit/ prefixed paths - assert!(!sk_content.contains(".story_kit/")); + // Must NOT contain absolute .storkit/ prefixed paths + assert!(!sk_content.contains(".storkit/")); // Root .gitignore must contain root-level story-kit entries let root_content = fs::read_to_string(dir.path().join(".gitignore")).unwrap(); - assert!(root_content.contains(".story_kit_port")); + assert!(root_content.contains(".storkit_port")); assert!(root_content.contains("store.json")); - // Root .gitignore must NOT contain .story_kit/ sub-directory patterns - assert!(!root_content.contains(".story_kit/worktrees/")); - assert!(!root_content.contains(".story_kit/merge_workspace/")); - assert!(!root_content.contains(".story_kit/coverage/")); + // Root .gitignore must NOT contain .storkit/ sub-directory patterns + assert!(!root_content.contains(".storkit/worktrees/")); + assert!(!root_content.contains(".storkit/merge_workspace/")); + assert!(!root_content.contains(".storkit/coverage/")); } #[test] fn scaffold_story_kit_gitignore_does_not_duplicate_existing_entries() { let dir = tempdir().unwrap(); - // Pre-create .story_kit dir and .gitignore with some entries already present - fs::create_dir_all(dir.path().join(".story_kit")).unwrap(); + // Pre-create .storkit dir and .gitignore with some entries already present + fs::create_dir_all(dir.path().join(".storkit")).unwrap(); fs::write( - dir.path().join(".story_kit/.gitignore"), + dir.path().join(".storkit/.gitignore"), "worktrees/\ncoverage/\n", ) .unwrap(); @@ -1293,7 +1293,7 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let content = - fs::read_to_string(dir.path().join(".story_kit/.gitignore")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/.gitignore")).unwrap(); let worktrees_count = content .lines() .filter(|l| l.trim() == "worktrees/") @@ -1324,8 +1324,8 @@ mod tests { "CLAUDE.md should contain the scaffold sentinel" ); assert!( - content.contains("Read .story_kit/README.md"), - "CLAUDE.md should include directive to read .story_kit/README.md" + content.contains("Read .storkit/README.md"), + "CLAUDE.md should include directive to read .storkit/README.md" ); assert!( content.contains("Never chain shell commands"), @@ -1366,15 +1366,15 @@ mod tests { .await .unwrap(); - // .story_kit/ should have been created automatically - assert!(project_dir.join(".story_kit").is_dir()); + // .storkit/ should have been created automatically + assert!(project_dir.join(".storkit").is_dir()); } #[tokio::test] async fn open_project_does_not_overwrite_existing_story_kit() { let dir = tempdir().unwrap(); let project_dir = dir.path().join("myproject"); - let sk_dir = project_dir.join(".story_kit"); + let sk_dir = project_dir.join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); let readme = sk_dir.join("README.md"); fs::write(&readme, "custom content").unwrap(); @@ -1389,7 +1389,7 @@ mod tests { .await .unwrap(); - // Existing .story_kit/ content should not be overwritten + // Existing .storkit/ content should not be overwritten assert_eq!(fs::read_to_string(&readme).unwrap(), "custom content"); } @@ -1570,7 +1570,7 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let content = - fs::read_to_string(dir.path().join(".story_kit/project.toml")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/project.toml")).unwrap(); assert!( content.contains("[[component]]"), "project.toml should contain a component entry" @@ -1591,7 +1591,7 @@ mod tests { scaffold_story_kit(dir.path()).unwrap(); let content = - fs::read_to_string(dir.path().join(".story_kit/project.toml")).unwrap(); + fs::read_to_string(dir.path().join(".storkit/project.toml")).unwrap(); assert!( content.contains("[[component]]"), "project.toml should always have at least one component" @@ -1606,7 +1606,7 @@ mod tests { #[test] fn scaffold_does_not_overwrite_existing_project_toml_with_components() { let dir = tempdir().unwrap(); - let sk_dir = dir.path().join(".story_kit"); + let sk_dir = dir.path().join(".storkit"); fs::create_dir_all(&sk_dir).unwrap(); let existing = "[[component]]\nname = \"custom\"\npath = \".\"\nsetup = [\"make build\"]\n"; fs::write(sk_dir.join("project.toml"), existing).unwrap(); diff --git a/server/src/io/onboarding.rs b/server/src/io/onboarding.rs index 871933a..bf30df9 100644 --- a/server/src/io/onboarding.rs +++ b/server/src/io/onboarding.rs @@ -18,7 +18,7 @@ pub struct OnboardingStatus { pub needs_stack: bool, /// True when `script/test` still contains the scaffold placeholder. pub needs_test_script: bool, - /// True when `.story_kit/project.toml` is missing or has no + /// True when `.storkit/project.toml` is missing or has no /// `[[component]]` entries. pub needs_project_toml: bool, } @@ -33,7 +33,7 @@ impl OnboardingStatus { /// Inspect the project at `project_root` and determine which onboarding /// steps are still required. pub fn check_onboarding_status(project_root: &Path) -> OnboardingStatus { - let story_kit = project_root.join(".story_kit"); + let story_kit = project_root.join(".storkit"); OnboardingStatus { needs_context: is_template_or_missing( @@ -79,7 +79,7 @@ mod tests { fn setup_project(dir: &TempDir) -> std::path::PathBuf { let root = dir.path().to_path_buf(); - let sk = root.join(".story_kit"); + let sk = root.join(".storkit"); fs::create_dir_all(sk.join("specs").join("tech")).unwrap(); fs::create_dir_all(root.join("script")).unwrap(); root @@ -106,12 +106,12 @@ mod tests { // Write content that includes the scaffold sentinel fs::write( - root.join(".story_kit/specs/00_CONTEXT.md"), + root.join(".storkit/specs/00_CONTEXT.md"), "\n# Project Context\nPlaceholder...", ) .unwrap(); fs::write( - root.join(".story_kit/specs/tech/STACK.md"), + root.join(".storkit/specs/tech/STACK.md"), "\n# Tech Stack\nPlaceholder...", ) .unwrap(); @@ -130,12 +130,12 @@ mod tests { // Real project content that happens to mention "Agentic AI Code Assistant" // but does NOT contain the scaffold sentinel — should NOT trigger onboarding. fs::write( - root.join(".story_kit/specs/00_CONTEXT.md"), + root.join(".storkit/specs/00_CONTEXT.md"), "# Project Context\nTo build a standalone Agentic AI Code Assistant application.", ) .unwrap(); fs::write( - root.join(".story_kit/specs/tech/STACK.md"), + root.join(".storkit/specs/tech/STACK.md"), "# Tech Stack\nThis is an Agentic Code Assistant binary.", ) .unwrap(); @@ -152,12 +152,12 @@ mod tests { let root = setup_project(&dir); fs::write( - root.join(".story_kit/specs/00_CONTEXT.md"), + root.join(".storkit/specs/00_CONTEXT.md"), "# My Project\n\nThis is an e-commerce platform for selling widgets.", ) .unwrap(); fs::write( - root.join(".story_kit/specs/tech/STACK.md"), + root.join(".storkit/specs/tech/STACK.md"), "# Tech Stack\n\n## Backend: Python + FastAPI\n## Frontend: React + TypeScript", ) .unwrap(); @@ -173,8 +173,8 @@ mod tests { let dir = TempDir::new().unwrap(); let root = setup_project(&dir); - fs::write(root.join(".story_kit/specs/00_CONTEXT.md"), " \n").unwrap(); - fs::write(root.join(".story_kit/specs/tech/STACK.md"), "").unwrap(); + fs::write(root.join(".storkit/specs/00_CONTEXT.md"), " \n").unwrap(); + fs::write(root.join(".storkit/specs/tech/STACK.md"), "").unwrap(); let status = check_onboarding_status(&root); assert!(status.needs_context); @@ -230,7 +230,7 @@ mod tests { let root = setup_project(&dir); fs::write( - root.join(".story_kit/project.toml"), + root.join(".storkit/project.toml"), "# empty config\n", ) .unwrap(); @@ -245,7 +245,7 @@ mod tests { let root = setup_project(&dir); fs::write( - root.join(".story_kit/project.toml"), + root.join(".storkit/project.toml"), "[[component]]\nname = \"app\"\npath = \".\"\nsetup = [\"cargo check\"]\n", ) .unwrap(); @@ -263,12 +263,12 @@ mod tests { // Write real content for the required onboarding files fs::write( - root.join(".story_kit/specs/00_CONTEXT.md"), + root.join(".storkit/specs/00_CONTEXT.md"), "# My Project\n\nReal project context.", ) .unwrap(); fs::write( - root.join(".story_kit/specs/tech/STACK.md"), + root.join(".storkit/specs/tech/STACK.md"), "# My Stack\n\nReal stack content.", ) .unwrap(); @@ -300,13 +300,13 @@ mod tests { // Context still has sentinel fs::write( - root.join(".story_kit/specs/00_CONTEXT.md"), + root.join(".storkit/specs/00_CONTEXT.md"), "\n# Project Context\nPlaceholder...", ) .unwrap(); // Stack is customised (no sentinel) fs::write( - root.join(".story_kit/specs/tech/STACK.md"), + root.join(".storkit/specs/tech/STACK.md"), "# My Stack\nRuby on Rails + PostgreSQL", ) .unwrap(); diff --git a/server/src/io/watcher.rs b/server/src/io/watcher.rs index 9ef3608..4977cee 100644 --- a/server/src/io/watcher.rs +++ b/server/src/io/watcher.rs @@ -1,10 +1,10 @@ -//! Filesystem watcher for `.story_kit/work/` and `.story_kit/project.toml`. +//! Filesystem watcher for `.storkit/work/` and `.storkit/project.toml`. //! //! Watches the work pipeline directories for file changes, infers the lifecycle //! stage from the target directory name, auto-commits with a deterministic message, //! and broadcasts a [`WatcherEvent`] to all connected WebSocket clients. //! -//! Also watches `.story_kit/project.toml` for modifications and broadcasts +//! Also watches `.storkit/project.toml` for modifications and broadcasts //! [`WatcherEvent::ConfigChanged`] so the frontend can reload the agent roster //! without a server restart. //! @@ -45,7 +45,7 @@ pub enum WatcherEvent { /// The deterministic git commit message used (or that would have been used). commit_msg: String, }, - /// `.story_kit/project.toml` was modified at the project root (not inside a worktree). + /// `.storkit/project.toml` was modified at the project root (not inside a worktree). ConfigChanged, /// An agent's state changed (started, stopped, completed, etc.). /// Triggers a pipeline state refresh so the frontend can update agent @@ -61,8 +61,8 @@ pub enum WatcherEvent { }, } -/// Return `true` if `path` is the root-level `.story_kit/project.toml`, i.e. -/// `{git_root}/.story_kit/project.toml`. +/// Return `true` if `path` is the root-level `.storkit/project.toml`, i.e. +/// `{git_root}/.storkit/project.toml`. /// /// Returns `false` for paths inside worktree directories (paths containing /// a `worktrees` component). @@ -71,7 +71,7 @@ pub fn is_config_file(path: &Path, git_root: &Path) -> bool { if path.components().any(|c| c.as_os_str() == "worktrees") { return false; } - let expected = git_root.join(".story_kit").join("project.toml"); + let expected = git_root.join(".storkit").join("project.toml"); path == expected } @@ -92,7 +92,7 @@ fn stage_metadata(stage: &str, item_id: &str) -> Option<(&'static str, String)> /// Return the pipeline stage name for a path if it is a `.md` file living /// directly inside one of the known work subdirectories, otherwise `None`. /// -/// Explicitly returns `None` for any path under `.story_kit/worktrees/` so +/// Explicitly returns `None` for any path under `.storkit/worktrees/` so /// that code changes made by agents in their isolated worktrees are never /// auto-committed to master by the watcher. fn stage_for_path(path: &Path) -> Option { @@ -117,11 +117,11 @@ fn stage_for_path(path: &Path) -> Option { /// Stage all changes in the work directory and commit with the given message. /// -/// Uses `git add -A .story_kit/work/` to catch both additions and deletions in +/// Uses `git add -A .storkit/work/` to catch both additions and deletions in /// a single commit. Returns `Ok(true)` if a commit was made, `Ok(false)` if /// there was nothing to commit, and `Err` for unexpected failures. fn git_add_work_and_commit(git_root: &Path, message: &str) -> Result { - let work_rel = PathBuf::from(".story_kit").join("work"); + let work_rel = PathBuf::from(".storkit").join("work"); let add_out = std::process::Command::new("git") .args(["add", "-A"]) @@ -170,7 +170,7 @@ fn should_commit_stage(stage: &str) -> bool { /// /// Only files that still exist on disk are used to derive the commit message /// (they represent the destination of a move or a new file). Deletions are -/// captured by `git add -A .story_kit/work/` automatically. +/// captured by `git add -A .storkit/work/` automatically. /// /// Only terminal stages (`1_backlog` and `6_archived`) trigger git commits. /// All stages broadcast a [`WatcherEvent`] so the frontend stays in sync. @@ -338,9 +338,9 @@ fn sweep_done_to_archived(work_dir: &Path, git_root: &Path, done_retention: Dura /// Start the filesystem watcher on a dedicated OS thread. /// -/// `work_dir` — absolute path to `.story_kit/work/` (watched recursively). +/// `work_dir` — absolute path to `.storkit/work/` (watched recursively). /// `git_root` — project root (passed to `git` commands as cwd, and used to -/// derive the config file path `.story_kit/project.toml`). +/// derive the config file path `.storkit/project.toml`). /// `event_tx` — broadcast sender; each connected WebSocket client holds a receiver. /// `watcher_config` — initial sweep configuration loaded from `project.toml`. pub fn start_watcher( @@ -367,8 +367,8 @@ pub fn start_watcher( return; } - // Also watch .story_kit/project.toml for hot-reload of agent config. - let config_file = git_root.join(".story_kit").join("project.toml"); + // Also watch .storkit/project.toml for hot-reload of agent config. + let config_file = git_root.join(".storkit").join("project.toml"); if config_file.exists() && let Err(e) = watcher.watch(&config_file, RecursiveMode::NonRecursive) { @@ -521,9 +521,9 @@ mod tests { .expect("git initial commit"); } - /// Create the `.story_kit/work/{stage}/` dir tree inside `root`. + /// Create the `.storkit/work/{stage}/` dir tree inside `root`. fn make_stage_dir(root: &std::path::Path, stage: &str) -> PathBuf { - let dir = root.join(".story_kit").join("work").join(stage); + let dir = root.join(".storkit").join("work").join(stage); fs::create_dir_all(&dir).expect("create stage dir"); dir } @@ -702,7 +702,7 @@ mod tests { make_stage_dir(tmp.path(), "2_current"); let deleted_path = tmp .path() - .join(".story_kit") + .join(".storkit") .join("work") .join("2_current") .join("42_story_foo.md"); @@ -731,7 +731,7 @@ mod tests { let tmp = TempDir::new().unwrap(); init_git_repo(tmp.path()); // File sits in an unrecognised directory. - let unknown_dir = tmp.path().join(".story_kit").join("work").join("9_unknown"); + let unknown_dir = tmp.path().join(".storkit").join("work").join("9_unknown"); fs::create_dir_all(&unknown_dir).unwrap(); let path = unknown_dir.join("42_story_foo.md"); fs::write(&path, "---\nname: test\n---\n").unwrap(); @@ -889,7 +889,7 @@ mod tests { #[test] fn stage_for_path_recognises_pipeline_dirs() { - let base = PathBuf::from("/proj/.story_kit/work"); + let base = PathBuf::from("/proj/.storkit/work"); assert_eq!( stage_for_path(&base.join("2_current/42_story_foo.md")), Some("2_current".to_string()) @@ -911,7 +911,7 @@ mod tests { #[test] fn stage_for_path_ignores_worktree_paths() { - let worktrees = PathBuf::from("/proj/.story_kit/worktrees"); + let worktrees = PathBuf::from("/proj/.storkit/worktrees"); // Code changes inside a worktree must be ignored. assert_eq!( @@ -922,14 +922,14 @@ mod tests { // Even if a worktree happens to contain a path component that looks // like a pipeline stage, it must still be ignored. assert_eq!( - stage_for_path(&worktrees.join("42_story_foo/.story_kit/work/2_current/42_story_foo.md")), + stage_for_path(&worktrees.join("42_story_foo/.storkit/work/2_current/42_story_foo.md")), None, ); // A path that only contains the word "worktrees" as part of a longer // segment (not an exact component) must NOT be filtered out. assert_eq!( - stage_for_path(&PathBuf::from("/proj/.story_kit/work/2_current/not_worktrees_story.md")), + stage_for_path(&PathBuf::from("/proj/.storkit/work/2_current/not_worktrees_story.md")), Some("2_current".to_string()), ); } @@ -968,7 +968,7 @@ mod tests { #[test] fn is_config_file_identifies_root_project_toml() { let git_root = PathBuf::from("/proj"); - let config = git_root.join(".story_kit").join("project.toml"); + let config = git_root.join(".storkit").join("project.toml"); assert!(is_config_file(&config, &git_root)); } @@ -977,7 +977,7 @@ mod tests { let git_root = PathBuf::from("/proj"); // project.toml inside a worktree must NOT be treated as the root config. let worktree_config = PathBuf::from( - "/proj/.story_kit/worktrees/42_story_foo/.story_kit/project.toml", + "/proj/.storkit/worktrees/42_story_foo/.storkit/project.toml", ); assert!(!is_config_file(&worktree_config, &git_root)); } @@ -987,11 +987,11 @@ mod tests { let git_root = PathBuf::from("/proj"); // Random files must not match. assert!(!is_config_file( - &PathBuf::from("/proj/.story_kit/work/2_current/42_story_foo.md"), + &PathBuf::from("/proj/.storkit/work/2_current/42_story_foo.md"), &git_root )); assert!(!is_config_file( - &PathBuf::from("/proj/.story_kit/README.md"), + &PathBuf::from("/proj/.storkit/README.md"), &git_root )); } @@ -999,7 +999,7 @@ mod tests { #[test] fn is_config_file_rejects_wrong_root() { let git_root = PathBuf::from("/proj"); - let other_root_config = PathBuf::from("/other/.story_kit/project.toml"); + let other_root_config = PathBuf::from("/other/.storkit/project.toml"); assert!(!is_config_file(&other_root_config, &git_root)); } @@ -1008,7 +1008,7 @@ mod tests { #[test] fn sweep_moves_old_items_to_archived() { let tmp = TempDir::new().unwrap(); - let work_dir = tmp.path().join(".story_kit").join("work"); + let work_dir = tmp.path().join(".storkit").join("work"); let done_dir = work_dir.join("5_done"); let archived_dir = work_dir.join("6_archived"); fs::create_dir_all(&done_dir).unwrap(); @@ -1036,7 +1036,7 @@ mod tests { #[test] fn sweep_keeps_recent_items_in_done() { let tmp = TempDir::new().unwrap(); - let work_dir = tmp.path().join(".story_kit").join("work"); + let work_dir = tmp.path().join(".storkit").join("work"); let done_dir = work_dir.join("5_done"); fs::create_dir_all(&done_dir).unwrap(); @@ -1053,7 +1053,7 @@ mod tests { #[test] fn sweep_respects_custom_retention() { let tmp = TempDir::new().unwrap(); - let work_dir = tmp.path().join(".story_kit").join("work"); + let work_dir = tmp.path().join(".storkit").join("work"); let done_dir = work_dir.join("5_done"); let archived_dir = work_dir.join("6_archived"); fs::create_dir_all(&done_dir).unwrap(); @@ -1083,7 +1083,7 @@ mod tests { #[test] fn sweep_custom_retention_keeps_younger_items() { let tmp = TempDir::new().unwrap(); - let work_dir = tmp.path().join(".story_kit").join("work"); + let work_dir = tmp.path().join(".storkit").join("work"); let done_dir = work_dir.join("5_done"); fs::create_dir_all(&done_dir).unwrap(); @@ -1128,7 +1128,7 @@ mod tests { let git_root = tmp.path().to_path_buf(); init_git_repo(&git_root); - let work_dir = git_root.join(".story_kit").join("work"); + let work_dir = git_root.join(".storkit").join("work"); let done_dir = work_dir.join("5_done"); fs::create_dir_all(&done_dir).unwrap(); @@ -1169,7 +1169,7 @@ mod tests { let git_root = tmp.path().to_path_buf(); init_git_repo(&git_root); - let work_dir = git_root.join(".story_kit").join("work"); + let work_dir = git_root.join(".storkit").join("work"); let archived_dir = work_dir.join("6_archived"); fs::create_dir_all(&archived_dir).unwrap(); @@ -1204,7 +1204,7 @@ mod tests { let git_root = tmp.path().to_path_buf(); init_git_repo(&git_root); - let work_dir = git_root.join(".story_kit").join("work"); + let work_dir = git_root.join(".storkit").join("work"); let done_dir = work_dir.join("5_done"); fs::create_dir_all(&done_dir).unwrap(); diff --git a/server/src/llm/prompts.rs b/server/src/llm/prompts.rs index d279854..b63b3ee 100644 --- a/server/src/llm/prompts.rs +++ b/server/src/llm/prompts.rs @@ -18,7 +18,7 @@ You have the following tools available: YOUR WORKFLOW: When the user requests a feature or change: -1. **Understand:** Read `.story_kit/README.md` if you haven't already to understand the development process +1. **Understand:** Read `.storkit/README.md` if you haven't already to understand the development process 2. **Explore:** Use `read_file` and `list_directory` to understand the current codebase structure 3. **Implement:** Use `write_file` to create or modify files directly 4. **Verify:** Use `exec_shell` to run tests, linters, or build commands to verify your changes work @@ -100,7 +100,7 @@ Ask the user: - Who are the target users? - What are the core features or goals? -Then use `write_file` to write `.story_kit/specs/00_CONTEXT.md` with: +Then use `write_file` to write `.storkit/specs/00_CONTEXT.md` with: - **High-Level Goal** — a clear, concise summary of what the project does - **Core Features** — 3-5 bullet points - **Domain Definition** — key terms and roles @@ -114,7 +114,7 @@ Ask the user: - What test runner(s)? (e.g. cargo test, pytest, jest, pnpm test) - What linter(s)? (e.g. clippy, eslint, biome, ruff) -Then use `write_file` to write `.story_kit/specs/tech/STACK.md` with: +Then use `write_file` to write `.storkit/specs/tech/STACK.md` with: - **Overview** of the architecture - **Core Stack** — languages, frameworks, build tools - **Coding Standards** — formatting, linting, quality gates @@ -131,7 +131,7 @@ Based on the tech stack answers, use `write_file` to write `script/test` — a b The script must start with `#!/usr/bin/env bash` and `set -euo pipefail`. ## Step 4: Project Configuration -The scaffold has written `.story_kit/project.toml` with example `[[component]]` sections. You must replace these examples with real definitions that match the project's actual tech stack. +The scaffold has written `.storkit/project.toml` with example `[[component]]` sections. You must replace these examples with real definitions that match the project's actual tech stack. First, inspect the project structure to identify the tech stack: - Use `list_directory(".")` to see top-level files and directories @@ -139,9 +139,9 @@ First, inspect the project structure to identify the tech stack: - Check subdirectories like `frontend/`, `backend/`, `app/`, `web/` for nested stacks - If you find a `package.json`, check whether `pnpm-lock.yaml`, `yarn.lock`, or `package-lock.json` exists to determine the package manager -Then use `read_file(".story_kit/project.toml")` to see the current content, keeping the `[[agent]]` sections intact. +Then use `read_file(".storkit/project.toml")` to see the current content, keeping the `[[agent]]` sections intact. -Finally, use `write_file` to rewrite `.story_kit/project.toml` with real `[[component]]` entries. Each component needs: +Finally, use `write_file` to rewrite `.storkit/project.toml` with real `[[component]]` entries. Each component needs: - `name` — component identifier (e.g. "backend", "frontend", "app") - `path` — relative path from project root (use "." for root, "frontend" for a frontend subdirectory) - `setup` — list of setup commands that install dependencies and verify the build (e.g. ["pnpm install"], ["cargo check"]) diff --git a/server/src/main.rs b/server/src/main.rs index 6fbcbdb..1a8495d 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -55,7 +55,7 @@ async fn main() -> Result<(), std::io::Error> { if let Some(explicit_root) = explicit_path { // An explicit path was given on the command line. - // Open it directly — scaffold .story_kit/ if it is missing — and + // Open it directly — scaffold .storkit/ if it is missing — and // exit with a clear error message if the path is invalid. match io::fs::open_project( explicit_root.to_string_lossy().to_string(), @@ -76,7 +76,7 @@ async fn main() -> Result<(), std::io::Error> { } } } else { - // No path argument — auto-detect a .story_kit/ project in cwd or + // No path argument — auto-detect a .storkit/ project in cwd or // parent directories (preserves existing behaviour). if let Some(project_root) = find_story_kit_root(&cwd) { io::fs::open_project( @@ -94,16 +94,16 @@ async fn main() -> Result<(), std::io::Error> { config::ProjectConfig::load(&project_root) .unwrap_or_else(|e| panic!("Invalid project.toml: {e}")); } else { - // No .story_kit/ found — fall back to cwd so existing behaviour is preserved. + // No .storkit/ found — fall back to cwd so existing behaviour is preserved. // TRACE:MERGE-DEBUG — remove once root cause is found - slog!("[MERGE-DEBUG] main: no .story_kit/ found, falling back to cwd {:?}", cwd); + slog!("[MERGE-DEBUG] main: no .storkit/ found, falling back to cwd {:?}", cwd); *app_state.project_root.lock().unwrap() = Some(cwd.clone()); } } // Enable persistent server log file now that the project root is known. if let Some(ref root) = *app_state.project_root.lock().unwrap() { - let log_dir = root.join(".story_kit").join("logs"); + let log_dir = root.join(".storkit").join("logs"); let _ = std::fs::create_dir_all(&log_dir); log_buffer::global().set_log_file(log_dir.join("server.log")); } @@ -120,7 +120,7 @@ async fn main() -> Result<(), std::io::Error> { let watchdog_root: Option = app_state.project_root.lock().unwrap().clone(); AgentPool::spawn_watchdog(Arc::clone(&agents), watchdog_root); if let Some(ref root) = *app_state.project_root.lock().unwrap() { - let work_dir = root.join(".story_kit").join("work"); + let work_dir = root.join(".storkit").join("work"); if work_dir.is_dir() { let watcher_config = config::ProjectConfig::load(root) .map(|c| c.watcher) @@ -264,7 +264,7 @@ async fn main() -> Result<(), std::io::Error> { // Optional Matrix bot: connect to the homeserver and start listening for - // messages if `.story_kit/bot.toml` is present and enabled. + // messages if `.storkit/bot.toml` is present and enabled. if let Some(ref root) = startup_root { matrix::spawn_bot(root, watcher_tx_for_bot, perm_rx_for_bot, Arc::clone(&startup_agents)); } @@ -319,7 +319,7 @@ mod tests { #[should_panic(expected = "Invalid project.toml: Duplicate agent name")] fn panics_on_duplicate_agent_names() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write( sk.join("project.toml"), diff --git a/server/src/matrix/bot.rs b/server/src/matrix/bot.rs index e441b47..ce55254 100644 --- a/server/src/matrix/bot.rs +++ b/server/src/matrix/bot.rs @@ -84,7 +84,7 @@ struct PersistedHistory { } /// Path to the persisted conversation history file relative to project root. -const HISTORY_FILE: &str = ".story_kit/matrix_history.json"; +const HISTORY_FILE: &str = ".storkit/matrix_history.json"; /// Load conversation history from disk, returning an empty map on any error. pub fn load_history(project_root: &std::path::Path) -> HashMap { @@ -214,7 +214,7 @@ pub async fn run_bot( perm_rx: Arc>>, agents: Arc, ) -> Result<(), String> { - let store_path = project_root.join(".story_kit").join("matrix_store"); + let store_path = project_root.join(".storkit").join("matrix_store"); let client = Client::builder() .homeserver_url(&config.homeserver) .sqlite_store(&store_path, None) @@ -223,7 +223,7 @@ pub async fn run_bot( .map_err(|e| format!("Failed to build Matrix client: {e}"))?; // Persist device ID so E2EE crypto state survives restarts. - let device_id_path = project_root.join(".story_kit").join("matrix_device_id"); + let device_id_path = project_root.join(".storkit").join("matrix_device_id"); let saved_device_id: Option = std::fs::read_to_string(&device_id_path) .ok() .map(|s| s.trim().to_string()) @@ -1701,7 +1701,7 @@ mod tests { #[test] fn save_and_load_history_round_trip() { let dir = tempfile::tempdir().unwrap(); - let story_kit_dir = dir.path().join(".story_kit"); + let story_kit_dir = dir.path().join(".storkit"); std::fs::create_dir_all(&story_kit_dir).unwrap(); let room_id: OwnedRoomId = "!persist:example.com".parse().unwrap(); @@ -1742,7 +1742,7 @@ mod tests { #[test] fn load_history_returns_empty_on_corrupt_file() { let dir = tempfile::tempdir().unwrap(); - let story_kit_dir = dir.path().join(".story_kit"); + let story_kit_dir = dir.path().join(".storkit"); std::fs::create_dir_all(&story_kit_dir).unwrap(); std::fs::write(dir.path().join(HISTORY_FILE), "not valid json").unwrap(); let loaded = load_history(dir.path()); diff --git a/server/src/matrix/commands/move_story.rs b/server/src/matrix/commands/move_story.rs index 7439c1e..10eb1b4 100644 --- a/server/src/matrix/commands/move_story.rs +++ b/server/src/matrix/commands/move_story.rs @@ -62,7 +62,7 @@ pub(super) fn handle_move(ctx: &CommandContext) -> Option { 'outer: for stage_dir in SEARCH_DIRS { let dir = ctx .project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage_dir); if !dir.exists() { @@ -143,7 +143,7 @@ mod tests { } fn write_story_file(root: &std::path::Path, stage: &str, filename: &str, content: &str) { - let dir = root.join(".story_kit/work").join(stage); + let dir = root.join(".storkit/work").join(stage); std::fs::create_dir_all(&dir).unwrap(); std::fs::write(dir.join(filename), content).unwrap(); } @@ -246,7 +246,7 @@ mod tests { // Verify the file was actually moved. let new_path = tmp .path() - .join(".story_kit/work/2_current/42_story_some_feature.md"); + .join(".storkit/work/2_current/42_story_some_feature.md"); assert!(new_path.exists(), "story file should be in 2_current/"); } diff --git a/server/src/matrix/commands/overview.rs b/server/src/matrix/commands/overview.rs index 35827f6..2b98d1f 100644 --- a/server/src/matrix/commands/overview.rs +++ b/server/src/matrix/commands/overview.rs @@ -108,7 +108,7 @@ fn find_story_name(root: &std::path::Path, num_str: &str) -> Option { "6_archived", ]; for stage in &stages { - let dir = root.join(".story_kit").join("work").join(stage); + let dir = root.join(".storkit").join("work").join(stage); if !dir.exists() { continue; } diff --git a/server/src/matrix/commands/show.rs b/server/src/matrix/commands/show.rs index 0b25c00..3492196 100644 --- a/server/src/matrix/commands/show.rs +++ b/server/src/matrix/commands/show.rs @@ -34,7 +34,7 @@ pub(super) fn handle_show(ctx: &CommandContext) -> Option { for stage in &stages { let dir = ctx .project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage); if !dir.exists() { @@ -92,7 +92,7 @@ mod tests { } fn write_story_file(root: &std::path::Path, stage: &str, filename: &str, content: &str) { - let dir = root.join(".story_kit/work").join(stage); + let dir = root.join(".storkit/work").join(stage); std::fs::create_dir_all(&dir).unwrap(); std::fs::write(dir.join(filename), content).unwrap(); } diff --git a/server/src/matrix/commands/status.rs b/server/src/matrix/commands/status.rs index b7d6d8e..52adf8b 100644 --- a/server/src/matrix/commands/status.rs +++ b/server/src/matrix/commands/status.rs @@ -38,7 +38,7 @@ fn read_stage_items( stage_dir: &str, ) -> Vec<(String, Option)> { let dir = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage_dir); if !dir.exists() { @@ -228,7 +228,7 @@ mod tests { use tempfile::TempDir; let tmp = TempDir::new().unwrap(); - let stage_dir = tmp.path().join(".story_kit/work/2_current"); + let stage_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(&stage_dir).unwrap(); // Write a story file with a front-matter name @@ -257,7 +257,7 @@ mod tests { use tempfile::TempDir; let tmp = TempDir::new().unwrap(); - let stage_dir = tmp.path().join(".story_kit/work/2_current"); + let stage_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(&stage_dir).unwrap(); let story_path = stage_dir.join("293_story_register_all_bot_commands.md"); @@ -295,7 +295,7 @@ mod tests { use tempfile::TempDir; let tmp = TempDir::new().unwrap(); - let stage_dir = tmp.path().join(".story_kit/work/2_current"); + let stage_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(&stage_dir).unwrap(); let story_path = stage_dir.join("293_story_register_all_bot_commands.md"); @@ -318,7 +318,7 @@ mod tests { use tempfile::TempDir; let tmp = TempDir::new().unwrap(); - let stage_dir = tmp.path().join(".story_kit/work/2_current"); + let stage_dir = tmp.path().join(".storkit/work/2_current"); std::fs::create_dir_all(&stage_dir).unwrap(); let story_path = stage_dir.join("293_story_register_all_bot_commands.md"); diff --git a/server/src/matrix/config.rs b/server/src/matrix/config.rs index 35861d8..da0cfd5 100644 --- a/server/src/matrix/config.rs +++ b/server/src/matrix/config.rs @@ -9,7 +9,7 @@ fn default_permission_timeout_secs() -> u64 { 120 } -/// Configuration for the Matrix bot, read from `.story_kit/bot.toml`. +/// Configuration for the Matrix bot, read from `.storkit/bot.toml`. #[derive(Deserialize, Clone, Debug)] pub struct BotConfig { /// Matrix homeserver URL, e.g. `https://matrix.example.com` @@ -107,12 +107,12 @@ fn default_transport() -> String { } impl BotConfig { - /// Load bot configuration from `.story_kit/bot.toml`. + /// Load bot configuration from `.storkit/bot.toml`. /// /// Returns `None` if the file does not exist, fails to parse, has /// `enabled = false`, or specifies no room IDs. pub fn load(project_root: &Path) -> Option { - let path = project_root.join(".story_kit").join("bot.toml"); + let path = project_root.join(".storkit").join("bot.toml"); if !path.exists() { return None; } @@ -201,7 +201,7 @@ impl BotConfig { /// array, and writes the result back. Errors are logged but not propagated /// so a persistence failure never interrupts the bot's message handling. pub fn save_ambient_rooms(project_root: &Path, room_ids: &[String]) { - let path = project_root.join(".story_kit").join("bot.toml"); + let path = project_root.join(".storkit").join("bot.toml"); let content = match std::fs::read_to_string(&path) { Ok(c) => c, Err(e) => { @@ -250,7 +250,7 @@ mod tests { #[test] fn load_returns_none_when_disabled() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -270,7 +270,7 @@ enabled = false #[test] fn load_returns_config_when_enabled_with_room_ids() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -298,7 +298,7 @@ enabled = true #[test] fn load_merges_deprecated_room_id_into_room_ids() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); // Old-style single room_id key — should still work. fs::write( @@ -319,7 +319,7 @@ enabled = true #[test] fn load_returns_none_when_no_room_ids() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -338,7 +338,7 @@ enabled = true #[test] fn load_returns_none_when_toml_invalid() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write(sk.join("bot.toml"), "not valid toml {{{").unwrap(); let result = BotConfig::load(tmp.path()); @@ -348,7 +348,7 @@ enabled = true #[test] fn load_respects_optional_model() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -369,7 +369,7 @@ model = "claude-sonnet-4-6" #[test] fn load_uses_default_history_size() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -389,7 +389,7 @@ enabled = true #[test] fn load_respects_custom_history_size() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -410,7 +410,7 @@ history_size = 50 #[test] fn load_reads_display_name() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -431,7 +431,7 @@ display_name = "Timmy" #[test] fn load_display_name_defaults_to_none_when_absent() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -451,7 +451,7 @@ enabled = true #[test] fn load_uses_default_permission_timeout() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -471,7 +471,7 @@ enabled = true #[test] fn load_respects_custom_permission_timeout() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -495,7 +495,7 @@ permission_timeout_secs = 60 // must parse successfully — the field is simply ignored now that // verification is always enforced unconditionally. let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -520,7 +520,7 @@ require_verified_devices = true #[test] fn load_reads_ambient_rooms() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -541,7 +541,7 @@ ambient_rooms = ["!abc:example.com"] #[test] fn load_ambient_rooms_defaults_to_empty_when_absent() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -561,7 +561,7 @@ enabled = true #[test] fn save_ambient_rooms_persists_to_bot_toml() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -583,7 +583,7 @@ enabled = true #[test] fn save_ambient_rooms_clears_when_empty() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -606,7 +606,7 @@ ambient_rooms = ["!abc:example.com"] #[test] fn load_transport_defaults_to_matrix() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -626,7 +626,7 @@ enabled = true #[test] fn load_transport_reads_custom_value() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -662,7 +662,7 @@ whatsapp_verify_token = "my-verify" #[test] fn load_whatsapp_returns_none_when_missing_phone_number_id() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -683,7 +683,7 @@ whatsapp_verify_token = "my-verify" #[test] fn load_whatsapp_returns_none_when_missing_access_token() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -704,7 +704,7 @@ whatsapp_verify_token = "my-verify" #[test] fn load_whatsapp_returns_none_when_missing_verify_token() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -727,7 +727,7 @@ whatsapp_access_token = "EAAtoken" #[test] fn load_slack_transport_reads_config() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -753,7 +753,7 @@ slack_channel_ids = ["C01ABCDEF"] #[test] fn load_slack_returns_none_when_missing_bot_token() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -774,7 +774,7 @@ slack_channel_ids = ["C01ABCDEF"] #[test] fn load_slack_returns_none_when_missing_signing_secret() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), @@ -795,7 +795,7 @@ slack_channel_ids = ["C01ABCDEF"] #[test] fn load_slack_returns_none_when_missing_channel_ids() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); fs::create_dir_all(&sk).unwrap(); fs::write( sk.join("bot.toml"), diff --git a/server/src/matrix/delete.rs b/server/src/matrix/delete.rs index a673050..b41c8e0 100644 --- a/server/src/matrix/delete.rs +++ b/server/src/matrix/delete.rs @@ -71,7 +71,7 @@ pub async fn handle_delete( // Find the story file across all pipeline stages. let mut found: Option<(std::path::PathBuf, &str, String)> = None; // (path, stage, story_id) 'outer: for stage in STAGES { - let dir = project_root.join(".story_kit").join("work").join(stage); + let dir = project_root.join(".storkit").join("work").join(stage); if !dir.exists() { continue; } @@ -152,7 +152,7 @@ pub async fn handle_delete( // Commit the deletion to git. let commit_msg = format!("story-kit: delete {story_id}"); - let work_rel = std::path::PathBuf::from(".story_kit").join("work"); + let work_rel = std::path::PathBuf::from(".storkit").join("work"); let _ = std::process::Command::new("git") .args(["add", "-A"]) .arg(&work_rel) @@ -296,7 +296,7 @@ mod tests { let project_root = tmp.path(); // Create the pipeline directories. for stage in &["1_backlog", "2_current", "3_qa", "4_merge", "5_done", "6_archived"] { - std::fs::create_dir_all(project_root.join(".story_kit").join("work").join(stage)) + std::fs::create_dir_all(project_root.join(".storkit").join("work").join(stage)) .unwrap(); } let agents = std::sync::Arc::new(crate::agents::AgentPool::new_test(3000)); @@ -329,7 +329,7 @@ mod tests { .output() .unwrap(); - let backlog_dir = project_root.join(".story_kit").join("work").join("1_backlog"); + let backlog_dir = project_root.join(".storkit").join("work").join("1_backlog"); std::fs::create_dir_all(&backlog_dir).unwrap(); let story_path = backlog_dir.join("42_story_some_feature.md"); std::fs::write( diff --git a/server/src/matrix/mod.rs b/server/src/matrix/mod.rs index bc06de3..96cc610 100644 --- a/server/src/matrix/mod.rs +++ b/server/src/matrix/mod.rs @@ -1,6 +1,6 @@ //! Matrix bot integration for Story Kit. //! -//! When a `.story_kit/bot.toml` file is present with `enabled = true`, the +//! When a `.storkit/bot.toml` file is present with `enabled = true`, the //! server spawns a Matrix bot that: //! //! 1. Connects to the configured homeserver and joins the configured room. @@ -37,7 +37,7 @@ use tokio::sync::{Mutex as TokioMutex, broadcast, mpsc}; /// Attempt to start the Matrix bot. /// -/// Reads the bot configuration from `.story_kit/bot.toml`. If the file is +/// Reads the bot configuration from `.storkit/bot.toml`. If the file is /// absent or `enabled = false`, this function returns immediately without /// spawning anything — the server continues normally. /// diff --git a/server/src/matrix/notifications.rs b/server/src/matrix/notifications.rs index ecfe3b8..abb962b 100644 --- a/server/src/matrix/notifications.rs +++ b/server/src/matrix/notifications.rs @@ -52,7 +52,7 @@ pub fn extract_story_number(item_id: &str) -> Option<&str> { /// Returns `None` if the file doesn't exist or has no parseable name. pub fn read_story_name(project_root: &Path, stage: &str, item_id: &str) -> Option { let path = project_root - .join(".story_kit") + .join(".storkit") .join("work") .join(stage) .join(format!("{item_id}.md")); @@ -243,7 +243,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let stage_dir = tmp .path() - .join(".story_kit") + .join(".storkit") .join("work") .join("2_current"); std::fs::create_dir_all(&stage_dir).unwrap(); @@ -269,7 +269,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let stage_dir = tmp .path() - .join(".story_kit") + .join(".storkit") .join("work") .join("2_current"); std::fs::create_dir_all(&stage_dir).unwrap(); diff --git a/server/src/matrix/start.rs b/server/src/matrix/start.rs index 30a18ed..1632897 100644 --- a/server/src/matrix/start.rs +++ b/server/src/matrix/start.rs @@ -90,7 +90,7 @@ pub async fn handle_start( // Find the story file across all pipeline stages. let mut found: Option<(std::path::PathBuf, String)> = None; // (path, story_id) 'outer: for stage in STAGES { - let dir = project_root.join(".story_kit").join("work").join(stage); + let dir = project_root.join(".storkit").join("work").join(stage); if !dir.exists() { continue; } @@ -301,7 +301,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let project_root = tmp.path(); for stage in &["1_backlog", "2_current", "3_qa", "4_merge", "5_done", "6_archived"] { - std::fs::create_dir_all(project_root.join(".story_kit").join("work").join(stage)) + std::fs::create_dir_all(project_root.join(".storkit").join("work").join(stage)) .unwrap(); } let agents = std::sync::Arc::new(crate::agents::AgentPool::new_test(3000)); diff --git a/server/src/slack.rs b/server/src/slack.rs index 15d1fce..de6beb6 100644 --- a/server/src/slack.rs +++ b/server/src/slack.rs @@ -402,7 +402,7 @@ struct PersistedSlackHistory { } /// Path to the persisted Slack conversation history file. -const SLACK_HISTORY_FILE: &str = ".story_kit/slack_history.json"; +const SLACK_HISTORY_FILE: &str = ".storkit/slack_history.json"; /// Load Slack conversation history from disk. pub fn load_slack_history(project_root: &std::path::Path) -> HashMap { @@ -1244,7 +1244,7 @@ mod tests { #[test] fn save_and_load_slack_history_round_trips() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); let mut history = HashMap::new(); @@ -1288,7 +1288,7 @@ mod tests { #[test] fn load_slack_history_returns_empty_on_invalid_json() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write(sk.join("slack_history.json"), "not json {{{").unwrap(); let history = load_slack_history(tmp.path()); diff --git a/server/src/whatsapp.rs b/server/src/whatsapp.rs index b9f36ca..da3a59f 100644 --- a/server/src/whatsapp.rs +++ b/server/src/whatsapp.rs @@ -554,7 +554,7 @@ struct PersistedWhatsAppHistory { } /// Path to the persisted WhatsApp conversation history file. -const WHATSAPP_HISTORY_FILE: &str = ".story_kit/whatsapp_history.json"; +const WHATSAPP_HISTORY_FILE: &str = ".storkit/whatsapp_history.json"; /// Load WhatsApp conversation history from disk. pub fn load_whatsapp_history( @@ -1322,7 +1322,7 @@ mod tests { #[test] fn save_and_load_whatsapp_history_round_trips() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); let mut history = HashMap::new(); @@ -1366,7 +1366,7 @@ mod tests { #[test] fn load_whatsapp_history_returns_empty_on_invalid_json() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); std::fs::write(sk.join("whatsapp_history.json"), "not json {{{").unwrap(); let history = load_whatsapp_history(tmp.path()); @@ -1376,7 +1376,7 @@ mod tests { #[test] fn save_whatsapp_history_preserves_multiple_senders() { let tmp = tempfile::tempdir().unwrap(); - let sk = tmp.path().join(".story_kit"); + let sk = tmp.path().join(".storkit"); std::fs::create_dir_all(&sk).unwrap(); let mut history = HashMap::new(); diff --git a/server/src/worktree.rs b/server/src/worktree.rs index aa6d08d..b995f36 100644 --- a/server/src/worktree.rs +++ b/server/src/worktree.rs @@ -25,10 +25,10 @@ pub struct WorktreeListEntry { pub path: PathBuf, } -/// Worktree path inside the project: `{project_root}/.story_kit/worktrees/{story_id}`. +/// Worktree path inside the project: `{project_root}/.storkit/worktrees/{story_id}`. pub fn worktree_path(project_root: &Path, story_id: &str) -> PathBuf { project_root - .join(".story_kit") + .join(".storkit") .join("worktrees") .join(story_id) } @@ -56,7 +56,7 @@ fn detect_base_branch(project_root: &Path) -> String { /// Create a git worktree for the given story. /// -/// - Creates the worktree at `{project_root}/.story_kit/worktrees/{story_id}` +/// - Creates the worktree at `{project_root}/.storkit/worktrees/{story_id}` /// on branch `feature/story-{story_id}`. /// - Writes `.mcp.json` in the worktree pointing to the MCP server at `port`. /// - Runs setup commands from the config for each component. @@ -149,14 +149,14 @@ fn create_worktree_sync( } // Enable sparse checkout to exclude pipeline files from the worktree. - // This prevents .story_kit/work/ changes from ending up in feature branches, + // This prevents .storkit/work/ changes from ending up in feature branches, // which cause rename/delete merge conflicts when merging back to master. configure_sparse_checkout(wt_path)?; Ok(()) } -/// Placeholder for worktree isolation of `.story_kit/work/`. +/// Placeholder for worktree isolation of `.storkit/work/`. /// /// Previous approaches (sparse checkout, skip-worktree) all leaked state /// from worktrees back to the main checkout's config/index. For now this @@ -218,11 +218,11 @@ pub async fn remove_worktree_by_story_id( remove_worktree(project_root, &info, config).await } -/// List all worktrees under `{project_root}/.story_kit/worktrees/`. +/// List all worktrees under `{project_root}/.storkit/worktrees/`. /// Find the worktree path for a given story ID, if it exists. pub fn find_worktree_path(project_root: &Path, story_id: &str) -> Option { let wt_path = project_root - .join(".story_kit") + .join(".storkit") .join("worktrees") .join(story_id); if wt_path.is_dir() { @@ -233,7 +233,7 @@ pub fn find_worktree_path(project_root: &Path, story_id: &str) -> Option Result, String> { - let worktrees_dir = project_root.join(".story_kit").join("worktrees"); + let worktrees_dir = project_root.join(".storkit").join("worktrees"); if !worktrees_dir.exists() { return Ok(Vec::new()); } @@ -375,7 +375,7 @@ mod tests { let path = worktree_path(project_root, "42_my_story"); assert_eq!( path, - Path::new("/home/user/my-project/.story_kit/worktrees/42_my_story") + Path::new("/home/user/my-project/.storkit/worktrees/42_my_story") ); } @@ -389,7 +389,7 @@ mod tests { #[test] fn list_worktrees_returns_subdirs() { let tmp = TempDir::new().unwrap(); - let worktrees_dir = tmp.path().join(".story_kit").join("worktrees"); + let worktrees_dir = tmp.path().join(".storkit").join("worktrees"); fs::create_dir_all(worktrees_dir.join("42_story_a")).unwrap(); fs::create_dir_all(worktrees_dir.join("43_story_b")).unwrap(); // A file (not dir) — should be ignored @@ -438,8 +438,8 @@ mod tests { fs::create_dir_all(&project_root).unwrap(); init_git_repo(&project_root); - // Create a tracked file under .story_kit/work/ on the initial branch - let work_dir = project_root.join(".story_kit").join("work"); + // Create a tracked file under .storkit/work/ on the initial branch + let work_dir = project_root.join(".storkit").join("work"); fs::create_dir_all(&work_dir).unwrap(); fs::write(work_dir.join("test_story.md"), "# Test").unwrap(); Command::new("git") @@ -457,14 +457,14 @@ mod tests { let branch = "feature/test-sparse"; create_worktree_sync(&project_root, &wt_path, branch).unwrap(); - // Worktree should have all files including .story_kit/work/ - assert!(wt_path.join(".story_kit").join("work").exists()); + // Worktree should have all files including .storkit/work/ + assert!(wt_path.join(".storkit").join("work").exists()); assert!(wt_path.join(".git").exists()); // Main checkout must NOT be affected by worktree creation. assert!( work_dir.exists(), - ".story_kit/work/ must still exist in the main checkout" + ".storkit/work/ must still exist in the main checkout" ); } @@ -656,7 +656,7 @@ mod tests { init_git_repo(&project_root); let wt_path = project_root - .join(".story_kit") + .join(".storkit") .join("worktrees") .join("test_rm"); create_worktree_sync(&project_root, &wt_path, "feature/test-rm").unwrap();