v2.7.0
This release rounds out the MCP surface (the agent-facing side of journal),
makes decisions & todos first-class, and adds project tooling — a docs site,
a curated release pipeline, and the agentic-workflow layer.
Added
- MCP
synthtool. The MCP server now exposes synthesis as asynthtool so
MCP clients (e.g. an agent drafting a weekly Slack summary) can run
weekly|daily|meetings|decisions|stalesynthesis jobs without shelling out to
the CLI. By default the tool calls the synthesis provider and returns the
generated text without writing a file (persist: false); setpersist: trueto
also write the draft note to disk, mirroringjournal synth --write. Honors
synth_provider,local_only, andvoice_profileexactly as the CLI does;
returns a clean{"error":"…"}when synthesis is unavailable.
Optional scoping params:kind(defaultweekly),days,project,date. - MCP
asktool — runs retrieve→synthesize and returns
{answer, citations}(grounded text +path:linereferences) so clients get a
direct "what did I decide about X" answer instead of raw chunks. When no chunks
match, returns "No relevant notes found." rather than calling the model
ungrounded. Honorslocal_only/ provider availability with a clear error
(#32). - MCP
statsandtodaytools — the same stable JSON as
journal stats --json/journal today --json, for "how's my note volume" and
"what does my day look like" (#31). - MCP resources —
journal://today,journal://recent, and
journal://projects/{slug}/indexexpose raw Markdown as addressable context via
resources/list/resources/read, so clients can pull journal context without
orchestrating tool calls. URIs are stable across server runs
(#37). - MCP prompts —
weekly reflection,decisions review, andproject status
are exposed as first-class, one-click prompts with journal context pre-assembled
(reusingsynth.AssembleWeekly/AssembleDecisions)
(#44). journal tags— list distinct#tagswith usage counts, and
journal tags rename <old> <new>rewrites a tag across all notes, re-indexes the
affected files, and auto-commits (--dry-runpreviews). Boundary-aware so#foo
isn't matched inside#foobar(#33).- First-class decisions & todos. Dedicated capture commands, crisp
date/statement/citation rendering, proactive surfacing injournal today, and
resolution notes onjournal done. Fully backward compatible — existing
@decision/@todo/@doneblocks parse and surface unchanged
(#47). - Documentation site at https://journal.eamann.com — an mdBook site
(Catppuccin Latte) with warm, second-person prose across 14 chapters (install,
capture, search, synthesis, meetings, configuration, integrations). Additive: the
docs/tree is untouched (#38). - One-click releases. A
prepare-releaseworkflow (Actions → Prepare Release →
version) finalizes the## [Unreleased]CHANGELOG section to the version, tags,
and triggers the Release workflow; and the GitHub Release notes now come from the
curated CHANGELOG section (scripts/changelog-section.sh+ GoReleaser
--release-notes) instead of an auto-generated commit list. See
docs/RELEASING.md. Deterministic, project-specific tooling. - Agentic-workflow layer +
CLAUDE.md. GitHub Actions for agent-ready issues
(auto-label → trigger → PR), a planning-approval gate for high-complexity work,
@claudePR feedback (gated to write-access collaborators), and a retro flow;
plus issue/PR templates, a label set, and a contributor guide grounded in the
real layout. Contributor/CI tooling — no change to the shipped binary
(#25).
Changed
- Better LLM-as-reranker quality. The rerank prompt is now a structured
relevance rubric (0/5/10 anchors) instead of "reply with only the number", and
score parsing is a robust multi-strategy parser (N/10fraction → labelled
Score: N→ last in-range number, skipping negatives). More reliable precision
on the optional reranking path (#36).
Fixed
journal index --watchsurvives transient embed failures. A per-file embed
error during a watch pass is now logged and skipped (continue) instead of
aborting the whole batch; only context cancellation still stops the run.
Debounce coalescing of rapid edits is now covered by tests
(#35).- Indexing retries transient Ollama embed-server failures (sporadic
400/
EOF) instead of failing the run, hardening largejournal indexpasses
(#7).