@wirecat/cli-base 0.0.0-stage → 0.22.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/LICENSE +204 -0
- package/README.md +390 -2
- package/config/biome.base.json +56 -0
- package/config/cspell.json +57 -0
- package/config/lefthook.yml +34 -0
- package/config/rumdl.toml +9 -0
- package/config/tsconfig.base.json +21 -0
- package/config/tsconfig.scripts.json +13 -0
- package/config/tsconfig.test.json +11 -0
- package/config/vale/CliDocs/Filler.yml +9 -0
- package/config/vale/CliDocs/SentenceLength.yml +6 -0
- package/config/vale/Tg/Tone.yml +7 -0
- package/config/wirecat/LICENSE +204 -0
- package/config/wirecat/biome.base.json +56 -0
- package/config/wirecat/check.mjs +41 -0
- package/config/wirecat/cspell.json +80 -0
- package/config/wirecat/lefthook.yml +26 -0
- package/config/wirecat/manifest.json +23 -0
- package/config/wirecat/markdownlint.json +10 -0
- package/config/wirecat/rumdl.toml +9 -0
- package/dist/codegen/index.d.ts +12 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +11 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/manifest.d.ts +47 -0
- package/dist/codegen/manifest.d.ts.map +1 -0
- package/dist/codegen/manifest.js +73 -0
- package/dist/codegen/manifest.js.map +1 -0
- package/dist/codegen/model.d.ts +146 -0
- package/dist/codegen/model.d.ts.map +1 -0
- package/dist/codegen/model.js +7 -0
- package/dist/codegen/model.js.map +1 -0
- package/dist/codegen/names.d.ts +4 -0
- package/dist/codegen/names.d.ts.map +1 -0
- package/dist/codegen/names.js +46 -0
- package/dist/codegen/names.js.map +1 -0
- package/dist/codegen/pipeline.d.ts +24 -0
- package/dist/codegen/pipeline.d.ts.map +1 -0
- package/dist/codegen/pipeline.js +193 -0
- package/dist/codegen/pipeline.js.map +1 -0
- package/dist/codegen/runtime.d.ts +24 -0
- package/dist/codegen/runtime.d.ts.map +1 -0
- package/dist/codegen/runtime.js +38 -0
- package/dist/codegen/runtime.js.map +1 -0
- package/dist/codegen/tree.d.ts +29 -0
- package/dist/codegen/tree.d.ts.map +1 -0
- package/dist/codegen/tree.js +87 -0
- package/dist/codegen/tree.js.map +1 -0
- package/dist/codegen/typescript.d.ts +6 -0
- package/dist/codegen/typescript.d.ts.map +1 -0
- package/dist/codegen/typescript.js +78 -0
- package/dist/codegen/typescript.js.map +1 -0
- package/dist/codegen/valibot.d.ts +10 -0
- package/dist/codegen/valibot.d.ts.map +1 -0
- package/dist/codegen/valibot.js +132 -0
- package/dist/codegen/valibot.js.map +1 -0
- package/dist/commands/document.d.ts +72 -0
- package/dist/commands/document.d.ts.map +1 -0
- package/dist/commands/document.js +71 -0
- package/dist/commands/document.js.map +1 -0
- package/dist/commands/index.d.ts +83 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +85 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/page.d.ts +80 -0
- package/dist/commands/page.d.ts.map +1 -0
- package/dist/commands/page.js +100 -0
- package/dist/commands/page.js.map +1 -0
- package/dist/completion/index.d.ts +37 -0
- package/dist/completion/index.d.ts.map +1 -0
- package/dist/completion/index.js +87 -0
- package/dist/completion/index.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +48 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +120 -0
- package/dist/credentials.js.map +1 -0
- package/dist/deadline.d.ts +14 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +88 -0
- package/dist/deadline.js.map +1 -0
- package/dist/dev/bin.d.ts +3 -0
- package/dist/dev/bin.d.ts.map +1 -0
- package/dist/dev/bin.js +8 -0
- package/dist/dev/bin.js.map +1 -0
- package/dist/dev/lint.d.ts +31 -0
- package/dist/dev/lint.d.ts.map +1 -0
- package/dist/dev/lint.js +148 -0
- package/dist/dev/lint.js.map +1 -0
- package/dist/dev/main.d.ts +7 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/dev/main.js +279 -0
- package/dist/dev/main.js.map +1 -0
- package/dist/dev/next-version.d.ts +11 -0
- package/dist/dev/next-version.d.ts.map +1 -0
- package/dist/dev/next-version.js +33 -0
- package/dist/dev/next-version.js.map +1 -0
- package/dist/dev/slow-tests.d.ts +14 -0
- package/dist/dev/slow-tests.d.ts.map +1 -0
- package/dist/dev/slow-tests.js +17 -0
- package/dist/dev/slow-tests.js.map +1 -0
- package/dist/dev/test-matrix.d.ts +35 -0
- package/dist/dev/test-matrix.d.ts.map +1 -0
- package/dist/dev/test-matrix.js +93 -0
- package/dist/dev/test-matrix.js.map +1 -0
- package/dist/errors.d.ts +34 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/executable.d.ts +3 -0
- package/dist/executable.d.ts.map +1 -0
- package/dist/executable.js +41 -0
- package/dist/executable.js.map +1 -0
- package/dist/exit-codes.d.ts +11 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +25 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/http/index.d.ts +20 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +46 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/keyring.d.ts +27 -0
- package/dist/keyring.d.ts.map +1 -0
- package/dist/keyring.js +45 -0
- package/dist/keyring.js.map +1 -0
- package/dist/legacy-paths.d.ts +33 -0
- package/dist/legacy-paths.d.ts.map +1 -0
- package/dist/legacy-paths.js +128 -0
- package/dist/legacy-paths.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +7 -0
- package/dist/logger.js.map +1 -0
- package/dist/logging.d.ts +31 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +58 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/index.d.ts +32 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +113 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/output-buffer.d.ts +16 -0
- package/dist/output-buffer.d.ts.map +1 -0
- package/dist/output-buffer.js +69 -0
- package/dist/output-buffer.js.map +1 -0
- package/dist/paths.d.ts +35 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +45 -0
- package/dist/paths.js.map +1 -0
- package/dist/pretty.d.ts +12 -0
- package/dist/pretty.d.ts.map +1 -0
- package/dist/pretty.js +83 -0
- package/dist/pretty.js.map +1 -0
- package/dist/release/index.d.ts +38 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +91 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/markdown.d.ts +36 -0
- package/dist/release/markdown.d.ts.map +1 -0
- package/dist/release/markdown.js +153 -0
- package/dist/release/markdown.js.map +1 -0
- package/dist/release/structure.d.ts +16 -0
- package/dist/release/structure.d.ts.map +1 -0
- package/dist/release/structure.js +74 -0
- package/dist/release/structure.js.map +1 -0
- package/dist/renderer.d.ts +34 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +55 -0
- package/dist/renderer.js.map +1 -0
- package/dist/result-fields.d.ts +4 -0
- package/dist/result-fields.d.ts.map +1 -0
- package/dist/result-fields.js +56 -0
- package/dist/result-fields.js.map +1 -0
- package/dist/retry.d.ts +27 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +26 -0
- package/dist/retry.js.map +1 -0
- package/dist/sanitize.d.ts +25 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +52 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/skill/index.d.ts +78 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +190 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/standards/errors.d.ts +40 -0
- package/dist/standards/errors.d.ts.map +1 -0
- package/dist/standards/errors.js +33 -0
- package/dist/standards/errors.js.map +1 -0
- package/dist/standards/index.d.ts +8 -0
- package/dist/standards/index.d.ts.map +1 -0
- package/dist/standards/index.js +8 -0
- package/dist/standards/index.js.map +1 -0
- package/dist/standards/lint.d.ts +29 -0
- package/dist/standards/lint.d.ts.map +1 -0
- package/dist/standards/lint.js +50 -0
- package/dist/standards/lint.js.map +1 -0
- package/dist/standards/log.d.ts +21 -0
- package/dist/standards/log.d.ts.map +1 -0
- package/dist/standards/log.js +18 -0
- package/dist/standards/log.js.map +1 -0
- package/dist/standards/output.d.ts +126 -0
- package/dist/standards/output.d.ts.map +1 -0
- package/dist/standards/output.js +54 -0
- package/dist/standards/output.js.map +1 -0
- package/dist/standards/registry.d.ts +18 -0
- package/dist/standards/registry.d.ts.map +1 -0
- package/dist/standards/registry.js +41 -0
- package/dist/standards/registry.js.map +1 -0
- package/dist/standards/steps.d.ts +28 -0
- package/dist/standards/steps.d.ts.map +1 -0
- package/dist/standards/steps.js +56 -0
- package/dist/standards/steps.js.map +1 -0
- package/dist/standards/vocabulary.d.ts +40 -0
- package/dist/standards/vocabulary.d.ts.map +1 -0
- package/dist/standards/vocabulary.js +242 -0
- package/dist/standards/vocabulary.js.map +1 -0
- package/dist/streams.d.ts +24 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +26 -0
- package/dist/streams.js.map +1 -0
- package/dist/testing/index.d.ts +24 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +29 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/time.d.ts +21 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +19 -0
- package/dist/time.js.map +1 -0
- package/dist/update/index.d.ts +76 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +160 -0
- package/dist/update/index.js.map +1 -0
- package/package.json +135 -4
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ChildProcessWithoutNullStreams } from "node:child_process";
|
|
2
|
+
export type McpClient = "codex" | "claude-code";
|
|
3
|
+
export interface StdioEntry {
|
|
4
|
+
type: "stdio";
|
|
5
|
+
command: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandResult {
|
|
10
|
+
status: number | null;
|
|
11
|
+
error?: Error;
|
|
12
|
+
stdout: string;
|
|
13
|
+
stderr: string;
|
|
14
|
+
}
|
|
15
|
+
export type RunCommand = (file: string, args: string[]) => CommandResult;
|
|
16
|
+
export declare const setupArguments: (client: McpClient, name: string, entry: StdioEntry) => string[];
|
|
17
|
+
export declare const installStdioEntry: (client: McpClient, name: string, entry: StdioEntry, { run }?: {
|
|
18
|
+
run?: RunCommand;
|
|
19
|
+
}) => {
|
|
20
|
+
client: McpClient;
|
|
21
|
+
name: string;
|
|
22
|
+
command: string[];
|
|
23
|
+
};
|
|
24
|
+
export interface ProbeResult {
|
|
25
|
+
tools: string[];
|
|
26
|
+
potentialWrites: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare const probeStdio: (entry: StdioEntry, { timeoutMs, start, }?: {
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
start?: (file: string, args: string[], env: NodeJS.ProcessEnv) => ChildProcessWithoutNullStreams;
|
|
31
|
+
}) => Promise<ProbeResult>;
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAA;AAIxE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,aAAa,CAAA;AAE/C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,aAAa,CAAA;AAcxE,eAAO,MAAM,cAAc,WAAY,SAAS,QAAQ,MAAM,SAAS,UAAU,KAAG,MAAM,EAIzF,CAAA;AAED,eAAO,MAAM,iBAAiB,WACpB,SAAS,QACX,MAAM,SACL,UAAU,YACE;IAAE,GAAG,CAAC,EAAE,UAAU,CAAA;CAAE,KACtC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CActD,CAAA;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,eAAO,MAAM,UAAU,UACd,UAAU,0BAQd;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,8BAA8B,CAAA;CACjG,KACA,OAAO,CAAC,WAAW,CAkErB,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import crossSpawn from "cross-spawn";
|
|
2
|
+
import { executableEnvironment, executableOnPath } from "../executable.js";
|
|
3
|
+
const realRun = (file, args) => {
|
|
4
|
+
const result = crossSpawn.sync(executableOnPath(file, process.env), args, {
|
|
5
|
+
encoding: "utf8",
|
|
6
|
+
timeout: 10_000,
|
|
7
|
+
maxBuffer: 256_000,
|
|
8
|
+
env: executableEnvironment(process.env),
|
|
9
|
+
});
|
|
10
|
+
return { status: result.status, error: result.error, stdout: result.stdout ?? "", stderr: result.stderr ?? "" };
|
|
11
|
+
};
|
|
12
|
+
const executable = (client) => (client === "codex" ? "codex" : "claude");
|
|
13
|
+
export const setupArguments = (client, name, entry) => {
|
|
14
|
+
const variables = Object.entries(entry.env ?? {}).flatMap(([key, value]) => ["--env", `${key}=${value}`]);
|
|
15
|
+
if (client === "codex")
|
|
16
|
+
return ["mcp", "add", name, ...variables, "--", entry.command, ...entry.args];
|
|
17
|
+
return ["mcp", "add", "--scope", "user", name, ...variables, "--", entry.command, ...entry.args];
|
|
18
|
+
};
|
|
19
|
+
export const installStdioEntry = (client, name, entry, { run = realRun } = {}) => {
|
|
20
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name))
|
|
21
|
+
throw new Error("the MCP name must be letters, digits, _ or -");
|
|
22
|
+
if (!entry.command || entry.args.some((arg) => arg.includes("\0")))
|
|
23
|
+
throw new Error("invalid MCP command");
|
|
24
|
+
const file = executable(client);
|
|
25
|
+
const existing = run(file, ["mcp", "get", name, ...(client === "codex" ? ["--json"] : [])]);
|
|
26
|
+
if (existing.error)
|
|
27
|
+
throw new Error(`${file} is not installed or could not be started`);
|
|
28
|
+
if (existing.status === 0)
|
|
29
|
+
throw new Error(`${name} is already configured in ${file}; remove it there first`);
|
|
30
|
+
if (existing.status !== 0 && !/No MCP server named/i.test(existing.stdout + existing.stderr)) {
|
|
31
|
+
throw new Error(`${file} could not check its MCP configuration`);
|
|
32
|
+
}
|
|
33
|
+
const args = setupArguments(client, name, entry);
|
|
34
|
+
const added = run(file, args);
|
|
35
|
+
if (added.status !== 0 || added.error)
|
|
36
|
+
throw new Error(`${file} could not add ${name}`);
|
|
37
|
+
return { client, name, command: [entry.command, ...entry.args] };
|
|
38
|
+
};
|
|
39
|
+
export const probeStdio = async (entry, { timeoutMs = 10_000, start = (file, args, env) => crossSpawn(executableOnPath(file, env), args, {
|
|
40
|
+
env: executableEnvironment(env),
|
|
41
|
+
stdio: "pipe",
|
|
42
|
+
}), } = {}) => {
|
|
43
|
+
const child = start(entry.command, entry.args, { ...process.env, ...entry.env });
|
|
44
|
+
let buffer = "";
|
|
45
|
+
let timer;
|
|
46
|
+
const pending = new Map();
|
|
47
|
+
const request = (id, method, params) => new Promise((resolve, reject) => {
|
|
48
|
+
pending.set(id, { resolve, reject });
|
|
49
|
+
child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`);
|
|
50
|
+
});
|
|
51
|
+
const fail = (error) => {
|
|
52
|
+
for (const waiter of pending.values())
|
|
53
|
+
waiter.reject(error);
|
|
54
|
+
pending.clear();
|
|
55
|
+
};
|
|
56
|
+
child.on("error", () => fail(new Error("the MCP server could not be started")));
|
|
57
|
+
child.on("exit", () => fail(new Error("the MCP server exited before answering")));
|
|
58
|
+
child.stdin.on("error", () => fail(new Error("the MCP server closed its input")));
|
|
59
|
+
child.stdout.setEncoding("utf8");
|
|
60
|
+
child.stdout.on("data", (chunk) => {
|
|
61
|
+
buffer += chunk;
|
|
62
|
+
if (buffer.length > 1_000_000)
|
|
63
|
+
return fail(new Error("the MCP server sent too much output"));
|
|
64
|
+
for (let newline = buffer.indexOf("\n"); newline !== -1; newline = buffer.indexOf("\n")) {
|
|
65
|
+
const line = buffer.slice(0, newline);
|
|
66
|
+
buffer = buffer.slice(newline + 1);
|
|
67
|
+
try {
|
|
68
|
+
const value = JSON.parse(line);
|
|
69
|
+
if (typeof value.id !== "number")
|
|
70
|
+
continue;
|
|
71
|
+
const waiter = pending.get(value.id);
|
|
72
|
+
if (!waiter)
|
|
73
|
+
continue;
|
|
74
|
+
pending.delete(value.id);
|
|
75
|
+
if (value.error)
|
|
76
|
+
waiter.reject(new Error("the MCP server rejected the handshake"));
|
|
77
|
+
else
|
|
78
|
+
waiter.resolve(value.result ?? {});
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
fail(new Error("the MCP server sent invalid JSON"));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
try {
|
|
86
|
+
timer = setTimeout(() => fail(new Error("the MCP server did not answer in time")), timeoutMs);
|
|
87
|
+
await request(1, "initialize", {
|
|
88
|
+
protocolVersion: "2025-11-25",
|
|
89
|
+
capabilities: {},
|
|
90
|
+
clientInfo: { name: "cli-base-mcp-doctor", version: "1" },
|
|
91
|
+
});
|
|
92
|
+
child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" })}\n`);
|
|
93
|
+
const result = await request(2, "tools/list", {});
|
|
94
|
+
const tools = result.tools;
|
|
95
|
+
if (!Array.isArray(tools))
|
|
96
|
+
throw new Error("the MCP server returned no tool list");
|
|
97
|
+
const named = tools.filter((item) => item !== null && typeof item === "object" && "name" in item && typeof item.name === "string");
|
|
98
|
+
if (named.length !== tools.length)
|
|
99
|
+
throw new Error("the MCP server returned an invalid tool list");
|
|
100
|
+
return {
|
|
101
|
+
tools: named.map((item) => item.name),
|
|
102
|
+
potentialWrites: named.filter((item) => item.annotations?.readOnlyHint !== true).map((item) => item.name),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
if (timer)
|
|
107
|
+
clearTimeout(timer);
|
|
108
|
+
pending.clear();
|
|
109
|
+
child.stdin.end();
|
|
110
|
+
child.kill();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RenderFormat } from "./renderer.js";
|
|
2
|
+
export interface OutputBufferOptions {
|
|
3
|
+
maxOutputBytes?: number;
|
|
4
|
+
fields?: string;
|
|
5
|
+
format?: RenderFormat;
|
|
6
|
+
}
|
|
7
|
+
export interface OutputBuffer {
|
|
8
|
+
readonly bytes: number;
|
|
9
|
+
/** Raw output chunks, including any delimiters. Projection requires complete JSON values/JSONL lines. */
|
|
10
|
+
data(text: string): void;
|
|
11
|
+
/** Consumes the buffer once; the writer receives the exact buffered text, without extra newlines. */
|
|
12
|
+
flush(write: (text: string) => void): void;
|
|
13
|
+
discard(): void;
|
|
14
|
+
}
|
|
15
|
+
export declare const createOutputBuffer: ({ maxOutputBytes, fields, format, }?: OutputBufferOptions) => OutputBuffer;
|
|
16
|
+
//# sourceMappingURL=output-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-buffer.d.ts","sourceRoot":"","sources":["../src/output-buffer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,yGAAyG;IACzG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,qGAAqG;IACrG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;IAC1C,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,eAAO,MAAM,kBAAkB,yCAI5B,mBAAmB,KAAQ,YA6D7B,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { CliError, isCliError } from "./errors.js";
|
|
2
|
+
import { fieldsOf, projectFields } from "./result-fields.js";
|
|
3
|
+
export const createOutputBuffer = ({ maxOutputBytes = 4 * 1024 * 1024, fields, format, } = {}) => {
|
|
4
|
+
if (!Number.isSafeInteger(maxOutputBytes) || maxOutputBytes < 0)
|
|
5
|
+
throw new CliError("validation_error", "maxOutputBytes must be a nonnegative whole byte count");
|
|
6
|
+
const paths = fields === undefined ? undefined : fieldsOf(fields);
|
|
7
|
+
if (paths && format !== "json" && format !== "jsonl")
|
|
8
|
+
throw new CliError("validation_error", "field projection requires an explicit JSON or JSONL format");
|
|
9
|
+
let chunks = [];
|
|
10
|
+
let bytes = 0;
|
|
11
|
+
let finished = false;
|
|
12
|
+
const requireActive = () => {
|
|
13
|
+
if (finished)
|
|
14
|
+
throw new CliError("validation_error", "output buffer is already finished");
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
get bytes() {
|
|
18
|
+
return bytes;
|
|
19
|
+
},
|
|
20
|
+
data(text) {
|
|
21
|
+
requireActive();
|
|
22
|
+
let result = text;
|
|
23
|
+
if (paths) {
|
|
24
|
+
const project = (value) => JSON.stringify(projectFields(JSON.parse(value), paths));
|
|
25
|
+
try {
|
|
26
|
+
result =
|
|
27
|
+
format === "jsonl"
|
|
28
|
+
? text
|
|
29
|
+
.split("\n")
|
|
30
|
+
.map((line) => (line.trim() ? project(line) : line))
|
|
31
|
+
.join("\n")
|
|
32
|
+
: project(text) + (text.endsWith("\n") ? "\n" : "");
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (isCliError(error))
|
|
36
|
+
throw error;
|
|
37
|
+
throw new CliError("invalid_response", "field projection requires complete JSON values or JSONL lines", {
|
|
38
|
+
reason: "projection_unavailable",
|
|
39
|
+
retryable: false,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const size = Buffer.byteLength(result);
|
|
44
|
+
if (!Number.isSafeInteger(bytes + size) || (maxOutputBytes !== 0 && bytes + size > maxOutputBytes))
|
|
45
|
+
throw new CliError("invalid_response", "output exceeds the configured byte limit", {
|
|
46
|
+
reason: "output_limit",
|
|
47
|
+
maxBytes: maxOutputBytes,
|
|
48
|
+
bufferedBytes: bytes,
|
|
49
|
+
retryable: false,
|
|
50
|
+
partialOutput: false,
|
|
51
|
+
});
|
|
52
|
+
bytes += size;
|
|
53
|
+
chunks.push(result);
|
|
54
|
+
},
|
|
55
|
+
flush(write) {
|
|
56
|
+
requireActive();
|
|
57
|
+
finished = true;
|
|
58
|
+
const output = chunks;
|
|
59
|
+
chunks = [];
|
|
60
|
+
for (const text of output)
|
|
61
|
+
write(text);
|
|
62
|
+
},
|
|
63
|
+
discard() {
|
|
64
|
+
finished = true;
|
|
65
|
+
chunks = [];
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=output-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-buffer.js","sourceRoot":"","sources":["../src/output-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAgB5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAChC,MAAM,EACN,MAAM,GACP,GAAwB,EAAE,EAAgB,EAAE;IAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC;QAC7D,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,uDAAuD,CAAC,CAAA;IACjG,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACjE,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO;QAClD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,4DAA4D,CAAC,CAAA;IACtG,IAAI,MAAM,GAAa,EAAE,CAAA;IACzB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,QAAQ;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,mCAAmC,CAAC,CAAA;IAC3F,CAAC,CAAA;IACD,OAAO;QACL,IAAI,KAAK;YACP,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,IAAI;YACP,aAAa,EAAE,CAAA;YACf,IAAI,MAAM,GAAG,IAAI,CAAA;YACjB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;gBAC1F,IAAI,CAAC;oBACH,MAAM;wBACJ,MAAM,KAAK,OAAO;4BAChB,CAAC,CAAC,IAAI;iCACD,KAAK,CAAC,IAAI,CAAC;iCACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iCACnD,IAAI,CAAC,IAAI,CAAC;4BACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBACzD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,UAAU,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAA;oBAClC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,+DAA+D,EAAE;wBACtG,MAAM,EAAE,wBAAwB;wBAChC,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,GAAG,cAAc,CAAC;gBAChG,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0CAA0C,EAAE;oBACjF,MAAM,EAAE,cAAc;oBACtB,QAAQ,EAAE,cAAc;oBACxB,aAAa,EAAE,KAAK;oBACpB,SAAS,EAAE,KAAK;oBAChB,aAAa,EAAE,KAAK;iBACrB,CAAC,CAAA;YACJ,KAAK,IAAI,IAAI,CAAA;YACb,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,KAAK;YACT,aAAa,EAAE,CAAA;YACf,QAAQ,GAAG,IAAI,CAAA;YACf,MAAM,MAAM,GAAG,MAAM,CAAA;YACrB,MAAM,GAAG,EAAE,CAAA;YACX,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC;QACD,OAAO;YACL,QAAQ,GAAG,IAAI,CAAA;YACf,MAAM,GAAG,EAAE,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface Paths {
|
|
2
|
+
/** `config.json`, and the credential file when the keyring is unavailable. */
|
|
3
|
+
config: string;
|
|
4
|
+
/** Everything the program writes for itself: sessions, run artifacts, databases. */
|
|
5
|
+
state: string;
|
|
6
|
+
/** Data that can be deleted without losing anything the user typed. */
|
|
7
|
+
cache: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PathsOptions {
|
|
10
|
+
/** Directory name under the OS convention — the command's name, not the package's. */
|
|
11
|
+
appName: string;
|
|
12
|
+
/**
|
|
13
|
+
* Environment variable prefix for the overrides, e.g. `MAX` gives `MAX_CONFIG_DIR`.
|
|
14
|
+
* Defaults to the app name, upper-cased, with anything that is not a letter or digit as `_`.
|
|
15
|
+
*/
|
|
16
|
+
prefix?: string;
|
|
17
|
+
env?: NodeJS.ProcessEnv;
|
|
18
|
+
platform?: NodeJS.Platform;
|
|
19
|
+
}
|
|
20
|
+
export declare const PATH_KINDS: readonly ["config", "state", "cache"];
|
|
21
|
+
/**
|
|
22
|
+
* The XDG layout on macOS too: a CLI user expects `~/.config`, and one layout is one set of docs.
|
|
23
|
+
* Windows keeps the layout `env-paths` gave it, so nothing there moves. Everything is read from
|
|
24
|
+
* `env`, never the global one, so a test can point every directory at a temp folder.
|
|
25
|
+
*/
|
|
26
|
+
export declare const defaultPaths: ({ appName, env, platform }: PathsOptions) => Paths;
|
|
27
|
+
/**
|
|
28
|
+
* Each directory is overridable by environment variable, which is what makes a test — and a
|
|
29
|
+
* throwaway profile — possible without touching the real ones.
|
|
30
|
+
*/
|
|
31
|
+
export declare const resolvePaths: (options: PathsOptions) => Paths;
|
|
32
|
+
/** Whether any of the three directories came from the environment rather than the OS convention. */
|
|
33
|
+
export declare const pathsAreOverridden: ({ appName, prefix, env }: PathsOptions) => boolean;
|
|
34
|
+
export declare const configFilePath: (configDir: string, fileName?: string) => string;
|
|
35
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,KAAK;IACpB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAA;IACd,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;CAC3B;AAED,eAAO,MAAM,UAAU,YAAI,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAU,CAAA;AAM/D;;;;GAIG;AACH,eAAO,MAAM,YAAY,+BAAiE,YAAY,KAAG,KAiBxG,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,YAAa,YAAY,KAAG,KAQpD,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,kBAAkB,6BAA4C,YAAY,KAAG,OACP,CAAA;AAEnF,eAAO,MAAM,cAAc,cAAe,MAAM,wBAA6B,MAAmC,CAAA"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join, posix, win32 } from "node:path";
|
|
3
|
+
export const PATH_KINDS = ["config", "state", "cache"];
|
|
4
|
+
const OVERRIDES = { config: "CONFIG_DIR", state: "STATE_DIR", cache: "CACHE_DIR" };
|
|
5
|
+
const overrideName = (appName, prefix, kind) => `${prefix ?? appName.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_${OVERRIDES[kind]}`;
|
|
6
|
+
/**
|
|
7
|
+
* The XDG layout on macOS too: a CLI user expects `~/.config`, and one layout is one set of docs.
|
|
8
|
+
* Windows keeps the layout `env-paths` gave it, so nothing there moves. Everything is read from
|
|
9
|
+
* `env`, never the global one, so a test can point every directory at a temp folder.
|
|
10
|
+
*/
|
|
11
|
+
export const defaultPaths = ({ appName, env = process.env, platform = process.platform }) => {
|
|
12
|
+
if (platform === "win32") {
|
|
13
|
+
const home = env.USERPROFILE || homedir();
|
|
14
|
+
const roaming = env.APPDATA || win32.join(home, "AppData", "Roaming");
|
|
15
|
+
const local = env.LOCALAPPDATA || win32.join(home, "AppData", "Local");
|
|
16
|
+
return {
|
|
17
|
+
config: win32.join(roaming, appName, "Config"),
|
|
18
|
+
state: win32.join(local, appName, "Data"),
|
|
19
|
+
cache: win32.join(local, appName, "Cache"),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const home = env.HOME || homedir();
|
|
23
|
+
return {
|
|
24
|
+
config: posix.join(env.XDG_CONFIG_HOME || posix.join(home, ".config"), appName),
|
|
25
|
+
state: posix.join(env.XDG_DATA_HOME || posix.join(home, ".local", "share"), appName),
|
|
26
|
+
cache: posix.join(env.XDG_CACHE_HOME || posix.join(home, ".cache"), appName),
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Each directory is overridable by environment variable, which is what makes a test — and a
|
|
31
|
+
* throwaway profile — possible without touching the real ones.
|
|
32
|
+
*/
|
|
33
|
+
export const resolvePaths = (options) => {
|
|
34
|
+
const { appName, prefix, env = process.env } = options;
|
|
35
|
+
const base = defaultPaths(options);
|
|
36
|
+
return {
|
|
37
|
+
config: env[overrideName(appName, prefix, "config")] ?? base.config,
|
|
38
|
+
state: env[overrideName(appName, prefix, "state")] ?? base.state,
|
|
39
|
+
cache: env[overrideName(appName, prefix, "cache")] ?? base.cache,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/** Whether any of the three directories came from the environment rather than the OS convention. */
|
|
43
|
+
export const pathsAreOverridden = ({ appName, prefix, env = process.env }) => PATH_KINDS.some((kind) => env[overrideName(appName, prefix, kind)] !== undefined);
|
|
44
|
+
export const configFilePath = (configDir, fileName = "config.json") => join(configDir, fileName);
|
|
45
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
package/dist/pretty.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PrettyOptions {
|
|
2
|
+
color: boolean;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Three shapes and a fallback, not a renderer per endpoint. A list of like objects becomes a
|
|
6
|
+
* table, a single object becomes labelled lines, everything else is printed as JSON — which is
|
|
7
|
+
* honest about the fact that we do not know what it is.
|
|
8
|
+
*/
|
|
9
|
+
export declare const renderPretty: (value: unknown, options: PrettyOptions) => string;
|
|
10
|
+
/** Shifts every line right; an empty line stays empty, so no trailing spaces reach the terminal. */
|
|
11
|
+
export declare const indent: (text: string, spaces: number) => string;
|
|
12
|
+
//# sourceMappingURL=pretty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretty.d.ts","sourceRoot":"","sources":["../src/pretty.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAAW,OAAO,WAAW,aAAa,KAAG,MAmBrE,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,MAAM,SAAU,MAAM,UAAU,MAAM,KAAG,MAIvC,CAAA"}
|
package/dist/pretty.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import Table from "cli-table3";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { visibleControls } from "./sanitize.js";
|
|
4
|
+
/**
|
|
5
|
+
* Three shapes and a fallback, not a renderer per endpoint. A list of like objects becomes a
|
|
6
|
+
* table, a single object becomes labelled lines, everything else is printed as JSON — which is
|
|
7
|
+
* honest about the fact that we do not know what it is.
|
|
8
|
+
*/
|
|
9
|
+
export const renderPretty = (value, options) => {
|
|
10
|
+
const paint = palette(options.color);
|
|
11
|
+
if (Array.isArray(value)) {
|
|
12
|
+
if (value.length === 0)
|
|
13
|
+
return paint.dim("(nothing)");
|
|
14
|
+
return isRowLike(value) ? renderTable(value, paint) : renderJson(value);
|
|
15
|
+
}
|
|
16
|
+
if (isPlainObject(value)) {
|
|
17
|
+
const listKey = Object.keys(value).find((key) => Array.isArray(value[key]) && isRowLike(value[key]));
|
|
18
|
+
if (listKey) {
|
|
19
|
+
const rest = Object.fromEntries(Object.entries(value).filter(([key]) => key !== listKey));
|
|
20
|
+
const table = renderTable(value[listKey], paint);
|
|
21
|
+
return Object.keys(rest).length > 0 ? `${table}\n\n${renderFields(rest, paint)}` : table;
|
|
22
|
+
}
|
|
23
|
+
return renderFields(value, paint);
|
|
24
|
+
}
|
|
25
|
+
return renderJson(value);
|
|
26
|
+
};
|
|
27
|
+
/** Shifts every line right; an empty line stays empty, so no trailing spaces reach the terminal. */
|
|
28
|
+
export const indent = (text, spaces) => text
|
|
29
|
+
.split("\n")
|
|
30
|
+
.map((line) => (line === "" ? line : `${" ".repeat(spaces)}${line}`))
|
|
31
|
+
.join("\n");
|
|
32
|
+
const palette = (color) => ({
|
|
33
|
+
dim: (text) => (color ? pc.dim(text) : text),
|
|
34
|
+
bold: (text) => (color ? pc.bold(text) : text),
|
|
35
|
+
label: (text) => (color ? pc.cyan(text) : text),
|
|
36
|
+
});
|
|
37
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
38
|
+
const isRowLike = (value) => value.length > 0 && value.every((item) => isPlainObject(item)) && value.length <= 500;
|
|
39
|
+
const renderTable = (rows, paint) => {
|
|
40
|
+
const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))];
|
|
41
|
+
const table = new Table({
|
|
42
|
+
head: columns.map((column) => paint.bold(visibleControls(column))),
|
|
43
|
+
// `chars: {}` is not enough — cli-table3 falls back to its own defaults for anything unset.
|
|
44
|
+
style: { head: [], border: [], "padding-left": 0, "padding-right": 2 },
|
|
45
|
+
chars: BORDERLESS,
|
|
46
|
+
});
|
|
47
|
+
for (const row of rows)
|
|
48
|
+
table.push(columns.map((column) => cell(row[column])));
|
|
49
|
+
return table.toString();
|
|
50
|
+
};
|
|
51
|
+
const renderFields = (fields, paint) => {
|
|
52
|
+
const rows = Object.entries(fields).map(([key, value]) => ({ label: visibleControls(key), value }));
|
|
53
|
+
const width = Math.max(...rows.map((row) => row.label.length));
|
|
54
|
+
return rows.map((row) => `${paint.label(row.label.padEnd(width))} ${cell(row.value)}`).join("\n");
|
|
55
|
+
};
|
|
56
|
+
const cell = (value) => {
|
|
57
|
+
if (value === null || value === undefined)
|
|
58
|
+
return "";
|
|
59
|
+
// Sanitised before the table measures it, so an escaped sequence widens the column it is in
|
|
60
|
+
// rather than silently overflowing it.
|
|
61
|
+
if (typeof value === "object")
|
|
62
|
+
return visibleControls(JSON.stringify(value));
|
|
63
|
+
return visibleControls(String(value));
|
|
64
|
+
};
|
|
65
|
+
const renderJson = (value) => JSON.stringify(value, null, 2);
|
|
66
|
+
const BORDERLESS = {
|
|
67
|
+
top: "",
|
|
68
|
+
"top-mid": "",
|
|
69
|
+
"top-left": "",
|
|
70
|
+
"top-right": "",
|
|
71
|
+
bottom: "",
|
|
72
|
+
"bottom-mid": "",
|
|
73
|
+
"bottom-left": "",
|
|
74
|
+
"bottom-right": "",
|
|
75
|
+
left: "",
|
|
76
|
+
"left-mid": "",
|
|
77
|
+
mid: "",
|
|
78
|
+
"mid-mid": "",
|
|
79
|
+
right: "",
|
|
80
|
+
"right-mid": "",
|
|
81
|
+
middle: "",
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=pretty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretty.js","sourceRoot":"","sources":["../src/pretty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export { type ChangelogRules, changelogProblems, type DocsRules, docsProblems, idPattern, JOURNAL_IDS, markdownFiles, slug, } from "./markdown.js";
|
|
2
|
+
export { REQUIRED_PAGES, type StructureRules, structureProblems } from "./structure.js";
|
|
3
|
+
export type Check = {
|
|
4
|
+
name: string;
|
|
5
|
+
run: () => string[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Runs every check even after one fails, so one pass shows the whole list, and returns how many
|
|
9
|
+
* failed. The caller exits: a library that calls `process.exit` cannot be tested.
|
|
10
|
+
*/
|
|
11
|
+
export declare const releaseCheck: (checks: readonly Check[], { version, log }: {
|
|
12
|
+
version: string;
|
|
13
|
+
log: (line: string) => void;
|
|
14
|
+
}) => number;
|
|
15
|
+
export declare const run: (root: string, command: string, args: readonly string[]) => {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
output: string;
|
|
18
|
+
};
|
|
19
|
+
/** A check that passes when the command exits 0, and otherwise shows the last 15 lines it printed. */
|
|
20
|
+
export declare const command: (root: string, name: string, ...args: string[]) => () => string[];
|
|
21
|
+
export declare const packageVersion: (root: string) => string;
|
|
22
|
+
export declare const notOnNpm: (root: string, packageName: string, version: string) => () => string[];
|
|
23
|
+
/**
|
|
24
|
+
* `allowed` holds exact paths, and directories ending in `/`; `said` is how the problem names them.
|
|
25
|
+
*/
|
|
26
|
+
export declare const packProblems: (paths: readonly string[], allowed: readonly string[], said: string) => string[];
|
|
27
|
+
export declare const packContents: (root: string, allowed: readonly string[], said: string) => () => string[];
|
|
28
|
+
/**
|
|
29
|
+
* The whole of a `version:check` / `version:sync` script: what to print, and the exit code — 2 when
|
|
30
|
+
* either file cannot be read, 1 on drift. A CLI keeps its version in `package.json` and in a source
|
|
31
|
+
* file read at run time — `--version` must not load `package.json`, which is not there once the
|
|
32
|
+
* command is bundled — and the day they disagree is a release day.
|
|
33
|
+
*/
|
|
34
|
+
export declare const versionScript: (root: string, argv: readonly string[], file?: string) => {
|
|
35
|
+
code: 0 | 1 | 2;
|
|
36
|
+
message: string;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,cAAc,EACnB,iBAAiB,EACjB,KAAK,SAAS,EACd,YAAY,EACZ,SAAS,EACT,WAAW,EACX,aAAa,EACb,IAAI,GACL,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvF,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,MAAM,EAAE,CAAA;CAAE,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,YAAY,WACf,SAAS,KAAK,EAAE,oBACN;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,WAWnE,CAAA;AAED,eAAO,MAAM,GAAG,SAAU,MAAM,WAAW,MAAM,QAAQ,SAAS,MAAM,EAAE;;;CAIzE,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,OAAO,SACX,MAAM,QAAQ,MAAM,WAAW,MAAM,EAAE,WAC1C,MAAM,EAGT,CAAA;AAEH,eAAO,MAAM,cAAc,SAAU,MAAM,WACoD,CAAA;AAE/F,eAAO,MAAM,QAAQ,SAAU,MAAM,eAAe,MAAM,WAAW,MAAM,WAAS,MAAM,EAGlF,CAAA;AAER;;GAEG;AACH,eAAO,MAAM,YAAY,UAAW,SAAS,MAAM,EAAE,WAAW,SAAS,MAAM,EAAE,QAAQ,MAAM,aAG1B,CAAA;AAErE,eAAO,MAAM,YAAY,SAAU,MAAM,WAAW,SAAS,MAAM,EAAE,QAAQ,MAAM,WAAS,MAAM,EASjG,CAAA;AAcD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,SAClB,MAAM,QACN,SAAS,MAAM,EAAE,oBAEtB;IAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAiBpC,CAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything about a release that a program can decide. Each check returns the problems it found,
|
|
3
|
+
* one line each, saying what and where; an empty list is a pass. The judgement half — changelog
|
|
4
|
+
* wording, docs against the diff, live checks — is each CLI's release skill.
|
|
5
|
+
*/
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
export { changelogProblems, docsProblems, idPattern, JOURNAL_IDS, markdownFiles, slug, } from "./markdown.js";
|
|
10
|
+
export { REQUIRED_PAGES, structureProblems } from "./structure.js";
|
|
11
|
+
/**
|
|
12
|
+
* Runs every check even after one fails, so one pass shows the whole list, and returns how many
|
|
13
|
+
* failed. The caller exits: a library that calls `process.exit` cannot be tested.
|
|
14
|
+
*/
|
|
15
|
+
export const releaseCheck = (checks, { version, log }) => {
|
|
16
|
+
let failed = 0;
|
|
17
|
+
for (const { name, run } of checks) {
|
|
18
|
+
const problems = run();
|
|
19
|
+
log(`${problems.length === 0 ? "ok " : "FAIL"} ${name}`);
|
|
20
|
+
for (const problem of problems)
|
|
21
|
+
log(problem.replace(/^/gm, " "));
|
|
22
|
+
if (problems.length > 0)
|
|
23
|
+
failed++;
|
|
24
|
+
}
|
|
25
|
+
log(failed === 0 ? `\n${version}: every check passed` : `\n${version}: ${failed} check(s) failed`);
|
|
26
|
+
return failed;
|
|
27
|
+
};
|
|
28
|
+
export const run = (root, command, args) => {
|
|
29
|
+
const done = spawnSync(command, args, { cwd: root, encoding: "utf8", maxBuffer: 64 * 1024 * 1024 });
|
|
30
|
+
const output = `${done.stdout ?? ""}${done.stderr ?? ""}${done.error ? String(done.error) : ""}`;
|
|
31
|
+
return { ok: done.status === 0, output };
|
|
32
|
+
};
|
|
33
|
+
/** A check that passes when the command exits 0, and otherwise shows the last 15 lines it printed. */
|
|
34
|
+
export const command = (root, name, ...args) => () => {
|
|
35
|
+
const { ok, output } = run(root, name, args);
|
|
36
|
+
return ok ? [] : [output.trim().split("\n").slice(-15).join("\n") || `exit ${name} ${args.join(" ")}`];
|
|
37
|
+
};
|
|
38
|
+
export const packageVersion = (root) => JSON.parse(readFileSync(join(root, "package.json"), "utf8")).version;
|
|
39
|
+
export const notOnNpm = (root, packageName, version) => () => run(root, "npm", ["view", `${packageName}@${version}`, "version", "--prefer-online"]).ok
|
|
40
|
+
? [`${version} is already on npm — raise the version`]
|
|
41
|
+
: [];
|
|
42
|
+
/**
|
|
43
|
+
* `allowed` holds exact paths, and directories ending in `/`; `said` is how the problem names them.
|
|
44
|
+
*/
|
|
45
|
+
export const packProblems = (paths, allowed, said) => paths
|
|
46
|
+
.filter((path) => !allowed.some((entry) => (entry.endsWith("/") ? path.startsWith(entry) : path === entry)))
|
|
47
|
+
.map((path) => `npm pack: ${path} would ship — only ${said} may`);
|
|
48
|
+
export const packContents = (root, allowed, said) => () => {
|
|
49
|
+
const { ok, output } = run(root, "npm", ["pack", "--dry-run", "--json", "--ignore-scripts"]);
|
|
50
|
+
if (!ok)
|
|
51
|
+
return [output.trim()];
|
|
52
|
+
const [packed] = JSON.parse(output.slice(output.indexOf("[")));
|
|
53
|
+
return packProblems((packed?.files ?? []).map(({ path }) => path), allowed, said);
|
|
54
|
+
};
|
|
55
|
+
const VERSION = /export const VERSION = "([^"]*)"/;
|
|
56
|
+
const versionsOf = (root, file) => {
|
|
57
|
+
const declared = packageVersion(root);
|
|
58
|
+
if (typeof declared !== "string" || !/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(declared))
|
|
59
|
+
return `package.json has no usable "version" (got ${JSON.stringify(declared)})`;
|
|
60
|
+
const source = readFileSync(join(root, file), "utf8");
|
|
61
|
+
const current = VERSION.exec(source)?.[1];
|
|
62
|
+
if (!current)
|
|
63
|
+
return `${file} does not export a VERSION string`;
|
|
64
|
+
return { declared, current, source };
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* The whole of a `version:check` / `version:sync` script: what to print, and the exit code — 2 when
|
|
68
|
+
* either file cannot be read, 1 on drift. A CLI keeps its version in `package.json` and in a source
|
|
69
|
+
* file read at run time — `--version` must not load `package.json`, which is not there once the
|
|
70
|
+
* command is bundled — and the day they disagree is a release day.
|
|
71
|
+
*/
|
|
72
|
+
export const versionScript = (root, argv, file = "src/version.ts") => {
|
|
73
|
+
const found = versionsOf(root, file);
|
|
74
|
+
if (typeof found === "string")
|
|
75
|
+
return { code: 2, message: found };
|
|
76
|
+
const { declared, current, source } = found;
|
|
77
|
+
if (argv.includes("--sync")) {
|
|
78
|
+
if (current === declared)
|
|
79
|
+
return { code: 0, message: `version ${declared} — already in step` };
|
|
80
|
+
writeFileSync(join(root, file), source.replace(`"${current}"`, `"${declared}"`));
|
|
81
|
+
return { code: 0, message: `${file}: ${current} → ${declared}` };
|
|
82
|
+
}
|
|
83
|
+
if (current !== declared)
|
|
84
|
+
return {
|
|
85
|
+
code: 1,
|
|
86
|
+
message: `version drift: package.json says ${declared}, ${file} says ${current}.\n` +
|
|
87
|
+
"Run `pnpm version:sync` — package.json is the one that is edited.",
|
|
88
|
+
};
|
|
89
|
+
return { code: 0, message: `version ${declared} — package.json and ${file} agree` };
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"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"}
|