@michaelfromyeg/weft-cli 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +126 -14
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/index.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { execFileSync } from 'child_process';
|
|
2
3
|
import { createPrivateKey, createPublicKey } from 'crypto';
|
|
3
|
-
import { mkdirSync, writeFileSync, existsSync, readFileSync } from 'fs';
|
|
4
|
+
import { mkdirSync, writeFileSync, existsSync, readFileSync, mkdtempSync, rmSync } from 'fs';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
4
6
|
import { join, resolve as resolve$1, basename, relative } from 'path';
|
|
5
7
|
import { lint, resolveSourceDir, hasMarketplaceManifest, buildMarketplace, build, installMarketplace, install, readLock, lockDirForScope, update, generateSigningKeys, signLock, verifyArtifacts, importNativePlugin, uninstall, WEFT_VERSION, CompileError, AdapterRegistry } from '@michaelfromyeg/weft-core';
|
|
6
|
-
import { discoverEvals, runEval, drivers } from '@michaelfromyeg/weft-eval';
|
|
8
|
+
import { discoverEvals, compareVersions, runEval, drivers } from '@michaelfromyeg/weft-eval';
|
|
7
9
|
import { publishCheck, indexFromPluginDirs, fetchMcpRegistry, federate, serializeIndex } from '@michaelfromyeg/weft-index';
|
|
8
10
|
import { defineCommand, runMain, renderUsage } from 'citty';
|
|
9
11
|
import claudeAdapter from '@michaelfromyeg/weft-adapter-claude';
|
|
10
12
|
import codexAdapter from '@michaelfromyeg/weft-adapter-codex';
|
|
11
13
|
import copilotAdapter from '@michaelfromyeg/weft-adapter-copilot';
|
|
12
14
|
import cursorAdapter from '@michaelfromyeg/weft-adapter-cursor';
|
|
15
|
+
import { genericSkillsAdapter } from '@michaelfromyeg/weft-adapter-kit';
|
|
13
16
|
import opencodeAdapter from '@michaelfromyeg/weft-adapter-opencode';
|
|
14
17
|
|
|
15
18
|
async function resolve(r) {
|
|
@@ -67,8 +70,18 @@ var log = {
|
|
|
67
70
|
if (isJson) console.log(JSON.stringify(obj));
|
|
68
71
|
}
|
|
69
72
|
};
|
|
73
|
+
var GENERIC_AGENTS = [
|
|
74
|
+
{ target: "zed", projectRoot: ".agents", globalRoot: "~/.agents" },
|
|
75
|
+
{ target: "gemini", projectRoot: ".agents", globalRoot: "~/.gemini" },
|
|
76
|
+
{ target: "amp", projectRoot: ".agents", globalRoot: "~/.config/agents" },
|
|
77
|
+
{ target: "aider", projectRoot: ".aider-desk", globalRoot: "~/.aider-desk" }
|
|
78
|
+
];
|
|
70
79
|
function buildRegistry() {
|
|
71
|
-
|
|
80
|
+
const registry = new AdapterRegistry().register(claudeAdapter).register(codexAdapter).register(cursorAdapter).register(copilotAdapter).register(opencodeAdapter);
|
|
81
|
+
for (const a of GENERIC_AGENTS) {
|
|
82
|
+
registry.register(genericSkillsAdapter(a));
|
|
83
|
+
}
|
|
84
|
+
return registry;
|
|
72
85
|
}
|
|
73
86
|
function allDrivers() {
|
|
74
87
|
return drivers;
|
|
@@ -83,6 +96,28 @@ function parseTargets(value) {
|
|
|
83
96
|
}
|
|
84
97
|
|
|
85
98
|
// src/report.ts
|
|
99
|
+
function printComparison(component, ref, reports) {
|
|
100
|
+
log.data({ component, ref, reports });
|
|
101
|
+
if (reports.length === 0) {
|
|
102
|
+
log.info(`
|
|
103
|
+
${component}: no runnable harness to compare (all UNTESTED).`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const r of reports) {
|
|
107
|
+
for (const c of r.cases) {
|
|
108
|
+
log.info(`
|
|
109
|
+
=== ${component} :: ${c.name} [${r.harness}] ===`);
|
|
110
|
+
log.info(`prompt: ${c.prompt}`);
|
|
111
|
+
log.info(`
|
|
112
|
+
--- before (${ref}) ---
|
|
113
|
+
${c.before.trim() || "(empty)"}`);
|
|
114
|
+
log.info(`
|
|
115
|
+
--- after (working tree) ---
|
|
116
|
+
${c.after.trim() || "(empty)"}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
log.info("\n(read the pairs and judge which definition reads better.)");
|
|
120
|
+
}
|
|
86
121
|
function formatDiagnostic(d) {
|
|
87
122
|
const tag = d.severity === "error" ? "error" : d.severity === "warning" ? "warn" : "info";
|
|
88
123
|
const where = d.where ? `${d.where}: ` : "";
|
|
@@ -187,6 +222,20 @@ function countByTarget(written) {
|
|
|
187
222
|
for (const w of written) counts.set(w.target, (counts.get(w.target) ?? 0) + 1);
|
|
188
223
|
return counts;
|
|
189
224
|
}
|
|
225
|
+
function reportDrift(drift, out) {
|
|
226
|
+
log.data({ check: true, out, ...drift });
|
|
227
|
+
if (drift.clean) {
|
|
228
|
+
log.info(`${out} is up to date (${drift.checked} files)`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
for (const p of drift.missing) log.error(` + missing ${p}`);
|
|
232
|
+
for (const p of drift.stale) log.error(` ~ stale ${p}`);
|
|
233
|
+
log.error(
|
|
234
|
+
`
|
|
235
|
+
${out} is out of date with source (${drift.missing.length} missing, ${drift.stale.length} stale); rerun the same build without --check and commit the result`
|
|
236
|
+
);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
190
239
|
function fail(err) {
|
|
191
240
|
if (err instanceof CompileError) {
|
|
192
241
|
log.error(`
|
|
@@ -198,6 +247,24 @@ ${err.message}`);
|
|
|
198
247
|
}
|
|
199
248
|
process.exit(1);
|
|
200
249
|
}
|
|
250
|
+
function resolveCompareDir(ref, currentDir) {
|
|
251
|
+
if (existsSync(ref)) return { dir: ref, cleanup: () => void 0 };
|
|
252
|
+
const git = (args) => execFileSync("git", args, { stdio: ["ignore", "pipe", "ignore"] });
|
|
253
|
+
const repoRoot = git(["-C", currentDir, "rev-parse", "--show-toplevel"]).toString().trim();
|
|
254
|
+
const rel = relative(repoRoot, resolve$1(currentDir));
|
|
255
|
+
const wt = mkdtempSync(join(tmpdir(), "weft-compare-wt-"));
|
|
256
|
+
git(["-C", repoRoot, "worktree", "add", "--detach", wt, ref]);
|
|
257
|
+
return {
|
|
258
|
+
dir: join(wt, rel),
|
|
259
|
+
cleanup: () => {
|
|
260
|
+
try {
|
|
261
|
+
git(["-C", repoRoot, "worktree", "remove", "--force", wt]);
|
|
262
|
+
} catch {
|
|
263
|
+
}
|
|
264
|
+
rmSync(wt, { recursive: true, force: true });
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
201
268
|
var initCmd = defineCommand({
|
|
202
269
|
meta: { name: "init", description: "Scaffold a new plugin (weft.yaml + a sample skill)" },
|
|
203
270
|
args: {
|
|
@@ -252,20 +319,39 @@ var buildCmd = defineCommand({
|
|
|
252
319
|
description: "Local dir, or a remote ref (github:/npm:/owner/repo, optional //subdir)"
|
|
253
320
|
},
|
|
254
321
|
out: { type: "string", default: ".weft-out", description: "Output directory" },
|
|
255
|
-
target: { type: "string", description: "Comma-separated targets (default: all registered)" }
|
|
322
|
+
target: { type: "string", description: "Comma-separated targets (default: all registered)" },
|
|
323
|
+
bare: {
|
|
324
|
+
type: "boolean",
|
|
325
|
+
description: "Write straight to --out without the <target>/ subdir (one --target only); e.g. `--target claude --out . --bare` makes a repo root a Claude marketplace"
|
|
326
|
+
},
|
|
327
|
+
check: {
|
|
328
|
+
type: "boolean",
|
|
329
|
+
description: "Verify --out is already up to date with a fresh compile instead of writing (exit 1 on drift); the CI guard for a committed `--out . --bare` marketplace. Does not detect orphaned files."
|
|
330
|
+
}
|
|
256
331
|
},
|
|
257
332
|
async run({ args }) {
|
|
258
333
|
try {
|
|
259
334
|
const registry = buildRegistry();
|
|
260
335
|
const targets = parseTargets(args.target);
|
|
336
|
+
if (args.bare && targets?.length !== 1) {
|
|
337
|
+
log.error("--bare requires exactly one --target (e.g. --target claude)");
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
const check = Boolean(args.check);
|
|
261
341
|
const { dir } = await resolveSourceDir(args.dir, process.cwd());
|
|
262
342
|
if (hasMarketplaceManifest(dir)) {
|
|
263
|
-
const { marketplace, plugins, written: written2 } = await buildMarketplace({
|
|
343
|
+
const { marketplace, plugins, written: written2, drift: drift2 } = await buildMarketplace({
|
|
264
344
|
marketplaceDir: dir,
|
|
265
345
|
outDir: args.out,
|
|
266
346
|
registry,
|
|
267
|
-
targets
|
|
347
|
+
targets,
|
|
348
|
+
bare: Boolean(args.bare),
|
|
349
|
+
check
|
|
268
350
|
});
|
|
351
|
+
if (drift2) {
|
|
352
|
+
reportDrift(drift2, args.out);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
269
355
|
log.data({
|
|
270
356
|
marketplace: marketplace.name,
|
|
271
357
|
plugins: plugins.length,
|
|
@@ -278,13 +364,19 @@ var buildCmd = defineCommand({
|
|
|
278
364
|
for (const [t, n] of countByTarget(written2)) log.info(` ${t}: ${n} files`);
|
|
279
365
|
return;
|
|
280
366
|
}
|
|
281
|
-
const { result, written } = await build({
|
|
367
|
+
const { result, written, drift } = await build({
|
|
282
368
|
pluginDir: dir,
|
|
283
369
|
outDir: args.out,
|
|
284
370
|
registry,
|
|
285
|
-
targets
|
|
371
|
+
targets,
|
|
372
|
+
bare: Boolean(args.bare),
|
|
373
|
+
check
|
|
286
374
|
});
|
|
287
375
|
if (result.diagnostics.items.length > 0) printDiagnostics(result.diagnostics.items);
|
|
376
|
+
if (drift) {
|
|
377
|
+
reportDrift(drift, args.out);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
288
380
|
log.data({ id: result.id, out: args.out, files: Object.fromEntries(countByTarget(written)) });
|
|
289
381
|
log.info(`Built ${result.id} -> ${args.out}/`);
|
|
290
382
|
for (const [t, n] of countByTarget(written)) {
|
|
@@ -437,7 +529,11 @@ var evalCmd = defineCommand({
|
|
|
437
529
|
args: {
|
|
438
530
|
dir: { type: "positional", required: false, default: ".", description: "Plugin directory" },
|
|
439
531
|
component: { type: "string", description: "Only eval this component leaf name" },
|
|
440
|
-
harness: { type: "string", description: "Restrict to these harnesses (comma-separated)" }
|
|
532
|
+
harness: { type: "string", description: "Restrict to these harnesses (comma-separated)" },
|
|
533
|
+
compare: {
|
|
534
|
+
type: "string",
|
|
535
|
+
description: "Vibes A/B: run each case against this git ref (or dir) and the working tree, side by side"
|
|
536
|
+
}
|
|
441
537
|
},
|
|
442
538
|
async run({ args }) {
|
|
443
539
|
try {
|
|
@@ -451,14 +547,30 @@ var evalCmd = defineCommand({
|
|
|
451
547
|
return;
|
|
452
548
|
}
|
|
453
549
|
const onlyHarness = parseTargets(args.harness);
|
|
550
|
+
const filterHarnesses = (ef) => onlyHarness ? { ...ef, harnesses: ef.harnesses.filter((h) => onlyHarness.includes(h)) } : ef;
|
|
551
|
+
if (args.compare) {
|
|
552
|
+
const { dir: beforeDir, cleanup } = resolveCompareDir(args.compare, args.dir);
|
|
553
|
+
try {
|
|
554
|
+
for (const d of discovered) {
|
|
555
|
+
const reports = await compareVersions({
|
|
556
|
+
evalFile: filterHarnesses(d.evalFile),
|
|
557
|
+
componentLeaf: d.componentLeaf,
|
|
558
|
+
beforeDir,
|
|
559
|
+
afterDir: args.dir,
|
|
560
|
+
registry,
|
|
561
|
+
drivers: drivers2
|
|
562
|
+
});
|
|
563
|
+
printComparison(d.componentLeaf, args.compare, reports);
|
|
564
|
+
}
|
|
565
|
+
} finally {
|
|
566
|
+
cleanup();
|
|
567
|
+
}
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
454
570
|
let anyFail = false;
|
|
455
571
|
for (const d of discovered) {
|
|
456
|
-
const evalFile = onlyHarness ? {
|
|
457
|
-
...d.evalFile,
|
|
458
|
-
harnesses: d.evalFile.harnesses.filter((h) => onlyHarness.includes(h))
|
|
459
|
-
} : d.evalFile;
|
|
460
572
|
const report = await runEval({
|
|
461
|
-
evalFile,
|
|
573
|
+
evalFile: filterHarnesses(d.evalFile),
|
|
462
574
|
pluginDir: args.dir,
|
|
463
575
|
componentLeaf: d.componentLeaf,
|
|
464
576
|
registry,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;;;;;;;;AAIA,eAAe,QAAW,CAAA,EAA8B;AACtD,EAAA,OAAO,OAAO,CAAA,KAAM,UAAA,GAAa,MAAO,GAA2B,GAAI,CAAA;AACzE;AAOA,eAAsB,mBAAmBA,KAAAA,EAAmC;AAC1E,EAAA,MAAM,GAAA,GAAgB;AAAA,IACpB,sBAAA;AAAA,IACA,EAAA;AAAA,IACA,4EAAA;AAAA,IACA,EAAA;AAAA,IACA,WAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA;AAAA,IAAA,CACC,MAAM,WAAA,CAAYA,KAAI,CAAA,EAAG,IAAA,EAAK;AAAA,IAC/B,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,GAAOA,MAAK,WAAA,GAAc,MAAM,QAAQA,KAAAA,CAAK,WAAW,IAAI,EAAC;AACnE,EAAA,KAAA,MAAW,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAK,EAAG;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAA2B,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,IAAI,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAClC,IAAA,IAAI,MAAM,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,aAAuB,EAAE,CAAA;AAC9D,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAA,CAAQ,MAAM,WAAA,CAAY,GAAA,EAAKA,KAAI,CAAA,EAAG,IAAA,EAAK,EAAG,KAAA,EAAO,EAAE,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC1B;;;AC7BA,IAAM,IAAA,GAA8B,EAAE,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAE3E,SAAS,cAAc,IAAA,EAAwB;AAC7C,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,SAAU,IAAA,CAAK,KAAA;AACzC,EAAA,IAAI,IAAA,CAAK,SAAS,SAAS,CAAA,IAAK,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA;AACjE,EAAA,IAAI,IAAA,CAAK,SAAS,WAAW,CAAA,IAAK,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA;AACnE,EAAA,OAAO,IAAA,CAAK,IAAA;AACd;AAEA,IAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAC7C,IAAM,SAAA,GAAY,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA;AAE5C,SAAS,IAAA,CAAK,OAAc,OAAA,EAAuB;AACjD,EAAA,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,SAAA,EAAW;AAE7B,EAAA,IAAI,UAAU,OAAA,IAAW,KAAA,KAAU,MAAA,EAAQ,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,OAE3D,OAAA,CAAQ,IAAI,OAAO,CAAA;AAC1B;AAEO,IAAM,GAAA,GAAM;AAAA;AAAA,EAEjB,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,CAAC,OAAA,KAA0B,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EACvD,IAAA,EAAM,CAAC,OAAA,KAA0B,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,EACrD,IAAA,EAAM,CAAC,OAAA,KAA0B,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,EACrD,KAAA,EAAO,CAAC,OAAA,KAA0B,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA;AAAA,EAEvD,IAAA,EAAM,CAAC,GAAA,KAAuB;AAE5B,IAAA,IAAI,QAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAC7C;AACF,CAAA;ACzBO,SAAS,aAAA,GAAiC;AAC/C,EAAA,OAAO,IAAI,eAAA,EAAgB,CACxB,QAAA,CAAS,aAAa,EACtB,QAAA,CAAS,YAAY,CAAA,CACrB,QAAA,CAAS,aAAa,CAAA,CACtB,QAAA,CAAS,cAAc,CAAA,CACvB,SAAS,eAAe,CAAA;AAC7B;AAGO,SAAS,UAAA,GAA4C;AAC1D,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,UAAU,KAAA,EAAiD;AACzE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AACpC;AAGO,SAAS,aAAa,KAAA,EAAiD;AAC5E,EAAA,OAAO,UAAU,KAAK,CAAA;AACxB;;;ACtCO,SAAS,iBAAiB,CAAA,EAAuB;AACtD,EAAA,MAAM,GAAA,GAAM,EAAE,QAAA,KAAa,OAAA,GAAU,UAAU,CAAA,CAAE,QAAA,KAAa,YAAY,MAAA,GAAS,MAAA;AACnF,EAAA,MAAM,QAAQ,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,CAAA,GAAO,EAAA;AACzC,EAAA,OAAO,CAAA,EAAA,EAAK,IAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,CAAA;AAChD;AAEO,SAAS,iBAAiB,KAAA,EAA2B;AAC1D,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,iBAAiB,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,QAAA,KAAa,OAAA,EAAS,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,SACrC,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACpB;AACF;AAOO,SAAS,kBAAkB,MAAA,EAA6B;AAC7D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAA,CAAO,EAAA;AAE1B,EAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAC1B,EAAA,GAAA,CAAI,IAAA,CAAK;AAAA,kBAAA,EAAuB,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAC7D,EAAA,GAAA,CAAI,IAAA,CAAK,gBAAgB,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,cAAA,CAAgB,CAAA;AAErF,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAA,EAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAC5E,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,MAAA,CAAO,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5E,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,IAAW,MAAM,CAAA,CAAE,CAAA;AAE7C,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,MAC1C,CAAA,CAAE,SAAA,CACC,OAAO,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,UAAU,EACnC,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,CAAE;AAAA,GACnD;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,WAAA,CAAY,SAAS,CAAA,GACjB,CAAA,iCAAA,EAAoC,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAC1D;AAAA,GACN;AAEA,EAAA,GAAA,CAAI,KAAK,CAAA,6BAAA,EAAgC,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,CAAC,CAAA,CAAE,CAAA;AACjE,EAAA,GAAA,CAAI,KAAK,iEAAiE,CAAA;AAC5E;AAGO,SAAS,gBAAgB,MAAA,EAA0B;AACxD,EAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AACf,EAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MAAA,EAAW,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AACtC,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,SAAA,EAAW;AAChC,IAAA,IAAI,CAAA,CAAE,WAAW,UAAA,EAAY;AAC3B,MAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,YAAA,EAAe,CAAA,CAAE,MAAM,CAAA,CAAA,CAAG,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,IAAA,GAAO,MAAA,GAAS,MAAM,CAAA,CAAE,CAAA;AACtD,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,KAAA,EAAO;AACvB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,IAAA,GAAO,MAAA,GAAS,MAAM,CAAA,CAAE,CAAA;AACvD,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,UAAA,EAAY;AAC5B,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AACF;ACpDA,SAAS,MAAM,CAAA,EAAmB;AAChC,EAAA,OACE,CAAA,CACG,WAAA,EAAY,CACZ,OAAA,CAAQ,cAAA,EAAgB,GAAG,CAAA,CAC3B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,IAAK,WAAA;AAElC;AAGO,SAAS,eAAe,IAAA,EAAuC;AACpE,EAAA,MAAM,GAAA,GAAMC,SAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAElC,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAC1C,EAAA,IAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,YAAY,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,GAAG,CAAC,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,aAAA;AACpC,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,QAAA,GAAW,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA,aAAA,EAIjB,SAAS;AAAA;AAAA;AAAA;AAAA,CAAA;AAKtB,EAAA,aAAA,CAAc,cAAc,QAAQ,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,YAAY,CAAC,CAAA;AAEtC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA;AAC5C,EAAA,SAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAOhB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAC3C,EAAA,aAAA,CAAc,WAAW,OAAO,CAAA;AAChC,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,SAAS,CAAC,CAAA;AAEnC,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAM;AAC5B;;;ACzBA,eAAe,cACb,SAAA,EACmD;AACnD,EAAA,MAAMC,WAAU,UAAA,EAAW;AAC3B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,IAAI,MAAMA,SAAQ,CAAC,CAAA,EAAG,WAAU,EAAG,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,SAC5C,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAEA,SAAS,cAAc,OAAA,EAAoD;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,MAAA,EAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAC7E,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,KAAK,GAAA,EAAqB;AACjC,EAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,IAAA,GAAA,CAAI,KAAA,CAAM;AAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AAC7B,IAAA,gBAAA,CAAiB,IAAI,WAAW,CAAA;AAAA,EAClC,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,KAAA,CAAM;AAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,EACzC;AACA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB;AAEA,IAAM,UAAU,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,oDAAA,EAAqD;AAAA,EACxF,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,kBAAA,EAAmB;AAAA,IAC1F,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0BAAA,EAA2B;AAAA,IAChE,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sCAAA;AAAuC,GACnF;AAAA,EACA,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AACZ,IAAA,MAAM,UAAU,cAAA,CAAe;AAAA,MAC7B,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,mBAAA,EAAsB,OAAA,CAAQ,IAAI,CAAA,KAAA,EAAQ,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AAChE,IAAA,KAAA,MAAW,KAAK,OAAA,CAAQ,KAAA,MAAW,IAAA,CAAK,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,oBAAA,EAAyB,IAAA,CAAK,GAAG,CAAA,eAAA,EAAkB,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EACxE;AACF,CAAC,CAAA;AAED,IAAM,cAAc,aAAA,CAAc;AAAA,EAChC,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA,EAAY,aAAa,gDAAA,EAAiD;AAAA,EACxF,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,kBAAA;AAAmB,GAC5F;AAAA,EACA,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,MAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAA,CAAO,WAAA;AACpC,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,gBAAA,CAAiB,KAAK,CAAA;AAC5C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,GAAA,CAAI,KAAA,CAAM;AAAA,EAAK,MAAA,CAAO,EAAE,CAAA,SAAA,CAAW,CAAA;AACnC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,CAAA;AACpF,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAA,CAAO,EAAE,YAAY,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IAChF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,WAAW,aAAA,CAAc;AAAA,EAC7B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,WAAA,EAAa,aAAa,kBAAA,EAAmB;AAAA,IAC7E,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mDAAA;AAAoD,GAC7F;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,EAAc;AAC/B,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAGxC,MAAA,MAAM,EAAE,KAAI,GAAI,MAAM,iBAAiB,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAG9D,MAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG;AAC/B,QAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAS,SAAAC,QAAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB;AAAA,UAC/D,cAAA,EAAgB,GAAA;AAAA,UAChB,QAAQ,IAAA,CAAK,GAAA;AAAA,UACb,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,aAAa,WAAA,CAAY,IAAA;AAAA,UACzB,SAAS,OAAA,CAAQ,MAAA;AAAA,UACjB,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAA,EAAO,MAAA,CAAO,WAAA,CAAY,aAAA,CAAcA,QAAO,CAAC;AAAA,SACjD,CAAA;AACD,QAAA,GAAA,CAAI,IAAA;AAAA,UACF,CAAA,kBAAA,EAAqB,YAAY,IAAI,CAAA,EAAA,EAAK,QAAQ,MAAM,CAAA,aAAA,EAAgB,KAAK,GAAG,CAAA,CAAA;AAAA,SAClF;AACA,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,aAAA,CAAcA,QAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,MAAA,CAAQ,CAAA;AAC1E,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAM,KAAA,CAAM;AAAA,QACtC,SAAA,EAAW,GAAA;AAAA,QACX,QAAQ,IAAA,CAAK,GAAA;AAAA,QACb,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,IAAI,MAAA,CAAO,YAAY,KAAA,CAAM,MAAA,GAAS,GAAG,gBAAA,CAAiB,MAAA,CAAO,YAAY,KAAK,CAAA;AAClF,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,MAAA,CAAO,IAAI,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,OAAO,WAAA,CAAY,aAAA,CAAc,OAAO,CAAC,GAAG,CAAA;AAC5F,MAAA,GAAA,CAAI,KAAK,CAAA,MAAA,EAAS,MAAA,CAAO,EAAE,CAAA,IAAA,EAAO,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC7C,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,aAAA,CAAc,OAAO,CAAA,EAAG;AAC3C,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,sBAAsB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MAC7D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,aAAa,aAAA,CAAc;AAAA,EAC/B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,SAAA,EAAW,aAAa,gBAAA,EAAiB;AAAA,IAC3E,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mDAAA,EAAoD;AAAA,IAC3F,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yDAAA;AAA0D,GAChG;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,EAAc;AAC/B,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,SAAA;AAChD,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,MAAM,KAAK,QAAA,CAAS,OAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAGpC,MAAA,IAAI,OAAA,GAAU,SAAA;AACd,MAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,QAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,MAAM,cAAc,SAAS,CAAA;AAC1D,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,CAAC,CAAA,sBAAA,CAAwB,CAAA;AACxE,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,GAAA,CAAI,MAAM,+DAA+D,CAAA;AACzE,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,OAAA,GAAU,OAAA;AAAA,MACZ;AAIA,MAAA,MAAM,EAAE,KAAI,GAAI,MAAM,iBAAiB,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAG9D,MAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG;AAC/B,QAAA,MAAM,EAAA,GAAK,MAAM,kBAAA,CAAmB;AAAA,UAClC,cAAA,EAAgB,GAAA;AAAA,UAChB,KAAA;AAAA,UACA,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAAA,UAC7B,QAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAI,QAAQ,EAAE,OAAA,EAAS,EAAE,eAAA,EAAiB,KAAA,EAAM,EAAE,GAAI;AAAC,SACxD,CAAA;AACD,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,WAAA,EAAa,GAAG,WAAA,CAAY,IAAA;AAAA,UAC5B,OAAA,EAAS,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,UAC3C,KAAA;AAAA,UACA,UAAU,EAAA,CAAG;AAAA,SACd,CAAA;AACD,QAAA,GAAA,CAAI,IAAA;AAAA,UACF,CAAA,sBAAA,EAAyB,GAAG,WAAA,CAAY,IAAI,KAAK,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA;AAAA,SACvF;AACA,QAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,UAAA,GAAA,CAAI,IAAA;AAAA,YACF,CAAA,EAAA,EAAK,CAAA,CAAE,MAAA,CAAO,EAAE,IAAI,CAAA,CAAE,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,CAAA,CAAE,KAAA,CAAM,UAAU,MAAM,CAAA,UAAA;AAAA,WAC7E;AAAA,QACF;AACA,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,YAAA,EAAe,EAAA,CAAG,QAAQ,CAAA,CAAE,CAAA;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ;AAAA,QAC3B,SAAA,EAAW,GAAA;AAAA,QACX,KAAA;AAAA,QACA,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAAA,QAC7B,QAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,QACzB,GAAI,QAAQ,EAAE,OAAA,EAAS,EAAE,eAAA,EAAiB,KAAA,EAAM,EAAE,GAAI;AAAC,OACxD,CAAA;AACD,MAAA,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAC/B,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,EAAA,EAAI,OAAO,MAAA,CAAO,EAAA;AAAA,QAClB,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,OAAA;AAAA,QACjC,KAAA;AAAA,QACA,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,MAAA;AAAA,QAClC,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AACtF,MAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAC9D,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACtC,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA;AAC5E,QAAA,GAAA,CAAI,IAAA;AAAA,UACF,CAAA,UAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,SAAA,CAAA,IACxC,MAAA,CAAO,OAAA,CAAQ,IAAA,GAAO,CAAA,IAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,aAAA,CAAA,GAAkB,EAAA,CAAA,IAClE,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,WAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAAA,SACjF;AAAA,MACF;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,YAAY,aAAA,CAAc;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,kBAAA,EAAmB;AAAA,IAC1F,OAAO,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,SAAA,EAAW,aAAa,gBAAA,EAAiB;AAAA,IAC3E,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mDAAA,EAAoD;AAAA,IAC3F,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yDAAA;AAA0D,GAChG;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,SAAA;AAChD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAGpC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,GAAG,CAAC,CAAA;AACjD,MAAA,MAAM,aAAA,GAAgB,IAAA,GACjB,CAAC,GAAG,IAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,GACjD,KAAA,CAAA;AACJ,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,QAC1B,WAAW,IAAA,CAAK,GAAA;AAAA,QAChB,KAAA;AAAA,QACA,GAAA;AAAA,QACA,UAAU,aAAA,EAAc;AAAA,QACxB,OAAA,EAAS,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,IAAK;AAAA,OACvC,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,MAAA,CAAO,IAAI,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AACnD,MAAA,GAAA,CAAI,IAAA,CAAK,WAAW,MAAA,CAAO,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,oBAAA,CAAsB,CAAA;AAC7E,MAAA,KAAA,MAAW,KAAK,MAAA,CAAO,OAAA,MAAa,IAAA,CAAK,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACrD,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,UAAU,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,kBAAA,EAAmB;AAAA,IAC1F,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,oCAAA,EAAqC;AAAA,IAC/E,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+CAAA;AAAgD,GAC1F;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,EAAc;AAC/B,MAAA,MAAMD,WAAU,UAAA,EAAW;AAC3B,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA;AAAA,QACzC,CAAC,CAAA,KAAM,CAAC,KAAK,SAAA,IAAa,CAAA,CAAE,kBAAkB,IAAA,CAAK;AAAA,OACrD;AACA,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,GAAA,CAAI,KAAK,+DAA+D,CAAA;AACxE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAC7C,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,WAAW,WAAA,GACb;AAAA,UACE,GAAG,CAAA,CAAE,QAAA;AAAA,UACL,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC;AAAA,YAEvE,CAAA,CAAE,QAAA;AACN,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ;AAAA,UAC3B,QAAA;AAAA,UACA,WAAW,IAAA,CAAK,GAAA;AAAA,UAChB,eAAe,CAAA,CAAE,aAAA;AAAA,UACjB,QAAA;AAAA,UACA,OAAA,EAAAA;AAAA,SACD,CAAA;AACD,QAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,QAAA,IAAI,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,QAAA,IAAY,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG,OAAA,GAAU,IAAA;AAAA,MAChF;AACA,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,aAAa,aAAA,CAAc;AAAA,EAC/B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,kBAAA,EAAmB;AAAA,IAC1F,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK;AAAA,QACvC,UAAU,aAAA,EAAc;AAAA,QACxB,SAAS,UAAA,EAAW;AAAA,QACpB,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,QAAQ;AAAA,OAChC,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,OAAO,GAAA,CAAI,WAAA;AAAA,QACX,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA;AAAA,QACpB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,iBAAiB,GAAA,CAAI;AAAA,OACtB,CAAA;AACD,MAAA,GAAA,CAAI,KAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAClD,MAAA,IAAI,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,gBAAA,CAAiB,IAAI,WAAW,CAAA;AAChE,MAAA,GAAA,CAAI,KAAK,CAAA,SAAA,EAAY,GAAA,CAAI,WAAA,GAAc,KAAA,GAAQ,IAAI,CAAA,CAAE,CAAA;AACrD,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,QAAA,EAAW,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,OAAA,GAAU,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,WAAA,CAAa,CAAA,CAAE,CAAA;AACzF,MAAA,GAAA,CAAI,IAAA,CAAK,aAAa,GAAA,CAAI,MAAA,CAAO,KAAK,IAAI,CAAA,IAAK,MAAM,CAAA,CAAE,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,CAAK,uBAAuB,GAAA,CAAI,eAAA,CAAgB,KAAK,IAAI,CAAA,IAAK,MAAM,CAAA,CAAE,CAAA;AAC1E,MAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,WAAA,EAAa,eAAA,CAAgB,CAAC,CAAA;AAClD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,GAAA,CAAI,MAAM,mDAAmD,CAAA;AAC7D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,GAAA,CAAI,KAAK,wBAAwB,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,UAAU,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EACE;AAAA,GACJ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,GAAA,CAAI,MAAM,+CAA+C,CAAA;AACzD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,OAAA,GAAUE,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,MAAAC,SAAAA,CAAU,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AACtC,MAAAC,aAAAA,CAAcF,IAAAA,CAAK,OAAA,EAAS,YAAY,GAAG,KAAK,CAAA;AAChD,MAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AAE3C,MAAA,IAAI,UAAA;AACJ,MAAA,IAAIG,UAAAA,CAAW,OAAO,CAAA,EAAG;AACvB,QAAA,UAAA,GAAa,gBAAA,CAAiB,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,MAAM,OAAO,mBAAA,EAAoB;AACjC,QAAA,UAAA,GAAa,IAAA,CAAK,UAAA;AAClB,QAAAD,aAAAA,CAAc,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,CAAC,CAAA;AAC/E,QAAAA,aAAAA;AAAA,UACEF,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA;AAAA,UACzB,IAAA,CAAK,UAAU,MAAA,CAAO,EAAE,MAAM,MAAA,EAAQ,MAAA,EAAQ,OAAO;AAAA,SACvD;AAAA,MACF;AACA,MAAAE,aAAAA,CAAcF,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,UAAU,GAAG,CAAA,EAAG,QAAA,CAAS,IAAA,EAAM,UAAU,CAAC;AAAA,CAAI,CAAA;AAC3E,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,mEAAA;AAAA,OACjC;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,YAAY,aAAA,CAAc;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,GAAA,CAAI,MAAM,oBAAoB,CAAA;AAC9B,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,GAAA,GAAM,aAAaA,IAAAA,CAAK,IAAA,CAAK,KAAK,UAAU,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,EAAK;AAClE,MAAA,MAAM,SAAA,GAAY,gBAAgB,YAAA,CAAaA,IAAAA,CAAK,KAAK,GAAA,EAAK,UAAU,CAAC,CAAC,CAAA;AAC1E,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAG,CAAA;AAChD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,cAAA,EAAgB,GAAA,CAAI,gBAAgB,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA;AACvE,MAAA,GAAA,CAAI,KAAK,CAAA,WAAA,EAAc,GAAA,CAAI,cAAA,GAAiB,OAAA,GAAU,SAAS,CAAA,CAAE,CAAA;AACjE,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,oBAAA,EAAuB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACrD,MAAA,KAAA,MAAW,KAAK,GAAA,CAAI,QAAA,MAAc,IAAA,CAAK,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AACjD,MAAA,IAAI,CAAC,IAAI,cAAA,IAAkB,GAAA,CAAI,SAAS,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAClE,MAAA,GAAA,CAAI,KAAK,wBAAwB,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,WAAW,aAAA,CAAc;AAAA,EAC7B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,oBAAA,EAAqB;AAAA,IAC5F,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,YAAA,EAAc,aAAa,mBAAA,EAAoB;AAAA,IAC/E,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,6CAAA;AAA8C,GAC1F;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAe,IAAA,CAAK,CAAA,IAA8B,EAAC;AACzD,MAAA,MAAM,OAAO,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,CAAC,GAAG,CAAA;AACxD,MAAA,IAAI,KAAA,GAAQ,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAC1C,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,UAAU,MAAM,gBAAA,CAAiB,EAAE,KAAA,EAAO,IAAI,CAAA;AACpD,QAAA,KAAA,GAAQ,SAAS,KAAA,EAAO,OAAA,EAAA,qBAAa,IAAA,EAAK,EAAE,aAAa,CAAA;AAAA,MAC3D;AACA,MAAAE,aAAAA,CAAc,IAAA,CAAK,GAAA,EAAK,cAAA,CAAe,KAAK,CAAC,CAAA;AAC7C,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,GAAW,CAAA,YAAA,EAAe,MAAM,SAAA,EAAW,MAAA,IAAU,CAAC,CAAA,UAAA,CAAA,GAAe,EAAA;AACtF,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,QACvB,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,MAAA,IAAU,CAAA;AAAA,QACtC,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,MAAM,WAAW,GAAG,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,IAC/E,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,YAAY,aAAA,CAAc;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAM,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,QAAA,EAAU,aAAa,uBAAA,EAAwB;AAAA,IAChF,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,UAAA,EAAY,aAAa,kBAAA,EAAmB;AAAA,IAC5E,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,aAAA,EAAc,CAAE,GAAA,CAAI,KAAK,IAAc,CAAA;AACvD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,GAAA,CAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AACjD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,MAAM,kBAAA,CAAmB;AAAA,QAC7B,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,OAAA;AAAA,QACA,QAAQ,IAAA,CAAK,GAAA;AAAA,QACb,GAAI,KAAK,SAAA,GAAY,EAAE,WAAW,IAAA,CAAK,SAAA,KAAc;AAAC,OACvD,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,UAAU,GAAA,CAAI,YAAA;AAAA,QACd,KAAK,GAAA,CAAI,MAAA;AAAA,QACT,GAAI,IAAI,IAAA,KAAS,QAAA,GAAW,EAAE,KAAA,EAAO,GAAA,CAAI,SAAA,EAAU,GAAI;AAAC,OACzD,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,SAAA,EAAY,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,IAAI,IAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,YAAY,CAAA,CAAE,CAAA;AACpE,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,GAAA,CAAI,SAAS,CAAA,kBAAA,CAAoB,CAAA;AAC1E,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,eAAe,aAAA,CAAc;AAAA,EACjC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,SAAA,EAAW,aAAa,gBAAA,EAAiB;AAAA,IAC3E,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,SAAA;AAGhD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,GAAA,GAAM,eAAA,CAAgB,OAAO,OAAA,CAAQ,GAAA,EAAK,CAAA,GAAI,IAAA,CAAK,GAAA;AAC5E,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,EAAE,GAAA,EAAK,GAAI,IAAA,CAAK,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,IAAK,CAAA;AAC9E,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,OAAA,EAAS,GAAA,CAAI,SAAS,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,CAAK,eAAe,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IAC3F,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,UAAU,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,MAAM,GAAA,CAAI,EAAE,IAAA,EAAK,EAAG;AAClB,IAAA,MAAM,EAAA,GAAK,MAAM,kBAAA,CAAmB,IAAI,CAAA;AACxC,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAAA,aAAAA,CAAc,IAAA,CAAK,GAAA,EAAK,EAAE,CAAA;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,IACzB;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAM,OAAO,aAAA,CAAc;AAAA,EACzB,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,YAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,UAAA;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAED,OAAA,CAAQ,IAAI,CAAA","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 Weft applies to manifests, applied to its own CLI.\n */\nexport async function renderCliReference(main: CommandDef): Promise<string> {\n const out: string[] = [\n \"# Weft CLI reference\",\n \"\",\n \"_Generated from the CLI definition by `weft docs` -- do not edit by hand._\",\n \"\",\n \"## `weft`\",\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(`## \\`weft ${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/weft-adapter-claude\";\nimport codexAdapter from \"@michaelfromyeg/weft-adapter-codex\";\nimport copilotAdapter from \"@michaelfromyeg/weft-adapter-copilot\";\nimport cursorAdapter from \"@michaelfromyeg/weft-adapter-cursor\";\nimport type { HarnessDriver } from \"@michaelfromyeg/weft-adapter-kit\";\nimport opencodeAdapter from \"@michaelfromyeg/weft-adapter-opencode\";\nimport { AdapterRegistry } from \"@michaelfromyeg/weft-core\";\nimport { drivers } from \"@michaelfromyeg/weft-eval\";\nimport type { Target } from \"@michaelfromyeg/weft-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/weft-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/weft-core\";\nimport type { EvalReport } from \"@michaelfromyeg/weft-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: weft.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, \"weft.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 weftYaml = `name: ${name}\nversion: 0.1.0\nowner:\n name: Your Name\n namespace: ${namespace}\ndescription: A Weft plugin.\ncomponents:\n - skill: skills/hello\n`;\n writeFileSync(manifestPath, weftYaml);\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 WEFT_VERSION,\n lint,\n lockDirForScope,\n readLock,\n resolveSourceDir,\n signLock,\n uninstall,\n update,\n verifyArtifacts,\n} from \"@michaelfromyeg/weft-core\";\nimport { discoverEvals, runEval } from \"@michaelfromyeg/weft-eval\";\nimport {\n federate,\n fetchMcpRegistry,\n indexFromPluginDirs,\n publishCheck,\n serializeIndex,\n} from \"@michaelfromyeg/weft-index\";\nimport type { Scope, Target } from \"@michaelfromyeg/weft-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 (weft.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: weft validate ${args.dir} && weft 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: \".weft-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 weft.lock's artifact set (ed25519) -> weft.sig + weft.pub (the signed badge)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with weft.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n log.error(\"no weft.lock found (run `weft install` first)\");\n process.exit(1);\n }\n const weftDir = join(args.dir, \".weft\");\n mkdirSync(weftDir, { recursive: true });\n writeFileSync(join(weftDir, \".gitignore\"), \"*\\n\");\n const keyPath = join(weftDir, \"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, \"weft.pub\"),\n keys.publicKey.export({ type: \"spki\", format: \"pem\" }),\n );\n }\n writeFileSync(join(args.dir, \"weft.sig\"), `${signLock(lock, privateKey)}\\n`);\n log.info(\n `Signed ${lock.artifacts.length} artifacts -> weft.sig (key kept in .weft/, public key in weft.pub)`,\n );\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst verifyCmd = defineCommand({\n meta: {\n name: \"verify\",\n description: \"Verify weft.sig against weft.lock and the on-disk artifacts\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with weft.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n log.error(\"no weft.lock found\");\n process.exit(1);\n }\n const sig = readFileSync(join(args.dir, \"weft.sig\"), \"utf8\").trim();\n const publicKey = createPublicKey(readFileSync(join(args.dir, \"weft.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 Weft 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: weft 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 weft.lock)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Install target holding weft.lock (default: derived from --scope)\",\n },\n scope: { type: \"string\", default: \"project\", description: \"user | project\" },\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 scope = (args.scope === \"user\" ? \"user\" : \"project\") as Scope;\n // An explicit dir wins; otherwise read the lock from the scope's target\n // (the project cwd for project scope, ~/.weft for user scope).\n const dir = args.dir === \".\" ? lockDirForScope(scope, process.cwd()) : args.dir;\n const res = uninstall({ 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: \"weft\",\n version: WEFT_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","existsSync","relative","join","written","drift","mkdirSync","writeFileSync"],"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 Weft applies to manifests, applied to its own CLI.\n */\nexport async function renderCliReference(main: CommandDef): Promise<string> {\n const out: string[] = [\n \"# Weft CLI reference\",\n \"\",\n \"_Generated from the CLI definition by `weft docs` -- do not edit by hand._\",\n \"\",\n \"## `weft`\",\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(`## \\`weft ${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/weft-adapter-claude\";\nimport codexAdapter from \"@michaelfromyeg/weft-adapter-codex\";\nimport copilotAdapter from \"@michaelfromyeg/weft-adapter-copilot\";\nimport cursorAdapter from \"@michaelfromyeg/weft-adapter-cursor\";\nimport { genericSkillsAdapter, type HarnessDriver } from \"@michaelfromyeg/weft-adapter-kit\";\nimport opencodeAdapter from \"@michaelfromyeg/weft-adapter-opencode\";\nimport { AdapterRegistry } from \"@michaelfromyeg/weft-core\";\nimport { drivers } from \"@michaelfromyeg/weft-eval\";\nimport type { Target } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * Skills-only harnesses that load SKILL.md from a `<root>/skills/` directory\n * convention. One generic adapter each; add a row to support another.\n */\nconst GENERIC_AGENTS = [\n { target: \"zed\", projectRoot: \".agents\", globalRoot: \"~/.agents\" },\n { target: \"gemini\", projectRoot: \".agents\", globalRoot: \"~/.gemini\" },\n { target: \"amp\", projectRoot: \".agents\", globalRoot: \"~/.config/agents\" },\n { target: \"aider\", projectRoot: \".aider-desk\", globalRoot: \"~/.aider-desk\" },\n] as const;\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. The first\n * five are deep, full-plugin adapters; the rest are generic skills-only ones.\n * Community adapters are added the same way.\n */\nexport function buildRegistry(): AdapterRegistry {\n const registry = new AdapterRegistry()\n .register(claudeAdapter)\n .register(codexAdapter)\n .register(cursorAdapter)\n .register(copilotAdapter)\n .register(opencodeAdapter);\n for (const a of GENERIC_AGENTS) {\n registry.register(genericSkillsAdapter(a));\n }\n return registry;\n}\n\n/** The headless eval drivers, keyed by Target (from @michaelfromyeg/weft-eval). */\nexport function allDrivers(): Partial<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/weft-core\";\nimport type { CompareReport, EvalReport } from \"@michaelfromyeg/weft-eval\";\nimport { log } from \"./logger\";\n\n/** Render the A/B \"vibes\" comparison: each case's before vs after transcript. */\nexport function printComparison(component: string, ref: string, reports: CompareReport[]): void {\n log.data({ component, ref, reports });\n if (reports.length === 0) {\n log.info(`\\n${component}: no runnable harness to compare (all UNTESTED).`);\n return;\n }\n for (const r of reports) {\n for (const c of r.cases) {\n log.info(`\\n=== ${component} :: ${c.name} [${r.harness}] ===`);\n log.info(`prompt: ${c.prompt}`);\n log.info(`\\n--- before (${ref}) ---\\n${c.before.trim() || \"(empty)\"}`);\n log.info(`\\n--- after (working tree) ---\\n${c.after.trim() || \"(empty)\"}`);\n }\n }\n log.info(\"\\n(read the pairs and judge which definition reads better.)\");\n}\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: weft.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, \"weft.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 weftYaml = `name: ${name}\nversion: 0.1.0\nowner:\n name: Your Name\n namespace: ${namespace}\ndescription: A Weft plugin.\ncomponents:\n - skill: skills/hello\n`;\n writeFileSync(manifestPath, weftYaml);\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 { execFileSync } from \"node:child_process\";\nimport { createPrivateKey, createPublicKey } from \"node:crypto\";\nimport { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, relative, resolve } from \"node:path\";\nimport {\n build,\n buildMarketplace,\n CompileError,\n type DriftReport,\n generateSigningKeys,\n hasMarketplaceManifest,\n importNativePlugin,\n install,\n installMarketplace,\n lint,\n lockDirForScope,\n readLock,\n resolveSourceDir,\n signLock,\n uninstall,\n update,\n verifyArtifacts,\n WEFT_VERSION,\n} from \"@michaelfromyeg/weft-core\";\nimport { compareVersions, discoverEvals, runEval } from \"@michaelfromyeg/weft-eval\";\nimport {\n federate,\n fetchMcpRegistry,\n indexFromPluginDirs,\n publishCheck,\n serializeIndex,\n} from \"@michaelfromyeg/weft-index\";\nimport type { Scope, Target } from \"@michaelfromyeg/weft-schema\";\nimport { defineCommand, runMain } from \"citty\";\nimport { renderCliReference } from \"./cli-docs\";\nimport { log } from \"./logger\";\nimport { allDrivers, buildRegistry, parseList, parseTargets } from \"./registry\";\nimport { printComparison, 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\n/** Print a `--check` drift report and exit 1 if `--out` is stale (the CI guard). */\nfunction reportDrift(drift: DriftReport, out: string): void {\n log.data({ check: true, out, ...drift });\n if (drift.clean) {\n log.info(`${out} is up to date (${drift.checked} files)`);\n return;\n }\n for (const p of drift.missing) log.error(` + missing ${p}`);\n for (const p of drift.stale) log.error(` ~ stale ${p}`);\n log.error(\n `\\n${out} is out of date with source (${drift.missing.length} missing, ${drift.stale.length} stale); rerun the same build without --check and commit the result`,\n );\n process.exit(1);\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\n/**\n * Resolve the \"before\" side of a vibes comparison. An existing path is used as the\n * older plugin dir directly; otherwise `ref` is a git ref, checked out into a\n * throwaway worktree (the plugin sits at the same repo-relative path there).\n */\nfunction resolveCompareDir(ref: string, currentDir: string): { dir: string; cleanup: () => void } {\n if (existsSync(ref)) return { dir: ref, cleanup: () => undefined };\n const git = (args: string[]) =>\n execFileSync(\"git\", args, { stdio: [\"ignore\", \"pipe\", \"ignore\"] });\n const repoRoot = git([\"-C\", currentDir, \"rev-parse\", \"--show-toplevel\"]).toString().trim();\n const rel = relative(repoRoot, resolve(currentDir));\n const wt = mkdtempSync(join(tmpdir(), \"weft-compare-wt-\"));\n git([\"-C\", repoRoot, \"worktree\", \"add\", \"--detach\", wt, ref]);\n return {\n dir: join(wt, rel),\n cleanup: () => {\n try {\n git([\"-C\", repoRoot, \"worktree\", \"remove\", \"--force\", wt]);\n } catch {\n /* best effort */\n }\n rmSync(wt, { recursive: true, force: true });\n },\n };\n}\n\nconst initCmd = defineCommand({\n meta: { name: \"init\", description: \"Scaffold a new plugin (weft.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: weft validate ${args.dir} && weft 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: \".weft-out\", description: \"Output directory\" },\n target: { type: \"string\", description: \"Comma-separated targets (default: all registered)\" },\n bare: {\n type: \"boolean\",\n description:\n \"Write straight to --out without the <target>/ subdir (one --target only); e.g. `--target claude --out . --bare` makes a repo root a Claude marketplace\",\n },\n check: {\n type: \"boolean\",\n description:\n \"Verify --out is already up to date with a fresh compile instead of writing (exit 1 on drift); the CI guard for a committed `--out . --bare` marketplace. Does not detect orphaned files.\",\n },\n },\n async run({ args }) {\n try {\n const registry = buildRegistry();\n const targets = parseTargets(args.target);\n if (args.bare && targets?.length !== 1) {\n log.error(\"--bare requires exactly one --target (e.g. --target claude)\");\n process.exit(1);\n }\n const check = Boolean(args.check);\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, drift } = await buildMarketplace({\n marketplaceDir: dir,\n outDir: args.out,\n registry,\n targets,\n bare: Boolean(args.bare),\n check,\n });\n if (drift) {\n reportDrift(drift, args.out);\n return;\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, drift } = await build({\n pluginDir: dir,\n outDir: args.out,\n registry,\n targets,\n bare: Boolean(args.bare),\n check,\n });\n if (result.diagnostics.items.length > 0) printDiagnostics(result.diagnostics.items);\n if (drift) {\n reportDrift(drift, args.out);\n return;\n }\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 compare: {\n type: \"string\",\n description:\n \"Vibes A/B: run each case against this git ref (or dir) and the working tree, side by side\",\n },\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 const filterHarnesses = (ef: (typeof discovered)[number][\"evalFile\"]) =>\n onlyHarness\n ? { ...ef, harnesses: ef.harnesses.filter((h) => onlyHarness.includes(h)) }\n : ef;\n\n // Vibes A/B: render each case's before (a git ref / dir) vs after (working tree).\n if (args.compare) {\n const { dir: beforeDir, cleanup } = resolveCompareDir(args.compare, args.dir);\n try {\n for (const d of discovered) {\n const reports = await compareVersions({\n evalFile: filterHarnesses(d.evalFile),\n componentLeaf: d.componentLeaf,\n beforeDir,\n afterDir: args.dir,\n registry,\n drivers,\n });\n printComparison(d.componentLeaf, args.compare, reports);\n }\n } finally {\n cleanup();\n }\n return;\n }\n\n let anyFail = false;\n for (const d of discovered) {\n const report = await runEval({\n evalFile: filterHarnesses(d.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 weft.lock's artifact set (ed25519) -> weft.sig + weft.pub (the signed badge)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with weft.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n log.error(\"no weft.lock found (run `weft install` first)\");\n process.exit(1);\n }\n const weftDir = join(args.dir, \".weft\");\n mkdirSync(weftDir, { recursive: true });\n writeFileSync(join(weftDir, \".gitignore\"), \"*\\n\");\n const keyPath = join(weftDir, \"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, \"weft.pub\"),\n keys.publicKey.export({ type: \"spki\", format: \"pem\" }),\n );\n }\n writeFileSync(join(args.dir, \"weft.sig\"), `${signLock(lock, privateKey)}\\n`);\n log.info(\n `Signed ${lock.artifacts.length} artifacts -> weft.sig (key kept in .weft/, public key in weft.pub)`,\n );\n } catch (err) {\n fail(err);\n }\n },\n});\n\nconst verifyCmd = defineCommand({\n meta: {\n name: \"verify\",\n description: \"Verify weft.sig against weft.lock and the on-disk artifacts\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Plugin dir with weft.lock\",\n },\n },\n run({ args }) {\n try {\n const lock = readLock(args.dir);\n if (!lock) {\n log.error(\"no weft.lock found\");\n process.exit(1);\n }\n const sig = readFileSync(join(args.dir, \"weft.sig\"), \"utf8\").trim();\n const publicKey = createPublicKey(readFileSync(join(args.dir, \"weft.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 Weft 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: weft 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 weft.lock)\",\n },\n args: {\n dir: {\n type: \"positional\",\n required: false,\n default: \".\",\n description: \"Install target holding weft.lock (default: derived from --scope)\",\n },\n scope: { type: \"string\", default: \"project\", description: \"user | project\" },\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 scope = (args.scope === \"user\" ? \"user\" : \"project\") as Scope;\n // An explicit dir wins; otherwise read the lock from the scope's target\n // (the project cwd for project scope, ~/.weft for user scope).\n const dir = args.dir === \".\" ? lockDirForScope(scope, process.cwd()) : args.dir;\n const res = uninstall({ 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: \"weft\",\n version: WEFT_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/weft-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "The `weft` CLI: a thin shell over @michaelfromyeg/weft-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/weft-adapter-claude": "1.
|
|
16
|
-
"@michaelfromyeg/weft-adapter-codex": "1.
|
|
17
|
-
"@michaelfromyeg/weft-adapter-
|
|
18
|
-
"@michaelfromyeg/weft-adapter-
|
|
19
|
-
"@michaelfromyeg/weft-adapter-
|
|
20
|
-
"@michaelfromyeg/weft-
|
|
21
|
-
"@michaelfromyeg/weft-
|
|
22
|
-
"@michaelfromyeg/weft-
|
|
23
|
-
"@michaelfromyeg/weft-
|
|
24
|
-
"@michaelfromyeg/weft-index": "1.
|
|
15
|
+
"@michaelfromyeg/weft-adapter-claude": "1.2.0",
|
|
16
|
+
"@michaelfromyeg/weft-adapter-codex": "1.2.0",
|
|
17
|
+
"@michaelfromyeg/weft-adapter-copilot": "1.2.0",
|
|
18
|
+
"@michaelfromyeg/weft-adapter-cursor": "1.2.0",
|
|
19
|
+
"@michaelfromyeg/weft-adapter-opencode": "1.2.0",
|
|
20
|
+
"@michaelfromyeg/weft-core": "1.2.0",
|
|
21
|
+
"@michaelfromyeg/weft-adapter-kit": "1.2.0",
|
|
22
|
+
"@michaelfromyeg/weft-schema": "1.2.0",
|
|
23
|
+
"@michaelfromyeg/weft-eval": "1.2.0",
|
|
24
|
+
"@michaelfromyeg/weft-index": "1.2.0"
|
|
25
25
|
},
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"author": "Michael DeMarco",
|