Releases: Kashkovsky/threadnote
1.4.3: repair-semantic-queue recovery for the OV poison loop
Patch release: a recovery path for the OpenViking semantic-queue poison loop (#2734).
- New
threadnote repair-semantic-queue [--apply]patches the installed OpenViking to skip non-directory/missing memory URIs and restarts the server, so a stuck semantic message — a memory file enqueued for directory-level processing — drains on the next dequeue instead of re-enqueuing forever (the AGFS-persisted entry survives a restart otherwise). Idempotent, keeps a.threadnote-bak, and compile-checks the patched file before writing. threadnote updateoffers it as a post-update step (with the usual consent prompt).
Temporary bridge: it no-ops once the pinned OpenViking includes the upstream fix (volcengine/OpenViking#2735).
1.4.2: doctor recall-shape fix + MCP stale-version reconnect nudge
Patch release: OpenViking 0.4.4 diagnostics fixes.
doctorrecall-shape probe no longer false-warns on a healthy OpenViking 0.4.4.ov find/search --output jsonprints acmd: ...preamble before the JSON and nests the buckets under aresultenvelope; the probe now parses exactly like recall does instead of warning "search output is not JSON".- MCP server now nudges you to reconnect after a
threadnote update. The MCP server is a long-lived stdio process the client doesn't respawn mid-session, so an update silently left it running old code.recall_context/remember_context/healthresults now carry a one-line "reconnect (/mcp) to load the update" notice when a newer threadnote is installed on disk.
1.4.1: fix OpenViking 0.4.4 recall breakage and bound the reindex hang
Patch release fixing two OpenViking 0.4.4 interop regressions.
- Recall (and every
ovcall) broken on OpenViking 0.4.4. 0.4.x removed the--agent-idflag from everyovsubcommand and droppedagent_idas an HTTP identity input, so the 1.4.0 pin made everyovinvocation fail withUnexpected argument: --agent-id— recall included. Identity is now--account+--useronly. - AGFS memory-reindex hang bounded. A
context_type=memorysemantic queue entry pointed at a memory file fails OpenViking's_process_memory_directoryand re-enqueues forever, starving the queue;ov reindexhas no--timeout, so the post-write refresh and index repair could block for the full 10-minute command timeout. Both reindex waits are now bounded byreindexWaitTimeoutMs(default 120s, overrideTHREADNOTE_REINDEX_TIMEOUT_MS).
Anyone on 1.4.0 should upgrade — recall is broken there against OpenViking 0.4.4.
1.4.0: OpenViking 0.4.4 pin, version/drift hardening, opt-in seed watches
Pins OpenViking to 0.4.4 (from 0.3.24). The 0.3.x→0.4.x transition is compatible as-is: memories already write to viking://user/, --agent-id stays a supported transition shim, and the ov version / find/search JSON / auth surfaces are unchanged.
Hardening:
compareVersionsnow ignores+buildmetadata, parses core segments as leading integers, and ranks PEP 440 post/pre-releases, so a local0.4.4+localbuild is no longer misread as0.4.0and re-upgraded in a loop.doctorwarns when the installed OpenViking is older than the pin (install/doctordon't upgrade it — onlyrepair/updatedo) and probes that recall'smemories/resources/skillsJSON buckets are intact.- Dropped the unused
ov_searchpeerId/peer_idparams and de-duplicatedwithIdentity.
New:
- Opt-in
THREADNOTE_SEED_WATCH_INTERVAL=<minutes>lets OpenViking auto-refresh seeded repo docs betweenthreadnote seed/repairruns. Off by default; a watch attaches only to original, non-redaction-prone files, since an OpenViking-managed refresh re-ingests the file without Threadnote's per-import secret scan.
1.3.3: memory-file reindex hang fix
Fix Threadnote memory writes so the defensive post-write refresh no longer asks OpenViking to run semantic directory reindexing on a .md memory file URI.
refreshMemoryIndex() now uses ov reindex --mode vectors_only for the written file, preserving leaf/detail recall vector freshness without creating failing semantic queue work.
Directory-level recall index repair still uses semantic_and_vectors on directory URIs.
1.3.2: dependency security updates
Patch release clearing all open npm audit findings (2 high, 2 moderate). Dependency-only — no runtime behavior change.
- esbuild 0.27.7 → 0.28.1 (GHSA-gv7w-rqvm-qjhr, high)
- hono 4.12.23 → 4.12.25 via
@modelcontextprotocol/sdk(GHSA-88fw-hqm2-52qc + 4 more, high) - js-yaml 4.1.1 → 4.2.0 (GHSA-h67p-54hq-rp68, moderate)
- brace-expansion 5.0.5 → 5.0.6 via eslint (GHSA-jxxr-4gwj-5jf2, moderate)
- dev tooling: eslint 10.3.0 → 10.5.0, prettier 3.8.3 → 3.8.4, @types/react 19.2.16 → 19.2.17
npm audit now reports 0 vulnerabilities.
Also bumps the package version to 1.3.2.
1.3.1: PR share instructions
Updates the injected agent guidance for PR/review creation so agents check configured Threadnote shares first, and requires explicit user confirmation before publishing a durable feature memory for reviewers, including team selection when multiple shares are configured.
Also bumps the package version to 1.3.1.
1.3.0: multi-file skills & packs, plus a guided onboarding tool
Two features since 1.2.0: skill sharing grows from a single SKILL.md to whole directories and multi-skill packs, and a new onboarding tool guides newcomers through Threadnote on request.
Multi-file skills. share publish-artifact / share_skill now carry the SKILL.md's whole directory — companion scripts, references, assets — under agent-artifacts/skills/<agent>/<name>/, recorded in a generated .threadnote-bundle.json. A lone SKILL.md publishes byte-for-byte as before. Every text member runs through the scrubber; binary members are blocked by default (--allow-binary to include) and byte-scanned for embedded credentials/paths.
Constellation packs. For skills whose shared code lives outside any single skill dir (repo-root scripts//lib/), a threadnote-bundle.json manifest declares the skills, shared include paths, deps, and path rewrites. share publish-bundle <manifest> / share_bundle writes agent-artifacts/packs/<agent>/<name>/{<name>.pack.md, <name>.pack.json, files/<verbatim tree>}; install materializes the whole tree under one root (~/.{codex,claude}/skills/threadnote-packs/<team>/<name>/) and expands a ${THREADNOTE_PACK_ROOT} token so hardcoded repo-root paths resolve. Packs install in a namespace disjoint from skills, so a pack and a same-named skill never collide.
Guided onboarding. A new threadnote_guide MCP tool: ask your agent "what can I do with Threadnote?" and it returns a setup-aware walkthrough (server health, configured share teams, seeded projects) for the agent to present and offer to run step by step. The walkthrough loads only when the tool is invoked — the only always-on cost is the tool's description.
Sharing safety. The scrubber covers every text member, the pack index, and the manifest; a residual machine-local /Users//home path blocks publish (other absolute paths warn). Install validates member paths against ../absolute traversal. Publish rolls back this run's writes on failure (restoring a replaced pack on --force); install swaps via backup-rename; per-member status folding refuses to clobber local edits without --force. Only .md is OpenViking-ingested for recall; the file tree is git-carried.
Also:
- Pins the local Node version to 22.22.0 via
.nvmrc. - Bumps the package version to
1.3.0.
1.2.0: smarter recall ranking with per-category reserve
Reworks recall ranking so the most relevant context leads, across both the CLI recall and the MCP recall_context — they now share one pipeline (buildRecallSections).
Exact-match ranking. Exact (lexical) grep matches used to print as an unranked sidecar after the semantic top-N, burying canonical docs that scored below the semantic threshold or sat in the compressed score band.
- Semantic hits an exact term also matched are annotated (
exact: <terms>). - Exact-match docs with no semantic hit are promoted into the ranked list (rendered
exact:), categorized from their URI. - Ranking is category-first → exact-term count → semantic score. The sidecar now lists only matches not already shown.
Per-category reserve. selectShownHits reserves up to RECALL_CATEGORY_RESERVE (2) slots per category before filling the rest of the window by global rank, so a memory-heavy result no longer crowds seeded resources and skills out of view. Memories still lead and take every leftover slot; under a tight nodeLimit the reserve is best-effort by priority.
Also:
- Memories rank ahead of resources ahead of skills;
dedupeByContentcollapses resource/skill hits with identical snippets (memories never collapsed), after exact-boost so an exact-matched twin survives. - Seeding ignores
.claude/worktrees/and.worktrees/. - MCP
grepdefaultsurito the caller's memories root instead of erroring when omitted. - Bumps the package version to
1.2.0.
PR: #28
1.1.6: recall ranks memories before resources and skills
Recall now orders results category-first instead of by raw score, so personal memories always lead and seeded resources/skills only follow. Previously a high-scoring seeded resource or skill could outrank actual memories in the merged list.
RecallHitcarries acategory(memories/resources/skills) taken from the authoritativeov searchJSON bucket key, not the loosercontext_typestring.- New
RECALL_CATEGORY_ORDERis the single source of truth:mergeRecallHitssorts by category index first, thenscoredescending within each category. A 0.50 memory now ranks above a 0.90 resource. - Both CLI
threadnote recalland MCPrecall_contextflow throughmergeRecallHits, so both inherit the ordering. - Bumps the package version to
1.1.6.
PR: #27