rename .story_kit directory to .storkit and update all references

Renames the config directory and updates 514 references across 42 Rust
source files, plus CLAUDE.md, .gitignore, Makefile, script/release,
and .mcp.json files. All 1205 tests pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dave
2026-03-20 11:34:53 +00:00
parent 375277f86e
commit 9581e5d51a
406 changed files with 531 additions and 530 deletions

View File

@@ -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<Json<Vec<WorktreeListEntry>>> {
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"
<!-- story-kit-test-results: {"unit":[{"name":"from_file","status":"pass","details":null}],"integration":[]} -->
"#;
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();

View File

@@ -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();

View File

@@ -42,11 +42,11 @@ pub(super) async fn tool_start_agent(args: &Value, ctx: &AppContext) -> Result<S
/// Try to read the overall line coverage percentage from the llvm-cov JSON report.
///
/// Expects the file at `{project_root}/.story_kit/coverage/server.json`.
/// Expects the file at `{project_root}/.storkit/coverage/server.json`.
/// Returns `None` if the file is absent, unreadable, or cannot be parsed.
pub(super) fn read_coverage_percent_from_json(project_root: &std::path::Path) -> Option<f64> {
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();

View File

@@ -98,13 +98,13 @@ pub(super) async fn tool_rebuild_and_restart(ctx: &AppContext) -> Result<String,
// Remove the port file before re-exec so the new process can write its own.
if let Ok(root) = ctx.state.get_project_root() {
let port_file = root.join(".story_kit_port");
let port_file = root.join(".storkit_port");
if port_file.exists() {
let _ = std::fs::remove_file(&port_file);
}
}
// Also check cwd for port file.
let cwd_port_file = std::path::Path::new(".story_kit_port");
let cwd_port_file = std::path::Path::new(".storkit_port");
if cwd_port_file.exists() {
let _ = std::fs::remove_file(cwd_port_file);
}
@@ -723,7 +723,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap();
let root = tmp.path();
// Seed project root in state so get_project_root works
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("1_story_test.md"), "---\nname: Test\n---\n").unwrap();
let ctx = test_ctx(root);
@@ -739,8 +739,8 @@ mod tests {
fn tool_move_story_moves_from_backlog_to_current() {
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(&current).unwrap();
fs::write(backlog.join("5_story_test.md"), "---\nname: Test\n---\n").unwrap();
@@ -764,8 +764,8 @@ mod tests {
fn tool_move_story_moves_from_current_to_backlog() {
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(&current).unwrap();
fs::create_dir_all(&backlog).unwrap();
fs::write(current.join("6_story_back.md"), "---\nname: Back\n---\n").unwrap();
@@ -788,7 +788,7 @@ mod tests {
fn tool_move_story_idempotent_when_already_in_target() {
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(&current).unwrap();
fs::write(current.join("7_story_idem.md"), "---\nname: Idem\n---\n").unwrap();

View File

@@ -138,7 +138,7 @@ pub(super) fn tool_report_merge_failure(args: &Value, ctx: &AppContext) -> 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(&current_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)

View File

@@ -534,7 +534,7 @@ fn handle_tools_list(id: Option<Value>) -> 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<Value>) -> 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<Value>) -> 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<Value>) -> 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<Value>) -> 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<Value>) -> 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",

View File

@@ -48,7 +48,7 @@ pub(super) async fn tool_approve_qa(args: &Value, ctx: &AppContext) -> Result<St
// Clear review_hold before moving
let qa_path = project_root
.join(".story_kit/work/3_qa")
.join(".storkit/work/3_qa")
.join(format!("{story_id}.md"));
if qa_path.exists() {
let _ = crate::io::story_metadata::clear_front_matter_field(&qa_path, "review_hold");
@@ -92,7 +92,7 @@ pub(super) async fn tool_reject_qa(args: &Value, ctx: &AppContext) -> Result<Str
// Restart the coder agent with rejection context
let story_path = project_root
.join(".story_kit/work/2_current")
.join(".storkit/work/2_current")
.join(format!("{story_id}.md"));
let agent_name = if story_path.exists() {
let contents = std::fs::read_to_string(&story_path).unwrap_or_default();
@@ -152,10 +152,10 @@ pub(super) async fn tool_launch_qa_app(args: &Value, ctx: &AppContext) -> 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")

View File

@@ -59,7 +59,7 @@ fn is_dangerous(command: &str) -> Option<String> {
}
/// 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<PathBuf, String> {
let wd = PathBuf::from(working_dir);
@@ -71,7 +71,7 @@ fn validate_working_dir(working_dir: &str, ctx: &AppContext) -> Result<PathBuf,
}
let project_root = ctx.agents.get_project_root(&ctx.state)?;
let worktrees_root = project_root.join(".story_kit").join("worktrees");
let worktrees_root = project_root.join(".storkit").join("worktrees");
let canonical_wd = wd
.canonicalize()
@@ -88,7 +88,7 @@ fn validate_working_dir(working_dir: &str, ctx: &AppContext) -> Result<PathBuf,
if !canonical_wd.starts_with(&canonical_wt) {
return Err(format!(
"working_dir must be inside .story_kit/worktrees/. Got: {working_dir}"
"working_dir must be inside .storkit/worktrees/. Got: {working_dir}"
));
}
@@ -410,14 +410,14 @@ mod tests {
fn validate_working_dir_rejects_path_outside_worktrees() {
let tmp = tempfile::tempdir().unwrap();
// Create the worktrees dir so it exists
let wt_dir = tmp.path().join(".story_kit").join("worktrees");
let wt_dir = tmp.path().join(".storkit").join("worktrees");
std::fs::create_dir_all(&wt_dir).unwrap();
let ctx = test_ctx(tmp.path());
// Try to use /tmp (outside worktrees)
let result = validate_working_dir(tmp.path().to_str().unwrap(), &ctx);
assert!(result.is_err());
assert!(
result.unwrap_err().contains("inside .story_kit/worktrees"),
result.unwrap_err().contains("inside .storkit/worktrees"),
"expected sandbox error"
);
}
@@ -427,7 +427,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap();
let story_wt = tmp
.path()
.join(".story_kit")
.join(".storkit")
.join("worktrees")
.join("42_test_story");
std::fs::create_dir_all(&story_wt).unwrap();
@@ -481,7 +481,7 @@ mod tests {
#[tokio::test]
async fn tool_run_command_rejects_path_outside_worktrees() {
let tmp = tempfile::tempdir().unwrap();
let wt_dir = tmp.path().join(".story_kit").join("worktrees");
let wt_dir = tmp.path().join(".storkit").join("worktrees");
std::fs::create_dir_all(&wt_dir).unwrap();
let ctx = test_ctx(tmp.path());
let result = tool_run_command(
@@ -504,7 +504,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap();
let story_wt = tmp
.path()
.join(".story_kit")
.join(".storkit")
.join("worktrees")
.join("42_test");
std::fs::create_dir_all(&story_wt).unwrap();
@@ -532,7 +532,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap();
let story_wt = tmp
.path()
.join(".story_kit")
.join(".storkit")
.join("worktrees")
.join("43_test");
std::fs::create_dir_all(&story_wt).unwrap();
@@ -558,7 +558,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap();
let story_wt = tmp
.path()
.join(".story_kit")
.join(".storkit")
.join("worktrees")
.join("44_test");
std::fs::create_dir_all(&story_wt).unwrap();
@@ -584,7 +584,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap();
let story_wt = tmp
.path()
.join(".story_kit")
.join(".storkit")
.join("worktrees")
.join("45_test");
std::fs::create_dir_all(&story_wt).unwrap();

View File

@@ -124,7 +124,7 @@ pub(super) fn tool_get_story_todos(args: &Value, ctx: &AppContext) -> Result<Str
.ok_or("Missing required argument: story_id")?;
let root = ctx.state.get_project_root()?;
let current_dir = root.join(".story_kit").join("work").join("2_current");
let current_dir = root.join(".storkit").join("work").join("2_current");
let filepath = current_dir.join(format!("{story_id}.md"));
if !filepath.exists() {
@@ -414,7 +414,7 @@ pub(super) async fn tool_delete_story(args: &Value, ctx: &AppContext) -> 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(&current).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(&current_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(&current_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(&current_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(&current).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(&current).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(&current).unwrap();
let story_content = "---\nname: Fail\n---\n# Story\n\n## Test Results\n\n<!-- story-kit-test-results: {\"unit\":[{\"name\":\"u1\",\"status\":\"fail\",\"details\":\"error\"}],\"integration\":[]} -->\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(&current).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(&current_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(&current_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(&current_dir).unwrap();
fs::write(
current_dir.join("1_test.md"),

View File

@@ -45,7 +45,7 @@ pub fn resolve_port() -> u16 {
}
pub fn write_port_file(dir: &Path, port: u16) -> Option<PathBuf> {
let path = dir.join(".story_kit_port");
let path = dir.join(".storkit_port");
std::fs::write(&path, port.to_string()).ok()?;
Some(path)
}

View File

@@ -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());

View File

@@ -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<String> {
///
/// Returns a sorted list of `(bug_id, name)` pairs.
pub fn list_bug_files(root: &Path) -> Result<Vec<(String, String)>, 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<Vec<(String, String)>, 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();

View File

@@ -121,7 +121,7 @@ fn load_stage_items(
agent_map: &HashMap<String, AgentAssignment>,
) -> Result<Vec<UpcomingStory>, 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<PathBuf> = 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<PathBuf, String> {
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<u32, String> {
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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).unwrap();
fs::create_dir_all(&backlog).unwrap();

View File

@@ -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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).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(&current).unwrap();
// File without a User Story section — front matter update should succeed
let filepath = current.join("26_test.md");

View File

@@ -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(&current).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(&current).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(&current).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(&current).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(&current).unwrap();
fs::write(current.join("6_story_cov.md"), "---\nname: Cov Story\n---\n# Story\n").unwrap();

View File

@@ -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<crate::http::workflow::UpcomingStory>,
done: Vec<crate::http::workflow::UpcomingStory>,
},
/// `.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));