gooseworks 0.2.4 → 0.2.6

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.
Files changed (46) hide show
  1. package/dist/auth/oauth-server.d.ts.map +1 -1
  2. package/dist/auth/oauth-server.js +27 -19
  3. package/dist/auth/oauth-server.js.map +1 -1
  4. package/dist/commands/formats.d.ts +3 -0
  5. package/dist/commands/formats.d.ts.map +1 -0
  6. package/dist/commands/formats.js +157 -0
  7. package/dist/commands/formats.js.map +1 -0
  8. package/dist/commands/graphics/get-flow.d.ts +30 -0
  9. package/dist/commands/graphics/get-flow.d.ts.map +1 -0
  10. package/dist/commands/graphics/get-flow.js +212 -0
  11. package/dist/commands/graphics/get-flow.js.map +1 -0
  12. package/dist/commands/graphics/publish-flow.d.ts +33 -0
  13. package/dist/commands/graphics/publish-flow.d.ts.map +1 -0
  14. package/dist/commands/graphics/publish-flow.js +180 -0
  15. package/dist/commands/graphics/publish-flow.js.map +1 -0
  16. package/dist/commands/graphics/shared.d.ts +48 -0
  17. package/dist/commands/graphics/shared.d.ts.map +1 -0
  18. package/dist/commands/graphics/shared.js +190 -0
  19. package/dist/commands/graphics/shared.js.map +1 -0
  20. package/dist/commands/styles.d.ts +3 -0
  21. package/dist/commands/styles.d.ts.map +1 -0
  22. package/dist/commands/styles.js +159 -0
  23. package/dist/commands/styles.js.map +1 -0
  24. package/dist/config.d.ts +2 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +5 -1
  27. package/dist/config.js.map +1 -1
  28. package/dist/index.js +4 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/graphics-api.d.ts +106 -0
  31. package/dist/lib/graphics-api.d.ts.map +1 -0
  32. package/dist/lib/graphics-api.js +310 -0
  33. package/dist/lib/graphics-api.js.map +1 -0
  34. package/dist/lib/graphics-cache.d.ts +31 -0
  35. package/dist/lib/graphics-cache.d.ts.map +1 -0
  36. package/dist/lib/graphics-cache.js +126 -0
  37. package/dist/lib/graphics-cache.js.map +1 -0
  38. package/dist/lib/graphics-manifest.d.ts +96 -0
  39. package/dist/lib/graphics-manifest.d.ts.map +1 -0
  40. package/dist/lib/graphics-manifest.js +289 -0
  41. package/dist/lib/graphics-manifest.js.map +1 -0
  42. package/dist/skills/fetcher.d.ts +18 -0
  43. package/dist/skills/fetcher.d.ts.map +1 -0
  44. package/dist/skills/fetcher.js +118 -0
  45. package/dist/skills/fetcher.js.map +1 -0
  46. package/package.json +1 -1
