Releases: rtk-ai/icm
icm 0.10.49
What's new
feat(hooks): structured telemetry table + icm hook-log / icm hook-stats (#222)
Adds a hook_events table that captures every icm hook <event> invocation (start | end | pre | post | prompt | compact) with timestamp, duration, exit code, and an optional error note.
Two new CLI commands:
icm hook-log [--limit N] [--event NAME] [--prune-older-than RFC3339]— recent rowsicm hook-stats [--since-hours N]— per-event count, error rate, avg/p50/p99 latency
Why
Claude Code does not log SessionEnd attachments to its session JSONL, so confirming that icm hook end actually fired previously required catching the detached worker mid-run via ps. This table makes every hook fire observable from inside ICM itself.
Example
$ icm hook-stats --since-hours 24
event count errors avg ms p50 ms p99 ms
end 42 0 11.3 9 38
post 756 0 14.1 13 27
start 8 0 35.0 36 83
Install
cargo install icm-cli --version 0.10.49Or grab the prebuilt binary from the release assets below.
icm-dev-v0.10.50-rc.53
What's Changed
- feat(hooks): structured telemetry table +
icm hook-log/icm hook-statsby @pszymkowiak in #222 - release: hook telemetry observability by @pszymkowiak in #223
- chore(main): release icm 0.10.49 by @pszymkowiak in #224
Full Changelog: icm-v0.10.48...icm-dev-v0.10.50-rc.53
icm-dev-v0.10.50-rc.52
What's Changed
- feat(hooks): structured telemetry table +
icm hook-log/icm hook-statsby @pszymkowiak in #222 - release: hook telemetry observability by @pszymkowiak in #223
- chore(main): release icm 0.10.49 by @pszymkowiak in #224
Full Changelog: icm-v0.10.48...icm-dev-v0.10.50-rc.52
icm-dev-v0.10.50-rc.51
What's Changed
- feat(hooks): structured telemetry table +
icm hook-log/icm hook-statsby @pszymkowiak in #222 - release: hook telemetry observability by @pszymkowiak in #223
- chore(main): release icm 0.10.49 by @pszymkowiak in #224
Full Changelog: icm-v0.10.48...icm-dev-v0.10.50-rc.51
icm 0.10.48
Features
Async LLM-CLI extraction path (#219)
Adds an opt-in fast path that removes the ~3.7s fastembed model-load tax on PostToolUse + SessionEnd hooks. When configured, hooks enqueue raw output in ~10ms and a worker drains the queue via the user's existing LLM CLI (claude/codex/gemini/ollama).
```toml
~/.config/icm/config.toml
[extraction.summarizer]
provider = "auto" # auto | none | claude | codex | gemini | ollama
model = "claude-haiku-4-5"
max_tokens = 400
timeout_secs = 30
```
| Mode | Hook latency | Quality | Cost |
|---|---|---|---|
| `provider = "none"` (default) | 3.7s | OK (anchor) | $0 |
| `provider = "auto"` (new) | ~10ms | Excellent (LLM) | $0 (user subscription) |
The default `none` keeps the inline fastembed path untouched — zero regression for existing users.
What's new
- `[extraction.summarizer]` config block
- `pending_extractions` queue table (idempotent migration)
- `icm extract-pending [--limit N --provider X --model M --dry-run]` worker command
- SessionEnd hook forks the worker via `setsid` on Unix when provider is configured — no more "Hook cancelled" timeouts from Claude Code
Live verification
```
Hook fire latency: 10ms (was 3700ms inline)
SessionEnd: no "Hook cancelled" anymore
Worker: claude CLI extracted clean bullet, stored as Memory
441 tests pass on Linux/macOS/Windows
```
🤖 Generated with Claude Code
icm 0.10.47
Bug Fixes
CRITICAL follow-up (completes 0.10.46)
-
hook: extract output from per-tool `tool_response` shapes (Bash/Read/Write) (#216)
0.10.46 fixed the top-level `tool_response.output` reader but Claude Code 2.1.138 doesn't actually emit that field. Each built-in tool nests its content under a tool-specific key:
Tool Path Bash `tool_response.stdout` Read `tool_response.file.content` Write `tool_response.content` Edit `tool_response.content` Net effect of 0.10.46 alone: extraction still produced zero memories on Read/Write/Edit and only matched Bash on clients that emitted `output` instead of `stdout`. 0.10.47 is the release that actually delivers what 0.10.46 promised.
Verified
- 11 regression tests on `extract_tool_output` covering 6 payload shapes
- 3 byte-for-byte fixtures captured via tap script during a real `claude -p` smoke test
- Live end-to-end: `Newest` advanced 17:13 → 17:27 after a single Bash hook fire on the patched binary; unpatched 0.10.46 produced no extraction on identical input
- 441+ tests pass on Linux / macOS / Windows
- `cargo clippy --all-targets -- -D warnings` clean
Upgrade urgency
If you're running Claude Code 2.x and you upgraded to 0.10.46: upgrade to 0.10.47 now. The 0.10.46 release closed the silent-extraction-failure issue but, as live testing revealed afterward, only partially — Read/Write/Edit hook fires still produced nothing. 0.10.47 closes the remaining gap.
🤖 Generated with Claude Code
icm 0.10.46
Bug Fixes
CRITICAL
-
hook: read Claude Code 2.x `tool_response.output` payload (#212) — closes silent auto-extraction failure on every Claude Code 2.x install. The hook fired, the counter incremented, but the legacy `tool_output` field was empty in the new payload shape, so zero memories were stored despite hours of activity.
Now accepts three payload shapes (legacy, Claude Code 2.x, Codex variants) with 8 regression tests + 3 byte-for-byte fixtures pinned in `tests/fixtures/hook_payloads/` so the next upstream change breaks at PR review instead of silently in production.
Stability
- init: turn 7 init unwrap panics into proper error returns (#213) — `icm init` no longer hard-panics on malformed user MCP / hook config files. Errors now point at the exact key + path that's wrong.
Verification
- 438+ tests pass on Linux / macOS / Windows
- 8 regression tests + 3 fixture files for hook payload parsing
- Smoke-tested on dev box: 5 hook fires with Claude Code 2.x payload yielded 2 memories at +4min where the unpatched binary produced none on identical input
Upgrade urgency
If you run Claude Code 2.x with ICM hooks installed, upgrade now — auto-extraction has been silently broken since you upgraded Claude Code. Existing memories in your store are unaffected; only new ones since the Claude Code upgrade are missing.
Binary assets are built by the post-release workflow and will appear shortly.
🤖 Generated with Claude Code
icm 0.10.45
Bug Fixes
- import: truncate at UTF-8 char boundary to avoid panic on multibyte chars (#201) — closes #199
- store: clear drifted embedding BLOBs on every open + atomic dim migration (#202) — closes #200
- consolidate, health: warn that provider=none is a lexical join, not a summary (#203) — closes #186
- doctor: walk every platform icm init configures, not just Gemini (#204) — closes #174
- display: respect TZ env on every CLI/MCP timestamp render (#205) — closes #119
- init, doctor: forward-slash bin path on Windows + match icm.exe in detect (#206) — closes #180
- opencode: inject recalled context via system.transform hook (#207) — closes #169
- tui: drop crossterm key Release events on Windows to stop double-fire (#208) — closes #181
- hook: emit Cursor-shaped JSON when invoked from Cursor (#209) — closes #120
Verification
- 9 PRs, ~30 new regression tests, 427+ tests pass on Linux / macOS / Windows
- All security-checked: 0 new `unsafe` blocks, 0 new `Command::new`/`spawn`, 0 new fs writes, parameterized SQL only
Binary assets are built by the post-release workflow and will appear shortly.
🤖 Generated with Claude Code
icm-dev-v0.10.49-rc.48
What's Changed
- feat(extract): async LLM-CLI extraction path (50ms hooks via pending queue) by @pszymkowiak in #219
- Release prep: merge develop → main for v0.10.48 (async LLM extraction) by @pszymkowiak in #220
- chore(main): release icm 0.10.48 by @pszymkowiak in #221
Full Changelog: icm-v0.10.47...icm-dev-v0.10.49-rc.48
icm-dev-v0.10.48-rc.45
What's Changed
- fix(hook): extract output from per-tool tool_response shapes (Bash/Read/Write) — CRITICAL follow-up by @pszymkowiak in #216
- Release prep: merge develop → main for v0.10.47 (CRITICAL hook follow-up) by @pszymkowiak in #217
- chore(main): release icm 0.10.47 by @pszymkowiak in #218
Full Changelog: icm-dev-v0.10.47-rc.42...icm-dev-v0.10.48-rc.45