@somewhere-tech/cli 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,13 @@
1
+ import { spawnSync } from 'node:child_process';
1
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
3
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
4
  import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
4
- import { loadConfig } from '../lib/config.js';
5
+ import { CURSOR_MCP_PATH, hasCursorMcpConfig, hasGlobalMcpConfig, loadConfig, saveCursorMcpConfig, saveGlobalMcpConfig, } from '../lib/config.js';
6
+ import { ApiClient } from '../lib/client.js';
7
+ import { dim, error, info, success, teal } from '../lib/output.js';
5
8
  const UPSTREAM_URL = 'https://mcp.somewhere.tech/mcp';
9
+ const INSTALL_HOSTS = ['codex', 'claude-code', 'cursor'];
10
+ const RESTART_HINT = 'MCP hosts load tools when a session starts. Open a NEW session (or restart the host), then look for tools named mcp__somewhere__*.';
6
11
  // Emit a JSON-RPC error notification on stdout so MCP hosts surface a clear
7
12
  // message instead of a generic crash. id=null because it's not a response to
8
13
  // any specific request.
@@ -15,82 +20,280 @@ function emitFatalError(message) {
15
20
  process.stdout.write(JSON.stringify(payload) + '\n');
16
21
  }
17
22
  export function registerMcp(program) {
18
- program
23
+ const mcp = program
19
24
  .command('mcp')
20
25
  .description('Run somewhere.tech MCP server over stdio (proxies to mcp.somewhere.tech)')
26
+ .action(runStdioBridge);
27
+ // Hidden alias: docs/llms-full.md taught `somewhere mcp stdio` — keep it
28
+ // true rather than breaking copies already cached in agents and scrapes.
29
+ mcp
30
+ .command('stdio', { hidden: true })
31
+ .description('Alias of bare `somewhere mcp`')
32
+ .action(runStdioBridge);
33
+ mcp
34
+ .command('install <host>')
35
+ .description(`Configure an MCP host to use somewhere.tech (${INSTALL_HOSTS.join(', ')})`)
36
+ .action(runInstall);
37
+ mcp
38
+ .command('doctor')
39
+ .description('Check MCP setup: login, token validity, server reachability, host configs')
21
40
  .action(async () => {
22
- const config = loadConfig();
23
- if (!config?.token) {
24
- emitFatalError('Not logged in. Run: somewhere login');
25
- process.exit(1);
41
+ await runDoctor(program.version() ?? 'unknown');
42
+ });
43
+ }
44
+ /* ─── stdio bridge (bare `somewhere mcp`) ─────────────────────────── */
45
+ async function runStdioBridge() {
46
+ const config = loadConfig();
47
+ if (!config?.token) {
48
+ emitFatalError('Not logged in. Run: somewhere login');
49
+ process.exit(1);
50
+ }
51
+ const httpTransport = new StreamableHTTPClientTransport(new URL(UPSTREAM_URL), {
52
+ requestInit: {
53
+ headers: { Authorization: `Bearer ${config.token}` },
54
+ },
55
+ });
56
+ const stdioTransport = new StdioServerTransport();
57
+ let shuttingDown = false;
58
+ const shutdown = async (reason) => {
59
+ if (shuttingDown)
60
+ return;
61
+ shuttingDown = true;
62
+ if (reason instanceof UnauthorizedError) {
63
+ emitFatalError('somewhere.tech rejected the API key. Run: somewhere login');
26
64
  }
27
- const httpTransport = new StreamableHTTPClientTransport(new URL(UPSTREAM_URL), {
28
- requestInit: {
29
- headers: { Authorization: `Bearer ${config.token}` },
30
- },
31
- });
32
- const stdioTransport = new StdioServerTransport();
33
- let shuttingDown = false;
34
- const shutdown = async (reason) => {
35
- if (shuttingDown)
36
- return;
37
- shuttingDown = true;
38
- if (reason instanceof UnauthorizedError) {
39
- emitFatalError('somewhere.tech rejected the API key. Run: somewhere login');
40
- }
41
- try {
42
- await stdioTransport.close();
43
- }
44
- catch { }
45
- try {
46
- await httpTransport.close();
47
- }
48
- catch { }
49
- };
50
- stdioTransport.onmessage = (msg) => {
51
- httpTransport.send(msg).catch((err) => {
52
- if (err instanceof UnauthorizedError) {
53
- void shutdown(err);
54
- process.exit(1);
55
- }
56
- process.stderr.write(`[somewhere mcp] upstream send failed: ${String(err)}\n`);
57
- });
58
- };
59
- httpTransport.onmessage = (msg) => {
60
- stdioTransport.send(msg).catch((err) => {
61
- process.stderr.write(`[somewhere mcp] stdio send failed: ${String(err)}\n`);
62
- });
63
- };
64
- stdioTransport.onclose = () => { void shutdown(); };
65
- httpTransport.onclose = () => { void shutdown(); };
66
- stdioTransport.onerror = (err) => {
67
- process.stderr.write(`[somewhere mcp] stdio error: ${String(err)}\n`);
68
- };
69
- httpTransport.onerror = (err) => {
70
- if (err instanceof UnauthorizedError) {
71
- void shutdown(err);
72
- process.exit(1);
73
- }
74
- process.stderr.write(`[somewhere mcp] upstream error: ${String(err)}\n`);
75
- };
76
65
  try {
77
- await httpTransport.start();
66
+ await stdioTransport.close();
78
67
  }
79
- catch (err) {
68
+ catch { }
69
+ try {
70
+ await httpTransport.close();
71
+ }
72
+ catch { }
73
+ };
74
+ stdioTransport.onmessage = (msg) => {
75
+ httpTransport.send(msg).catch((err) => {
80
76
  if (err instanceof UnauthorizedError) {
81
- emitFatalError('somewhere.tech rejected the API key. Run: somewhere login');
77
+ void shutdown(err);
82
78
  process.exit(1);
83
79
  }
84
- emitFatalError(`Failed to connect to mcp.somewhere.tech: ${String(err)}`);
80
+ process.stderr.write(`[somewhere mcp] upstream send failed: ${String(err)}\n`);
81
+ });
82
+ };
83
+ httpTransport.onmessage = (msg) => {
84
+ stdioTransport.send(msg).catch((err) => {
85
+ process.stderr.write(`[somewhere mcp] stdio send failed: ${String(err)}\n`);
86
+ });
87
+ };
88
+ stdioTransport.onclose = () => { void shutdown(); };
89
+ httpTransport.onclose = () => { void shutdown(); };
90
+ stdioTransport.onerror = (err) => {
91
+ process.stderr.write(`[somewhere mcp] stdio error: ${String(err)}\n`);
92
+ };
93
+ httpTransport.onerror = (err) => {
94
+ if (err instanceof UnauthorizedError) {
95
+ void shutdown(err);
96
+ process.exit(1);
97
+ }
98
+ process.stderr.write(`[somewhere mcp] upstream error: ${String(err)}\n`);
99
+ };
100
+ try {
101
+ await httpTransport.start();
102
+ }
103
+ catch (err) {
104
+ if (err instanceof UnauthorizedError) {
105
+ emitFatalError('somewhere.tech rejected the API key. Run: somewhere login');
85
106
  process.exit(1);
86
107
  }
108
+ emitFatalError(`Failed to connect to mcp.somewhere.tech: ${String(err)}`);
109
+ process.exit(1);
110
+ }
111
+ try {
112
+ await stdioTransport.start();
113
+ }
114
+ catch (err) {
115
+ emitFatalError(`Failed to start stdio transport: ${String(err)}`);
116
+ process.exit(1);
117
+ }
118
+ }
119
+ /* ─── somewhere mcp install <host> ────────────────────────────────── */
120
+ function runInstall(host) {
121
+ if (!INSTALL_HOSTS.includes(host)) {
122
+ error(`Unknown host "${host}". Supported: ${INSTALL_HOSTS.join(', ')}`);
123
+ process.exit(1);
124
+ }
125
+ const loggedIn = !!loadConfig()?.token;
126
+ switch (host) {
127
+ case 'codex':
128
+ installCodex(loggedIn);
129
+ break;
130
+ case 'claude-code':
131
+ installClaudeCode();
132
+ break;
133
+ case 'cursor':
134
+ installCursor(loggedIn);
135
+ break;
136
+ }
137
+ }
138
+ /** Codex owns its own config format, so we drive its CLI instead of writing
139
+ * the file ourselves. The entry uses the stdio bridge so auth rides the
140
+ * CLI login rather than a token pasted into Codex config. */
141
+ function installCodex(loggedIn) {
142
+ const probe = spawnSync('codex', ['--version'], { stdio: 'ignore' });
143
+ if (probe.error || probe.status !== 0) {
144
+ error('Codex CLI not found on PATH.');
145
+ info('Install Codex first, then either re-run this command or add the entry manually:');
146
+ info(dim(' codex mcp add somewhere -- somewhere mcp'));
147
+ process.exit(1);
148
+ }
149
+ const existing = spawnSync('codex', ['mcp', 'get', 'somewhere'], { stdio: 'ignore' });
150
+ if (existing.status === 0) {
151
+ success('Codex already has a "somewhere" MCP server configured.');
152
+ info(dim('To reconfigure: codex mcp remove somewhere, then re-run this command.'));
153
+ }
154
+ else {
155
+ const add = spawnSync('codex', ['mcp', 'add', 'somewhere', '--', 'somewhere', 'mcp'], { stdio: 'inherit' });
156
+ if (add.status !== 0) {
157
+ error('`codex mcp add` failed (see output above).');
158
+ process.exit(1);
159
+ }
160
+ success(`Codex configured: ${teal('somewhere')} → somewhere mcp (stdio bridge)`);
161
+ }
162
+ if (!loggedIn)
163
+ info(`Not logged in yet — run: ${teal('somewhere login')}`);
164
+ printVerify('codex');
165
+ }
166
+ function installClaudeCode() {
167
+ const config = loadConfig();
168
+ if (!config?.token) {
169
+ error('Not logged in. Run: somewhere login');
170
+ info(dim('`somewhere login` configures Claude Code automatically — no separate install step needed.'));
171
+ process.exit(1);
172
+ }
173
+ saveGlobalMcpConfig(config.token);
174
+ success(`Claude Code configured (~/.claude.json): ${teal('somewhere')} → ${UPSTREAM_URL}`);
175
+ printVerify('claude-code');
176
+ }
177
+ function installCursor(loggedIn) {
178
+ saveCursorMcpConfig();
179
+ success(`Cursor configured (${CURSOR_MCP_PATH}): ${teal('somewhere')} → somewhere mcp (stdio bridge)`);
180
+ if (!loggedIn)
181
+ info(`Not logged in yet — run: ${teal('somewhere login')}`);
182
+ printVerify('cursor');
183
+ }
184
+ function printVerify(host) {
185
+ info('');
186
+ switch (host) {
187
+ case 'codex':
188
+ info(`Verify: ${teal('codex mcp list')} should show "somewhere".`);
189
+ break;
190
+ case 'claude-code':
191
+ info(`Verify: run ${teal('/mcp')} inside Claude Code — "somewhere" should be listed.`);
192
+ break;
193
+ case 'cursor':
194
+ info('Verify: Cursor Settings → MCP should list "somewhere".');
195
+ break;
196
+ }
197
+ info(RESTART_HINT);
198
+ info(dim('Full setup check: somewhere mcp doctor'));
199
+ }
200
+ /* ─── somewhere mcp doctor ────────────────────────────────────────── */
201
+ async function runDoctor(version) {
202
+ let failures = 0;
203
+ const fail = (msg, fix) => {
204
+ failures++;
205
+ error(msg);
206
+ if (fix)
207
+ info(dim(`fix: ${fix}`));
208
+ };
209
+ info(`somewhere CLI ${version}`);
210
+ info('');
211
+ // 1. Login config present
212
+ const config = loadConfig();
213
+ if (config?.token) {
214
+ success(`Logged in as ${teal(config.user.email || '(unknown)')} (~/.somewhere/config.json)`);
215
+ }
216
+ else {
217
+ fail('Not logged in — no token in ~/.somewhere/config.json.', 'somewhere login');
218
+ }
219
+ // 2. Token actually valid against the API. /auth/whoami is the endpoint
220
+ // that accepts smt_ keys (verified 2026-06-09: /auth/platform-me rejects
221
+ // a key that whoami and the MCP server both accept).
222
+ if (config?.token) {
87
223
  try {
88
- await stdioTransport.start();
224
+ const me = await new ApiClient(config.token).call('GET', '/auth/whoami');
225
+ success(`Token valid (${me.user?.email ?? config.user.email ?? 'unknown account'})`);
89
226
  }
90
227
  catch (err) {
91
- emitFatalError(`Failed to start stdio transport: ${String(err)}`);
92
- process.exit(1);
228
+ fail(`Token rejected by api.somewhere.tech: ${err instanceof Error ? err.message : String(err)}`, 'somewhere login');
93
229
  }
94
- });
230
+ }
231
+ // 3. MCP server reachability — a real initialize round-trip, not a ping.
232
+ try {
233
+ const headers = {
234
+ 'Content-Type': 'application/json',
235
+ Accept: 'application/json, text/event-stream',
236
+ };
237
+ if (config?.token)
238
+ headers.Authorization = `Bearer ${config.token}`;
239
+ const res = await fetch(UPSTREAM_URL, {
240
+ method: 'POST',
241
+ headers,
242
+ body: JSON.stringify({
243
+ jsonrpc: '2.0',
244
+ id: 1,
245
+ method: 'initialize',
246
+ params: {
247
+ protocolVersion: '2025-03-26',
248
+ capabilities: {},
249
+ clientInfo: { name: 'somewhere-mcp-doctor', version },
250
+ },
251
+ }),
252
+ signal: AbortSignal.timeout(10_000),
253
+ });
254
+ if (res.ok) {
255
+ success('MCP server reachable — initialize accepted (mcp.somewhere.tech)');
256
+ }
257
+ else if (res.status === 401 && !config?.token) {
258
+ success('MCP server reachable (responded 401 — expected without a login)');
259
+ }
260
+ else if (res.status === 401) {
261
+ fail('MCP server reachable but it rejected the token.', 'somewhere login');
262
+ }
263
+ else {
264
+ fail(`MCP server responded ${res.status} to initialize.`);
265
+ }
266
+ }
267
+ catch (err) {
268
+ fail(`Cannot reach ${UPSTREAM_URL}: ${err instanceof Error ? err.message : String(err)}`);
269
+ }
270
+ // 4. Host configs — informational, not failures: not everyone uses every host.
271
+ info('');
272
+ info('Host configs:');
273
+ if (hasGlobalMcpConfig()) {
274
+ success('Claude Code: "somewhere" entry in ~/.claude.json');
275
+ }
276
+ else {
277
+ info(dim('Claude Code: not configured — somewhere mcp install claude-code (or just somewhere login)'));
278
+ }
279
+ const codexProbe = spawnSync('codex', ['--version'], { stdio: 'ignore' });
280
+ if (codexProbe.error || codexProbe.status !== 0) {
281
+ info(dim('Codex: CLI not found on PATH — skipped'));
282
+ }
283
+ else if (spawnSync('codex', ['mcp', 'get', 'somewhere'], { stdio: 'ignore' }).status === 0) {
284
+ success('Codex: "somewhere" MCP server configured');
285
+ }
286
+ else {
287
+ info(dim('Codex: not configured — somewhere mcp install codex'));
288
+ }
289
+ if (hasCursorMcpConfig()) {
290
+ success(`Cursor: "somewhere" entry in ${CURSOR_MCP_PATH}`);
291
+ }
292
+ else {
293
+ info(dim('Cursor: not configured — somewhere mcp install cursor'));
294
+ }
295
+ info('');
296
+ info(RESTART_HINT);
297
+ process.exit(failures > 0 ? 1 : 0);
95
298
  }
