✨ Try our AI novel writing platform → StoryAlter.com
#MD SoloMD

v4.0 · the editor where agents live

Agents in SoloMD

SoloMD v4.0 turns the workspace into a place where agents work continuously, not just on-demand. Five pillars, all on top of plain markdown files you already own. Every autonomous write goes through an AutoGit branch sandbox you accept or reject before it lands.

1. Inline Agent Panel

A right-side panel, peer to Outline / Backlinks. Streamed chat-with-vault, routed through the in-process MCP tools and the existing 14-provider AI stack. Citations resolve to [[wikilink]] chips that open the cited note in a new tab. Tool-call cards (Cursor-style) show every read and write inline — expand a card to see the full args and result.

Run history persists as plain markdown in <workspace>/.solomd/agent-runs/<ts>.md. Grep-able. Git-trackable. The opposite of a black box.

  • Open with ⌘⇧A or the right-rail toggle
  • Active note toggle injects the current document into the system prompt — opt-in, off by default
  • Allow write toggle gates write_note and append_to_note per chat session
  • 10 in-process agent tools — same surface as the bundled MCP server

2. Scheduled Recipes

A recipe is one YAML file under <workspace>/.solomd/agents/*.yml. No build step, no plugin manifest. Edit, save, run. Five trigger modes:

TriggerFires when
schedulecron expression matches the current UTC minute
on-savea markdown file matching match: is saved (debounced 800ms)
on-commitan AutoGit commit lands and touches match:
on-tag-adda note gets #tag added that matches tag:
manualyou click Run now in Settings → Recipes

Example recipe:

name: Weekly review
trigger: schedule
schedule: "0 18 * * SUN"        # cron, UTC
match: "daily/**/*.md"
prompt: |
  Read this week's daily/ notes.
  Write weekly/{{date:YYYY-WW}}.md: themes / decisions / open threads.
allow-write: true
write-cap: 5
provider: claude

Triggers compose with the safety model below — every run begins on its own AutoGit branch agent/<recipe>/<run-id>, and writes are reviewable, not magical.

3. Trace view + replay

Every run (Panel chat or Recipe) emits <workspace>/.solomd/agent-runs/<run-id>/trace.jsonl — line-delimited so you can tail -f a long run while it's still going. Schema: one JSON object per step, with kinds run_started · prompt · model_call · tool_call · tool_result · git_commit · run_ended. Fields include timestamps, tool args, truncated results (≤ 2048 chars), token counts, cost estimate.

The UI renders these as collapsible step cards:

  • Inline in the Panel after the chat
  • Settings → Recipes → History (one entry per run)
  • Step-detail drawer for the full result body
  • Replay-from-step N mints a new run that re-uses every line up to step N and then re-runs the model. Useful when the model took a bad turn at step 7 and you want to retry the decision with a different prompt.
  • New read_agent_trace(run_id) MCP tool — agents can now read their own traces, opening the door to self-correcting recipes.

4. Workspace Federation

The bundled solomd-mcp grew a multi-workspace mode in v4. Pass any number of --workspace flags to bridge multiple vaults in a single MCP session:

solomd-mcp \
  --workspace ~/Vaults/personal \
  --workspace ~/Vaults/work \
  --workspace ~/Vaults/research

Tool signatures gain an optional workspace param. Default = first-passed (back-compat). AutoGit branches stay isolated per workspace. Settings → Integrations adds named MCP profiles — workspace bundles you can one-click copy a Claude Desktop config block out of.

Today users open multiple Claude Code sessions to bridge two vaults. v4 makes one session enough.

5. Ollama first-class

We don't bundle a local LLM runtime. Ollama is already in our 14-provider list and does this well — re-implementing it would violate principle #7 (write less code we maintain forever). Instead, v4 polishes the integration:

  • Auto-detect Ollama at localhost:11434 with a green status indicator in Settings → AI.
  • Install Ollama button if it's not detected (links to ollama.com — we don't proxy the download).
  • /api/tags lists installed models inline; empty list → Pull recommended (qwen2.5:1.5b, ~1 GB) button.
  • 3 built-in presets: rewrite (qwen2.5:7b) · quick (qwen2.5:1.5b) · CJK-friendly (qwen2.5:14b).
  • Recipes can specify provider: local as a default → cheap autonomous loops on-device.

11 starter recipes

Open Settings → Recipes → Browse cookbook to install any of these. The YAML copies to .solomd/agents/ and opens for editing. Re-installable with auto-suffixed names.

  • 01-weekly-review.yml — Sunday 18:00 UTC, summarizes daily/*.md into weekly/YYYY-WW.md
  • 02-todo-extract.yml — on-save scans for - [ ] items, accumulates into todo.md
  • 03-translate-zh-to-en.yml — manual; round-trip translate the active note
  • 04-cjk-proofread.yml — on-save Chinese / Japanese / Korean grammar pass via Ollama (provider: local)
  • 05-citation-cleanup.yml — on-commit normalizes @citekey formatting
  • 06-meeting-notes-summary.yml — on-tag-add #meeting extracts decisions + action items
  • 07-link-suggester.yml — read-only, suggests [[wikilinks]] in the trace view (no writes)
  • 08-daily-summary.yml — every night 22:00, write a TL;DR into today's daily note
  • 09-orphan-notes.yml — weekly scan for notes with zero backlinks, list them in orphans.md
  • 10-on-commit-changelog.yml — on-commit appends a one-line summary to CHANGELOG.md
  • 11-tag-classifier.yml — on-save suggests #tags based on note content (read-only)

Safety model — the AutoGit sandbox

Every recipe run begins by:

  1. Creating a fresh AutoGit branch agent/<recipe-slug>/<run-id> off the current HEAD.
  2. Running the prompt + tool loop. All write_note / append_to_note calls land on this branch.
  3. On success the run goes into Pending review with three buttons: View diff, Accept (fast-forward into main), Reject (delete the branch entirely).

A rejected run vanishes — no merge, no leftover commits in your history. An accepted run shows up in git log like any other commit.

The write-cap is enforced before dispatch, so a model that asks to write 100 files when the cap is 5 will get refusals starting at the 6th call, with no half-applied state. Default 5; hard upper bound 50.

Write your own

The full schema, every variable ({{path}}, {{date:YYYY-MM-DD}}, {{files}}, ...), every tool the agent can call, and the patterns that actually work in production live in docs/agents.md in the repo:

Read docs/agents.md →

Schema is the source of truth in app/src-tauri/src/recipes.rs — Rust types, not a paper spec.

中文版 · /security · Home