@@ -0,0 +1,180 @@
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
+ const hint = cfg.searchHint ? `Find it: ${cfg.searchHint(result.slug)}\n` : '';
110
+ process.stdout.write(`${cfg.label === 'style' ? 'Published style' : 'Published format'}: ${result.slug}\n` +
111
+ `${cfg.hubUrl(result.slug)}\n` +
112
+ hint);
113
+ }
114
+ function validateOrExit(cfg, manifest) {
115
+ const validation = cfg.validate(manifest);
116
+ if (!validation.ok) {
117
+ process.stderr.write(`Manifest validation failed:\n${formatValidationErrors(validation.errors)}\n`);
118
+ process.exit(shared_1.EXIT_USER_ERROR);
119
+ }
120
+ }
121
+ async function uploadOrExit(cfg, opts, manifest, files, allowSlugRetry) {
122
+ try {
123
+ return await cfg.upload(manifest, files);
124
+ }
125
+ catch (err) {
126
+ if (!(err instanceof graphics_api_1.ApiError))
127
+ (0, shared_1.reportApiErrorAndExit)(err);
128
+ const body = (err.body || {});
129
+ if (err.status === 400 && body.error === 'validation_failed') {
130
+ const lines = formatServerValidationErrors(body);
131
+ process.stderr.write(`Server validation failed${lines ? `:\n${lines}` : ''}\n`);
132
+ process.exit(shared_1.EXIT_USER_ERROR);
133
+ }
134
+ if (err.status === 400 && body.error === 'missing_file') {
135
+ process.stderr.write(`Server says file '${body.file ?? '?'}' is missing from the upload.\n`);
136
+ process.exit(shared_1.EXIT_USER_ERROR);
137
+ }
138
+ if (err.status === 400 && body.error === 'manifest_parse') {
139
+ process.stderr.write(`Server could not parse manifest: ${body.message ?? 'unknown'}\n`);
140
+ process.exit(shared_1.EXIT_USER_ERROR);
141
+ }
142
+ if (err.status === 413) {
143
+ process.stderr.write(`File too large: ${body.file ?? 'one of the uploaded files'} (max 10 MB).\n`);
144
+ process.exit(shared_1.EXIT_USER_ERROR);
145
+ }
146
+ if (err.status === 403) {
147
+ process.stderr.write(`You don't own this ${cfg.label}. Only its author can update or delete it.\n`);
148
+ process.exit(shared_1.EXIT_USER_ERROR);
149
+ }
150
+ if (err.status === 409 && body.error === 'slug_taken' && allowSlugRetry) {
151
+ return await retryWithSuggestedSlug(cfg, opts, manifest, files, body);
152
+ }
153
+ (0, shared_1.reportApiErrorAndExit)(err);
154
+ }
155
+ }
156
+ async function retryWithSuggestedSlug(cfg, opts, manifest, files, body) {
157
+ const suggested = body.suggested_slug;
158
+ if (!suggested) {
159
+ process.stderr.write(`Slug taken and the server didn't suggest an alternative.\n`);
160
+ process.exit(shared_1.EXIT_USER_ERROR);
161
+ }
162
+ const accept = opts.yes ||
163
+ (await (0, shared_1.promptYesNo)(`Slug '${manifest.slug ?? '?'}' is taken. Use '${suggested}' instead?`, true));
164
+ if (!accept) {
165
+ process.stderr.write(`Aborted: slug collision unresolved.\n`);
166
+ process.exit(shared_1.EXIT_USER_ERROR);
167
+ }
168
+ manifest.slug = suggested;
169
+ // Re-run client validation: the server's suggestion could in principle
170
+ // fail our slug grammar, and shipping a broken value to the server
171
+ // produces an opaque second error rather than a clean local message.
172
+ validateOrExit(cfg, manifest);
173
+ try {
174
+ return await cfg.upload(manifest, files);
175
+ }
176
+ catch (retryErr) {
177
+ (0, shared_1.reportApiErrorAndExit)(retryErr);
178
+ }
179
+ }
180
+ //# 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,CAyCzD;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"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * Shared helpers for the styles/formats command families.
4
+ *
5
+ * Exit codes follow the spec:
6
+ * 0 = success
7
+ * 1 = transient or auth error (network, 401, 5xx)
8
+ * 2 = user error (bad input, 400, 403, 404, declined 409)
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.EXIT_USER_ERROR = exports.EXIT_TRANSIENT = exports.EXIT_OK = void 0;
45
+ exports.requireCredentials = requireCredentials;
46
+ exports.getOptionalCredentials = getOptionalCredentials;
47
+ exports.clientOpts = clientOpts;
48
+ exports.authedClientOpts = authedClientOpts;
49
+ exports.parseIntOpt = parseIntOpt;
50
+ exports.reportApiErrorAndExit = reportApiErrorAndExit;
51
+ exports.promptYesNo = promptYesNo;
52
+ exports.renderTable = renderTable;
53
+ exports.truncate = truncate;
54
+ const readline = __importStar(require("readline"));
55
+ const credentials_1 = require("../../auth/credentials");
56
+ const config_1 = require("../../config");
57
+ const graphics_api_1 = require("../../lib/graphics-api");
58
+ exports.EXIT_OK = 0;
59
+ exports.EXIT_TRANSIENT = 1;
60
+ exports.EXIT_USER_ERROR = 2;
61
+ function requireCredentials() {
62
+ const creds = (0, credentials_1.getCredentials)();
63
+ if (!creds) {
64
+ process.stderr.write('Not authenticated. Run `gooseworks login` first.\n');
65
+ process.exit(exports.EXIT_TRANSIENT);
66
+ }
67
+ return creds;
68
+ }
69
+ function getOptionalCredentials() {
70
+ return (0, credentials_1.getCredentials)();
71
+ }
72
+ /**
73
+ * Build the api-client options for read-only commands. Falls back to the
74
+ * compiled-in API_BASE when the user is not logged in, so anonymous reads
75
+ * still work.
76
+ */
77
+ function clientOpts() {
78
+ const creds = getOptionalCredentials();
79
+ return {
80
+ apiBase: creds?.api_base ?? config_1.API_BASE,
81
+ apiKey: creds?.api_key ?? null,
82
+ };
83
+ }
84
+ /** Build api-client options for commands that require auth (publish/update/delete). */
85
+ function authedClientOpts() {
86
+ const creds = requireCredentials();
87
+ return { apiBase: creds.api_base, apiKey: creds.api_key };
88
+ }
89
+ /**
90
+ * Parse a non-negative integer command-line option. Exits with the user-error
91
+ * code if the value is malformed.
92
+ */
93
+ function parseIntOpt(value, name) {
94
+ if (value === undefined)
95
+ return undefined;
96
+ const n = Number.parseInt(value, 10);
97
+ if (!Number.isInteger(n) || n < 0) {
98
+ process.stderr.write(`--${name} must be a non-negative integer\n`);
99
+ process.exit(exports.EXIT_USER_ERROR);
100
+ }
101
+ return n;
102
+ }
103
+ /**
104
+ * Translate a thrown error from the API client into a stderr message + exit
105
+ * code. Never re-throws.
106
+ */
107
+ function reportApiErrorAndExit(err) {
108
+ if (err instanceof graphics_api_1.NetworkError) {
109
+ process.stderr.write(`Network error: ${err.message}\n`);
110
+ process.exit(exports.EXIT_TRANSIENT);
111
+ }
112
+ if (err instanceof graphics_api_1.ApiError) {
113
+ if (err.status === 401) {
114
+ process.stderr.write('Not authenticated. Run `gooseworks login` first.\n');
115
+ process.exit(exports.EXIT_TRANSIENT);
116
+ }
117
+ if (err.status >= 500) {
118
+ // Surface the response body when the server gives us one — for publish
119
+ // flows a generic "try again later" hides the real cause (e.g. an S3
120
+ // misconfig or schema-validation 500). Fall back to the generic line
121
+ // when the server didn't return a parseable message.
122
+ const detail = err.message && err.message !== `request failed (${err.status})`
123
+ ? err.message
124
+ : null;
125
+ process.stderr.write(detail
126
+ ? `Server error (${err.status}): ${detail}\n`
127
+ : `Server error (${err.status}). Please try again later.\n`);
128
+ process.exit(exports.EXIT_TRANSIENT);
129
+ }
130
+ if (err.status === 403) {
131
+ process.stderr.write(`${err.message || 'Forbidden'}\n`);
132
+ process.exit(exports.EXIT_USER_ERROR);
133
+ }
134
+ if (err.status === 404) {
135
+ process.stderr.write(`Not found: ${err.message}\n`);
136
+ process.exit(exports.EXIT_USER_ERROR);
137
+ }
138
+ process.stderr.write(`Error (${err.status}): ${err.message}\n`);
139
+ process.exit(exports.EXIT_USER_ERROR);
140
+ }
141
+ const message = err instanceof Error ? err.message : String(err);
142
+ process.stderr.write(`${message}\n`);
143
+ process.exit(exports.EXIT_TRANSIENT);
144
+ }
145
+ function promptYesNo(question, defaultYes = false) {
146
+ if (!process.stdin.isTTY) {
147
+ // Non-interactive context with no --yes — refuse rather than hang.
148
+ return Promise.resolve(false);
149
+ }
150
+ const rl = readline.createInterface({
151
+ input: process.stdin,
152
+ output: process.stderr,
153
+ });
154
+ const suffix = defaultYes ? '[Y/n]' : '[y/N]';
155
+ return new Promise((resolve) => {
156
+ rl.question(`${question} ${suffix} `, (answer) => {
157
+ rl.close();
158
+ const trimmed = answer.trim().toLowerCase();
159
+ if (trimmed === '')
160
+ resolve(defaultYes);
161
+ else
162
+ resolve(trimmed === 'y' || trimmed === 'yes');
163
+ });
164
+ });
165
+ }
166
+ function renderTable(rows, columns) {
167
+ if (rows.length === 0)
168
+ return '';
169
+ const widths = columns.map((c) => Math.max(c.header.length, ...rows.map((r) => c.get(r).length)));
170
+ const renderRow = (cells) => cells
171
+ .map((cell, i) => {
172
+ const pad = columns[i].pad ?? 'right';
173
+ return pad === 'left'
174
+ ? cell.padStart(widths[i])
175
+ : cell.padEnd(widths[i]);
176
+ })
177
+ .join(' ');
178
+ const headerLine = renderRow(columns.map((c) => c.header));
179
+ const separatorLine = widths.map((w) => '─'.repeat(w)).join(' ');
180
+ const bodyLines = rows.map((r) => renderRow(columns.map((c) => c.get(r))));
181
+ return [headerLine, separatorLine, ...bodyLines].join('\n');
182
+ }
183
+ function truncate(s, max) {
184
+ if (!s)
185
+ return '';
186
+ if (s.length <= max)
187
+ return s;
188
+ return s.slice(0, max - 1) + '…';
189
+ }
190
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/graphics/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const stylesCommand: Command;
3
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/commands/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoMpC,eAAO,MAAM,aAAa,SAOF,CAAC"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stylesCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const config_1 = require("../config");
6
+ const graphics_manifest_1 = require("../lib/graphics-manifest");
7
+ const graphics_api_1 = require("../lib/graphics-api");
8
+ const shared_1 = require("./graphics/shared");
9
+ const publish_flow_1 = require("./graphics/publish-flow");
10
+ const get_flow_1 = require("./graphics/get-flow");
11
+ function renderListTable(rows) {
12
+ return (0, shared_1.renderTable)(rows, [
13
+ { header: 'NAME', get: (r) => (0, shared_1.truncate)(r.name, 40) },
14
+ { header: 'SLUG', get: (r) => r.slug },
15
+ { header: 'MOOD', get: (r) => r.moodGroup ?? '' },
16
+ { header: 'FEATURED', get: (r) => (r.featured ? '★' : '') },
17
+ { header: 'AUTHOR', get: (r) => r.authorHandle ?? '' },
18
+ ]);
19
+ }
20
+ const listCmd = new commander_1.Command('list')
21
+ .description('List published graphic styles')
22
+ .option('--mood <mood>', 'Filter by mood group')
23
+ .option('--tag <tag>', 'Filter by tag')
24
+ .option('--featured', 'Only featured styles')
25
+ .option('--q <query>', 'Free-text query')
26
+ .option('--limit <n>', 'Max rows to return')
27
+ .option('--offset <n>', 'Skip the first N rows')
28
+ .option('--json', 'Print full JSON instead of a table')
29
+ .action(async (opts) => {
30
+ try {
31
+ const env = await (0, graphics_api_1.listStyles)((0, shared_1.clientOpts)(), {
32
+ q: opts.q,
33
+ mood: opts.mood,
34
+ tag: opts.tag,
35
+ featured: !!opts.featured,
36
+ limit: (0, shared_1.parseIntOpt)(opts.limit, 'limit'),
37
+ offset: (0, shared_1.parseIntOpt)(opts.offset, 'offset'),
38
+ });
39
+ if (opts.json) {
40
+ process.stdout.write(JSON.stringify(env.data, null, 2) + '\n');
41
+ return;
42
+ }
43
+ if (env.data.length === 0) {
44
+ process.stderr.write('No styles match.\n');
45
+ return;
46
+ }
47
+ process.stdout.write(renderListTable(env.data) + '\n');
48
+ }
49
+ catch (err) {
50
+ (0, shared_1.reportApiErrorAndExit)(err);
51
+ }
52
+ });
53
+ const searchCmd = new commander_1.Command('search')
54
+ .description('Search graphic styles (alias for `list --q <query>`)')
55
+ .argument('<query>', 'Search query')
56
+ .option('--json', 'Print full JSON instead of a table')
57
+ .option('--limit <n>', 'Max rows to return')
58
+ .option('--offset <n>', 'Skip the first N rows')
59
+ .action(async (query, opts) => {
60
+ try {
61
+ const env = await (0, graphics_api_1.listStyles)((0, shared_1.clientOpts)(), {
62
+ q: query,
63
+ limit: (0, shared_1.parseIntOpt)(opts.limit, 'limit'),
64
+ offset: (0, shared_1.parseIntOpt)(opts.offset, 'offset'),
65
+ });
66
+ if (opts.json) {
67
+ process.stdout.write(JSON.stringify(env.data, null, 2) + '\n');
68
+ return;
69
+ }
70
+ if (env.data.length === 0) {
71
+ process.stderr.write(`No styles match "${query}".\n`);
72
+ return;
73
+ }
74
+ process.stdout.write(renderListTable(env.data) + '\n');
75
+ }
76
+ catch (err) {
77
+ (0, shared_1.reportApiErrorAndExit)(err);
78
+ }
79
+ });
80
+ const getCmd = new commander_1.Command('get')
81
+ .description('Print a style\'s design.md (default) or full JSON record')
82
+ .argument('<slug>', 'Style slug')
83
+ .option('--json', 'Print full JSON record instead of design.md')
84
+ .option('--include-examples', 'Also download example PNGs into ./<slug>/')
85
+ .option('--no-cache', 'Bypass local ETag cache')
86
+ .action(async (slug, opts) => {
87
+ const opt = (0, shared_1.clientOpts)();
88
+ await (0, get_flow_1.runGetFlow)({
89
+ resource: 'styles',
90
+ fetchMarkdown: (s, etag) => (0, graphics_api_1.getStyleDesignMd)(opt, s, etag),
91
+ fetchRecord: (s, etag) => (0, graphics_api_1.getStyleRecord)(opt, s, etag),
92
+ }, slug, {
93
+ json: opts.json,
94
+ includeExamples: opts.includeExamples,
95
+ // commander's --no-cache flips `cache` to false
96
+ noCache: opts.cache === false,
97
+ });
98
+ });
99
+ const publishCmd = new commander_1.Command('publish')
100
+ .description('Publish a style from a directory containing gooseworks-style.json')
101
+ .argument('[path]', 'Directory containing the manifest', '.')
102
+ .option('--slug <slug>', 'Override the manifest slug')
103
+ .option('--yes', 'Skip the slug-collision prompt and accept the suggestion')
104
+ .action(async (dir, opts) => {
105
+ const auth = (0, shared_1.authedClientOpts)();
106
+ await (0, publish_flow_1.runPublishFlow)({
107
+ manifestFilename: graphics_manifest_1.STYLE_MANIFEST_FILENAME,
108
+ validate: graphics_manifest_1.validateStyleManifest,
109
+ hubUrl: (slug) => `${config_1.HUB_URL}/styles/${slug}`,
110
+ searchHint: (slug) => `gooseworks styles search ${slug}`,
111
+ label: 'style',
112
+ upload: (manifest, files) => (0, graphics_api_1.publishStyle)(auth, manifest, files),
113
+ }, { dir, slug: opts.slug, yes: opts.yes });
114
+ });
115
+ const updateCmd = new commander_1.Command('update')
116
+ .description('Update a style by slug')
117
+ .argument('<slug>', 'Style slug to update')
118
+ .argument('[path]', 'Directory containing the manifest', '.')
119
+ .action(async (slug, dir) => {
120
+ const auth = (0, shared_1.authedClientOpts)();
121
+ await (0, publish_flow_1.runUpdateFlow)({
122
+ manifestFilename: graphics_manifest_1.STYLE_MANIFEST_FILENAME,
123
+ validate: graphics_manifest_1.validateStyleManifest,
124
+ hubUrl: (s) => `${config_1.HUB_URL}/styles/${s}`,
125
+ searchHint: (s) => `gooseworks styles search ${s}`,
126
+ label: 'style',
127
+ upload: (manifest, files) => (0, graphics_api_1.updateStyle)(auth, slug, manifest, files),
128
+ }, { dir, slug, yes: true });
129
+ });
130
+ const deleteCmd = new commander_1.Command('delete')
131
+ .description('Delete a style by slug (owner only)')
132
+ .argument('<slug>', 'Style slug to delete')
133
+ .option('--yes', 'Skip the confirmation prompt')
134
+ .action(async (slug, opts) => {
135
+ const auth = (0, shared_1.authedClientOpts)();
136
+ if (!opts.yes) {
137
+ const ok = await (0, shared_1.promptYesNo)(`Delete style '${slug}'?`, false);
138
+ if (!ok) {
139
+ process.stderr.write('Aborted.\n');
140
+ process.exit(shared_1.EXIT_USER_ERROR);
141
+ }
142
+ }
143
+ try {
144
+ await (0, graphics_api_1.deleteStyle)(auth, slug);
145
+ process.stdout.write(`Deleted style '${slug}'.\n`);
146
+ }
147
+ catch (err) {
148
+ (0, shared_1.reportApiErrorAndExit)(err);
149
+ }
150
+ });
151
+ exports.stylesCommand = new commander_1.Command('styles')
152
+ .description('Browse and publish graphic styles')
153
+ .addCommand(listCmd)
154
+ .addCommand(searchCmd)
155
+ .addCommand(getCmd)
156
+ .addCommand(publishCmd)
157
+ .addCommand(updateCmd)
158
+ .addCommand(deleteCmd);
159
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/commands/styles.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -4,7 +4,9 @@
4
4
  * Defaults to production. Override with env vars for local development:
