Eru.Tool
0.9.0
See the version list below for details.
dotnet tool install --global Eru.Tool --version 0.9.0
dotnet new tool-manifest
dotnet tool install --local Eru.Tool --version 0.9.0
#tool dotnet:?package=Eru.Tool&version=0.9.0
nuke :add-package Eru.Tool --version 0.9.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.
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> |
Search sources and the lock file |
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 collection create <name> |
Create a new collection |
eru collection add <name> -f <source:path> |
Add a file reference to a collection |
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 |
eru okf init <path> |
Create missing OKF index.md files |
eru okf fix <path> |
Repair a directory tree so it passes OKF validation |
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.
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 | 70 | 11/7/2026 |
| 0.16.0 | 67 | 11/7/2026 |
| 0.15.1 | 67 | 11/5/2026 |
| 0.15.0 | 60 | 11/5/2026 |
| 0.14.0 | 116 | 11/2/2026 |
| 0.13.1 | 142 | 10/12/2026 |
| 0.13.0 | 123 | 10/12/2026 |
| 0.12.0 | 130 | 10/9/2026 |
| 0.11.1 | 123 | 10/8/2026 |
| 0.11.0 | 124 | 10/8/2026 |
| 0.10.0 | 130 | 10/5/2026 |
| 0.9.1 | 145 | 10/2/2026 |
| 0.9.0 | 136 | 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 |
`eru source add --scan` detects OKF bundles (any `index.md` with `okf_version`; a root marker covers nested ones) and falls back to the `knowledge/` convention. **Breaking:** without `--scan`, `eru source add` no longer auto-detects the `knowledge/` bundle; register bundles with `eru source bundle add`
OKF bundle discovery (and so `eru site generate`) now indexes only concept files that have a non-empty `type` frontmatter; untyped markdown is skipped
`eru okf verify <file>` records a `{ by, at }` confirmation in a concept file's `verified` list (`--by` defaults to `human:<git user.email>`, `--at` to now); `eru okf fix` now strips a malformed `verified` (placeholders like `unknown`/`false`, entries missing `by`/`at`), keeping valid entries; `eru okf validate` warns on placeholder `verified` values and `by: unknown`, pointing at `fix` and `verify`
OKF v0.2 alignment: `eru okf init`/`fix` write `okf_version: "0.2"`; `eru okf validate` reports non-fatal v0.2 shape warnings (`generated`, `verified`, `stale_after`, `status`, `sources`, legacy `timestamp`, `log.md` order); eru reads `sources` and falls back to a legacy `timestamp` when `generated` is absent; the ingestor agent template now writes spec-shaped `generated`/`sources` and omits `verified` until a human reviews; `eru inbox send` quotes `resource` in its frontmatter
`eru okf init <path>` creates missing `index.md` files (root with `okf_version`, plus a catalog table per folder), never overwriting; `eru okf fix <path>` repairs a tree so `eru okf validate` passes (index frontmatter, missing concept frontmatter/`type`, non-ISO `log.md` date headings, missing indexes). Both write by default; `--dry-run` previews, `--default-type` sets the type for untyped concepts
`eru source bundle add` warns when a bundle is auto-detected as `manifest` but has no `.eru/manifest.json`, listing the ways to fix it (add `okf_version` to `index.md`, pass `--kind okf`, or create a manifest); `eru source add` does the same for a detected `KNOWLEDGE/` bundle
`eru okf validate`: the bundle-root `index.md` frontmatter message now explains that it should contain only `okf_version`, which is what makes eru detect an OKF bundle
`README.md` and dot-directories (`.github`, `.claude`, `.agents`, …) are no longer treated as OKF concepts: they are skipped by `eru okf validate` and OKF bundle discovery
`siteIgnorePatterns` now defaults to `index.md`, `log.md` and `README.md` (configs with an explicit value are unchanged)
`okfIgnorePatterns` setting (default `apm_modules/**`, `inbox/**`, `node_modules/**`) to skip paths during OKF bundle discovery and `eru okf validate`
`eru version` command prints the version and the git commit it was built from
Added description field to the manifest
Remote git inboxes: `eru inbox add <name> <git-url> [--branch]` registers a repo as an inbox and `eru inbox send` clones it shallowly, commits the item and pushes (via FsForge); remote inboxes are send-only
Added `eru site serve` command to serve the generated static site locally with live reload on changes to the cache
`eru okf validate <path>` command to check a directory tree for OKF §11 conformance (parseable frontmatter with a non-empty `type`, valid `index.md`/`log.md` structure); never flags unknown types, unknown extra keys, broken cross-links, or missing optional fields
Generated site now surfaces OKF frontmatter: a trust-tier badge per file (`unverified`/`machine-confirmed`/`human-reviewed`, derived from `verified[].by`) and a new "Types" filter/browse page alongside the existing Sources and Tags
Added `SiteIgnorePattern` with default values of "index.md" and "log.md" to ignore OKF structure files when generating site pages
OKF bundle discovery on sources
`eru inbox` commands for handling inboxes/channels and sending to inboxes
`eru inbox process` command to run pending inbox items through their channel's configured ACP agent, archiving processed items; supports `--inbox`, `--channel`, `--item`, `--all`, `--dryrun`, and `--output`; `--debug` also reports per-item agent handshake timings (initialize/session-new/prompt)
`eru inbox watch` command to watch an inbox's raw directory and automatically run `inbox process` on new items, debounced and also polled on a configurable interval (`--interval`, default from config); supports `--dryrun` and `--debug`
`--agent-timeout` option on `eru inbox channel add` to bound how long an ACP agent call may run; the timeout is a liveness check (reset on any agent activity) rather than a fixed deadline
ACP agent output is streamed as it arrives instead of only being shown once the call completes
`eru inbox process` now falls back further when a channel has no `--agent-instructions` configured and `<inbox>/.agents/agents/ingestor.md` doesn't exist: it checks a tool-specific convention path derived from `--agent-command` (e.g. `.claude/agents/ingestor.md` for `claude`), and finally falls back to eru's own built-in curation instructions — so a channel's agent always receives some curation instructions
`--append <text|@file>` (repeatable) on `eru inbox process` and `eru inbox watch` adds text to the agent prompt after the resolved instructions and before the item; a leading `@` reads a file, `@@` is a literal `@`
Built-in ingestor instructions (`agents/ingestor.agent.md`) now produce a valid OKF bundle: folder `index.md` files get no frontmatter, the root `index.md` carries only `okf_version`, `README.md` is treated as outside the bundle, and the agent uses `eru okf init` for new folders and `eru okf validate`/`fix` as a final self-check
Built-in ingestor instructions (`agents/ingestor.agent.md`) no longer loop until `inbox/raw/` is empty; the agent processes only the items it is told to (by `eru`, a harness prompt, or a workflow) and asks if none are specified
Built-in ingestor instructions (`agents/ingestor.agent.md`) no longer include a commit step, so they stay neutral across environments; use `--append` to add commit/PR behaviour
`eru manifest verify` renamed to `eru manifest validate`; `verify` is kept as a backward-compatible alias
`eru add` gives a clearer error when passed a bare repo URL, suggesting `eru source add <url>` followed by `eru add <source>:<path>`
Unhandled exceptions now print a concise `eru: unexpected error: <message>` instead of a raw stack trace; pass `--debug` to see the full stack trace
OKF bundle discovery no longer fails when a source has no branch configured
Pinned the test runner via `global.json` (`Microsoft.Testing.Platform`) to fix `dotnet test` discovery