ennodia 0.1.1 → 0.3.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +60 -36
- package/README.md +72 -100
- package/bench/README.md +7 -5
- package/bench/bug-recall/run.ts +12 -4
- package/bin/ennodia +23 -2
- package/docs/assets/agents/mcp.svg +1 -1
- package/docs/assets/orchestration-pipeline.svg +4 -3
- package/docs/comparisons/agent-frameworks.md +15 -10
- package/docs/comparisons/autogen.md +20 -15
- package/docs/comparisons/chathub.md +15 -14
- package/docs/comparisons/index.md +30 -22
- package/docs/comparisons/langgraph.md +19 -12
- package/docs/comparisons/mixture-of-agents.md +20 -17
- package/docs/comparisons/model-merging.md +7 -5
- package/docs/comparisons/openrouter.md +30 -22
- package/docs/concepts/compositional-audits.md +16 -13
- package/docs/concepts/data-governance.md +31 -15
- package/docs/concepts/how-ennodia-works.md +48 -22
- package/docs/concepts/interfaces-and-core.md +19 -6
- package/docs/concepts/second-opinions.md +20 -20
- package/docs/evidence/building-ennodia.md +66 -0
- package/docs/evidence/docs-drift.md +73 -0
- package/docs/evidence/index.md +18 -0
- package/docs/evidence/measurement.md +40 -0
- package/docs/evidence/skill-trial.md +68 -0
- package/docs/getting-started.md +87 -36
- package/docs/guides/agent-skills.md +32 -15
- package/docs/guides/budgets-and-limits.md +30 -20
- package/docs/guides/pragmatic-mode.md +85 -0
- package/docs/guides/recipes.md +56 -0
- package/docs/guides/running-better-audits.md +50 -44
- package/docs/guides/troubleshooting.md +48 -0
- package/docs/guides/understand-results.md +41 -0
- package/docs/index.md +27 -67
- package/docs/install.md +82 -40
- package/docs/reference/benchmarks.md +6 -4
- package/docs/reference/controlled-english.md +129 -0
- package/docs/reference/ennodia-io.md +56 -27
- package/docs/reference/mcp-tools.md +301 -91
- package/docs/reference/supported-harnesses.md +49 -10
- package/docs/roadmap.md +25 -0
- package/examples/docs-drift/README.md +8 -0
- package/examples/docs-drift/archive/migration.md +4 -0
- package/examples/docs-drift/check.ts +7 -0
- package/examples/docs-drift/config.ts +8 -0
- package/examples/docs-drift/demo.ts +54 -0
- package/examples/docs-drift/recorded-run.json +16 -0
- package/examples/skill-trial/README.md +8 -0
- package/examples/skill-trial/check.ts +15 -0
- package/examples/skill-trial/contract.md +7 -0
- package/examples/skill-trial/recorded-trial.json +42 -0
- package/examples/skill-trial/retry.ts +4 -0
- package/package.json +10 -5
- package/skills/pragmatic/SKILL.md +23 -0
- package/src/advisor.ts +689 -0
- package/src/budget.ts +37 -14
- package/src/cli.ts +4 -1
- package/src/compare.ts +261 -64
- package/src/compositional.ts +28 -4
- package/src/core.ts +587 -50
- package/src/diagnosis.ts +17 -3
- package/src/harnesses.ts +121 -31
- package/src/history.ts +4 -1
- package/src/index.ts +39 -0
- package/src/plan-advice.ts +604 -0
- package/src/planner.ts +24 -1
- package/src/pragmatic.ts +59 -0
- package/src/process.ts +18 -0
- package/src/runs.ts +93 -10
- package/src/server.ts +329 -59
- package/src/skills.ts +131 -11
- package/src/tasks.ts +297 -39
- package/src/version.ts +1 -1
package/CONTRIBUTING.md
CHANGED
|
@@ -6,7 +6,7 @@ review.
|
|
|
6
6
|
## Prerequisites
|
|
7
7
|
|
|
8
8
|
- Bun `1.3.14` or newer
|
|
9
|
-
- Local AI tools only when you
|
|
9
|
+
- Local artificial intelligence (AI) tools only when you change or test their adapters
|
|
10
10
|
|
|
11
11
|
## Local workflow
|
|
12
12
|
|
|
@@ -21,8 +21,9 @@ bun run verify
|
|
|
21
21
|
- Oxlint
|
|
22
22
|
- Bun tests
|
|
23
23
|
- website build
|
|
24
|
+
- controlled-English deterministic checks
|
|
24
25
|
- task smoke test
|
|
25
|
-
- MCP smoke test
|
|
26
|
+
- Model Context Protocol (MCP) smoke test
|
|
26
27
|
|
|
27
28
|
Before changing release metadata, package contents, or registry config, also run:
|
|
28
29
|
|
|
@@ -35,7 +36,8 @@ bun run release:check
|
|
|
35
36
|
- Keep adapters thin. Put shared routing, tracing, task lifecycle, recovery, and
|
|
36
37
|
Compare behavior in core modules.
|
|
37
38
|
- Do not add permission-bypass flags to harness commands by default.
|
|
38
|
-
- Do not call provider-private
|
|
39
|
+
- Do not call provider-private application programming interfaces (APIs).
|
|
40
|
+
Use supported command-line interface (CLI) or API surfaces.
|
|
39
41
|
- Keep progress and status output compact and factual.
|
|
40
42
|
- Keep docs, website copy, package metadata, and MCP behavior aligned in the
|
|
41
43
|
same change when public behavior changes.
|
|
@@ -46,10 +48,11 @@ bun run release:check
|
|
|
46
48
|
|
|
47
49
|
`bin/ennodia` is the executable used by npm, `bunx`, and `npx`.
|
|
48
50
|
`src/cli.ts` starts the stdio MCP server only.
|
|
49
|
-
`src/index.ts` is the side-effect-free TypeScript export surface for
|
|
50
|
-
imports.
|
|
51
|
-
`packages/ennodia-io` is the experimental local
|
|
52
|
-
|
|
51
|
+
`src/index.ts` is the side-effect-free TypeScript export surface for the
|
|
52
|
+
JavaScript Registry (JSR) and imports.
|
|
53
|
+
`packages/ennodia-io` is the experimental local Hypertext Transfer Protocol
|
|
54
|
+
(HTTP) package. It owns the
|
|
55
|
+
`ennodia-io` binary and imports Core from the `ennodia` package surface. The
|
|
53
56
|
root package must not ship the HTTP server.
|
|
54
57
|
|
|
55
58
|
## Releasing
|
|
@@ -57,13 +60,16 @@ root package must not ship the HTTP server.
|
|
|
57
60
|
Releases are cut by a maintainer, not part of a normal contribution. This
|
|
58
61
|
section exists so the process is written down.
|
|
59
62
|
|
|
60
|
-
**Versioning.** Prerelease versions use SemVer suffixes such as `0.1.0-rc.1
|
|
63
|
+
**Versioning.** Prerelease versions use SemVer suffixes such as `0.1.0-rc.1`.
|
|
61
64
|
stable versions omit the suffix, such as `0.1.0`. The source of truth is the
|
|
62
|
-
root `package.json` version
|
|
63
|
-
`src/version.ts`, and the IO package version/peer dependency from it. `bun test`
|
|
64
|
-
verifies they match.
|
|
65
|
+
root `package.json` version.
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
`bun run version:sync` derives `jsr.json`,
|
|
68
|
+
`src/version.ts`, `server.json`, `manifest.json`, and the IO package version.
|
|
69
|
+
It also derives the IO dependency on the core version. `bun test` verifies
|
|
70
|
+
that the versions match.
|
|
71
|
+
|
|
72
|
+
**Dist-tags.** Tags containing a hyphen publish to npm's `next` dist-tag.
|
|
67
73
|
tags without a hyphen publish to `latest`:
|
|
68
74
|
|
|
69
75
|
```bash
|
|
@@ -73,7 +79,7 @@ git tag v0.1.0 && git push origin v0.1.0 # publishes to latest
|
|
|
73
79
|
|
|
74
80
|
Since `v0.1.0`, docs recommend the unqualified `ennodia` install, which npm
|
|
75
81
|
resolves to the `latest` dist-tag. Prerelease work between stable releases
|
|
76
|
-
still publishes to `next
|
|
82
|
+
still publishes to `next`. Recommend `ennodia@next` in docs only while a fix
|
|
77
83
|
exists solely on that channel.
|
|
78
84
|
|
|
79
85
|
**Release checklist.**
|
|
@@ -89,44 +95,62 @@ exists solely on that channel.
|
|
|
89
95
|
3. Commit the version change.
|
|
90
96
|
4. Push a matching tag, for example `v0.1.0-rc.1`.
|
|
91
97
|
5. The `Release` GitHub Actions workflow publishes the core `ennodia` package
|
|
92
|
-
to npm and JSR,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
**Package contents.** The core npm package must include
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
to npm and JSR, then `@cherninlab/ennodia-io` to npm, the MCP Registry
|
|
99
|
+
listing, and the GitHub release asset. Re-running a release is safe when a
|
|
100
|
+
prior attempt published one of these immutable versions.
|
|
101
|
+
|
|
102
|
+
**Package contents.** The core npm package must include these items:
|
|
103
|
+
|
|
104
|
+
- `bin/ennodia`
|
|
105
|
+
- source files that the Bun runtime needs
|
|
106
|
+
- README, LICENSE, CONTRIBUTING, and documentation files
|
|
107
|
+
- benchmark fixtures
|
|
108
|
+
|
|
109
|
+
The core npm package must not include these items:
|
|
110
|
+
|
|
111
|
+
- `.github/`, `AGENTS.md`, or `CLAUDE.md`
|
|
112
|
+
- `bun.lock`, `src/dev/`, or `src/io.ts`
|
|
113
|
+
- `*.test.ts`, `packages/`, or `website/`
|
|
114
|
+
|
|
100
115
|
JSR publishes the TypeScript source and docs, but not benchmark fixtures.
|
|
101
116
|
The IO npm package must include `bin/ennodia-io`, its `src/` files, and its
|
|
102
|
-
README
|
|
103
|
-
|
|
117
|
+
README. It has an exact runtime dependency on the matching `ennodia` version.
|
|
118
|
+
The release workflow publishes the core package first. The IO package stays
|
|
119
|
+
outside the root Bun workspace so an unpublished next version does not block
|
|
120
|
+
the root install. `bun run release:check` enforces these rules.
|
|
104
121
|
|
|
105
|
-
**Registry publishing.**
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
122
|
+
**Registry publishing.** npm publishes use the repository `NPM_TOKEN` secret.
|
|
123
|
+
The workflow passes it to npm as `NODE_AUTH_TOKEN`. JSR uses GitHub Actions
|
|
124
|
+
OpenID Connect (OIDC) without a JSR token.
|
|
125
|
+
|
|
126
|
+
Link scope `@cherninlab`, package `ennodia`, to
|
|
127
|
+
`cherninlab/ennodia` in JSR package settings. The workflow's `id-token: write`
|
|
128
|
+
permission enables that authentication. To reconfigure npm, ensure the token
|
|
129
|
+
can publish both `ennodia` and `@cherninlab/ennodia-io` with public access.
|
|
111
130
|
|
|
112
131
|
**MCP registry listing.** The official MCP Registry
|
|
113
|
-
(`registry.modelcontextprotocol.io`) hosts metadata only
|
|
132
|
+
(`registry.modelcontextprotocol.io`) hosts metadata only. npm remains the
|
|
114
133
|
artifact source. The listing is defined by `server.json` at the repo root,
|
|
115
134
|
and npm-side ownership is verified through the `mcpName` field in
|
|
116
|
-
`package.json
|
|
135
|
+
`package.json`. Its value must match `io.github.cherninlab/ennodia` in
|
|
136
|
+
`server.json`.
|
|
117
137
|
To publish or update the listing after the npm package is live:
|
|
118
138
|
|
|
119
139
|
```sh
|
|
120
140
|
brew install mcp-publisher # or download from the registry's releases
|
|
121
|
-
mcp-publisher login github #
|
|
141
|
+
mcp-publisher login github # interactive local login; grants io.github.cherninlab/*
|
|
122
142
|
mcp-publisher publish # validates and submits server.json
|
|
123
143
|
```
|
|
124
144
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
145
|
+
The release workflow uses the non-interactive GitHub Actions OIDC equivalent:
|
|
146
|
+
`mcp-publisher login github-oidc --registry=https://registry.modelcontextprotocol.io`.
|
|
147
|
+
This also requires the workflow's `id-token: write` permission.
|
|
148
|
+
|
|
149
|
+
Keep the `version` fields in `server.json` in step with releases. The
|
|
150
|
+
listing is per-version, so re-run `mcp-publisher publish` after each release.
|
|
151
|
+
Community aggregators (Glama, PulseMCP, mcp.so, Smithery) index
|
|
128
152
|
GitHub and the official registry automatically or accept one-time
|
|
129
|
-
submissions
|
|
153
|
+
submissions. They do not need per-release updates.
|
|
130
154
|
|
|
131
155
|
## Benchmarks
|
|
132
156
|
|
package/README.md
CHANGED
|
@@ -1,140 +1,112 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
<a href="https://ennodia.cherninlab.com">
|
|
4
1
|
<picture>
|
|
5
2
|
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/logo-dark.svg">
|
|
6
|
-
<source media="(prefers-color-scheme: light)" srcset="docs/assets/logo.svg">
|
|
7
3
|
<img alt="Ennodia" src="docs/assets/logo.svg" width="235" height="50">
|
|
8
4
|
</picture>
|
|
9
|
-
</a>
|
|
10
5
|
|
|
11
|
-
|
|
6
|
+
**Keep your agent. Get another way forward.**
|
|
12
7
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<a href="https://smithery.ai/servers/cherninlab/ennodia"><img alt="Smithery: Ennodia" src="https://img.shields.io/badge/Smithery-Ennodia-FF5601"></a>
|
|
17
|
-
</p>
|
|
8
|
+
When a task stalls, Ennodia lets your primary artificial intelligence (AI) agent try another agent, model, or skill.
|
|
9
|
+
The findings come back to the same conversation.
|
|
10
|
+
You keep your familiar interface and decide what to try next.
|
|
18
11
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
```text
|
|
13
|
+
Use Ennodia MCP to get a second opinion on this bug.
|
|
14
|
+
Give one available agent the failing test and our attempted fixes.
|
|
15
|
+
Request a different explanation and a way to test it.
|
|
16
|
+
Bring the findings back here.
|
|
17
|
+
```
|
|
22
18
|
|
|
23
|
-
|
|
19
|
+
## When it helps
|
|
24
20
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
- A task is stuck and you want to check another approach.
|
|
22
|
+
- A skill looks useful, but you want to try it in a separate task first.
|
|
23
|
+
- Two answers disagree and you need to identify the next check.
|
|
24
|
+
- An unsuccessful attempt can help you avoid repeating the same approach under the same conditions.
|
|
29
25
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
main agent one MCP doorway to use them as an independent review panel. The
|
|
33
|
-
experimental IO package exposes a small local HTTP subset for apps, but the
|
|
34
|
-
supported first-class surface is MCP.
|
|
26
|
+
Your main agent checks the findings and integrates useful work.
|
|
27
|
+
Additional attempts consume time and resources. General time or token savings have not been established.
|
|
35
28
|
|
|
36
29
|
## Install
|
|
37
30
|
|
|
38
|
-
Send this to your primary agent
|
|
31
|
+
Send this address to your primary agent:
|
|
39
32
|
|
|
40
33
|
```text
|
|
41
34
|
try-ennodia.cherninlab.com
|
|
42
35
|
```
|
|
43
|
-
Or run it directly as a stdio MCP server from npm:
|
|
44
36
|
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
For manual setup, add this Model Context Protocol (MCP) server to your client:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"ennodia": {
|
|
43
|
+
"command": "npx",
|
|
44
|
+
"args": ["-y", "ennodia"]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
47
48
|
```
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
It uses the same stdio command from `smithery.yaml` (`npx -y ennodia`) and
|
|
52
|
-
does not need Ennodia-specific configuration.
|
|
53
|
-
|
|
54
|
-
Requires Bun `1.3.14` or newer — `npx` downloads Ennodia, Bun runs it. Prefer
|
|
55
|
-
Bun directly? Use `bunx ennodia`. For manual setup, local development,
|
|
56
|
-
or a full walkthrough, see
|
|
57
|
-
[Quickstart](https://ennodia.cherninlab.com/docs/getting-started/).
|
|
50
|
+
Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported agent with working provider access.
|
|
51
|
+
`npx` downloads Ennodia. Bun runs it. You can also use `bunx ennodia`.
|
|
58
52
|
|
|
59
|
-
|
|
53
|
+
[Get your first result](https://ennodia.cherninlab.com/docs/getting-started/) ·
|
|
54
|
+
[Installation for agents](https://ennodia.cherninlab.com/docs/install/)
|
|
60
55
|
|
|
61
|
-
|
|
62
|
-
- Plans a route with a caller-provided category or keyword fallback
|
|
63
|
-
- Estimates preflight input tokens and enforces local caps on that estimate
|
|
64
|
-
- Starts and monitors child tasks
|
|
65
|
-
- Shows status, timing, logs, and failures
|
|
66
|
-
- Cancels tasks and runs explicitly
|
|
67
|
-
- Compares multiple completed outputs
|
|
68
|
-
- Synthesizes one answer from the comparison
|
|
56
|
+
## Use your installed agents and skills
|
|
69
57
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
58
|
+
Supported agents: Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity.
|
|
59
|
+
Model availability and tool permissions depend on the installed agent and its provider configuration.
|
|
60
|
+
Discovery finds executable commands. It does not verify authentication or model access.
|
|
61
|
+
Codex workers use a read-only sandbox by default.
|
|
74
62
|
|
|
75
|
-
Ennodia
|
|
76
|
-
|
|
63
|
+
Ennodia discovers native Agent Skills and can request them for specific tasks.
|
|
64
|
+
A separate task keeps the trial outside the main conversation.
|
|
65
|
+
Native agents can also select unrequested skills from their own environment.
|
|
77
66
|
|
|
78
|
-
|
|
67
|
+
[Recipes](https://ennodia.cherninlab.com/docs/guides/recipes/) ·
|
|
68
|
+
[Using skills](https://ennodia.cherninlab.com/docs/guides/agent-skills/) ·
|
|
69
|
+
[Understand results](https://ennodia.cherninlab.com/docs/guides/understand-results/)
|
|
79
70
|
|
|
80
|
-
|
|
71
|
+
## See it in practice
|
|
81
72
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
See [Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) for
|
|
87
|
-
supported fields, auth behavior, CORS posture, and current limits.
|
|
73
|
+
- [Building Ennodia with Ennodia](https://ennodia.cherninlab.com/docs/evidence/building-ennodia/): a worker patch, a failed login, and primary-agent corrections.
|
|
74
|
+
- [Find stale documentation](https://ennodia.cherninlab.com/docs/evidence/docs-drift/): a small review with known answers.
|
|
75
|
+
- [Try a skill separately](https://ennodia.cherninlab.com/docs/evidence/skill-trial/): two attempts against the same contract.
|
|
88
76
|
|
|
89
|
-
|
|
77
|
+
The existing saved-answer benchmark is a regression check, not a live speed or cost comparison.
|
|
78
|
+
[Measurement plan](https://ennodia.cherninlab.com/docs/evidence/measurement/)
|
|
90
79
|
|
|
91
|
-
|
|
92
|
-
- Claude Code
|
|
93
|
-
- OpenCode
|
|
94
|
-
- Kilo Code
|
|
95
|
-
- Kiro CLI
|
|
96
|
-
- Cline CLI
|
|
97
|
-
- Hermes Agent
|
|
98
|
-
- Antigravity
|
|
80
|
+
## Data and limits
|
|
99
81
|
|
|
100
|
-
|
|
101
|
-
|
|
82
|
+
Ennodia runs locally without an Ennodia-hosted service.
|
|
83
|
+
Selected agents can send material to their configured model providers.
|
|
84
|
+
Terminal run history is stored locally and can be disabled with `ENNODIA_HISTORY=0`.
|
|
102
85
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
permission-bypass flags or provider-private APIs.
|
|
86
|
+
Ennodia can limit child tasks and estimated input tokens.
|
|
87
|
+
Those estimates exclude internal harness work and are not provider bills.
|
|
88
|
+
Automatic agent updates and recommendations learned from past results remain future work.
|
|
107
89
|
|
|
108
|
-
|
|
90
|
+
[Data governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/) ·
|
|
91
|
+
[Budgets](https://ennodia.cherninlab.com/docs/guides/budgets-and-limits/) ·
|
|
92
|
+
[Roadmap](https://ennodia.cherninlab.com/docs/roadmap/)
|
|
109
93
|
|
|
110
|
-
|
|
111
|
-
- [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/) — manual setup and local development
|
|
112
|
-
- [MCP Tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) — full tool parameter reference
|
|
113
|
-
- [How Ennodia Works](https://ennodia.cherninlab.com/docs/concepts/how-ennodia-works/) — the orchestration pipeline
|
|
114
|
-
- [Second Opinions](https://ennodia.cherninlab.com/docs/concepts/second-opinions/) — replicate, decompose, and red-team patterns
|
|
115
|
-
- [Data Governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/) — local storage and data movement boundaries
|
|
116
|
-
- [Comparisons](https://ennodia.cherninlab.com/docs/comparisons/) — how Ennodia compares to adjacent tools
|
|
117
|
-
- [Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/) — deterministic bug-recall results
|
|
118
|
-
- [Running Better Audits](https://ennodia.cherninlab.com/docs/guides/running-better-audits/) — prompt rubrics for Compare
|
|
94
|
+
## Technical reference and contribution
|
|
119
95
|
|
|
120
|
-
|
|
96
|
+
The main entrypoint is `ennodia_run`. The optional Plan Advisor proposes explicit tasks before execution.
|
|
97
|
+
Compare examines completed answers and returns advice with its evidence and limitations.
|
|
121
98
|
|
|
122
|
-
|
|
123
|
-
|
|
99
|
+
[MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) ·
|
|
100
|
+
[Experimental Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) ·
|
|
101
|
+
[Contributing](CONTRIBUTING.md) · [MIT license](LICENSE)
|
|
124
102
|
|
|
125
103
|
```sh
|
|
126
|
-
bun
|
|
104
|
+
bun install
|
|
105
|
+
bun run verify
|
|
127
106
|
```
|
|
128
107
|
|
|
129
|
-
|
|
130
|
-
kept out of `bun run verify`.
|
|
131
|
-
|
|
132
|
-
The current dated fixture snapshot is published in
|
|
133
|
-
[Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/): 4
|
|
134
|
-
cases, with `ennodia-parallel-compare` at 100% recall and 100% precision.
|
|
135
|
-
|
|
136
|
-
## Contributing
|
|
108
|
+
### Experimental Pragmatic mode
|
|
137
109
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
110
|
+
In `ennodia@next`, delegate bounded investigation or patch proposals to an explicitly selected model.
|
|
111
|
+
[Pragmatic mode](docs/guides/pragmatic-mode.md) keeps bulky evidence outside the main conversation and returns findings for verification.
|
|
112
|
+
Savings are not yet validated.
|
package/bench/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Benchmarks
|
|
2
2
|
|
|
3
3
|
Ennodia's first release-candidate benchmark is `multi-model-bug-recall`: small
|
|
4
|
-
TypeScript review fixtures with committed oracles. It measures
|
|
4
|
+
TypeScript review fixtures with committed oracles. It measures if
|
|
5
5
|
parallel peer review plus Compare recovers more required findings than a solo
|
|
6
6
|
harness answer.
|
|
7
7
|
|
|
@@ -11,8 +11,8 @@ The default command is deterministic and uses committed reference outputs:
|
|
|
11
11
|
bun run bench:bug-recall
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
The live command starts a fresh Ennodia MCP server and
|
|
15
|
-
is intentionally not part of `bun run verify`.
|
|
14
|
+
The live command starts a fresh Ennodia Model Context Protocol (MCP) server and
|
|
15
|
+
runs real harnesses. It is intentionally not part of `bun run verify`.
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
18
|
bun run bench:bug-recall:live -- --fixture 001-missing-await
|
|
@@ -20,10 +20,12 @@ bun run bench:bug-recall:live -- --fixture 001-missing-await
|
|
|
20
20
|
|
|
21
21
|
Useful flags:
|
|
22
22
|
|
|
23
|
-
- `--fixture <id>` runs one fixture
|
|
23
|
+
- `--fixture <id>` runs one fixture. Repeat it to select multiple fixtures.
|
|
24
24
|
- `--harness <id>` adds a solo baseline harness in live mode. Defaults to
|
|
25
25
|
`codex` and `claude-code`.
|
|
26
|
-
- `--judge-harness <id>` and `--
|
|
26
|
+
- `--judge-harness <id>` and `--advisor-harness <id>` select Compare roles.
|
|
27
|
+
- `--synthesizer-harness <id>` is a deprecated alias for
|
|
28
|
+
`--advisor-harness <id>`.
|
|
27
29
|
- `--timeout-ms <ms>` sets the per-run timeout for live harness calls.
|
|
28
30
|
- `--out <dir>` writes results to a specific directory.
|
|
29
31
|
|
package/bench/bug-recall/run.ts
CHANGED
|
@@ -21,7 +21,7 @@ type CliOptions = {
|
|
|
21
21
|
timeoutMs: number;
|
|
22
22
|
outDir?: string;
|
|
23
23
|
judgeHarnessId?: string;
|
|
24
|
-
|
|
24
|
+
advisorHarnessId?: string;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
type McpTextContent = {
|
|
@@ -129,7 +129,7 @@ async function runLiveBenchmark(
|
|
|
129
129
|
compare: true,
|
|
130
130
|
timeoutMs: options.timeoutMs,
|
|
131
131
|
judgeHarnessId: options.judgeHarnessId,
|
|
132
|
-
|
|
132
|
+
advisorHarnessId: options.advisorHarnessId,
|
|
133
133
|
maxOutputChars: 16_000,
|
|
134
134
|
});
|
|
135
135
|
outputs.push(runToOutput(
|
|
@@ -284,8 +284,16 @@ function parseArgs(args: string[]): CliOptions {
|
|
|
284
284
|
options.outDir = requireValue(args, ++index, arg);
|
|
285
285
|
} else if (arg === "--judge-harness") {
|
|
286
286
|
options.judgeHarnessId = requireValue(args, ++index, arg);
|
|
287
|
-
} else if (
|
|
288
|
-
|
|
287
|
+
} else if (
|
|
288
|
+
arg === "--advisor-harness" || arg === "--synthesizer-harness"
|
|
289
|
+
) {
|
|
290
|
+
const value = requireValue(args, ++index, arg);
|
|
291
|
+
if (options.advisorHarnessId && options.advisorHarnessId !== value) {
|
|
292
|
+
throw new Error(
|
|
293
|
+
"--advisor-harness and --synthesizer-harness must match.",
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
options.advisorHarnessId = value;
|
|
289
297
|
} else {
|
|
290
298
|
throw new Error(`Unknown option: ${arg}`);
|
|
291
299
|
}
|
package/bin/ennodia
CHANGED
|
@@ -1,2 +1,23 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
import "
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
|
|
6
|
+
const cliPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "src", "cli.ts");
|
|
7
|
+
|
|
8
|
+
const bunCheck = spawnSync("bun", ["--version"], { stdio: "ignore" });
|
|
9
|
+
|
|
10
|
+
if (bunCheck.error) {
|
|
11
|
+
process.stderr.write(
|
|
12
|
+
"Ennodia requires Bun (1.3.14 or newer) to run, but it wasn't found on your PATH.\n" +
|
|
13
|
+
"Install Bun from https://bun.sh, then try again:\n" +
|
|
14
|
+
" curl -fsSL https://bun.sh/install | bash\n",
|
|
15
|
+
);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const result = spawnSync("bun", ["run", cliPath, ...process.argv.slice(2)], {
|
|
20
|
+
stdio: "inherit",
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
process.exit(result.status ?? 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg fill="currentColor" fill-rule="evenodd" height="56" viewBox="0 0 24 24" width="56" xmlns="http://www.w3.org/2000/svg" style="flex: 0 0 auto; line-height: 1;"><title>
|
|
1
|
+
<svg fill="currentColor" fill-rule="evenodd" height="56" viewBox="0 0 24 24" width="56" xmlns="http://www.w3.org/2000/svg" style="flex: 0 0 auto; line-height: 1;"><title>Model Context Protocol</title><path d="M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z"></path><path d="M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z"></path></svg>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" width="1100" height="500" viewBox="0 0 1100 500" role="img" aria-labelledby="title desc">
|
|
2
2
|
<title id="title">Ennodia orchestration pipeline</title>
|
|
3
|
-
<desc id="desc">
|
|
3
|
+
<desc id="desc">Ennodia classifies a code-review request. It routes the request to Claude Code and Codex. The Judge and Result Advisor return a review.</desc>
|
|
4
4
|
<defs>
|
|
5
5
|
<marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
6
6
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#7aa7ff" />
|
|
@@ -61,7 +61,8 @@
|
|
|
61
61
|
<g>
|
|
62
62
|
<rect class="hub" x="890" y="207" width="130" height="86" rx="14" />
|
|
63
63
|
<text class="label" x="955" y="242" text-anchor="middle">Compare</text>
|
|
64
|
-
<text class="small" x="955" y="
|
|
64
|
+
<text class="small" x="955" y="262" text-anchor="middle">Judge</text>
|
|
65
|
+
<text class="small" x="955" y="280" text-anchor="middle">Result Advisor</text>
|
|
65
66
|
</g>
|
|
66
67
|
|
|
67
68
|
<path class="line" d="M 955 293 V 342" />
|
|
@@ -70,5 +71,5 @@
|
|
|
70
71
|
<text class="label" x="955" y="394" text-anchor="middle">Review</text>
|
|
71
72
|
</g>
|
|
72
73
|
|
|
73
|
-
<text class="small" x="550" y="454" text-anchor="middle">Every child task remains visible: status, logs, ETA, failure state, and
|
|
74
|
+
<text class="small" x="550" y="454" text-anchor="middle">Every child task remains visible: status, logs, ETA, failure state, Judge findings, and recommended answer.</text>
|
|
74
75
|
</svg>
|
|
@@ -7,12 +7,13 @@ General agent frameworks help developers build custom agent systems. They can
|
|
|
7
7
|
offer roles, graphs, memory, tool routing, state, persistence, deployment
|
|
8
8
|
patterns, and application-specific control.
|
|
9
9
|
|
|
10
|
-
Ennodia is less general on purpose.
|
|
11
|
-
|
|
10
|
+
Ennodia is less general on purpose. Its small Model Context Protocol (MCP)
|
|
11
|
+
interface lets a primary agent request help from installed agent command-line
|
|
12
|
+
interfaces (CLIs). The primary agent can then inspect the result.
|
|
12
13
|
|
|
13
14
|
## Choose an Agent Framework When
|
|
14
15
|
|
|
15
|
-
- You
|
|
16
|
+
- You define the agent workflow.
|
|
16
17
|
- You need custom roles, memory, state, routing, or persistence.
|
|
17
18
|
- The agent system is part of your application or service.
|
|
18
19
|
- You want code-level control over every edge in the workflow.
|
|
@@ -21,17 +22,21 @@ for asking other installed local agents for help and inspecting the result.
|
|
|
21
22
|
|
|
22
23
|
- You do not want to build an agent system.
|
|
23
24
|
- You want a local MCP tool that works with installed agent CLIs.
|
|
24
|
-
- You want
|
|
25
|
-
|
|
25
|
+
- You want asynchronous task state, run history, failures, budget
|
|
26
|
+
estimates, and
|
|
27
|
+
Judge + Result Advisor Compare.
|
|
28
|
+
- You want an optional Plan Advisor to suggest a bounded team while execution
|
|
29
|
+
remains a separate, validated action.
|
|
26
30
|
- You want the primary agent to remain in charge.
|
|
27
31
|
|
|
28
32
|
## Key Difference
|
|
29
33
|
|
|
30
|
-
Agent frameworks
|
|
31
|
-
an
|
|
34
|
+
Agent frameworks provide components for custom agent systems. Ennodia is an
|
|
35
|
+
orchestration helper for an active agent. Its Plan Advisor produces inert plan
|
|
36
|
+
data. It does not create a persistent autonomous team or execute the proposal.
|
|
32
37
|
|
|
33
38
|
## Common Mistake
|
|
34
39
|
|
|
35
|
-
Do not claim Ennodia is more powerful than a framework. It is deliberately
|
|
36
|
-
smaller.
|
|
37
|
-
|
|
40
|
+
Do not claim that Ennodia is more powerful than a framework. It is deliberately
|
|
41
|
+
smaller. A user can add multi-agent review to a current local workflow. This
|
|
42
|
+
does not require a complete framework application.
|
|
@@ -3,35 +3,40 @@ title: Ennodia vs AutoGen
|
|
|
3
3
|
description: How Ennodia differs from AutoGen and programmable multi-agent application frameworks.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
[AutoGen](https://microsoft.github.io/autogen/stable/index.html) is a
|
|
7
|
-
|
|
8
|
-
applications
|
|
6
|
+
[AutoGen](https://microsoft.github.io/autogen/stable/index.html) is a programming
|
|
7
|
+
framework. Developers use it to create conversational single-agent and
|
|
8
|
+
multi-agent applications. It has an event-driven core for scalable multi-agent
|
|
9
|
+
systems.
|
|
9
10
|
|
|
10
|
-
Ennodia is not a framework for
|
|
11
|
-
|
|
11
|
+
Ennodia is not a framework for a new multi-agent application. It is a local
|
|
12
|
+
Model Context Protocol (MCP) server that an active agent can call.
|
|
12
13
|
|
|
13
14
|
## Choose AutoGen When
|
|
14
15
|
|
|
15
|
-
- You want to
|
|
16
|
+
- You want to create a multi-agent system in application code.
|
|
16
17
|
- You need programmable agent roles, event handling, message passing, and custom
|
|
17
18
|
workflow control.
|
|
18
19
|
- Your product needs a framework-level architecture.
|
|
19
20
|
|
|
20
21
|
## Choose Ennodia When
|
|
21
22
|
|
|
22
|
-
- The primary workflow
|
|
23
|
+
- The primary workflow uses Codex, Claude Code, OpenCode,
|
|
23
24
|
Antigravity, or another MCP-capable client.
|
|
24
|
-
- You want to reuse installed local CLIs and
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
- You want to reuse installed local command-line interfaces (CLIs) and
|
|
26
|
+
subscriptions.
|
|
27
|
+
- You want task traces, status, budget checks, and Compare without a full
|
|
28
|
+
multi-agent runtime.
|
|
29
|
+
- You want a Plan Advisor to suggest explicit harness, model, and skill
|
|
30
|
+
assignments. Plan Advisor has no execution control.
|
|
27
31
|
|
|
28
32
|
## Key Difference
|
|
29
33
|
|
|
30
|
-
AutoGen
|
|
31
|
-
|
|
34
|
+
AutoGen helps developers create multi-agent applications. Ennodia lets one agent
|
|
35
|
+
request help from other installed agents. A Plan Advisor can propose a bounded
|
|
36
|
+
team. The proposal stays inert until the caller explicitly starts it.
|
|
32
37
|
|
|
33
38
|
## Common Mistake
|
|
34
39
|
|
|
35
|
-
Do not compare them only by "number of agents." The important question is
|
|
36
|
-
the orchestration
|
|
37
|
-
local MCP tool
|
|
40
|
+
Do not compare them only by "number of agents." The important question is the
|
|
41
|
+
location of the orchestration. It can be in a custom application framework or a
|
|
42
|
+
local MCP tool.
|