← All Docs

CLI Reference

Complete reference for all Lore CLI commands.

Setup & Auth

CommandDescription
lore setupGuided wizard — configure API keys, sign in, create data repo
lore setup --openai-key <key> --anthropic-key <key> --email <email>Non-interactive setup (sends OTP, exits)
lore setup ... --code <code>Complete non-interactive setup with OTP code
lore auth loginSign in with email OTP
lore auth login -e user@example.comSign in with specified email
lore auth login -e user@example.com --send-onlySend OTP and exit
lore auth login -e user@example.com --code <code>Verify OTP non-interactively
lore auth logoutClear session
lore auth whoamiShow current authentication status

Search & Research

CommandDescription
lore search <query>Hybrid search (semantic + keyword)
lore search <query> --mode semanticVector similarity only
lore search <query> --mode keywordFull-text search only
lore search <query> --project <name>Filter to project
lore search <query> --tags <a,b>Filter to sources matching ANY listed tag
lore search <query> --entities <a,b>Filter to sources mentioning ANY of these entities (UUIDs or names)
lore search <query> --since 7dOnly sources from last 7 days
lore search <query> --since "last week" --before 2025-01-01Date range filter
lore search <query> --sort recentSort by date instead of relevance
lore search <query> --jsonEmit the result set as JSON (no headers, no rendering)
lore research <query>AI-powered deep research (standard depth)
lore research <query> --depth quickQuick research (~30-60s, 3-5 sources)
lore research <query> --depth deepExhaustive research (~4-8 min)
lore ask <question>AI-powered Q&A — searches sources, synthesizes answer with citations
lore browseInteractive TUI browser with edit, search, and re-indexing

Project Briefs

CommandDescription
lore brief <project>View the current brief for a project
lore brief section <project> <section>Show a single addressable section (current_state, open_questions, key_evidence, trajectory, recent_changes) plus its per-section metadata — version, content hash, staleness
lore brief generate <project>Generate or refresh a project brief
lore brief generate <project> --focus "UX"Generate with a specific focus area
lore brief listList all briefs with staleness info
lore brief history <project>Show version history
lore brief diff <project>Compare latest brief with previous version

Project briefs are living synthesis documents that evolve as new sources enter. They track current state, key evidence with citations, open questions, and project trajectory. Briefs auto-update when material content is ingested into a project (debounced 60s for projects, 30s for workstreams), so they stay current without manual intervention. Log entries don't trigger regen — they're folded in at the next material regen.

Project Context & Corrections

CommandDescription
lore context compile [task]Compile operating context — the inherited brief stack + task-scoped evidence in one call. Omit the task for boot mode; add --json for the full response envelope
lore context compile --project <slug> --workstream <slug>Scope the compiled context to a project / workstream
lore context add <project>Add project knowledge into ./.lore/ for coding agents
lore context add <project> --target <repo>Add Lore context to a specific repo or workspace
lore context add <project> --limit <n>Add a smaller working copy for a narrow task
lore context listShow repos with daemon-managed Lore context
lore context statusShow clean, modified, missing, stale, deleted, and conflicted snapshots
lore context removeRemove the generated .lore/ working copy from the repo
lore statusWhere am I, what's pending — workspace, repos, changes, daemon, push queue
lore status --terseOne-line summary suitable for shell prompts and scripts
lore status --landingWorkspace-glance text snapshot (mirrors the TUI landing view: brief freshness, project tree, recent activity). Useful in pipes, CI, and non-TTY contexts where lore browse errors. Add --json for machine output.
lore status --activityWorkspace activity feed (sources + procedures). Mirrors the TUI activity panel; filterable by --actor <name>, --actor-kind <human|agent>, --kind <artifact|log|procedure|research>, --since <duration>. Defaults to last 24h. Add --json for machine output.
lore diff [id]Show colorized change diffs; omit id to show all active diffs (≈ git diff)
lore changes apply [id|--all]Publish reviewed changes to canonical Lore (≈ git push)
lore changes discard [id|--all]Drop a working-copy edit, refresh the snapshot from canonical (≈ git restore)
lore changes merge <id>LLM-assisted three-way merge for a conflicted change (≈ git merge)
lore browse --context-target <repo>Open Browse with that repo's change inbox

