Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
1ba546e
fix(plugin): ship agents/ and hooks/ in package files, drop missing R…
Shahinyanm Oct 4, 2026
7ce2f0e
build: pin task-journal-core once in workspace deps and test it again…
Shahinyanm Oct 4, 2026
dfadf08
docs(releasing): align secret, sleeps and bump checklist with publish…
Shahinyanm Oct 4, 2026
7ccd09e
ci: gate crates.io publish and release builds on fmt, clippy and tests
Shahinyanm Oct 4, 2026
39c4d2b
fix(core): quote each FTS5 query token so punctuation never breaks se…
Shahinyanm Oct 4, 2026
a3b1ff4
refactor(core): remove unused argv ClaudeBinaryRunner
Shahinyanm Oct 4, 2026
97296c9
docs(install): describe what hook uninstall removes for each client
Shahinyanm Oct 4, 2026
5e8f7de
feat(plugin): Claude Code mod keeps the session's task in the system …
Shahinyanm Oct 4, 2026
85894cc
Merge branch 'worktree-agent-a29d7fa57c79be190' into feat/0.30.0
Shahinyanm Oct 4, 2026
ddc82d3
fix(mcp): task_search honours status and project, lists tasks on empt…
Shahinyanm Oct 4, 2026
a75fb0d
fix(hooks): mark codex classifier child with TJ_IN_CLASSIFIER and sil…
Shahinyanm Oct 4, 2026
1c25888
fix(mcp): task_close harvests the project dir and records outcome via…
Shahinyanm Oct 4, 2026
c44a500
fix(hooks): classify-worker lock treats a fresh empty lockfile and EP…
Shahinyanm Oct 4, 2026
2d162b2
fix(mcp): event_add and artifact_add reject an unknown task_id
Shahinyanm Oct 4, 2026
2c52381
docs(mcp): describe task_search status filter, empty query and tasks …
Shahinyanm Oct 4, 2026
cc2664a
fix(hooks): drop dead FileChanged handler, watchPaths emission and as…
Shahinyanm Oct 4, 2026
5d5401e
Merge branch 'worktree-agent-a326bdd1f7ccd8a2e' into feat/0.30.0
Shahinyanm Oct 4, 2026
3d35d1c
fix(core): count chars for extractor thresholds and require a real gi…
Shahinyanm Oct 4, 2026
379b1f6
fix(hooks): scope the shared pending queue to the current project
Shahinyanm Oct 4, 2026
3e24122
fix(cli): export and events list skip malformed JSONL lines with a wa…
Shahinyanm Oct 4, 2026
d7595c9
refactor(core): remove unused dream backends and session discovery he…
Shahinyanm Oct 4, 2026
219a58a
fix(hooks): process pending entries oldest first
Shahinyanm Oct 4, 2026
bee8212
fix(cli): events list prints snake_case event type names
Shahinyanm Oct 4, 2026
d4c60b1
fix(core): dedup dream proposals against each other and across sessio…
Shahinyanm Oct 4, 2026
c531a0a
fix(dream): drop proposed events whose task id is not a session candi…
Shahinyanm Oct 4, 2026
fdddb72
fix(cli): md and html export derive task title and status like the SQ…
Shahinyanm Oct 4, 2026
31f2444
fix(dream): skip an unreadable session transcript instead of aborting…
Shahinyanm Oct 4, 2026
f014386
fix(cli): migrate-project re-keys embeddings and dream_state too
Shahinyanm Oct 4, 2026
5930338
fix(hooks): cap PostToolUse chunks and limit their heuristic to test …
Shahinyanm Oct 4, 2026
66244a2
perf(dream): read the events log once per run instead of once per ses…
Shahinyanm Oct 4, 2026
92c4993
fix(hooks): stamp session_id on rewind, auto-open and sync-classified…
Shahinyanm Oct 4, 2026
8ab801d
fix(cli): migrate-project checkpoints the WAL and moves SQLite sidecars
Shahinyanm Oct 4, 2026
958fac5
fix(cli): migrate-project --force no longer deletes the destination b…
Shahinyanm Oct 4, 2026
c706d5f
fix(hooks): keep model-switch constraints out of the reminder and cla…
Shahinyanm Oct 4, 2026
f31bb22
fix(cli): search and rejected --all-projects warn about projects they…
Shahinyanm Oct 4, 2026
2a63059
fix(tui): chat view title no longer panics on short or non-ASCII sess…
Shahinyanm Oct 4, 2026
0c73956
fix(dream): advance the watermark only past cleanly mined sessions on…
Shahinyanm Oct 4, 2026
74d4279
fix(tui): task detail reads the project given to ui --project, not cwd
Shahinyanm Oct 4, 2026
3c8e89a
fix(tui): ignore key release events so keys do not fire twice
Shahinyanm Oct 4, 2026
04dd0bc
fix(backfill): detect imported sessions by meta.session_id and index …
Shahinyanm Oct 4, 2026
6c7e44e
fix(tui): run every terminal restore step and report the first error
Shahinyanm Oct 4, 2026
074d910
fix(hooks): pending retry classifies through the worker's classifier …
Shahinyanm Oct 4, 2026
6ad8e6d
feat(cli): doctor reports whether codex is on PATH
Shahinyanm Oct 4, 2026
a502ca7
fix(cli): say that dream and backfill read Claude Code transcripts only
Shahinyanm Oct 4, 2026
c445f87
Merge branch 'worktree-agent-aa867c17aa6914684' into feat/0.30.0
Shahinyanm Oct 4, 2026
6e46687
Merge branch 'worktree-agent-a3cc772b2bdb5e6ab' into feat/0.30.0
Shahinyanm Oct 4, 2026
726a5a4
Merge branch 'worktree-agent-afd8f309a9ccc6f10' into feat/0.30.0
Shahinyanm Oct 4, 2026
db54119
fix(tui): cut session ids on a char boundary in the session list
Shahinyanm Oct 4, 2026
9caa6fb
fix(cli): migrate-project re-keys the project's rows in global memory
Shahinyanm Oct 4, 2026
f21d5cc
fix(cli): backfill --limit skips already-imported sessions before cut…
Shahinyanm Oct 4, 2026
d0c346a
fix(llm): name the binary that timed out instead of always claude -p
Shahinyanm Oct 4, 2026
ed0a5dc
fix(cli): rejected warns about rows it cannot read instead of droppin…
Shahinyanm Oct 4, 2026
a51bde0
fix(core): extractor counts chars and only treats a real test runner …
Shahinyanm Oct 4, 2026
c8f7762
fix(cli): --enrich says it reads Claude Code transcripts only when th…
Shahinyanm Oct 4, 2026
1e952f7
docs: describe the dream backend env vars the code actually reads
Shahinyanm Oct 4, 2026
060b9dd
test(cli): run every CLI test without real claude/codex, API keys or …
Shahinyanm Oct 4, 2026
44b75c9
fix(hooks): ingest-hook no longer deletes legacy pending entries it d…
Shahinyanm Oct 4, 2026
d9bd5f8
fix(core): terminate a torn last JSONL line before appending and writ…
Shahinyanm Oct 4, 2026
89745e2
refactor(hooks): synchronous ingest picks its classifier through buil…
Shahinyanm Oct 4, 2026
2057f39
feat(core): fall back to CODEX_THREAD_ID and CODEX_SESSION_ID for the…
Shahinyanm Oct 4, 2026
85f0b00
fix(hooks): push-recall shows each hit once per session and skips the…
Shahinyanm Oct 4, 2026
6b560f7
fix(core): run each schema migration in an immediate transaction and …
Shahinyanm Oct 4, 2026
0969add
feat(hooks): classic capture hooks and nudge stand down when TJ_MOD_A…
Shahinyanm Oct 4, 2026
f9d4ea7
feat(core): index meta.session_id on events and add active_task_for_s…
Shahinyanm Oct 4, 2026
72c895c
Merge branch 'worktree-agent-a29154483467dc00e' into feat/0.30.0
Shahinyanm Oct 4, 2026
48341c1
fix(core): record task goal and external refs in the journal so a sta…
Shahinyanm Oct 4, 2026
772cc62
fix(cli): close records the outcome through the close event, not a di…
Shahinyanm Oct 4, 2026
e268165
fix(cli): search with an empty query lists tasks newest first instead…
Shahinyanm Oct 4, 2026
7259aa5
fix(search): searching a project without a journal returns nothing an…
Shahinyanm Oct 4, 2026
6100afc
feat(mcp): optional session_id param on task_create, event_add, artif…
Shahinyanm Oct 4, 2026
c4ec608
test(core): serialize every env-touching tj-core test on one shared lock
Shahinyanm Oct 4, 2026
4c21134
Merge branch 'worktree-agent-a631dea79e99e31cc' into feat/0.30.0
Shahinyanm Oct 4, 2026
0ddb4ff
test(core): use the shared env lock in the codex timeout test after m…
Shahinyanm Oct 4, 2026
5eb4fca
feat(cli): state command and suggested/session/origin flags on event …
Shahinyanm Oct 4, 2026
28eebc5
fix(pack): drop corrected events from every pack section and export-pr
Shahinyanm Oct 4, 2026
d25552d
fix(pack): mark suggested decisions and rejections as unconfirmed
Shahinyanm Oct 4, 2026
773c8e8
fix(plugin): mod re-reads state when the session id moves and distill…
Shahinyanm Oct 4, 2026
2478e39
fix(core): keep compaction markers and model switches out of decision…
Shahinyanm Oct 4, 2026
b79b459
feat(mcp): take a Codex session id from the request _meta
Shahinyanm Oct 4, 2026
ebebb36
fix(pack): reserve room for the gap summary so truncation never cuts it
Shahinyanm Oct 4, 2026
8db72e3
fix(hooks): put the session's own task first for reminders and classi…
Shahinyanm Oct 4, 2026
0832b8e
docs: install guide per client, the Claude Code mod, Codex tool appro…
Shahinyanm Oct 4, 2026
2012dec
fix(pack): cache only the stable body and render linked status and ga…
Shahinyanm Oct 4, 2026
52b6842
fix(export-pr): list the pack's active decisions and rejections, mark…
Shahinyanm Oct 4, 2026
92739f2
fix(pack): skip only malformed alternatives and dedupe evidence like …
Shahinyanm Oct 4, 2026
311508c
fix(mcp): return generated_at and truncated in task_pack metadata
Shahinyanm Oct 4, 2026
924471f
test(pack): lock the header and section order of compact and full gol…
Shahinyanm Oct 4, 2026
5bb7a09
Merge branch 'worktree-agent-a262d197ff85249bb' into feat/0.30.0
Shahinyanm Oct 4, 2026
a816a39
chore: bump to 0.30.0
Shahinyanm Oct 4, 2026
49883f4
fix(recall): skip corrected events in recall and global memory sync
Shahinyanm Oct 4, 2026
ff81775
fix(db): leave artifacts of corrected events out of task_artifacts
Shahinyanm Oct 4, 2026
fcdf90d
fix(completeness): do not count corrected events as unconfirmed
Shahinyanm Oct 4, 2026
96dbea1
fix(cli): export-memory selects decisions and constraints like the pack
Shahinyanm Oct 4, 2026
5ec6e65
fix(plugin): pin the mod's task, read the start dir's journal, honest…
Shahinyanm Oct 4, 2026
484ea71
fix(hook): keep push-recall and /rewind when the mod is active
Shahinyanm Oct 4, 2026
97694b3
fix(plugin): keep an empty hooks record so pre-mod Claude Code accept…
Shahinyanm Oct 4, 2026
76db3c8
docs: what the mod replaces, old Claude Code, and restarting sessions…
Shahinyanm Oct 4, 2026
91e5fe4
fix(worker): use an OS lock and claim pending entries atomically
Shahinyanm Oct 4, 2026
6a97340
fix(migrate): re-key queued chunks and recall log, drop stale WAL, ba…
Shahinyanm Oct 4, 2026
bdd72e6
Merge branch 'worktree-agent-a17732fac32481598' into feat/0.30.0
Shahinyanm Oct 4, 2026
abaf96c
fix(db): replay the log in linear time and in resumable chunks
Shahinyanm Oct 4, 2026
e563e69
fix(db): replay the log when an older binary rewrote the index
Shahinyanm Oct 4, 2026
9b76014
fix(db): bind a session only to tasks it wrote to deliberately
Shahinyanm Oct 4, 2026
e00a359
Merge branch 'worktree-agent-a643ace2bcb73aad1' into feat/0.30.0
Shahinyanm Oct 4, 2026
6a86aa8
fix(core): state leaves corrected and bookkeeping entries out of coun…
Shahinyanm Oct 4, 2026
b5ab64e
fix(core): do not treat an empty .git directory as a project root
Shahinyanm Oct 4, 2026
464ad70
test(session): set mtimes explicitly in the newest-first discovery test
Shahinyanm Oct 4, 2026
ea2d9b9
Merge branch 'worktree-agent-a1f5bcba2fe4f56ed' into feat/0.30.0
Shahinyanm Oct 4, 2026
542f136
fix(search): break last_event_at ties by insertion order when listing…
Shahinyanm Oct 4, 2026
195ddee
fix(memory): keep suggested events out of the global memory index
Shahinyanm Oct 4, 2026
d286e44
test(cli): shim gh so close's harvest never reaches GitHub in tests
Shahinyanm Oct 4, 2026
e888308
docs: changelog for 0.30.0
Shahinyanm Oct 4, 2026
b93f481
chore: ignore the tsconfig Claude Code lays beside a mod it loads
Shahinyanm Oct 4, 2026
00bcece
build: update crossbeam-epoch, h2, rustls and anyhow past their advis…
Shahinyanm Oct 4, 2026
94b6271
test(cli): count a claimed .processing entry as queued and keep the m…
Shahinyanm Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .cargo/audit.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# cargo-audit configuration (read by `cargo audit` and the CI audit job).

