Eru.Tool 0.14.0

There is a newer version of this package available.
See the version list below for details.
dotnet tool install --global Eru.Tool --version 0.14.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local Eru.Tool --version 0.14.0
                    
This package contains a .NET tool you can call from the shell/command line.
#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.json to 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 devops fetches everything tagged devops across 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 generate builds a self-contained HTML site for browsing and searching the local knowledge cache; eru site serve adds 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

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed

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