5
5
  * GOOSEWORKS_API_BASE=http://localhost:5999
6
6
  * GOOSEWORKS_FRONTEND_URL=http://localhost:3999
7
+ * GOOSEWORKS_HUB_URL=http://localhost:3998
7
8
  */
8
9
  export declare const API_BASE: string;
9
10
  export declare const FRONTEND_URL: string;
11
+ export declare const HUB_URL: string;
10
12
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,QAAQ,QAAiE,CAAC;AACvF,eAAO,MAAM,YAAY,QAAqE,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,QAAQ,QAAiE,CAAC;AACvF,eAAO,MAAM,YAAY,QAAqE,CAAC;AAG/F,eAAO,MAAM,OAAO,QAAmE,CAAC"}
package/dist/config.js CHANGED
@@ -5,9 +5,13 @@
5
5
  * Defaults to production. Override with env vars for local development:
6
6
  * GOOSEWORKS_API_BASE=http://localhost:5999
7
7
  * GOOSEWORKS_FRONTEND_URL=http://localhost:3999
8
+ * GOOSEWORKS_HUB_URL=http://localhost:3998
8
9
  */
9
10
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.FRONTEND_URL = exports.API_BASE = void 0;
11
+ exports.HUB_URL = exports.FRONTEND_URL = exports.API_BASE = void 0;
11
12
  exports.API_BASE = process.env.GOOSEWORKS_API_BASE || 'https://api.gooseworks.ai';
12
13
  exports.FRONTEND_URL = process.env.GOOSEWORKS_FRONTEND_URL || 'https://app.gooseworks.ai';
14
+ // Public graphics hub (skills + formats catalog). Distinct host from FRONTEND_URL:
15
+ // `app.gooseworks.ai` has no /styles or /formats routes — those live on skills.gooseworks.ai.
16
+ exports.HUB_URL = process.env.GOOSEWORKS_HUB_URL || 'https://skills.gooseworks.ai';
13
17
  //# sourceMappingURL=config.js.map