@michaelfromyeg/loom-cli 0.1.0 → 0.3.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/dist/index.js +173 -71
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createPrivateKey, createPublicKey } from 'crypto';
|
|
3
3
|
import { mkdirSync, writeFileSync, existsSync, readFileSync } from 'fs';
|
|
4
4
|
import { join, resolve as resolve$1, basename, relative } from 'path';
|
|
5
|
-
import { lint, hasMarketplaceManifest, buildMarketplace, build, install, readLock, update, generateSigningKeys, signLock, verifyArtifacts, importNativePlugin, uninstall, LOOM_VERSION, CompileError, AdapterRegistry } from '@michaelfromyeg/loom-core';
|
|
5
|
+
import { lint, resolveSourceDir, hasMarketplaceManifest, buildMarketplace, build, installMarketplace, install, readLock, lockDirForScope, update, generateSigningKeys, signLock, verifyArtifacts, importNativePlugin, uninstall, LOOM_VERSION, CompileError, AdapterRegistry } from '@michaelfromyeg/loom-core';
|
|
6
6
|
import { discoverEvals, runEval, drivers } from '@michaelfromyeg/loom-eval';
|
|
7
7
|
import { publishCheck, indexFromPluginDirs, fetchMcpRegistry, federate, serializeIndex } from '@michaelfromyeg/loom-index';
|
|
8
8
|
import { defineCommand, runMain, renderUsage } from 'citty';
|
|
@@ -39,6 +39,34 @@ async function renderCliReference(main2) {
|
|
|
39
39
|
return `${out.join("\n")}
|
|
40
40
|
`;
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
// src/logger.ts
|
|
44
|
+
var RANK = { error: 0, warn: 1, info: 2, debug: 3 };
|
|
45
|
+
function thresholdFrom(argv) {
|
|
46
|
+
if (argv.includes("--json")) return RANK.error;
|
|
47
|
+
if (argv.includes("--quiet") || argv.includes("-q")) return RANK.error;
|
|
48
|
+
if (argv.includes("--verbose") || argv.includes("-v")) return RANK.debug;
|
|
49
|
+
return RANK.info;
|
|
50
|
+
}
|
|
51
|
+
var isJson = process.argv.includes("--json");
|
|
52
|
+
var threshold = thresholdFrom(process.argv);
|
|
53
|
+
function emit(level, message) {
|
|
54
|
+
if (RANK[level] > threshold) return;
|
|
55
|
+
if (level === "error" || level === "warn") console.error(message);
|
|
56
|
+
else console.log(message);
|
|
57
|
+
}
|
|
58
|
+
var log = {
|
|
59
|
+
/** True when --json is set; commands emit a result object via `data` instead of prose. */
|
|
60
|
+
json: isJson,
|
|
61
|
+
error: (message) => emit("error", message),
|
|
62
|
+
warn: (message) => emit("warn", message),
|
|
63
|
+
info: (message) => emit("info", message),
|
|
64
|
+
debug: (message) => emit("debug", message),
|
|
65
|
+
/** Emit a structured result. Prints JSON only in --json mode; a no-op otherwise. */
|
|
66
|
+
data: (obj) => {
|
|
67
|
+
if (isJson) console.log(JSON.stringify(obj));
|
|
68
|
+
}
|
|
69
|
+
};
|
|
42
70
|
function buildRegistry() {
|
|
43
71
|
return new AdapterRegistry().register(claudeAdapter).register(codexAdapter).register(cursorAdapter).register(copilotAdapter).register(opencodeAdapter);
|
|
44
72
|
}
|
|
@@ -63,42 +91,43 @@ function formatDiagnostic(d) {
|
|
|
63
91
|
function printDiagnostics(items) {
|
|
64
92
|
for (const d of items) {
|
|
65
93
|
const line = formatDiagnostic(d);
|
|
66
|
-
if (d.severity === "error")
|
|
67
|
-
else
|
|
94
|
+
if (d.severity === "error") log.error(line);
|
|
95
|
+
else log.warn(line);
|
|
68
96
|
}
|
|
69
97
|
}
|
|
70
98
|
function printTrustSummary(result) {
|
|
71
99
|
const { plugin } = result.fb;
|
|
72
100
|
const components = result.components;
|
|
73
|
-
|
|
101
|
+
log.info(`
|
|
74
102
|
Trust summary for ${result.id}@${plugin.version}`);
|
|
75
|
-
|
|
103
|
+
log.info(` publisher: ${plugin.owner.name} <${plugin.owner.namespace}> (unverified)`);
|
|
76
104
|
const counts = /* @__PURE__ */ new Map();
|
|
77
105
|
for (const c of components) counts.set(c.kind, (counts.get(c.kind) ?? 0) + 1);
|
|
78
106
|
const summary = [...counts.entries()].map(([k, n]) => `${n} ${k}`).join(", ");
|
|
79
|
-
|
|
107
|
+
log.info(` components: ${summary || "none"}`);
|
|
80
108
|
const executables = result.targets.flatMap(
|
|
81
109
|
(t) => t.artifacts.filter((p) => p.artifact.executable).map((p) => `${t.target}:${p.artifact.relPath}`)
|
|
82
110
|
);
|
|
83
|
-
|
|
111
|
+
log.info(
|
|
84
112
|
executables.length > 0 ? ` executables (placed DISABLED): ${executables.join(", ")}` : " executables: none"
|
|
85
113
|
);
|
|
86
|
-
|
|
87
|
-
|
|
114
|
+
log.info(` mcp servers that will run: ${counts.get("mcp") ?? 0}`);
|
|
115
|
+
log.info(" badges: valid (computed) | signed/verified/scanned: not yet\n");
|
|
88
116
|
}
|
|
89
117
|
function printEvalReport(report) {
|
|
90
|
-
|
|
118
|
+
log.data(report);
|
|
119
|
+
log.info(`
|
|
91
120
|
Eval: ${report.component}`);
|
|
92
121
|
for (const h of report.harnesses) {
|
|
93
122
|
if (h.status === "untested") {
|
|
94
|
-
|
|
123
|
+
log.info(` ${h.harness}: UNTESTED (${h.reason})`);
|
|
95
124
|
continue;
|
|
96
125
|
}
|
|
97
|
-
|
|
126
|
+
log.info(` ${h.harness}: ${h.pass ? "PASS" : "FAIL"}`);
|
|
98
127
|
for (const c of h.cases) {
|
|
99
|
-
|
|
128
|
+
log.info(` - ${c.name}: ${c.pass ? "pass" : "fail"}`);
|
|
100
129
|
for (const a of c.assertions) {
|
|
101
|
-
|
|
130
|
+
log.info(` ${a.kind}: ${a.status} (${a.detail})`);
|
|
102
131
|
}
|
|
103
132
|
}
|
|
104
133
|
}
|
|
@@ -160,11 +189,11 @@ function countByTarget(written) {
|
|
|
160
189
|
}
|
|
161
190
|
function fail(err) {
|
|
162
191
|
if (err instanceof CompileError) {
|
|
163
|
-
|
|
192
|
+
log.error(`
|
|
164
193
|
${err.message}:`);
|
|
165
194
|
printDiagnostics(err.diagnostics);
|
|
166
195
|
} else {
|
|
167
|
-
|
|
196
|
+
log.error(`
|
|
168
197
|
${err.message}`);
|
|
169
198
|
}
|
|
170
199
|
process.exit(1);
|
|
@@ -182,9 +211,9 @@ var initCmd = defineCommand({
|
|
|
182
211
|
name: args.name,
|
|
183
212
|
namespace: args.namespace
|
|
184
213
|
});
|
|
185
|
-
|
|
186
|
-
for (const f of created.files)
|
|
187
|
-
|
|
214
|
+
log.info(`Scaffolded plugin "${created.name}" in ${created.dir}`);
|
|
215
|
+
for (const f of created.files) log.info(` + ${f}`);
|
|
216
|
+
log.info(`
|
|
188
217
|
Next: loom validate ${args.dir} && loom build ${args.dir}`);
|
|
189
218
|
}
|
|
190
219
|
});
|
|
@@ -199,11 +228,12 @@ var validateCmd = defineCommand({
|
|
|
199
228
|
const { items, hasErrors } = result.diagnostics;
|
|
200
229
|
if (items.length > 0) printDiagnostics(items);
|
|
201
230
|
if (hasErrors) {
|
|
202
|
-
|
|
231
|
+
log.error(`
|
|
203
232
|
${result.id}: invalid`);
|
|
204
233
|
process.exit(1);
|
|
205
234
|
}
|
|
206
|
-
|
|
235
|
+
log.data({ id: result.id, valid: true, components: result.plugin.components.length });
|
|
236
|
+
log.info(`${result.id}: valid (${result.plugin.components.length} components)`);
|
|
207
237
|
} catch (err) {
|
|
208
238
|
fail(err);
|
|
209
239
|
}
|
|
@@ -219,7 +249,7 @@ var buildCmd = defineCommand({
|
|
|
219
249
|
type: "positional",
|
|
220
250
|
required: false,
|
|
221
251
|
default: ".",
|
|
222
|
-
description: "
|
|
252
|
+
description: "Local dir, or a remote ref (github:/npm:/owner/repo, optional //subdir)"
|
|
223
253
|
},
|
|
224
254
|
out: { type: "string", default: ".loom-out", description: "Output directory" },
|
|
225
255
|
target: { type: "string", description: "Comma-separated targets (default: all registered)" }
|
|
@@ -228,29 +258,37 @@ var buildCmd = defineCommand({
|
|
|
228
258
|
try {
|
|
229
259
|
const registry = buildRegistry();
|
|
230
260
|
const targets = parseTargets(args.target);
|
|
231
|
-
|
|
261
|
+
const { dir } = await resolveSourceDir(args.dir, process.cwd());
|
|
262
|
+
if (hasMarketplaceManifest(dir)) {
|
|
232
263
|
const { marketplace, plugins, written: written2 } = await buildMarketplace({
|
|
233
|
-
marketplaceDir:
|
|
264
|
+
marketplaceDir: dir,
|
|
234
265
|
outDir: args.out,
|
|
235
266
|
registry,
|
|
236
267
|
targets
|
|
237
268
|
});
|
|
238
|
-
|
|
269
|
+
log.data({
|
|
270
|
+
marketplace: marketplace.name,
|
|
271
|
+
plugins: plugins.length,
|
|
272
|
+
out: args.out,
|
|
273
|
+
files: Object.fromEntries(countByTarget(written2))
|
|
274
|
+
});
|
|
275
|
+
log.info(
|
|
239
276
|
`Built marketplace ${marketplace.name} (${plugins.length} plugins) -> ${args.out}/`
|
|
240
277
|
);
|
|
241
|
-
for (const [t, n] of countByTarget(written2))
|
|
278
|
+
for (const [t, n] of countByTarget(written2)) log.info(` ${t}: ${n} files`);
|
|
242
279
|
return;
|
|
243
280
|
}
|
|
244
281
|
const { result, written } = await build({
|
|
245
|
-
pluginDir:
|
|
282
|
+
pluginDir: dir,
|
|
246
283
|
outDir: args.out,
|
|
247
284
|
registry,
|
|
248
285
|
targets
|
|
249
286
|
});
|
|
250
287
|
if (result.diagnostics.items.length > 0) printDiagnostics(result.diagnostics.items);
|
|
251
|
-
|
|
288
|
+
log.data({ id: result.id, out: args.out, files: Object.fromEntries(countByTarget(written)) });
|
|
289
|
+
log.info(`Built ${result.id} -> ${args.out}/`);
|
|
252
290
|
for (const [t, n] of countByTarget(written)) {
|
|
253
|
-
|
|
291
|
+
log.info(` ${t}: ${n} files (catalog at ${args.out}/${t})`);
|
|
254
292
|
}
|
|
255
293
|
} catch (err) {
|
|
256
294
|
fail(err);
|
|
@@ -260,10 +298,15 @@ var buildCmd = defineCommand({
|
|
|
260
298
|
var installCmd = defineCommand({
|
|
261
299
|
meta: {
|
|
262
300
|
name: "install",
|
|
263
|
-
description: "Compile + place a plugin
|
|
301
|
+
description: "Compile + place a plugin (or a whole marketplace) into harness scopes"
|
|
264
302
|
},
|
|
265
303
|
args: {
|
|
266
|
-
dir: {
|
|
304
|
+
dir: {
|
|
305
|
+
type: "positional",
|
|
306
|
+
required: false,
|
|
307
|
+
default: ".",
|
|
308
|
+
description: "Local dir, or a remote ref (github:/npm:/owner/repo, optional //subdir)"
|
|
309
|
+
},
|
|
267
310
|
scope: { type: "string", default: "project", description: "user | project" },
|
|
268
311
|
target: { type: "string", description: "Comma-separated targets (default: all registered)" },
|
|
269
312
|
only: {
|
|
@@ -289,15 +332,42 @@ var installCmd = defineCommand({
|
|
|
289
332
|
let targets = requested;
|
|
290
333
|
if (!args.all) {
|
|
291
334
|
const { present, missing } = await detectPresent(requested);
|
|
292
|
-
for (const t of missing)
|
|
335
|
+
for (const t of missing) log.info(` skipped ${t}: harness not detected`);
|
|
293
336
|
if (present.length === 0) {
|
|
294
|
-
|
|
337
|
+
log.error("No requested harness is installed. Use --all to place anyway.");
|
|
295
338
|
process.exit(1);
|
|
296
339
|
}
|
|
297
340
|
targets = present;
|
|
298
341
|
}
|
|
342
|
+
const { dir } = await resolveSourceDir(args.dir, process.cwd());
|
|
343
|
+
if (hasMarketplaceManifest(dir)) {
|
|
344
|
+
const mp = await installMarketplace({
|
|
345
|
+
marketplaceDir: dir,
|
|
346
|
+
scope,
|
|
347
|
+
cwd: args.cwd ?? process.cwd(),
|
|
348
|
+
registry,
|
|
349
|
+
targets,
|
|
350
|
+
...allow ? { managed: { allowNamespaces: allow } } : {}
|
|
351
|
+
});
|
|
352
|
+
log.data({
|
|
353
|
+
marketplace: mp.marketplace.name,
|
|
354
|
+
plugins: mp.installs.map((i) => i.result.id),
|
|
355
|
+
scope,
|
|
356
|
+
lockfile: mp.lockPath
|
|
357
|
+
});
|
|
358
|
+
log.info(
|
|
359
|
+
`Installed marketplace ${mp.marketplace.name} (${mp.installs.length} plugins, ${scope})`
|
|
360
|
+
);
|
|
361
|
+
for (const i of mp.installs) {
|
|
362
|
+
log.info(
|
|
363
|
+
` ${i.result.id}@${i.result.fb.plugin.version}: ${i.entry.artifacts.length} artifacts`
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
log.info(` lockfile: ${mp.lockPath}`);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
299
369
|
const result = await install({
|
|
300
|
-
pluginDir:
|
|
370
|
+
pluginDir: dir,
|
|
301
371
|
scope,
|
|
302
372
|
cwd: args.cwd ?? process.cwd(),
|
|
303
373
|
registry,
|
|
@@ -306,17 +376,22 @@ var installCmd = defineCommand({
|
|
|
306
376
|
...allow ? { managed: { allowNamespaces: allow } } : {}
|
|
307
377
|
});
|
|
308
378
|
printTrustSummary(result.result);
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
379
|
+
log.data({
|
|
380
|
+
id: result.result.id,
|
|
381
|
+
version: result.result.fb.plugin.version,
|
|
382
|
+
scope,
|
|
383
|
+
artifacts: result.entry.artifacts.length,
|
|
384
|
+
lockfile: result.lockPath
|
|
385
|
+
});
|
|
386
|
+
log.info(`Installed ${result.result.id}@${result.result.fb.plugin.version} (${scope})`);
|
|
387
|
+
log.info(` ${result.entry.artifacts.length} artifacts placed`);
|
|
313
388
|
if (result.secrets.resolved.length > 0) {
|
|
314
389
|
const missing = result.secrets.resolved.filter((r) => r.source === "missing");
|
|
315
|
-
|
|
390
|
+
log.info(
|
|
316
391
|
` config: ${result.secrets.resolved.length} declared` + (result.secrets.path ? ` -> ${result.secrets.path} (gitignored)` : "") + (missing.length > 0 ? `; missing: ${missing.map((m) => m.env).join(", ")}` : "")
|
|
317
392
|
);
|
|
318
393
|
}
|
|
319
|
-
|
|
394
|
+
log.info(` lockfile: ${result.lockPath}`);
|
|
320
395
|
} catch (err) {
|
|
321
396
|
fail(err);
|
|
322
397
|
}
|
|
@@ -336,19 +411,19 @@ var updateCmd = defineCommand({
|
|
|
336
411
|
async run({ args }) {
|
|
337
412
|
try {
|
|
338
413
|
const scope = args.scope === "user" ? "user" : "project";
|
|
339
|
-
const
|
|
414
|
+
const cwd = args.cwd ?? process.cwd();
|
|
415
|
+
const lock = readLock(lockDirForScope(scope, cwd));
|
|
340
416
|
const lockedTargets = lock ? [...new Set(lock.artifacts.map((a) => a.target))] : void 0;
|
|
341
417
|
const result = await update({
|
|
342
418
|
pluginDir: args.dir,
|
|
343
419
|
scope,
|
|
344
|
-
cwd
|
|
420
|
+
cwd,
|
|
345
421
|
registry: buildRegistry(),
|
|
346
422
|
targets: parseTargets(args.target) ?? lockedTargets
|
|
347
423
|
});
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
);
|
|
351
|
-
for (const p of result.changed) console.log(` ~ ${p}`);
|
|
424
|
+
log.data({ id: result.id, changed: result.changed });
|
|
425
|
+
log.info(`Updated ${result.id}: ${result.changed.length} artifact(s) changed`);
|
|
426
|
+
for (const p of result.changed) log.info(` ~ ${p}`);
|
|
352
427
|
} catch (err) {
|
|
353
428
|
fail(err);
|
|
354
429
|
}
|
|
@@ -372,7 +447,7 @@ var evalCmd = defineCommand({
|
|
|
372
447
|
(d) => !args.component || d.componentLeaf === args.component
|
|
373
448
|
);
|
|
374
449
|
if (discovered.length === 0) {
|
|
375
|
-
|
|
450
|
+
log.info("No evals found (a component adds them with an `evals:` file).");
|
|
376
451
|
return;
|
|
377
452
|
}
|
|
378
453
|
const onlyHarness = parseTargets(args.harness);
|
|
@@ -417,18 +492,27 @@ var publishCmd = defineCommand({
|
|
|
417
492
|
drivers: allDrivers(),
|
|
418
493
|
snapshot: Boolean(args.snapshot)
|
|
419
494
|
});
|
|
420
|
-
|
|
495
|
+
log.data({
|
|
496
|
+
id: res.id,
|
|
497
|
+
version: res.version,
|
|
498
|
+
ok: res.ok,
|
|
499
|
+
valid: res.validPassed,
|
|
500
|
+
scanClean: res.scan.clean,
|
|
501
|
+
badges: res.badges,
|
|
502
|
+
harnessCoverage: res.harnessCoverage
|
|
503
|
+
});
|
|
504
|
+
log.info(`Publish check: ${res.id}@${res.version}`);
|
|
421
505
|
if (res.diagnostics.length > 0) printDiagnostics(res.diagnostics);
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
506
|
+
log.info(` valid: ${res.validPassed ? "yes" : "NO"}`);
|
|
507
|
+
log.info(` scan: ${res.scan.clean ? "clean" : `${res.scan.findings.length} finding(s)`}`);
|
|
508
|
+
log.info(` badges: ${res.badges.join(", ") || "none"}`);
|
|
509
|
+
log.info(` harness coverage: ${res.harnessCoverage.join(", ") || "none"}`);
|
|
426
510
|
for (const r of res.evalReports) printEvalReport(r);
|
|
427
511
|
if (!res.ok) {
|
|
428
|
-
|
|
512
|
+
log.error("\nPublish BLOCKED: the deterministic tier failed.");
|
|
429
513
|
process.exit(1);
|
|
430
514
|
}
|
|
431
|
-
|
|
515
|
+
log.info("\nPublish gate passed.");
|
|
432
516
|
} catch (err) {
|
|
433
517
|
fail(err);
|
|
434
518
|
}
|
|
@@ -451,7 +535,7 @@ var signCmd = defineCommand({
|
|
|
451
535
|
try {
|
|
452
536
|
const lock = readLock(args.dir);
|
|
453
537
|
if (!lock) {
|
|
454
|
-
|
|
538
|
+
log.error("no loom.lock found (run `loom install` first)");
|
|
455
539
|
process.exit(1);
|
|
456
540
|
}
|
|
457
541
|
const loomDir = join(args.dir, ".loom");
|
|
@@ -472,7 +556,7 @@ var signCmd = defineCommand({
|
|
|
472
556
|
}
|
|
473
557
|
writeFileSync(join(args.dir, "loom.sig"), `${signLock(lock, privateKey)}
|
|
474
558
|
`);
|
|
475
|
-
|
|
559
|
+
log.info(
|
|
476
560
|
`Signed ${lock.artifacts.length} artifacts -> loom.sig (key kept in .loom/, public key in loom.pub)`
|
|
477
561
|
);
|
|
478
562
|
} catch (err) {
|
|
@@ -497,17 +581,18 @@ var verifyCmd = defineCommand({
|
|
|
497
581
|
try {
|
|
498
582
|
const lock = readLock(args.dir);
|
|
499
583
|
if (!lock) {
|
|
500
|
-
|
|
584
|
+
log.error("no loom.lock found");
|
|
501
585
|
process.exit(1);
|
|
502
586
|
}
|
|
503
587
|
const sig = readFileSync(join(args.dir, "loom.sig"), "utf8").trim();
|
|
504
588
|
const publicKey = createPublicKey(readFileSync(join(args.dir, "loom.pub")));
|
|
505
589
|
const res = verifyArtifacts(lock, publicKey, sig);
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
590
|
+
log.data({ signatureValid: res.signatureValid, tampered: res.tampered });
|
|
591
|
+
log.info(`signature: ${res.signatureValid ? "valid" : "INVALID"}`);
|
|
592
|
+
log.info(`tampered artifacts: ${res.tampered.length}`);
|
|
593
|
+
for (const p of res.tampered) log.info(` ! ${p}`);
|
|
509
594
|
if (!res.signatureValid || res.tampered.length > 0) process.exit(1);
|
|
510
|
-
|
|
595
|
+
log.info("signed badge verified.");
|
|
511
596
|
} catch (err) {
|
|
512
597
|
fail(err);
|
|
513
598
|
}
|
|
@@ -534,7 +619,12 @@ var indexCmd = defineCommand({
|
|
|
534
619
|
}
|
|
535
620
|
writeFileSync(args.out, serializeIndex(index));
|
|
536
621
|
const fed = args.federate ? `, federated ${index.federated?.length ?? 0} source(s)` : "";
|
|
537
|
-
|
|
622
|
+
log.data({
|
|
623
|
+
plugins: index.plugins.length,
|
|
624
|
+
federated: index.federated?.length ?? 0,
|
|
625
|
+
out: args.out
|
|
626
|
+
});
|
|
627
|
+
log.info(`Wrote index (${index.plugins.length} plugins${fed}) -> ${args.out}`);
|
|
538
628
|
} catch (err) {
|
|
539
629
|
fail(err);
|
|
540
630
|
}
|
|
@@ -563,7 +653,7 @@ var importCmd = defineCommand({
|
|
|
563
653
|
try {
|
|
564
654
|
const adapter = buildRegistry().get(args.from);
|
|
565
655
|
if (!adapter) {
|
|
566
|
-
|
|
656
|
+
log.error(`unknown source harness "${args.from}"`);
|
|
567
657
|
process.exit(1);
|
|
568
658
|
}
|
|
569
659
|
const res = importNativePlugin({
|
|
@@ -572,9 +662,16 @@ var importCmd = defineCommand({
|
|
|
572
662
|
outDir: args.out,
|
|
573
663
|
...args.namespace ? { namespace: args.namespace } : {}
|
|
574
664
|
});
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
665
|
+
log.data({
|
|
666
|
+
kind: res.kind,
|
|
667
|
+
name: res.name,
|
|
668
|
+
manifest: res.manifestPath,
|
|
669
|
+
out: res.outDir,
|
|
670
|
+
...res.kind === "plugin" ? { files: res.fileCount } : {}
|
|
671
|
+
});
|
|
672
|
+
log.info(`Imported ${res.kind} "${res.name}" -> ${res.manifestPath}`);
|
|
673
|
+
if (res.kind === "plugin") log.info(` ${res.fileCount} component file(s)`);
|
|
674
|
+
log.info(` next: loom build ${res.outDir}`);
|
|
578
675
|
} catch (err) {
|
|
579
676
|
fail(err);
|
|
580
677
|
}
|
|
@@ -583,20 +680,25 @@ var importCmd = defineCommand({
|
|
|
583
680
|
var uninstallCmd = defineCommand({
|
|
584
681
|
meta: {
|
|
585
682
|
name: "uninstall",
|
|
586
|
-
description: "Remove
|
|
683
|
+
description: "Remove what install placed into this project (read from its loom.lock)"
|
|
587
684
|
},
|
|
588
685
|
args: {
|
|
589
686
|
dir: {
|
|
590
687
|
type: "positional",
|
|
591
688
|
required: false,
|
|
592
689
|
default: ".",
|
|
593
|
-
description: "
|
|
690
|
+
description: "Install target dir holding loom.lock (the project you installed into)"
|
|
691
|
+
},
|
|
692
|
+
plugin: {
|
|
693
|
+
type: "string",
|
|
694
|
+
description: "Remove only this plugin (id or bare name); default removes all"
|
|
594
695
|
}
|
|
595
696
|
},
|
|
596
697
|
run({ args }) {
|
|
597
698
|
try {
|
|
598
|
-
const res = uninstall({
|
|
599
|
-
|
|
699
|
+
const res = uninstall({ dir: args.dir, ...args.plugin ? { plugin: args.plugin } : {} });
|
|
700
|
+
log.data({ removed: res.removed, plugins: res.plugins });
|
|
701
|
+
log.info(`Uninstalled ${res.plugins.length} plugin(s), ${res.removed.length} artifact(s)`);
|
|
600
702
|
} catch (err) {
|
|
601
703
|
fail(err);
|
|
602
704
|
}
|
|
@@ -617,7 +719,7 @@ var docsCmd = defineCommand({
|
|
|
617
719
|
const md = await renderCliReference(main);
|
|
618
720
|
if (args.out) {
|
|
619
721
|
writeFileSync(args.out, md);
|
|
620
|
-
|
|
722
|
+
log.info(`Wrote CLI reference to ${args.out}`);
|
|
621
723
|
} else {
|
|
622
724
|
process.stdout.write(md);
|
|
623
725
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-docs.ts","../src/registry.ts","../src/report.ts","../src/scaffold.ts","../src/index.ts"],"names":["main","resolve","drivers","written","join","mkdirSync","writeFileSync","existsSync"],"mappings":"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","file":"index.js","sourcesContent":["import { type CommandDef, renderUsage } from \"citty\";\n\ntype Resolvable<T> = T | (() => T | Promise<T>);\n\nasync function resolve<T>(r: Resolvable<T>): Promise<T> {\n return typeof r === \"function\" ? await (r as () => T | Promise<T>)() : r;\n}\n\n/**\n * Render a full Markdown CLI reference straight from the citty command tree, so\n * the docs can never drift from the actual commands -- the same single-source\n * principle Loom applies to manifests, applied to its own CLI.\n */\nexport async function renderCliReference(main: CommandDef): Promise<string> {\n const out: string[] = [\n \"# Loom CLI reference\",\n \"\",\n \"_Generated from the CLI definition by `loom docs` -- do not edit by hand._\",\n \"\",\n \"## `loom`\",\n \"\",\n \"```\",\n (await renderUsage(main)).trim(),\n \"```\",\n \"\",\n ];\n\n const subs = main.subCommands ? await resolve(main.subCommands) : {};\n for (const name of Object.keys(subs).sort()) {\n const sub = await resolve(subs[name] as Resolvable<CommandDef>);\n const meta = await resolve(sub.meta);\n out.push(`## \\`loom ${name}\\``, \"\");\n if (meta?.description) out.push(meta.description as string, \"\");\n out.push(\"```\", (await renderUsage(sub, main)).trim(), \"```\", \"\");\n }\n\n return `${out.join(\"\\n\")}\\n`;\n}\n","import claudeAdapter from \"@michaelfromyeg/loom-adapter-claude\";\nimport codexAdapter from \"@michaelfromyeg/loom-adapter-codex\";\nimport copilotAdapter from \"@michaelfromyeg/loom-adapter-copilot\";\nimport cursorAdapter from \"@michaelfromyeg/loom-adapter-cursor\";\nimport type { HarnessDriver } from \"@michaelfromyeg/loom-adapter-kit\";\nimport opencodeAdapter from \"@michaelfromyeg/loom-adapter-opencode\";\nimport { AdapterRegistry } from \"@michaelfromyeg/loom-core\";\nimport { drivers } from \"@michaelfromyeg/loom-eval\";\nimport type { Target } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * Wire every concrete adapter into a registry. The CLI sits at the top of the\n * dependency graph, so it -- not core -- knows the full adapter set. Community\n * adapters are added the same way.\n */\nexport function buildRegistry(): AdapterRegistry {\n return new AdapterRegistry()\n .register(claudeAdapter)\n .register(codexAdapter)\n .register(cursorAdapter)\n .register(copilotAdapter)\n .register(opencodeAdapter);\n}\n\n/** The headless eval drivers, keyed by Target (from @michaelfromyeg/loom-eval). */\nexport function allDrivers(): Record<Target, HarnessDriver> {\n return drivers;\n}\n\n/** Parse a comma-separated CLI value into a trimmed list, or undefined when empty. */\nexport function parseList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/** Parse a comma-separated --target value into a typed list, or undefined for all. */\nexport function parseTargets(value: string | undefined): Target[] | undefined {\n return parseList(value) as Target[] | undefined;\n}\n","import type { CompileResult, Diagnostic } from \"@michaelfromyeg/loom-core\";\nimport type { EvalReport } from \"@michaelfromyeg/loom-eval\";\n\nexport function formatDiagnostic(d: Diagnostic): string {\n const tag = d.severity === \"error\" ? \"error\" : d.severity === \"warning\" ? \"warn\" : \"info\";\n const where = d.where ? `${d.where}: ` : \"\";\n return ` ${tag.padEnd(5)} ${where}${d.message}`;\n}\n\nexport function printDiagnostics(items: Diagnostic[]): void {\n for (const d of items) {\n const line = formatDiagnostic(d);\n if (d.severity === \"error\") console.error(line);\n else console.warn(line);\n }\n}\n\n/**\n * The trust summary required before first install (spec §11): what runs and on\n * whose authority. Lists components by kind, every executable artifact, every MCP\n * server, and the publisher-verification state.\n */\nexport function printTrustSummary(result: CompileResult): void {\n const { plugin } = result.fb;\n // Count from the components actually installed (accurate for piecemeal installs).\n const components = result.components;\n console.log(`\\nTrust summary for ${result.id}@${plugin.version}`);\n console.log(` publisher: ${plugin.owner.name} <${plugin.owner.namespace}> (unverified)`);\n\n const counts = new Map<string, number>();\n for (const c of components) counts.set(c.kind, (counts.get(c.kind) ?? 0) + 1);\n const summary = [...counts.entries()].map(([k, n]) => `${n} ${k}`).join(\", \");\n console.log(` components: ${summary || \"none\"}`);\n\n const executables = result.targets.flatMap((t) =>\n t.artifacts\n .filter((p) => p.artifact.executable)\n .map((p) => `${t.target}:${p.artifact.relPath}`),\n );\n console.log(\n executables.length > 0\n ? ` executables (placed DISABLED): ${executables.join(\", \")}`\n : \" executables: none\",\n );\n\n console.log(` mcp servers that will run: ${counts.get(\"mcp\") ?? 0}`);\n console.log(\" badges: valid (computed) | signed/verified/scanned: not yet\\n\");\n}\n\n/** Render an eval report: per-harness PASS/FAIL/UNTESTED with per-assertion status. */\nexport function printEvalReport(report: EvalReport): void {\n console.log(`\\nEval: ${report.component}`);\n for (const h of report.harnesses) {\n if (h.status === \"untested\") {\n console.log(` ${h.harness}: UNTESTED (${h.reason})`);\n continue;\n }\n console.log(` ${h.harness}: ${h.pass ? \"PASS\" : \"FAIL\"}`);\n for (const c of h.cases) {\n console.log(` - ${c.name}: ${c.pass ? \"pass\" : \"fail\"}`);\n for (const a of c.assertions) {\n console.log(` ${a.kind}: ${a.status} (${a.detail})`);\n }\n }\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join, relative, resolve } from \"node:path\";\n\nexport interface ScaffoldOptions {\n dir: string;\n name?: string;\n namespace?: string;\n}\n\nexport interface ScaffoldResult {\n dir: string;\n name: string;\n files: string[];\n}\n\nfunction kebab(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"my-plugin\"\n );\n}\n\n/** Create a minimal, valid plugin: loom.yaml + one sample skill. Never clobbers. */\nexport function scaffoldPlugin(opts: ScaffoldOptions): ScaffoldResult {\n const dir = resolve(opts.dir);\n mkdirSync(dir, { recursive: true });\n\n const manifestPath = join(dir, \"loom.yaml\");\n if (existsSync(manifestPath)) {\n throw new Error(`a plugin already exists at ${manifestPath}`);\n }\n\n const name = kebab(opts.name ?? basename(dir));\n const namespace = opts.namespace ?? \"com.example\";\n const files: string[] = [];\n\n const loomYaml = `name: ${name}\nversion: 0.1.0\nowner:\n name: Your Name\n namespace: ${namespace}\ndescription: A Loom plugin.\ncomponents:\n - skill: skills/hello\n`;\n writeFileSync(manifestPath, loomYaml);\n files.push(relative(dir, manifestPath));\n\n const skillDir = join(dir, \"skills\", \"hello\");\n mkdirSync(skillDir, { recursive: true });\n const skillMd = `---\nname: hello\ndescription: Greet the user and explain what this skill does.\n---\n\nWhen invoked, greet the user warmly and summarize the task at hand.\n`;\n const skillPath = join(skillDir, \"SKILL.md\");\n writeFileSync(skillPath, skillMd);\n files.push(relative(dir, skillPath));\n\n return { dir, name, files };\n}\n","import { createPrivateKey, createPublicKey } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n build,\n buildMarketplace,\n CompileError,\n generateSigningKeys,\n hasMarketplaceManifest,\n importNativePlugin,\n install,\n LOOM_VERSION,\n lint,\n readLock,\n signLock,\n uninstall,\n update,\n verifyArtifacts,\n} from \"@michaelfromyeg/loom-core\";\nimport { discoverEvals, runEval } from \"@michaelfromyeg/loom-eval\";\nimport {\n federate,\n fetchMcpRegistry,\n indexFromPluginDirs,\n publishCheck,\n serializeIndex,\n} from \"@michaelfromyeg/loom-index\";\nimport type { Scope, Target } from \"@michaelfromyeg/loom-schema\";\nimport { defineCommand, runMain } from \"citty\";\nimport { renderCliReference } from \"./cli-docs\";\nimport { allDrivers, buildRegistry, parseList, parseTargets } from \"./registry\";\nimport { printDiagnostics, printEvalReport, printTrustSummary } from \"./report\";\nimport { scaffoldPlugin } from \"./scaffold\";\n\n/** Filter requested targets to harnesses actually present on this machine. */\nasync function detectPresent(\n requested: Target[],\n): Promise<{ present: Target[]; missing: Target[] }> {\n const drivers = allDrivers();\n const present: Target[] = [];\n const missing: Target[] = [];\n for (const t of requested) {\n if (await drivers[t]?.available()) present.push(t);\n else missing.push(t);\n }\n return { present, missing };\n}\n\nfunction countByTarget(written: { target: string }[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const w of written) counts.set(w.target, (counts.get(w.target) ?? 0) + 1);\n return counts;\n}\n\nfunction fail(err: unknown): never {\n if (err instanceof CompileError) {\n console.error(`\\n${err.message}:`);\n printDiagnostics(err.diagnostics);\n } else {\n console.error(`\\n${(err as Error).message}`);\n }\n process.exit(1);\n}\n\nconst initCmd = defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new plugin (loom.yaml + a sample skill)\" },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Target directory\" },\n name: { type: \"string\", description: \"Plugin name (kebab-case)\" },\n namespace: { type: \"string\", description: \"Reverse-DNS namespace, e.g. com.acme\" },\n },\n run({ args }) {\n const created = scaffoldPlugin({\n dir: args.dir,\n name: args.name,\n namespace: args.namespace,\n });\n console.log(`Scaffolded plugin \"${created.name}\" in ${created.dir}`);\n for (const f of created.files) console.log(` + ${f}`);\n console.log(`\\nNext: loom validate ${args.dir} && loom build ${args.dir}`);\n },\n});\n\nconst validateCmd = defineCommand({\n meta: { name: \"validate\", description: \"Statically validate a plugin (the valid badge)\" },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n },\n run({ args }) {\n try {\n const result = lint(args.dir);\n const { items, hasErrors } = result.diagnostics;\n if (items.length > 0) printDiagnostics(items);\n if (hasErrors) {\n console.error(`\\n${result.id}: invalid`);\n process.exit(1);\n }\n console.log(`${result.id}: valid (${result.plugin.components.length} components)`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst buildCmd = defineCommand({\n meta: {\n name: \"build\",\n description: \"Compile a plugin (or a marketplace of plugins) to harness manifests\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin or marketplace directory\",\n },\n out: { type: \"string\", default: \".loom-out\", description: \"Output directory\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const targets = parseTargets(args.target);\n\n // A marketplace.yaml packages many plugins into one catalog.\n if (hasMarketplaceManifest(args.dir)) {\n const { marketplace, plugins, written } = await buildMarketplace({\n marketplaceDir: args.dir,\n outDir: args.out,\n registry,\n targets,\n });\n console.log(\n `Built marketplace ${marketplace.name} (${plugins.length} plugins) -> ${args.out}/`,\n );\n for (const [t, n] of countByTarget(written)) console.log(` ${t}: ${n} files`);\n return;\n }\n\n const { result, written } = await build({\n pluginDir: args.dir,\n outDir: args.out,\n registry,\n targets,\n });\n if (result.diagnostics.items.length > 0) printDiagnostics(result.diagnostics.items);\n console.log(`Built ${result.id} -> ${args.out}/`);\n for (const [t, n] of countByTarget(written)) {\n console.log(` ${t}: ${n} files (catalog at ${args.out}/${t})`);\n }\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst installCmd = defineCommand({\n meta: {\n name: \"install\",\n description: \"Compile + place a plugin into a harness scope, write loom.lock\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n scope: { type: \"string\", default: \"project\", description: \"user | project\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n only: {\n type: \"string\",\n description: \"Comma-separated component names to install piecemeal (e.g. one skill)\",\n },\n all: {\n type: \"boolean\",\n description: \"Install to requested targets even if the harness is not detected\",\n },\n managed: {\n type: \"string\",\n description: \"Managed mode: only allow these namespaces (comma-separated allowlist)\",\n },\n cwd: { type: \"string\", description: \"Project root for project-scope placement (default: cwd)\" },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const scope = (args.scope === \"user\" ? \"user\" : \"project\") as Scope;\n const requested = parseTargets(args.target) ?? registry.targets;\n const allow = parseList(args.managed);\n\n // Skip targets whose harness isn't on this machine, and say so (spec §9.2).\n let targets = requested;\n if (!args.all) {\n const { present, missing } = await detectPresent(requested);\n for (const t of missing) console.log(` skipped ${t}: harness not detected`);\n if (present.length === 0) {\n console.error(\"No requested harness is installed. Use --all to place anyway.\");\n process.exit(1);\n }\n targets = present;\n }\n\n const result = await install({\n pluginDir: args.dir,\n scope,\n cwd: args.cwd ?? process.cwd(),\n registry,\n targets,\n only: parseList(args.only),\n ...(allow ? { managed: { allowNamespaces: allow } } : {}),\n });\n printTrustSummary(result.result);\n console.log(\n `Installed ${result.lockfile.plugin.id}@${result.lockfile.plugin.version} (${scope})`,\n );\n console.log(` ${result.lockfile.artifacts.length} artifacts placed`);\n if (result.secrets.resolved.length > 0) {\n const missing = result.secrets.resolved.filter((r) => r.source === \"missing\");\n console.log(\n ` config: ${result.secrets.resolved.length} declared` +\n (result.secrets.path ? ` -> ${result.secrets.path} (gitignored)` : \"\") +\n (missing.length > 0 ? `; missing: ${missing.map((m) => m.env).join(\", \")}` : \"\"),\n );\n }\n console.log(` lockfile: ${result.lockPath}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst updateCmd = defineCommand({\n meta: {\n name: \"update\",\n description: \"Re-resolve refs, recompile, and re-place only artifacts whose hash changed\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n scope: { type: \"string\", default: \"project\", description: \"user | project\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n cwd: { type: \"string\", description: \"Project root for project-scope placement (default: cwd)\" },\n },\n async run({ args }) {\n try {\n const scope = (args.scope === \"user\" ? \"user\" : \"project\") as Scope;\n // Default to the targets already in the lockfile, so update matches what\n // install placed (not every registered adapter).\n const lock = readLock(args.dir);\n const lockedTargets = lock\n ? ([...new Set(lock.artifacts.map((a) => a.target))] as Target[])\n : undefined;\n const result = await update({\n pluginDir: args.dir,\n scope,\n cwd: args.cwd ?? process.cwd(),\n registry: buildRegistry(),\n targets: parseTargets(args.target) ?? lockedTargets,\n });\n console.log(\n `Updated ${result.lockfile.plugin.id}: ${result.changed.length} artifact(s) changed`,\n );\n for (const p of result.changed) console.log(` ~ ${p}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst evalCmd = defineCommand({\n meta: {\n name: \"eval\",\n description: \"Run a component's evals against the real harnesses (reports UNTESTED honestly)\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n component: { type: \"string\", description: \"Only eval this component leaf name\" },\n harness: { type: \"string\", description: \"Restrict to these harnesses (comma-separated)\" },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const drivers = allDrivers();\n const discovered = discoverEvals(args.dir).filter(\n (d) => !args.component || d.componentLeaf === args.component,\n );\n if (discovered.length === 0) {\n console.log(\"No evals found (a component adds them with an `evals:` file).\");\n return;\n }\n const onlyHarness = parseTargets(args.harness);\n let anyFail = false;\n for (const d of discovered) {\n const evalFile = onlyHarness\n ? {\n ...d.evalFile,\n harnesses: d.evalFile.harnesses.filter((h) => onlyHarness.includes(h)),\n }\n : d.evalFile;\n const report = await runEval({\n evalFile,\n pluginDir: args.dir,\n componentLeaf: d.componentLeaf,\n registry,\n drivers,\n });\n printEvalReport(report);\n if (report.harnesses.some((h) => h.status === \"tested\" && !h.pass)) anyFail = true;\n }\n if (anyFail) process.exit(1);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst publishCmd = defineCommand({\n meta: {\n name: \"publish\",\n description: \"Run the deterministic publish gate (static valid + trace/output evals)\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n snapshot: {\n type: \"boolean\",\n description: \"Snapshot eval scores into evals/.baselines/ for the next release\",\n },\n },\n async run({ args }) {\n try {\n const res = await publishCheck(args.dir, {\n registry: buildRegistry(),\n drivers: allDrivers(),\n snapshot: Boolean(args.snapshot),\n });\n console.log(`Publish check: ${res.id}@${res.version}`);\n if (res.diagnostics.length > 0) printDiagnostics(res.diagnostics);\n console.log(` valid: ${res.validPassed ? \"yes\" : \"NO\"}`);\n console.log(` scan: ${res.scan.clean ? \"clean\" : `${res.scan.findings.length} finding(s)`}`);\n console.log(` badges: ${res.badges.join(\", \") || \"none\"}`);\n console.log(` harness coverage: ${res.harnessCoverage.join(\", \") || \"none\"}`);\n for (const r of res.evalReports) printEvalReport(r);\n if (!res.ok) {\n console.error(\"\\nPublish BLOCKED: the deterministic tier failed.\");\n process.exit(1);\n }\n console.log(\"\\nPublish gate passed.\");\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst signCmd = defineCommand({\n meta: {\n name: \"sign\",\n description:\n \"Sign loom.lock's artifact set (ed25519) -> loom.sig + loom.pub (the signed badge)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with loom.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n console.error(\"no loom.lock found (run `loom install` first)\");\n process.exit(1);\n }\n const loomDir = join(args.dir, \".loom\");\n mkdirSync(loomDir, { recursive: true });\n writeFileSync(join(loomDir, \".gitignore\"), \"*\\n\");\n const keyPath = join(loomDir, \"signing.key\");\n\n let privateKey: ReturnType<typeof createPrivateKey>;\n if (existsSync(keyPath)) {\n privateKey = createPrivateKey(readFileSync(keyPath));\n } else {\n const keys = generateSigningKeys();\n privateKey = keys.privateKey;\n writeFileSync(keyPath, keys.privateKey.export({ type: \"pkcs8\", format: \"pem\" }));\n writeFileSync(\n join(args.dir, \"loom.pub\"),\n keys.publicKey.export({ type: \"spki\", format: \"pem\" }),\n );\n }\n writeFileSync(join(args.dir, \"loom.sig\"), `${signLock(lock, privateKey)}\\n`);\n console.log(\n `Signed ${lock.artifacts.length} artifacts -> loom.sig (key kept in .loom/, public key in loom.pub)`,\n );\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst verifyCmd = defineCommand({\n meta: {\n name: \"verify\",\n description: \"Verify loom.sig against loom.lock and the on-disk artifacts\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with loom.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n console.error(\"no loom.lock found\");\n process.exit(1);\n }\n const sig = readFileSync(join(args.dir, \"loom.sig\"), \"utf8\").trim();\n const publicKey = createPublicKey(readFileSync(join(args.dir, \"loom.pub\")));\n const res = verifyArtifacts(lock, publicKey, sig);\n console.log(`signature: ${res.signatureValid ? \"valid\" : \"INVALID\"}`);\n console.log(`tampered artifacts: ${res.tampered.length}`);\n for (const p of res.tampered) console.log(` ! ${p}`);\n if (!res.signatureValid || res.tampered.length > 0) process.exit(1);\n console.log(\"signed badge verified.\");\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst indexCmd = defineCommand({\n meta: {\n name: \"index\",\n description: \"Build a metadata index from plugin dirs (optionally federating the MCP Registry)\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directories\" },\n out: { type: \"string\", default: \"index.json\", description: \"Output index file\" },\n federate: { type: \"boolean\", description: \"Ingest the MCP Registry (GET /v0.1/servers)\" },\n },\n async run({ args }) {\n try {\n // citty puts every positional in `_`; default to the current dir when none.\n const positionals = (args._ as string[] | undefined) ?? [];\n const dirs = positionals.length > 0 ? positionals : [\".\"];\n let index = await indexFromPluginDirs(dirs);\n if (args.federate) {\n const servers = await fetchMcpRegistry({ limit: 30 });\n index = federate(index, servers, new Date().toISOString());\n }\n writeFileSync(args.out, serializeIndex(index));\n const fed = args.federate ? `, federated ${index.federated?.length ?? 0} source(s)` : \"\";\n console.log(`Wrote index (${index.plugins.length} plugins${fed}) -> ${args.out}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst importCmd = defineCommand({\n meta: {\n name: \"import\",\n description: \"Reverse-compile an existing native plugin/marketplace into a Loom plugin\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Dir with an existing native plugin or marketplace\",\n },\n from: { type: \"string\", default: \"claude\", description: \"Source harness format\" },\n out: { type: \"string\", default: \"imported\", description: \"Output directory\" },\n namespace: {\n type: \"string\",\n description: \"Reverse-DNS namespace to assign (default com.imported)\",\n },\n },\n run({ args }) {\n try {\n const adapter = buildRegistry().get(args.from as Target);\n if (!adapter) {\n console.error(`unknown source harness \"${args.from}\"`);\n process.exit(1);\n }\n const res = importNativePlugin({\n dir: args.dir,\n adapter,\n outDir: args.out,\n ...(args.namespace ? { namespace: args.namespace } : {}),\n });\n console.log(`Imported ${res.kind} \"${res.name}\" -> ${res.manifestPath}`);\n if (res.kind === \"plugin\") console.log(` ${res.fileCount} component file(s)`);\n console.log(` next: loom build ${res.outDir}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst uninstallCmd = defineCommand({\n meta: {\n name: \"uninstall\",\n description: \"Remove everything install placed (from loom.lock) and delete the lockfile\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with loom.lock\",\n },\n },\n run({ args }) {\n try {\n const res = uninstall({ pluginDir: args.dir });\n console.log(`Uninstalled ${res.removed.length} artifact(s)`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst docsCmd = defineCommand({\n meta: {\n name: \"docs\",\n description: \"Print the full CLI reference (a CLI map), generated from the command tree\",\n },\n args: {\n out: {\n type: \"string\",\n description: \"Write the Markdown reference to this file instead of stdout\",\n },\n },\n async run({ args }) {\n const md = await renderCliReference(main);\n if (args.out) {\n writeFileSync(args.out, md);\n console.log(`Wrote CLI reference to ${args.out}`);\n } else {\n process.stdout.write(md);\n }\n },\n});\n\nconst main = defineCommand({\n meta: {\n name: \"loom\",\n version: LOOM_VERSION,\n description: \"Author once, compile to every coding-agent harness.\",\n },\n subCommands: {\n init: initCmd,\n validate: validateCmd,\n build: buildCmd,\n install: installCmd,\n uninstall: uninstallCmd,\n update: updateCmd,\n import: importCmd,\n eval: evalCmd,\n publish: publishCmd,\n sign: signCmd,\n verify: verifyCmd,\n index: indexCmd,\n docs: docsCmd,\n },\n});\n\nrunMain(main);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-docs.ts","../src/logger.ts","../src/registry.ts","../src/report.ts","../src/scaffold.ts","../src/index.ts"],"names":["main","resolve","drivers","written","join","mkdirSync","writeFileSync","existsSync"],"mappings":"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","file":"index.js","sourcesContent":["import { type CommandDef, renderUsage } from \"citty\";\n\ntype Resolvable<T> = T | (() => T | Promise<T>);\n\nasync function resolve<T>(r: Resolvable<T>): Promise<T> {\n return typeof r === \"function\" ? await (r as () => T | Promise<T>)() : r;\n}\n\n/**\n * Render a full Markdown CLI reference straight from the citty command tree, so\n * the docs can never drift from the actual commands -- the same single-source\n * principle Loom applies to manifests, applied to its own CLI.\n */\nexport async function renderCliReference(main: CommandDef): Promise<string> {\n const out: string[] = [\n \"# Loom CLI reference\",\n \"\",\n \"_Generated from the CLI definition by `loom docs` -- do not edit by hand._\",\n \"\",\n \"## `loom`\",\n \"\",\n \"```\",\n (await renderUsage(main)).trim(),\n \"```\",\n \"\",\n ];\n\n const subs = main.subCommands ? await resolve(main.subCommands) : {};\n for (const name of Object.keys(subs).sort()) {\n const sub = await resolve(subs[name] as Resolvable<CommandDef>);\n const meta = await resolve(sub.meta);\n out.push(`## \\`loom ${name}\\``, \"\");\n if (meta?.description) out.push(meta.description as string, \"\");\n out.push(\"```\", (await renderUsage(sub, main)).trim(), \"```\", \"\");\n }\n\n return `${out.join(\"\\n\")}\\n`;\n}\n","// The CLI's single output funnel: every other file logs through `log`, so the\n// libraries stay console-free and verbosity is controlled in one place. Flags are\n// read once from argv (citty parses them per-command; we only need their presence):\n// --quiet/-q errors only\n// --verbose/-v include debug lines\n// --json machine-readable output (human lines suppressed; use log.data)\n\ntype Level = \"error\" | \"warn\" | \"info\" | \"debug\";\nconst RANK: Record<Level, number> = { error: 0, warn: 1, info: 2, debug: 3 };\n\nfunction thresholdFrom(argv: string[]): number {\n if (argv.includes(\"--json\")) return RANK.error;\n if (argv.includes(\"--quiet\") || argv.includes(\"-q\")) return RANK.error;\n if (argv.includes(\"--verbose\") || argv.includes(\"-v\")) return RANK.debug;\n return RANK.info;\n}\n\nconst isJson = process.argv.includes(\"--json\");\nconst threshold = thresholdFrom(process.argv);\n\nfunction emit(level: Level, message: string): void {\n if (RANK[level] > threshold) return;\n // biome-ignore lint/suspicious/noConsole: this module is the CLI's output funnel.\n if (level === \"error\" || level === \"warn\") console.error(message);\n // biome-ignore lint/suspicious/noConsole: this module is the CLI's output funnel.\n else console.log(message);\n}\n\nexport const log = {\n /** True when --json is set; commands emit a result object via `data` instead of prose. */\n json: isJson,\n error: (message: string): void => emit(\"error\", message),\n warn: (message: string): void => emit(\"warn\", message),\n info: (message: string): void => emit(\"info\", message),\n debug: (message: string): void => emit(\"debug\", message),\n /** Emit a structured result. Prints JSON only in --json mode; a no-op otherwise. */\n data: (obj: unknown): void => {\n // biome-ignore lint/suspicious/noConsole: this module is the CLI's output funnel.\n if (isJson) console.log(JSON.stringify(obj));\n },\n};\n","import claudeAdapter from \"@michaelfromyeg/loom-adapter-claude\";\nimport codexAdapter from \"@michaelfromyeg/loom-adapter-codex\";\nimport copilotAdapter from \"@michaelfromyeg/loom-adapter-copilot\";\nimport cursorAdapter from \"@michaelfromyeg/loom-adapter-cursor\";\nimport type { HarnessDriver } from \"@michaelfromyeg/loom-adapter-kit\";\nimport opencodeAdapter from \"@michaelfromyeg/loom-adapter-opencode\";\nimport { AdapterRegistry } from \"@michaelfromyeg/loom-core\";\nimport { drivers } from \"@michaelfromyeg/loom-eval\";\nimport type { Target } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * Wire every concrete adapter into a registry. The CLI sits at the top of the\n * dependency graph, so it -- not core -- knows the full adapter set. Community\n * adapters are added the same way.\n */\nexport function buildRegistry(): AdapterRegistry {\n return new AdapterRegistry()\n .register(claudeAdapter)\n .register(codexAdapter)\n .register(cursorAdapter)\n .register(copilotAdapter)\n .register(opencodeAdapter);\n}\n\n/** The headless eval drivers, keyed by Target (from @michaelfromyeg/loom-eval). */\nexport function allDrivers(): Record<Target, HarnessDriver> {\n return drivers;\n}\n\n/** Parse a comma-separated CLI value into a trimmed list, or undefined when empty. */\nexport function parseList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/** Parse a comma-separated --target value into a typed list, or undefined for all. */\nexport function parseTargets(value: string | undefined): Target[] | undefined {\n return parseList(value) as Target[] | undefined;\n}\n","import type { CompileResult, Diagnostic } from \"@michaelfromyeg/loom-core\";\nimport type { EvalReport } from \"@michaelfromyeg/loom-eval\";\nimport { log } from \"./logger\";\n\nexport function formatDiagnostic(d: Diagnostic): string {\n const tag = d.severity === \"error\" ? \"error\" : d.severity === \"warning\" ? \"warn\" : \"info\";\n const where = d.where ? `${d.where}: ` : \"\";\n return ` ${tag.padEnd(5)} ${where}${d.message}`;\n}\n\nexport function printDiagnostics(items: Diagnostic[]): void {\n for (const d of items) {\n const line = formatDiagnostic(d);\n if (d.severity === \"error\") log.error(line);\n else log.warn(line);\n }\n}\n\n/**\n * The trust summary required before first install (spec §11): what runs and on\n * whose authority. Lists components by kind, every executable artifact, every MCP\n * server, and the publisher-verification state.\n */\nexport function printTrustSummary(result: CompileResult): void {\n const { plugin } = result.fb;\n // Count from the components actually installed (accurate for piecemeal installs).\n const components = result.components;\n log.info(`\\nTrust summary for ${result.id}@${plugin.version}`);\n log.info(` publisher: ${plugin.owner.name} <${plugin.owner.namespace}> (unverified)`);\n\n const counts = new Map<string, number>();\n for (const c of components) counts.set(c.kind, (counts.get(c.kind) ?? 0) + 1);\n const summary = [...counts.entries()].map(([k, n]) => `${n} ${k}`).join(\", \");\n log.info(` components: ${summary || \"none\"}`);\n\n const executables = result.targets.flatMap((t) =>\n t.artifacts\n .filter((p) => p.artifact.executable)\n .map((p) => `${t.target}:${p.artifact.relPath}`),\n );\n log.info(\n executables.length > 0\n ? ` executables (placed DISABLED): ${executables.join(\", \")}`\n : \" executables: none\",\n );\n\n log.info(` mcp servers that will run: ${counts.get(\"mcp\") ?? 0}`);\n log.info(\" badges: valid (computed) | signed/verified/scanned: not yet\\n\");\n}\n\n/** Render an eval report: per-harness PASS/FAIL/UNTESTED with per-assertion status. */\nexport function printEvalReport(report: EvalReport): void {\n log.data(report);\n log.info(`\\nEval: ${report.component}`);\n for (const h of report.harnesses) {\n if (h.status === \"untested\") {\n log.info(` ${h.harness}: UNTESTED (${h.reason})`);\n continue;\n }\n log.info(` ${h.harness}: ${h.pass ? \"PASS\" : \"FAIL\"}`);\n for (const c of h.cases) {\n log.info(` - ${c.name}: ${c.pass ? \"pass\" : \"fail\"}`);\n for (const a of c.assertions) {\n log.info(` ${a.kind}: ${a.status} (${a.detail})`);\n }\n }\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join, relative, resolve } from \"node:path\";\n\nexport interface ScaffoldOptions {\n dir: string;\n name?: string;\n namespace?: string;\n}\n\nexport interface ScaffoldResult {\n dir: string;\n name: string;\n files: string[];\n}\n\nfunction kebab(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"my-plugin\"\n );\n}\n\n/** Create a minimal, valid plugin: loom.yaml + one sample skill. Never clobbers. */\nexport function scaffoldPlugin(opts: ScaffoldOptions): ScaffoldResult {\n const dir = resolve(opts.dir);\n mkdirSync(dir, { recursive: true });\n\n const manifestPath = join(dir, \"loom.yaml\");\n if (existsSync(manifestPath)) {\n throw new Error(`a plugin already exists at ${manifestPath}`);\n }\n\n const name = kebab(opts.name ?? basename(dir));\n const namespace = opts.namespace ?? \"com.example\";\n const files: string[] = [];\n\n const loomYaml = `name: ${name}\nversion: 0.1.0\nowner:\n name: Your Name\n namespace: ${namespace}\ndescription: A Loom plugin.\ncomponents:\n - skill: skills/hello\n`;\n writeFileSync(manifestPath, loomYaml);\n files.push(relative(dir, manifestPath));\n\n const skillDir = join(dir, \"skills\", \"hello\");\n mkdirSync(skillDir, { recursive: true });\n const skillMd = `---\nname: hello\ndescription: Greet the user and explain what this skill does.\n---\n\nWhen invoked, greet the user warmly and summarize the task at hand.\n`;\n const skillPath = join(skillDir, \"SKILL.md\");\n writeFileSync(skillPath, skillMd);\n files.push(relative(dir, skillPath));\n\n return { dir, name, files };\n}\n","import { createPrivateKey, createPublicKey } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n build,\n buildMarketplace,\n CompileError,\n generateSigningKeys,\n hasMarketplaceManifest,\n importNativePlugin,\n install,\n installMarketplace,\n LOOM_VERSION,\n lint,\n lockDirForScope,\n readLock,\n resolveSourceDir,\n signLock,\n uninstall,\n update,\n verifyArtifacts,\n} from \"@michaelfromyeg/loom-core\";\nimport { discoverEvals, runEval } from \"@michaelfromyeg/loom-eval\";\nimport {\n federate,\n fetchMcpRegistry,\n indexFromPluginDirs,\n publishCheck,\n serializeIndex,\n} from \"@michaelfromyeg/loom-index\";\nimport type { Scope, Target } from \"@michaelfromyeg/loom-schema\";\nimport { defineCommand, runMain } from \"citty\";\nimport { renderCliReference } from \"./cli-docs\";\nimport { log } from \"./logger\";\nimport { allDrivers, buildRegistry, parseList, parseTargets } from \"./registry\";\nimport { printDiagnostics, printEvalReport, printTrustSummary } from \"./report\";\nimport { scaffoldPlugin } from \"./scaffold\";\n\n/** Filter requested targets to harnesses actually present on this machine. */\nasync function detectPresent(\n requested: Target[],\n): Promise<{ present: Target[]; missing: Target[] }> {\n const drivers = allDrivers();\n const present: Target[] = [];\n const missing: Target[] = [];\n for (const t of requested) {\n if (await drivers[t]?.available()) present.push(t);\n else missing.push(t);\n }\n return { present, missing };\n}\n\nfunction countByTarget(written: { target: string }[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const w of written) counts.set(w.target, (counts.get(w.target) ?? 0) + 1);\n return counts;\n}\n\nfunction fail(err: unknown): never {\n if (err instanceof CompileError) {\n log.error(`\\n${err.message}:`);\n printDiagnostics(err.diagnostics);\n } else {\n log.error(`\\n${(err as Error).message}`);\n }\n process.exit(1);\n}\n\nconst initCmd = defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new plugin (loom.yaml + a sample skill)\" },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Target directory\" },\n name: { type: \"string\", description: \"Plugin name (kebab-case)\" },\n namespace: { type: \"string\", description: \"Reverse-DNS namespace, e.g. com.acme\" },\n },\n run({ args }) {\n const created = scaffoldPlugin({\n dir: args.dir,\n name: args.name,\n namespace: args.namespace,\n });\n log.info(`Scaffolded plugin \"${created.name}\" in ${created.dir}`);\n for (const f of created.files) log.info(` + ${f}`);\n log.info(`\\nNext: loom validate ${args.dir} && loom build ${args.dir}`);\n },\n});\n\nconst validateCmd = defineCommand({\n meta: { name: \"validate\", description: \"Statically validate a plugin (the valid badge)\" },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n },\n run({ args }) {\n try {\n const result = lint(args.dir);\n const { items, hasErrors } = result.diagnostics;\n if (items.length > 0) printDiagnostics(items);\n if (hasErrors) {\n log.error(`\\n${result.id}: invalid`);\n process.exit(1);\n }\n log.data({ id: result.id, valid: true, components: result.plugin.components.length });\n log.info(`${result.id}: valid (${result.plugin.components.length} components)`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst buildCmd = defineCommand({\n meta: {\n name: \"build\",\n description: \"Compile a plugin (or a marketplace of plugins) to harness manifests\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Local dir, or a remote ref (github:/npm:/owner/repo, optional //subdir)\",\n },\n out: { type: \"string\", default: \".loom-out\", description: \"Output directory\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const targets = parseTargets(args.target);\n // A remote ref (github:/git/owner-repo, optionally //subdir) clones into the\n // cache; a local path is used as-is.\n const { dir } = await resolveSourceDir(args.dir, process.cwd());\n\n // A marketplace.yaml packages many plugins into one catalog.\n if (hasMarketplaceManifest(dir)) {\n const { marketplace, plugins, written } = await buildMarketplace({\n marketplaceDir: dir,\n outDir: args.out,\n registry,\n targets,\n });\n log.data({\n marketplace: marketplace.name,\n plugins: plugins.length,\n out: args.out,\n files: Object.fromEntries(countByTarget(written)),\n });\n log.info(\n `Built marketplace ${marketplace.name} (${plugins.length} plugins) -> ${args.out}/`,\n );\n for (const [t, n] of countByTarget(written)) log.info(` ${t}: ${n} files`);\n return;\n }\n\n const { result, written } = await build({\n pluginDir: dir,\n outDir: args.out,\n registry,\n targets,\n });\n if (result.diagnostics.items.length > 0) printDiagnostics(result.diagnostics.items);\n log.data({ id: result.id, out: args.out, files: Object.fromEntries(countByTarget(written)) });\n log.info(`Built ${result.id} -> ${args.out}/`);\n for (const [t, n] of countByTarget(written)) {\n log.info(` ${t}: ${n} files (catalog at ${args.out}/${t})`);\n }\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst installCmd = defineCommand({\n meta: {\n name: \"install\",\n description: \"Compile + place a plugin (or a whole marketplace) into harness scopes\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Local dir, or a remote ref (github:/npm:/owner/repo, optional //subdir)\",\n },\n scope: { type: \"string\", default: \"project\", description: \"user | project\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n only: {\n type: \"string\",\n description: \"Comma-separated component names to install piecemeal (e.g. one skill)\",\n },\n all: {\n type: \"boolean\",\n description: \"Install to requested targets even if the harness is not detected\",\n },\n managed: {\n type: \"string\",\n description: \"Managed mode: only allow these namespaces (comma-separated allowlist)\",\n },\n cwd: { type: \"string\", description: \"Project root for project-scope placement (default: cwd)\" },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const scope = (args.scope === \"user\" ? \"user\" : \"project\") as Scope;\n const requested = parseTargets(args.target) ?? registry.targets;\n const allow = parseList(args.managed);\n\n // Skip targets whose harness isn't on this machine, and say so (spec §9.2).\n let targets = requested;\n if (!args.all) {\n const { present, missing } = await detectPresent(requested);\n for (const t of missing) log.info(` skipped ${t}: harness not detected`);\n if (present.length === 0) {\n log.error(\"No requested harness is installed. Use --all to place anyway.\");\n process.exit(1);\n }\n targets = present;\n }\n\n // A remote ref (github:/git/npm/owner-repo, optionally //subdir) is fetched\n // into the cache; a local path is used as-is.\n const { dir } = await resolveSourceDir(args.dir, process.cwd());\n\n // A marketplace.yaml installs all of its plugins across the targets at once.\n if (hasMarketplaceManifest(dir)) {\n const mp = await installMarketplace({\n marketplaceDir: dir,\n scope,\n cwd: args.cwd ?? process.cwd(),\n registry,\n targets,\n ...(allow ? { managed: { allowNamespaces: allow } } : {}),\n });\n log.data({\n marketplace: mp.marketplace.name,\n plugins: mp.installs.map((i) => i.result.id),\n scope,\n lockfile: mp.lockPath,\n });\n log.info(\n `Installed marketplace ${mp.marketplace.name} (${mp.installs.length} plugins, ${scope})`,\n );\n for (const i of mp.installs) {\n log.info(\n ` ${i.result.id}@${i.result.fb.plugin.version}: ${i.entry.artifacts.length} artifacts`,\n );\n }\n log.info(` lockfile: ${mp.lockPath}`);\n return;\n }\n\n const result = await install({\n pluginDir: dir,\n scope,\n cwd: args.cwd ?? process.cwd(),\n registry,\n targets,\n only: parseList(args.only),\n ...(allow ? { managed: { allowNamespaces: allow } } : {}),\n });\n printTrustSummary(result.result);\n log.data({\n id: result.result.id,\n version: result.result.fb.plugin.version,\n scope,\n artifacts: result.entry.artifacts.length,\n lockfile: result.lockPath,\n });\n log.info(`Installed ${result.result.id}@${result.result.fb.plugin.version} (${scope})`);\n log.info(` ${result.entry.artifacts.length} artifacts placed`);\n if (result.secrets.resolved.length > 0) {\n const missing = result.secrets.resolved.filter((r) => r.source === \"missing\");\n log.info(\n ` config: ${result.secrets.resolved.length} declared` +\n (result.secrets.path ? ` -> ${result.secrets.path} (gitignored)` : \"\") +\n (missing.length > 0 ? `; missing: ${missing.map((m) => m.env).join(\", \")}` : \"\"),\n );\n }\n log.info(` lockfile: ${result.lockPath}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst updateCmd = defineCommand({\n meta: {\n name: \"update\",\n description: \"Re-resolve refs, recompile, and re-place only artifacts whose hash changed\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n scope: { type: \"string\", default: \"project\", description: \"user | project\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n cwd: { type: \"string\", description: \"Project root for project-scope placement (default: cwd)\" },\n },\n async run({ args }) {\n try {\n const scope = (args.scope === \"user\" ? \"user\" : \"project\") as Scope;\n const cwd = args.cwd ?? process.cwd();\n // Default to the targets already in the target lockfile, so update matches\n // what install placed (not every registered adapter).\n const lock = readLock(lockDirForScope(scope, cwd));\n const lockedTargets = lock\n ? ([...new Set(lock.artifacts.map((a) => a.target))] as Target[])\n : undefined;\n const result = await update({\n pluginDir: args.dir,\n scope,\n cwd,\n registry: buildRegistry(),\n targets: parseTargets(args.target) ?? lockedTargets,\n });\n log.data({ id: result.id, changed: result.changed });\n log.info(`Updated ${result.id}: ${result.changed.length} artifact(s) changed`);\n for (const p of result.changed) log.info(` ~ ${p}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst evalCmd = defineCommand({\n meta: {\n name: \"eval\",\n description: \"Run a component's evals against the real harnesses (reports UNTESTED honestly)\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n component: { type: \"string\", description: \"Only eval this component leaf name\" },\n harness: { type: \"string\", description: \"Restrict to these harnesses (comma-separated)\" },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const drivers = allDrivers();\n const discovered = discoverEvals(args.dir).filter(\n (d) => !args.component || d.componentLeaf === args.component,\n );\n if (discovered.length === 0) {\n log.info(\"No evals found (a component adds them with an `evals:` file).\");\n return;\n }\n const onlyHarness = parseTargets(args.harness);\n let anyFail = false;\n for (const d of discovered) {\n const evalFile = onlyHarness\n ? {\n ...d.evalFile,\n harnesses: d.evalFile.harnesses.filter((h) => onlyHarness.includes(h)),\n }\n : d.evalFile;\n const report = await runEval({\n evalFile,\n pluginDir: args.dir,\n componentLeaf: d.componentLeaf,\n registry,\n drivers,\n });\n printEvalReport(report);\n if (report.harnesses.some((h) => h.status === \"tested\" && !h.pass)) anyFail = true;\n }\n if (anyFail) process.exit(1);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst publishCmd = defineCommand({\n meta: {\n name: \"publish\",\n description: \"Run the deterministic publish gate (static valid + trace/output evals)\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directory\" },\n snapshot: {\n type: \"boolean\",\n description: \"Snapshot eval scores into evals/.baselines/ for the next release\",\n },\n },\n async run({ args }) {\n try {\n const res = await publishCheck(args.dir, {\n registry: buildRegistry(),\n drivers: allDrivers(),\n snapshot: Boolean(args.snapshot),\n });\n log.data({\n id: res.id,\n version: res.version,\n ok: res.ok,\n valid: res.validPassed,\n scanClean: res.scan.clean,\n badges: res.badges,\n harnessCoverage: res.harnessCoverage,\n });\n log.info(`Publish check: ${res.id}@${res.version}`);\n if (res.diagnostics.length > 0) printDiagnostics(res.diagnostics);\n log.info(` valid: ${res.validPassed ? \"yes\" : \"NO\"}`);\n log.info(` scan: ${res.scan.clean ? \"clean\" : `${res.scan.findings.length} finding(s)`}`);\n log.info(` badges: ${res.badges.join(\", \") || \"none\"}`);\n log.info(` harness coverage: ${res.harnessCoverage.join(\", \") || \"none\"}`);\n for (const r of res.evalReports) printEvalReport(r);\n if (!res.ok) {\n log.error(\"\\nPublish BLOCKED: the deterministic tier failed.\");\n process.exit(1);\n }\n log.info(\"\\nPublish gate passed.\");\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst signCmd = defineCommand({\n meta: {\n name: \"sign\",\n description:\n \"Sign loom.lock's artifact set (ed25519) -> loom.sig + loom.pub (the signed badge)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with loom.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n log.error(\"no loom.lock found (run `loom install` first)\");\n process.exit(1);\n }\n const loomDir = join(args.dir, \".loom\");\n mkdirSync(loomDir, { recursive: true });\n writeFileSync(join(loomDir, \".gitignore\"), \"*\\n\");\n const keyPath = join(loomDir, \"signing.key\");\n\n let privateKey: ReturnType<typeof createPrivateKey>;\n if (existsSync(keyPath)) {\n privateKey = createPrivateKey(readFileSync(keyPath));\n } else {\n const keys = generateSigningKeys();\n privateKey = keys.privateKey;\n writeFileSync(keyPath, keys.privateKey.export({ type: \"pkcs8\", format: \"pem\" }));\n writeFileSync(\n join(args.dir, \"loom.pub\"),\n keys.publicKey.export({ type: \"spki\", format: \"pem\" }),\n );\n }\n writeFileSync(join(args.dir, \"loom.sig\"), `${signLock(lock, privateKey)}\\n`);\n log.info(\n `Signed ${lock.artifacts.length} artifacts -> loom.sig (key kept in .loom/, public key in loom.pub)`,\n );\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst verifyCmd = defineCommand({\n meta: {\n name: \"verify\",\n description: \"Verify loom.sig against loom.lock and the on-disk artifacts\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with loom.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n log.error(\"no loom.lock found\");\n process.exit(1);\n }\n const sig = readFileSync(join(args.dir, \"loom.sig\"), \"utf8\").trim();\n const publicKey = createPublicKey(readFileSync(join(args.dir, \"loom.pub\")));\n const res = verifyArtifacts(lock, publicKey, sig);\n log.data({ signatureValid: res.signatureValid, tampered: res.tampered });\n log.info(`signature: ${res.signatureValid ? \"valid\" : \"INVALID\"}`);\n log.info(`tampered artifacts: ${res.tampered.length}`);\n for (const p of res.tampered) log.info(` ! ${p}`);\n if (!res.signatureValid || res.tampered.length > 0) process.exit(1);\n log.info(\"signed badge verified.\");\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst indexCmd = defineCommand({\n meta: {\n name: \"index\",\n description: \"Build a metadata index from plugin dirs (optionally federating the MCP Registry)\",\n },\n args: {\n dir: { type: \"positional\", required: false, default: \".\", description: \"Plugin directories\" },\n out: { type: \"string\", default: \"index.json\", description: \"Output index file\" },\n federate: { type: \"boolean\", description: \"Ingest the MCP Registry (GET /v0.1/servers)\" },\n },\n async run({ args }) {\n try {\n // citty puts every positional in `_`; default to the current dir when none.\n const positionals = (args._ as string[] | undefined) ?? [];\n const dirs = positionals.length > 0 ? positionals : [\".\"];\n let index = await indexFromPluginDirs(dirs);\n if (args.federate) {\n const servers = await fetchMcpRegistry({ limit: 30 });\n index = federate(index, servers, new Date().toISOString());\n }\n writeFileSync(args.out, serializeIndex(index));\n const fed = args.federate ? `, federated ${index.federated?.length ?? 0} source(s)` : \"\";\n log.data({\n plugins: index.plugins.length,\n federated: index.federated?.length ?? 0,\n out: args.out,\n });\n log.info(`Wrote index (${index.plugins.length} plugins${fed}) -> ${args.out}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst importCmd = defineCommand({\n meta: {\n name: \"import\",\n description: \"Reverse-compile an existing native plugin/marketplace into a Loom plugin\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Dir with an existing native plugin or marketplace\",\n },\n from: { type: \"string\", default: \"claude\", description: \"Source harness format\" },\n out: { type: \"string\", default: \"imported\", description: \"Output directory\" },\n namespace: {\n type: \"string\",\n description: \"Reverse-DNS namespace to assign (default com.imported)\",\n },\n },\n run({ args }) {\n try {\n const adapter = buildRegistry().get(args.from as Target);\n if (!adapter) {\n log.error(`unknown source harness \"${args.from}\"`);\n process.exit(1);\n }\n const res = importNativePlugin({\n dir: args.dir,\n adapter,\n outDir: args.out,\n ...(args.namespace ? { namespace: args.namespace } : {}),\n });\n log.data({\n kind: res.kind,\n name: res.name,\n manifest: res.manifestPath,\n out: res.outDir,\n ...(res.kind === \"plugin\" ? { files: res.fileCount } : {}),\n });\n log.info(`Imported ${res.kind} \"${res.name}\" -> ${res.manifestPath}`);\n if (res.kind === \"plugin\") log.info(` ${res.fileCount} component file(s)`);\n log.info(` next: loom build ${res.outDir}`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst uninstallCmd = defineCommand({\n meta: {\n name: \"uninstall\",\n description: \"Remove what install placed into this project (read from its loom.lock)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Install target dir holding loom.lock (the project you installed into)\",\n },\n plugin: {\n type: \"string\",\n description: \"Remove only this plugin (id or bare name); default removes all\",\n },\n },\n run({ args }) {\n try {\n const res = uninstall({ dir: args.dir, ...(args.plugin ? { plugin: args.plugin } : {}) });\n log.data({ removed: res.removed, plugins: res.plugins });\n log.info(`Uninstalled ${res.plugins.length} plugin(s), ${res.removed.length} artifact(s)`);\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst docsCmd = defineCommand({\n meta: {\n name: \"docs\",\n description: \"Print the full CLI reference (a CLI map), generated from the command tree\",\n },\n args: {\n out: {\n type: \"string\",\n description: \"Write the Markdown reference to this file instead of stdout\",\n },\n },\n async run({ args }) {\n const md = await renderCliReference(main);\n if (args.out) {\n writeFileSync(args.out, md);\n log.info(`Wrote CLI reference to ${args.out}`);\n } else {\n process.stdout.write(md);\n }\n },\n});\n\nconst main = defineCommand({\n meta: {\n name: \"loom\",\n version: LOOM_VERSION,\n description: \"Author once, compile to every coding-agent harness.\",\n },\n subCommands: {\n init: initCmd,\n validate: validateCmd,\n build: buildCmd,\n install: installCmd,\n uninstall: uninstallCmd,\n update: updateCmd,\n import: importCmd,\n eval: evalCmd,\n publish: publishCmd,\n sign: signCmd,\n verify: verifyCmd,\n index: indexCmd,\n docs: docsCmd,\n },\n});\n\nrunMain(main);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@michaelfromyeg/loom-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "The `loom` CLI: a thin shell over @michaelfromyeg/loom-core and the harness adapters.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
],
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"citty": "^0.1.6",
|
|
15
|
-
"@michaelfromyeg/loom-adapter-claude": "0.
|
|
16
|
-
"@michaelfromyeg/loom-adapter-codex": "0.
|
|
17
|
-
"@michaelfromyeg/loom-adapter-copilot": "0.
|
|
18
|
-
"@michaelfromyeg/loom-adapter-cursor": "0.
|
|
19
|
-
"@michaelfromyeg/loom-adapter-
|
|
20
|
-
"@michaelfromyeg/loom-
|
|
21
|
-
"@michaelfromyeg/loom-
|
|
22
|
-
"@michaelfromyeg/loom-
|
|
23
|
-
"@michaelfromyeg/loom-
|
|
24
|
-
"@michaelfromyeg/loom-
|
|
15
|
+
"@michaelfromyeg/loom-adapter-claude": "0.3.0",
|
|
16
|
+
"@michaelfromyeg/loom-adapter-codex": "0.3.0",
|
|
17
|
+
"@michaelfromyeg/loom-adapter-copilot": "0.3.0",
|
|
18
|
+
"@michaelfromyeg/loom-adapter-cursor": "0.3.0",
|
|
19
|
+
"@michaelfromyeg/loom-adapter-opencode": "0.3.0",
|
|
20
|
+
"@michaelfromyeg/loom-core": "0.3.0",
|
|
21
|
+
"@michaelfromyeg/loom-index": "0.3.0",
|
|
22
|
+
"@michaelfromyeg/loom-adapter-kit": "0.3.0",
|
|
23
|
+
"@michaelfromyeg/loom-eval": "0.3.0",
|
|
24
|
+
"@michaelfromyeg/loom-schema": "0.3.0"
|
|
25
25
|
},
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"author": "Michael DeMarco",
|