lore context add includes all non-deleted project sources by default, writes copied snapshots instead of symlinks, and registers the repo for daemon refresh. It also writes .lore/.gitignore so generated context stays out of the host repo unless you intentionally change that. Empty projects are allowed: Lore creates the scaffold now and the daemon populates it after sources for that project exist.

A repo-local .lore/ working copy currently tracks one Lore project. Running lore context add <other-project> replaces clean context; active proposals must be reviewed or explicitly discarded with --force.

lore context remove is the safe off switch. It unregisters daemon refresh, removes only the generated working copy, refuses to discard active proposals unless you pass --force, and leaves canonical Lore unchanged.

Ingest

CommandDescription
lore ingest "content"Ingest inline content
lore ingest --file ./notes.mdIngest from a file
echo "..." | lore ingestIngest from stdin/pipe
lore ingest "content" -p myproject -t "My Title"With project and title
lore ingest --file doc.md --type meeting --url https://...With metadata
lore ingest --file fixed.md --replaces <id> --reason "..."Correct a source with a versioned replace

Correcting a source. lore ingest --replaces <id> --reason "<why>" supersedes an existing source with new content, creating a v2 in its version chain while v1 stays immutable — the by-id correction primitive with provenance, no .lore/ working copy required. <id> is a full source id or an unambiguous 8+ char prefix. Tags and project/workstream routing inherit from the parent (passing --tags / --project / --workstream is an error, not a silent no-op); --title / --type / --url / --name are optional overrides. Identical content short-circuits as a no-op; a stale parent prints the current chain head and a ready-to-run retry. This is the CLI surface for the same path the MCP ingest tool exposes via replaces + reason. In-place action: update stays MCP-only — versioned replace is the correction primitive on the CLI.

Log

CommandDescription
lore log add "message" -p <project>Add a log entry (-w/--workstream <slug> attaches it to a workstream)
lore log show <project>Show log entries
lore log update <id> <message>Update a log entry
lore log delete <id>Delete a log entry
lore log clear <project>Clear all log entries for a project

Log entries are lightweight status updates, decisions, and progress notes. They are searchable via search and included in project briefs, but hidden from list_sources by default. The MCP log tool writes the same shape — lore log add is its CLI mirror.

Sync & Sources

CommandDescription
lore syncSync all configured sources
lore sync --dry-runPreview what would sync
lore sync --no-extractSync without typed-chunk auto-extraction (when LORE_EXTRACTION_ENABLED is set)
lore sync addAdd a source directory (interactive)
lore sync add --name "Notes" --path ~/notes --project notesAdd non-interactively (syncs all files)
lore sync add --name "Docs" --path ~/docs --glob "**/*.md" --project docsAdd with specific file type filter
lore sync enable <name>Enable a sync source
lore sync disable <name>Disable a sync source
lore sync remove <name>Remove a sync source
lore sync listList configured source directories
lore sync startStart background sync daemon
lore sync stopStop background sync daemon
lore sync restartRestart daemon (picks up new config)
lore sync statusShow daemon status, last sync info, and context refresh counts
lore sync logsView daemon log file (last 50 lines)
lore sync logs -fFollow daemon logs in real-time
lore sync watchWatch directories and sync in foreground (live output)
lore sync repairRepair generated data-repo metadata and deletion cache state
lore sync repair --dry-runPreview safe repairs without changing files
lore sync repair --no-pushApply local repairs without pushing optional Git history

