huskies: rename project from storkit to huskies

Rename all references from storkit to huskies across the codebase:
- .storkit/ directory → .huskies/
- Binary name, Cargo package name, Docker image references
- Server code, frontend code, config files, scripts
- Fix script/test to build frontend before cargo clippy/test
  so merge worktrees have frontend/dist available for RustEmbed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Timmy
2026-04-03 16:12:52 +01:00
parent a7035b6ba7
commit 2d8ccb3eb6
572 changed files with 1340 additions and 1220 deletions
+20 -20
View File
@@ -24,7 +24,7 @@ pub fn create_story_file(
}
let filename = format!("{story_number}_story_{slug}.md");
let backlog_dir = root.join(".storkit").join("work").join("1_backlog");
let backlog_dir = root.join(".huskies").join("work").join("1_backlog");
fs::create_dir_all(&backlog_dir)
.map_err(|e| format!("Failed to create backlog directory: {e}"))?;
@@ -281,7 +281,7 @@ mod tests {
#[test]
fn create_story_writes_correct_content() {
let tmp = tempfile::tempdir().unwrap();
let backlog = tmp.path().join(".storkit/work/1_backlog");
let backlog = tmp.path().join(".huskies/work/1_backlog");
fs::create_dir_all(&backlog).unwrap();
fs::write(backlog.join("36_story_existing.md"), "").unwrap();
@@ -324,7 +324,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(".storkit/work/1_backlog");
let backlog = tmp.path().join(".huskies/work/1_backlog");
let story_id = result.unwrap();
let filename = format!("{story_id}.md");
let contents = fs::read_to_string(backlog.join(&filename)).unwrap();
@@ -336,7 +336,7 @@ mod tests {
#[test]
fn create_story_rejects_duplicate() {
let tmp = tempfile::tempdir().unwrap();
let backlog = tmp.path().join(".storkit/work/1_backlog");
let backlog = tmp.path().join(".huskies/work/1_backlog");
fs::create_dir_all(&backlog).unwrap();
let filepath = backlog.join("1_story_my_feature.md");
@@ -352,7 +352,7 @@ mod tests {
fn check_criterion_marks_first_unchecked() {
let tmp = tempfile::tempdir().unwrap();
setup_git_repo(tmp.path());
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
let filepath = current.join("1_test.md");
fs::write(&filepath, story_with_criteria(3)).unwrap();
@@ -379,7 +379,7 @@ mod tests {
fn check_criterion_marks_second_unchecked() {
let tmp = tempfile::tempdir().unwrap();
setup_git_repo(tmp.path());
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
let filepath = current.join("2_test.md");
fs::write(&filepath, story_with_criteria(3)).unwrap();
@@ -406,7 +406,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(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
let filepath = current.join("3_test.md");
fs::write(&filepath, story_with_criteria(2)).unwrap();
@@ -440,7 +440,7 @@ mod tests {
#[test]
fn add_criterion_appends_after_last_criterion() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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();
@@ -460,7 +460,7 @@ mod tests {
#[test]
fn add_criterion_to_empty_section() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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";
@@ -475,7 +475,7 @@ mod tests {
#[test]
fn add_criterion_missing_section_returns_error() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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();
@@ -490,7 +490,7 @@ mod tests {
#[test]
fn update_story_replaces_user_story_section() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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";
@@ -507,7 +507,7 @@ mod tests {
#[test]
fn update_story_replaces_description_section() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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";
@@ -523,7 +523,7 @@ mod tests {
#[test]
fn update_story_no_args_returns_error() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
fs::write(current.join("22_test.md"), "---\nname: T\n---\n").unwrap();
@@ -535,7 +535,7 @@ mod tests {
#[test]
fn update_story_missing_section_returns_error() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
fs::write(
current.join("23_test.md"),
@@ -551,7 +551,7 @@ mod tests {
#[test]
fn update_story_sets_agent_front_matter_field() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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();
@@ -568,7 +568,7 @@ mod tests {
#[test]
fn update_story_sets_arbitrary_front_matter_fields() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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();
@@ -587,7 +587,7 @@ mod tests {
#[test]
fn update_story_front_matter_only_no_section_required() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/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");
@@ -605,7 +605,7 @@ mod tests {
#[test]
fn update_story_bool_front_matter_written_unquoted() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
let filepath = current.join("27_test.md");
fs::write(&filepath, "---\nname: T\n---\n\nNo sections.\n").unwrap();
@@ -622,7 +622,7 @@ mod tests {
#[test]
fn update_story_integer_front_matter_written_unquoted() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
let filepath = current.join("28_test.md");
fs::write(&filepath, "---\nname: T\n---\n\nNo sections.\n").unwrap();
@@ -639,7 +639,7 @@ mod tests {
#[test]
fn update_story_bool_front_matter_parseable_after_write() {
let tmp = tempfile::tempdir().unwrap();
let current = tmp.path().join(".storkit/work/2_current");
let current = tmp.path().join(".huskies/work/2_current");
fs::create_dir_all(&current).unwrap();
let filepath = current.join("29_test.md");
fs::write(&filepath, "---\nname: My Story\n---\n\nNo sections.\n").unwrap();