The command line
The plugin registers three subcommands with Obsidian’s own CLI, so a review can be driven from a terminal, a script, or an agent.
obsidian editor-ai-daemons:review --file "Some Note" --format text
obsidian editor-ai-daemons:status --file "Some Note" --format text
obsidian editor-ai-daemons:cancel --file "Some Note"
Requires Obsidian 1.12.2 or newer, on desktop — the same floor the plugin itself requires, since 1.12.2 is the release that added the API.
Not to be confused with CLI backends, which are the other direction: an AI agent running on your machine as a backend.
editor-ai-daemons:review
Review a note with the configured AI editors.
| Flag | Value | Notes |
|---|---|---|
--file | <path> | Required. Vault path, with or without .md, or link text |
--editors | <ids-or-names> | Comma-separated; overrides a matching rule. Default: the note’s own pool |
--format | json | text | Default json |
--confirm-large | flag | Confirm reviewing a note above the size warning threshold |
It runs through the exact same pipeline as the Review current note command, so it refuses for the same reasons and honours the same rules, exclusions and size guard. --editors is a choice you made, so it wins over a rule that assigns a reviewer to the note — rules only supply the default. An unknown or disabled name fails the whole call rather than silently reviewing with fewer editors. It waits for the run to settle — including the panel scorecard when the run is a panel run — and then prints one document.
If the note is open in a markdown view, the snapshot comes from the live editor buffer (unsaved edits included), the run is bound to that view, and the findings show up on the rail, in the highlights and in the panel just like a review you started by hand. If the note is not open, the saved file is used and the run is discarded once the output is shaped.
JSON output
{
"ok": true,
"file": "Some Note.md",
"findings": [
{
"id": "…",
"editor": "Concision Editor",
"severity": "suggestion",
"quote": "in order to",
"critique": "…",
"edits": [
{
"op": "replace",
"text": "to",
"anchor": { "from": 412, "to": 423, "state": "anchored" }
}
],
"anchor": { "from": 412, "to": 423, "state": "anchored" }
}
],
"skips": [{ "editor": "Fact Checker", "reason": "no model configured" }],
"summaryByEditor": { "Concision Editor": "…" },
"panel": null,
"error": null
}
anchor is null when the quote could not be located in the note. panel carries the scorecard — verdict, rationale, per-member verdicts, ranked top fixes with the quote they point at, dissent, and the members that produced nothing — on a panel run, and is null otherwise.
Text output
One line per finding:
[suggestion] Concision Editor 412-423: "in order to" — Three words doing one word's work -> [replace] to
Skipped Fact Checker: no model configured
An unanchored finding prints unanchored where the offsets would be; a stale one prints 412-423 (stale). No findings. when there are none. A panel run appends its verdict, one line per member, the ranked fixes and each disagreement.
Error codes
Errors are typed so a script can branch on them, and the messages are status-only — nothing model- or backend-derived is echoed.
| Code | Meaning |
|---|---|
bad-args | A flag is missing or unparseable — distinct from the note not existing |
file-not-found | No markdown note at that path |
excluded | The note is privacy-excluded |
rule-disabled | A binding rule switched the plugin off for it; names the rule |
needs-confirmation | Above the size threshold; re-run with --confirm-large |
no-editors | Nothing could run; skips says why for each |
panel-unavailable | The assigned panel cannot run |
backend-error | The run failed |
timeout | The run timed out |
editor-ai-daemons:status
Show the state of the AI review run for a note. Read-only: it starts nothing and spends nothing.
| Flag | Value | Notes |
|---|---|---|
--file | <path> | Required |
--format | json | text | Default json |
Text output is a headline plus the same finding lines as review:
Run in progress (2 running, 1 done) — 4 findings so far
or Run settled (3 done) — 7 findings, or No run for Some Note.md. when nothing is tracked. The JSON document carries run.settled, one entry per editor with its status and (redacted) error, the findings in the same shape as review, and the per-editor summaries.
editor-ai-daemons:cancel
Cancel the in-flight AI review of a note.
| Flag | Value | Notes |
|---|---|---|
--file | <path> | Required |
JSON only. {"ok":true,"file":"…","cancelled":true} when something was cancelled, or cancelled: false with a reason of no-run or already-settled. Both of those are successes: asking to cancel nothing is not an error.
Scripting notes
- Every subcommand always answers with parseable output, including on failure. Nothing throws through the CLI surface.
--format textis for humans and greps;--format jsonis for programs. The finding line format is identical betweenreviewandstatus.- A CLI review of an open note behaves as a real review of that note: cancel it with
editor-ai-daemons:cancel, or from the rail. - Batch use: prefer notes that are not open. Runs on open notes stay in memory so their highlights keep working.