96
299
  //# sourceMappingURL=mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
2
  import { dirname, join, resolve } from 'node:path';
3
3
  import ora from 'ora';
4
- import { ApiClient } from '../lib/client.js';
4
+ import { ApiClient, CliApiError, LONG_CALL_TIMEOUT_MS } from '../lib/client.js';
5
5
  import { getToken, loadProjectConfig } from '../lib/config.js';
6
6
  import { dim, error, info, success, teal, warn } from '../lib/output.js';
7
7
  export function registerPull(program) {
@@ -34,14 +34,16 @@ export function registerPull(program) {
34
34
  const spinner = ora(`Fetching ${envSlot} source...`).start();
35
35
  let body;
36
36
  try {
37
- body = await client.call('GET', '/deploy/source', undefined, {
38
- project_id: projectId,
39
- env: envSlot,
40
- });
37
+ body = await client.call('GET', '/deploy/source', undefined, { project_id: projectId, env: envSlot }, { timeoutMs: LONG_CALL_TIMEOUT_MS });
41
38
  }
42
39
  catch (err) {
43
40
  spinner.fail('Pull failed');
44
- error(err instanceof Error ? err.message : String(err));
41
+ if (err instanceof CliApiError) {
42
+ error(`${err.message} ${dim(err.statusCode ? `[${err.code}, HTTP ${err.statusCode}]` : `[${err.code}]`)}`);
43
+ }
44
+ else {
45
+ error(err instanceof Error ? err.message : String(err));
46
+ }
45
47
  process.exit(1);
46
48
  }
47
49
  spinner.stop();
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAYzE,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,aAAa,EAAE,wCAAwC,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,GAAG,CAAC;SAC9C,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAAI,EAAE,EAAE;QACrD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5C,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,KAAK,CAAC,+FAA+F,CAAC,CAAC;gBACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;QAChC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,OAAO,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,IAAI,IAAoB,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE;gBAC3E,UAAU,EAAE,SAAS;gBACrB,GAAG,EAAE,OAAO;aACb,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5B,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAC1F,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,eAAe,OAAO,oBAAoB,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,QAAyB,EAAE,EAAE;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,CAAC,UAAU,OAAO,CAAC,MAAM,QAAQ,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,iBAAiB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,8BAA8B,CAAC,CAAC;YAC9G,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;gBAAE,IAAI,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ import { registerEnv } from './commands/env.js';
14
14
  import { registerStatus } from './commands/status.js';
15
15
  import { registerOpen } from './commands/open.js';
16
16
  import { registerDev } from './commands/dev.js';
17
+ import { registerExec } from './commands/exec.js';
17
18
  import { registerApi } from './commands/api.js';
18
19
  import { registerMcp } from './commands/mcp.js';
19
20
  const pkg = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json'), 'utf8'));
@@ -33,6 +34,7 @@ registerEnv(program);
33
34
  registerStatus(program);
34
35
  registerOpen(program);
35
36
  registerDev(program);
37
+ registerExec(program);
36
38
  registerApi(program);
37
39
  registerMcp(program);
38
40
  program.parse();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACnE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wBAAwB,CAAC;KACrC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AAErB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACnE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wBAAwB,CAAC;KACrC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AAErB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Rendering for the worker's structured BUILD_ERROR payload (tsk_de47d1d7).
3
+ *
4
+ * The /deploy and /deploy/patch routes answer compile failures with
5
+ * { error: 'BUILD_ERROR', message, data: { file, line, column, error,
6
+ * frame, errors: [...], build_log }, hint? }
7
+ *
8
+ * The CLI has the source files on disk, so the code frame is rebuilt locally
9
+ * (wider context + caret) instead of trusting the server's copy — and falls
10
+ * back to data.frame / the raw message when the local file doesn't match.
11
+ */
12
+ import { existsSync, readFileSync } from 'node:fs';
13
+ import { isAbsolute, join } from 'node:path';
14
+ import { CliApiError } from './client.js';
15
+ import { bold, dim, error, info, red, teal, warn } from './output.js';
16
+ /** Pull file:line:col diagnostics out of esbuild-style bundle_error text. */
17
+ export function parseBundleErrorText(text) {
18
+ const out = [];
19
+ const re = /([^\s:]+(?:\/[^\s:]+)*):(\d+):(\d+): ERROR: ([^\n]+)/g;
20
+ let m;
21
+ while ((m = re.exec(text)) !== null) {
22
+ out.push({ file: m[1], line: Number(m[2]), column: Number(m[3]) + 1, message: m[4].trim() });
23
+ }
24
+ return out;
25
+ }
26
+ const FRAME_CONTEXT = 2;
27
+ /** Build a code frame (line ±2, caret under the column) from local source. */
28
+ export function localCodeFrame(source, line, column) {
29
+ const lines = source.split('\n');
30
+ if (line < 1 || line > lines.length)
31
+ return '';
32
+ const start = Math.max(1, line - FRAME_CONTEXT);
33
+ const end = Math.min(lines.length, line + FRAME_CONTEXT);
34
+ const width = String(end).length;
35
+ const out = [];
36
+ for (let n = start; n <= end; n++) {
37
+ const marker = n === line ? red('>') : ' ';
38
+ const num = String(n).padStart(width);
39
+ out.push(`${marker} ${dim(`${num} |`)} ${lines[n - 1]}`);
40
+ if (n === line && column !== undefined && column >= 1) {
41
+ out.push(` ${dim(`${' '.repeat(width)} |`)} ${' '.repeat(column - 1)}${red('^')}`);
42
+ }
43
+ }
44
+ return out.join('\n');
45
+ }
46
+ function frameFor(detail, baseDir, serverFrame) {
47
+ if (detail.file && detail.line !== undefined) {
48
+ const abs = isAbsolute(detail.file) ? detail.file : join(baseDir, detail.file);
49
+ if (existsSync(abs)) {
50
+ try {
51
+ const frame = localCodeFrame(readFileSync(abs, 'utf-8'), detail.line, detail.column);
52
+ if (frame)
53
+ return frame;
54
+ }
55
+ catch {
56
+ // unreadable — fall through to the server's frame
57
+ }
58
+ }
59
+ }
60
+ return serverFrame ?? '';
61
+ }
62
+ function location(detail) {
63
+ if (!detail.file)
64
+ return detail.message ?? 'unknown error';
65
+ const pos = detail.line !== undefined
66
+ ? `:${detail.line}${detail.column !== undefined ? `:${detail.column}` : ''}`
67
+ : '';
68
+ return `${detail.file}${pos}${detail.message ? ` — ${detail.message}` : ''}`;
69
+ }
70
+ /** True when the error carries a structured build payload this module renders:
71
+ * BUILD_ERROR's data.{file,line,errors}, or any error (DEPLOY_BLANK_PAGE)
72
+ * whose data.bundle_error names the compile failure. */
73
+ export function isBuildError(err) {
74
+ if (!(err instanceof CliApiError) || !err.data || typeof err.data !== 'object')
75
+ return false;
76
+ if (err.code === 'BUILD_ERROR')
77
+ return true;
78
+ return typeof err.data.bundle_error === 'string';
79
+ }
80
+ /**
81
+ * Print a structured build failure: file:line heading, local code frame,
82
+ * remaining errors, missing assets, hint. Returns true if it rendered
83
+ * (caller falls back to generic output otherwise).
84
+ */
85
+ export function renderBuildError(err, baseDir) {
86
+ const data = (err.data ?? {});
87
+ let details = Array.isArray(data.errors) && data.errors.length > 0
88
+ ? data.errors
89
+ : data.file !== undefined || data.error !== undefined
90
+ ? [{ file: data.file, line: data.line, column: data.column, message: data.error }]
91
+ : [];
92
+ if (details.length === 0 && typeof data.bundle_error === 'string') {
93
+ details = parseBundleErrorText(data.bundle_error);
94
+ }
95
+ if (details.length === 0 && !data.missing_assets?.length)
96
+ return false;
97
+ const first = details[0];
98
+ if (first) {
99
+ error(`${bold('Build failed')} — ${teal(location(first))}`);
100
+ const frame = frameFor(first, baseDir, data.frame);
101
+ if (frame) {
102
+ console.log('');
103
+ console.log(frame);
104
+ console.log('');
105
+ }
106
+ }
107
+ for (const extra of details.slice(1, 6)) {
108
+ error(location(extra));
109
+ const frame = frameFor(extra, baseDir);
110
+ if (frame) {
111
+ console.log('');
112
+ console.log(frame);
113
+ console.log('');
114
+ }
115
+ }
116
+ if (details.length > 6) {
117
+ info(dim(`…and ${details.length - 6} more build error(s)`));
118
+ }
119
+ if (data.missing_assets?.length) {
120
+ warn(`Missing assets referenced by the build: ${data.missing_assets.slice(0, 10).join(', ')}${data.missing_assets.length > 10 ? ', …' : ''}`);
121
+ }
122
+ if (err.hint)
123
+ info(dim(err.hint));
124
+ if (err.code === 'BUILD_ERROR') {
125
+ info(dim(`Nothing from this deploy is live. Fix the error and redeploy. [BUILD_ERROR, HTTP ${err.statusCode}]`));
126
+ }
127
+ else {
128
+ // Non-BUILD_ERROR codes (DEPLOY_BLANK_PAGE) carry context the frame
129
+ // doesn't repeat — rollback state, false-alarm guidance. Keep it.
130
+ info(dim(`${err.message} [${err.code}, HTTP ${err.statusCode}]`));
131
+ }
132
+ return true;
133
+ }
134
+ /** Yellow single-line summary for watch-mode (somewhere dev) reuse. */
135
+ export function buildErrorSummary(err) {
136
+ const data = (err.data ?? {});
137
+ let first = Array.isArray(data.errors) && data.errors.length > 0
138
+ ? data.errors[0]
139
+ : data.file !== undefined || data.error !== undefined
140
+ ? { file: data.file, line: data.line, column: data.column, message: data.error }
141
+ : undefined;
142
+ if (!first && typeof data.bundle_error === 'string') {
143
+ first = parseBundleErrorText(data.bundle_error)[0];
144
+ }
145
+ return first ? location(first) : err.message;
146
+ }
147
+ //# sourceMappingURL=build-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-errors.js","sourceRoot":"","sources":["../../src/lib/build-errors.ts"],"names":[],"mappings":"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"}