Eru.Tool
0.14.0
See the version list below for details.
dotnet tool install --global Eru.Tool --version 0.14.0
dotnet new tool-manifest
dotnet tool install --local Eru.Tool --version 0.14.0
#tool dotnet:?package=Eru.Tool&version=0.14.0
nuke :add-package Eru.Tool --version 0.14.0
eru
eru is a CLI tool for sharing knowledge files between projects. Declare where your shared files live (a git repo), pull them in with a single command, and track everything in a lock file so they stay in sync.
- Manifests — knowledge-source repos publish
.eru/manifest.jsonto declare available files; consumers pull from it automatically - Collections — group related files into a named set and pull them all with one command
- Tag-based pulls —
--tag devopsfetches everything taggeddevopsacross all collections - Glob patterns — collection entries can use globs to pull multiple files in one reference (e.g.
docs/*.md) - Lock file (
.eru/eru.lock) records every pulled file: its origin, path, and content hash - Static site —
eru site generatebuilds a self-contained HTML site for browsing and searching the local knowledge cache;eru site serveadds live reload and a search API - Dry-run mode on every write command
- Global config (
~/.config/eru/config.json) for sources and collections shared across all your repos
Requirements
- .NET 10 SDK or later
- git
Install
Install the Eru.Tool tool:
dotnet tool install --global Eru.Tool
Leave off --global to install locally in a repo instead.
Prebuilt self-contained binaries (linux-x64, win-x64, osx-x64) are also attached to each GitHub release if you'd rather not install the .NET SDK.
Install the skill with skills.sh:
npx skills add dburriss/eru
The skill tells agents how to use the CLI.
Quick start
1. Initialise your repo
eru init
Creates .eru/config.json in the current directory.
2. Pull a file
Paste a GitHub or GitLab file URL directly:
eru add https://github.com/my-org/knowledge/blob/main/docs/adr-template.md
eru registers the source automatically, downloads the file, and records it in .eru/eru.lock.
Or pull by source name and path once a source is configured:
eru add knowledge:docs/adr-template.md
Or pull an entire curated collection:
eru add --collection onboarding-docs
3. Keep files up to date
eru sync
Fetches every file in .eru/eru.lock, compares content hashes, and overwrites anything that has drifted.
Commands
| Command | What it does |
|---|---|
eru init |
Scaffold .eru/config.json in the current directory |
eru init --global |
Create the global config at ~/.config/eru/config.json |
eru add <path> |
Pull a file by source:path, bare filename, or full URL |
eru add --collection <name> |
Pull all files in a named collection |
eru add --tag <tag> |
Pull all files matching a tag |
eru add --dryrun <path> |
Preview what would be pulled |
eru search <terms> |
Ranked search of sources, the lock file and local knowledge (--mode lex\|sem\|hybrid) |
eru sync |
Re-fetch all tracked files and update drifted ones |
eru sync --dryrun |
Preview what sync would change |
eru source add <url> |
Register a git repo as a knowledge source |
eru source list |
List configured knowledge sources |
eru source view <name> |
Show details and files for a source |
eru source files <name> |
List the files a source exposes |
eru source bundle add |
Register a knowledge bundle (manifest or OKF) on a source |
eru source remove <name> |
Remove a source |
eru collection create <name> |
Create a new collection |
eru collection add <name> -f <source:path> |
Add a file reference to a collection |
eru print <source:path\|hash> |
Print a document's contents to stdout |
eru config list\|view\|get\|set\|migrate |
Inspect, edit and migrate configuration |
eru remove <path> |
Delete a pulled file and drop it from the lock file |
eru disconnect <path> |
Stop tracking a file but keep it on disk |
eru browse |
Browse the knowledge cache in an interactive terminal UI |
eru cache prune / eru cache clear |
Manage the local knowledge cache |
eru inbox add/list/remove/default |
Manage inboxes (local, or remote git repos) |
eru inbox channel add/list/remove |
Manage channels and their ACP agents |
eru inbox send |
Send an item to an inbox |
eru inbox process / eru inbox watch |
Run inbox items through the channel's agent, once or continuously |
eru manifest init |
Create .eru/manifest.json in a knowledge-source repo |
eru manifest add <path> |
Add a file/glob entry to the manifest |
eru manifest remove <path> |
Remove an entry from the manifest |
eru manifest validate |
Check all manifest entries resolve to local files (alias: verify) |
eru site generate [-o <dir>] |
Generate a static HTML site for browsing the local knowledge cache |
eru site serve [-p <port>] |
Serve the site locally with live reload and a search API |
eru okf validate <path> |
Check a directory tree for OKF §11 conformance, and warn on broken links (--strict-links to fail) |
eru okf init <path> |
Create missing OKF index.md files |
eru okf fix <path> |
Repair a directory tree so it passes OKF validation |
eru okf verify <file> |
Record a human/machine verification on a concept file |
eru version |
Print the version and git commit |
eru mcp |
Start an MCP stdio server for AI agent use |
For full argument details see docs/reference/cli.md.
Static site
eru site generate builds a self-contained HTML site from the local knowledge cache — browse and search all source files offline.
eru site serve does the same but also starts a local HTTP server with a live-reload SSE feed and a /api/search endpoint. The browser reconnects and reloads automatically whenever the cache is synced. See docs/reference/site-generation.md and docs/how-to/customize-the-generated-site.md.
MCP server
eru mcp exposes knowledge search and retrieval to AI agents (Claude, Copilot, Cursor, etc.) over the Model Context Protocol. See docs/how-to/set-up-the-mcp-server.md.
Contributing
Run mise install for the toolchain, then dotnet build and dotnet test --solution eru.slnx. CI builds and tests every push and PR; pushing a v* tag publishes the NuGet package and GitHub release binaries. See AGENTS.md for the project layout, conventions and release flow.
Documentation
Full documentation lives under docs/, organised by Diataxis: tutorials, how-to guides, reference, and explanation.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.16.1 | 93 | 11/7/2026 |
| 0.16.0 | 80 | 11/7/2026 |
| 0.15.1 | 92 | 11/5/2026 |
| 0.15.0 | 83 | 11/5/2026 |
| 0.14.0 | 116 | 11/2/2026 |
| 0.13.1 | 143 | 10/12/2026 |
| 0.13.0 | 124 | 10/12/2026 |
| 0.12.0 | 132 | 10/9/2026 |
| 0.11.1 | 125 | 10/8/2026 |
| 0.11.0 | 127 | 10/8/2026 |
| 0.10.0 | 131 | 10/5/2026 |
| 0.9.1 | 146 | 10/2/2026 |
| 0.9.0 | 139 | 10/2/2026 |
| 0.7.1 | 350 | 5/29/2026 |
| 0.7.0 | 273 | 5/29/2026 |
| 0.6.0 | 269 | 5/29/2026 |
| 0.5.1 | 266 | 5/29/2026 |
| 0.5.0 | 262 | 5/29/2026 |
| 0.4.0 | 264 | 5/29/2026 |
| 0.3.0 | 264 | 5/28/2026 |
Ranked search powered by [Ferret](https://github.com/dburriss/ferret). `eru search` with terms and the MCP `search_knowledge` tool now rank files by content (BM25: rarer terms count more, matches in the path, headings and front matter count extra, word forms match, so `mock` finds `mocked`) and return the best first. One engine now serves `eru search`, the MCP tool and the `eru serve` `/api/search` endpoint, so their rules no longer differ
`search_knowledge` takes an optional `limit` (default 15) and `mode`, caps each file at three excerpt lines, and returns `truncated`, per-hit `score` and `warnings` in its structured result. `eru search` gains `--limit` and `--mode lex|sem|hybrid` and prints scores
Optional semantic and hybrid search (`sem`, `hybrid`) with a local embedding model (`bge-small-en-v1.5`, about 33 MB, no service). Choose with `search.mode`, `ERU_SEARCH_MODE`, `--mode` or the MCP `mode` parameter. The model is never downloaded during an MCP search: the server fetches it in the background, and until then `sem` and `hybrid` run `lex` and say so in `warnings`. `eru search --mode hybrid` runs `lex` first and then downloads the model for next time. `FERRET_OFFLINE=1`, `FERRET_MODEL_DIR` and `FERRET_MODEL_URL` control the download
`search.ignorePatterns` config (default `["index.md", "log.md"]`): matching files are never searched, so a generated `index.md` no longer duplicates its README. READMEs stay searchable, unlike `site.ignorePatterns`. `search.mode` (default `lex`) and `search.ignorePatterns` are managed with `eru config`
`eru browse` Files pane: pressing Enter on a search filter now runs the same ranked content search in the background and lists the best matches first (`#tag` filters and the instant as-you-type narrowing are unchanged)
`eru source add --scan --exclude <glob>` (repeatable) skips OKF bundles whose directory matches the glob; excluding the root bundle registers its nested bundles instead
`okf.fixTypes` (an ordered list of `{pattern, type}` globs) and `okf.defaultType` config settings: `eru okf fix` types untyped files by glob, including READMEs, and `--default-type` now overrides a matching rule
Root `apm.yml` so eru can be installed as an [APM](https://github.com/microsoft/apm) package (`apm install dburriss/eru`): the `eru`, `semantic-search` and `organizing-documentation` skills plus the `ingestor` agent and the `eru` MCP server
The built-in search backends (simple scan, per-file word index and the `ck` process) are removed in favour of Ferret. `ERU_SEARCH_BACKEND` is deprecated and only mapped: `ck` now means `hybrid`, any other value `lex`, with a warning on stderr. `eru sync` no longer builds a per-file word index; search indexes are built on first use and by the MCP server in the background, under `~/.cache/eru/ferret` (`eru cache clear` removes them and the old `~/.cache/eru/index`)
`eru search <terms>` now matches file content, not only path and description, and its `--output json` entries gain `path`, `hash`, `score` and `excerpts` (`sourceName` and `remotePath` are `null` for local files). The MCP `search_knowledge` structured result is now `{ hits, truncated, warnings }` in camelCase, as its output schema already advertised, instead of PascalCase `Hits`
Release binaries carry ONNX Runtime for semantic search (about 45 MB more per platform; it is unpacked on first run)
A `README.md` with a frontmatter `type` is now a concept: `eru okf validate`, `fix` and `verify` handle it like any other concept, it is listed in generated catalogs and discovered with its metadata. A README without a `type` is still skipped. `eru site` still hides READMEs by default through `site.ignorePatterns`
Files in a local `knowledge/` directory were listed twice by search on case-insensitive file systems (macOS, Windows)
Table output no longer crashes (`Could not find color or style 'Go'`) when a path, message or description contains square brackets, e.g. every `eru okf validate` broken-link warning; table cells are now rendered literally in all commands