model-orchestrator 0.1.7 → 0.1.9
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/CHANGELOG.md +24 -0
- package/README.md +22 -0
- package/bin/cli.js +19 -3
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,28 @@ All notable changes to this project are documented here. The format follows [Kee
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.1.9] - 2026-09-06
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `--version` and `-v` on the installer, printing the package version and exiting before anything else is validated, so it answers from a broken or half-configured directory.
|
|
12
|
+
- A "Vendor version compatibility" section in the README, naming the exact vendor CLI version each lane was built against, and saying plainly that the installer checks a binary's presence and never its version. Closes the compatibility-statement item on #11.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- `-h` and `-v` are now parsed. Both were listed in the flag table but unreachable, because parsing required a `--` prefix and rejected every single-dash argument. Strictness is unchanged: `-x` is still `unexpected argument`, `--versionn` still `unknown flag`.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- The live-canary question on #11 is answered by design rather than left open: the canary is `cli-run --doctor --run`, which runs on the user's machine against the user's own sign-ins. A maintainer-credential canary in CI would prove one machine works and bill per run, so it is documented as deliberately absent.
|
|
21
|
+
|
|
22
|
+
## [0.1.8] - 2026-09-06
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- `author` in `package.json`, so npm shows a byline: `aunysillyme (https://github.com/aunysillyme)`.
|
|
27
|
+
- The installer's last line now points at the repository, on the reasoning that the end of a successful install is the moment a user is most likely to act on it.
|
|
28
|
+
|
|
7
29
|
## [0.1.7] - 2026-09-05
|
|
8
30
|
|
|
9
31
|
### Fixed
|
|
@@ -122,6 +144,8 @@ First release.
|
|
|
122
144
|
- Adversarial audit: two Codex rounds plus a two-engine review (Codex, Antigravity); findings and fixes in `docs/audit-brief.md`. After the review: subagents go to the project root (`--project`), snippet paths computed from `--dir`, lane sections rendered from the selection, a primary agent required, level 3 asks for API keys separately from CLIs, images and CLI installs pinned, an activation summary at the end of every install.
|
|
123
145
|
|
|
124
146
|
[Unreleased]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.7...HEAD
|
|
147
|
+
[0.1.9]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.8...v0.1.9
|
|
148
|
+
[0.1.8]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.7...v0.1.8
|
|
125
149
|
[0.1.7]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.6...v0.1.7
|
|
126
150
|
[0.1.6]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.5...v0.1.6
|
|
127
151
|
[0.1.5]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.4...v0.1.5
|
package/README.md
CHANGED
|
@@ -108,6 +108,28 @@ Most of what this package ships is text an agent is asked to follow. Be clear ab
|
|
|
108
108
|
|
|
109
109
|
If you need a property in the third row to be enforced, that is a router, a policy engine or a sandbox, and this package does not claim to be one.
|
|
110
110
|
|
|
111
|
+
### Vendor version compatibility
|
|
112
|
+
|
|
113
|
+
**This package detects that a binary exists. It does not check its version, and a present binary is not a working lane.** `--doctor` reports presence, and with `--run` sends one lane a one-word canary; neither validates that the vendor's flags, output shape or auth still match what the generated files assume.
|
|
114
|
+
|
|
115
|
+
The lane wiring and the output judges were written against these versions, which are the ones this release was exercised on:
|
|
116
|
+
|
|
117
|
+
| Lane | Vendor | Version this release was built against |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| `claude` | Anthropic | 2.1.226 |
|
|
120
|
+
| `codex` | OpenAI | codex-cli 0.153.4 |
|
|
121
|
+
| `agy` | Google | 1.1.27 |
|
|
122
|
+
| `grok` | xAI | 1.0.5 |
|
|
123
|
+
| `hermes` | Nous Research | 0.20.0 |
|
|
124
|
+
| `qwen` | Alibaba | 0.22.3 |
|
|
125
|
+
| `ollama` | local | 0.33.3 |
|
|
126
|
+
|
|
127
|
+
Recorded on 2026-09-06 from the maintainer's own installs, by running each CLI's own version flag. Nothing here is pinned: these CLIs ship breaking flag changes on their own schedules, so a newer version may work perfectly, or may change a flag the generated wiring passes. When a lane starts failing after a vendor upgrade, compare against this table first.
|
|
128
|
+
|
|
129
|
+
**The live canary runs on your machine, with your credentials.** That is what `node bin/cli-run.mjs --doctor --run` is: it sends every enabled lane one tiny prompt through your own sign-ins and reports `canary ok` or `canary FAILED rc=` per lane. Run it after install, and again after any vendor upgrade.
|
|
130
|
+
|
|
131
|
+
It deliberately does not run in this repository's CI. A canary is only meaningful against real credentials, and there are no credentials a maintainer could supply that would tell **you** anything about **your** lanes: your sign-ins, your quota, your vendor versions. A maintainer-credential canary in CI would prove one machine works and bill someone per run to do it. So CI runs the full suite against stub lanes on Ubuntu and macOS, Node 18/20/22, plus a packaged install into a clean consumer, and the live check ships to you instead.
|
|
132
|
+
|
|
111
133
|
## Principles the whole thing rests on
|
|
112
134
|
|
|
113
135
|
1. **Route by capability tier, not model name.** Default down, escalate on evidence.
|
package/bin/cli.js
CHANGED
|
@@ -17,13 +17,18 @@ import { planFiles, writeFiles, resolveSelection, resolveTools, resolveApis, dir
|
|
|
17
17
|
// turn a dry run into a real one.
|
|
18
18
|
const SPEC = {
|
|
19
19
|
level: 'value', ais: 'value', primary: 'value', dir: 'value', project: 'value', tools: 'value', apis: 'value',
|
|
20
|
-
yes: 'bool', force: 'bool', dry: 'bool', 'dry-run': 'bool', 'no-install': 'bool', 'no-tools': 'bool', 'no-apis': 'bool', 'upgrade-runtime': 'bool', 'update-docs': 'bool', list: 'bool', help: 'bool', h: 'bool'
|
|
20
|
+
yes: 'bool', force: 'bool', dry: 'bool', 'dry-run': 'bool', 'no-install': 'bool', 'no-tools': 'bool', 'no-apis': 'bool', 'upgrade-runtime': 'bool', 'update-docs': 'bool', list: 'bool', help: 'bool', h: 'bool', version: 'bool', v: 'bool'
|
|
21
21
|
};
|
|
22
22
|
export function parseArgs(argv) {
|
|
23
23
|
const out = {};
|
|
24
24
|
const errors = [];
|
|
25
25
|
for (let i = 0; i < argv.length; i++) {
|
|
26
|
-
|
|
26
|
+
let a = argv[i];
|
|
27
|
+
// The only single-dash forms, both bool: everything else stays strict, so a
|
|
28
|
+
// typo cannot be silently absorbed as a short flag. `-h`/`-v` were listed in
|
|
29
|
+
// SPEC before 0.1.9 but unreachable, because parsing required a `--` prefix.
|
|
30
|
+
if (a === '-h') a = '--help';
|
|
31
|
+
else if (a === '-v') a = '--version';
|
|
27
32
|
if (!a.startsWith('--')) {
|
|
28
33
|
errors.push(`unexpected argument: ${a}`);
|
|
29
34
|
continue;
|
|
@@ -69,6 +74,14 @@ if (parsed.errors.length) {
|
|
|
69
74
|
const flag = (name) => parsed.out[name] === true;
|
|
70
75
|
const opt = (name) => (typeof parsed.out[name] === 'string' ? parsed.out[name] : null);
|
|
71
76
|
|
|
77
|
+
// Answered before anything else is validated, so `--version` works from a
|
|
78
|
+
// broken or half-configured directory: the one question a user asks when they
|
|
79
|
+
// are about to file a bug must never depend on the rest of the run.
|
|
80
|
+
if (flag('version') || flag('v')) {
|
|
81
|
+
console.log(GENERATOR_VERSION);
|
|
82
|
+
process.exit(0);
|
|
83
|
+
}
|
|
84
|
+
|
|
72
85
|
if (flag('help') || flag('h')) {
|
|
73
86
|
console.log(`model-orchestrator: set up a model orchestrator for the AIs you actually have.
|
|
74
87
|
|
|
@@ -96,6 +109,8 @@ Flags
|
|
|
96
109
|
--dry, --dry-run print the plan, write nothing
|
|
97
110
|
--no-install never offer to run npm installs
|
|
98
111
|
--list print the catalog
|
|
112
|
+
--version, -v print the version and exit
|
|
113
|
+
--help, -h print this and exit
|
|
99
114
|
`);
|
|
100
115
|
process.exit(0);
|
|
101
116
|
}
|
|
@@ -359,7 +374,8 @@ async function main() {
|
|
|
359
374
|
if (level >= 3) steps.push(`box: read ${join(dir, 'vm', 'README.md')}; keys named in vm/ENVIRONMENT.md go in your secrets manager, never a file`);
|
|
360
375
|
console.log('\nTo activate, in order:');
|
|
361
376
|
steps.forEach((st, i) => console.log(` ${i + 1}. ${st}`));
|
|
362
|
-
console.log(`\nStart here: ${join(dir, 'README.md')} (written for level ${level} and the AIs you picked)
|
|
377
|
+
console.log(`\nStart here: ${join(dir, 'README.md')} (written for level ${level} and the AIs you picked).`);
|
|
378
|
+
console.log('\nIf this saved you time, a star helps people find it: https://github.com/aunysillyme/model-orchestrator\n');
|
|
363
379
|
rl && rl.close();
|
|
364
380
|
}
|
|
365
381
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "model-orchestrator",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "A model orchestrator you can npm run: route every task to the cheapest AI that does it well, across one agent, many CLIs, or a whole virtual machine. Three levels, one installer that asks what you have access to.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -48,5 +48,6 @@
|
|
|
48
48
|
"multi-agent",
|
|
49
49
|
"cli"
|
|
50
50
|
],
|
|
51
|
+
"author": "aunysillyme (https://github.com/aunysillyme)",
|
|
51
52
|
"license": "MIT"
|
|
52
53
|
}
|