@42ws/cli 0.0.35 → 0.0.36

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.
@@ -0,0 +1,300 @@
1
+ import { createServer } from 'node:http';
2
+ import { existsSync, statSync, readFileSync, createReadStream, appendFileSync, mkdirSync, renameSync, } from 'node:fs';
3
+ import { join, resolve, basename, extname, sep } from 'node:path';
4
+ import { info, successMessage, error, warn, isJsonMode, success } from '../lib/output.js';
5
+ import { INSPECTOR_CLIENT_JS, INSPECTOR_ENDPOINT } from '../lib/inspector-client.js';
6
+ const DEV_HELP = `
7
+ 42ws dev — ローカル検証サーバー (AI 向けページ診断付き)
8
+
9
+ Usage:
10
+ 42ws dev [options] Start a local server that serves your site and
11
+ injects the inspector (default port 4242)
12
+ 42ws dev errors [site] Print recent client errors collected by the server
13
+
14
+ Options:
15
+ --site <name> Site name (used for the log filename). Defaults to 42ws.json or dir name.
16
+ --dir <path> Directory to serve. Defaults to 42ws.json "output" or current dir.
17
+ --port <n> Port to listen on (default 4242)
18
+ --spa Fall back to index.html for unknown routes
19
+ --lines <n> (errors) Number of recent log lines to print (default 100)
20
+
21
+ Notes:
22
+ - HTML レスポンスの </body> 直前に inspector を inject します。
23
+ - ブラウザで開き「検証する」を押して問題の要素をクリックすると、診断パックが
24
+ クリップボードにコピーされます。AI にそのまま貼り付けてください。
25
+ - クライアントの JS / HTTP エラーは .42ws/dev-<site>.log に集約されます。
26
+ `.trim();
27
+ const LOG_DIR = '.42ws';
28
+ const MAX_LOG_BYTES = 5 * 1024 * 1024;
29
+ const INSPECTOR_SCRIPT_TAG = `<script src="${INSPECTOR_ENDPOINT}/inspector.js" data-42ws-inspector></script>`;
30
+ const CONTENT_TYPE = {
31
+ '.html': 'text/html; charset=utf-8',
32
+ '.css': 'text/css; charset=utf-8',
33
+ '.js': 'application/javascript; charset=utf-8',
34
+ '.mjs': 'application/javascript; charset=utf-8',
35
+ '.json': 'application/json; charset=utf-8',
36
+ '.png': 'image/png',
37
+ '.jpg': 'image/jpeg',
38
+ '.jpeg': 'image/jpeg',
39
+ '.webp': 'image/webp',
40
+ '.gif': 'image/gif',
41
+ '.svg': 'image/svg+xml',
42
+ '.ico': 'image/x-icon',
43
+ '.woff': 'font/woff',
44
+ '.woff2': 'font/woff2',
45
+ '.txt': 'text/plain; charset=utf-8',
46
+ '.xml': 'application/xml',
47
+ '.pdf': 'application/pdf',
48
+ '.mp4': 'video/mp4',
49
+ '.mp3': 'audio/mpeg',
50
+ };
51
+ function loadProjectConfig(cwd) {
52
+ const configPath = join(cwd, '42ws.json');
53
+ if (!existsSync(configPath))
54
+ return {};
55
+ try {
56
+ return JSON.parse(readFileSync(configPath, 'utf-8'));
57
+ }
58
+ catch {
59
+ return {};
60
+ }
61
+ }
62
+ function slugify(name) {
63
+ return name.toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '');
64
+ }
65
+ function resolveSite(cwd, args, config) {
66
+ return args.site ?? config.site ?? slugify(basename(cwd)) ?? 'site';
67
+ }
68
+ function logPath(cwd, site) {
69
+ return join(cwd, LOG_DIR, `dev-${site}.log`);
70
+ }
71
+ function contentType(filePath) {
72
+ return CONTENT_TYPE[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
73
+ }
74
+ function injectInspector(html) {
75
+ const idx = html.toLowerCase().lastIndexOf('</body>');
76
+ if (idx === -1)
77
+ return html + INSPECTOR_SCRIPT_TAG;
78
+ return html.slice(0, idx) + INSPECTOR_SCRIPT_TAG + html.slice(idx);
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // logging
82
+ // ---------------------------------------------------------------------------
83
+ function appendLog(file, entry) {
84
+ try {
85
+ mkdirSync(join(file, '..'), { recursive: true });
86
+ if (existsSync(file) && statSync(file).size > MAX_LOG_BYTES) {
87
+ renameSync(file, file + '.bak');
88
+ }
89
+ appendFileSync(file, JSON.stringify({ ts: new Date().toISOString(), ...entry }) + '\n');
90
+ }
91
+ catch {
92
+ /* logging must never crash the server */
93
+ }
94
+ }
95
+ function readBody(req, max = 64 * 1024) {
96
+ return new Promise(resolve => {
97
+ let data = '';
98
+ let aborted = false;
99
+ req.on('data', chunk => {
100
+ if (aborted)
101
+ return;
102
+ data += chunk;
103
+ if (data.length > max) {
104
+ aborted = true;
105
+ data = data.slice(0, max);
106
+ }
107
+ });
108
+ req.on('end', () => resolve(data));
109
+ req.on('error', () => resolve(data));
110
+ });
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // static serving
114
+ // ---------------------------------------------------------------------------
115
+ function resolveFile(root, urlPath) {
116
+ let rel;
117
+ try {
118
+ rel = decodeURIComponent(urlPath.split('?')[0]);
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ if (rel.endsWith('/'))
124
+ rel += 'index.html';
125
+ const abs = resolve(root, '.' + rel);
126
+ // path traversal guard: must stay within root
127
+ if (abs !== root && !abs.startsWith(root + sep))
128
+ return null;
129
+ if (existsSync(abs) && statSync(abs).isDirectory()) {
130
+ const indexFile = join(abs, 'index.html');
131
+ return existsSync(indexFile) ? indexFile : null;
132
+ }
133
+ return existsSync(abs) ? abs : null;
134
+ }
135
+ function handleStatic(req, res, root, spa) {
136
+ const urlPath = (req.url ?? '/') === '/' ? '/index.html' : (req.url ?? '/');
137
+ let file = resolveFile(root, urlPath);
138
+ if (!file && spa) {
139
+ const accept = req.headers['accept'] ?? '';
140
+ if (extname(urlPath.split('?')[0]) === '' && accept.includes('text/html')) {
141
+ const fallback = join(root, 'index.html');
142
+ if (existsSync(fallback))
143
+ file = fallback;
144
+ }
145
+ }
146
+ if (!file) {
147
+ const safePath = urlPath.replace(/&/g, '&amp;').replace(/</g, '&lt;');
148
+ res.writeHead(404, { 'content-type': 'text/html; charset=utf-8' });
149
+ res.end('<!doctype html><meta charset="utf-8"><title>404</title>' +
150
+ '<body style="font:14px ui-monospace,monospace;padding:40px;color:#333">' +
151
+ '404 Not Found: ' + safePath +
152
+ INSPECTOR_SCRIPT_TAG + '</body>');
153
+ return;
154
+ }
155
+ const type = contentType(file);
156
+ if (type.startsWith('text/html')) {
157
+ const html = injectInspector(readFileSync(file, 'utf-8'));
158
+ res.writeHead(200, { 'content-type': type, 'cache-control': 'no-store' });
159
+ res.end(html);
160
+ return;
161
+ }
162
+ res.writeHead(200, { 'content-type': type, 'cache-control': 'no-store' });
163
+ createReadStream(file).pipe(res);
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // commands
167
+ // ---------------------------------------------------------------------------
168
+ function showErrors(cwd, args) {
169
+ const config = loadProjectConfig(cwd);
170
+ const site = args.positional[0] ?? resolveSite(cwd, args, config);
171
+ const file = logPath(cwd, site);
172
+ if (!existsSync(file)) {
173
+ if (isJsonMode()) {
174
+ success({ site, file, entries: [] });
175
+ }
176
+ else {
177
+ info(`No error log yet for "${site}" (${file}).`);
178
+ info('Run `42ws dev --site ' + site + '` and reproduce the issue first.');
179
+ }
180
+ return;
181
+ }
182
+ const limit = args.lines ? Math.max(1, parseInt(args.lines, 10) || 100) : 100;
183
+ const lines = readFileSync(file, 'utf-8').split('\n').filter(Boolean);
184
+ const recent = lines.slice(-limit);
185
+ if (isJsonMode()) {
186
+ const entries = recent.map(l => {
187
+ try {
188
+ return JSON.parse(l);
189
+ }
190
+ catch {
191
+ return { raw: l };
192
+ }
193
+ });
194
+ success({ site, file, entries });
195
+ return;
196
+ }
197
+ successMessage(`# ${site} — 直近 ${recent.length} 件のクライアントエラー (${file})`);
198
+ for (const line of recent) {
199
+ try {
200
+ const e = JSON.parse(line);
201
+ successMessage(`${e.ts ?? ''} [${e.type ?? '?'}] ${e.message ?? ''}`);
202
+ }
203
+ catch {
204
+ successMessage(line);
205
+ }
206
+ }
207
+ }
208
+ function startServer(cwd, args) {
209
+ const config = loadProjectConfig(cwd);
210
+ const site = resolveSite(cwd, args, config);
211
+ const dirRaw = args.dir ?? config.output ?? '.';
212
+ const root = resolve(cwd, dirRaw);
213
+ const spa = args.spa ?? config.spa ?? false;
214
+ const port = args.port ? parseInt(args.port, 10) : 4242;
215
+ const file = logPath(cwd, site);
216
+ if (!existsSync(root)) {
217
+ error('DIR_NOT_FOUND', `Directory to serve not found: ${root}`, 'Specify --dir <path>, or set "output" in 42ws.json.');
218
+ process.exit(1);
219
+ return;
220
+ }
221
+ const server = createServer(async (req, res) => {
222
+ const url = req.url ?? '/';
223
+ if (url.startsWith(INSPECTOR_ENDPOINT + '/log') && req.method === 'POST') {
224
+ const body = await readBody(req);
225
+ try {
226
+ const parsed = JSON.parse(body);
227
+ appendLog(file, parsed);
228
+ }
229
+ catch {
230
+ appendLog(file, { type: 'Raw', message: body.slice(0, 1000) });
231
+ }
232
+ res.writeHead(204);
233
+ res.end();
234
+ return;
235
+ }
236
+ if (url.startsWith(INSPECTOR_ENDPOINT + '/inspector.js')) {
237
+ res.writeHead(200, { 'content-type': 'application/javascript; charset=utf-8', 'cache-control': 'no-store' });
238
+ res.end(INSPECTOR_CLIENT_JS);
239
+ return;
240
+ }
241
+ try {
242
+ handleStatic(req, res, root, spa);
243
+ }
244
+ catch (e) {
245
+ res.writeHead(500, { 'content-type': 'text/plain; charset=utf-8' });
246
+ res.end('500 Internal Server Error: ' + (e instanceof Error ? e.message : String(e)));
247
+ }
248
+ });
249
+ server.on('error', (e) => {
250
+ if (e.code === 'EADDRINUSE') {
251
+ error('PORT_IN_USE', `Port ${port} is already in use.`, 'Try a different port with --port <n>.');
252
+ }
253
+ else {
254
+ error('SERVER_ERROR', e.message);
255
+ }
256
+ process.exit(1);
257
+ });
258
+ server.listen(port, () => {
259
+ const localUrl = `http://localhost:${port}`;
260
+ if (isJsonMode()) {
261
+ success({ site, dir: root, port, url: localUrl, log: file });
262
+ return;
263
+ }
264
+ info('');
265
+ info(` 42ws dev — ${site}`);
266
+ info(` serving ${root}`);
267
+ info(` local ${localUrl}`);
268
+ info(` errors ${file}`);
269
+ if (spa)
270
+ info(' spa on (index.html fallback)');
271
+ info('');
272
+ info(' ブラウザで開き「検証する」ボタンから要素をクリックすると診断パックをコピーします。');
273
+ info(' 停止するには Ctrl+C。');
274
+ info('');
275
+ });
276
+ const shutdown = () => {
277
+ server.close(() => process.exit(0));
278
+ setTimeout(() => process.exit(0), 500);
279
+ };
280
+ process.on('SIGINT', shutdown);
281
+ process.on('SIGTERM', shutdown);
282
+ }
283
+ export async function dev(args) {
284
+ if (args.help) {
285
+ successMessage(DEV_HELP);
286
+ return;
287
+ }
288
+ const cwd = process.cwd();
289
+ if (args.subcommand === 'errors') {
290
+ showErrors(cwd, args);
291
+ return;
292
+ }
293
+ if (args.subcommand && args.subcommand !== 'errors') {
294
+ warn(`Unknown subcommand: ${args.subcommand}`);
295
+ successMessage(DEV_HELP);
296
+ return;
297
+ }
298
+ startServer(cwd, args);
299
+ }
300
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface EditLogOpts {
2
+ subcommand?: string;
3
+ positional: string[];
4
+ json?: boolean;
5
+ page?: string;
6
+ all?: boolean;
7
+ out?: string;
8
+ apply?: boolean;
9
+ help?: boolean;
10
+ }
11
+ export declare function editlog(opts: EditLogOpts): Promise<void>;
12
+ //# sourceMappingURL=editlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editlog.d.ts","sourceRoot":"","sources":["../../src/commands/editlog.ts"],"names":[],"mappings":"AAqEA,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmI9D"}
@@ -0,0 +1,188 @@
1
+ import { loadConfig } from '../lib/config.js';
2
+ import { apiRequest, ApiError } from '../lib/api.js';
3
+ import { info, successMessage, error, isJsonMode } from '../lib/output.js';
4
+ import { writeFileSync, existsSync } from 'node:fs';
5
+ import { resolve } from 'node:path';
6
+ const HELP = `
7
+ 42ws editlog — Inspect and restore site edit history
8
+
9
+ Usage:
10
+ 42ws editlog list <site> [--page <name>] [--all]
11
+ 42ws editlog show <site> <id>
12
+ 42ws editlog restore <site> <id> [--out <file>] [--apply]
13
+
14
+ Options:
15
+ --page <name> Filter list to entries for a specific page (default: index.html)
16
+ --all Include orphan branches (entries no longer on the active chain)
17
+ --out <file> Write the snapshot HTML to <file> (default: print to stdout).
18
+ If --out is given, parent dir must exist.
19
+ --apply Atomically restore + publish (creates a branch from the entry).
20
+ Subsequent edits in the active chain become orphans.
21
+ --json Output as JSON
22
+
23
+ Examples:
24
+ 42ws editlog list my-site
25
+ 42ws editlog list my-site --all
26
+ 42ws editlog show my-site 1c2x...
27
+ 42ws editlog restore my-site 1c2x... --out index.html
28
+ 42ws editlog restore my-site 1c2x... --apply
29
+ `.trim();
30
+ function formatRelativeTime(iso) {
31
+ const d = new Date(iso);
32
+ const diff = Date.now() - d.getTime();
33
+ const min = Math.floor(diff / 60_000);
34
+ if (min < 1)
35
+ return 'たった今';
36
+ if (min < 60)
37
+ return `${min}分前`;
38
+ const hr = Math.floor(min / 60);
39
+ if (hr < 24)
40
+ return `${hr}時間前`;
41
+ const day = Math.floor(hr / 24);
42
+ if (day < 30)
43
+ return `${day}日前`;
44
+ return d.toLocaleDateString('ja-JP');
45
+ }
46
+ function modeLabel(mode) {
47
+ if (mode === 'focused')
48
+ return '部分編集';
49
+ if (mode === 'full')
50
+ return '全体編集';
51
+ return '保存';
52
+ }
53
+ export async function editlog(opts) {
54
+ if (opts.help || opts.positional.includes('--help')) {
55
+ process.stdout.write(HELP + '\n');
56
+ return;
57
+ }
58
+ const sub = opts.subcommand;
59
+ if (!sub) {
60
+ process.stdout.write(HELP + '\n');
61
+ return;
62
+ }
63
+ const cfg = loadConfig();
64
+ if (!cfg.token || !cfg.apiUrl) {
65
+ error('NOT_LOGGED_IN', 'ログインしてください: 42ws login --token <api-token>');
66
+ process.exit(1);
67
+ }
68
+ if (sub === 'list') {
69
+ const site = opts.positional[0];
70
+ if (!site) {
71
+ error('INVALID_ARGS', 'site is required: 42ws editlog list <site>');
72
+ process.exit(1);
73
+ }
74
+ const qs = new URLSearchParams();
75
+ if (opts.page)
76
+ qs.set('page', opts.page);
77
+ if (opts.all)
78
+ qs.set('includeOrphans', '1');
79
+ try {
80
+ const res = await apiRequest(cfg, 'GET', `/v1/sites/${encodeURIComponent(site)}/editlog${qs.size ? '?' + qs.toString() : ''}`);
81
+ if (isJsonMode()) {
82
+ process.stdout.write(JSON.stringify(res.entries, null, 2) + '\n');
83
+ return;
84
+ }
85
+ if (res.entries.length === 0) {
86
+ info('履歴なし');
87
+ return;
88
+ }
89
+ for (const e of res.entries) {
90
+ const idShort = e.id.slice(0, 16);
91
+ const time = formatRelativeTime(e.createdAt);
92
+ const mode = modeLabel(e.mode);
93
+ const summary = e.summary || e.instruction || '';
94
+ process.stdout.write(`${idShort} ${time.padEnd(8)} [${mode}] ${summary}\n`);
95
+ }
96
+ }
97
+ catch (err) {
98
+ if (err instanceof ApiError)
99
+ error(err.code, err.message, err.suggestedFix);
100
+ else
101
+ error('UNKNOWN', err instanceof Error ? err.message : String(err));
102
+ process.exit(1);
103
+ }
104
+ return;
105
+ }
106
+ if (sub === 'show') {
107
+ const site = opts.positional[0];
108
+ const id = opts.positional[1];
109
+ if (!site || !id) {
110
+ error('INVALID_ARGS', 'Usage: 42ws editlog show <site> <id>');
111
+ process.exit(1);
112
+ }
113
+ try {
114
+ const res = await apiRequest(cfg, 'GET', `/v1/sites/${encodeURIComponent(site)}/editlog/${encodeURIComponent(id)}`);
115
+ if (isJsonMode()) {
116
+ process.stdout.write(JSON.stringify(res.entry, null, 2) + '\n');
117
+ return;
118
+ }
119
+ const e = res.entry;
120
+ process.stdout.write(`id: ${e.id}\n`);
121
+ process.stdout.write(`createdAt: ${e.createdAt}\n`);
122
+ process.stdout.write(`mode: ${modeLabel(e.mode)}\n`);
123
+ if (e.page)
124
+ process.stdout.write(`page: ${e.page}\n`);
125
+ if (e.instruction)
126
+ process.stdout.write(`指示: ${e.instruction}\n`);
127
+ if (e.selectedSelector)
128
+ process.stdout.write(`selector: ${e.selectedSelector}\n`);
129
+ if (e.summary)
130
+ process.stdout.write(`summary: ${e.summary}\n`);
131
+ process.stdout.write(`beforeHash: ${e.beforeHash}\n`);
132
+ process.stdout.write(`afterHash: ${e.afterHash}\n`);
133
+ if (e.parentId)
134
+ process.stdout.write(`parent: ${e.parentId}\n`);
135
+ }
136
+ catch (err) {
137
+ if (err instanceof ApiError)
138
+ error(err.code, err.message, err.suggestedFix);
139
+ else
140
+ error('UNKNOWN', err instanceof Error ? err.message : String(err));
141
+ process.exit(1);
142
+ }
143
+ return;
144
+ }
145
+ if (sub === 'restore') {
146
+ const site = opts.positional[0];
147
+ const id = opts.positional[1];
148
+ if (!site || !id) {
149
+ error('INVALID_ARGS', 'Usage: 42ws editlog restore <site> <id> [--out <file>]');
150
+ process.exit(1);
151
+ }
152
+ try {
153
+ const res = await apiRequest(cfg, 'GET', `/v1/sites/${encodeURIComponent(site)}/editlog/${encodeURIComponent(id)}/snapshot`);
154
+ if (opts.apply) {
155
+ // atomic restore + save-and-publish with branchedFromId
156
+ const page = res.entry.page || 'index.html';
157
+ await apiRequest(cfg, 'POST', `/v1/sites/${encodeURIComponent(site)}/save-and-publish`, { html: res.html, page, branchedFromId: id });
158
+ successMessage(`復元・公開しました(page: ${page})。以降のエントリは orphan branch になります。`);
159
+ return;
160
+ }
161
+ if (opts.out) {
162
+ const outPath = resolve(opts.out);
163
+ if (existsSync(outPath)) {
164
+ info(`上書きします: ${outPath}`);
165
+ }
166
+ writeFileSync(outPath, res.html, 'utf-8');
167
+ successMessage(`復元しました: ${outPath}`);
168
+ info(`公開するには: 42ws publish --site ${site} --yes(または再度 --apply で枝分かれ公開)`);
169
+ }
170
+ else {
171
+ // stdout に書き出し
172
+ process.stdout.write(res.html);
173
+ }
174
+ }
175
+ catch (err) {
176
+ if (err instanceof ApiError)
177
+ error(err.code, err.message, err.suggestedFix);
178
+ else
179
+ error('UNKNOWN', err instanceof Error ? err.message : String(err));
180
+ process.exit(1);
181
+ }
182
+ return;
183
+ }
184
+ error('UNKNOWN_SUBCOMMAND', `Unknown subcommand: ${sub}`);
185
+ process.stdout.write(HELP + '\n');
186
+ process.exit(1);
187
+ }
188
+ //# sourceMappingURL=editlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editlog.js","sourceRoot":"","sources":["../../src/commands/editlog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBZ,CAAC,IAAI,EAAE,CAAC;AAET,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,GAAG,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IAChC,IAAI,EAAE,GAAG,EAAE;QAAE,OAAO,GAAG,EAAE,KAAK,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,GAAG,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,IAA0B;IAC3C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,eAAe,EAAE,4CAA4C,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,4CAA4C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACpG,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI;YAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG;YAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,EACH,KAAK,EACL,aAAa,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACrF,CAAC;YACF,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;gBACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;;gBACvE,KAAK,CAAC,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,sCAAsC,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACrG,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,EACH,KAAK,EACL,aAAa,kBAAkB,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAC1E,CAAC;YACF,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,WAAW;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,CAAC,gBAAgB;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC;YACnF,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;;gBACvE,KAAK,CAAC,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,wDAAwD,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACvH,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,EACH,KAAK,EACL,aAAa,kBAAkB,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,EAAE,CAAC,WAAW,CACnF,CAAC;YACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,wDAAwD;gBACxD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC;gBAC5C,MAAM,UAAU,CACd,GAAG,EACH,MAAM,EACN,aAAa,kBAAkB,CAAC,IAAI,CAAC,mBAAmB,EACxD,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAC7C,CAAC;gBACF,cAAc,CAAC,mBAAmB,IAAI,iCAAiC,CAAC,CAAC;gBACzE,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;gBAC7B,CAAC;gBACD,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC1C,cAAc,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,+BAA+B,IAAI,+BAA+B,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;;gBACvE,KAAK,CAAC,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,KAAK,CAAC,oBAAoB,EAAE,uBAAuB,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -6,7 +6,7 @@ const PROMPTS_HELP = `
6
6
  42ws prompts — AI エージェント向け制作ガイドを取得
7
7
 
8
8
  Usage:
9
- 42ws prompts get <name> Print prompt body to stdout (name: context | cli)
9
+ 42ws prompts get <name> Print prompt body to stdout (name: context | cli | sitecard | inspector)
10
10
 
11
11
  Notes:
12
12
  - 本文の冒頭に Version: x.y.z (updated YYYY-MM-DD) があります。
@@ -31,7 +31,7 @@ async function promptsGet(args) {
31
31
  }
32
32
  const name = args.positional[0];
33
33
  if (!name) {
34
- error('NAME_REQUIRED', '使い方: 42ws prompts get <name>', '<name> は context | cli');
34
+ error('NAME_REQUIRED', '使い方: 42ws prompts get <name>', '<name> は context | cli | sitecard | inspector');
35
35
  process.exit(1);
36
36
  }
37
37
  // /v1/prompts/{name} は text/plain を返すので、apiRequest の JSON.parse 失敗を string として受ける挙動に依存。
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/commands/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAC;AAEnC,MAAM,YAAY,GAAG;;;;;;;;;CASpB,CAAC,IAAI,EAAE,CAAC;AAQT,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,OAAO,YAAY,IAAI,CAAC,CAAC;IAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAiB;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,eAAe,EAAE,8BAA8B,EAAE,wBAAwB,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,wFAAwF;IACxF,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,UAAU,CAAS,MAAM,EAAE,KAAK,EAAE,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,QAAQ;YAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;;YAC/D,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/commands/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAC;AAEnC,MAAM,YAAY,GAAG;;;;;;;;;CASpB,CAAC,IAAI,EAAE,CAAC;AAQT,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,OAAO,YAAY,IAAI,CAAC,CAAC;IAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAiB;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,eAAe,EAAE,8BAA8B,EAAE,+CAA+C,CAAC,CAAC;QACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,wFAAwF;IACxF,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,UAAU,CAAS,MAAM,EAAE,KAAK,EAAE,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,QAAQ;YAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;;YAC/D,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AA6BD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA+FD,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgS9D"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AA8BD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA+FD,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiS9D"}
@@ -3,6 +3,7 @@ import { login } from './login.js';
3
3
  import { detectFramework } from '../lib/detect.js';
4
4
  import { apiRequest, uploadFile, ApiError } from '../lib/api.js';
5
5
  import { info, success, successMessage, error, warn, isJsonMode } from '../lib/output.js';
6
+ import { printSuggestions } from '../lib/suggest.js';
6
7
  import { t } from '../lib/i18n.js';
7
8
  import { collectFiles, formatBytes } from '../lib/files.js';
8
9
  import { existsSync, readFileSync } from 'node:fs';
@@ -374,10 +375,11 @@ export async function publish(args) {
374
375
  const url = completeResponse.url ?? `https://${siteName}.dev.42ws.com`;
375
376
  const version = completeResponse.version ?? publishId;
376
377
  if (isJsonMode()) {
377
- success({ status: 'published', url, site: siteName, version });
378
+ success({ status: 'published', url, site: siteName, version, _suggest: completeResponse._suggest });
378
379
  }
379
380
  else {
380
381
  successMessage(`Published:\n${url}`);
382
+ printSuggestions(completeResponse._suggest);
381
383
  }
382
384
  }
383
385
  //# sourceMappingURL=publish.js.map