Summarization and automation

September 2, 2026 · View on GitHub

Optional: automated summarization

# Use your existing Claude Code, Codex, OpenCode, or Pi subscription (recommended)
[summarization]
engine = "agent"
agent_command = "claude"  # or "codex" / "opencode" / "pi"

# Or use Mistral API (requires MISTRAL_API_KEY)
[summarization]
engine = "mistral"
mistral_model = "mistral-large-latest"

# Or use a free local LLM
[summarization]
engine = "ollama"
ollama_model = "llama3.2"

# Or use any OpenAI-compatible gateway/local server.
# Desktop users can paste cloud gateway keys in Settings; Minutes stores them
# in macOS Keychain and hydrates its own runtime secret without rewriting this
# shared config. CLI users can set any env var and name it below. Local servers
# can leave it blank.
[summarization]
engine = "openai-compatible"
openai_compatible_base_url = "https://openrouter.ai/api/v1"
openai_compatible_model = "openai/gpt-4o-mini"
openai_compatible_api_key_env = "OPENROUTER_API_KEY" # leave blank for local servers

File-backed automation primitives

Minutes can emit small automation artifacts that are easy to schedule with launchd, cron, or any external runner.

minutes automate weekly-summary --json
minutes automate proactive-context --json

Each run writes:

  • a markdown artifact under ~/.minutes/automation-runs/
  • a matching JSON run record beside it

This is intentionally simple: explicit files, explicit output paths, and no hidden scheduler subsystem.

Codex epic runner

When you want Codex to keep draining a bd epic instead of stopping after one child bead, use the repo-local epic runner:

node scripts/codex_epic_runner.mjs <epic-id> -- --full-auto

What it does:

  • uses bd as the source of truth for epic ancestry and ready work
  • picks the next ready non-epic descendant bead under the target epic
  • claims that bead, runs codex exec against it, then checks whether the bead was actually closed
  • continues only after a real close; pauses on blocked/needs-human outcomes instead of guessing

Dry-run the order first:

node scripts/codex_epic_runner.mjs <epic-id> --dry-run

If you install a Taskmaster-style Codex wrapper later, use it as the per-bead engine without changing the epic logic:

node scripts/codex_epic_runner.mjs <epic-id> --taskmaster -- --sandbox danger-full-access -a never

This is intentionally separate from the Claude plugin hooks. The Minutes plugin hooks are Claude-specific today; the Codex epic runner is a repo-local workflow layer on top of bd and codex exec.

Optional: knowledge base integration

Maintain a living knowledge base from your conversations — person profiles, decision history, and a chronological log that compounds over time. Inspired by Karpathy's LLM Wiki pattern.

[knowledge]
enabled = true
path = "~/wiki"        # or your Obsidian vault, PARA system, etc.
adapter = "wiki"       # "wiki" (flat markdown), "para" (atomic facts), "obsidian" (wiki + [[links]])
engine = "none"        # "none" = structured YAML only (safest), "agent" = LLM extraction
min_confidence = "strong"

After each policy-authorized normal meeting, structured facts (decisions, action items, commitments) can flow into person profiles automatically. Restricted meetings are skipped. Every emitted fact carries provenance back to its source meeting.

minutes ingest --dry-run --all   # Preview what would be extracted
minutes ingest --all              # Backfill existing meetings
minutes ingest ~/meetings/call.md # Process a single meeting

Three output formats:

  • Wikipeople/{slug}.md with facts grouped by category
  • PARAareas/people/{slug}/items.json with atomic facts (id, status, supersededBy)
  • Obsidian — Wiki format with [[wikilinks]] for cross-references

Safety: default engine = "none" extracts only from parsed YAML frontmatter. No LLM call, zero hallucination risk. Confidence thresholds filter speculative facts. Corrupt data is backed up, never silently destroyed.