ennodia 0.1.1 → 0.2.0
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 +74 -58
- 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/getting-started.md +55 -27
- package/docs/guides/agent-skills.md +16 -13
- package/docs/guides/budgets-and-limits.md +30 -20
- package/docs/guides/running-better-audits.md +50 -44
- package/docs/index.md +60 -37
- package/docs/install.md +41 -32
- package/docs/reference/benchmarks.md +6 -4
- package/docs/reference/controlled-english.md +130 -0
- package/docs/reference/ennodia-io.md +28 -22
- package/docs/reference/mcp-tools.md +244 -87
- package/docs/reference/supported-harnesses.md +9 -9
- package/package.json +7 -5
- package/src/advisor.ts +685 -0
- package/src/budget.ts +25 -6
- package/src/cli.ts +1 -1
- package/src/compare.ts +248 -52
- package/src/compositional.ts +18 -0
- package/src/core.ts +547 -16
- package/src/harnesses.ts +33 -2
- package/src/index.ts +38 -0
- package/src/plan-advice.ts +601 -0
- package/src/runs.ts +74 -9
- package/src/server.ts +312 -46
- package/src/skills.ts +131 -11
- package/src/tasks.ts +192 -22
- 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,90 +1,103 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
<a href="https://ennodia.cherninlab.com">
|
|
4
|
-
<picture>
|
|
5
|
-
<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
|
-
<img alt="Ennodia" src="docs/assets/logo.svg" width="235" height="50">
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/cherninlab/ennodia/raw/main/docs/assets/logo-dark.svg">
|
|
6
|
+
<source media="(prefers-color-scheme: light)" srcset="https://github.com/cherninlab/ennodia/raw/main/docs/assets/logo.svg">
|
|
7
|
+
<img alt="Ennodia" src="https://github.com/cherninlab/ennodia/raw/main/docs/assets/logo.svg" width="235" height="50">
|
|
8
8
|
</picture>
|
|
9
9
|
</a>
|
|
10
10
|
|
|
11
|
-
<p><strong>MCP server for multi-agent review with Compare and traceable receipts</strong></p>
|
|
11
|
+
<p><strong>Model Context Protocol (MCP) server for multi-agent review with Compare and traceable receipts</strong></p>
|
|
12
12
|
|
|
13
13
|
<p>
|
|
14
14
|
<a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-informational"></a>
|
|
15
|
-
<img alt="
|
|
15
|
+
<img alt="Continuous integration" src="https://github.com/cherninlab/ennodia/actions/workflows/ci.yml/badge.svg" />
|
|
16
16
|
<a href="https://smithery.ai/servers/cherninlab/ennodia"><img alt="Smithery: Ennodia" src="https://img.shields.io/badge/Smithery-Ennodia-FF5601"></a>
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
<p align="center">
|
|
20
|
-
<img alt="Ennodia terminal
|
|
20
|
+
<img alt="Ennodia terminal with three completed artificial intelligence reviews" src="https://github.com/cherninlab/ennodia/raw/main/docs/assets/terminal.png" width="600">
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
23
|
</div>
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
disagreements, blind spots, and one synthesized answer with receipts.
|
|
25
|
+
Ennodia gives your primary agent access to installed agent command-line
|
|
26
|
+
interfaces (CLIs). It tracks each child task and uses model-led Compare to show
|
|
27
|
+
agreements, disagreements, omissions, and one recommended answer with receipts.
|
|
29
28
|
|
|
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.
|
|
29
|
+
Before work, an optional Plan Advisor can propose a bounded set of harnesses,
|
|
30
|
+
models, and skills. It does not start the proposed work.
|
|
35
31
|
|
|
36
32
|
## Install
|
|
37
33
|
|
|
38
|
-
Send this to your primary agent
|
|
34
|
+
Send this address to your primary agent. The agent can then complete the
|
|
35
|
+
installation:
|
|
39
36
|
|
|
40
37
|
```text
|
|
41
38
|
try-ennodia.cherninlab.com
|
|
42
39
|
```
|
|
43
|
-
|
|
40
|
+
To run Ennodia directly as a standard input/output (stdio) MCP server, use:
|
|
44
41
|
|
|
45
42
|
```sh
|
|
46
43
|
npx -y ennodia
|
|
47
44
|
```
|
|
45
|
+
To use Bun directly, run `bunx ennodia`.
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
[Ennodia Smithery
|
|
51
|
-
It uses the same stdio command from `smithery.yaml` (`npx -y ennodia`) and
|
|
52
|
-
does not need Ennodia-specific configuration.
|
|
47
|
+
For a registry or client installer, use the
|
|
48
|
+
[Ennodia Smithery page](https://smithery.ai/servers/cherninlab/ennodia).
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
Bun directly? Use `bunx ennodia`. For manual setup, local development,
|
|
56
|
-
or a full walkthrough, see
|
|
50
|
+
For manual installation or local development, see
|
|
57
51
|
[Quickstart](https://ennodia.cherninlab.com/docs/getting-started/).
|
|
58
52
|
|
|
59
53
|
## What Ennodia does
|
|
60
54
|
|
|
61
|
-
- Discovers available local AI tools
|
|
55
|
+
- Discovers available local artificial intelligence (AI) tools
|
|
62
56
|
- Plans a route with a caller-provided category or keyword fallback
|
|
63
57
|
- Estimates preflight input tokens and enforces local caps on that estimate
|
|
64
58
|
- Starts and monitors child tasks
|
|
65
|
-
- Shows status,
|
|
59
|
+
- Shows status, elapsed time, logs, and failures
|
|
66
60
|
- Cancels tasks and runs explicitly
|
|
67
|
-
-
|
|
68
|
-
-
|
|
61
|
+
- Lets a Plan Advisor propose an inert, validated work plan
|
|
62
|
+
- Compares multiple completed outputs with a Judge
|
|
63
|
+
- Lets a Result Advisor combine the Judge findings into one answer
|
|
69
64
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
[MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) for the
|
|
73
|
-
full tool and parameter reference.
|
|
65
|
+
`ennodia_run` is the main entrypoint. It plans and starts tasks. It can also use
|
|
66
|
+
Compare. It returns a run identifier (ID) for use with `ennodia_get_run`.
|
|
74
67
|
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
See [MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) for
|
|
69
|
+
the full tool and parameter reference.
|
|
70
|
+
|
|
71
|
+
Use Ennodia for work that needs additional model analysis. A run usually takes
|
|
72
|
+
minutes. Compare adds two serial model passes after the child agents finish.
|
|
73
|
+
|
|
74
|
+
## Judge, Plan Advisor, and Result Advisor
|
|
75
|
+
|
|
76
|
+
Each role has limited responsibilities:
|
|
77
|
+
|
|
78
|
+
- **Plan Advisor** runs before work when requested. It proposes explicit
|
|
79
|
+
harness, model, and skill assignments as inert data. Ennodia validates the
|
|
80
|
+
proposal against a frozen inventory. Plan Advisor cannot execute it. The
|
|
81
|
+
caller must use a separate call to start the validated plan once.
|
|
82
|
+
- **Judge** runs during Compare and maps agreements, contradictions, unique
|
|
83
|
+
evidence, omissions, and risks across completed outputs.
|
|
84
|
+
- **Result Advisor** follows the Judge. It uses the Judge findings and original
|
|
85
|
+
outputs to recommend an answer. If Judge analysis is not usable, it uses
|
|
86
|
+
`basis: "candidates-only"`. This status makes the degradation visible.
|
|
77
87
|
|
|
78
88
|
## Ennodia IO
|
|
79
89
|
|
|
80
|
-
The separate `@cherninlab/ennodia-io`
|
|
90
|
+
The separate `@cherninlab/ennodia-io` package provides a local Hypertext
|
|
91
|
+
Transfer Protocol (HTTP) and TypeScript interface. Apps can use it with
|
|
92
|
+
user-supplied keys and installed local agents:
|
|
81
93
|
|
|
82
94
|
```sh
|
|
83
95
|
npx -y @cherninlab/ennodia-io
|
|
84
96
|
```
|
|
85
97
|
|
|
86
98
|
See [Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) for
|
|
87
|
-
supported fields,
|
|
99
|
+
supported fields, authentication behavior, cross-origin resource sharing
|
|
100
|
+
rules, and current limits.
|
|
88
101
|
|
|
89
102
|
## Supported harnesses
|
|
90
103
|
|
|
@@ -97,30 +110,33 @@ supported fields, auth behavior, CORS posture, and current limits.
|
|
|
97
110
|
- Hermes Agent
|
|
98
111
|
- Antigravity
|
|
99
112
|
|
|
100
|
-
Adapters stay thin
|
|
101
|
-
Compare logic
|
|
113
|
+
Adapters stay thin. Core modules contain shared routing, trace data, task state,
|
|
114
|
+
recovery, and Compare logic.
|
|
115
|
+
|
|
116
|
+
Evaluated candidates include Gemini CLI, GitHub Copilot CLI, Amp, Aider, Goose,
|
|
117
|
+
Qwen Code, and Cursor CLI. Ennodia does not include these candidates.
|
|
102
118
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
permission-bypass flags or provider-private APIs.
|
|
119
|
+
Ennodia can add a candidate after verification of a supported prompt-in and
|
|
120
|
+
text-out interface. Verification must not use permission-bypass flags or
|
|
121
|
+
provider-private APIs.
|
|
107
122
|
|
|
108
123
|
## Documentation
|
|
109
124
|
|
|
110
|
-
- [Installation for Agents](https://ennodia.cherninlab.com/docs/install/)
|
|
111
|
-
- [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/)
|
|
112
|
-
- [MCP Tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/)
|
|
113
|
-
- [How Ennodia Works](https://ennodia.cherninlab.com/docs/concepts/how-ennodia-works/)
|
|
114
|
-
- [Second Opinions](https://ennodia.cherninlab.com/docs/concepts/second-opinions/)
|
|
115
|
-
- [Data Governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/)
|
|
116
|
-
- [
|
|
117
|
-
- [
|
|
118
|
-
- [
|
|
125
|
+
- [Installation for Agents](https://ennodia.cherninlab.com/docs/install/): agent-controlled installation
|
|
126
|
+
- [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/): manual installation and local development
|
|
127
|
+
- [MCP Tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/): full tool parameter reference
|
|
128
|
+
- [How Ennodia Works](https://ennodia.cherninlab.com/docs/concepts/how-ennodia-works/): orchestration pipeline
|
|
129
|
+
- [Second Opinions](https://ennodia.cherninlab.com/docs/concepts/second-opinions/): replicate, decompose, and red-team patterns
|
|
130
|
+
- [Data Governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/): local storage and data movement boundaries
|
|
131
|
+
- [Controlled English](https://ennodia.cherninlab.com/docs/reference/controlled-english/): ASD-STE100 rules and Ennodia technical terms
|
|
132
|
+
- [Comparisons](https://ennodia.cherninlab.com/docs/comparisons/): comparisons with adjacent tools
|
|
133
|
+
- [Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/): deterministic bug-recall results
|
|
134
|
+
- [Better Audits](https://ennodia.cherninlab.com/docs/guides/running-better-audits/): prompt rubrics for Compare
|
|
119
135
|
|
|
120
136
|
## Benchmarks
|
|
121
137
|
|
|
122
|
-
The current benchmark is `multi-model-bug-recall
|
|
123
|
-
fixtures
|
|
138
|
+
The current benchmark is `multi-model-bug-recall`. It uses small TypeScript
|
|
139
|
+
review fixtures and committed bug oracles. Run the deterministic suite with:
|
|
124
140
|
|
|
125
141
|
```sh
|
|
126
142
|
bun run bench:bug-recall
|
|
@@ -133,8 +149,8 @@ The current dated fixture snapshot is published in
|
|
|
133
149
|
[Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/): 4
|
|
134
150
|
cases, with `ennodia-parallel-compare` at 100% recall and 100% precision.
|
|
135
151
|
|
|
136
|
-
##
|
|
152
|
+
## Contribute
|
|
137
153
|
|
|
138
|
-
Ennodia is under active development.
|
|
139
|
-
|
|
140
|
-
workflow.
|
|
154
|
+
Ennodia is under active development. You can submit bug reports and small,
|
|
155
|
+
focused pull requests. See [CONTRIBUTING.md](CONTRIBUTING.md) for the local
|
|
156
|
+
verification workflow.
|
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.
|