diff --git a/CHANGELOG.md b/CHANGELOG.md index 09f1ba0..d9d5374 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.25.0] - 2026-06-13 +## [0.25.1] - 2026-06-14 + +### Fixed +- **Distiller subagent no longer pins fragile MCP tool names.** The + `task-journal-distiller` agent dropped its explicit `tools:` list (which named + the journal MCP tools under one marketplace-specific prefix and would have left + the agent unable to write events on any install with a different prefix). It + now inherits the session's tools, so it can always reach the journal MCP. + +### Added +- **`task-journal capture status`** — reports whether realtime capture is ON or + OFF (the `.capture-disabled` marker) without changing it. ### Added - **In-session compaction distiller.** A new `task-journal-distiller` subagent diff --git a/Cargo.lock b/Cargo.lock index 75af620..bba8867 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2572,7 +2572,7 @@ dependencies = [ [[package]] name = "task-journal-cli" -version = "0.25.0" +version = "0.25.1" dependencies = [ "anyhow", "assert_cmd", @@ -2596,7 +2596,7 @@ dependencies = [ [[package]] name = "task-journal-core" -version = "0.25.0" +version = "0.25.1" dependencies = [ "anyhow", "chrono", @@ -2621,7 +2621,7 @@ dependencies = [ [[package]] name = "task-journal-mcp" -version = "0.25.0" +version = "0.25.1" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index b405d35..58b3319 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ members = [ ] [workspace.package] -version = "0.25.0" +version = "0.25.1" edition = "2021" rust-version = "1.88" license = "MIT" diff --git a/crates/tj-cli/Cargo.toml b/crates/tj-cli/Cargo.toml index e0628d5..37a3129 100644 --- a/crates/tj-cli/Cargo.toml +++ b/crates/tj-cli/Cargo.toml @@ -23,7 +23,7 @@ default = ["embed"] embed = ["tj-core/embed"] [dependencies] -tj-core = { package = "task-journal-core", version = "0.25.0", path = "../tj-core", default-features = false } +tj-core = { package = "task-journal-core", version = "0.25.1", path = "../tj-core", default-features = false } anyhow = { workspace = true } clap = { workspace = true } tracing = { workspace = true } diff --git a/crates/tj-cli/src/main.rs b/crates/tj-cli/src/main.rs index b87a70e..f08e8b5 100644 --- a/crates/tj-cli/src/main.rs +++ b/crates/tj-cli/src/main.rs @@ -657,7 +657,7 @@ enum Commands { /// already-running session — without touching the read-only SessionStart /// resume. Use it to silence a stale auto-capture hook. Capture { - /// "on" (remove the marker) or "off" (write it). + /// "on" (remove the marker), "off" (write it), or "status" (report it). state: String, }, /// Distil this project's recurring decisions and constraints into durable @@ -1348,7 +1348,14 @@ fn main() -> Result<()> { let _ = std::fs::remove_file(&marker); println!("realtime capture ON."); } - other => anyhow::bail!("expected `on` or `off`, got `{other}`"), + "status" => { + if marker.exists() { + println!("realtime capture OFF (.capture-disabled present)."); + } else { + println!("realtime capture ON."); + } + } + other => anyhow::bail!("expected `on`, `off`, or `status`, got `{other}`"), } } Commands::Consolidate { diff --git a/crates/tj-cli/tests/cli.rs b/crates/tj-cli/tests/cli.rs index 6d85971..564a5ed 100644 --- a/crates/tj-cli/tests/cli.rs +++ b/crates/tj-cli/tests/cli.rs @@ -5400,6 +5400,36 @@ fn consolidate_skips_without_api_key_and_spends_nothing() { .stdout(contains("skipped")); } +#[test] +fn capture_status_reports_current_state() { + // `capture status` reports ON/OFF without changing anything. + let dir = assert_fs::TempDir::new().unwrap(); + + // Fresh install → ON. + Command::cargo_bin("task-journal") + .unwrap() + .env("XDG_DATA_HOME", dir.path()) + .args(["capture", "status"]) + .assert() + .success() + .stdout(contains("ON")); + + // After `off` → OFF, and status must not flip it back. + Command::cargo_bin("task-journal") + .unwrap() + .env("XDG_DATA_HOME", dir.path()) + .args(["capture", "off"]) + .assert() + .success(); + Command::cargo_bin("task-journal") + .unwrap() + .env("XDG_DATA_HOME", dir.path()) + .args(["capture", "status"]) + .assert() + .success() + .stdout(contains("OFF")); +} + #[test] fn capture_off_marker_no_ops_ingest_hook_capture() { // `capture off` writes a marker that makes ingest-hook skip the capture diff --git a/crates/tj-mcp/Cargo.toml b/crates/tj-mcp/Cargo.toml index cf4783e..68f928a 100644 --- a/crates/tj-mcp/Cargo.toml +++ b/crates/tj-mcp/Cargo.toml @@ -17,7 +17,7 @@ path = "src/main.rs" [dependencies] # Lean: the MCP server doesn't embed yet, so it skips the model2vec backend. -tj-core = { package = "task-journal-core", version = "0.25.0", path = "../tj-core", default-features = false } +tj-core = { package = "task-journal-core", version = "0.25.1", path = "../tj-core", default-features = false } anyhow = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index d6eb8a4..286f3de 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "task-journal", - "version": "0.25.0", + "version": "0.25.1", "description": "Append-only journal of AI-coding task reasoning chains: hypotheses, decisions, rejections, evidence. Renders compact resume packs so an agent can pick up a 2-week-old task with full context.", "author": { "name": "Mher Shahinyan" diff --git a/plugin/agents/task-journal-distiller.md b/plugin/agents/task-journal-distiller.md index d490260..dd8e0f0 100644 --- a/plugin/agents/task-journal-distiller.md +++ b/plugin/agents/task-journal-distiller.md @@ -3,7 +3,6 @@ name: task-journal-distiller description: Distills a conversation segment into task-journal memory. Use when a compaction just happened (or is about to), or when asked to "capture what we just did" — it reads the segment from the transcript, finds the decisions / rejections / findings that were NOT yet logged for the active task, and records them via the task-journal MCP. Runs in the background so it never blocks the main chat. Does NOT close tasks. model: haiku background: true -tools: Read, Bash, Grep, Glob, mcp__plugin_task-journal_task-journal__task_search, mcp__plugin_task-journal_task-journal__task_pack, mcp__plugin_task-journal_task-journal__event_add --- You are the **task-journal distiller**. A segment of a coding conversation is