@meshy-ai/cli 0.4.5 → 0.5.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/README.md +5 -3
- package/dist/client/types.d.ts +0 -18
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +0 -28
- package/dist/client/types.js.map +1 -1
- package/dist/cmd/animation-catalog.js +4 -4
- package/dist/cmd/animation-catalog.js.map +1 -1
- package/dist/cmd/api.d.ts.map +1 -1
- package/dist/cmd/api.js +5 -5
- package/dist/cmd/api.js.map +1 -1
- package/dist/cmd/auth.d.ts.map +1 -1
- package/dist/cmd/auth.js +41 -25
- package/dist/cmd/auth.js.map +1 -1
- package/dist/cmd/auto-split.d.ts.map +1 -1
- package/dist/cmd/auto-split.js +0 -1
- package/dist/cmd/auto-split.js.map +1 -1
- package/dist/cmd/balance.d.ts.map +1 -1
- package/dist/cmd/balance.js +6 -6
- package/dist/cmd/balance.js.map +1 -1
- package/dist/cmd/creative-lab.d.ts.map +1 -1
- package/dist/cmd/creative-lab.js +0 -3
- package/dist/cmd/creative-lab.js.map +1 -1
- package/dist/cmd/delete.d.ts.map +1 -1
- package/dist/cmd/delete.js +4 -4
- package/dist/cmd/delete.js.map +1 -1
- package/dist/cmd/doctor.js +4 -4
- package/dist/cmd/doctor.js.map +1 -1
- package/dist/cmd/download.js +7 -7
- package/dist/cmd/download.js.map +1 -1
- package/dist/cmd/inspect.d.ts.map +1 -1
- package/dist/cmd/inspect.js +4 -4
- package/dist/cmd/inspect.js.map +1 -1
- package/dist/cmd/make.d.ts.map +1 -1
- package/dist/cmd/make.js +31 -99
- package/dist/cmd/make.js.map +1 -1
- package/dist/cmd/mesh.js +2 -2
- package/dist/cmd/mesh.js.map +1 -1
- package/dist/cmd/operations.d.ts +16 -0
- package/dist/cmd/operations.d.ts.map +1 -0
- package/dist/cmd/operations.js +66 -0
- package/dist/cmd/operations.js.map +1 -0
- package/dist/cmd/project.js +10 -10
- package/dist/cmd/project.js.map +1 -1
- package/dist/cmd/resources.d.ts +4 -4
- package/dist/cmd/resources.d.ts.map +1 -1
- package/dist/cmd/resources.js +6 -14
- package/dist/cmd/resources.js.map +1 -1
- package/dist/cmd/showcases.d.ts.map +1 -1
- package/dist/cmd/showcases.js +4 -4
- package/dist/cmd/showcases.js.map +1 -1
- package/dist/cmd/slicer.js +4 -4
- package/dist/cmd/slicer.js.map +1 -1
- package/dist/cmd/usage.js +4 -4
- package/dist/cmd/usage.js.map +1 -1
- package/dist/cmd/uv-unwrap.d.ts.map +1 -1
- package/dist/cmd/uv-unwrap.js +0 -1
- package/dist/cmd/uv-unwrap.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -60
- package/dist/index.js.map +1 -1
- package/dist/internal/command-helpers.d.ts +9 -16
- package/dist/internal/command-helpers.d.ts.map +1 -1
- package/dist/internal/command-helpers.js +14 -31
- package/dist/internal/command-helpers.js.map +1 -1
- package/dist/internal/context.d.ts +9 -8
- package/dist/internal/context.d.ts.map +1 -1
- package/dist/internal/context.js +14 -7
- package/dist/internal/context.js.map +1 -1
- package/dist/internal/errors.d.ts +2 -20
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +9 -88
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/global-options.d.ts.map +1 -1
- package/dist/internal/global-options.js +4 -1
- package/dist/internal/global-options.js.map +1 -1
- package/dist/internal/inspect.js +1 -1
- package/dist/internal/inspect.js.map +1 -1
- package/dist/internal/operation-store.d.ts +34 -0
- package/dist/internal/operation-store.d.ts.map +1 -1
- package/dist/internal/operation-store.js +64 -1
- package/dist/internal/operation-store.js.map +1 -1
- package/dist/internal/output.d.ts +4 -13
- package/dist/internal/output.d.ts.map +1 -1
- package/dist/internal/output.js +5 -26
- package/dist/internal/output.js.map +1 -1
- package/dist/internal/result.d.ts +1 -2
- package/dist/internal/result.d.ts.map +1 -1
- package/dist/internal/result.js +1 -1
- package/dist/internal/result.js.map +1 -1
- package/dist/internal/runtime.d.ts +2 -10
- package/dist/internal/runtime.d.ts.map +1 -1
- package/dist/internal/runtime.js +9 -16
- package/dist/internal/runtime.js.map +1 -1
- package/dist/internal/slicers.js +2 -2
- package/dist/internal/slicers.js.map +1 -1
- package/dist/internal/task-command.d.ts +5 -11
- package/dist/internal/task-command.d.ts.map +1 -1
- package/dist/internal/task-command.js +46 -190
- package/dist/internal/task-command.js.map +1 -1
- package/dist/internal/update-notifier.d.ts +5 -25
- package/dist/internal/update-notifier.d.ts.map +1 -1
- package/dist/internal/update-notifier.js +5 -58
- package/dist/internal/update-notifier.js.map +1 -1
- package/dist/internal/views.d.ts +7 -8
- package/dist/internal/views.d.ts.map +1 -1
- package/dist/internal/views.js +24 -9
- package/dist/internal/views.js.map +1 -1
- package/dist/root.d.ts +0 -5
- package/dist/root.d.ts.map +1 -1
- package/dist/root.js +3 -19
- package/dist/root.js.map +1 -1
- package/package.json +1 -1
- package/skills/meshy-cli/SKILL.md +43 -42
- package/dist/internal/report.d.ts +0 -40
- package/dist/internal/report.d.ts.map +0 -1
- package/dist/internal/report.js +0 -48
- package/dist/internal/report.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Responsibilities kept here on purpose:
|
|
6
6
|
* - decide whether the background update check may run before anything else;
|
|
7
|
-
* - turn SIGINT into a cooperative abort (exit 130) instead of a hard kill;
|
|
7
|
+
* - turn SIGINT / SIGTERM / SIGHUP into a cooperative abort (exit 130) instead of a hard kill;
|
|
8
8
|
* - route every failure — including Commander parse errors — through one
|
|
9
|
-
* exit that renders the
|
|
9
|
+
* exit that renders the v1 error envelope in the format the command would have used;
|
|
10
10
|
* - flush stdout before exiting.
|
|
11
11
|
*/
|
|
12
|
-
import { buildRootCommand,
|
|
13
|
-
import { currentCommand, markInterrupted, wasInterrupted } from "./internal/context.js";
|
|
14
|
-
import {
|
|
12
|
+
import { buildRootCommand, LOCAL_COMMANDS } from "./root.js";
|
|
13
|
+
import { currentCommand, interruptedBy, markInterrupted, wasInterrupted } from "./internal/context.js";
|
|
14
|
+
import { isCommanderInformational, CliError } from "./internal/errors.js";
|
|
15
15
|
import { painterFor } from "./internal/color.js";
|
|
16
|
-
import { emitEnvelope, printWarnings
|
|
16
|
+
import { emitEnvelope, printWarnings } from "./internal/output.js";
|
|
17
17
|
import { humanHint } from "./internal/views.js";
|
|
18
18
|
import { stopActiveProgress } from "./internal/progress.js";
|
|
19
19
|
import { errorEnvelope } from "./internal/result.js";
|
|
@@ -64,23 +64,38 @@ export function shouldRunUpdateCheck(argv, env = process.env) {
|
|
|
64
64
|
return false;
|
|
65
65
|
return true;
|
|
66
66
|
}
|
|
67
|
+
/** How long a SIGTERM / SIGHUP waits for the cooperative stop before the process exits anyway. */
|
|
68
|
+
export const TERMINATE_GRACE_MS = 3_000;
|
|
69
|
+
/**
|
|
70
|
+
* SIGTERM and SIGHUP (a harness timing the command out, a closed terminal)
|
|
71
|
+
* take the same cooperative path as SIGINT, so the operation journal records
|
|
72
|
+
* what is known instead of being left at `started` by a hard kill. A command
|
|
73
|
+
* that does not observe the abort (an `auth login` waiting for a person) still
|
|
74
|
+
* exits after TERMINATE_GRACE_MS, as a terminate signal should.
|
|
75
|
+
*/
|
|
67
76
|
function installSignalHandlers() {
|
|
68
77
|
let count = 0;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
|
|
79
|
+
process.on(signal, () => {
|
|
80
|
+
count += 1;
|
|
81
|
+
if (count === 1) {
|
|
82
|
+
markInterrupted(signal);
|
|
83
|
+
stopActiveProgress();
|
|
84
|
+
if (signal === "SIGINT") {
|
|
85
|
+
process.stderr.write("\ninterrupted — finishing local bookkeeping; press Ctrl-C again to force exit\n");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
process.stderr.write(`\ninterrupted by ${signal} — finishing local bookkeeping\n`);
|
|
89
|
+
setTimeout(() => process.exit(130), TERMINATE_GRACE_MS).unref();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
process.exit(130);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
79
95
|
}
|
|
80
96
|
async function reportFailure(program, argv, err) {
|
|
81
97
|
stopActiveProgress();
|
|
82
98
|
const ctx = currentCommand();
|
|
83
|
-
const schema = ctx?.schema ?? resolveSchemaHeuristically(program, argv);
|
|
84
99
|
const format = ctx?.format ?? resolveErrorFormat(program, argv);
|
|
85
100
|
// A SIGINT that surfaced as some other failure is still reported as
|
|
86
101
|
// interrupted — but whatever the command already knew (task id, submission,
|
|
@@ -88,7 +103,7 @@ async function reportFailure(program, argv, err) {
|
|
|
88
103
|
const interruptedErr = wasInterrupted() && !(err instanceof CliError && err.code === "interrupted")
|
|
89
104
|
? new CliError({
|
|
90
105
|
code: "interrupted",
|
|
91
|
-
message: `interrupted by
|
|
106
|
+
message: `interrupted by ${interruptedBy()}${err instanceof Error && err.message ? ` (${err.message})` : ""}`,
|
|
92
107
|
result: err instanceof CliError ? err.result : null,
|
|
93
108
|
warnings: err instanceof CliError ? err.warnings : [],
|
|
94
109
|
recovery: err instanceof CliError ? err.recovery : null,
|
|
@@ -96,36 +111,26 @@ async function reportFailure(program, argv, err) {
|
|
|
96
111
|
cause: err,
|
|
97
112
|
})
|
|
98
113
|
: err;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
printWarnings(envelope.warnings);
|
|
111
|
-
return exitCode;
|
|
112
|
-
}
|
|
113
|
-
try {
|
|
114
|
-
await emitEnvelope(envelope, format);
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
/* stderr already carries the human message */
|
|
118
|
-
}
|
|
114
|
+
const command = ctx?.command ?? commandNameFromArgv(program, argv);
|
|
115
|
+
const { envelope, exitCode } = errorEnvelope(command, interruptedErr);
|
|
116
|
+
const paint = painterFor(process.stderr);
|
|
117
|
+
process.stderr.write(`${paint("error:", "red")} ${envelope.error?.message ?? "unknown error"}\n`);
|
|
118
|
+
const hint = format === "pretty" ? humanHint(envelope.error?.hint, envelope.error?.recovery?.command, envelope.result) : envelope.error?.hint;
|
|
119
|
+
if (hint)
|
|
120
|
+
process.stderr.write(`${paint("hint:", "yellow")} ${hint}\n`);
|
|
121
|
+
// A person at a terminal has the message and the hint; the envelope is for
|
|
122
|
+
// machines, which never get `pretty` unless they ask for it.
|
|
123
|
+
if (format === "pretty") {
|
|
124
|
+
printWarnings(envelope.warnings);
|
|
119
125
|
return exitCode;
|
|
120
126
|
}
|
|
121
|
-
reportError(interruptedErr, format);
|
|
122
127
|
try {
|
|
123
|
-
await
|
|
128
|
+
await emitEnvelope(envelope, format);
|
|
124
129
|
}
|
|
125
130
|
catch {
|
|
126
|
-
/*
|
|
131
|
+
/* stderr already carries the human message */
|
|
127
132
|
}
|
|
128
|
-
return
|
|
133
|
+
return exitCode;
|
|
129
134
|
}
|
|
130
135
|
/**
|
|
131
136
|
* Resolve the output format for the error path.
|
|
@@ -157,24 +162,6 @@ function resolveErrorFormat(program, argv) {
|
|
|
157
162
|
const typedV1 = argv.includes("--output-schema=v1") || (i >= 0 && argv[i + 1]?.toLowerCase() === "v1");
|
|
158
163
|
return resolveFormat({ outputSchema: typedV1 ? "v1" : undefined });
|
|
159
164
|
}
|
|
160
|
-
/**
|
|
161
|
-
* Before an action ran we only know argv. `--output-schema` is a root option,
|
|
162
|
-
* so a parsed value is authoritative; otherwise the first command token decides
|
|
163
|
-
* (new commands are v1-only, everything else is legacy).
|
|
164
|
-
*/
|
|
165
|
-
function resolveSchemaHeuristically(program, argv) {
|
|
166
|
-
const parsed = program.opts()["outputSchema"];
|
|
167
|
-
if (parsed === "v1" || parsed === "legacy")
|
|
168
|
-
return parsed;
|
|
169
|
-
const idx = argv.indexOf("--output-schema");
|
|
170
|
-
if (idx !== -1) {
|
|
171
|
-
const v = argv[idx + 1];
|
|
172
|
-
if (v === "v1" || v === "legacy")
|
|
173
|
-
return v;
|
|
174
|
-
}
|
|
175
|
-
const first = firstCommandToken(program, argv);
|
|
176
|
-
return first && V1_ONLY_COMMANDS.has(first) ? "v1" : "legacy";
|
|
177
|
-
}
|
|
178
165
|
function firstCommandToken(program, argv) {
|
|
179
166
|
const names = new Set(program.commands.map((c) => c.name()));
|
|
180
167
|
return argv.slice(2).find((a) => names.has(a));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAIH,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Small shared pieces every command action uses:
|
|
3
|
-
* - open the command context (name,
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
3
|
+
* - open the command context (name, format) so the error exit can render
|
|
4
|
+
* the failure the way the success path would have;
|
|
5
|
+
* - print a result as the meshy.cli/v1 envelope;
|
|
6
6
|
* - save the raw API JSON (--save-json) with exclusive publication.
|
|
7
7
|
*/
|
|
8
8
|
import { Command } from "commander";
|
|
9
9
|
import { type CommandContext } from "./context.js";
|
|
10
10
|
import { type Warning } from "./errors.js";
|
|
11
11
|
import { type OutputFormat } from "./output.js";
|
|
12
|
-
import { type OutputSchema } from "./result.js";
|
|
13
12
|
import { type GlobalFlags } from "./runtime.js";
|
|
14
13
|
import { type AuthorisedRoot } from "./paths.js";
|
|
15
14
|
export interface OpenedCommand extends CommandContext {
|
|
16
15
|
flags: GlobalFlags;
|
|
17
16
|
}
|
|
18
|
-
/** Read global flags
|
|
19
|
-
export declare function openCommand(thisCmd: Command, command: string
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
* `-o <file>` meaning "write the JSON there" for non-task commands); v1 prints
|
|
23
|
-
* the envelope and treats `-o` on a non-task command as a usage error that
|
|
24
|
-
* points at --save-json.
|
|
25
|
-
*/
|
|
26
|
-
export declare function emitResult(opened: OpenedCommand, legacyValue: unknown, v1Result: unknown, opts?: {
|
|
17
|
+
/** Read global flags and register the command context. */
|
|
18
|
+
export declare function openCommand(thisCmd: Command, command: string): OpenedCommand;
|
|
19
|
+
/** Print a command result as one v1 envelope in the resolved rendering. */
|
|
20
|
+
export declare function emitResult(opened: OpenedCommand, result: unknown, opts?: {
|
|
27
21
|
warnings?: Warning[];
|
|
28
|
-
legacyFile?: string | undefined;
|
|
29
22
|
format?: OutputFormat;
|
|
30
23
|
}): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
export declare function
|
|
24
|
+
/** `-o` is reserved for task assets; a command that produces JSON points at --save-json. */
|
|
25
|
+
export declare function rejectOutputFlag(opened: OpenedCommand, saveJson: string | undefined): void;
|
|
33
26
|
export interface SavedJson {
|
|
34
27
|
path: string;
|
|
35
28
|
bytes: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-helpers.d.ts","sourceRoot":"","sources":["../../src/internal/command-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"command-helpers.d.ts","sourceRoot":"","sources":["../../src/internal/command-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAI5E;AAED,2EAA2E;AAC3E,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,OAAO,EACf,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAO,GACzD,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAO1F;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAChG,SAAS,CAQX;AAED,oGAAoG;AACpG,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAK/E"}
|
|
@@ -1,53 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Small shared pieces every command action uses:
|
|
3
|
-
* - open the command context (name,
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
3
|
+
* - open the command context (name, format) so the error exit can render
|
|
4
|
+
* the failure the way the success path would have;
|
|
5
|
+
* - print a result as the meshy.cli/v1 envelope;
|
|
6
6
|
* - save the raw API JSON (--save-json) with exclusive publication.
|
|
7
7
|
*/
|
|
8
8
|
import { MeshyApiError } from "../client/errors.js";
|
|
9
9
|
import { dirname, resolve as resolvePath } from "node:path";
|
|
10
10
|
import { beginCommand } from "./context.js";
|
|
11
11
|
import { UsageError } from "./errors.js";
|
|
12
|
-
import {
|
|
12
|
+
import { emitEnvelope } from "./output.js";
|
|
13
13
|
import { okEnvelope } from "./result.js";
|
|
14
|
-
import { readGlobalFlags
|
|
14
|
+
import { readGlobalFlags } from "./runtime.js";
|
|
15
15
|
import { writeJsonFile } from "./atomic-file.js";
|
|
16
16
|
import { resolveWithinRoot } from "./paths.js";
|
|
17
|
-
/** Read global flags
|
|
18
|
-
export function openCommand(thisCmd, command
|
|
17
|
+
/** Read global flags and register the command context. */
|
|
18
|
+
export function openCommand(thisCmd, command) {
|
|
19
19
|
const flags = readGlobalFlags(thisCmd);
|
|
20
|
-
const
|
|
21
|
-
const ctx = beginCommand({ command, schema, format: flags.format });
|
|
20
|
+
const ctx = beginCommand({ command, format: flags.format });
|
|
22
21
|
return { ...ctx, flags };
|
|
23
22
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
* the envelope and treats `-o` on a non-task command as a usage error that
|
|
28
|
-
* points at --save-json.
|
|
29
|
-
*/
|
|
30
|
-
export async function emitResult(opened, legacyValue, v1Result, opts = {}) {
|
|
31
|
-
const format = opts.format ?? opened.format;
|
|
32
|
-
if (opened.schema === "v1") {
|
|
33
|
-
await emitEnvelope(okEnvelope(opened.command, v1Result, opts.warnings ?? []), format);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
// Legacy `-o <file>` writes the payload to disk instead of stdout. The TTY
|
|
37
|
-
// default describes a terminal, not a file, so an untyped --format must not
|
|
38
|
-
// leak `pretty` into what callers have always read back as JSON.
|
|
39
|
-
const fileFormat = opts.legacyFile && !opened.flags.formatExplicit && opts.format === undefined ? "json" : format;
|
|
40
|
-
emit(legacyValue, { format: fileFormat, file: opts.legacyFile });
|
|
23
|
+
/** Print a command result as one v1 envelope in the resolved rendering. */
|
|
24
|
+
export async function emitResult(opened, result, opts = {}) {
|
|
25
|
+
await emitEnvelope(okEnvelope(opened.command, result, opts.warnings ?? []), opts.format ?? opened.format);
|
|
41
26
|
}
|
|
42
|
-
/**
|
|
43
|
-
export function
|
|
44
|
-
if (opened.schema !== "v1")
|
|
45
|
-
return;
|
|
27
|
+
/** `-o` is reserved for task assets; a command that produces JSON points at --save-json. */
|
|
28
|
+
export function rejectOutputFlag(opened, saveJson) {
|
|
46
29
|
if (opened.flags.output && saveJson) {
|
|
47
30
|
throw new UsageError("--output/-o and --save-json cannot be combined on this command; -o is for assets, --save-json for the raw JSON");
|
|
48
31
|
}
|
|
49
32
|
if (opened.flags.output) {
|
|
50
|
-
throw new UsageError("this command produces JSON, not assets: use --save-json <file> instead of --output/-o
|
|
33
|
+
throw new UsageError("this command produces JSON, not assets: use --save-json <file> instead of --output/-o");
|
|
51
34
|
}
|
|
52
35
|
}
|
|
53
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/internal/command-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAuB,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/internal/command-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-invocation command context. The CLI runs one command per process; the
|
|
3
|
-
* action that owns the command registers its name
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* action that owns the command registers its name and output format here so
|
|
4
|
+
* the top-level error exit can render the failure the way the success path
|
|
5
|
+
* would have. Parse errors happen before any action
|
|
6
6
|
* runs, so the entry point falls back to argv heuristics when this is unset.
|
|
7
7
|
*
|
|
8
|
-
* The shared AbortController is what SIGINT trips; long
|
|
9
|
-
* stream, download) observe `signal` and convert an abort
|
|
8
|
+
* The shared AbortController is what SIGINT, SIGTERM or SIGHUP trips; long
|
|
9
|
+
* operations (wait, stream, download) observe `signal` and convert an abort
|
|
10
|
+
* into exit 130.
|
|
10
11
|
*/
|
|
11
12
|
import type { ViewFacts } from "./views.js";
|
|
12
13
|
import type { OutputFormat } from "./output.js";
|
|
13
|
-
import type { OutputSchema } from "./result.js";
|
|
14
14
|
export interface CommandContext {
|
|
15
15
|
command: string;
|
|
16
|
-
schema: OutputSchema;
|
|
17
16
|
format: OutputFormat;
|
|
18
17
|
/** Facts only the `pretty` view shows; never part of json/ndjson. */
|
|
19
18
|
view?: ViewFacts;
|
|
@@ -23,8 +22,10 @@ export declare function currentCommand(): CommandContext | null;
|
|
|
23
22
|
/** Hand the human view something the payload does not carry (make: the prompt, the whole chain's time). */
|
|
24
23
|
export declare function noteForView(facts: ViewFacts): void;
|
|
25
24
|
export declare function abortSignal(): AbortSignal;
|
|
26
|
-
export declare function markInterrupted(): void;
|
|
25
|
+
export declare function markInterrupted(signal?: string): void;
|
|
27
26
|
export declare function wasInterrupted(): boolean;
|
|
27
|
+
/** The signal that tripped the abort (SIGINT, SIGTERM or SIGHUP). */
|
|
28
|
+
export declare function interruptedBy(): string;
|
|
28
29
|
/** Test hook: reset module state between in-process runs. */
|
|
29
30
|
export declare function resetCommandContextForTests(): void;
|
|
30
31
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,qEAAqE;IACrE,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAGhE;AAED,wBAAgB,cAAc,IAAI,cAAc,GAAG,IAAI,CAEtD;AAED,2GAA2G;AAC3G,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAElD;AAED,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,wBAAgB,eAAe,CAAC,MAAM,SAAW,GAAG,IAAI,CAKvD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
package/dist/internal/context.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-invocation command context. The CLI runs one command per process; the
|
|
3
|
-
* action that owns the command registers its name
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* action that owns the command registers its name and output format here so
|
|
4
|
+
* the top-level error exit can render the failure the way the success path
|
|
5
|
+
* would have. Parse errors happen before any action
|
|
6
6
|
* runs, so the entry point falls back to argv heuristics when this is unset.
|
|
7
7
|
*
|
|
8
|
-
* The shared AbortController is what SIGINT trips; long
|
|
9
|
-
* stream, download) observe `signal` and convert an abort
|
|
8
|
+
* The shared AbortController is what SIGINT, SIGTERM or SIGHUP trips; long
|
|
9
|
+
* operations (wait, stream, download) observe `signal` and convert an abort
|
|
10
|
+
* into exit 130.
|
|
10
11
|
*/
|
|
11
12
|
let current = null;
|
|
12
13
|
const controller = new AbortController();
|
|
13
14
|
let interrupted = false;
|
|
15
|
+
let interruptSignal = "SIGINT";
|
|
14
16
|
export function beginCommand(ctx) {
|
|
15
17
|
current = ctx;
|
|
16
18
|
return ctx;
|
|
@@ -26,15 +28,20 @@ export function noteForView(facts) {
|
|
|
26
28
|
export function abortSignal() {
|
|
27
29
|
return controller.signal;
|
|
28
30
|
}
|
|
29
|
-
export function markInterrupted() {
|
|
31
|
+
export function markInterrupted(signal = "SIGINT") {
|
|
30
32
|
if (interrupted)
|
|
31
33
|
return;
|
|
32
34
|
interrupted = true;
|
|
33
|
-
|
|
35
|
+
interruptSignal = signal;
|
|
36
|
+
controller.abort(new Error(`interrupted by ${signal}`));
|
|
34
37
|
}
|
|
35
38
|
export function wasInterrupted() {
|
|
36
39
|
return interrupted;
|
|
37
40
|
}
|
|
41
|
+
/** The signal that tripped the abort (SIGINT, SIGTERM or SIGHUP). */
|
|
42
|
+
export function interruptedBy() {
|
|
43
|
+
return interruptSignal;
|
|
44
|
+
}
|
|
38
45
|
/** Test hook: reset module state between in-process runs. */
|
|
39
46
|
export function resetCommandContextForTests() {
|
|
40
47
|
current = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,IAAI,OAAO,GAA0B,IAAI,CAAC;AAC1C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;AACzC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,eAAe,GAAG,QAAQ,CAAC;AAE/B,MAAM,UAAU,YAAY,CAAC,GAAmB;IAC9C,OAAO,GAAG,GAAG,CAAC;IACd,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,IAAI,OAAO;QAAE,OAAO,CAAC,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAM,GAAG,QAAQ;IAC/C,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IACnB,eAAe,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa;IAC3B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,2BAA2B;IACzC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC"}
|
|
@@ -3,14 +3,10 @@
|
|
|
3
3
|
* human-friendly line, emits the structured payload when --format=json, and
|
|
4
4
|
* maps error classes to conventional exit codes for scripting.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* that 0.2.0 consumers parse (toErrorPayload / reportError).
|
|
9
|
-
* - v1: `classifyError` yields the stable code/exit/http/recovery tuple that
|
|
10
|
-
* result.ts wraps into the `meshy.cli/v1` envelope.
|
|
6
|
+
* `classifyError` yields the stable code/exit/http/recovery tuple that
|
|
7
|
+
* result.ts wraps into the `meshy.cli/v1` error envelope; index.ts prints it.
|
|
11
8
|
*/
|
|
12
9
|
import { CommanderError } from "commander";
|
|
13
|
-
import { type OutputFormat } from "./output.js";
|
|
14
10
|
export declare const EXIT_CODES: {
|
|
15
11
|
readonly OK: 0;
|
|
16
12
|
readonly GENERIC: 1;
|
|
@@ -123,18 +119,4 @@ export interface ClassifiedError {
|
|
|
123
119
|
}
|
|
124
120
|
/** Map any thrown value onto the stable v1 error tuple. Never throws. */
|
|
125
121
|
export declare function classifyError(err: unknown): ClassifiedError;
|
|
126
|
-
/** Legacy stderr + payload reporter (unchanged shape for 0.2.0 consumers). */
|
|
127
|
-
export declare function reportError(err: unknown, format: OutputFormat): void;
|
|
128
|
-
/**
|
|
129
|
-
* The payload shape stays additive: `hint` and `docs` join the existing
|
|
130
|
-
* name/message/status/code/path fields rather than moving everything under an
|
|
131
|
-
* `{ok:false, error:{…}}` envelope. Successful commands emit bare API payloads
|
|
132
|
-
* with no `ok` field, so an envelope on failures only would force consumers to
|
|
133
|
-
* probe for two different shapes.
|
|
134
|
-
*/
|
|
135
|
-
export declare function toErrorPayload(err: unknown): {
|
|
136
|
-
name: string;
|
|
137
|
-
message: string;
|
|
138
|
-
[k: string]: unknown;
|
|
139
|
-
};
|
|
140
122
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/errors.js
CHANGED
|
@@ -3,17 +3,11 @@
|
|
|
3
3
|
* human-friendly line, emits the structured payload when --format=json, and
|
|
4
4
|
* maps error classes to conventional exit codes for scripting.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* that 0.2.0 consumers parse (toErrorPayload / reportError).
|
|
9
|
-
* - v1: `classifyError` yields the stable code/exit/http/recovery tuple that
|
|
10
|
-
* result.ts wraps into the `meshy.cli/v1` envelope.
|
|
6
|
+
* `classifyError` yields the stable code/exit/http/recovery tuple that
|
|
7
|
+
* result.ts wraps into the `meshy.cli/v1` error envelope; index.ts prints it.
|
|
11
8
|
*/
|
|
12
9
|
import { CommanderError } from "commander";
|
|
13
10
|
import { MeshyApiError } from "../client/errors.js";
|
|
14
|
-
import { emit } from "./output.js";
|
|
15
|
-
import { painterFor } from "./color.js";
|
|
16
|
-
import { humanHint } from "./views.js";
|
|
17
11
|
export const EXIT_CODES = {
|
|
18
12
|
OK: 0,
|
|
19
13
|
GENERIC: 1,
|
|
@@ -244,8 +238,14 @@ export function classifyError(err) {
|
|
|
244
238
|
else if (err.code === "step_failed")
|
|
245
239
|
code = "task_failed";
|
|
246
240
|
const exitCode = err.exitCode ?? EXIT_FOR_CODE[code];
|
|
241
|
+
// DeviceFlowError (a HintedError subclass) carries the OAuth error code
|
|
242
|
+
// (access_denied / expired_token / invalid_grant …); machines read it as
|
|
243
|
+
// `details.oauth_error`. Read loosely to avoid importing device.ts.
|
|
244
|
+
const oauthError = err["oauthErrorCode"];
|
|
247
245
|
return {
|
|
248
|
-
...base(code, err.message, {
|
|
246
|
+
...base(code, err.message, {
|
|
247
|
+
details: { code: err.code, docs: err.docs, ...(typeof oauthError === "string" ? { oauth_error: oauthError } : {}) },
|
|
248
|
+
}),
|
|
249
249
|
exitCode,
|
|
250
250
|
hint: err.hint,
|
|
251
251
|
recovery: err.hint ? { action: "run_hint", automatic: false, command: err.hint } : null,
|
|
@@ -273,83 +273,4 @@ function base(code, message, extra = {}) {
|
|
|
273
273
|
warnings: [],
|
|
274
274
|
};
|
|
275
275
|
}
|
|
276
|
-
/** Legacy stderr + payload reporter (unchanged shape for 0.2.0 consumers). */
|
|
277
|
-
export function reportError(err, format) {
|
|
278
|
-
const payload = toErrorPayload(err);
|
|
279
|
-
// Painted against stderr, not stdout: `meshy ... | jq` still shows a red
|
|
280
|
-
// error line in the terminal, and `2> log` gets clean text.
|
|
281
|
-
const paint = painterFor(process.stderr);
|
|
282
|
-
process.stderr.write(`${paint("error:", "red")} ${payload.message}\n`);
|
|
283
|
-
// A person also gets a way forward when there is no hint (make's interrupt,
|
|
284
|
-
// a poll that lost the network). Machines read it from the payload.
|
|
285
|
-
const hint = format === "pretty"
|
|
286
|
-
? humanHint(payload["hint"], err instanceof CliError ? err.recovery?.command : undefined, payload["result"])
|
|
287
|
-
: typeof payload["hint"] === "string" ? payload["hint"] : undefined;
|
|
288
|
-
if (hint)
|
|
289
|
-
process.stderr.write(`${paint("hint:", "yellow")} ${hint}\n`);
|
|
290
|
-
if (format !== "pretty") {
|
|
291
|
-
try {
|
|
292
|
-
emit(payload, { format });
|
|
293
|
-
}
|
|
294
|
-
catch {
|
|
295
|
-
/* ignore: stderr already carries the human message */
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* The payload shape stays additive: `hint` and `docs` join the existing
|
|
301
|
-
* name/message/status/code/path fields rather than moving everything under an
|
|
302
|
-
* `{ok:false, error:{…}}` envelope. Successful commands emit bare API payloads
|
|
303
|
-
* with no `ok` field, so an envelope on failures only would force consumers to
|
|
304
|
-
* probe for two different shapes.
|
|
305
|
-
*/
|
|
306
|
-
export function toErrorPayload(err) {
|
|
307
|
-
if (err instanceof MeshyApiError) {
|
|
308
|
-
return { ...err.toJSON(), ...hintForApiError(err), name: err.name, message: err.message };
|
|
309
|
-
}
|
|
310
|
-
if (err instanceof CliError) {
|
|
311
|
-
// Additive convenience fields: a legacy consumer reading an error after a
|
|
312
|
-
// create must find the accepted task without digging into `result`.
|
|
313
|
-
const result = err.result ?? undefined;
|
|
314
|
-
const taskId = typeof result?.["task_id"] === "string" ? result["task_id"] : undefined;
|
|
315
|
-
const submission = result?.["submission"];
|
|
316
|
-
const operationId = typeof submission?.operation_id === "string" ? submission.operation_id : undefined;
|
|
317
|
-
return {
|
|
318
|
-
name: err.name,
|
|
319
|
-
message: err.message,
|
|
320
|
-
code: err.code,
|
|
321
|
-
...(err.httpStatus !== null ? { status: err.httpStatus } : {}),
|
|
322
|
-
...(err.hint ? { hint: err.hint } : {}),
|
|
323
|
-
...(taskId ? { task_id: taskId } : {}),
|
|
324
|
-
...(operationId ? { operation_id: operationId } : {}),
|
|
325
|
-
...(result ? { result } : {}),
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
if (err instanceof CommanderError) {
|
|
329
|
-
return { name: "UsageError", message: err.message.replace(/^error:\s*/i, "").trim(), code: err.code };
|
|
330
|
-
}
|
|
331
|
-
if (err instanceof HintedError) {
|
|
332
|
-
// DeviceFlowError (a HintedError subclass) carries an oauthErrorCode field
|
|
333
|
-
// that machine consumers need to distinguish access_denied / invalid_grant /
|
|
334
|
-
// expired_token etc. Serialise it as `oauth_error` (snake_case, consistent
|
|
335
|
-
// with the rest of the JSON error payload) without importing the subclass
|
|
336
|
-
// (which would create a circular dependency through device.ts → errors.ts).
|
|
337
|
-
const errAsUnknown = err;
|
|
338
|
-
const oauthError = typeof errAsUnknown["oauthErrorCode"] === "string"
|
|
339
|
-
? errAsUnknown["oauthErrorCode"]
|
|
340
|
-
: undefined;
|
|
341
|
-
return {
|
|
342
|
-
name: err.name,
|
|
343
|
-
message: err.message,
|
|
344
|
-
code: err.code,
|
|
345
|
-
...(oauthError !== undefined ? { oauth_error: oauthError } : {}),
|
|
346
|
-
...(err.hint ? { hint: err.hint } : {}),
|
|
347
|
-
...(err.docs ? { docs: err.docs } : {}),
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
if (err instanceof Error) {
|
|
351
|
-
return { name: err.name, message: err.message };
|
|
352
|
-
}
|
|
353
|
-
return { name: "Error", message: String(err) };
|
|
354
|
-
}
|
|
355
276
|
//# sourceMappingURL=errors.js.map
|