@voltade/volty 0.1.13 → 0.1.15
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/volty.js +67 -25
- package/package.json +1 -1
package/dist/volty.js
CHANGED
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// bin/volty.ts
|
|
4
|
-
import { existsSync as existsSync3, mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as
|
|
4
|
+
import { existsSync as existsSync3, mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "node:fs";
|
|
5
5
|
import { homedir as homedir3 } from "node:os";
|
|
6
6
|
import { join as join4 } from "node:path";
|
|
7
7
|
|
|
8
|
-
// ../shared/ops/retired-prefix.ts
|
|
9
|
-
function retiredPrefix(retired, argv) {
|
|
10
|
-
for (let n = Math.min(argv.length, 4);n >= 1; n--) {
|
|
11
|
-
const name = argv.slice(0, n).join(" ");
|
|
12
|
-
const replacement = retired[name];
|
|
13
|
-
if (replacement !== undefined)
|
|
14
|
-
return { name, replacement };
|
|
15
|
-
}
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
8
|
// src/api.ts
|
|
20
9
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
10
|
import { tmpdir } from "node:os";
|
|
@@ -58,7 +47,7 @@ async function fetchCatalog(ctx, env, useCache = true) {
|
|
|
58
47
|
if (useCache && existsSync(path)) {
|
|
59
48
|
try {
|
|
60
49
|
const cached = JSON.parse(readFileSync(path, "utf8"));
|
|
61
|
-
if (Date.now() - cached.at < CATALOG_TTL_MS && cached.renamed)
|
|
50
|
+
if (Date.now() - cached.at < CATALOG_TTL_MS && cached.renamed && cached.inApp)
|
|
62
51
|
return cached;
|
|
63
52
|
} catch {}
|
|
64
53
|
}
|
|
@@ -69,11 +58,12 @@ async function fetchCatalog(ctx, env, useCache = true) {
|
|
|
69
58
|
const ops = res.body.catalog;
|
|
70
59
|
const retired = res.body.retired ?? {};
|
|
71
60
|
const renamed = res.body.renamed ?? {};
|
|
61
|
+
const inApp = res.body.inApp ?? {};
|
|
72
62
|
try {
|
|
73
63
|
mkdirSync(tmpdir(), { recursive: true });
|
|
74
|
-
writeFileSync(path, JSON.stringify({ at: Date.now(), ops, retired, renamed }));
|
|
64
|
+
writeFileSync(path, JSON.stringify({ at: Date.now(), ops, retired, renamed, inApp }));
|
|
75
65
|
} catch {}
|
|
76
|
-
return { ops, retired, renamed };
|
|
66
|
+
return { ops, retired, renamed, inApp };
|
|
77
67
|
}
|
|
78
68
|
async function fetchOrgs(ctx, env, useCache = true) {
|
|
79
69
|
const path = join(tmpdir(), `volty-orgs-${env}.json`);
|
|
@@ -275,7 +265,7 @@ async function logout(config, env) {
|
|
|
275
265
|
}
|
|
276
266
|
|
|
277
267
|
// src/dispatch.ts
|
|
278
|
-
import { readFileSync as readFileSync3 } from "node:fs";
|
|
268
|
+
import { readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "node:fs";
|
|
279
269
|
|
|
280
270
|
// ../shared/ops/flag-parse.ts
|
|
281
271
|
function acceptsNull(prop) {
|
|
@@ -375,9 +365,29 @@ function parseFlagTokens(props, rest, UsageError) {
|
|
|
375
365
|
return { input, json };
|
|
376
366
|
}
|
|
377
367
|
|
|
368
|
+
// ../shared/ops/retired-prefix.ts
|
|
369
|
+
function retiredPrefix(retired, argv) {
|
|
370
|
+
for (let n = Math.min(argv.length, 4);n >= 1; n--) {
|
|
371
|
+
const name = argv.slice(0, n).join(" ");
|
|
372
|
+
const replacement = retired[name];
|
|
373
|
+
if (replacement !== undefined)
|
|
374
|
+
return { name, replacement };
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
|
|
378
379
|
// src/dispatch.ts
|
|
379
380
|
class CliUsageError extends Error {
|
|
380
381
|
}
|
|
382
|
+
function missMessage(catalog, argv) {
|
|
383
|
+
const inApp = retiredPrefix(catalog.inApp, argv);
|
|
384
|
+
if (inApp)
|
|
385
|
+
return `\`${inApp.name}\` is not run from here. ${inApp.replacement}`;
|
|
386
|
+
const retired = retiredPrefix(catalog.retired, argv);
|
|
387
|
+
if (retired)
|
|
388
|
+
return `\`${retired.name}\` is retired: ${retired.replacement}`;
|
|
389
|
+
return `unknown operation '${argv.join(" ")}' — run \`volty help\``;
|
|
390
|
+
}
|
|
381
391
|
function resolveOp(catalog, argv) {
|
|
382
392
|
const byName = new Map(catalog.ops.map((c) => [c.name, c]));
|
|
383
393
|
for (let n = Math.min(argv.length, 4);n >= 1; n--) {
|
|
@@ -413,6 +423,22 @@ async function runOp(ctx, op, input) {
|
|
|
413
423
|
const res = await apiFetch(ctx, pathForOp(op.name), { method: "POST", body: input });
|
|
414
424
|
return { status: res.status, ok: res.ok, body: res.body };
|
|
415
425
|
}
|
|
426
|
+
function saveOutFile(body, path) {
|
|
427
|
+
const structured = body.structuredContent;
|
|
428
|
+
if (typeof structured?.fileBase64 !== "string") {
|
|
429
|
+
throw new CliUsageError("--out: this operation returns no file, so there is nothing to write");
|
|
430
|
+
}
|
|
431
|
+
const bytes = Buffer.from(structured.fileBase64, "base64");
|
|
432
|
+
try {
|
|
433
|
+
writeFileSync3(path, bytes);
|
|
434
|
+
} catch (err) {
|
|
435
|
+
throw new CliUsageError(`--out: cannot write ${path} (${err.code ?? "error"})`);
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
body: { ...body, structuredContent: { ...structured, fileBase64: path } },
|
|
439
|
+
line: `Wrote ${path} (${bytes.byteLength} bytes)`
|
|
440
|
+
};
|
|
441
|
+
}
|
|
416
442
|
|
|
417
443
|
// src/format.ts
|
|
418
444
|
function flagType(prop) {
|
|
@@ -540,7 +566,7 @@ function decideProposal(ctx, proposalId, decision, reason) {
|
|
|
540
566
|
}
|
|
541
567
|
|
|
542
568
|
// src/update.ts
|
|
543
|
-
import { mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as
|
|
569
|
+
import { mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "node:fs";
|
|
544
570
|
import { homedir as homedir2 } from "node:os";
|
|
545
571
|
import { dirname as dirname2, join as join3 } from "node:path";
|
|
546
572
|
var CACHE_PATH = join3(homedir2(), ".config", "volty", "update-check.json");
|
|
@@ -574,7 +600,7 @@ function readCache() {
|
|
|
574
600
|
function writeCache(cache) {
|
|
575
601
|
try {
|
|
576
602
|
mkdirSync3(dirname2(CACHE_PATH), { recursive: true });
|
|
577
|
-
|
|
603
|
+
writeFileSync4(CACHE_PATH, `${JSON.stringify(cache)}
|
|
578
604
|
`);
|
|
579
605
|
} catch {}
|
|
580
606
|
}
|
|
@@ -813,7 +839,7 @@ function handleSkill(rest) {
|
|
|
813
839
|
fail("bundled SKILL.md not found — reinstall the @voltade/volty package");
|
|
814
840
|
const destDir = join4(homedir3(), ".claude", "skills", "volty-cli-ops");
|
|
815
841
|
mkdirSync4(destDir, { recursive: true });
|
|
816
|
-
|
|
842
|
+
writeFileSync5(join4(destDir, "SKILL.md"), readFileSync5(source, "utf8"));
|
|
817
843
|
process.stdout.write(`Installed the volty-cli-ops skill → ${join4(destDir, "SKILL.md")}
|
|
818
844
|
`);
|
|
819
845
|
}
|
|
@@ -870,10 +896,7 @@ async function main() {
|
|
|
870
896
|
}
|
|
871
897
|
const resolved = resolveOp(catalog, argv);
|
|
872
898
|
if (!resolved) {
|
|
873
|
-
|
|
874
|
-
if (retired)
|
|
875
|
-
fail(`\`${retired.name}\` is retired: ${retired.replacement}`);
|
|
876
|
-
fail(`unknown operation '${argv.join(" ")}' — run \`volty help\``);
|
|
899
|
+
fail(missMessage(catalog, argv));
|
|
877
900
|
}
|
|
878
901
|
if (resolved.renamedFrom)
|
|
879
902
|
process.stderr.write(`${resolved.renamedFrom} is now ${resolved.op.name}
|
|
@@ -883,9 +906,12 @@ async function main() {
|
|
|
883
906
|
`);
|
|
884
907
|
return;
|
|
885
908
|
}
|
|
909
|
+
const out = takeValue(resolved.rest, "--out");
|
|
910
|
+
if (out.rest.length !== resolved.rest.length && !out.value)
|
|
911
|
+
fail("--out needs a path, as in --out=./logo.png");
|
|
886
912
|
let parsed;
|
|
887
913
|
try {
|
|
888
|
-
parsed = parseFlags(resolved.op,
|
|
914
|
+
parsed = parseFlags(resolved.op, out.rest);
|
|
889
915
|
} catch (err) {
|
|
890
916
|
if (err instanceof CliUsageError)
|
|
891
917
|
fail(err.message);
|
|
@@ -894,7 +920,23 @@ async function main() {
|
|
|
894
920
|
const result = await runOp(ctx, resolved.op, parsed.input);
|
|
895
921
|
if (!result.ok)
|
|
896
922
|
failResult(resolved.op.name, result.body, result.status, parsed.json);
|
|
897
|
-
|
|
923
|
+
if (out.value === undefined) {
|
|
924
|
+
process.stdout.write(`${renderResult(result.body, parsed.json)}
|
|
925
|
+
`);
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
let saved;
|
|
929
|
+
try {
|
|
930
|
+
saved = saveOutFile(result.body, out.value);
|
|
931
|
+
} catch (err) {
|
|
932
|
+
if (err instanceof CliUsageError)
|
|
933
|
+
fail(err.message);
|
|
934
|
+
throw err;
|
|
935
|
+
}
|
|
936
|
+
process.stdout.write(`${renderResult(saved.body, parsed.json)}
|
|
937
|
+
`);
|
|
938
|
+
if (!parsed.json)
|
|
939
|
+
process.stdout.write(`${saved.line}
|
|
898
940
|
`);
|
|
899
941
|
}
|
|
900
942
|
main().catch((err) => fail(err instanceof Error ? err.message : String(err)));
|
package/package.json
CHANGED