gooseworks 0.2.2 → 0.2.5
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/.claude-plugin/plugin.json +4 -2
- package/README.md +31 -4
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +4 -3
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/codex.d.ts.map +1 -1
- package/dist/agents/codex.js +4 -3
- package/dist/agents/codex.js.map +1 -1
- package/dist/auth/oauth-server.d.ts.map +1 -1
- package/dist/auth/oauth-server.js +27 -19
- package/dist/auth/oauth-server.js.map +1 -1
- package/dist/commands/formats.d.ts +3 -0
- package/dist/commands/formats.d.ts.map +1 -0
- package/dist/commands/formats.js +155 -0
- package/dist/commands/formats.js.map +1 -0
- package/dist/commands/graphics/get-flow.d.ts +30 -0
- package/dist/commands/graphics/get-flow.d.ts.map +1 -0
- package/dist/commands/graphics/get-flow.js +212 -0
- package/dist/commands/graphics/get-flow.js.map +1 -0
- package/dist/commands/graphics/publish-flow.d.ts +28 -0
- package/dist/commands/graphics/publish-flow.d.ts.map +1 -0
- package/dist/commands/graphics/publish-flow.js +178 -0
- package/dist/commands/graphics/publish-flow.js.map +1 -0
- package/dist/commands/graphics/shared.d.ts +48 -0
- package/dist/commands/graphics/shared.d.ts.map +1 -0
- package/dist/commands/graphics/shared.js +181 -0
- package/dist/commands/graphics/shared.js.map +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +29 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/styles.d.ts +3 -0
- package/dist/commands/styles.d.ts.map +1 -0
- package/dist/commands/styles.js +157 -0
- package/dist/commands/styles.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/graphics-api.d.ts +106 -0
- package/dist/lib/graphics-api.d.ts.map +1 -0
- package/dist/lib/graphics-api.js +289 -0
- package/dist/lib/graphics-api.js.map +1 -0
- package/dist/lib/graphics-cache.d.ts +31 -0
- package/dist/lib/graphics-cache.d.ts.map +1 -0
- package/dist/lib/graphics-cache.js +126 -0
- package/dist/lib/graphics-cache.js.map +1 -0
- package/dist/lib/graphics-manifest.d.ts +96 -0
- package/dist/lib/graphics-manifest.d.ts.map +1 -0
- package/dist/lib/graphics-manifest.js +289 -0
- package/dist/lib/graphics-manifest.js.map +1 -0
- package/dist/skills/installer.d.ts +7 -0
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +114 -2
- package/dist/skills/installer.js.map +1 -1
- package/dist/skills/names.d.ts +2 -0
- package/dist/skills/names.d.ts.map +1 -0
- package/dist/skills/names.js +7 -0
- package/dist/skills/names.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generic `get <slug>` flow shared by styles + formats.
|
|
4
|
+
*
|
|
5
|
+
* Default output: hits the markdown endpoint (design.md or spec.md), prints
|
|
6
|
+
* the body to stdout, with ETag-keyed disk cache and offline fallback.
|
|
7
|
+
*
|
|
8
|
+
* --json: hits the JSON record endpoint and prints it to stdout.
|
|
9
|
+
*
|
|
10
|
+
* --include-examples: also downloads example PNGs from the JSON record into
|
|
11
|
+
* ./<slug>/<format>.png (current working directory).
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.runGetFlow = runGetFlow;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const graphics_api_1 = require("../../lib/graphics-api");
|
|
51
|
+
const graphics_api_2 = require("../../lib/graphics-api");
|
|
52
|
+
const graphics_cache_1 = require("../../lib/graphics-cache");
|
|
53
|
+
const graphics_manifest_1 = require("../../lib/graphics-manifest");
|
|
54
|
+
const shared_1 = require("./shared");
|
|
55
|
+
async function runGetFlow(cfg, slug, opts) {
|
|
56
|
+
if (opts.json) {
|
|
57
|
+
await emitJson(cfg, slug, !!opts.includeExamples, !!opts.noCache);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await emitMarkdown(cfg, slug, !!opts.noCache);
|
|
61
|
+
if (opts.includeExamples) {
|
|
62
|
+
await downloadExamples(cfg, slug);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function emitMarkdown(cfg, slug, noCache) {
|
|
66
|
+
const cached = noCache ? null : (0, graphics_cache_1.readCache)(cfg.resource, slug, 'md');
|
|
67
|
+
const etag = cached?.etag ?? null;
|
|
68
|
+
try {
|
|
69
|
+
const res = await cfg.fetchMarkdown(slug, etag);
|
|
70
|
+
if (res.status === 304 && cached) {
|
|
71
|
+
process.stdout.write(cached.body);
|
|
72
|
+
if (!cached.body.endsWith('\n'))
|
|
73
|
+
process.stdout.write('\n');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (res.status === 200 && res.body !== null) {
|
|
77
|
+
if (!noCache)
|
|
78
|
+
(0, graphics_cache_1.writeCache)(cfg.resource, slug, 'md', res.body, res.etag);
|
|
79
|
+
process.stdout.write(res.body);
|
|
80
|
+
if (!res.body.endsWith('\n'))
|
|
81
|
+
process.stdout.write('\n');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// 304 with no cached body shouldn't happen in practice — fall through.
|
|
85
|
+
process.stderr.write('Unexpected 304 with no cached body.\n');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (cached && (err instanceof graphics_api_1.NetworkError || isTransientApiError(err))) {
|
|
90
|
+
process.stderr.write(`Warning: ${describeFetchError(err)} — serving cached copy.\n`);
|
|
91
|
+
process.stdout.write(cached.body);
|
|
92
|
+
if (!cached.body.endsWith('\n'))
|
|
93
|
+
process.stdout.write('\n');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
(0, shared_1.reportApiErrorAndExit)(err);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function emitJson(cfg, slug, includeExamples, noCache) {
|
|
100
|
+
const cached = noCache ? null : (0, graphics_cache_1.readCache)(cfg.resource, slug, 'json');
|
|
101
|
+
const cachedEtag = cached?.etag ?? null;
|
|
102
|
+
let recordData;
|
|
103
|
+
try {
|
|
104
|
+
const res = await cfg.fetchRecord(slug, cachedEtag);
|
|
105
|
+
if (res.status === 304 && cached) {
|
|
106
|
+
recordData = JSON.parse(cached.body).data;
|
|
107
|
+
}
|
|
108
|
+
else if (res.status === 200 && res.envelope) {
|
|
109
|
+
recordData = res.envelope.data;
|
|
110
|
+
if (!noCache) {
|
|
111
|
+
(0, graphics_cache_1.writeCache)(cfg.resource, slug, 'json', JSON.stringify(res.envelope, null, 2), res.etag);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
process.stderr.write('Unexpected 304 with no cached body.\n');
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
if (cached && (err instanceof graphics_api_1.NetworkError || isTransientApiError(err))) {
|
|
121
|
+
process.stderr.write(`Warning: ${describeFetchError(err)} — serving cached copy.\n`);
|
|
122
|
+
// The cached body is the full envelope; print just `.data` to match
|
|
123
|
+
// the freshly-fetched output shape.
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(cached.body);
|
|
126
|
+
process.stdout.write(JSON.stringify(parsed.data, null, 2));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
process.stdout.write(cached.body);
|
|
130
|
+
}
|
|
131
|
+
process.stdout.write('\n');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
(0, shared_1.reportApiErrorAndExit)(err);
|
|
135
|
+
}
|
|
136
|
+
process.stdout.write(JSON.stringify(recordData, null, 2));
|
|
137
|
+
process.stdout.write('\n');
|
|
138
|
+
if (includeExamples) {
|
|
139
|
+
await downloadExamplesFromRecord(recordData, slug);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function downloadExamples(cfg, slug) {
|
|
143
|
+
let recordData;
|
|
144
|
+
try {
|
|
145
|
+
const res = await cfg.fetchRecord(slug, null);
|
|
146
|
+
if (res.status !== 200 || !res.envelope) {
|
|
147
|
+
process.stderr.write('Could not download examples: empty record response.\n');
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
recordData = res.envelope.data;
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
process.stderr.write(`Could not download examples: ${describeFetchError(err)}\n`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
await downloadExamplesFromRecord(recordData, slug);
|
|
157
|
+
}
|
|
158
|
+
async function downloadExamplesFromRecord(record, slug) {
|
|
159
|
+
const examples = (record.examples ?? []);
|
|
160
|
+
if (examples.length === 0) {
|
|
161
|
+
process.stderr.write('No examples to download.\n');
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// The directory name comes from the user-supplied CLI slug, not record.slug,
|
|
165
|
+
// and we re-validate before using it as a path component.
|
|
166
|
+
if (!graphics_manifest_1.SLUG_RE.test(slug)) {
|
|
167
|
+
process.stderr.write(`Refusing to write examples: slug '${slug}' is not a valid slug.\n`);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const targetDir = path.resolve(process.cwd(), slug);
|
|
171
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
172
|
+
for (const ex of examples) {
|
|
173
|
+
const url = ex.url || ex.imageUrl;
|
|
174
|
+
if (!url)
|
|
175
|
+
continue;
|
|
176
|
+
if (!isSafeDownloadUrl(url)) {
|
|
177
|
+
process.stderr.write(` skipped ${url}: only http(s) URLs are downloaded\n`);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const format = typeof ex.format === 'string' && graphics_manifest_1.SLUG_RE.test(ex.format) ? ex.format : 'example';
|
|
181
|
+
const fileName = `${format}.png`;
|
|
182
|
+
try {
|
|
183
|
+
const bytes = await (0, graphics_api_2.downloadBytes)(url);
|
|
184
|
+
const dest = path.join(targetDir, fileName);
|
|
185
|
+
fs.writeFileSync(dest, bytes);
|
|
186
|
+
process.stderr.write(` saved ${path.relative(process.cwd(), dest)}\n`);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
process.stderr.write(` failed to download ${url}: ${describeFetchError(err)}\n`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function isSafeDownloadUrl(url) {
|
|
194
|
+
try {
|
|
195
|
+
const parsed = new URL(url);
|
|
196
|
+
return parsed.protocol === 'https:' || parsed.protocol === 'http:';
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function isTransientApiError(err) {
|
|
203
|
+
return err instanceof graphics_api_1.ApiError && err.status >= 500;
|
|
204
|
+
}
|
|
205
|
+
function describeFetchError(err) {
|
|
206
|
+
if (err instanceof graphics_api_1.NetworkError)
|
|
207
|
+
return `network unreachable (${err.message})`;
|
|
208
|
+
if (err instanceof graphics_api_1.ApiError)
|
|
209
|
+
return `server error ${err.status}`;
|
|
210
|
+
return err instanceof Error ? err.message : String(err);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=get-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-flow.js","sourceRoot":"","sources":["../../../src/commands/graphics/get-flow.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCH,gCAaC;AA5CD,uCAAyB;AACzB,2CAA6B;AAC7B,yDAKgC;AAChC,yDAAuD;AACvD,6DAIkC;AAClC,mEAAsD;AACtD,qCAAiD;AAgB1C,KAAK,UAAU,UAAU,CAC9B,GAAiB,EACjB,IAAY,EACZ,IAAgB;IAEhB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAiB,EACjB,IAAY,EACZ,OAAgB;IAEhB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,0BAAS,EAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,IAAA,2BAAU,EAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD,uEAAuE;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,MAAM,IAAI,CAAC,GAAG,YAAY,2BAAY,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,kBAAkB,CAAC,GAAG,CAAC,2BAA2B,CAC/D,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,IAAA,8BAAqB,EAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,GAAiB,EACjB,IAAY,EACZ,eAAwB,EACxB,OAAgB;IAEhB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,0BAAS,EAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IAExC,IAAI,UAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;YACjC,UAAU,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAiB,CAAC,IAAI,CAAC;QAC7D,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC9C,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAA,2BAAU,EACR,GAAG,CAAC,QAAQ,EACZ,IAAI,EACJ,MAAM,EACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,GAAG,CAAC,IAAI,CACT,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,MAAM,IAAI,CAAC,GAAG,YAAY,2BAAY,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,kBAAkB,CAAC,GAAG,CAAC,2BAA2B,CAC/D,CAAC;YACF,oEAAoE;YACpE,oCAAoC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAsB,CAAC;gBAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAA,8BAAqB,EAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,0BAA0B,CAC9B,UAAqD,EACrD,IAAI,CACL,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,GAAiB,EACjB,IAAY;IAEZ,IAAI,UAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QACD,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAC5D,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,0BAA0B,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAQD,KAAK,UAAU,0BAA0B,CACvC,MAA+C,EAC/C,IAAY;IAEZ,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAkB,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,CAAC,2BAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,IAAI,0BAA0B,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACpD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,sCAAsC,CAAC,CAAC;YAC7E,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,2BAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAChG,MAAM,QAAQ,GAAG,GAAG,MAAM,MAAM,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAA,4BAAa,EAAC,GAAG,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,GAAG,KAAK,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,uBAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,2BAAY;QAAE,OAAO,wBAAwB,GAAG,CAAC,OAAO,GAAG,CAAC;IAC/E,IAAI,GAAG,YAAY,uBAAQ;QAAE,OAAO,gBAAgB,GAAG,CAAC,MAAM,EAAE,CAAC;IACjE,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic publish/update orchestration shared by the styles and formats
|
|
3
|
+
* commands. Handles manifest read + validate + slug overlay, multipart
|
|
4
|
+
* upload, and the 409 slug-collision retry loop.
|
|
5
|
+
*/
|
|
6
|
+
import { type ValidationResult, type ResolvedExampleFile } from '../../lib/graphics-manifest';
|
|
7
|
+
import { type WriteResult } from '../../lib/graphics-api';
|
|
8
|
+
export interface PublishConfig {
|
|
9
|
+
manifestFilename: string;
|
|
10
|
+
validate: (manifest: unknown) => ValidationResult;
|
|
11
|
+
/** Hub URL to print on success, e.g. `https://app.gooseworks.ai/styles/<slug>`. */
|
|
12
|
+
hubUrl: (slug: string) => string;
|
|
13
|
+
/** Resource label used in user-facing messages: 'style' or 'format'. */
|
|
14
|
+
label: 'style' | 'format';
|
|
15
|
+
/** Performs the create/update upload. Returns the new slug + id. */
|
|
16
|
+
upload: (manifest: Record<string, unknown>, files: ResolvedExampleFile[]) => Promise<WriteResult>;
|
|
17
|
+
}
|
|
18
|
+
export interface PublishOptions {
|
|
19
|
+
/** Defaults to process.cwd(). */
|
|
20
|
+
dir?: string;
|
|
21
|
+
/** Override the manifest's slug at publish time. */
|
|
22
|
+
slug?: string;
|
|
23
|
+
/** Skip interactive prompts. */
|
|
24
|
+
yes?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function runPublishFlow(cfg: PublishConfig, opts: PublishOptions): Promise<void>;
|
|
27
|
+
export declare function runUpdateFlow(cfg: PublishConfig, opts: PublishOptions): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=publish-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-flow.d.ts","sourceRoot":"","sources":["../../../src/commands/graphics/publish-flow.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAOpE,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,gBAAgB,CAAC;IAClD,mFAAmF;IACnF,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,wEAAwE;IACxE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,oEAAoE;IACpE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACnG;AAED,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAyBD,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generic publish/update orchestration shared by the styles and formats
|
|
4
|
+
* commands. Handles manifest read + validate + slug overlay, multipart
|
|
5
|
+
* upload, and the 409 slug-collision retry loop.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.runPublishFlow = runPublishFlow;
|
|
42
|
+
exports.runUpdateFlow = runUpdateFlow;
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const graphics_manifest_1 = require("../../lib/graphics-manifest");
|
|
45
|
+
const graphics_api_1 = require("../../lib/graphics-api");
|
|
46
|
+
const shared_1 = require("./shared");
|
|
47
|
+
function formatValidationErrors(errors) {
|
|
48
|
+
return errors.map((e) => ` • ${e}`).join('\n');
|
|
49
|
+
}
|
|
50
|
+
function formatServerValidationErrors(body) {
|
|
51
|
+
if (!body?.errors)
|
|
52
|
+
return '';
|
|
53
|
+
return body.errors
|
|
54
|
+
.map((e) => {
|
|
55
|
+
if (typeof e === 'string')
|
|
56
|
+
return ` • ${e}`;
|
|
57
|
+
if (e.path)
|
|
58
|
+
return ` • ${e.path}: ${e.message ?? 'invalid'}`;
|
|
59
|
+
return ` • ${e.message ?? 'invalid'}`;
|
|
60
|
+
})
|
|
61
|
+
.join('\n');
|
|
62
|
+
}
|
|
63
|
+
async function runPublishFlow(cfg, opts) {
|
|
64
|
+
await runWriteFlow(cfg, opts, /* allowSlugRetry */ true);
|
|
65
|
+
}
|
|
66
|
+
async function runUpdateFlow(cfg, opts) {
|
|
67
|
+
// Update has no slug-collision retry — the slug is already locked.
|
|
68
|
+
await runWriteFlow(cfg, opts, /* allowSlugRetry */ false);
|
|
69
|
+
}
|
|
70
|
+
async function runWriteFlow(cfg, opts, allowSlugRetry) {
|
|
71
|
+
const dir = path.resolve(opts.dir ?? process.cwd());
|
|
72
|
+
const manifestPath = path.join(dir, cfg.manifestFilename);
|
|
73
|
+
let manifest;
|
|
74
|
+
try {
|
|
75
|
+
manifest = (0, graphics_manifest_1.readManifestFile)(manifestPath);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (err instanceof graphics_manifest_1.ManifestParseError) {
|
|
79
|
+
process.stderr.write(`${err.message}\n`);
|
|
80
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
81
|
+
}
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
if (typeof manifest !== 'object' || manifest === null || Array.isArray(manifest)) {
|
|
85
|
+
process.stderr.write(`${cfg.manifestFilename} must contain a JSON object.\n`);
|
|
86
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
87
|
+
}
|
|
88
|
+
if (opts.slug) {
|
|
89
|
+
manifest.slug = opts.slug;
|
|
90
|
+
}
|
|
91
|
+
validateOrExit(cfg, manifest);
|
|
92
|
+
const examples = manifest.examples ?? [];
|
|
93
|
+
let files;
|
|
94
|
+
try {
|
|
95
|
+
files = (0, graphics_manifest_1.resolveExampleFiles)(dir, examples);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
if (err instanceof graphics_manifest_1.ManifestMissingFileError) {
|
|
99
|
+
process.stderr.write(`Manifest references file '${err.missing}' but it doesn't exist in ${dir}.\n`);
|
|
100
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
101
|
+
}
|
|
102
|
+
if (err instanceof graphics_manifest_1.ManifestEscapingPathError) {
|
|
103
|
+
process.stderr.write(`Manifest references file '${err.ref}' which escapes the manifest directory ${dir}.\n`);
|
|
104
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
105
|
+
}
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
const result = await uploadOrExit(cfg, opts, manifest, files, allowSlugRetry);
|
|
109
|
+
process.stdout.write(`${cfg.label === 'style' ? 'Published style' : 'Published format'}: ${result.slug}\n` +
|
|
110
|
+
`${cfg.hubUrl(result.slug)}\n`);
|
|
111
|
+
}
|
|
112
|
+
function validateOrExit(cfg, manifest) {
|
|
113
|
+
const validation = cfg.validate(manifest);
|
|
114
|
+
if (!validation.ok) {
|
|
115
|
+
process.stderr.write(`Manifest validation failed:\n${formatValidationErrors(validation.errors)}\n`);
|
|
116
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function uploadOrExit(cfg, opts, manifest, files, allowSlugRetry) {
|
|
120
|
+
try {
|
|
121
|
+
return await cfg.upload(manifest, files);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (!(err instanceof graphics_api_1.ApiError))
|
|
125
|
+
(0, shared_1.reportApiErrorAndExit)(err);
|
|
126
|
+
const body = (err.body || {});
|
|
127
|
+
if (err.status === 400 && body.error === 'validation_failed') {
|
|
128
|
+
const lines = formatServerValidationErrors(body);
|
|
129
|
+
process.stderr.write(`Server validation failed${lines ? `:\n${lines}` : ''}\n`);
|
|
130
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
131
|
+
}
|
|
132
|
+
if (err.status === 400 && body.error === 'missing_file') {
|
|
133
|
+
process.stderr.write(`Server says file '${body.file ?? '?'}' is missing from the upload.\n`);
|
|
134
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
135
|
+
}
|
|
136
|
+
if (err.status === 400 && body.error === 'manifest_parse') {
|
|
137
|
+
process.stderr.write(`Server could not parse manifest: ${body.message ?? 'unknown'}\n`);
|
|
138
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
139
|
+
}
|
|
140
|
+
if (err.status === 413) {
|
|
141
|
+
process.stderr.write(`File too large: ${body.file ?? 'one of the uploaded files'} (max 10 MB).\n`);
|
|
142
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
143
|
+
}
|
|
144
|
+
if (err.status === 403) {
|
|
145
|
+
process.stderr.write(`You don't own this ${cfg.label}. Only its author can update or delete it.\n`);
|
|
146
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
147
|
+
}
|
|
148
|
+
if (err.status === 409 && body.error === 'slug_taken' && allowSlugRetry) {
|
|
149
|
+
return await retryWithSuggestedSlug(cfg, opts, manifest, files, body);
|
|
150
|
+
}
|
|
151
|
+
(0, shared_1.reportApiErrorAndExit)(err);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function retryWithSuggestedSlug(cfg, opts, manifest, files, body) {
|
|
155
|
+
const suggested = body.suggested_slug;
|
|
156
|
+
if (!suggested) {
|
|
157
|
+
process.stderr.write(`Slug taken and the server didn't suggest an alternative.\n`);
|
|
158
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
159
|
+
}
|
|
160
|
+
const accept = opts.yes ||
|
|
161
|
+
(await (0, shared_1.promptYesNo)(`Slug '${manifest.slug ?? '?'}' is taken. Use '${suggested}' instead?`, true));
|
|
162
|
+
if (!accept) {
|
|
163
|
+
process.stderr.write(`Aborted: slug collision unresolved.\n`);
|
|
164
|
+
process.exit(shared_1.EXIT_USER_ERROR);
|
|
165
|
+
}
|
|
166
|
+
manifest.slug = suggested;
|
|
167
|
+
// Re-run client validation: the server's suggestion could in principle
|
|
168
|
+
// fail our slug grammar, and shipping a broken value to the server
|
|
169
|
+
// produces an opaque second error rather than a clean local message.
|
|
170
|
+
validateOrExit(cfg, manifest);
|
|
171
|
+
try {
|
|
172
|
+
return await cfg.upload(manifest, files);
|
|
173
|
+
}
|
|
174
|
+
catch (retryErr) {
|
|
175
|
+
(0, shared_1.reportApiErrorAndExit)(retryErr);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=publish-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-flow.js","sourceRoot":"","sources":["../../../src/commands/graphics/publish-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the styles/formats command families.
|
|
3
|
+
*
|
|
4
|
+
* Exit codes follow the spec:
|
|
5
|
+
* 0 = success
|
|
6
|
+
* 1 = transient or auth error (network, 401, 5xx)
|
|
7
|
+
* 2 = user error (bad input, 400, 403, 404, declined 409)
|
|
8
|
+
*/
|
|
9
|
+
import { type Credentials } from '../../auth/credentials';
|
|
10
|
+
export declare const EXIT_OK = 0;
|
|
11
|
+
export declare const EXIT_TRANSIENT = 1;
|
|
12
|
+
export declare const EXIT_USER_ERROR = 2;
|
|
13
|
+
export declare function requireCredentials(): Credentials;
|
|
14
|
+
export declare function getOptionalCredentials(): Credentials | null;
|
|
15
|
+
/**
|
|
16
|
+
* Build the api-client options for read-only commands. Falls back to the
|
|
17
|
+
* compiled-in API_BASE when the user is not logged in, so anonymous reads
|
|
18
|
+
* still work.
|
|
19
|
+
*/
|
|
20
|
+
export declare function clientOpts(): {
|
|
21
|
+
apiBase: string;
|
|
22
|
+
apiKey: string | null;
|
|
23
|
+
};
|
|
24
|
+
/** Build api-client options for commands that require auth (publish/update/delete). */
|
|
25
|
+
export declare function authedClientOpts(): {
|
|
26
|
+
apiBase: string;
|
|
27
|
+
apiKey: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Parse a non-negative integer command-line option. Exits with the user-error
|
|
31
|
+
* code if the value is malformed.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseIntOpt(value: string | undefined, name: string): number | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Translate a thrown error from the API client into a stderr message + exit
|
|
36
|
+
* code. Never re-throws.
|
|
37
|
+
*/
|
|
38
|
+
export declare function reportApiErrorAndExit(err: unknown): never;
|
|
39
|
+
export declare function promptYesNo(question: string, defaultYes?: boolean): Promise<boolean>;
|
|
40
|
+
interface ColumnDef<T> {
|
|
41
|
+
header: string;
|
|
42
|
+
get: (row: T) => string;
|
|
43
|
+
pad?: 'left' | 'right';
|
|
44
|
+
}
|
|
45
|
+
export declare function renderTable<T>(rows: T[], columns: ColumnDef<T>[]): string;
|
|
46
|
+
export declare function truncate(s: string | null | undefined, max: number): string;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/graphics/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1E,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,wBAAgB,kBAAkB,IAAI,WAAW,CAOhD;AAED,wBAAgB,sBAAsB,IAAI,WAAW,GAAG,IAAI,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMvE;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAGtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQvF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CA8BzD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBlF;AAED,UAAU,SAAS,CAAC,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAkBzE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1E"}
|