OpenLore
Memory server
Created by Clay Good
Published in clay-good/OpenLore. Publisher page
362 GitHub stars
What it is
Persistent architectural memory and structural cognition for AI coding agents.
AutoGineer overview, from the brain’s own files
OpenLore is a memory system designed to solve the amnesia and lack of governance in AI coding agents. By performing a one-time static analysis of a repository, it builds a persistent knowledge graph that encompasses application code, infrastructure-as-code, and architectural decisions. Unlike standard RAG systems, OpenLore operates deterministically without an LLM in the hot path, ensuring consistent answers and providing agents with an 'Epistemic Lease' to warn them when facts have become stale. It serves as both a memory layer for agent orientation and a governance engine that certifies changes, flags breaking API surface modifications, and validates sensitive boundary crossings before they are committed.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
OpenLore functions as an MCP server that indexes your repository into a local knowledge graph. Upon installation, it maps code structures, dependencies, and architectural specs. During agent sessions, it injects a compact architecture digest into the agent's context. The agent then uses MCP tools to query this graph for tasks like orienting to a codebase, tracing execution paths, or verifying claims. Governance tools analyze diffs against the graph to provide deterministic verdicts on breaking changes or boundary violations without requiring an LLM.
| Folder | Role | Files |
|---|---|---|
| .claude | agent-config | 1 |
| .github | agent-config | 12 |
| docs | docs | 62 |
| examples | examples | 95 |
| scripts | scripts | 27 |
| skills | agent-instructions | 25 |
| src | source-code | 1284 |
| bench | folder | 15 |
| benchmarks | folder | 1 |
| openspec | folder | 1261 |
| packaging | folder | 2 |
| schemas | folder | 2 |
| stubs | folder | 1 |
The agent reads
- get_style_fingerprint evidence: CLAUDE.md
- get_map evidence: CLAUDE.md
- find_clones evidence: CLAUDE.md
- get_duplicate_report evidence: CLAUDE.md
- get_env_vars evidence: CLAUDE.md
- get_language_support evidence: CLAUDE.md
- search_code evidence: README.md
The agent writes
- record_decision evidence: AGENTS.md
Requirements
Runtimes: Node.js ^22.22.0 || >=23.5.0
Databases: LanceDB
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 1 script. Review package.json before opening the folder in Claude Code. No step below turns a hook on for you.
package.json:node scripts/postinstall.mjs
- Not scanned by AutoGineerAutoGineer could not scan everything it runs. https://www.npmjs.com/package/openlore
Created by Clay Good. Published in clay-good/OpenLore. Licence: MIT License.
Usage
AutoGineer overview, from the brain’s own files
- Orienting an agent to a new codebase at the start of a task.
- Validating that a proposed code change does not break public API contracts.
- Checking if a diff introduces a path into a sensitive architectural boundary.
- Verifying claims about code safety or dead code before refactoring.
- Maintaining architectural specifications that stay synchronized with code changes.
- Selecting relevant tests to run based on the specific impact of a code modification.
- “Orient me to the user authentication flow in this repository.”
- The agent calls orient() and receives a summary of relevant functions, callers, and specs, allowing it to start the task immediately without manual file exploration.
- “Review my current changes for breaking API surface modifications.”
- The agent uses certify_public_surface to identify changed exports and lists the specific consumers that would be affected by the proposed changes.
- “Verify if the function 'deleteUser' is safe to remove.”
- The agent uses find_dead_code or verify_claim to determine if the function has any remaining callers or dependencies, providing a deterministic verdict.
- “Check if this diff opens a path into the sensitive 'payment-gateway' module.”
- The agent uses change_impact_certificate to confirm whether the new code creates a reachable path into the protected boundary.
Documentation by Clay Good
<h1 align="center">OpenLore</h1>
<p align="center"> <strong>Deterministic, local-first memory and guardrails for AI coding agents — no LLM in the hot path.</strong><br> Install once. From then on it runs in the background, keeping your agent oriented and its changes safe.<br> No API key. Same answer every time. </p>
<p align="center"> <a href="https://www.npmjs.com/package/openlore"><img src="https://img.shields.io/npm/v/openlore?color=2563eb&label=npm&logo=npm&logoColor=white" alt="npm version"></a> <a href="https://github.com/clay-good/OpenLore/actions/workflows/ci.yml"><img src="https://github.com/clay-good/OpenLore/actions/workflows/ci.yml/badge.svg" alt="CI status"></a> <a href="LICENSE"><img src="https://img.shields.io/npm/l/openlore?color=22c55e" alt="MIT License"></a> <img src="https://img.shields.io/node/v/openlore?color=339933&logo=node.js&logoColor=white" alt="Node >=22.22"> <br> <img src="https://img.shields.io/badge/MCP-ready-7c3aed?logo=anthropic&logoColor=white" alt="MCP ready"> <img src="https://img.shields.io/badge/languages-21%20%2B%2013%20IaC-f97316" alt="21 languages + 13 IaC ecosystems"> <img src="https://img.shields.io/badge/tests-5500%2B-success" alt="5500+ tests"> <img src="https://img.shields.io/badge/API_key-not_required-0ea5e9" alt="No API key required"> <a href="https://github.com/clay-good/OpenLore/stargazers"><img src="https://img.shields.io/github/stars/clay-good/OpenLore?style=social" alt="GitHub stars"></a> </p>
<p align="center"> <code>install</code> wires your agent and indexes the repo → <code>orient</code> returns the code a task touches → <code>review</code> catches the change that breaks a contract. All local, no API key. </p>
<p align="center"> <strong><a href="#install-once-then-forget-it">Install</a> · <a href="#what-you-get">What you get</a> · <a href="#value-scorecard--does-it-pay-for-itself">Benchmarks</a> · <a href="#openlore-vs-alternatives">vs. Alternatives</a> · <a href="#documentation">Docs</a></strong> </p>
AI coding agents are amnesiac and ungoverned. Every task restarts by re-reading the same files, long sessions drift onto stale assumptions, and nothing warns the agent when a change is about to break a contract or cross a boundary.
OpenLore fixes both halves, and then gets out of your way. A one-time static analysis builds a live knowledge graph of your repo — call structure, types, tests, decisions, IaC. From then on your agent is already oriented at the start of every task and its changes are certified before they land — automatically, deterministically, with no LLM in the hot path, so the same question returns the same grounded answer and the agent is told when a fact goes stale instead of served a confident guess.
Install once, then forget it
npm install -g openlore && openlore installThat is the only command most people ever run. It auto-detects your agent (Claude Code, Cursor, Cline, Continue, Pi, AGENTS.md), wires it, registers the MCP server, and builds the index — no API key, no config, no prompts. After that, it's on in the background and you don't think about it:
🔄 Every task starts oriented, automatically — a compact architecture digest is injected into your agent's context at the start of each session, and your agent calls
orient()and the other tools itself over MCP. You don't type anything.🌱 Every repo, not just this one —
installwires your user account too, so each new git repo you open indexes itself in the background on first touch. "Install once" is literal.🩹 Always fresh — a file watcher re-indexes as you edit and converges to a full analysis; anything it can't recompute in time is marked explicitly stale, never silently wrong.
🛡️ Changes get checked before they land — the governance tools (and
openlore reviewon a PR) run deterministically with no API key.
The CLI below exists for humans and CI — prove, review, doctor, features. The everyday path is: install, then let your agent use it.
Zero config. Run
openlore featuresto see every opt-in capability (embeddings, the commit gate, the spec store…), whether it's on, and the one command to enable it.openlore doctorverifies the wiring.
What you get
Two things, both deterministic and local:
🧠 Memory — your agent starts every task already oriented
Orient in one call —
orient(task)returns the relevant functions, callers, specs, tests, and insertion points (~430µs p50 on a 15k-node graph) instead of a dozen exploratory file reads.Survives refactors — anchored notes and decisions carry forward when a symbol is renamed or moved, instead of orphaning.
One graph for everything — application code, Infrastructure-as-Code, and architectural decisions share one graph, so a single query spans all three.
Told when a fact is stale — every response carries a brief, factual freshness note (the Epistemic Lease) once a cached fact has aged or the repo moved, so a long session can't drift onto a confident guess.
🛡️ Governance — guardrails on what the agent changes
Breaking-change verdict —
certify_public_surfaceclassifies every changed exportbreaking / non-breaking / potentially-breakingand names the consumers each break hits. Never silently "safe."Sensitive-boundary check —
change_impact_certificateflags when a diff opens a new path into a boundary you declared (reachable after the change, not before).Grounded claims —
verify_claimreturnsconfirmed / refuted / unverifiablewith a citation, before an agent asserts "X is dead" or "Y is safe to change."One commit gate —
openlore enforceblocks on findings you markblocking. Advisory by default, no API key.
The one line to remember: an agent's expensive failure mode isn't ignorance — it's confidence. A model that doesn't know a function exists will go look. A model that "knows" a stale fact builds on it, and you pay at review time. OpenLore is built so the agent can be told "that fact is stale" and "this change opens a path you said was sensitive" — deterministically, with no second model guessing about the first.
Value Scorecard — does it pay for itself?
OpenLore only earns its place if an agent with it reaches a correct answer for less total cost than the same agent without it. We measure that and publish it — wins and losses. Numbers from the Spec 14 benchmark (claude -p, sonnet, N=4 medians, pinned SHAs), measured 2026-06-01.
| Scenario | Cost Δ | Round-trips Δ | Verdict |
|---|---|---|---|
| Large/unfamiliar repo · deep "how does X flow through Y" (its target) | −7% to −21% | −26% | ✅ helps — and the win grows with repo size |
| Small/familiar repo · shallow "who calls X" | task-dependent (Round 1: +43%) | +38% | ❌ often adds overhead — measure first |
The win scales with codebase size (round-trips without → with):
| Repo (size) | Cost Δ | Round-trips |
|---|---|---|
| excalidraw (~640 files) | −21% | 25 → 16 |
| tokio (~790 files) | −21% | 17 → 13 |
| okhttp | −13% | 13 → 11 |
| django (~3k files) | −7% | 21 → 15 |
| gin (110 files, smallest) | +4% (≈even) | 10 → 9 |
Re-confirmed live 2026-06-03: the deep-task win reproduces (okhttp −13%); the small/familiar case is task-dependent, not a flat loss (chalk −32% win vs. express +59% loss). Don't guess from our repos — run
openlore prove --estimateon yours (seconds, no API key).
Honesty contract. We never publish a savings number the benchmark didn't produce, we always show the losses next to the wins, and every claim traces to a command you can run. Methodology: docs/AGENT-BENCHMARKS.md.
Is OpenLore for you?
| ✅ Strong fit | A codebase too big to hold in your head — and the model's. Private or niche code the model never memorized. Long sessions where stale assumptions compound. Polyglot repos, or code plus the IaC that deploys it. |
| 🤔 Try it, measure | Mid-size repos and mixed workloads. Run openlore prove --estimate (seconds, no key) before you commit. |
| ❌ Probably not | A small repo the model already knows, answering shallow questions — your agent's built-in search is cheaper, and we publish the measurement that says so. Also: OpenLore locates and certifies, it never edits your code. |
What your agent reaches for (you rarely type these)
Once wired, your agent calls these over MCP on its own. The default surface is the substrate preset — 15 tools: the navigation core, the highest-value governance reads (recall, verify_claim, blast_radius), and the spec composites. The lean navigation preset (10 tools) and the full 83 tools (--preset full) are one flag away.
| When the agent needs to… | Tool |
|---|---|
| Start any task | orient(task) — functions, callers, specs, insertion points in one call |
| Find which file/function handles X | search_code |
| Know the blast radius of a change | analyze_impact — risk + up/downstream chain + governing decisions |
| Trace how request X reaches function Y | trace_execution_path |
| Pick the tests a change should run | select_tests — backward reachability to the reaching tests |
| Find dead code / what dies if X is deleted | find_dead_code — cross-language reachability |
| Check a whole diff before commit | blast_radius — callers, tests, specs that drift |
| Tell if a diff opens a sensitive boundary | change_impact_certificate |
| Tell if a change breaks a consumer's API | certify_public_surface — verdict, consumers named |
| Verify a fact before asserting it | verify_claim — deterministic verdict + citation |
| Record an architectural choice | record_decision before writing the code |
Full reference — all 83 tools: docs/mcp-tools.md. Ships as a Claude Code Skill at skills/openlore-orient/.
OpenLore vs. alternatives
Everyone in this category answers the same first question: how does the agent see the codebase without reading it file by file? LSP toolkits answer with symbols, graph MCP servers with a parsed graph, search platforms with an index. OpenLore answers it too — then keeps going into the second question almost nobody answers: what happens when the agent starts writing? A retrieval layer makes an agent informed; it doesn't make it safe. That second half — governance on the same graph, no LLM in the loop — is what OpenLore is for.
| Agent built-ins | LSP toolkits | Graph MCP | Search platforms | OpenLore | |
|---|---|---|---|---|---|
| Structural context instead of file reads | ❌ grep | ✓ symbols | ✓ graph | ✓ index | ✓ call graph + IaC + decisions on one graph |
| Local, no API key, deterministic | Partial | ✓ | ✓ | ❌ hosted | ✓ no LLM in the hot path |
| Cross-session memory anchored to code | ❌ | Partial | ✓ notes | ❌ | ✓ carried across renames |
| Told when a cached fact goes stale | ❌ | ❌ | ❌ | ❌ | ✓ Epistemic Lease |
| Breaking-change verdict over a diff | ❌ | ❌ | Partial | ❌ | ✓ per export, consumers named |
| "Did this diff open a sensitive path?" | ❌ | ❌ | ❌ | ❌ | ✓ differential, pre-commit |
| Cost effect published with the losses | ❌ | ❌ | ❌ | ❌ | ✓ −26% round-trips on deep tasks |
Use the other tool when it's the right one: symbol-level edits (rename across files) are an LSP toolkit's home turf — OpenLore is deliberately read-only, and the two compose. Org-wide search across hundreds of repos is a search platform. Just-fast-graph-retrieval is a smaller graph MCP server. And a small, familiar repo with shallow questions is cheaper with your agent's built-in search. OpenLore also exports SCIP, so it sits alongside these tools, not against them.
Comparisons reflect each project's publicly documented capabilities as of July 2026; a correction PR is always welcome.
What it costs
Measured on a fresh clone of ripgrep with published [email protected]:
| What it costs | On ripgrep (232 files) |
|---|---|
| One-time index build | 13.6 s, entirely local — no API key, no network |
| Disk | 27 MB under .openlore/ (gitignorable; rebuildable from source) |
| Per-query latency | ~430 µs p50 in-process via the MCP server |
| Your source code | never leaves the machine — no account, no telemetry (opt-in only) |
| Lock-in | none — delete .openlore/ and nothing about your repo has changed |
Large monorepos take minutes rather than seconds, stated plainly in Known limitations. Platform: Linux and Windows are exercised in CI; macOS is supported.
Fully local — nothing phones home. No account, no network call; your source, the index, and every query stay on your machine. The only diagnostics that exist are opt-in and local-only, off by default and never transmitted:
OPENLORE_TELEMETRY=1records tool calls, agent identity, latency, error messages, decision titles, and lease events to the gitignored.openlore/telemetry/directory, andOPENLORE_LLM_LOGS=1stores prompts and responses (after secret redaction) in the gitignored.openlore/logs/directory. → docs/configuration.md
Languages, Infrastructure-as-Code & contracts
Languages: TypeScript · JavaScript · Python · Go · Rust · Ruby · Java · C++ · Swift · C# · Kotlin · PHP · C · Scala · Dart · Lua · Elixir · Bash — call graphs ride the same primitives for every language. → docs/language-support.md
Infrastructure-as-Code: Terraform/HCL · Kubernetes · Helm · CloudFormation · Ansible · Pulumi · AWS CDK · CDKTF · Dockerfile · Docker Compose · GitHub Actions · Azure Bicep · Serverless Framework — IaC resources project onto the same graph as application code, so orient, search_code, and analyze_impact answer "what's the blast radius of changing this security group / IAM role / base image / CI job?" with zero new tooling. → docs/iac.md
Interface contracts: OpenAPI 3.x · Swagger 2.0 — each declared operation projects onto the same graph, bound to the route handler that serves it and the function that calls it, so orient and analyze_impact cross the API boundary. Matching is literal, and everything unbound is disclosed. → docs/contracts.md
Known limitations
We'd rather you know these up front.
Static analysis only. Polymorphic dispatch, event channels, and route→handler bindings are recovered (provenance-labeled
synthesized). What isn't: reflective invocation with a non-literal target (getattr(o, name)()),eval, and DI/plugin registries with no visible binding — silently absent from the graph.LLM spec quality varies. Generated spec prose reflects the model's understanding — review complex business logic. Structure, format, coverage, and drift are checked deterministically.
Keyword (BM25) search answers first; local semantic follows in the background.
orient/search_codework immediately with no key. Background builds then add on-device vectors (CPU-only, ~23 MB model) when the optional package is installed; opt out with"embedding": { "provider": "none" }.Large monorepos analyze one package at a time after the first full build (
openlore analyze --shard <name>); the initial index is still a full analysis.Incremental updates converge or flag, never silently diverge. When a change exceeds the per-save budget, the rest is marked explicitly stale and self-heals on later edits or a background re-analyze.
Documentation
Start here: the documentation index maps every task to the one canonical page that answers it. The essentials:
| I want to… | Doc |
|---|---|
| Install & wire my agent (one command) | install.md |
| Understand why wiring an agent helps | agent-setup.md |
| See all 83 MCP tools + parameters | mcp-tools.md |
| Run the full CLI reference | cli-reference.md |
Configure .openlore/config.json (incl. enforcement.policy) | configuration.md |
| Choose / configure an LLM provider (optional) | providers.md |
| Fix a setup problem | TROUBLESHOOTING.md |
| Read the benchmark methodology + per-task numbers | AGENT-BENCHMARKS.md |
| Search code by meaning (semantic / GraphRAG) | semantic-search.md |
| Pick the tests a change should run | test-impact-selection.md |
| Find dead code / coverage gaps | reachability-dead-code.md · coverage-gaps.md |
| Detect spec ↔ code drift | drift-detection.md |
| Enforce architecture / import rules | architecture-invariants.md |
| Gate commits / wire CI & PR review | ci-cd.md · preflight.md |
| Understand IaC & cross-domain impact | iac.md · cross-domain-impact.md |
| See declared API contracts in the graph | contracts.md |
| Query across repos (federation) | federation.md |
| Share the index as a bundle | shareable-bundle.md |
| Export to Sourcegraph / SCIP tools | scip-export.md |
| Read the internals | ARCHITECTURE.md · ALGORITHMS.md · PHILOSOPHY.md |
Development
npm install
npm run build
npm run test:run # 5500+ unit tests, one-shot (npm test is watch mode)
npm run typecheckNew contributor? See CONTRIBUTING.md for setup, MCP wiring, and the commit gate. Please also read our Code of Conduct; to report a vulnerability, see SECURITY.md.
Community
If OpenLore saves your agents from re-reading the same files — or catches one risky change before it lands — star the repo. It's the signal that tells us to keep building, and it helps other engineers find it.
⭐ Star to follow along: github.com/clay-good/OpenLore
🐛 Bug or idea? Open an issue.
🤝 Contribute? Start with CONTRIBUTING.md.
Links
docs/cli-reference.md
Commands
openlore --helpgroups these commands by job — set up & run · navigate · govern a change · inspect · multi-repo · advanced/experimental — so the front door stays legible as the surface grows. The table below is the full alphabetical reference.
| Command | Description | API Key |
|---|---|---|
openlore init | Initialize configuration | No |
openlore install | One-command setup: wire agent surfaces (substrate MCP + hooks) and build the index | No |
openlore connect [agent] | Wire a specific coding agent to the MCP server + hooks | No |
openlore analyze | Run static analysis (repository-scoped single flight — a second analyze reports the live owner instead of duplicating work) | No |
openlore analyze --wait | Follow an analysis another process already owns and return its result | No |
openlore embed --local | Enable on-device semantic embeddings (no API key; downloads ~23 MB model) and rebuild the index | No |
openlore embed --off | Revert to the first-class keyword (BM25) default and rebuild | No |
openlore orient | Relevant functions, callers, specs, and insertion points for a task (the flagship) | No |
openlore orient --inject | Emit a bounded, ignorable task-scoped orientation block for a pre-turn hook | No |
openlore orient --proposal-only | Emit the concise OpenSpec proposal instruction only for recognized proposal invocations | No |
openlore search <query> | Search indexed code or specs; optionally explain one named target | No |
openlore generate | Generate specs from analysis | Yes |
openlore generate --adr | Also generate Architecture Decision Records | Yes |
openlore generate --dry-run | List the stages and domains that would run, then stop — no provider call, no cost, no writes | No |
openlore generate --plan | Explicit alias for the same free plan-only output | No |
openlore generate --preview | Run the real pipeline in an isolated temporary workspace and show the candidate spec diff; provider cost occurs and the project tree is left byte-identical | Yes |
openlore mapping refresh | Rebuild the deterministic spec→code link index from the anchors written in existing specs | No |
openlore verify | Verify spec accuracy | Yes |
openlore drift | Detect spec drift (static) | No |
openlore drift --use-llm | Detect spec drift (LLM-enhanced) | Yes |
openlore drift --suggest-tests | After drift, list test files covering affected domains | No |
openlore audit | Report spec coverage gaps: uncovered functions, hub gaps, stale domains | No |
openlore test | Report spec test coverage (scan test files for // openlore: annotation tags) | No |
openlore test --min-coverage <n> | Fail when effective spec coverage is below N% (CI gate) | No |
openlore digest | Plain-English summary of all specs for human review | No |
openlore prove | Measure OpenLore's token value on your repo (WITH vs WITHOUT agent pass) | Yes |
openlore prove --estimate | Deterministic graph projection when ≥1 function has ≥2 callers; sparse refusals report the measured count — no agent, no key | No |
openlore prove --json|--markdown|--save | CI-consumable scorecard / paste-ready block + badge / dated record under .openlore/prove/ | Matches arm |
openlore decisions | Manage architectural decisions: list, approve, reject, sync to specs and ADRs | No |
openlore decisions --gate | Pre-commit gate check: exit non-zero if decisions await review (used by the hook) | No |
openlore setup --tools claude | Install the decisions pre-commit hook (+ skills) that gates commits until decisions are reviewed | No |
openlore run | Full pipeline: init, analyze, generate | Yes |
openlore view | Launch interactive graph & spec viewer in the browser | No |
openlore setup | Install workflow skills into the project (Vibe, Cline, GSD, BMAD, Pi) | No |
openlore federation add|remove|list | Manage the multi-repo federation registry (index-of-indexes) | No |
openlore spec-store status | Report the health of the spec-store binding (read-only, advisory) | No |
openlore working-set context | Assemble the working-set briefing for an active change across its targets (read-only, advisory) | Targets indexed |
openlore impact-certificate | Certify what the current diff opens into declared covering surfaces, before it lands (advisory; opt-in blocking) | Yes |
openlore enforce | Unified finding-enforcement gate: blocks on blocking, new debt under frozen, or an unverifiable frozen baseline (advisory by default); --sarif <path> also writes every classified finding as SARIF 2.1.0 | Decisions/specs present |
openlore mcp | Start MCP server (stdio, for Cline / Claude Code) | No |
openlore serve | Start a warm local HTTP daemon exposing tools (loopback, for Pi / editors) | No |
openlore statusline | Print the current search-index state for Claude Code's status line | No |
openlore hook <moment> | Print one agent-loop receipt from a hook payload on stdin (before-edit, after-tools, before-stop, after-compact, before-subagent, subagent-start); wired by install — see agent-loop hooks | No |
openlore handoff | Brief the in-flight change for a successor session (get_handoff_briefing); --json, --budget <tokens> | No |
openlore footprint | Share this agent's intended write-set and read-set with the other worktrees of the clone and see the hazards with live peers: declare --write a,b [--read c] [--title …] [--actor id] [--append], release, list. Advisory; nothing is locked | Yes |
openlore doctor | Check environment and configuration for common issues | No |
openlore features | List opt-in features, which are active, and the one command/snippet to turn on each (--json, --inactive) | No |
openlore update | Upgrade openlore to the latest published version (detects npm-global / Homebrew / npx); --check reports availability, --dry-run prints the command without running it | No |
openlore refresh-stories | Refresh story files with latest structural context after each commit | No |
openlore blast-radius | Pre-flight structural blast-radius briefing for the current diff (advisory; --install-hook for a pre-commit hook) | No |
openlore coverage-gaps | Ranked structural test-coverage gaps: important code with NO reaching test (the inverse of select_tests), no runtime. Scope to a diff (--base/--symbols) or region (--file-pattern). Read-only, never blocks | Yes |
openlore certify-public-surface | Certify the public API surface (no --base) or the breaking-change verdict for the working-tree diff (--base <ref>): removed/renamed exports, incompatible signatures, each breaking change with its consumers. --accept records intended breakages with a justification. Deterministic, never blocks | Yes |
openlore certify-service-contract | Certify OpenAPI/Swagger contracts against the code: declared operations and parity with the indexed route handlers (no --base), or the breaking-change verdict for each changed element with its in-repo callers (--base <ref>). Read-only, advisory | Yes |
openlore style-fingerprint | Descriptive per-language idiom profile (function form, binding, conditional, async, string, naming case) for the repo, a region (--community <id>), or a file (--file <path>); --language filters, --json for machine output. Evidence-floor + enforcement-aware nulls. Read-only, deterministic, never blocks | Yes |
openlore briefing-since | Catch-up briefing of what changed since a base ref (--base <ref>), ranked by significance tier — surprising-change (a stable hub moved) > hub-change > chokepoint-change > ordinary-change — from existing labels (not a score); grouped by region, with tests-to-run and a no-silent-truncation receipt. Scope with --file-pattern, bound with --max, --json for machine output. Read-only, deterministic, never blocks | Yes |
openlore find-clones | Existing clones of ONE query — a function --symbol <name> (or name::path) in the index, or raw --snippet <code> (even code not yet written) — ranked exact > structural > near. The edit-time "does this already exist? reuse it" companion to the whole-repo get_duplicate_report. --min <ratio> sets the near floor (default 0.7), --max <n> bounds the list, --json for machine output. Read-only, deterministic, never blocks | Yes |
openlore error-propagation | Exceptions escaping vs. handled for TS/JS/Python/Java/C#, or returned error values and panic/recover flow for Go. Go results are explicitly value-shaped. Unanalyzable callees and discarded Go results are disclosed as boundaries. --max-depth <n> bounds traversal; --json emits the structured model. | Yes |
openlore env-impact | What breaks if an env var (--name <var>) is removed or renamed: the line-precise read sites (file/line/enclosing function; module-level reads disclosed), the upstream callers that transitively reach a read (the blast radius), the tests to run, the infrastructure files that set it (Kubernetes, compose, Dockerfile, Terraform/OpenTofu, CloudFormation/SAM, GitHub Actions, Serverless; never the value), and per-site required (no fallback = hard break) — the configuration analogue of analyze_impact, for TS/JS/Python/Go/Ruby. Unknown var → not-found + candidates; config-object keys out of scope. --max-depth <n> bounds the backward traversal (default 12), --json for machine output. Read-only, deterministic, never blocks | Yes |
openlore review | Deterministic structural PR review (structural delta + blast radius) as a Markdown/JSON briefing; pairs with the bundled GitHub Action | No |
openlore preflight | CI staleness gate: fail when the analysis graph is stale relative to the working tree | No |
openlore export scip | Export the analysis graph as an SCIP index for the Sourcegraph / Glean ecosystem | No |
openlore export bundle | Export the persisted graph index as a portable integrity-stamped artifact (--out <path>), optionally authenticated with Ed25519 (--sign-key <pkcs8.pem>). Deterministic, offline. See Shareable bundle | No |
openlore import <artifact> | Import a portable graph artifact with separate integrity, optional producer-authentication, and currency receipts; clean ancestor bundles catch up through a bounded exact delta, unsafe gaps rebuild, and invalid/untrusted signatures are rejected | No |
openlore telemetry | Analyze EpistemicLease cognitive-load telemetry | No |
openlore panic-* | Agent behavioral-governance ("panic") commands — panic-check/panic-level/panic-validate/panic-hotspots/panic-calibrate/panic-replay. Opt-in, off by default; install hooks via openlore setup --hooks | No |
openlore gryph-watch | Background Gryph behavioral observer (opt-in; install via openlore setup --hooks) | No |
Global Options
--api-base <url> # Custom LLM API base URL (proxy / self-hosted)
--insecure # Disable SSL certificate verification
--config <path> # Config file path (default: .openlore/config.json)
-q, --quiet # Errors only
-v, --verbose # Debug output
--no-color # Plain text output (enables timestamps)Generate-specific options:
--model <name> # Override LLM model (e.g. gpt-4o-mini, llama3.2)Orient Options
openlore orient [options]
--task <task> # Natural-language task (e.g. "add rate limiting")
--directory <path> # Project directory to orient in (default: cwd)
--limit <n> # Number of relevant functions to return (default: 5)
--token-budget <n> # Fit the whole answer to ~this many tokens (adds functions past --limit while they fit)
--lean # Return only the navigation core (drop heavier sections)
--json # Emit the full result as JSON instead of the human view
--metrics # Report wall time + output size to stderr (opt-in)
--inject # Emit a bounded, ignorable task-scoped orientation block
# for a pre-turn agent hook; reads the task from --task
# or stdin. Fail-open: any failure degrades to a single
# pointer line at exit 0 (see docs/install.md).With no --task, orient prints a session-start primer. Requires openlore analyze
to have run at least once.
Search Options
openlore search <query> [options]
--specs # Search requirements instead of code
--limit <n> # Result cutoff (default: 10)
--language <name> # Code language filter
--min-fan-in <n> # Code minimum-caller filter
--domain <name> # Spec domain filter
--section <name> # Spec section filter
--token-budget <n> # Cap ordinary code-search output
--explain <target> # Explain one surfaced or missing target
--target-kind <kind> # symbol | file | requirement (required with --explain)
--file <path> # Disambiguate a symbol target
--directory <path> # Project directory (default: cwd)
--json # Emit the shared handler response unchanged--explain uses the same requested-limit candidate window as ordinary retrieval. It reports
not-indexed, unsupported language, filter exclusion, no lexical term match, an exact rank within
that window, or candidate-window truncation. Use --specs --target-kind requirement for canonical
requirement IDs. Presentation token caps are not diagnosed.
Install Options
openlore install [options] # wire agents (this repo AND your user scope),
# build the index, wire the decision trail
--agent <name> # Limit to one surface: claude-code, cursor, cline,
# continue, agents-md
--preset <name> # MCP tool preset to wire: substrate (default; navigation core +
# spec workflows + recall + verify_claim + blast_radius), navigation (lean escape),
# minimal, memory, verify, federation, coordination, or full
--all-tools # Wire the full 83-tool surface (alias of --preset full)
--dry-run # Print planned changes without writing any files
--force # Overwrite OpenLore-managed blocks even if hand-edited
--uninstall # Remove OpenLore-managed blocks and entries (both scopes)
--repo-only # Wire this repository only; write no user-scope entries
--no-analyze # Configure surfaces only; skip init + analyzeConnect Options
openlore connect [agent] [options] # wire ONE agent (no index build by default)
openlore connect remove [agent] # disconnect that agent
<agent> # Positional: claude-code | cursor | cline | continue |
# agents-md (omit for an interactive picker)
--preset <name> # MCP tool preset to wire (same names as install)
--all-tools # Wire the full 83-tool surface (alias of --preset full)
--dry-run # Print planned changes without writing any files
--force # Overwrite OpenLore-managed blocks even if hand-edited
--no-analyze # Configure surfaces only; do not build the indexconnect takes the agent as a positional argument (openlore connect cursor), not
--agent, and disconnects via the remove subcommand rather than --uninstall.
A bare openlore install wires the substrate surface (15 tools — navigation core + governance reads + spec-workflow composites) and, for
Claude Code, both a SessionStart primer hook and a UserPromptSubmit task-scoped
injection hook. Use --preset navigation for the lean navigate-only core (10 tools), or
--preset full for all 83 tools.
MCP Server Options
openlore mcp [options] # start the stdio MCP server
--preset <name> # Expose a named preset (default: substrate, 15 tools — nav + governance + spec workflows)
--minimal # Expose only the core 6 governance tools
--all-tools # Expose the full surface — all 83 tools (alias --preset full)
--list-tools # Print the active surface grouped by capability family and exit
--watch-auto # Auto-detect + incrementally re-index the project dir
--no-watch-auto # Disable auto-watch (use for one-shot tool calls)
--daemon # Delegate tool calls to a shared `openlore serve` daemonWhen the lean default is active, the server advertises the opt-in presets once via
the MCP initialize instructions channel (no extra tool schemas).
Drift Options
openlore drift [options]
--base <ref> # Git ref to compare against (default: auto-detect)
--files <paths> # Specific files to check (comma-separated)
--domains <list> # Only check specific domains
--use-llm # LLM semantic analysis
--json # JSON output
--fail-on <severity> # Exit non-zero threshold: error, warning, info
--max-files <n> # Max changed files to analyze (default: 100)
--verbose # Show detailed issue information
--suggest-tests # List test files covering drifted domains
--install-hook # Install pre-commit hook
--uninstall-hook # Remove pre-commit hookGenerate Options
openlore generate [options]
--model <name> # LLM model to use
--dry-run # Free plan: no provider call, cost, or writes
--plan # Alias for the free plan
--preview # Paid isolated generation preview and candidate diff
--domains <list> # Only generate specific domains
--merge # Merge with existing specs
--no-overwrite # Skip existing files
--adr # Also generate ADRs
--adr-only # Generate only ADRs
--force # Re-run all LLM stages, clear generation cache, remove stale domains
--analysis <path> # Path to existing analysis directory
--output-dir <path> # Override openspec output location
-y, --yes # Skip confirmation promptsRun Options
openlore run [options]
--force # Reinitialize even if config exists
--reanalyze # Force fresh analysis even if recent exists
--model <name> # LLM model to use for generation
--dry-run # Show what would be done without making changes
-y, --yes # Skip all confirmation prompts
--max-files <n> # Maximum files to analyze (default: 500)
--adr # Also generate Architecture Decision RecordsAnalyze Options
openlore analyze [options]
--output <path> # Output directory (default: .openlore/analysis/)
--max-files <n> # Max files (default: 500)
--include <glob> # Additional include patterns
--exclude <glob> # Additional exclude patterns
--shard <name> # Recompute one detected/configured workspace package against the
# retained whole graph. Repeatable. Requires an existing index;
# without one, performs and discloses a full build.
--force # Re-analyze from scratch: analyze even when the source is unchanged,
# and re-extract every file instead of reusing the extraction cache.
# An ordinary `analyze` already re-parses only what changed.
--reanalyze # Analyze even when the source is unchanged, but keep reusing the
# extraction cache — the cheap half of --force.
--ai-configs # Generate AI tool config files (CLAUDE.md, .cursorrules, .clinerules/openlore.md,
# .github/copilot-instructions.md, .windsurf/rules.md, .vibe/skills/openlore.md)
# Safe to re-run — skips files that already exist, marks pre-existing ones.
--no-embed # Force a keyword-only (BM25) index (keyword is the first-class default;
# semantic is built only when a provider is configured — see "openlore embed")
--reindex-specs # Re-index OpenSpec specs into the vector index without re-running full analysis
# (uses the configured embedding provider — local or remote — else keyword)Workspace shards are detected from npm/yarn/pnpm workspaces, Cargo members, Go modules,
pyproject.toml, Gradle settings, and Maven modules. Files outside every package belong to the
implicit root shard. A scoped run replaces only the selected package and its cross-package
resolution frontier in the SQLite graph. Repo-wide JSON and search artifacts are retained, never
rewritten from partial input; workspace-shards.json records recomputed and retained shards,
per-shard freshness, frontier files, and explicit stale regions. --shard with --force is a
full rebuild. An unknown name fails with the available and nearest shard names.
analyze also carries anchored memory across refactors: if a symbol with anchored memories/decisions was
renamed or moved since the last analysis, its anchors are re-pointed to the new symbol (deterministically,
no LLM) and the run logs Memory continuity: carried N symbol(s) across rename/move. See
docs/mcp-tools.md ("Memory survives refactors").
Embed Options
openlore embed [options]
--local # Enable the on-device, no-API-key local embedder and rebuild the index.
# Lazily downloads + caches a small pinned model (~23 MB) under ~/.openlore/models.
# An explicit local provider wins over any EMBED_* env.
--off # Revert to the keyword (BM25) default and rebuild
--model <id> # Override the local embedding model (advanced; default is a pinned small model)Keyword (BM25) search is the first-class default and needs no setup. openlore embed --local is the one-command semantic upgrade; for a remote OpenAI-compatible endpoint instead, set EMBED_BASE_URL/EMBED_MODEL (or an embedding block in .openlore/config.json) and run openlore analyze. See docs/semantic-search.md.
Prove Options
openlore prove [options]
--directory <path> # Repo to measure (default: current directory)
--runs <n> # Runs per arm per task (default: 2; non-numeric is rejected)
--model <name> # Agent model (default: sonnet)
--max-budget-usd <n> # Per-agent-call USD ceiling (default: 0.5; non-numeric is rejected)
--estimate # Deterministic, no-agent, no-API projection of the orientation tax
--dry-run # Synthetic numbers (no agent, no API key)
--json # Stable schemaVersion:1 scorecard on stdout (mutually exclusive with --markdown)
--markdown # Paste-ready scorecard block + shields.io badge (mutually exclusive with --json)
--save # Persist a dated, non-clobbering scorecard under .openlore/prove/The measured arm needs claude + an API key; --estimate and --dry-run need neither. A measured
run whose agent calls all fail exits non-zero rather than emitting a verdict over no data. The
--json shape is documented in AGENT-BENCHMARKS.md.
Setup Options
openlore setup [options]
--tools <list> Comma-separated tools to install: vibe, cline, claude, opencode, gsd, bmad, omoa (default: interactive prompt)
--force Overwrite existing files (use after upgrading openlore)
--dir <path> Project root directory (default: current directory)Installs workflow skills from the openlore package into the project. Skills are static assets — identical across projects — so this command only needs to be run once at project onboarding and again after upgrading openlore.
Files installed:
| Tool | Destination | Content |
|---|---|---|
vibe | .vibe/skills/openlore-{name}/SKILL.md | 10 skills |
cline | .clinerules/workflows/openlore-{name}.md | 7 workflows |
claude | .claude/skills/openlore-{name}/SKILL.md + decisions pre-commit hook | 10 skills + commit gate |
opencode | .opencode/skills/openlore-{name}/SKILL.md + .opencode/plugins/agent-guard.ts | 10 skills + guard plugin |
gsd | .claude/commands/gsd/openlore-{name}.md | 2 commands |
bmad | _bmad/openlore/{agents,tasks}/ | 2 agents, 4 tasks |
omoa | .opencode/plugins/ + .opencode/prompts/ | 4 SDD plugins + Sisyphus prompt (oh-my-openagent) |
The omoa option is auto-detected and pre-checked in the interactive prompt when oh-my-openagent is found in the project or user config.
Never overwrites existing files. Combine with analyze --ai-configs for a complete agent setup:
openlore analyze --ai-configs # project-specific context files
openlore setup # workflow skillsDecisions Options
openlore decisions [options]
--list # List decisions, optionally filtered by --status
--status <status> # Filter by status: draft, consolidated, verified, approved, synced, phantom
# Note: synced/rejected/phantom are purged from store after --sync
--approve <id> # Approve a decision by ID (blocked if already synced)
--reject <id> # Reject a decision by ID
--reason <text> # Rejection reason (used with --reject)
--sync # Write approved decisions into specs and ADRs, then purge inactive entries
--dry-run # Preview sync without writing files
--gate # Run commit gate check (reads pending.json, no LLM — used by pre-commit hook)
# Gate reason codes: verified | approved_not_synced |
# drafts_pending_consolidation | no_decisions_recorded
--consolidate # Manually trigger LLM consolidation + diff verification of drafts
--json # Machine-readable output
--uninstall-hook # Remove decisions pre-commit hook (install via: openlore setup --tools claude)
# Record a decision — the same handler as the record_decision MCP tool, on any wired preset
openlore decisions record --title <text> --rationale <text>
[--consequences <text>] [--files <a.ts,b.ts>] [--supersedes <id>]
[--scope local|component|cross-domain|system] [--constraints-file <path.json>] [--json]
# Prints the id and `openlore decisions status <id>` for its verdict.
# Under autopilot it is auto-approved at once (anchored files must exist,
# a superseded decision must be live) and synced in background; else a draft
# Decision autopilot: on when `governance.autopilot` is absent, unless a blocking decisions gate
# is installed; `false` turns it off, `true` forces it on. `decisions record` and the gate
# auto-accept (distinct `auto-approved` status), sync to specs with an "Auto-accepted
# (unreviewed)" marker, and never block a commit. Every status transition — in every mode —
# lands on an append-only ledger. `openlore status` shows the mode and the trail.
openlore decisions log [--json] [--since <ref|ISO date>]
# Show the transition ledger, newest first
openlore decisions review [--promote <ids|all>] [--reject <ids|all>] [--note <text>] [--json]
# List auto-accepted decisions awaiting review; promote (drops the
# unreviewed marker) or reject (retires from specs, kept in history)Verify Options
openlore verify [options]
--samples <n> # Files to verify (default: 5)
--threshold <0-1> # Minimum score to pass (default: 0.7)
--files <paths> # Specific files to verify
--domains <list> # Only verify specific domains
--verbose # Show detailed prediction vs actual comparison
--json # JSON outputDoctor
openlore doctor runs a self-diagnostic and surfaces actionable fixes when something is misconfigured or missing:
openlore doctor # Run all checks
openlore doctor --json # JSON output for scriptingChecks performed:
| Check | What it looks for |
|---|---|
| Node.js version | ≥ 22.22 required, and node:sqlite probed as loadable |
| Git repository | .git directory and git binary on PATH |
| openlore config | .openlore/config.json exists and is parseable |
| Analysis artifacts | repo-structure.json freshness (warns if >24h old) |
| OpenSpec directory | openspec/specs/ exists |
| LLM provider | API key or claude CLI detected |
| Disk space | Warns < 500 MB, fails < 200 MB |
| Install health | Warns when more than one openlore install is on PATH, or when the user-scope MCP entry (~/.claude.json) names a launcher that no longer exists; --fix re-wires the launcher |
| Analysis corpus size | Fails when the files analyze would index exceed the 1 GB fingerprint budget, and names the largest paths to add to analysis.excludePatterns |
Run openlore doctor whenever setup instructions aren't working — it tells you exactly what to fix and how.
Features (what's on, and how to turn on the rest)
OpenLore needs zero config for its core value — orient, search, blast-radius, and the whole
structural graph work with no keys set. Everything beyond that core is an independent opt-in feature.
openlore features is the single answer to "where do I turn on X?": it reads .openlore/config.json and
a few on-disk markers and reports, for every opt-in feature, whether it is active and the one command or
config snippet that activates it. Deterministic and local — no LLM, no network.
openlore features # Every feature, its state, and how to enable it
openlore features --inactive # Only what is not yet turned on
openlore features --json # Machine-readable inventory (for scripts / agents)Features reported (active/inactive detected from config + markers):
| Feature | Activate with |
|---|---|
| Semantic embeddings | openlore embed --local |
| Task-scoped context injection | on by default (contextInjection.mode) |
| MCP tool surface | openlore connect --preset <name> |
| Architecture invariants | .openlore/architecture.json (layer, boundary, cycle, reachability, orphan, and instability rules) |
| Change-impact certificate | impactCertificate.surfaces in config |
| Enforcement policy | enforcement.policy in config |
| Blast-radius blocking | blastRadius.block in config |
| Commit gate (pre-commit hook) | openlore enforce --install-hook |
| Agent behavioral governance (panic) | openlore setup --panic |
| Spec-store binding | specStore in config |
| Federation registry | openlore federation add <path> --name <name> |
SARIF output (--sarif <path>)
openlore enforce --sarif <path> and openlore review --sarif <path> also write the findings they classified as a
SARIF 2.1.0 log, so a CI job can upload them to a code-scanning surface (for example
github/codeql-action/upload-sarif). It is transport, not policy: what the command prints and its exit code are the
same with or without the flag, and a write failure is a warning on stderr. Every registered finding code is a rule
(with its registry description, source, and default class). Each finding is a result with its message verbatim, its
intrinsic severity mapped to a level (critical/error → error, warning → warning, info → note), its
resolved enforcement class and subject as properties, and a stable identity hash in partialFingerprints. A finding
with a recorded repository-relative location gets a physical location (with a line only when the source recorded
one); every other finding gets a logical location named by its subject — a line is never invented. The run carries
the tool version, the call-graph fingerprint when an index exists, and the command's caveats, and no timestamps, so
the same findings and graph produce a byte-identical log.
PR review (openlore review)
openlore review composes the structural delta (structural_diff) and the blast radius
(computeBlastRadius — hubs, layers, tests to run, and the spec/memory/decision drift the change
introduces) for a base..head range into one deterministic, conclusion-shaped briefing — no LLM,
no new MCP tool. It is the same distinctive structural output OpenLore already produces, rendered for a
human reviewer and bundled as a GitHub Action that posts it as one sticky PR comment.
openlore review # markdown briefing for the current diff (auto-detected base)
openlore review --base main --head HEAD # explicit range
openlore review --format json # schemaVersion:2 briefing on stdout
openlore review --out review.md # write the markdown to a file (used by the Action)
openlore review --sarif review.sarif # also write the classified findings as SARIF 2.1.0
openlore review --hook # gate orphan enforcement and invalid candidate config| Option | Description |
|---|---|
--base <ref> | Base ref to compare against (default: auto-detected — requested → main → master → HEAD~1) |
--head <ref> | Head ref (default: working tree). Blast radius is computed against the working tree; in CI the runner checks out the head SHA so they align (a caveat is printed when an explicit --head could differ) |
--format <fmt> | markdown (default, for PR comments) or json (schemaVersion: 2, for programmatic consumers); unknown value exits 2 |
--out <path> | Write the briefing to a file instead of stdout |
--hook | Opt-in gating: exit non-zero on blocking, frozen-new, uninitialized, or unverifiable blast-radius orphan enforcement (legacy blastRadius.block lowers to the same policy), or an invalid candidate enforcement config. |
Advisory by default — it informs, it never fails the check. Degrades honestly: with no analysis index
it shows the structural delta and says "run openlore analyze"; a non-git directory or unreachable
base is disclosed rather than emitted as a misleading empty briefing. The structural delta works
without an index (it builds the old/new graphs from just the changed files).
Review is read-only: it never initializes or shrinks a frozen baseline. To adopt existing debt or
record progress, run openlore enforce locally, inspect the baseline change, then stage the config,
baseline, and generated ignore exception:
git add .gitignore
git add .openlore/config.json .openlore/enforcement-baseline.jsonlWhen a complete review sees resolved baseline identities, its receipt reports how many would retire
and directs you to run openlore enforce locally. An incomplete or unavailable blast-radius
assessment or an unverifiable baseline fails closed for orphan codes already mapped frozen.
An invalid candidate config gates independently; the candidate cannot disable a trusted frozen policy
by corrupting or removing config, and a deliberate downgrade must leave that code's baseline records unchanged.
GitHub Action. The repo ships .github/actions/openlore-review (composite action: build the
SHA-pinned Action source with its committed lockfile → openlore analyze → openlore review → one
sticky comment matched by a hidden <!-- openlore-review --> marker, created once and updated in
place — duplicate-proof via paginated comment lookup) and a copy-paste workflow
(.github/workflows/openlore-review.yml.example). Adoption is one file; it needs a full-history
checkout (fetch-depth: 0) and pull-requests: write permission. Dependencies are installed with
npm ci from the reviewed Action revision in an isolated npm configuration with lifecycle scripts
disabled; the Action does not resolve or execute a mutable openlore npm selector. Advisory by
default; gate mode fails the job when review finds a blocking orphan, new debt under frozen, an
uninitialized or unverifiable frozen baseline, or invalid candidate enforcement config (legacy
blastRadius.block lowers to the same policy). A missing openlore/review or an unreachable range
never produces a false-positive red check. A comment-post
failure never fails the check either: on a fork PR GitHub gives pull_request a read-only token, so
the comment can't be posted for external contributors — the Action warns and leaves the briefing in the
job log. Do not combine pull_request_target with a checkout of the pull-request head; use a split
unprivileged analysis workflow and trusted artifact-posting workflow if fork comments are required.
The briefing is always clamped to GitHub's 65,536-char comment limit.
Federation (multi-repo)
Federation is an index-of-indexes: each repo keeps its own independently-built .openlore index, and a project-local registry (.openlore/federation.json) references them. Adding or removing a repo edits only the registry plus that repo's own build — never a global rebuild. No merged cross-repo graph is ever materialized; federated queries load only the per-repo indexes they need, on demand.
openlore federation add <path> [--name <name>] # Register a repo (default name: its basename)
openlore federation remove <nameOrPath> # alias: rm
openlore federation list # alias: ls — shows each repo's index stateIndex state per repo: ✓ indexed, ⚠ stale (re-run openlore analyze there), ∅ unindexed, or ✗ missing path. Once a repo is registered, the four cross-repo conclusion tools — analyze_impact, find_dead_code, select_tests, find_path — accept an opt-in federation (or federationRepos) flag and report which repos were consulted vs skipped. The registry-status tool federation_status is exposed only under openlore mcp --preset federation. See docs/federation.md.
Spec-store binding
A spec-store binding points OpenLore at an external spec repository (one that holds specs/changes) and declares the code repositories its plans targets and references. The declared names resolve against the federation registry above. Configure it in .openlore/config.json (see Configuration), then check its health:
openlore spec-store status # human-readable: per-target resolution + index state, references, store path
openlore spec-store status --json # stable finding codes for an orchestrator (see docs/mcp-tools.md)Read-only and advisory — it reports binding health and always exits 0; it never blocks. Findings carry stable codes (target-unresolved, index-stale, reference-missing, registry-unreadable, …) each with a pasteable remediation. The matching MCP tool spec_store_status is exposed under openlore mcp --preset federation.
Working-set context
Once a binding is sound, assemble the structural briefing an active change actually needs — orient, generalized from one repo to the change's targets:
openlore working-set context --change <id> # human-readable: per-target items, callers, anchored intent
openlore working-set context --change <id> --json # documented JSON for an orchestrator to splice into its agent brief
openlore working-set context --change <id> --token-budget 4000 # cap the merged briefingIt reads the change's proposal under the bound store, orients each resolved+indexed target on that intent, and returns one budgeted, per-target-attributed briefing plus fresh in-scope anchored intent (orphaned withheld, drifted flagged). Read-only and advisory — always exits 0, never blocks. Findings carry stable codes (change-not-found, target-not-briefable, no-briefable-targets, …). The matching MCP tool working_set_context is exposed under openlore mcp --preset federation.
Change impact certificate
Certify what the current diff touches — and, crucially, what it newly reaches — before it lands. You declare covering surfaces (semantic/governance boundaries) under impactCertificate.surfaces in .openlore/config.json; the certificate reports the paths the change opens into each surface (reachable after the diff but not before), plus blast radius, drifted specs, and tests to run:
openlore impact-certificate # human-readable certificate for the working tree vs HEAD
openlore impact-certificate --base main --json # documented JSON (stable surface + path codes) for an orchestrator
openlore impact-certificate --change <id> --save # record the change id + persist for later decay re-checks
openlore impact-certificate --install-hook # install the ADVISORY pre-commit hook (never blocks by default)
openlore impact-certificate --uninstall-hook # remove the pre-commit hook block (coexists with other openlore hooks)Advisory by default — it emits the certificate and exits 0; an infrastructure failure (no index, not a repo) never blocks. A repository MAY opt into blocking specific surface severities with impactCertificate.block: ["critical"], in which case the --hook exits non-zero only when the diff opens a new path into a surface of that severity. Newly-opened-path detection is differential and deterministic (no LLM): only the changed files are re-parsed, renamed files read their base-ref content, untracked files are folded in, and an ambiguous added callee is reported, never guessed. The certificate decays via the freshness lease — when an anchored symbol later moves, openlore spec-store status re-fires it as a certificate-stale finding. The matching MCP tool change_impact_certificate is exposed under openlore mcp --preset federation.
Test-coverage gaps
Report important code with no reaching test, ranked by hub/chokepoint significance — the structural inverse of select_tests over the whole graph, with no test run, no coverage tool, and no runtime. It is gaps-only and honest: it reports "no reaching test" and never claims a symbol is "tested":
openlore coverage-gaps # whole repo, ranked (default 100, capped 500)
openlore coverage-gaps --max 50 # cap the list
openlore coverage-gaps --file-pattern src/core/auth # region scope
openlore coverage-gaps --base main # diff scope: gaps among symbols changed vs main
openlore coverage-gaps --symbols parseConfig,login # diff scope: only these changed symbols
openlore coverage-gaps --json # machine-readable (stable shape) for CI / an orchestratorA gap with no caller at all is labeled also-dead (distinct from find_dead_code); an untested entry point is untested-not-dead. A scope that resolves to nothing returns an explicit note ("nothing matched", not a reassuring "0 gaps"), and the counts (analyzedSymbols / reachableFromTest) range over the in-scope set. Read-only and advisory — it is a report and never blocks. The matching MCP tool report_coverage_gaps is exposed under openlore mcp --preset full. See coverage-gaps.md.
Find clones of a symbol or snippet
Answer the edit-time question "does a near-duplicate of this already exist that I should reuse?" — scoped to one query, where get_duplicate_report is the whole-repo audit. Reuses the same detector (exact / structural / near), one-vs-all so it finds near-clones even on repos large enough that the whole-repo near pass is skipped:
openlore find-clones --symbol getPyParser # clones of an indexed function
openlore find-clones --symbol 'getPyParser::src/core/analyzer/call-graph.ts' # disambiguate by path
openlore find-clones --snippet "$(cat candidate.ts)" # clones of code you're about to write
openlore find-clones --symbol handleFoo --min 0.6 --max 5 # lower the near floor, cap the list
openlore find-clones --symbol handleFoo --json # machine-readable (stable shape)Honest by construction: an unknown symbol is an explicit not-found (with candidates), never an empty "unique"; an ambiguous bare name lists name::path candidates; a query below the evidence floor reports "too small to compare", not "no clones"; the query never matches itself. The matching MCP tool find_clones is exposed under openlore mcp --preset full.
Error propagation
Answer “what error can leave this function, and is any already handled?” The error-handling analogue of analyze_impact supports exception flow for TypeScript, JavaScript, Python, Java, and C#, plus Go's returned-error and panic/recover model:
openlore error-propagation --symbol handleRequest # exceptions that escape this function
openlore error-propagation --symbol 'handleRequest::src/api/handler.ts' # disambiguate by path
openlore error-propagation --symbol parseConfig --max-depth 5 # bound the callee traversal (default 10)
openlore error-propagation --symbol parseConfig --json # machine-readable (stable shape)For exception-shaped languages, escapes lists each escaping type, origin, call path, and kind (direct, Java declared, or propagated); handledInternally lists exceptions caught before reaching callers. Java/C# typed handlers are exact-name lower bounds; a definitely abrupt finally suppresses try-body escapes, while uncertain finally/resource-cleanup effects are disclosed. Go results instead carry errorModel: go-value: entries use value with returned_error, propagated_error, or panic, while handledInternally contains proven checked_error and recovered_panic sites. Lexically scoped and named error results are tracked. Discarded or ambiguous results, complex deferred unwind ordering, malformed or stale source, unresolved callees, and traversal limits appear in boundaries, never as a guessed clean result.
All models are honest sound lower bounds. Exception containment is byte-precise, unknown thrown types remain <dynamic>, and unsupported languages return an explicit unsupported result. The analysis is computed live from the cached call graph plus confined source re-reads; it creates no persisted artifact. The matching MCP tool analyze_error_propagation is exposed under openlore mcp --preset full.
openlore env-impact --name DATABASE_URL # what breaks if this env var is removed
openlore env-impact --name PORT --max-depth 5 # bound the backward (caller) traversal (default 12)
openlore env-impact --name SECRET_KEY --json # machine-readable (stable shape)readSites locates each read of the env var to a file/line and its enclosing function (a read outside any function is reported module-level — it runs at import time, so its effective blast radius is every importer, disclosed in boundaries); each site carries required (true when no site-local fallback ??/|| or strict subscript means removing the var is a hard break there). affectedFunctions is the upstream callers that transitively reach a read (the blast radius, with distance); reachingTests is the tests to run. Honest by construction — a sound lower bound: an unknown var returns an explicit not-found with candidates (never an empty "unused"); config-object key reads (config.x.y) are an explicit out-of-scope boundary, never guessed; the call graph's resolution limits (dynamic dispatch, reflection) are disclosed; and a stale index (read-site lines come from the current source but map to cached function spans) is disclosed via a staleness marker + boundary, never presented as clean. An env-var name passed into a helper that performs the read is followed one hop where provable from literal text (a same-file free function whose single parameter is the whole key, called with a plain string literal); the site is reported at the call site with the helper in via, and every unfollowable non-literal read is counted in boundaries with its evidence in unfollowedEnvReads. Scope is env-var reads in TS/JS/Python/Go/Ruby (exactly what the env extractor scans); per-site required reflects the actual fallback (TS ??/||, Python/Ruby defaultless get/getenv/fetch vs. a positional or block default). Computed live from the cached graph plus a re-read of the var's files — no new persisted artifact. The matching MCP tool analyze_env_impact is exposed under openlore mcp --preset full; it is the conclusion companion to the get_env_vars inventory.
Public API surface contract
Certify whether the working-tree diff breaks the package's exported contract. With no --base it prints the public surface (exported symbols + signatures); with --base <ref> it prints a deterministic breaking-change verdict — each changed export classified breaking / non-breaking / potentially-breaking, and each breaking one paired with the in-repo consumers it breaks:
openlore certify-public-surface # print the public surface (exported symbols + signatures)
openlore certify-public-surface --base main # breaking-change verdict for the working tree vs main
openlore certify-public-surface --max 50 # cap the surface listing in surface mode (default 200, cap 500)
openlore certify-public-surface --base HEAD --json # machine-readable verdict (stable shape) for CI / an orchestrator
openlore certify-public-surface --base main --federation # also count consumers in indexed sibling repos
openlore certify-public-surface --base v2.0.0 --accept --justification "v3 drops the legacy parser" [--decision a1b2c3d4]The closed classification rules: a removed or renamed export, an added required parameter, a parameter made required, or a narrowed parameter/return type is breaking; an added trailing optional parameter, a new export, or a widened return type is non-breaking; anything that cannot be proven compatible from the available signatures (untyped/dynamically-typed, or an incomparable type change) is potentially-breaking — never silently safe, since there is no type checker and no build in the loop. A renamed export is reported as a rename (via symbol-identity continuity), not a remove+add. A symbol still defined but no longer exported is reported as visibility-reduced (public → private); a re-export (export { X } from …) follows its definition — it is tracked at the definition site, not separately at the barrel, so a barrel'd symbol is never double-counted. Each breaking or potentially-breaking change, and each added export, carries stable rule codes (export-removed, export-renamed, export-visibility-reduced, param-removed, param-required-added, param-became-required, param-type-narrowed, return-type-narrowed, signature-unprovable, export-added), and the verdict carries a suggestedBump: major when any change is breaking; withheld (null, printed as withheld (reason)) when any change is potentially-breaking or any changed code file is in a language whose signatures are not classified (for example Go, Vue, or shell; test, Terraform, and config files do not count); otherwise minor when an export was added, else patch (an added optional parameter or a widened return type alone suggests patch). Each breaking rule code (severity error) and each signature-unprovable (severity warning) is also a registered governance finding in findings[], so the caller that runs the tool can gate an individual rule with enforcement.policy; openlore enforce does not run it. Each breaking change is also split into breaking-consumed (at least one indexed consumer binds it; the consumers are listed, each with how it binds: a resolved call; an import of the symbol by name, aliases resolved and followed through re-exporting modules; a module-import (a default, namespace, or whole-module import that may use it); or an unresolved-call from an importing file or the defining file when the index was rebuilt after the symbol went away) or breaking-unconsumed-in-index (none found). consumerCensus names the import evidence used and what it cannot see — imports the analyzer does not resolve (for example Python absolute imports in a src layout) and aliased re-exports. For a rename only callers of the old name count; for a removed export keyword only other files count. Zero indexed consumers is never "safe": external/unindexed consumers are disclosed as a known-unknowable boundary on both. By default only in-repo consumers are checked; --federation (optionally --federation-repos a,b) also counts consumers in indexed sibling repos, matched by symbol name, and names the repos it checked and skipped. --accept --justification "<why>" records the diff's unaccepted breaking findings in the checked-in .openlore/public-surface-baseline.jsonl (one sorted JSON line per rule code, symbol, and discriminator — the before/after contract with parameter names and types but not formatting, the removed declaration, or the rename target — so accepting one break never covers a later, different one). --accept never edits .gitignore: it reports whether Git tracks, would track, or ignores the file, and for an ignored file (the usual case, since .openlore/ is ignored) prints the one command that adds it: git add -f .openlore/public-surface-baseline.jsonl. Once committed, ignore rules no longer apply to it. It refuses without a justification, never overwrites a baseline it cannot read, never accepts findings computed against a fallback base, and never silently drops a decision anchor: re-accepting an entry whose decision expired needs a new --decision. An accepted entry's justification is changed by editing the file. Later runs list a matched finding under baseline.accepted with its justification and leave it out of findings[]; the verdict, summary, and bump still count it, and any new break still reports. --decision <id> anchors the acceptance to a current decision: when that decision is superseded, rejected, or missing, the acceptance is listed as stale (naming the superseder) and the finding reports again. A baseline that cannot be read honors nothing and says why. Signature classification covers TypeScript/JavaScript/Python; other languages fail-soft to surface membership only (a removed/added export is still reported, without a signature classification). Test files are excluded from the surface. Advisory — it is a report and never blocks; its only write is --accept. The matching MCP tool certify_public_surface is exposed under openlore mcp --preset full.
Service contract certification
Check OpenAPI 3.x and Swagger 2.0 documents against the routes that serve them and the clients that call them:
openlore certify-service-contract # declared operations + parity with the indexed route handlers
openlore certify-service-contract --base main # verdict for each changed contract element vs the merge-base
openlore certify-service-contract --base main --jsonWithout --base, every specification in the repository (tracked or untracked, not ignored; node_modules, vendor, dist, and build skipped) is listed with its operations, and parity is checked against the route inventory openlore analyze writes: an operation no handler serves, and a handler under a path the specification covers (the operation's path or its parent) that the specification does not declare. A route is matched with and without the specification's base path (servers[0].url or basePath), and path parameters match whatever the framework names them. With --base <ref>, each changed element gets one rule from a closed table — breaking, dangerous, non-breaking, or potentially-breaking — and each breaking or dangerous one lists the client call sites in this repository whose method and literal path match. Only local $refs are followed; external $refs, oneOf/anyOf, callbacks, and webhooks are listed as outside the model. Every element also carries a hash of what the rules do not compare (constraints, nested schemas, composition, media types, status codes), so any other difference is potentially-breaking, which withholds the suggested version bump. Renaming a path parameter, reordering a set (required, enum), or moving a schema into components is not a change. A specification that cannot be parsed is notAssessed, never "no changes". Findings contract-breaking, contract-declared-unimplemented, and contract-implemented-undeclared are advisory unless enforcement.policy says otherwise; openlore enforce does not run this command. The matching MCP tool certify_service_contract is exposed under openlore mcp --preset full.
Change significance briefing
openlore briefing-since # what changed since the auto base (main → master → HEAD~1)
openlore briefing-since --base HEAD~20 # brief everything that changed in the last 20 commits
openlore briefing-since --file-pattern src/core/auth # region scope
openlore briefing-since --max 25 # bound the briefing (default 50, capped 200)
openlore briefing-since --base main --json # machine-readable (stable shape) for CI / an orchestratorbriefing-since answers the reviewer / catch-up / onboarding question the other change tools don't — not "what does my pending diff do?" but "a lot changed since I last looked; which of it structurally matters?" Each changed production symbol is labeled with exactly one tier, ordered highest-first: surprising-change (a high-fan-in hub whose file rarely changed before — a normally-stable, widely-depended-on symbol that suddenly moved) > hub-change (a broad high-fan-in/high-fan-out hub) > chokepoint-change (a high-fan-in funnel) > ordinary-change. The tiers come entirely from existing classifiers (landmark-signals hub/orchestrator/chokepoint + the volatilityLevel churn classifier) plus raw evidence (fan-in, fan-out, prior churn) — there is no weighted significance score and no new tuning constant; the caller makes the final judgment from the evidence. Honest by construction: changed symbols are exact where both revisions hash cleanly (normalized per-symbol content hashes: a formatting- or comment-only edit is not a change, and a rename is listed under carried), and a changed file kept whole — a module-level change, parse errors, a language with no native parse tree — is named with its reason in changeGranularity; the surprising-change label is withheld when git history is too shallow (< 2 non-bulk commits) to say "rarely changed before", and withheld per file for a file added (or renamed into its path) in the briefed range with no pre-base churn there (a brand-new file's zero churn is not stability — its symbols are still briefed one tier lower, with the withholding stated per entry and counted in withholding); the hub-derived tiers are likewise withheld from a function-local helper — a function nested inside another with every caller inside it, whose fan-in is internal to one body, so the significance belongs to the enclosing symbol; a bounded briefing always carries a truncation receipt (omitted count + per-tier breakdown + lowest tier reached) and never drops a higher tier for a lower one; a silent base-ref fallback is disclosed — a --base that git cannot resolve (a typo) is reported (baseRefFallback) and you are told which base was actually used, rather than briefing against main unannounced; because per-file churn is matched by exact path (git history does not follow renames), a just-renamed file that reads as low-churn carries a caveat so its surprising-change label isn't trusted blindly; and the scope is hand-authored source code — infrastructure (IaC) resources and generated/vendored files are excluded (the same candidate set coverage-gaps ranks), so the briefing stays about the code whose call-graph significance the tiers actually measure. The cursor is the base ref, never wall-clock time. It also includes the tests to run for the whole change set (via select_tests), grouped by region/community. Deterministic and offline. The matching MCP tool briefing_since is exposed under openlore mcp --preset full.
Enforcement gate
openlore enforce is the unified finding-enforcement gate. It collects governance findings from every in-scope source, resolves each finding's enforcement class through the single declared enforcement.policy (with the legacy blastRadius.block / impactCertificate.block sugar lowered onto it), and — in --hook mode — fails the commit on an ordinary blocking finding, a new finding under frozen, an invalid baseline, or an unstaged ratchet update:
openlore enforce # human-readable gate report for the working tree (advisory)
openlore enforce --json # schemaVersion:3 JSON: gated, blocking[], new[], frozen[], advisory[], off[], ratchet{}, caveats[]
openlore enforce --hook # hook mode: exit 1 on policy or frozen-baseline gate failures
openlore enforce --agent-hook --git-root # agent-loop mode from any repo subdirectory; exit 2 only for configured blocking findings
openlore enforce --install-hook # install the unified pre-commit hook (coexists with the decisions gate)
openlore enforce --uninstall-hookSources: the stale-decision-reference check always runs (a cheap walk of the decision graph + anchored references — it flags a live, authoritative artifact that still cites a superseded decision); the blast-radius orphan patterns and impact-certificate surfaces are collected only when the repository has configured them (those analyses are diff-heavy). Only successfully assessed sources may initialize or shrink a frozen baseline. Advisory by default: a repository that declares no enforcement.policy never blocks, and an off-classed finding is still listed (silenced, not invisible). To adopt brownfield debt, map a code to frozen, run openlore enforce outside hook mode, review the resulting config and baseline, then stage .gitignore plus both .openlore/config.json and .openlore/enforcement-baseline.jsonl. Hook and PR-review modes refuse to initialize a missing baseline; PR review is read-only and never shrinks one. Deterministic, no LLM.
For opt-in Stop hooks, run openlore setup --agent-enforcement-hook claude, codex, or all. The installer merges one idempotent entry into .claude/settings.json and/or .codex/hooks.json; openlore setup --agent-enforcement-hook none removes only those OpenLore entries. Installed commands use --git-root, so enforcement still reads the repository-level configuration when an agent session starts in a subdirectory. Hook-settings updates coordinate through owner-only runtime state under ~/.openlore/runtime/settings-writes/; repository settings remain ownership-checked and are never overwritten after a concurrent change. Codex requires its normal project-hook trust review before a new hook runs. In agent-hook mode, remediation is printed before the finding conclusion when the code declares a static template. frozen stays advisory in the agent loop, and configuration or source failures emit caveats and exit 0.
The version 3 JSON envelope adds disjoint new[] and frozen[] ratchet partitions plus ratchet metadata while retaining blocking[] as the complete list of finding-driven gate causes. Non-finding failures, such as baseline integrity, configuration, or staging failures, are reported in ratchet and caveats. It keeps the closed finding-severity vocabulary info | warning | error | critical. Version 2 consumers can continue reading the existing partitions; version 1 consumers that matched the legacy value warn must migrate to warning.
Node-version guard
OpenLore requires Node ≥22.22 (the supported dependency floor where the
built-in node:sqlite is available without runtime flags). The CLI checks this before
any command runs; under an older Node it prints one stderr line naming the
required and actual versions and exits with the stable code 78 — never a
stack trace — so a tool that spawns OpenLore surfaces a clean, legible failure.
Serve (warm daemon)
openlore serve runs a long-lived loopback HTTP daemon that keeps openlore's
caches warm across calls and, with --watch (default), keeps the analysis
continuously fresh — signatures/vector live, plus a debounced full call-graph
re-analyze after each edit burst. It exposes the same tools as the MCP server
over plain HTTP so non-MCP clients (e.g. the Pi extension in
examples/pi/) can hit them with fetch — no JSON-RPC, no subprocess-per-call.
openlore serve # substrate preset, ephemeral port, watch on
openlore serve --preset all --port 7077 # all 83 tools on a fixed port
openlore serve --no-watch # transport only, no freshness lane
openlore serve --stop # stop the daemon serving this directory| Option | Description |
|---|---|
-d, --directory <path> | Project root to serve; discovery file written here (default: cwd) |
-p, --port <number> | Port to bind (default: ephemeral free port) |
--host <host> | Host to bind (default: 127.0.0.1) |
--preset <name> | Callable surface enforced at dispatch and reported by /health: substrate (default), navigation (the lean navigate-only escape), minimal, or all/full (the full surface — full matches the openlore mcp selector name). Requests for registered tools outside the active preset return 403 before validation or side effects |
--token <token> | Require this token as the x-openlore-token header (default: $OPENLORE_SERVE_TOKEN) |
--no-watch | Disable the freshness watcher + re-analyze lane |
--stop | Stop a running daemon for --directory and exit |
Endpoints: GET /health, authenticated POST /shutdown, and POST /tool/:name
with body { "directory": "...", "args": { ... } }. Discovery: the daemon writes
.openlore/serve.json { port, pid, host, token? } (removed on clean shutdown).
/health reports presetDispatchEnforced, root, pid, preset, tools,
tokenProtected, and tokenAuthenticated. Clients MUST require the semantic marker,
exact root, and authenticated token proof before trusting the descriptor or callable
surface. --stop uses the authenticated shutdown endpoint; it never signals the
descriptor PID.
If a shared-daemon connection fails after a non-idempotent write is sent, OpenLore
reports an unknown outcome instead of replaying the write locally.
PORT=$(jq .port .openlore/serve.json)
curl 127.0.0.1:$PORT/health
curl -XPOST 127.0.0.1:$PORT/tool/orient -d '{"args":{"task":"add rate limiting"}}'Pi integration
openlore install --agent pi (or openlore connect pi) installs the Pi extension
to .pi/extensions/openlore.js — a re-export shim pointing into the openlore
package, at parity with every other agent surface. Two
equivalent routes: pi install npm:openlore (Pi's own package route, via the "pi"
field in openlore's package.json) and openlore setup --tools pi --global
(~/.pi/agent/extensions/, every project). It auto-starts and talks to the
serve daemon, injecting structural context and exposing Pi's curated tool surface.
Pi starts a full-preset backing daemon and curates the model-visible tools itself;
if an existing narrow daemon owns the repository, stop it before starting Pi.
A session starts with the substrate tools (the MCP default) except the two
spec-authoring tools, openlore_configure, and openlore_activate_tools, which
turns on the specs (including spec authoring), memory, review, quality,
or inspect group. "pi": { "toolSurface": "all" } in
.openlore/config.json keeps every tool active.
Its openlore_prepare_spec_generation and openlore_prepare_spec_repair tools
compose the same deterministic daemon evidence used by MCP hosts; Pi writes or
reconciles the specification itself and OpenLore makes no internal LLM call.
See examples/pi/README.md.
Developer Scripts
| Script | Description |
|---|---|
npm run bench | EdgeStore micro-benchmark (node lookup, BFS, orient path) — requires openlore analyze |
npm run bench:mcp | MCP handler benchmark — measures cold vs warm path for readCachedContext, handleOrient, handleSearchCode. Requires openlore analyze. Pass a project dir: npm run bench:mcp -- /path/to/project |
512 files · 450 not served here
- .claude/commands/first-run-hardening.md (not served here)
- .gitattributes (not served here)
- .github/CODEOWNERS (not served here)
- .github/ISSUE_TEMPLATE/bug_report.md (not served here)
- .github/PULL_REQUEST_TEMPLATE.md (not served here)
- .github/actions/openlore-review/action.yml (not served here)
- .github/codeql/codeql-config.yml (not served here)
- .github/dependabot.yml (not served here)
- .github/windows-unit-exclusions.json (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/codeql.yml (not served here)
- .github/workflows/openlore-review.yml.example (not served here)
- .github/workflows/release.yml (not served here)
- .github/workflows/scorecard.yml (not served here)
- .gitignore (not served here)
- .npmrc (not served here)
- .nvmrc (not served here)
- .prettierrc (not served here)
- AGENTS.md
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- LICENSE
- README.md
- ROADMAP.md
- SECURITY.md
- bench/Dockerfile (not served here)
- bench/PROTOCOL.md (not served here)
- bench/container-entrypoint.sh (not served here)
- bench/container/package-lock.json (not served here)
- bench/container/package.json (not served here)
- bench/corpora/default-surface.json (not served here)
- bench/results/adr-0023-default-surface.json (not served here)
- bench/retrieval/queries/gridprims.json (not served here)
- bench/retrieval/queries/openlore.json (not served here)
- bench/retrieval/queries/roughlogic.json (not served here)
- bench/retrieval/results/2026-10-31.json (not served here)
- bench/retrieval/results/2026-11-01.json (not served here)
- bench/retrieval/run.ts (not served here)
- bench/rules/adr-0023.json (not served here)
- bench/run.ts (not served here)
- benchmarks/certified-scale-v1.json (not served here)
- docs/AGENT-ADOPTION.md
- docs/AGENT-BENCHMARKS.md
- docs/ALGORITHMS.md
- docs/ARCHITECTURE.md
- docs/OPENSPEC-FORMAT.md
- docs/OPENSPEC-INTEGRATION.md
- docs/PHILOSOPHY.md
- docs/README.md
- docs/REFACTORING-WORKFLOW.md
- docs/TROUBLESHOOTING.md
- docs/agent-setup.md
- docs/agentic-workflows.md
- docs/agentic-workflows/BMAD.md (not served here)
- docs/agentic-workflows/README.md (not served here)
- docs/agents/domain.md (not served here)
- docs/agents/issue-tracker.md (not served here)
- docs/agents/triage-labels.md (not served here)
- docs/api.md
- docs/architecture-invariants.md
- docs/change-coupling.md
- docs/check-weakening.md
- docs/ci-cd.md
- docs/cli-reference.md
- docs/configuration.md
- docs/contracts.md
- docs/coverage-gaps.md
- docs/cross-domain-impact.md
- docs/cross-service-topology.md
- docs/drift-detection.md
- docs/federation.md
- docs/generated-files.md
- docs/governance-dogfooding.md
- docs/iac.md
- docs/install.md
- docs/language-support.md
- docs/languages.md
- docs/mcp-tools.md
- docs/openlore-gallery-source.svg (not served here)
- docs/openlore-gallery.png (not served here)
- docs/output.md
- docs/performance-envelope.md
- docs/phantom-references.md
- docs/pipeline.md
- docs/preflight.md
- docs/provenance.md
- docs/providers.md
- docs/publishing.md
- docs/reachability-dead-code.md
- docs/scip-export.md
- docs/semantic-search.md
- docs/session-ledger.md
- docs/shareable-bundle.md
- docs/spec-link-index.md
- docs/spec-tests.md
- docs/specs/generation-repair/openlore-capability-audit.md (not served here)
- docs/specs/generation-repair/openlore-generation-repair-hlspec.md (not served here)
- docs/specs/generation-repair/openlore-resume-point.md (not served here)
- docs/specs/generation-repair/openlore-unified-hlspec-v2.md (not served here)
- docs/structural-diff.md
- docs/test-impact-selection.md
- docs/viewer.md
- docs/windows-support.md
- eslint.config.js (not served here)
- examples/bmad/README.md (not served here)
- examples/bmad/agents/architect.md (not served here)
- examples/bmad/agents/dev-brownfield.md (not served here)
- examples/bmad/setup/architect.customize.yaml (not served here)
- examples/bmad/tasks/implement-story.md (not served here)
- examples/bmad/tasks/onboarding.md (not served here)
- examples/bmad/tasks/refactor.md (not served here)
- examples/bmad/tasks/sprint-planning.md (not served here)
- examples/bmad/templates/story.md (not served here)
- examples/ci/openlore-preflight.gitlab.yml (not served here)
- examples/ci/openlore-preflight.sh (not served here)
- examples/ci/openlore-preflight.yml (not served here)
- examples/cline-workflows/openlore-analyze-codebase.md (not served here)
- examples/cline-workflows/openlore-check-spec-drift.md (not served here)
- examples/cline-workflows/openlore-execute-refactor.md (not served here)
- examples/cline-workflows/openlore-implement-feature.md (not served here)
- examples/cline-workflows/openlore-plan-refactor.md (not served here)
- examples/cline-workflows/openlore-refactor-codebase.md (not served here)
- examples/cline-workflows/openlore-write-tests.md (not served here)
- examples/drift-demo/openspec/config.yaml (not served here)
- examples/drift-demo/openspec/specs/architecture/spec.md (not served here)
- examples/drift-demo/openspec/specs/auth/spec.md (not served here)
- examples/drift-demo/openspec/specs/database/spec.md (not served here)
- examples/drift-demo/openspec/specs/overview/spec.md (not served here)
- examples/drift-demo/openspec/specs/projects/spec.md (not served here)
- examples/drift-demo/openspec/specs/tasks/spec.md (not served here)
- examples/drift-demo/package.json (not served here)
- examples/drift-demo/src/auth/auth-middleware.ts (not served here)
- examples/drift-demo/src/auth/auth-routes.ts (not served here)
- examples/drift-demo/src/auth/auth-service.ts (not served here)
- examples/drift-demo/src/database/connection.ts (not served here)
- examples/drift-demo/src/index.ts (not served here)
- examples/drift-demo/src/projects/project-model.ts (not served here)
- examples/drift-demo/src/projects/project-service.ts (not served here)
- examples/drift-demo/src/tasks/task-model.ts (not served here)
- examples/drift-demo/src/tasks/task-routes.ts (not served here)
- examples/drift-demo/src/tasks/task-service.ts (not served here)
- examples/drift-demo/src/utils/validation.ts (not served here)
- examples/drift-demo/tests/auth.test.ts (not served here)
- examples/drift-demo/tests/tasks.test.ts (not served here)
- examples/drift-demo/tsconfig.json (not served here)
- examples/drift-test/run-drift-test.sh (not served here)
- examples/gsd/README.md (not served here)
- examples/gsd/commands/gsd/openlore-drift.md (not served here)
- examples/gsd/commands/gsd/openlore-orient.md (not served here)
- examples/mistral-vibe/README.md (not served here)
- examples/mistral-vibe/antipatterns-template.md (not served here)
- examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-debug/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-generate/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-implement-story/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-review-changes/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-write-tests/SKILL.md (not served here)
- examples/opencode-skills/openlore-analyze-codebase/SKILL.md (not served here)
- examples/opencode-skills/openlore-brainstorm/SKILL.md (not served here)
- examples/opencode-skills/openlore-debug/SKILL.md (not served here)
- examples/opencode-skills/openlore-execute-refactor/SKILL.md (not served here)
- examples/opencode-skills/openlore-generate/SKILL.md (not served here)
- examples/opencode-skills/openlore-implement-story/SKILL.md (not served here)
- examples/opencode-skills/openlore-plan-refactor/SKILL.md (not served here)
- examples/opencode-skills/openlore-review-changes/SKILL.md (not served here)
- examples/opencode-skills/openlore-write-tests/SKILL.md (not served here)
- examples/opencode/agent-guard.ts (not served here)
- examples/opencode/plugins/anti-laziness.ts (not served here)
- examples/opencode/plugins/lib/openlore-context-injector-helpers.ts (not served here)
- examples/opencode/plugins/lib/openlore-decision-extractor-helpers.ts (not served here)
- examples/opencode/plugins/openlore-context-injector.test.ts (not served here)
- examples/opencode/plugins/openlore-context-injector.ts (not served here)
- examples/opencode/plugins/openlore-decision-extractor.test.ts (not served here)
- examples/opencode/plugins/openlore-decision-extractor.ts (not served here)
- examples/opencode/plugins/openlore-enforcer.ts (not served here)
- examples/opencode/prompts/sisyphus-sdd.md (not served here)
- examples/openspec-analysis/README.md (not served here)
- examples/openspec-analysis/SUMMARY.md (not served here)
- examples/openspec-analysis/config.json (not served here)
- examples/openspec-analysis/dependencies.mermaid (not served here)
- examples/openspec-analysis/dependency-graph.json (not served here)
- examples/openspec-analysis/llm-context.json (not served here)
- examples/openspec-analysis/repo-structure.json (not served here)
- examples/openspec-cli/README.md (not served here)
- examples/openspec-cli/openspec/config.yaml (not served here)
- examples/openspec-cli/openspec/specs/architecture/spec.md (not served here)
- examples/openspec-cli/openspec/specs/artifact-graph/spec.md (not served here)
- examples/openspec-cli/openspec/specs/cli/spec.md (not served here)
- examples/openspec-cli/openspec/specs/overview/spec.md (not served here)
- examples/openspec-cli/openspec/specs/parsing/spec.md (not served here)
- examples/openspec-cli/openspec/specs/validation/spec.md (not served here)
- examples/pi/README.md (not served here)
- examples/spec-kit/README.md (not served here)
- examples/spec-kit/commands/drift.md (not served here)
- examples/spec-kit/commands/orient.md (not served here)
- examples/spec-kit/extension.yml (not served here)
- flake.lock (not served here)
- flake.nix (not served here)
- openspec/changes/BACKGROUND-SUBSTRATE-2026-10.md (not served here)
- openspec/changes/COMPETITIVE-SUBSTRATE-2026-07.md (not served here)
- openspec/changes/CONTRACT-GRAPH-AND-AGENT-LOOP-2026-10.md (not served here)
- openspec/changes/DOGFOOD-call-resolution-recall.md (not served here)
- openspec/changes/DOGFOOD-change-impact-certificate.md (not served here)
- openspec/changes/DOGFOOD-v2.0.19.md (not served here)
- openspec/changes/DOGFOOD-v2.1.1-tool-count-drift.md (not served here)
- openspec/changes/DOGFOOD-widen-js.md (not served here)
- openspec/changes/E2E-AUDIT-2026-07.md (not served here)
- openspec/changes/E2E-FIRSTRUN-2026-07-27.md (not served here)
- openspec/changes/ECOSYSTEM-RESEARCH-2026-07-27.md (not served here)
- openspec/changes/FEATURE-UPDATES.md (not served here)
- openspec/changes/FIELD-RESEARCH-2026-07.md (not served here)
- openspec/changes/GOVERNANCE-SUBSTRATE-2026-07-31.md (not served here)
- openspec/changes/HARDEN-DISTRIBUTION-AND-SUBSTRATE.md (not served here)
- openspec/changes/KNOWN-LIMITATIONS-2026-07.md (not served here)
- openspec/changes/KOTLIN-TOTAL-SUPPORT-2026-10.md (not served here)
- openspec/changes/PARALLEL-WORK-COORDINATION.md (not served here)
- openspec/changes/README.md (not served here)
- openspec/changes/RELEASE-v2.1.0.md (not served here)
- openspec/changes/RELEASE-v2.1.1.md (not served here)
- openspec/changes/RELEASE-v2.1.2.md (not served here)
- openspec/changes/RELEASE-v2.1.4.md (not served here)
- openspec/changes/RELEASE-v2.1.5.md (not served here)
- openspec/changes/SPEC-STORE-INTEGRATION.md (not served here)
- openspec/changes/STATUS.md (not served here)
- openspec/changes/STRUCTURAL-CONTEXT-PATTERNS.md (not served here)
- openspec/changes/SUBSTRATE-WHITESPACE-2026-07-27.md (not served here)
- openspec/changes/add-agent-loop-hooks-task-created/proposal.md (not served here)
- openspec/changes/add-agent-loop-hooks-task-created/specs/cli/spec.md (not served here)
- openspec/changes/add-agent-loop-hooks-task-created/tasks.md (not served here)
- openspec/changes/add-assumption-anchored-resolutions/proposal.md (not served here)
- openspec/changes/add-assumption-anchored-resolutions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-assumption-anchored-resolutions/tasks.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/proposal.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/specs/analyzer/spec.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/tasks.md (not served here)
- openspec/changes/add-build-graph-ingest/proposal.md (not served here)
- openspec/changes/add-build-graph-ingest/specs/analyzer/spec.md (not served here)
- openspec/changes/add-build-graph-ingest/specs/architecture/spec.md (not served here)
- openspec/changes/add-build-graph-ingest/tasks.md (not served here)
- openspec/changes/add-call-site-usage-profile/proposal.md (not served here)
- openspec/changes/add-call-site-usage-profile/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-call-site-usage-profile/tasks.md (not served here)
- openspec/changes/add-callgraph-soundness-calibration/proposal.md (not served here)
- openspec/changes/add-callgraph-soundness-calibration/specs/analyzer/spec.md (not served here)
- openspec/changes/add-callgraph-soundness-calibration/tasks.md (not served here)
- openspec/changes/add-change-provenance-certificate/proposal.md (not served here)
- openspec/changes/add-change-provenance-certificate/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-change-provenance-certificate/tasks.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/proposal.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/specs/analyzer/spec.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/tasks.md (not served here)
- openspec/changes/add-coverage-map-test-selection/proposal.md (not served here)
- openspec/changes/add-coverage-map-test-selection/specs/analyzer/spec.md (not served here)
- openspec/changes/add-coverage-map-test-selection/tasks.md (not served here)
- openspec/changes/add-data-flow-conclusions/proposal.md (not served here)
- openspec/changes/add-data-flow-conclusions/specs/analyzer/spec.md (not served here)
- openspec/changes/add-data-flow-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-data-flow-conclusions/tasks.md (not served here)
- openspec/changes/add-datastore-access-graph/proposal.md (not served here)
- openspec/changes/add-datastore-access-graph/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-datastore-access-graph/tasks.md (not served here)
- openspec/changes/add-dependency-impact-analysis/proposal.md (not served here)
- openspec/changes/add-dependency-impact-analysis/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-dependency-impact-analysis/tasks.md (not served here)
- openspec/changes/add-doc-claim-certification/proposal.md (not served here)
- openspec/changes/add-doc-claim-certification/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-doc-claim-certification/tasks.md (not served here)
- openspec/changes/add-effect-purity-inference/proposal.md (not served here)
- openspec/changes/add-effect-purity-inference/specs/analyzer/spec.md (not served here)
- openspec/changes/add-effect-purity-inference/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-effect-purity-inference/tasks.md (not served here)
- openspec/changes/add-ffi-boundary-edges/proposal.md (not served here)
- openspec/changes/add-ffi-boundary-edges/specs/analyzer/spec.md (not served here)
- openspec/changes/add-ffi-boundary-edges/tasks.md (not served here)
- openspec/changes/add-flag-impact-analysis/proposal.md (not served here)
- openspec/changes/add-flag-impact-analysis/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-flag-impact-analysis/tasks.md (not served here)
- openspec/changes/add-fleet-coordination-arc/proposal.md (not served here)
- openspec/changes/add-fleet-coordination-arc/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-fleet-coordination-arc/tasks.md (not served here)
- openspec/changes/add-iac-deploy-binding-commands/proposal.md (not served here)
- openspec/changes/add-iac-deploy-binding-commands/specs/analyzer/spec.md (not served here)
- openspec/changes/add-iac-deploy-binding-commands/tasks.md (not served here)
- openspec/changes/add-incremental-early-cutoff/proposal.md (not served here)
- openspec/changes/add-incremental-early-cutoff/specs/analyzer/spec.md (not served here)
- openspec/changes/add-incremental-early-cutoff/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-incremental-early-cutoff/tasks.md (not served here)
- openspec/changes/add-invalidation-receipts/proposal.md (not served here)
- openspec/changes/add-invalidation-receipts/specs/drift/spec.md (not served here)
- openspec/changes/add-invalidation-receipts/tasks.md (not served here)
- openspec/changes/add-knowledge-map-and-coupling-upgrades/proposal.md (not served here)
- openspec/changes/add-knowledge-map-and-coupling-upgrades/specs/analyzer/spec.md (not served here)
- openspec/changes/add-knowledge-map-and-coupling-upgrades/tasks.md (not served here)
- openspec/changes/add-log-anchor-conclusions/proposal.md (not served here)
- openspec/changes/add-log-anchor-conclusions/specs/analyzer/spec.md (not served here)
- openspec/changes/add-log-anchor-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-log-anchor-conclusions/tasks.md (not served here)
- openspec/changes/add-lsp-evidence-tier/proposal.md (not served here)
- openspec/changes/add-lsp-evidence-tier/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-lsp-evidence-tier/tasks.md (not served here)
- openspec/changes/add-merge-semantic-certificate/proposal.md (not served here)
- openspec/changes/add-merge-semantic-certificate/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-merge-semantic-certificate/tasks.md (not served here)
- openspec/changes/add-migration-impact-certificate/proposal.md (not served here)
- openspec/changes/add-migration-impact-certificate/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-migration-impact-certificate/tasks.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/design.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/proposal.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/specs/cli/spec.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/specs/openspec/spec.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/tasks.md (not served here)
- openspec/changes/add-ownership-tagged-conclusions/proposal.md (not served here)
- openspec/changes/add-ownership-tagged-conclusions/specs/architecture/spec.md (not served here)
- openspec/changes/add-ownership-tagged-conclusions/tasks.md (not served here)
- openspec/changes/add-refactoring-aware-churn/proposal.md (not served here)
- openspec/changes/add-refactoring-aware-churn/specs/analyzer/spec.md (not served here)
- openspec/changes/add-refactoring-aware-churn/tasks.md (not served here)
- openspec/changes/add-resource-lifecycle-conclusions/proposal.md (not served here)
- openspec/changes/add-resource-lifecycle-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-resource-lifecycle-conclusions/tasks.md (not served here)
- openspec/changes/add-scip-index-interchange/proposal.md (not served here)
- openspec/changes/add-scip-index-interchange/specs/analyzer/spec.md (not served here)
- openspec/changes/add-scip-index-interchange/specs/cli/spec.md (not served here)
- openspec/changes/add-scip-index-interchange/tasks.md (not served here)
- openspec/changes/add-shared-state-hazard-conclusions/proposal.md (not served here)
- openspec/changes/add-shared-state-hazard-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-shared-state-hazard-conclusions/tasks.md (not served here)
- openspec/changes/add-store-origin-provenance/proposal.md (not served here)
- openspec/changes/add-store-origin-provenance/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-store-origin-provenance/tasks.md (not served here)
- openspec/changes/add-structural-search-tool/proposal.md (not served here)
- openspec/changes/add-structural-search-tool/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-structural-search-tool/tasks.md (not served here)
- openspec/changes/add-symbol-provenance-conclusions/proposal.md (not served here)
- openspec/changes/add-symbol-provenance-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-symbol-provenance-conclusions/tasks.md (not served here)
- openspec/changes/add-team-memory-promotion/proposal.md (not served here)
- openspec/changes/add-team-memory-promotion/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-team-memory-promotion/tasks.md (not served here)
- openspec/changes/add-test-evidence-claims/.openspec.yaml (not served here)
- openspec/changes/add-test-evidence-claims/design.md (not served here)
- openspec/changes/add-test-evidence-claims/proposal.md (not served here)
- openspec/changes/add-test-evidence-claims/specs/analyzer/spec.md (not served here)
- openspec/changes/add-test-evidence-claims/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-test-evidence-claims/tasks.md (not served here)
- openspec/changes/add-verification-feedback-loop/proposal.md (not served here)
- openspec/changes/add-verification-feedback-loop/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-verification-feedback-loop/tasks.md (not served here)
- openspec/changes/add-vuln-reachability-triage/proposal.md (not served here)
- openspec/changes/add-vuln-reachability-triage/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-vuln-reachability-triage/tasks.md (not served here)
- openspec/changes/adopt-agent-context-interop/proposal.md (not served here)
- openspec/changes/adopt-agent-context-interop/specs/cli/spec.md (not served here)
- openspec/changes/adopt-agent-context-interop/specs/generator/spec.md (not served here)
- openspec/changes/adopt-agent-context-interop/tasks.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/proposal.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/specs/mcp-quality/spec.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/tasks.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/proposal.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/specs/drift/spec.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/specs/verifier/spec.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-add-doc-claim-sync-guards/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-add-doc-claim-sync-guards/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-25-add-doc-claim-sync-guards/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-add-language-capability-conformance/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-add-language-capability-conformance/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-add-language-capability-conformance/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-add-stable-nested-function-identity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-add-stable-nested-function-identity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-add-stable-nested-function-identity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-enforce-conclusion-contract-runtime/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-enforce-conclusion-contract-runtime/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-25-enforce-conclusion-contract-runtime/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-cli-conclusion-honesty/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-cli-conclusion-honesty/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-cli-conclusion-honesty/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-clone-string-normalization/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-clone-string-normalization/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-clone-string-normalization/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-export-parser-fidelity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-export-parser-fidelity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-export-parser-fidelity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-language-detection-single-source/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-language-detection-single-source/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-language-detection-single-source/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-node-sqlite-engine-floor/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-node-sqlite-engine-floor/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-node-sqlite-engine-floor/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-route-anchor-fidelity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-route-anchor-fidelity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-route-anchor-fidelity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-test-suite-hygiene/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-test-suite-hygiene/specs/project/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-test-suite-hygiene/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-artifact-write-atomicity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-artifact-write-atomicity/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-artifact-write-atomicity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-call-resolution-ambiguity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-call-resolution-ambiguity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-call-resolution-ambiguity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-index-store-lifecycle/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-index-store-lifecycle/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-index-store-lifecycle/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-local-http-surfaces/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-local-http-surfaces/specs/mcp-security/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-local-http-surfaces/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-serve-descriptor-trust/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-serve-descriptor-trust/specs/mcp-security/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-serve-descriptor-trust/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-modularize-call-graph-builder/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-modularize-call-graph-builder/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-modularize-call-graph-builder/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-optimize-hash-keyed-analyze/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-optimize-hash-keyed-analyze/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-optimize-hash-keyed-analyze/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-reconcile-substrate-write-face/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-reconcile-substrate-write-face/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-25-reconcile-substrate-write-face/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-refine-happy-path-and-defaults/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-refine-happy-path-and-defaults/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-restore-spec-corpus-integrity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-restore-spec-corpus-integrity/specs/openspec/spec.md (not served here)
- openspec/changes/archive/2026-07-25-restore-spec-corpus-integrity/tasks.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-parallel-extraction-pool/proposal.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-parallel-extraction-pool/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-parallel-extraction-pool/tasks.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/proposal.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-config-schema-validation/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-config-schema-validation/specs/config/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-config-schema-validation/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-symbol-span-locator/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-symbol-span-locator/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-symbol-span-locator/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-zero-interaction-onboarding/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-zero-interaction-onboarding/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-zero-interaction-onboarding/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-defer-gryph-runtime-observability/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-defer-panic-blocking-enforcement/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-defer-panic-setup-hooks/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/specs/openspec/spec.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-bm25-identifier-tokenization/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-bm25-identifier-tokenization/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-bm25-identifier-tokenization/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-cli-output-hygiene/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-cli-output-hygiene/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-cli-output-hygiene/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-decision-status-transitions/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-decision-status-transitions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-decision-status-transitions/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-default-preset-claims/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-default-preset-claims/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-default-preset-claims/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-drift-gate-blindness/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-drift-gate-blindness/specs/drift/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-drift-gate-blindness/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-epistemic-lease-weights/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-epistemic-lease-weights/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-epistemic-lease-weights/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/specs/drift/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-pi-parity-drift/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-pi-parity-drift/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-pi-parity-drift/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-redaction-module-gaps/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-redaction-module-gaps/specs/mcp-security/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-redaction-module-gaps/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-structural-diff-merge-base/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-structural-diff-merge-base/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-structural-diff-merge-base/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-update-install-detection/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-update-install-detection/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-update-install-detection/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-harden-decision-consolidation/proposal.md (not served here)
Advantages
- Deterministic, local-first operation with no LLM in the hot path ensures consistent, grounded answers. evidence: README.md
- Provides governance guardrails that flag breaking changes and sensitive boundary violations before code is committed. evidence: README.md
- Maintains persistent memory across sessions that survives code renames and refactors. evidence: README.md
- Reduces agent round-trips and costs by providing structural context instead of relying on exploratory file reads. evidence: README.md
Limitations
- Static analysis cannot recover reflective invocations, eval, or dynamic DI/plugin registries with no visible bindings. evidence: README.md
- Small, familiar repositories may experience overhead compared to native agent search. evidence: README.md
- Large monorepos require incremental analysis strategies after the initial full build. evidence: README.md
Security
Risk level: Low risk
This brain runs
Agent instructions that run or fetch something (169)
.claude/commands/first-run-hardening.md:Your job: find and fix the bugs that break a NEW USER's first-run experience — the way earlier passes found "unknown command 'orient'", "--no-embed kills BM25", "watcher EMFILE on target/", and "install never builds the index"..claude/commands/first-run-hardening.md:BUILD FIRST so you test current code, not the published version: `npm run build` → drive `node dist/cli/index.js`, never bare `openlore`/`npx openlore` (those resolve the OLD published version)..claude/commands/first-run-hardening.md:When comparing to published behavior, do it explicitly with `npx --yes openlore@latest` and label it..claude/commands/first-run-hardening.md:Run the REAL first-run flow as a user would, end to end, checking exit codes AND actual output of each step: openlore install # the one-command path.claude/commands/first-run-hardening.md:Also exercise: init → analyze → analyze --no-embed → analyze --force → orient (no task / with task / bad --limit) → install --no-analyze → install --dry-run → install --uninstall → mcp server over stdio (initialize → tools/call orient)..claude/commands/first-run-hardening.md:Idempotency / re-runs: running install or analyze twice must be a clean no-op, not a duplicate or a clobber..claude/commands/first-run-hardening.md:Treat other people's repos as READ-ONLY fixtures: after each dogfood run, remove ALL openlore artifacts (.openlore, openspec/, CLAUDE.md, ARCHITECTURE.md) and `git checkout` any modified .gitignore / settings.json..claude/commands/first-run-hardening.md:Verify the repo is clean (`git status`) before moving on..claude/commands/first-run-hardening.md:Verify honestly: run `npm run typecheck` and `npm run test:run` and report the REAL counts..claude/commands/first-run-hardening.md:confirm with `git rev-list --left-right --count origin/main...main` (want `0 0`) before and after..claude/commands/first-run-hardening.md:Branch pruning: only delete branches already merged into origin/main (verify with `git branch -r --merged origin/main`);AGENTS.md:Before committing code (pre-commit hook via `openlore drift --install-hook`)AGENTS.md:openlore drift --install-hook # Install as git pre-commit hookAGENTS.md:[ ] No spec drift — run `openlore drift` to verify specs match codeAGENTS.md:- Run `openspec validate --all` to verify structureAGENTS.md:- Run `openlore drift --install-hook` to catch future driftAGENTS.md:Always run `openlore analyze` first.AGENTS.md:Or install the Vibe skill (creates `.vibe/skills/openlore.md` as a `/openlore` slash command):AGENTS.md:Because the output limit is 4 096 tokens (vs 16 000 for Claude), generation produces **shorter specs per run**.AGENTS.md:**One domain at a time** — run `openlore generate` with `--domain <name>` so each invocation focuses on a single domain and stays within the output budget.AGENTS.md:**Use the analysis artifacts** — always run `openlore analyze` first;AGENTS.md:**Expect multi-pass generation** — large codebases may require multiple `generate` runs (one per domain) rather than a single all-domains run.AGENTS.md:Then run `openlore decisions --sync` and retry `git commit`.AGENTS.md:**`reason: "approved_not_synced"` — decisions approved but not written to specs:** Run `openlore decisions --sync` then retry `git commit`.AGENTS.md:If yes: run `openlore decisions --consolidate --gate` and handle the result.AGENTS.md:If no: retry with `git commit --no-verify` to skip the gate.AGENTS.md:If yes: run `openlore decisions --consolidate --gate` and handle the result.AGENTS.md:If no: retry with `git commit --no-verify` to skip the gate.CLAUDE.md:CLI: `openlore coverage-gaps` | | "What's the blast radius of my diff before I commit?" | `blast_radius` — one advisory briefing: callers/layers, tests to run, anchored memories/decisions that will drift, stale specs | | "Post a deterministic structural review on a PR" (CLI, no MCP/agen …[+99 chars]CLAUDE.md:Call `orient "<task description>"` (via the openlore MCP server, or `npx openlore orient --json`) **before touching a module you have not yet read in this session**, and when a task spans several modules.CLAUDE.md:re-run `openlore install --preset <name>` to change it and regenerate these instructions.examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md:Suggest running `/openlore-plan-refactor` once the user has enough context to act, then `/openlore-execute-refactor` to apply the planexamples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md:To activate `search_specs`, run `openlore analyze --embed` or `openlore analyze --reindex-specs`.examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md:Using Domain Sketch — structural analysis will be available after `openlore analyze` is run on the first implementation."examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md:- First implementation — run `openlore analyze && openlore generate` afterexamples/mistral-vibe/skills/openlore-debug/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/mistral-vibe/skills/openlore-debug/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/mistral-vibe/skills/openlore-debug/SKILL.md:Run it.examples/mistral-vibe/skills/openlore-debug/SKILL.md:**Apply the fix**, then run the test again.examples/mistral-vibe/skills/openlore-debug/SKILL.md:Run the full test suite.examples/mistral-vibe/skills/openlore-debug/SKILL.md:If the domain spec does not exist yet (`uncovered` from Step 8), note the invariant in the story/issue instead and flag it for the next `openlore generate` run.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:"execute the planned refactoring"examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:explicit command `/openlore-execute-refactor`examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:**Prerequisite**: the `openlore-plan-refactor` skill must have been run and the plan confirmed.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:If a coverage tool is available, run it on the target file and compare against the coverage baseline in the plan.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:git status # must show: nothing to commit, working tree cleanexamples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:git log --oneline -1 # note this commit hash — your restore pointexamples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:For **each change** in the plan, execute the full mini-development cycle below.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:**4 — TEST** Run the test gate from the plan entry.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:Run the full test suite one final time to confirm the refactored state is clean.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:Apply renames one file at a time, run tests after each, and respect the ≤ 50-line edit constraint.**examples/mistral-vibe/skills/openlore-generate/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.examples/mistral-vibe/skills/openlore-generate/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated spec as complete;examples/mistral-vibe/skills/openlore-generate/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you wrote.examples/mistral-vibe/skills/openlore-generate/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:| Situation | Approach | |---|---| | `risk_context` present, risk 🟢 < 40 | Skip to Step 3 — use insertion point from context | | `risk_context` present, risk 🟡 40–69 | Run Step 2 impact check, then proceed | | `risk_context` present, risk 🔴 ≥ 70 | Stop — a blocking refactor story mus …[+81 chars]examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:Run `/openlore-execute-refactor` on the blocking function first, or create a blocking refactor task and return to this story once the risk is resolved.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:Run the `openlore-repair` host skill before implementing.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:Only run once tests are green.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:| Drift type | Resolution | |---|---| | `uncovered` on new files | Note it — propose `openlore generate` post-sprint | | `gap` on existing domain | Run the `openlore-repair` host skill | | `stale` | Fix the reference | | No drift | Done |examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:To apply the plan, use the `openlore-execute-refactor` skill.examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:Each change = one atomic edit → one diff verification → one full test run → ✅ or rollback.examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:If a recent analysis already exists, skip unless the user explicitly requests a fresh run.examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:| Ecosystem | Command | |---|---| | Node.js | `npm test -- --coverage --collectCoverageFrom="<files>"` | | Python | `pytest --cov=<module> --cov-report=term-missing` | | Rust | `cargo tarpaulin --include-files <files>` | | Go | `go test -cover ./...` |examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:**Test gate**: exact test command to run after this changeexamples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:Workflow: /openlore-plan-refactor → /openlore-execute-refactorexamples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:- `git diff --stat` shows only the expected filesexamples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:Hash: <to be filled by the execute workflow>examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:If `orient` returns `"error": "no cache"` → run `openlore analyze` first, then retry.examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:| File found | Framework | |---|---| | `vitest.config.*`, `vitest.config.ts` | Vitest — runner: `npx vitest run <file>` | | `jest.config.*` | Jest — runner: `npx jest <file>` | | `pytest.ini`, `pyproject.toml` (with `[tool.pytest]`), `setup.cfg` | pytest — runner: `pytest <file> -v` | …[+147 chars]examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:Run the test file with `$TEST_RUNNER`.examples/opencode-skills/openlore-analyze-codebase/SKILL.md:Suggest running `/openlore-plan-refactor` once the user has enough context to act, then `/openlore-execute-refactor` to apply the planexamples/opencode-skills/openlore-analyze-codebase/SKILL.md:To activate `search_specs`, run `openlore analyze --embed` or `openlore analyze --reindex-specs`.examples/opencode-skills/openlore-brainstorm/SKILL.md:Using Domain Sketch — structural analysis will be available after `openlore analyze` is run on the first implementation."examples/opencode-skills/openlore-brainstorm/SKILL.md:- First implementation — run `openlore analyze && openlore generate` afterexamples/opencode-skills/openlore-debug/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/opencode-skills/openlore-debug/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/opencode-skills/openlore-debug/SKILL.md:Run it.examples/opencode-skills/openlore-debug/SKILL.md:**Apply the fix**, then run the test again.examples/opencode-skills/openlore-debug/SKILL.md:Run the full test suite.examples/opencode-skills/openlore-debug/SKILL.md:If the domain spec does not exist yet (`uncovered` from Step 8), note the invariant in the story/issue instead and flag it for the next `openlore generate` run.examples/opencode-skills/openlore-execute-refactor/SKILL.md:"execute the planned refactoring"examples/opencode-skills/openlore-execute-refactor/SKILL.md:explicit command `/openlore-execute-refactor`examples/opencode-skills/openlore-execute-refactor/SKILL.md:**Prerequisite**: the `openlore-plan-refactor` skill must have been run and the plan confirmed.examples/opencode-skills/openlore-execute-refactor/SKILL.md:If a coverage tool is available, run it on the target file and compare against the coverage baseline in the plan.examples/opencode-skills/openlore-execute-refactor/SKILL.md:git status # must show: nothing to commit, working tree cleanexamples/opencode-skills/openlore-execute-refactor/SKILL.md:git log --oneline -1 # note this commit hash — your restore pointexamples/opencode-skills/openlore-execute-refactor/SKILL.md:For **each change** in the plan, execute the full mini-development cycle below.examples/opencode-skills/openlore-execute-refactor/SKILL.md:**4 — TEST** Run the test gate from the plan entry.examples/opencode-skills/openlore-execute-refactor/SKILL.md:Run the full test suite one final time to confirm the refactored state is clean.examples/opencode-skills/openlore-execute-refactor/SKILL.md:Apply renames one file at a time, run tests after each, and respect the ≤ 50-line edit constraint.**examples/opencode-skills/openlore-generate/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.examples/opencode-skills/openlore-generate/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated spec as complete;examples/opencode-skills/openlore-generate/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you wrote.examples/opencode-skills/openlore-generate/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.examples/opencode-skills/openlore-implement-story/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/opencode-skills/openlore-implement-story/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/opencode-skills/openlore-implement-story/SKILL.md:| Situation | Approach | |---|---| | `risk_context` present, risk 🟢 < 40 | Skip to Step 3 — use insertion point from context | | `risk_context` present, risk 🟡 40–69 | Run Step 2 impact check, then proceed | | `risk_context` present, risk 🔴 ≥ 70 | Stop — a blocking refactor story mus …[+81 chars]examples/opencode-skills/openlore-implement-story/SKILL.md:Run `/openlore-execute-refactor` on the blocking function first, or create a blocking refactor task and return to this story once the risk is resolved.examples/opencode-skills/openlore-implement-story/SKILL.md:Run the `openlore-repair` host skill before implementing.examples/opencode-skills/openlore-implement-story/SKILL.md:Only run once tests are green.examples/opencode-skills/openlore-implement-story/SKILL.md:| Drift type | Resolution | |---|---| | `uncovered` on new files | Note it — propose `openlore generate` post-sprint | | `gap` on existing domain | Run the `openlore-repair` host skill | | `stale` | Fix the reference | | No drift | Done |examples/opencode-skills/openlore-plan-refactor/SKILL.md:To apply the plan, use the `openlore-execute-refactor` skill.examples/opencode-skills/openlore-plan-refactor/SKILL.md:Each change = one atomic edit → one diff verification → one full test run → ✅ or rollback.examples/opencode-skills/openlore-plan-refactor/SKILL.md:If a recent analysis already exists, skip unless the user explicitly requests a fresh run.examples/opencode-skills/openlore-plan-refactor/SKILL.md:| Ecosystem | Command | |---|---| | Node.js | `npm test -- --coverage --collectCoverageFrom="<files>"` | | Python | `pytest --cov=<module> --cov-report=term-missing` | | Rust | `cargo tarpaulin --include-files <files>` | | Go | `go test -cover ./...` |examples/opencode-skills/openlore-plan-refactor/SKILL.md:**Test gate**: exact test command to run after this changeexamples/opencode-skills/openlore-plan-refactor/SKILL.md:Workflow: /openlore-plan-refactor → /openlore-execute-refactorexamples/opencode-skills/openlore-plan-refactor/SKILL.md:- `git diff --stat` shows only the expected filesexamples/opencode-skills/openlore-plan-refactor/SKILL.md:Hash: <to be filled by the execute workflow>examples/opencode-skills/openlore-write-tests/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/opencode-skills/openlore-write-tests/SKILL.md:If `orient` returns `"error": "no cache"` → run `openlore analyze` first, then retry.examples/opencode-skills/openlore-write-tests/SKILL.md:| File found | Framework | |---|---| | `vitest.config.*`, `vitest.config.ts` | Vitest — runner: `npx vitest run <file>` | | `jest.config.*` | Jest — runner: `npx jest <file>` | | `pytest.ini`, `pyproject.toml` (with `[tool.pytest]`), `setup.cfg` | pytest — runner: `pytest <file> -v` | …[+147 chars]examples/opencode-skills/openlore-write-tests/SKILL.md:Run the test file with `$TEST_RUNNER`.skills/openlore-analyze-codebase/SKILL.md:Suggest running `/openlore-plan-refactor` once the user has enough context to act, then `/openlore-execute-refactor` to apply the planskills/openlore-analyze-codebase/SKILL.md:To activate `search_specs`, run `openlore analyze --embed` or `openlore analyze --reindex-specs`.skills/openlore-brainstorm/SKILL.md:Using Domain Sketch — structural analysis will be available after `openlore analyze` is run on the first implementation."skills/openlore-brainstorm/SKILL.md:- First implementation — run `openlore analyze && openlore generate` afterskills/openlore-debug/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).skills/openlore-debug/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.skills/openlore-debug/SKILL.md:Run it.skills/openlore-debug/SKILL.md:**Apply the fix**, then run the test again.skills/openlore-debug/SKILL.md:Run the full test suite.skills/openlore-debug/SKILL.md:If the domain spec does not exist yet (`uncovered` from Step 8), note the invariant in the story/issue instead and flag it for the next `openlore generate` run.skills/openlore-execute-refactor/SKILL.md:"execute the planned refactoring"skills/openlore-execute-refactor/SKILL.md:explicit command `/openlore-execute-refactor`skills/openlore-execute-refactor/SKILL.md:**Prerequisite**: the `openlore-plan-refactor` skill must have been run and the plan confirmed.skills/openlore-execute-refactor/SKILL.md:If a coverage tool is available, run it on the target file and compare against the coverage baseline in the plan.skills/openlore-execute-refactor/SKILL.md:git status # must show: nothing to commit, working tree cleanskills/openlore-execute-refactor/SKILL.md:git log --oneline -1 # note this commit hash — your restore pointskills/openlore-execute-refactor/SKILL.md:For **each change** in the plan, execute the full mini-development cycle below.skills/openlore-execute-refactor/SKILL.md:**4 — TEST** Run the test gate from the plan entry.skills/openlore-execute-refactor/SKILL.md:Run the full test suite one final time to confirm the refactored state is clean.skills/openlore-execute-refactor/SKILL.md:Apply renames one file at a time, run tests after each, and respect the ≤ 50-line edit constraint.**skills/openlore-generate/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.skills/openlore-generate/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated spec as complete;skills/openlore-generate/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you wrote.skills/openlore-generate/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.skills/openlore-implement-story/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).skills/openlore-implement-story/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.skills/openlore-implement-story/SKILL.md:| Situation | Approach | |---|---| | `risk_context` present, risk 🟢 < 40 | Skip to Step 3 — use insertion point from context | | `risk_context` present, risk 🟡 40–69 | Run Step 2 impact check, then proceed | | `risk_context` present, risk 🔴 ≥ 70 | Stop — a blocking refactor story mus …[+81 chars]skills/openlore-implement-story/SKILL.md:Run `/openlore-execute-refactor` on the blocking function first, or create a blocking refactor task and return to this story once the risk is resolved.skills/openlore-implement-story/SKILL.md:Run the `openlore-repair` host skill before implementing.skills/openlore-implement-story/SKILL.md:Only run once tests are green.skills/openlore-implement-story/SKILL.md:| Drift type | Resolution | |---|---| | `uncovered` on new files | Note it — propose `openlore generate` post-sprint | | `gap` on existing domain | Run the `openlore-repair` host skill | | `stale` | Fix the reference | | No drift | Done |skills/openlore-orient/SKILL.md:This is the lowest-latency path and gives the model access to whatever tool surface the server was wired with — the lean 10-tool `navigation` preset by default (`openlore install --preset full` wires all 62), not just `orient`.skills/openlore-orient/SKILL.md:bash scripts/orient.sh "<task description>"skills/openlore-orient/SKILL.md:The wrapper tries the direct CLI subcommand first (`npx --yes openlore orient --json --task "<task>"`) and falls back to driving the `openlore mcp` server over stdio JSON-RPC via the sibling `orient-via-mcp.mjs` helper on older openlore versions that predate the CLI subcommand.skills/openlore-orient/SKILL.md:Run `npx openlore analyze` once to seed the graph, then retry.skills/openlore-orient/SKILL.md:Re-run `npx openlore analyze` to rebuild.skills/openlore-plan-refactor/SKILL.md:To apply the plan, use the `openlore-execute-refactor` skill.skills/openlore-plan-refactor/SKILL.md:Each change = one atomic edit → one diff verification → one full test run → ✅ or rollback.skills/openlore-plan-refactor/SKILL.md:If a recent analysis already exists, skip unless the user explicitly requests a fresh run.skills/openlore-plan-refactor/SKILL.md:| Ecosystem | Command | |---|---| | Node.js | `npm test -- --coverage --collectCoverageFrom="<files>"` | | Python | `pytest --cov=<module> --cov-report=term-missing` | | Rust | `cargo tarpaulin --include-files <files>` | | Go | `go test -cover ./...` |skills/openlore-plan-refactor/SKILL.md:**Test gate**: exact test command to run after this changeskills/openlore-plan-refactor/SKILL.md:Workflow: /openlore-plan-refactor → /openlore-execute-refactorskills/openlore-plan-refactor/SKILL.md:- `git diff --stat` shows only the expected filesskills/openlore-plan-refactor/SKILL.md:Hash: <to be filled by the execute workflow>skills/openlore-repair/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.skills/openlore-repair/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated edit as complete;skills/openlore-repair/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you edited.skills/openlore-repair/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.skills/openlore-write-tests/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).skills/openlore-write-tests/SKILL.md:If `orient` returns `"error": "no cache"` → run `openlore analyze` first, then retry.skills/openlore-write-tests/SKILL.md:| File found | Framework | |---|---| | `vitest.config.*`, `vitest.config.ts` | Vitest — runner: `npx vitest run <file>` | | `jest.config.*` | Jest — runner: `npx jest <file>` | | `pytest.ini`, `pyproject.toml` (with `[tool.pytest]`), `setup.cfg` | pytest — runner: `pytest <file> -v` | …[+147 chars]skills/openlore-write-tests/SKILL.md:Run the test file with `$TEST_RUNNER`.
Package scripts (1)
package.json(postinstall):node scripts/postinstall.mjs
- Low risk: network-instructions (.claude/commands/first-run-hardening.md:21)
- Low risk: scripts-present (bench/retrieval/run.ts)
- Low risk: scripts-present (bench/run.ts)
- Low risk: autonomy-phrase (examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:240)
- Low risk: autonomy-phrase (examples/opencode-skills/openlore-execute-refactor/SKILL.md:240)
- Low risk: scripts-present (scripts/api-consumer-smoke.mjs)
- Low risk: scripts-present (scripts/copy-assets.mjs)
- Low risk: scripts-present (scripts/postinstall.mjs)
- Low risk: autonomy-phrase (skills/openlore-execute-refactor/SKILL.md:240)
- Low risk: network-instructions (skills/openlore-orient/SKILL.md:37)
- Low risk: scripts-present (skills/openlore-orient/scripts/orient.sh)
Attribution and licence
- Created by
- Clay Good
- Declared authors
- Clay Good (declared in package.json)
- Publisher
- Clay Good (Community)
- Source
- clay-good/OpenLore · commit c45c2ca
- Licence
- MIT License (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Clay Good.
Install from source
450 of its files are not served here, so there is no ZIP. clay-good/OpenLore at c45c2ca