diff --git a/.gitignore b/.gitignore index 8cb4333..919ab83 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ archive/ # Claw Code local artifacts .claw/settings.local.json .claw/sessions/ +.clawhip/ status-help.txt diff --git a/ROADMAP.md b/ROADMAP.md index 3e8766a..51e49cf 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -520,3 +520,5 @@ Model name prefix now wins unconditionally over env-var presence. Regression tes 73. **Session timestamps are not monotonic enough for latest-session ordering under tight loops** — **done (verified 2026-04-12):** runtime session timestamps now use a process-local monotonic millisecond source, so back-to-back saves still produce increasing `updated_at_ms` even when the wall clock does not advance. The temporary sleep hack was removed from the resume-latest regression, and fresh workspace verification stayed green with the semantic-recency ordering path from #72. **Original filing below.** 74. **Poisoned test locks cascade into unrelated Rust regressions** — **done (verified 2026-04-12):** test-only env/cwd lock acquisition in `rust/crates/tools/src/lib.rs`, `rust/crates/plugins/src/lib.rs`, `rust/crates/commands/src/lib.rs`, and `rust/crates/rusty-claude-cli/src/main.rs` now recovers poisoned mutexes via `PoisonError::into_inner`, and new regressions lock that behavior so one panic no longer causes later tests to fail just by touching the shared env/cwd locks. Source: Jobdori dogfood 2026-04-12. + +75. **`claw init` leaves `.clawhip/` runtime artifacts unignored** — **done (verified 2026-04-12):** `rust/crates/rusty-claude-cli/src/init.rs` now treats `.clawhip/` as a first-class local artifact alongside `.claw/` paths, and regression coverage locks both the create and idempotent update paths so `claw init` adds the ignore entry exactly once. The repo `.gitignore` now also ignores `.clawhip/` for immediate dogfood relief, preventing repeated OMX team merge conflicts on `.clawhip/state/prompt-submit.json`. Source: Jobdori dogfood 2026-04-12. diff --git a/rust/crates/rusty-claude-cli/src/init.rs b/rust/crates/rusty-claude-cli/src/init.rs index a5f0ff7..b8c1c6e 100644 --- a/rust/crates/rusty-claude-cli/src/init.rs +++ b/rust/crates/rusty-claude-cli/src/init.rs @@ -9,7 +9,7 @@ const STARTER_CLAW_JSON: &str = concat!( "}\n", ); const GITIGNORE_COMMENT: &str = "# Claw Code local artifacts"; -const GITIGNORE_ENTRIES: [&str; 2] = [".claw/settings.local.json", ".claw/sessions/"]; +const GITIGNORE_ENTRIES: [&str; 3] = [".claw/settings.local.json", ".claw/sessions/", ".clawhip/"]; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub(crate) enum InitStatus { @@ -375,6 +375,7 @@ mod tests { let gitignore = fs::read_to_string(root.join(".gitignore")).expect("read gitignore"); assert!(gitignore.contains(".claw/settings.local.json")); assert!(gitignore.contains(".claw/sessions/")); + assert!(gitignore.contains(".clawhip/")); let claude_md = fs::read_to_string(root.join("CLAUDE.md")).expect("read claude md"); assert!(claude_md.contains("Languages: Rust.")); assert!(claude_md.contains("cargo clippy --workspace --all-targets -- -D warnings")); @@ -407,6 +408,7 @@ mod tests { let gitignore = fs::read_to_string(root.join(".gitignore")).expect("read gitignore"); assert_eq!(gitignore.matches(".claw/settings.local.json").count(), 1); assert_eq!(gitignore.matches(".claw/sessions/").count(), 1); + assert_eq!(gitignore.matches(".clawhip/").count(), 1); fs::remove_dir_all(root).expect("cleanup temp dir"); }