Supported file formats: Markdown, JSON, JSONL, plain text, CSV, HTML, XML, PDF, and images (JPEG, PNG, GIF, WebP). The default glob is **/* (all files). Use --glob to restrict to specific types.

Lore Cloud/Supabase is the primary sync layer. Git in LORE_DATA_DIR is optional local history; generated files such as sources/.paths.json and deleted-hashes.json are caches and should not block daemon refresh. If lore sync status reports repair-needed Git state, run lore sync repair.

Documents

CommandDescription
lore docs listList all indexed documents
lore docs list --allInclude ambient sources (terminal/observed-session scroll), hidden by default
lore docs list --actor <name>Filter to documents written by a specific actor
lore docs list --kind <human|agent>Filter to documents written by humans or by agents
lore docs list --workstream <slug> -p <project>Filter to documents inside a workstream (workstream slugs are unique within a project, so --project is required)
lore docs list --since <date>Only documents created on/after this date (created_at). ISO (2026-06-01) or relative (7d, 2w, 3m, "last week", "today"). Windowed results order newest-created-first
lore docs list --before <date>Only documents created before this date (exclusive — a half-open [since, before) window with --since). Same formats as --since
lore docs list --capture-method <kind>Filter to documents whose producer-stamped capture_method matches (e.g. voice_note_capture, browser_gmail, deliberate_ingest_hotkey)
lore docs list --app <bundle_id>Filter to documents whose producer-stamped app_bundle_id matches (e.g. com.tinyspeck.slackmacgap for all Slack-captured sources)
lore docs list --deletedList soft-deleted documents (with deletion dates)
lore docs list --jsonEmit the full result set as JSON instead of the table render
lore docs get <id>View a document by ID (shows the writing actor + chunk-coverage summary when extraction has run)
lore docs get <id> --jsonEmit the full source payload (including chunks: { total, by_type }) as JSON
lore docs create <content> -p <project>Create a note or insight
lore docs delete <id>Soft-delete a document (recoverable)
lore docs restore <id>Restore a soft-deleted document
lore docs reclassify <id> --to signal|ambientFlip one source's capability profile between signal (browsable, feeds briefs) and ambient (chunks-only, hidden from default browse). Human-only — agents are refused. Prompts to confirm; --yes skips the prompt, --dry-run previews without applying.
lore docs extract-backfillExtract typed chunks for sources that have none yet (idempotent)

Deleted documents are excluded from search, briefs, and list results. They can be restored at any time with lore docs restore.

Ambient vs. signal sources. Every source carries a capability profile. signal sources — transcripts, meetings, deliberate captures — are first-class browsable documents. ambient sources — raw terminal / observed-session scroll — are still indexed, searchable (lore find), and citable, but hidden from the Sources browse views (lore docs list, the TUI Sources list) so they don't pollute the surfaces you scan. The ambient partition has its own home: lore docs list --all / lore ambient list on the CLI, and the TUI Observations tab. Promote ambient → signal (or demote the other way) with lore docs reclassify <id> --to signal|ambient; every reclassification writes an org_ops_log row (op_kind='source-reclassified') for audit.

Capture-origin filters. Producer-stamped fields (capture_method, app_bundle_id, app_name) carry through to the source row at ingest. These are attribute-plane axes — they describe how the source was captured, not where it lives. Use --capture-method to filter by the producer rule that fired (e.g. show me every voice note), or --app to filter by source app (e.g. show me every Slack-captured source). The same filters compose into MCP list_sources and search for agents. The TUI's source-detail preview renders a "captured via X" chip when these fields are populated.

Ambient corpus

CommandDescription
lore ambient statsVolume report — grouped counts by app, capture method, and month, plus total and date range. --json for machine output.
lore ambient listBrowse ambient observations — the staging inbox. --app <match> (substring on app name / bundle id), --since <window>, --sort recent|salience, --limit <n>, --json.
lore ambient reviewTriage the un-promoted ambient backlog interactively — salience-ranked y (promote) / n / s (skip) / q (quit). --app / --since scope the queue, --limit <n> caps it, --list lists without prompting, --json for machine output.
lore ambient promote <id>Promote one ambient observation into the signal corpus — writes a curated derivative. Content defaults to the observation verbatim; --edit opens $EDITOR to trim, --content-file <path> supplies it. --project <slug> pins the project (else the auto-router proposes one). --title / --tags override; --yes skips the prompt.
lore ambient unpromote <id>Reverse a promotion — soft-delete the signal derivative and queue a brief regen for its project. The ambient parent is left untouched; recover the derivative with lore docs restore. --yes skips the prompt.
lore ambient gcRetention sweep — soft-delete TTL-expired ambient observations (expires_at < now(), pinned and brief-cited rows exempt). --older-than <duration> switches to an age-based sweep instead, with --app <bundle_id> / --capture-method <kind> targeting. --dry-run to preview, --limit <n> to cap, --yes to skip the prompt.
lore ambient pin <id>Exempt one ambient observation from TTL auto-GC — nulls its expires_at. The manual "keep this" without full promotion. --json for machine output.
lore ambient unpin <id>Re-enable TTL auto-GC for a pinned observation — recomputes expires_at from created_at + tier. --json for machine output.
lore ambient expiringList ambient observations approaching TTL expiry, salience-ranked — the pre-expiry surface. --within <days> (default 3) sets the window, --limit <n> caps it, --json for machine output.

The ambient corpus is a distinct surface (its own retention policy, its own visibility default, its own GC), so its primitives live under lore ambient. Promotion is the quality gate: it lifts a worthwhile observation into the browsable signal corpus as a curated derivative — a new source stamped with parent_source_id (→ the ambient row) and derived_from='ambient-promotion'. Promotion never flips the ambient row in place; the raw observation stays put and will TTL-expire on its own unless pinned. lore docs reclassify lives under lore docs because it's a source-row operation that composes with the rest of the docs CRUD. The TUI surfaces the same partition as the Observations tab (the 6th top-bar tab) — a browsable, salience-triaged staging inbox — with a read-only review panel on Shift-R.

Retention + TTL. Every ambient observation is stamped with an expires_at at ingest — created_at plus a tier: 7 days for sensitive captures (visibility='personal' ambient, or a sensitive capture_method such as browser_gmail) and 30 days for normal ambient. Both tiers are operator-tunable via the config keys ambient_ttl_normal_days / ambient_ttl_sensitive_days. The sync daemon's periodic tick auto-GCs everything past its deadline (pinned and brief-cited rows are exempt) — a soft-delete, recoverable with lore docs restore. The auto-GC is gated behind the config flag ambient_auto_gc (default on) so a regression can be disabled without a revert. Promotion is the value-preservation path; lore ambient pin is the lighter-weight "keep this" — both null out expires_at permanently.

Typical retention sweep:

lore ambient stats                       # see how it's growing
lore ambient expiring --within 7         # what's about to expire — promote/pin the keepers
lore ambient gc --dry-run                # preview the TTL-expired set
lore ambient gc --yes                    # soft-delete it (the daemon does this automatically)

The safety check refuses any source whose chunks are cited in a current workspace brief, regardless of age.

Projects

CommandDescription
lore projectsList all projects with source counts
lore projects archive <name>Archive a project
lore projects delete <name>Delete a project and all its documents

Hints

Landing-view hints are one-line state observations rendered above the project tree in lore browse — closer to git status ("your branch is ahead of origin/main") than to a wizard. Each hint pairs a predicate (the substrate state it watches) with a pre-filled CLI verb. One at a time, highest-priority active wins; self-clearing when the predicate flips false; machine-local dismissal (~/.config/lore/hints.json, does not sync).

CommandDescription
lore hintsList every registered hint with current active/dismissed state
lore hints dismiss <key>Durably mute a hint (same as pressing d on the landing view)
lore hints resetClear all dismissals (interactive y/N unless --yes)

The five registered hints:

KeyFires whenPoints at
no-projectsWorkspace has zero projectslore docs create … --project <slug> / lore sync
project-bloat-no-workstreamsA project has ≥10 sources and zero workstreamslore workstream migrate-tags --project <worst-offender>
workspace-brief-stale-14dWorkspace brief is ≥14 days oldlore brief generate workspace
personal-review-queue-5plus≥5 ambiguous-audience entries pending (human callers only)lore personal review / TUI Shift-V
workstream-briefs-stale-3plus≥3 workstream briefs have accreted sources since regenTab to expand the project tree

Discipline. Dismissal is an override on top of the predicate, not a replacement: predicate-false always wins, so a hint disappears when you act on it whether or not you ever dismissed it. Hints never appear outside the landing view; metrics-style observations (e.g., "auto-router has been returning audience=ambiguous 80% of the time") belong in lore doctor, not here.

Entities

The entity registry is the thin people / companies / products / deals bridge layer. Entities are resolved automatically as content is ingested — these commands manage the registry.

CommandDescription
lore entitiesList entities in the workspace with mention counts
lore entities --type personFilter by entity type (person / company / product / deal)
lore entities show <id|name>Show an entity and the sources that mention it
lore entities merge <a,b> --into <target>Merge entities — mentions rewritten to the target, old rows archived
lore entities rename <id|name> <new-name>Rename an entity (IDs are stable; no source rewrite)
lore entities archive <id|name>Archive an entity (historical mentions stay resolvable)
lore entities backfill --project <slug>Resolve and stamp entity mentions on sources missing source_entity_ids (per-project, budget-capped, current versions only)

Procedures

Procedural memory is the team's "how we act" layer — scope-attached operational constraints (release cadences, onboarding playbooks, review checklists), distinct from briefs (which describe what's true). Procedures ratchet: agents propose, humans confirm.

CommandDescription
lore procedures listList current procedures in the active workspace
lore procedures list --scope workspaceFilter to workspace-scoped procedures
lore procedures list --scope project:<slug>Filter to a project's procedures
lore procedures list --scope workstream:<project>/<workstream>Filter to a workstream's procedures
lore procedures list --status proposedFilter by lifecycle status (proposed / confirmed / superseded / archived)
lore procedures list --allInclude non-current rows (full version history)
lore procedures show <id>Show one procedure with attribution + supersede-chain summary
lore procedures history <id>Walk the supersede chain root → head
lore procedures create --scope <expr> --title <t> --body-file <path>Author directly (status=confirmed, human-only)
lore procedures propose --scope <expr> --title <t> --body-file <path>Propose for ratchet (status=proposed, any actor)
lore procedures confirm <id>Ratchet a proposed procedure to confirmed (human-only)
lore procedures supersede <id> --body-file <path>Write a new version of a confirmed procedure (human-only)
lore procedures dismiss <id>Dismiss a proposed procedure (humans always; agents only on their own proposals)
lore procedures archive <id>Retire a confirmed procedure (human-only)

The scope expression accepts workspace, project:<slug>, or workstream:<project>/<workstream> (workstream slugs are project-scoped, not workspace-unique). Procedures with status='confirmed' are folded into lore brief stack automatically — that's how agents read them as part of their inherited operating context.

Open Questions

Open questions are the open_question epistemic-item primitive — scoped, cited, lifecycle-bearing units of unresolved knowledge-state. Distinct from procedures (normative — how to act) and briefs (descriptive — what's true). There is no ratification gate: any actor files an open question and any actor resolves it.

CommandDescription
lore questions listList open questions in the active workspace (open status only by default)
lore questions list --scope <expr>Filter to a scope (workspace / project:<slug> / workstream:<project>/<workstream>)
lore questions list --status <s>Filter by status (open / answered / dismissed)
lore questions list --allInclude answered + dismissed questions
lore questions show <id>Show one question with body, citations, and lifecycle log. Each citation is marked with its reachability — live (title shown), soft-deleted (restore hint), or not found; --json carries a structured citation_status[]
lore questions history <id>Walk the append-only lifecycle log
lore questions file --scope <expr> --title <t>File a new open question (--body / --body-file, --citation <id> repeatable, --visibility, --review-after <iso|7d>)
lore questions resolve <id>Resolve a question (status → answered); --note <text> records the answer
lore questions dismiss <id>Dismiss a question (status → dismissed); --note <text> records the reason

answered and dismissed are both terminal — there is no reopen. Every status change appends an entry to the question's lifecycle_events log. visibility is scope-derived when not passed explicitly (a personal-kind workspace → personal, RLS-isolated to the owner; else workspace).

Lint

lore lint is the substrate-hygiene pass — a cheap, deterministic check over the epistemic substrate. Where lore doctor checks the plumbing (DB connectivity, sync age, extraction lag), lore lint checks whether briefs are current, scopes are briefed, and tracked questions are fresh. The five deterministic checks make no LLM calls — free, and runnable in a commit hook (it exits non-zero when any check warns or fails).

CommandDescription
lore lintRun the five deterministic checks over the active workspace
lore lint --scope <project>Narrow every check to one project slug (and its workstreams)
lore lint --jsonEmit the machine-parseable report
lore lint --verboseShow detail / sample ids for passing checks too
lore lint --contradictionsAlso run the opt-in LLM contradiction pass (paid, cost-gated)

The five deterministic checks: stale briefs (a brief whose live source count has run ≥ N ahead of its generation count — N defaults to 10, tunable via lint_stale_brief_threshold), missing briefs (a project/workstream with no brief row), orphaned scopes (a brief that stands on nothing — every cited source soft-deleted, or the scope has zero live sources), brief leakage (a brief still referencing a soft-deleted source), and stale open questions (status='open' past its review_after date). Exit code: 0 pass, 1 warn, 2 fail.

--contradictions — the opt-in LLM pass

lore lint --contradictions adds a sixth check: a batched claude-haiku-4-5 pass that compares claims within a scope — across a brief's prose and evidence sections and the source documents it cites — and flags pairs that contradict, each citing both claims and their source ids. It is opt-in so the default lore lint stays a zero-cost commit-hook pass, and cost-gated under LORE_MAX_DAILY_TOKEN_SPEND_CENTS — past the daily cap the check skips rather than crashing the run. A flagged contradiction is surfaced for human adjudication, never auto-resolved: each is filed as an open question at the scope citing both sources, so it shows up in lore questions and in lore attention; resolve or dismiss it with lore questions resolve/dismiss <id>. Re-runs dedup against contradictions already filed in any status.

Attention

lore attention is the attention surface — what needs action now. Where lore doctor checks the plumbing and lore lint checks epistemic hygiene, lore attention answers "what should I act on?" It is a union of cheap deterministic predicate-queries over tracked state — never an LLM-ranked feed: every item is a predicate that fires every time its condition holds.

CommandDescription
lore attentionThe attention surface for the active workspace
lore attention --limit <n>Cap the number of items shown
lore attention --jsonEmit the machine-parseable surface
lore attention --workspace <slug>Override the active workspace

The predicates: stale open questions (an open question past its review_after), approaching reviews (an open question due for review soon), failed ingests (a file the sync quarantine is skipping — silent data loss until acted on), expiring ambient (an ambient observation inside its pre-expiry TTL window — the same rows lore ambient expiring lists), and stale briefs (a leaf brief drifted past the staleness threshold behind its scope — the same signal lore lint flags, surfaced as a regen prompt). The surface is visibility-filtered to you — a personal open question never surfaces to a team agent. Items are ordered into deterministic urgency tiers (overdue > due soon > info). lore ambient expiring stays as a focused alias; its rows now also appear here in the unified surface. The same surface is exposed over MCP as the attention tool, which an operator-run "chief of staff" agent polls.

Timeline

lore timeline is the substrate diff for a time window — every source, log, ambient observation, and open-question lifecycle event (filed / resolved / dismissed) that touched the substrate in the window, ordered by time. It's the one command that answers "what happened today / this week" without manually unioning lore find, lore docs list, lore ambient list, and lore log show (each of which defaults to a different corpus / visibility and caps differently).

CommandDescription
lore timeline --since 24hEverything that touched the substrate in the last 24h
lore timeline --since 7d --before 2dA bounded half-open [since, before) window
lore timeline --corpus signal|ambient|anyCorpus filter (CLI default any)
lore timeline --visibility workspace|personal|anyVisibility filter (CLI default any — the CLI runs as you, the owner)
lore timeline --kinds source,log,ambient,question_filed,question_resolved,question_dismissedRestrict to specific event kinds
lore timeline --sort created|edited|indexed|touchedSort axis (default touched = max(indexed_at, edited_at))
lore timeline --project <slug> / --projects <list> / --workstream <slug>Scope filters
lore timeline --group-by none|day|scope|kindGroup events under sub-headers (default none)
lore timeline --no-logsExclude log entries
lore timeline --limit <n>Cap events shown (default 100)
lore timeline --jsonEmit a machine-parseable flat event array + meta
lore timeline --workspace <slug>Override the active workspace

The window grammar is 24h / 7d / 4w / 3mo (or an ISO-8601 timestamp). Degradations are disclosed, not silent: an unbounded read that hits the cap, or a stale local mirror, prints a visible warning so an empty result never reads as "nothing happened." The same surface is exposed over MCP as the timeline tool — there the corpus default is signal and visibility defaults to workspace (agent-safe; personal / any refuse agent callers), so an agent can persist its last-run timestamp and call timeline(since: that_ts) at SessionStart to boot on the diff since it last ran. For a date filter over just sources, lore docs list --since/--before is the narrower tool.

Agents

Lore attributes every write to an actor — a human or a named agent. Humans get their actor automatically; agents are provisioned explicitly, each with its own identity.

CommandDescription
lore whoamiShow the actor (human or agent) this session is acting as
lore agent install <name>Provision a named agent; prints its credential once
lore agent install <name> --workstream <slug>Provision with a home workstream
lore agent install <name> --runtime claude-code-cron --schedule <cron> --prompt <text>Provision + emit a Claude Code routine config blob
lore agent install <name> --runtime launchd --schedule <cron> --prompt <text>Provision + emit a macOS launchd plist (~/Library/LaunchAgents/) + wrapper script
lore agent listList actors in the workspace (Grants column shows each agent's permitted workstreams)
lore agent show <name>Show an actor — kind, home workstream, full grant set
lore agent rotate <name>Issue a fresh credential; the old one stops working
lore agent archive <name>Retire an agent — credential refused, attribution kept
lore agent grant <agent> <workstream>Grant write access to a workstream (in addition to home). Disambiguate same-slug-in-multiple-projects with --project <slug>
lore agent revoke <agent> <workstream>Revoke an explicit grant. The home workstream is unaffected (rotate or re-install to change home)
lore --as <name> <command>Run a single command under a named agent's credential

A process running under LORE_AGENT_TOKEN (set by a scheduled runtime, or via the agent credential file) acts as that agent for every write. See the agent guide for the full actor model.

Per-workstream write permissions

Agents are scoped to their home workstream + explicit grants. Writes outside that set are refused at the database layer — the agent gets Agent "<name>" is not authorized to write to workstream "<slug>". Allowed: <home>, <grants>. Operator can fix with: lore agent grant <name> <slug>. Humans are unaffected — they write workspace-wide.

Agents with no home and no grants keep workspace-wide write (the legacy upgrade default) and are flagged workspace-wide (yellow) in lore agent list so the operator can scope them when ready.

MCP Server

CommandDescription
lore mcpStart the MCP server (for AI tool integration)

Skills

CommandDescription
lore skills listList available agent skills
lore skills install <name>Install a skill
lore skills show <name>Show skill details

Browse TUI

lore browse opens the landing view — a morning-glance front door that shows workspace shape (project tree with workstreams nested + freshness chips) and a recent-activity feed in one screen. Pass --list to skip straight to the flat document list (the pre-landing-view behavior); any startup filter (--project / --workstream / --type) also implies list view.

Landing view:

KeyAction
j / kScroll
TabCycle project-tree sort (alpha → most-recent → most-stale)
rRefresh (manual re-read of workspace state)
dDismiss the currently-shown hint banner (when one is showing)
HHome — return to landing from any mode
LEnter the flat list view
p / wProjects + workstreams tree picker (one surface; p lands on a project row, w lands on a workstream row)
EEntity picker
BInherited brief stack
PPersonal brief (human-only)
VPersonal review queue
OProcedures browser
Shift-AActivity panel (recent deposits across workspace, with actor + kind filters)
Shift-CChunks browser (typed evidence across workspace, with type / evidence / confidence filters)
q / EscQuit
?Help

The landing view may render a one-line hint banner between the header and the project tree — a state observation (e.g., "Workspace brief is 14d+ old. Generate fresh: lore brief generate workspace."). Hints are one-at-a-time, highest-priority active wins, and self-clearing: once the underlying state changes (you regenerate the brief, the queue empties, a workstream gets created), the banner disappears on its own — no manual cleanup needed. Press d to durably mute the current hint without acting on it; lore hints (CLI) is the audit + override surface. The five registered hints: empty workspace, project-bloat (≥10 sources, no workstreams), stale workspace brief, ≥5 pending personal-review entries, ≥3 stale workstream briefs.

List view (flat document list — --list or any startup filter):

KeyAction
j / kNavigate up/down
EnterOpen document in full view
/Hybrid search (semantic + keyword)
:Regex search (grep local files)
aAsk a question (AI-powered Q&A)
RResearch mode (agentic deep research)
p / wProjects + workstreams tree picker — projects top-level, workstreams nested under their parent. h / l collapse / expand at the cursor; Enter selects either depth. m merge / r rename / Shift-M consolidation review fire on project rows.
tFilter by tag
EFilter by entity (people/companies/products/deals)
cFilter by content type
Shift-AActivity panel (recent deposits across workspace — includes logs)
Shift-CChunks browser (typed evidence across workspace)
mMove document to another project
iEdit document title
eEdit in $EDITOR — saves changes to disk and re-indexes (summary, embedding) in the background
uOpen the change inbox for the current context target
sSync now
TabToggle flat/grouped view
HReturn to landing view
Ctrl-pShow all projects
Ctrl-cClear type filter
DelDelete document or project
q / EscQuit
?Help

Activity panel (Shift-A from any non-input mode):

KeyAction
j / / Scroll
fCycle actor filter (all → human → agent → each named actor)
kCycle kind filter (all → artifact → log → procedure → research)
/Text search within activity rows (in-memory, no Supabase round-trip)
EnterOpen the underlying source / procedure detail; Esc returns to the activity panel
rRefresh — re-fetch the last-24h deposits
Shift-AToggle the panel closed
q / EscBack to list

The panel reads from the substrate's write tables (sources joined to workspace_actors via actor_id; procedures joined via proposed_by) within a 24-hour window, capped at 100 rows. It is a deposit feed — distinct from lore audit / org_ops_log, which records structural operations (renames, merges, deletes) and is not folded in here.

Observations panel (the 6th top-bar tab — Tab to it, or 6):

KeyAction
j / / Move the cursor
gCycle group axis (by app → by date → ungrouped)
sCycle sort (recent ↔ salience)
/Text search within observations (in-memory, no Supabase round-trip)
EnterOpen the observation detail; Esc returns to the panel
rRefresh — re-fetch the ambient partition
Shift-ROpen the read-only review panel — the un-promoted backlog, salience-ranked
q / EscBack to list

The Observations tab surfaces the ambient partition — passively captured content (watched videos, browsed threads, terminal/observed-session scroll) staged for review. Both the tab and the Shift-R review panel are read-only browse surfaces; the promotion action lives in the CLI (lore ambient review / lore ambient promote). Un-promoted observations TTL-expire on their own — the daemon auto-GCs everything past its expires_at deadline (see Retention + TTL above). lore ambient list is the CLI mirror of the tab.

Chunks browser (Shift-C from list — workspace-wide; c from document view — source-scoped drill-in):

KeyAction
j / / Scroll
tCycle type filter (all → decision → constraint → pain_point → commitment → quote → artifact → all)
eCycle evidence filter (all → primary_user_research → expert_opinion → … → all)
fCycle confidence filter (all → high (≥0.7) → medium (≥0.4) → low → all)
/Text search within chunks (matches content, citation, source title, type, evidence)
EnterOpen source detail (workspace-wide only); Esc returns to the chunks browser
rRefresh — re-fetch chunks
Shift-CToggle the panel closed
q / EscBack to list (or source detail when scoped)

The browser is the human-side parity surface for lore find (CLI) and the find MCP tool — same public.chunks data, same field set (type, evidence_type, confidence, citation_text, span), rendered for terminal reading. Workspace-wide view caps at 100 rows ordered by recency; source drill-in shows every current chunk for the source ordered by source_span_start (reading order). Both views render filter chips inline in the header. The source-detail preview also gains an N chunks · M decisions · K commitments summary line under the metadata block so you know whether c will surface anything before pressing it.

Document view:

KeyAction
j / kScroll
/Search within document (regex)
n / NNext/previous match
yCopy to clipboard
cDrill into this source's typed chunks (per-source chunks browser)
eEdit in $EDITOR
q / EscBack to list

Updates

CommandDescription
lore updateCheck for and install the latest version, restart daemon
lore update --checkCheck for updates without installing

Environment Variables

These can be set via environment or via lore setup (stored in ~/.config/lore/config.json):

VariableDescription
OPENAI_API_KEYRequired for summary extraction at ingest (embeddings run on-device)
ANTHROPIC_API_KEYRequired for research agent and sync
LORE_EMBEDDER_BACKENDEmbedding backend: local (on-device, default) or openai
SUPABASE_URLSupabase project URL (has default)
SUPABASE_PUBLISHABLE_KEYSupabase publishable key (has default)
SUPABASE_SERVICE_KEYService key — bypasses RLS, env-only
LORE_DATA_DIRData directory path (default: ~/.lore)
LORE_AUTO_GIT_PULLAuto git pull every 5 min (default: true)
LORE_AUTO_INDEXAuto-index new sources (default: true)
LORE_MAX_DAILY_TOKEN_SPEND_CENTSDaily Anthropic spend cap, on by default (200 = $2/day; 0 disables). Per-user, account-wide — not per-workspace. Also settable as max_daily_token_spend_cents in config.json.
LORE_EXTRACTION_ENABLEDAuto-extract typed chunks on ingest/sync (default: off). Also settable as extraction_enabled in config.json.