[advisories]
ignore = [
# rmcp < 1.4: DNS rebinding in the Streamable HTTP *server* transport.
# task-journal-mcp only serves over stdio (transport-io), which the
# advisory states is not affected. Drop this once rmcp is upgraded to 1.x.
"RUSTSEC-2026-0189",
]
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
},
"metadata": {
"description": "Task Journal — append-only reasoning chain memory for AI-coding tasks",
"version": "0.29.0"
"version": "0.30.0"
},
"plugins": [
{
"name": "task-journal",
"source": "./plugin",
"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.",
"version": "0.29.0",
"version": "0.30.0",
"author": {
"name": "Digital-Threads"
},
Expand Down
26 changes: 26 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,34 @@ on:
workflow_dispatch:

jobs:
# A tag doesn't wait for CI, so a tag on a red commit would publish. Gate on
# the same checks as ci.yml's test job.
test:
name: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: cargo fmt
run: cargo fmt --all --check

- name: cargo clippy
run: cargo clippy --workspace --all-targets -- -D warnings

- name: cargo test
run: cargo test --workspace --all-targets

publish:
name: cargo publish
needs: test
runs-on: ubuntu-latest
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
Expand Down
26 changes: 26 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,34 @@ env:
CARGO_TERM_COLOR: always

jobs:
# A tag doesn't wait for CI, so a tag on a red commit would ship binaries.
# Gate on the same checks as ci.yml's test job.
test:
name: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: cargo fmt
run: cargo fmt --all --check

- name: cargo clippy
run: cargo clippy --workspace --all-targets -- -D warnings

- name: cargo test
run: cargo test --workspace --all-targets

build:
name: build (${{ matrix.target }})
needs: test
strategy:
fail-fast: false
matrix:
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@

# Local design specs & plans (not versioned)
.docs/

# Types Claude Code lays beside a mod it loads from this folder
plugin/.claude-plugin/types/
plugin/tsconfig.json
86 changes: 86 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,92 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.30.0] - 2026-10-04

Claude Code 2.1.287 added mods: plugins that run inside Claude Code and can
shape the system prompt, the compaction and the status line. This release ships
a Task Journal mod, makes every session (Claude Code and Codex alike) keep its
own active task, and fixes what a full audit of the journal turned up.

### Added
- **Task Journal mod for Claude Code 2.1.287+**, bundled with the plugin
(`plugin/hooks/`). It keeps the session's active task in the system prompt, so
a compaction can no longer lose it, and asks the compaction summary to keep
the task id. Right before a compaction it asks the model what was decided but
never logged and records those as `suggested` events. It shows the task in
the status line, toasts each entry, and reminds the agent to log only after
several prompts without an entry. Options: `nudge_after_turns`,
`distill_on_compact`. While it runs, the classic hooks skip what it replaces
(the reminder, per-message classification, the transcript catch-ups) and keep
the rest (resume packs, push-recall, `/rewind`). On Claude Code older than
2.1.287 the mod doesn't load and everything else works as before.
- **Per-session active task.** Events carry their session id and the index
keeps it, so two sessions in one project each resume their own task instead
of whichever task was touched last. Codex sessions bind the same way: the MCP
server reads the session id Codex sends with each tool call. Only deliberate
writes bind a session — a hook's model-switch note or a classifier's guess
landing on another task no longer pulls a fresh session onto it.
- `task-journal state [--session] [--prefer]`: the session's active task,
counts and latest entries as JSON (schema `tj-state/1`).
- `task-journal event --suggested --session --origin` for integrations, and an
optional `session_id` on the MCP write tools.
- `task_search` honours `status` and `project`; with an empty query it lists the
project's tasks, and its result gains a `tasks` field (title, status, goal).
- `doctor` reports whether `codex` is on PATH.

### Fixed
- **Re-indexing is linear and resumable.** Rebuilding the index cost time
quadratic in the journal's size (a 7,000-event journal: ~30 s); it is now
linear (~1.5 s for the same journal), commits in chunks, and a run that is
cut off picks up where it stopped instead of starting over.
- **An older binary next to this one can't corrupt the index.** A 0.29 server
still running in an open session would rebuild the index without the new
columns; the next 0.30 call now notices and repairs it.
- **Goals and external links survive a rebuild.** They lived only in SQLite; a
rebuild from the log dropped them, Loom links included. They are now in the
journal (on the open event, or an `amend` event for later changes).
- **Corrections take effect.** A `correction` now hides the event it corrects
from every pack section and from `export-pr`.
- **Packs say what is unconfirmed.** Suggested decisions and rejections are
marked; compaction markers and model-switch records no longer appear as
decisions, in `export-pr`, in recall or in global memory; a compact pack keeps
its gap summary; a cached pack no longer shows stale linked-task status.
- **Auto-capture stays in its project.** The shared `pending/` queue was
processed by whichever project's worker ran first, so one project's chunks
could land in another's journal. Entries are now scoped to their project,
processed oldest first, and the classify worker holds an OS file lock, so two
workers can no longer pick up the same chunk.
- A crash mid-write no longer costs the next event too; schema migrations are
atomic and safe when two processes open a fresh database.
- `PostToolUse` chunks are capped and no longer turn tool output into bogus
`constraint` events; push-recall shows each hit once per session.
- `pending retry` really retries, and `ingest-hook` no longer deletes failed
chunks before they can be retried.
- The `codex` backend no longer triggers your own Codex hooks from inside a
`dream` or `complete` run.
- `dream` no longer skips sessions forever after a scoped or partly failed run,
drops events for task ids the model made up, and survives an unreadable
transcript. `backfill` detects imported sessions reliably and indexes them.
- FTS search no longer fails on punctuation or words like `AND`.
- An empty `.git` directory (as Codex's sandbox briefly mounts in `/tmp`) is no
longer taken for a repository root; like git, a `.git` directory needs `HEAD`.
- `task_close` harvests artifacts from the project dir; `event_add` and
`artifact_add` reject unknown task ids instead of writing orphan events.
- `migrate-project` carries the WAL, the pending queue and the push-recall log
along, and keeps a backup of a destination journal it replaces.
- `export`, `events list`, `rejected`, the TUI and the extractor got smaller
fixes (malformed lines, char-safe ids, key repeats, char counts).

### Changed
- The removed `ClaudeBinaryRunner`, the unused dream backends and the
`FileChanged` / `watchPaths` / `TJ_ASYNC_REWAKE` paths are gone; they were never
reachable.
- `task-journal-core` is pinned once in the workspace; publishing waits for fmt,
clippy and tests to pass.
- An `amend` line is skipped (with a warning) by binaries older than 0.30.0.
- After upgrading, restart open Claude Code and Codex sessions; the first
command re-indexes the project once.

## [0.29.0] - 2026-09-25

Three months of Claude Code releases (2.1.196 → 2.1.281) changed how hooks are
Expand Down
50 changes: 25 additions & 25 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading