Skip to content

Commit 96078f1

Browse files
Shahinyanmclaude
andcommitted
fix: ci-safe v0.2.3 — UTF-8 truncation + doctor exit code + MSRV pin
v0.2.2 publish was incomplete: task-journal-core@0.2.2 reached crates.io before two CI failures aborted the workflow. cli and mcp never published. 0.2.3 is the canonical replacement. What landed in v0.2.2 and survives in v0.2.3: - TUI panic on Cyrillic prompts (chars vs bytes) — fixed via truncate_with_ellipsis helper + 5 regression tests. New in v0.2.3: - run_doctor() splits issues (exit 1) from notes (exit 0). Missing claude CLI moves from issues to notes — its absence is normal for API-backend users with ANTHROPIC_API_KEY. Was making CI red and confusing fresh installs. - assert_cmd dev-dep pinned to >=2, <2.2.1 — assert_cmd@2.2.1 requires Rust edition 2024 (stable in 1.85+), our MSRV is 1.83. CI follow-up: yank task-journal-core@0.2.2 with cargo yank --version 0.2.2 task-journal-core (no matching cli/mcp at that version). Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 07c4371 commit 96078f1

9 files changed

Lines changed: 54 additions & 21 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
},
77
"metadata": {
88
"description": "Task Journal — append-only reasoning chain memory for AI-coding tasks",
9-
"version": "0.2.2"
9+
"version": "0.2.3"
1010
},
1111
"plugins": [
1212
{
1313
"name": "task-journal",
1414
"source": "./plugin",
1515
"description": "Append-only journal of AI-coding task reasoning chains. Captures hypotheses, decisions, rejections, evidence — renders compact resume packs so an agent can pick up a 2-week-old task with full context.",
16-
"version": "0.2.2",
16+
"version": "0.2.3",
1717
"author": {
1818
"name": "Digital-Threads"
1919
},

CHANGELOG.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
## [0.2.2] - 2026-05-07
10+
## [0.2.3] - 2026-05-07
1111

12-
Hotfix release. No new features.
12+
Hotfix release. Re-release of the 0.2.2 fixes plus CI repair —
13+
0.2.2 publish was incomplete (only `task-journal-core` reached
14+
crates.io before MSRV/test failures; `cli`/`mcp` never published).
15+
0.2.3 is the canonical replacement; `task-journal-core@0.2.2` will be
16+
yanked.
1317

1418
### Fixed
1519
- TUI session browser (`task-journal ui`) panicked with `byte index is
@@ -18,8 +22,20 @@ Hotfix release. No new features.
1822
emoji, etc.). Title truncation now slices by Unicode scalars instead
1923
of bytes. Same fix applied to the fallback `Session <id>` path for
2024
consistency.
21-
- Added regression tests covering Cyrillic, emoji, and exact-boundary
22-
inputs for the new `truncate_with_ellipsis` helper.
25+
- `task-journal doctor` exited with code 1 when the `claude` CLI was
26+
not on PATH. Missing `claude` is normal for users on the API
27+
backend (`ANTHROPIC_API_KEY`) — it should be informational, not an
28+
error. Doctor now distinguishes hard `issues` (non-zero exit) from
29+
soft `notes` (zero exit), and `claude` absence is a note.
30+
- MSRV CI job failed because `assert_cmd@2.2.1` requires Rust edition
31+
2024 (stable in Rust 1.85+) while our MSRV is 1.83. Pinned the dev
32+
dependency to `>=2, <2.2.1` to keep MSRV builds green.
33+
- Lingering `clippy::doc_lazy_continuation` warning in
34+
`classifier_eval.rs` test header.
35+
36+
### Added
37+
- Regression tests for `truncate_with_ellipsis`: ASCII under/over
38+
limit, Cyrillic boundary, emoji char-counting, exact-length no-op.
2339

2440
## [0.2.1] - 2026-05-07
2541

Cargo.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ members = [
77
]
88

99
[workspace.package]
10-
version = "0.2.2"
10+
version = "0.2.3"
1111
edition = "2021"
1212
rust-version = "1.83"
1313
license = "MIT"

crates/tj-cli/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ name = "task-journal"
1616
path = "src/main.rs"
1717

1818
[dependencies]
19-
tj-core = { package = "task-journal-core", version = "0.2.2", path = "../tj-core" }
19+
tj-core = { package = "task-journal-core", version = "0.2.3", path = "../tj-core" }
2020
anyhow = { workspace = true }
2121
clap = { workspace = true }
2222
tracing = { workspace = true }
@@ -33,5 +33,5 @@ tempfile = { workspace = true }
3333
[dev-dependencies]
3434
assert_fs = { workspace = true }
3535
predicates = { workspace = true }
36-
assert_cmd = "2"
36+
assert_cmd = ">=2, <2.2.1"
3737
rusqlite = { workspace = true }

crates/tj-cli/src/main.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,15 @@ struct DoctorReport {
2323
metrics_dir_writable: bool,
2424
known_projects: Vec<String>,
2525
schema_versions_applied: Vec<i64>,
26+
/// Hard problems that block normal use (non-writable dirs, broken
27+
/// schema, missing files, etc.). A non-empty `issues` list causes
28+
/// `task-journal doctor` to exit with code 1.
2629
issues: Vec<String>,
30+
/// Soft observations: install hints, optional dependencies missing,
31+
/// configuration suggestions. Always exits 0 even if non-empty —
32+
/// these are informational, not errors.
33+
#[serde(default, skip_serializing_if = "Vec::is_empty")]
34+
notes: Vec<String>,
2735
}
2836

2937
impl DoctorReport {
@@ -77,6 +85,12 @@ impl DoctorReport {
7785
.collect();
7886
println!(" schema (current) {}", v.join(", "));
7987
}
88+
if !self.notes.is_empty() {
89+
println!("\nℹ {} note(s):", self.notes.len());
90+
for n in &self.notes {
91+
println!(" - {n}");
92+
}
93+
}
8094
if self.issues.is_empty() {
8195
println!("\n✓ all checks passed");
8296
} else {
@@ -475,18 +489,20 @@ fn run_pending_retry(
475489

476490
fn run_doctor() -> Result<DoctorReport> {
477491
let mut issues: Vec<String> = Vec::new();
492+
let mut notes: Vec<String> = Vec::new();
478493

479-
// 1. claude binary in PATH
494+
// 1. claude binary in PATH (note, not issue — API backend works without it)
480495
let claude_check = PCommand::new("claude").arg("--version").output();
481496
let (claude_in_path, claude_version) = match claude_check {
482497
Ok(out) if out.status.success() => {
483498
let v = String::from_utf8_lossy(&out.stdout).trim().to_string();
484499
(true, Some(v))
485500
}
486501
Ok(_) | Err(_) => {
487-
issues.push(
488-
"claude CLI not found on PATH — auto-capture hooks will fall back to API \
489-
backend (set ANTHROPIC_API_KEY) or fail silently"
502+
notes.push(
503+
"claude CLI not on PATH — that's fine if you use the API backend \
504+
(set ANTHROPIC_API_KEY). For the CLI backend (free with Pro/Max), \
505+
install Claude Code from https://claude.com/claude-code"
490506
.into(),
491507
);
492508
(false, None)
@@ -548,6 +564,7 @@ fn run_doctor() -> Result<DoctorReport> {
548564
known_projects,
549565
schema_versions_applied,
550566
issues,
567+
notes,
551568
})
552569
}
553570

crates/tj-mcp/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ name = "task-journal-mcp"
1616
path = "src/main.rs"
1717

1818
[dependencies]
19-
tj-core = { package = "task-journal-core", version = "0.2.2", path = "../tj-core" }
19+
tj-core = { package = "task-journal-core", version = "0.2.3", path = "../tj-core" }
2020
anyhow = { workspace = true }
2121
tokio = { workspace = true }
2222
tracing = { workspace = true }

plugin/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "task-journal",
3-
"version": "0.2.2",
3+
"version": "0.2.3",
44
"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.",
55
"author": {
66
"name": "Mher Shahinyan"

plugin/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "task-journal",
3-
"version": "0.2.2",
3+
"version": "0.2.3",
44
"description": "Append-only journal of AI-coding task reasoning chains. Captures hypotheses, decisions, rejections, evidence — renders compact resume packs so an agent can pick up a 2-week-old task with full context.",
55
"author": {
66
"name": "Mher Shahinyan",

0 commit comments

Comments
 (0)