metaharness 0.1.0 → 0.1.1
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/dist/diag.js +5 -5
- package/dist/genome.js +1 -1
- package/dist/index.js +17 -17
- package/dist/registry.js +1 -1
- package/package.json +4 -4
package/dist/diag.js
CHANGED
|
@@ -86,8 +86,8 @@ function resolveLocalGeneratorVersion() {
|
|
|
86
86
|
const candidates = [
|
|
87
87
|
// Workspace: packages/create-agent-harness/dist/ → ../package.json
|
|
88
88
|
resolve(__dirname, '..', 'package.json'),
|
|
89
|
-
// Installed: node_modules/
|
|
90
|
-
resolve(__dirname, '..', '..', '
|
|
89
|
+
// Installed: node_modules/metaharness/package.json (post iter 108 rename)
|
|
90
|
+
resolve(__dirname, '..', '..', 'metaharness', 'package.json'),
|
|
91
91
|
// Legacy: node_modules/create-agent-harness/package.json (pre-rename installs)
|
|
92
92
|
resolve(__dirname, '..', '..', 'create-agent-harness', 'package.json'),
|
|
93
93
|
];
|
|
@@ -96,8 +96,8 @@ function resolveLocalGeneratorVersion() {
|
|
|
96
96
|
if (existsSync(p)) {
|
|
97
97
|
const pkg = JSON.parse(readFileSync(p, 'utf-8'));
|
|
98
98
|
// Accept either name — `create-agent-harness` is the legacy resolved-from-sibling
|
|
99
|
-
// case, `
|
|
100
|
-
if ((pkg.name === '
|
|
99
|
+
// case, `metaharness` is the current publishable name (iter 108).
|
|
100
|
+
if ((pkg.name === 'metaharness' || pkg.name === 'create-agent-harness') && typeof pkg.version === 'string') {
|
|
101
101
|
return pkg.version;
|
|
102
102
|
}
|
|
103
103
|
}
|
|
@@ -276,7 +276,7 @@ export async function buildSupportBundle(harnessDir) {
|
|
|
276
276
|
for (const block of [pkg.dependencies, pkg.devDependencies, pkg.peerDependencies]) {
|
|
277
277
|
if (block && typeof block === 'object') {
|
|
278
278
|
for (const [name, version] of Object.entries(block)) {
|
|
279
|
-
if (name.startsWith('@ruflo/') || name === 'create-agent-harness' || name === '
|
|
279
|
+
if (name.startsWith('@ruflo/') || name === 'create-agent-harness' || name === 'metaharness') {
|
|
280
280
|
rufloDeps[name] = version;
|
|
281
281
|
}
|
|
282
282
|
}
|
package/dist/genome.js
CHANGED
|
@@ -126,7 +126,7 @@ export function formatGenomeReport(r) {
|
|
|
126
126
|
out.push(` test confidence: ${pct(r.genome.test_confidence)}`);
|
|
127
127
|
out.push('');
|
|
128
128
|
out.push(`Verdict: ${verdictLine(r.verdict)} (exit ${r.exitCode})`);
|
|
129
|
-
out.push(`Scaffold it: npx
|
|
129
|
+
out.push(`Scaffold it: npx metaharness ${r.plan.name} --template ${r.plan.template}`);
|
|
130
130
|
return out;
|
|
131
131
|
}
|
|
132
132
|
// --- sanitisation (ADR-031) ------------------------------------------------
|
package/dist/index.js
CHANGED
|
@@ -95,7 +95,7 @@ export function formatCatalog(entries) {
|
|
|
95
95
|
const counts = `${e.agentCount}a/${e.skillCount}s/${e.commandCount}c`;
|
|
96
96
|
lines.push(` ${e.id.padEnd(22)} ${counts.padEnd(10)} ${e.quickStart}`);
|
|
97
97
|
}
|
|
98
|
-
lines.push('', `Scaffold with:
|
|
98
|
+
lines.push('', `Scaffold with: metaharness <name> --template <id>`);
|
|
99
99
|
return lines;
|
|
100
100
|
}
|
|
101
101
|
export function parseArgs(argv) {
|
|
@@ -226,38 +226,38 @@ export function detectRufloProject(dir) {
|
|
|
226
226
|
/**
|
|
227
227
|
* iter 117 — subcommand router. Per the user's directive:
|
|
228
228
|
*
|
|
229
|
-
* Before generation: `
|
|
229
|
+
* Before generation: `metaharness`
|
|
230
230
|
* Inside generated harness: `harness`
|
|
231
231
|
*
|
|
232
232
|
* The factory side gains 4 explicit verbs (new / from-repo / analyze / genome)
|
|
233
233
|
* so the surface reads as a tool, not as "the thing that takes a name". The
|
|
234
|
-
* legacy bare-name form (`
|
|
235
|
-
* shortcut for `
|
|
234
|
+
* legacy bare-name form (`metaharness my-bot`) still works as a back-compat
|
|
235
|
+
* shortcut for `metaharness new my-bot`.
|
|
236
236
|
*/
|
|
237
|
-
async function
|
|
237
|
+
async function runMetaHarnessSubcommand(sub, rest) {
|
|
238
238
|
switch (sub) {
|
|
239
239
|
case 'new': {
|
|
240
|
-
// `
|
|
240
|
+
// `metaharness new <name> [--template <id>] [--host <id>]`
|
|
241
241
|
// Just an explicit alias for the bare-name form. Falls through to the
|
|
242
242
|
// legacy scaffold pipeline so semantics stay byte-identical.
|
|
243
243
|
return null; // signal "not handled — fall through to main()"
|
|
244
244
|
}
|
|
245
245
|
case 'from-repo': {
|
|
246
|
-
// `
|
|
246
|
+
// `metaharness from-repo <url> <name> [--template <id>] [--host <id>]`
|
|
247
247
|
// Clones a public GitHub repo to a tempdir, runs analyze-repo on it,
|
|
248
248
|
// and scaffolds the recommended harness as <name>. NO repository code
|
|
249
249
|
// is executed during analysis — same invariant as `analyze`.
|
|
250
250
|
const url = rest[0];
|
|
251
251
|
const name = rest[1];
|
|
252
252
|
if (!url || !name) {
|
|
253
|
-
console.error('Usage: npx
|
|
253
|
+
console.error('Usage: npx metaharness from-repo <repo-url> <harness-name> [--template <id>] [--host <id>]');
|
|
254
254
|
return 2;
|
|
255
255
|
}
|
|
256
256
|
const { spawnSync } = await import('node:child_process');
|
|
257
257
|
const { mkdtempSync } = await import('node:fs');
|
|
258
258
|
const { tmpdir } = await import('node:os');
|
|
259
259
|
const { join: pathJoin } = await import('node:path');
|
|
260
|
-
const tmp = mkdtempSync(pathJoin(tmpdir(), '
|
|
260
|
+
const tmp = mkdtempSync(pathJoin(tmpdir(), 'metaharness-fromrepo-'));
|
|
261
261
|
console.log(`Cloning ${url} → ${tmp} (depth=1, code never executed)`);
|
|
262
262
|
const clone = spawnSync('git', ['clone', '--depth=1', '--quiet', url, tmp], { stdio: 'inherit' });
|
|
263
263
|
if (clone.status !== 0) {
|
|
@@ -274,7 +274,7 @@ async function runOpenHarnessSubcommand(sub, rest) {
|
|
|
274
274
|
return r.code;
|
|
275
275
|
}
|
|
276
276
|
case 'analyze': {
|
|
277
|
-
// `
|
|
277
|
+
// `metaharness analyze <path> [--scaffold <name>] [--embed]`
|
|
278
278
|
// Alias for `harness analyze-repo`. Surface unification per the
|
|
279
279
|
// user's command-model directive.
|
|
280
280
|
const { analyzeRepoCmd } = await import('./analyze-repo.js');
|
|
@@ -284,7 +284,7 @@ async function runOpenHarnessSubcommand(sub, rest) {
|
|
|
284
284
|
return r.code;
|
|
285
285
|
}
|
|
286
286
|
case 'genome': {
|
|
287
|
-
// `
|
|
287
|
+
// `metaharness genome <path>` — flagship feature per the user.
|
|
288
288
|
// Same code path as `harness genome`.
|
|
289
289
|
const { genomeCmd } = await import('./genome.js');
|
|
290
290
|
const r = await genomeCmd(rest);
|
|
@@ -302,7 +302,7 @@ export async function main(argv) {
|
|
|
302
302
|
// the first arg isn't a recognised subcommand, letting us fall through.
|
|
303
303
|
const first = argv[0];
|
|
304
304
|
if (first && !first.startsWith('-')) {
|
|
305
|
-
const subResult = await
|
|
305
|
+
const subResult = await runMetaHarnessSubcommand(first, argv.slice(1));
|
|
306
306
|
if (subResult !== null)
|
|
307
307
|
return subResult;
|
|
308
308
|
// `new <name>` — strip the verb and fall through to the legacy scaffold.
|
|
@@ -322,7 +322,7 @@ export async function main(argv) {
|
|
|
322
322
|
// arg-driven scaffold is what CI should use).
|
|
323
323
|
if (!process.stdin.isTTY) {
|
|
324
324
|
console.error('--wizard requires an interactive TTY. Use the arg-driven form in CI:');
|
|
325
|
-
console.error(' npx
|
|
325
|
+
console.error(' npx metaharness <name> --template <id> --host <id>');
|
|
326
326
|
return 2;
|
|
327
327
|
}
|
|
328
328
|
const { runWizard, makeReadlineAsker, answersToInvocation } = await import('./wizard.js');
|
|
@@ -363,10 +363,10 @@ export async function main(argv) {
|
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
if (!args.name) {
|
|
366
|
-
console.log('Usage: npx
|
|
367
|
-
console.log(' npx
|
|
368
|
-
console.log(' npx
|
|
369
|
-
console.log(' npx
|
|
366
|
+
console.log('Usage: npx metaharness <name> [--template <id>] [--host claude-code|codex|pi-dev|hermes] [--description "..."] [--force]');
|
|
367
|
+
console.log(' npx metaharness --from-existing [./path]');
|
|
368
|
+
console.log(' npx metaharness --wizard (iter 100 — interactive picker)');
|
|
369
|
+
console.log(' npx metaharness --list (browse all templates)');
|
|
370
370
|
console.log('');
|
|
371
371
|
console.log(`Templates: ${TEMPLATES.join(', ')}`);
|
|
372
372
|
console.log(`Hosts: ${HOSTS.join(', ')}`);
|
package/dist/registry.js
CHANGED
|
@@ -23,7 +23,7 @@ export function buildRegistryEntry(input) {
|
|
|
23
23
|
// Default tags pulled from template + hosts + a few defaults.
|
|
24
24
|
const tags = input.tags ?? Array.from(new Set([
|
|
25
25
|
'agent-harness',
|
|
26
|
-
'
|
|
26
|
+
'metaharness',
|
|
27
27
|
templateCategory,
|
|
28
28
|
...hosts.map(h => `host:${h}`),
|
|
29
29
|
'mcp',
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "metaharness",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "MetaHarness — mint a custom AI agent harness from any repo. Browser Studio + `npx metaharness` CLI. Runs on Claude Code, Codex, pi.dev, Hermes, OpenClaw, RVM.",
|
|
5
5
|
"homepage": "https://github.com/ruvnet/agent-harness-generator",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"bin": {
|
|
23
|
-
"
|
|
23
|
+
"metaharness": "./dist/bin.js",
|
|
24
24
|
"harness": "./dist/harness-bin.js"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"gen:templates": "node scripts/gen-templates.mjs"
|
|
37
37
|
},
|
|
38
38
|
"keywords": [
|
|
39
|
-
"
|
|
39
|
+
"metaharness",
|
|
40
40
|
"agent-harness",
|
|
41
41
|
"agent-harness-generator",
|
|
42
42
|
"ai-agent",
|