@somewhere-tech/cli 0.33.11 → 0.34.1

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 (87) hide show
  1. package/README.md +12 -7
  2. package/dist/commands/advisor.js +1 -1
  3. package/dist/commands/advisor.js.map +1 -1
  4. package/dist/commands/api.js +12 -5
  5. package/dist/commands/api.js.map +1 -1
  6. package/dist/commands/auth.js +7 -7
  7. package/dist/commands/auth.js.map +1 -1
  8. package/dist/commands/browser.js +2 -2
  9. package/dist/commands/browser.js.map +1 -1
  10. package/dist/commands/call.js +1 -1
  11. package/dist/commands/call.js.map +1 -1
  12. package/dist/commands/catalog.js +1 -1
  13. package/dist/commands/catalog.js.map +1 -1
  14. package/dist/commands/check.js +123 -9
  15. package/dist/commands/check.js.map +1 -1
  16. package/dist/commands/cron.js +12 -9
  17. package/dist/commands/cron.js.map +1 -1
  18. package/dist/commands/db.js +3 -3
  19. package/dist/commands/db.js.map +1 -1
  20. package/dist/commands/deploy.js +54 -18
  21. package/dist/commands/deploy.js.map +1 -1
  22. package/dist/commands/dev.js +47 -15
  23. package/dist/commands/dev.js.map +1 -1
  24. package/dist/commands/docs.js +3 -3
  25. package/dist/commands/docs.js.map +1 -1
  26. package/dist/commands/email.js +11 -8
  27. package/dist/commands/email.js.map +1 -1
  28. package/dist/commands/env.js +13 -5
  29. package/dist/commands/env.js.map +1 -1
  30. package/dist/commands/errors.js +2 -2
  31. package/dist/commands/errors.js.map +1 -1
  32. package/dist/commands/feedback.js +1 -1
  33. package/dist/commands/feedback.js.map +1 -1
  34. package/dist/commands/fs.js +14 -8
  35. package/dist/commands/fs.js.map +1 -1
  36. package/dist/commands/git.js +3 -3
  37. package/dist/commands/git.js.map +1 -1
  38. package/dist/commands/grep.js +1 -1
  39. package/dist/commands/grep.js.map +1 -1
  40. package/dist/commands/init.js +20 -8
  41. package/dist/commands/init.js.map +1 -1
  42. package/dist/commands/logs.js +1 -1
  43. package/dist/commands/logs.js.map +1 -1
  44. package/dist/commands/mcp.js +10 -5
  45. package/dist/commands/mcp.js.map +1 -1
  46. package/dist/commands/open.js +1 -1
  47. package/dist/commands/open.js.map +1 -1
  48. package/dist/commands/postgres.js +2 -2
  49. package/dist/commands/postgres.js.map +1 -1
  50. package/dist/commands/project.js +12 -12
  51. package/dist/commands/project.js.map +1 -1
  52. package/dist/commands/promote.js +13 -3
  53. package/dist/commands/promote.js.map +1 -1
  54. package/dist/commands/pull.js +2 -2
  55. package/dist/commands/pull.js.map +1 -1
  56. package/dist/commands/rollback.js +3 -3
  57. package/dist/commands/rollback.js.map +1 -1
  58. package/dist/commands/run.js +11 -4
  59. package/dist/commands/run.js.map +1 -1
  60. package/dist/commands/tasks.js +1 -1
  61. package/dist/commands/tasks.js.map +1 -1
  62. package/dist/commands/usage.js +5 -3
  63. package/dist/commands/usage.js.map +1 -1
  64. package/dist/commands/verify.js +3 -3
  65. package/dist/commands/verify.js.map +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/lib/client.js +7 -0
  69. package/dist/lib/client.js.map +1 -1
  70. package/dist/lib/config.js +16 -3
  71. package/dist/lib/config.js.map +1 -1
  72. package/dist/lib/declared-data.js +53 -1
  73. package/dist/lib/declared-data.js.map +1 -1
  74. package/dist/lib/frontend-dev.js +46 -0
  75. package/dist/lib/frontend-dev.js.map +1 -1
  76. package/dist/lib/init-agent-guide.js +26 -27
  77. package/dist/lib/init-agent-guide.js.map +1 -1
  78. package/dist/lib/init-auth-template.js +230 -0
  79. package/dist/lib/init-auth-template.js.map +1 -0
  80. package/dist/lib/init-green-template.js +8 -29
  81. package/dist/lib/init-green-template.js.map +1 -1
  82. package/dist/lib/output.js +42 -2
  83. package/dist/lib/output.js.map +1 -1
  84. package/dist/lib/platform-tools.js +30 -2
  85. package/dist/lib/platform-tools.js.map +1 -1
  86. package/npm-shrinkwrap.json +2 -2
  87. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"declared-data.js","sourceRoot":"","sources":["../../src/lib/declared-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"declared-data.js","sourceRoot":"","sources":["../../src/lib/declared-data.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { createRequire } from 'node:module';
2
2
  import { realpathSync } from 'node:fs';
3
+ import { createConnection, createServer as createNetServer } from 'node:net';
3
4
  import { join } from 'node:path';
4
5
  import { pathToFileURL } from 'node:url';
5
6
  import { declaredDataPlugin } from './declared-data.js';
@@ -68,6 +69,42 @@ export function frontendProxy(target, localOrigin) {
68
69
  },
69
70
  };
70
71
  }
72
+ /**
73
+ * `localhost` resolves to ::1 first on many machines, and Vite binds exactly one
74
+ * address, so a browser opening http://localhost:<port> could be refused while
75
+ * the server sat on 127.0.0.1. Relay the IPv6 loopback to the IPv4 one so both
76
+ * families reach the same server — loopback only, never a wildcard address.
77
+ * Resolves null where the machine has no IPv6 loopback.
78
+ */
79
+ export async function relayIpv6Loopback(port) {
80
+ const sockets = new Set();
81
+ const relay = createNetServer((client) => {
82
+ const upstream = createConnection({ host: '127.0.0.1', port });
83
+ for (const socket of [client, upstream]) {
84
+ sockets.add(socket);
85
+ socket.on('close', () => sockets.delete(socket));
86
+ }
87
+ client.pipe(upstream).pipe(client);
88
+ client.on('error', () => upstream.destroy());
89
+ upstream.on('error', () => client.destroy());
90
+ });
91
+ // An open HMR socket must not hold the relay (and so `somewhere dev`) open.
92
+ const closeRelay = relay.close.bind(relay);
93
+ relay.close = (callback) => {
94
+ for (const socket of sockets)
95
+ socket.destroy();
96
+ return closeRelay(callback);
97
+ };
98
+ return new Promise((resolvePromise, rejectPromise) => {
99
+ relay.once('error', (error) => {
100
+ if (error.code === 'EADDRNOTAVAIL' || error.code === 'EAFNOSUPPORT')
101
+ resolvePromise(null);
102
+ else
103
+ rejectPromise(error);
104
+ });
105
+ relay.listen({ host: '::1', port, ipv6Only: true }, () => resolvePromise(relay));
106
+ });
107
+ }
71
108
  export async function startFrontendDev(cwd, target, port = 8787, open = false) {
72
109
  if (!Number.isInteger(port) || port < 1 || port > 65535)
73
110
  throw new Error('Port must be an integer from 1 through 65535.');
@@ -107,6 +144,14 @@ export async function startFrontendDev(cwd, target, port = 8787, open = false) {
107
144
  await server.close();
108
145
  throw error;
109
146
  }
147
+ let relay;
148
+ try {
149
+ relay = await relayIpv6Loopback(port);
150
+ }
151
+ catch (error) {
152
+ await server.close();
153
+ throw error;
154
+ }
110
155
  console.log(`Frontend hot reload: ${localOrigin}`);
111
156
  console.log(`API requests use the deployed backend: ${origin}`);
112
157
  console.log('Backend changes require somewhere deploy or somewhere preview.');
@@ -114,6 +159,7 @@ export async function startFrontendDev(cwd, target, port = 8787, open = false) {
114
159
  server.close = async () => {
115
160
  process.removeListener('SIGINT', close);
116
161
  process.removeListener('SIGTERM', close);
162
+ await new Promise((resolvePromise) => (relay ? relay.close(() => resolvePromise()) : resolvePromise()));
117
163
  return closeServer();
118
164
  };
119
165
  const close = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-dev.js","sourceRoot":"","sources":["../../src/lib/frontend-dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontend-dev.js","sourceRoot":"","sources":["../../src/lib/frontend-dev.ts"],"names":[],"mappings":"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"}
@@ -2,36 +2,35 @@
2
2
  // docs lint byte-compares this value when SOMEWHERE_CLI_REPO points here.
3
3
  export const AGENT_WORKFLOW = `## Getting started — build, deploy, verify
4
4
 
5
- 1. Declare application tables in \`db/schema.ts\`. Choose \`owner()\` (own rows),
6
- \`shared()\` (cross-user rows), or \`serverOnly()\`, and add a \`client\` block for
7
- browser access. See \`docs({ topic: 'declared-data' })\`.
8
- 2. Add a \`tsconfig.json\` for TypeScript source, then run \`somewhere typecheck\`.
9
- The CLI generates declaration types from \`db/schema.ts\`; it does not need
10
- hand-written module stubs. See the complete files in \`/start.txt\`.
11
- 3. Deploy raw source with \`somewhere deploy\`; do not build first. The CLI links
12
- the directory to the project it created.
13
- 4. Write a \`flow.json\` that submits data and checks the rendered result. From
14
- the linked directory run \`somewhere verify --flow flow.json\` to exercise it
15
- at desktop and phone sizes. \`/start.txt\` includes a working flow.
5
+ The loop, after every change:
16
6
 
17
- Use \`somewhere dev\` for optional local UI work after the first deploy. For
18
- sign-in, read \`somewhere email test-inbox <addr>\`. For a scheduled function on a
19
- plan with cron, run \`somewhere cron run <id> --wait\` (plain \`cron run\` only
20
- queues it). On a temporary project, use \`somewhere logs --tail 10\` to diagnose
21
- failures. \`somewhere errors\` requires a claimed project and a signed-in account.
7
+ 1. \`somewhere deploy\` — raw source; do not build first. It prints the live URL.
8
+ 2. \`somewhere verify\` — the live app at desktop and phone sizes, with
9
+ screenshots and console/network health. \`somewhere verify --flow flow.json\`
10
+ fills and clicks (\`/start.txt\` has a flow); \`somewhere browser\` inspects a page.
11
+ 3. \`somewhere logs --tail 10\`, then \`somewhere errors\` (claimed project,
12
+ signed in): read the failure before guessing.
13
+ 4. Email flows: sign up as \`<name>@<subdomain>.test.somewhere.site\`, then
14
+ \`somewhere email test-inbox <addr>\` prints the message and its magic link.
22
15
 
23
- ### Two habits that keep the app fast and scoped
16
+ Default build path, in order:
17
+ 1. Sign-in (\`somewhere init\` writes it): \`api/auth/[...path].ts\` is
18
+ \`export { somewhereAuth as default } from '@somewhere-tech/sdk/server'\`;
19
+ the page calls \`createSomewhereAuth()\` from \`@somewhere-tech/sdk/auth\`.
20
+ 2. Data: tables in \`db/schema.ts\` — \`owner()\` (own rows), \`shared()\` or
21
+ \`serverOnly()\` — with a \`client\` block; the page reads and writes them
22
+ through \`somewhere:data\` (\`docs({ topic: 'declared-data' })\`).
23
+ 3. Counts and groups: \`data.<table>.aggregate\` (\`sw.db.aggregate\` server-side).
24
+ 4. A function only when a business rule needs the server:
25
+ \`sw.endpoint({ auth, body, rateLimit, handler })\`.
24
26
 
25
- **Reads issued together travel together:** independent reads go in one
26
- \`Promise.all\` — one round trip, not one each.
27
-
28
- **\`owner()\` tables need no auth guard.** Structured calls scope rows to the
29
- request identity. A custom endpoint still enforces its own caller policy.
30
-
31
- Ordinary lookups: \`somewhere docs <topic>\` or
32
- \`https://somewhere.tech/start.txt\`; uncertain architecture or composition:
33
- \`somewhere advisor "<question>"\`. Without a shell: MCP \`docs({ topic })\`,
34
- \`advisor({ question })\`; \`catalog\` finds tools.
27
+ \`somewhere typecheck\` generates the types for \`sw\` and your tables. Independent
28
+ reads go in one \`Promise.all\`. \`owner()\` tables need no auth guard; a custom
29
+ endpoint enforces its own caller policy. \`somewhere docs <topic>\` for a
30
+ contract; \`somewhere advisor "<question>"\` for uncertain architecture (MCP:
31
+ \`docs({ topic })\`, \`advisor({ question })\`, \`catalog\`). \`somewhere dev\` is
32
+ optional local UI work; \`somewhere cron run <id> --wait\` runs a scheduled job
33
+ (plain \`cron run\` only queues it).
35
34
 
36
35
  No account yet? \`npx @somewhere-tech/cli deploy\` publishes a temporary app and
37
36
  prints its live URL, claim URL, and expiry. On a hosted VM, after consent,
@@ -1 +1 @@
1
- {"version":3,"file":"init-agent-guide.js","sourceRoot":"","sources":["../../src/lib/init-agent-guide.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCb,CAAC;AAElB,MAAM,CAAC,MAAM,cAAc,GAAG,wCAAwC,cAAc,IAAI,CAAC;AACzF,MAAM,CAAC,MAAM,cAAc,GAAG,4CAA4C,CAAC"}
1
+ {"version":3,"file":"init-agent-guide.js","sourceRoot":"","sources":["../../src/lib/init-agent-guide.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmCb,CAAC;AAElB,MAAM,CAAC,MAAM,cAAc,GAAG,wCAAwC,cAAc,IAAI,CAAC;AACzF,MAAM,CAAC,MAAM,cAAc,GAAG,4CAA4C,CAAC"}
@@ -0,0 +1,230 @@
1
+ import { INIT_AGENTS_MD, INIT_CLAUDE_MD } from './init-agent-guide.js';
2
+ // The default `somewhere init` starter: cookie sign-in through the SDK client
3
+ // and the SDK's packaged /api/auth handler, plus one protected endpoint.
4
+ // `--template minimal` keeps the no-auth starter (init-green-template.ts).
5
+ const PACKAGE_JSON = `{
6
+ "name": "somewhere-starter",
7
+ "private": true,
8
+ "version": "0.1.0",
9
+ "type": "module",
10
+ "scripts": {
11
+ "dev": "somewhere dev",
12
+ "typecheck": "somewhere typecheck"
13
+ },
14
+ "dependencies": {
15
+ "@somewhere-tech/sdk": "0.8.0",
16
+ "react": "19.2.7",
17
+ "react-dom": "19.2.7"
18
+ },
19
+ "devDependencies": {
20
+ "@types/react": "19.2.2",
21
+ "@types/react-dom": "19.2.2",
22
+ "typescript": "5.9.3",
23
+ "vite": "7.2.2"
24
+ }
25
+ }
26
+ `;
27
+ const TSCONFIG = `{
28
+ "compilerOptions": {
29
+ "target": "ES2022",
30
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
31
+ "strict": true,
32
+ "noEmit": true,
33
+ "skipLibCheck": true,
34
+ "module": "ESNext",
35
+ "moduleResolution": "Bundler",
36
+ "isolatedModules": true,
37
+ "jsx": "react-jsx"
38
+ },
39
+ "include": ["src", "api", "db", "types"]
40
+ }
41
+ `;
42
+ const APP_TYPES = `export interface GreetingResponse {
43
+ message: string;
44
+ }
45
+ `;
46
+ const SCHEMA = `import { id, schema, serverOnly, table, text } from 'somewhere/db';
47
+
48
+ export default schema({
49
+ greetings: table({
50
+ id: id(),
51
+ message: text({ default: 'You are signed in.' }),
52
+ }, {
53
+ scope: serverOnly(),
54
+ }),
55
+ });
56
+ `;
57
+ const AUTH_API = `export { somewhereAuth as default } from '@somewhere-tech/sdk/server';
58
+ `;
59
+ const GREETING_API = `export default sw.endpoint({
60
+ auth: 'required',
61
+ rateLimit: '30/minute',
62
+ handler: async ({ user }, sw) => {
63
+ const result = await sw.db.from('greetings', { limit: 1 });
64
+ const message = result.data[0]?.message;
65
+ return { message: \`\${typeof message === 'string' ? message : 'You are signed in.'} (\${user.email ?? user.id})\` };
66
+ },
67
+ });
68
+ `;
69
+ const AUTH_SERVICE = `import { createSomewhereAuth, type User } from '@somewhere-tech/sdk/auth';
70
+
71
+ // Talks to api/auth/[...path].ts. The session is an httpOnly cookie; this
72
+ // code never sees a token.
73
+ export const auth = createSomewhereAuth();
74
+ export type { User };
75
+ `;
76
+ const GREETING_SERVICE = `import type { GreetingResponse } from '../../types/app';
77
+
78
+ export async function loadGreeting(): Promise<GreetingResponse> {
79
+ const response = await fetch('/api/greeting', { credentials: 'include' });
80
+ const body = (await response.json().catch(() => ({}))) as Partial<GreetingResponse> & { message?: string };
81
+ if (!response.ok) throw new Error(body.message ?? \`Request failed (\${response.status})\`);
82
+ return { message: body.message ?? '' };
83
+ }
84
+ `;
85
+ const APP = `import { useEffect, useState, type FormEvent } from 'react';
86
+ import { auth, type User } from './services/auth';
87
+ import { loadGreeting } from './services/greeting';
88
+
89
+ export function App() {
90
+ const [user, setUser] = useState<User | null>(auth.getCachedUser());
91
+ const [checking, setChecking] = useState(true);
92
+ const [mode, setMode] = useState<'signIn' | 'signUp'>('signIn');
93
+ const [email, setEmail] = useState('');
94
+ const [password, setPassword] = useState('');
95
+ const [error, setError] = useState('');
96
+ const [message, setMessage] = useState('');
97
+
98
+ useEffect(() => {
99
+ void auth.getUser().then(setUser).finally(() => setChecking(false));
100
+ }, []);
101
+
102
+ useEffect(() => {
103
+ if (!user) return;
104
+ void loadGreeting()
105
+ .then((result) => setMessage(result.message))
106
+ .catch((reason: unknown) => setMessage(reason instanceof Error ? reason.message : 'Could not load the greeting.'));
107
+ }, [user]);
108
+
109
+ async function submit(event: FormEvent<HTMLFormElement>) {
110
+ event.preventDefault();
111
+ setError('');
112
+ try {
113
+ const next = mode === 'signIn'
114
+ ? await auth.signIn({ email, password })
115
+ : await auth.signUp({ email, password });
116
+ setUser(next);
117
+ } catch (reason: unknown) {
118
+ setError(reason instanceof Error ? reason.message : 'Sign-in failed.');
119
+ }
120
+ }
121
+
122
+ async function signOut() {
123
+ await auth.signOut();
124
+ setUser(null);
125
+ setMessage('');
126
+ setMode('signIn');
127
+ }
128
+
129
+ if (checking && !user) return <main><p className="hint">Loading…</p></main>;
130
+
131
+ if (user) {
132
+ return (
133
+ <main>
134
+ <p className="eyebrow">somewhere.tech starter</p>
135
+ <h1>You are signed in.</h1>
136
+ <p className="message">{message || 'Loading your greeting…'}</p>
137
+ <button type="button" onClick={() => void signOut()}>Sign out</button>
138
+ </main>
139
+ );
140
+ }
141
+
142
+ return (
143
+ <main>
144
+ <p className="eyebrow">somewhere.tech starter</p>
145
+ <h1>{mode === 'signIn' ? 'Sign in' : 'Create an account'}</h1>
146
+ <form onSubmit={(event) => void submit(event)}>
147
+ <label>Email<input type="email" name="email" autoComplete="email" required value={email} onChange={(event) => setEmail(event.target.value)} /></label>
148
+ <label>Password<input type="password" name="password" autoComplete={mode === 'signIn' ? 'current-password' : 'new-password'} required minLength={8} value={password} onChange={(event) => setPassword(event.target.value)} /></label>
149
+ {error ? <p className="error" role="alert">{error}</p> : null}
150
+ <button type="submit">{mode === 'signIn' ? 'Sign in' : 'Create account'}</button>
151
+ </form>
152
+ <button type="button" className="link" onClick={() => { setMode(mode === 'signIn' ? 'signUp' : 'signIn'); setError(''); }}>
153
+ {mode === 'signIn' ? 'New here? Create an account' : 'Have an account? Sign in'}
154
+ </button>
155
+ </main>
156
+ );
157
+ }
158
+ `;
159
+ const MAIN = `import { StrictMode } from 'react';
160
+ import { createRoot } from 'react-dom/client';
161
+ import { App } from './App';
162
+ import './styles.css';
163
+
164
+ createRoot(document.getElementById('root')!).render(
165
+ <StrictMode>
166
+ <App />
167
+ </StrictMode>,
168
+ );
169
+ `;
170
+ const STYLES = `:root {
171
+ font-family: Inter, ui-sans-serif, system-ui, sans-serif;
172
+ color: #17201c;
173
+ background: #edf4ef;
174
+ }
175
+
176
+ * { box-sizing: border-box; }
177
+ body { margin: 0; min-width: 320px; }
178
+ main { width: min(480px, calc(100% - 32px)); margin: 12vh auto; }
179
+ h1 { margin: 12px 0 24px; font-size: clamp(2.2rem, 7vw, 3.6rem); line-height: 1; letter-spacing: -.04em; }
180
+ .eyebrow { color: #14734c; font-weight: 750; text-transform: uppercase; letter-spacing: .12em; }
181
+ form { display: grid; gap: 14px; }
182
+ label { display: grid; gap: 6px; font-weight: 600; }
183
+ input { padding: 12px 14px; border: 1px solid #c6d8ce; border-radius: 10px; font: inherit; }
184
+ button { padding: 12px 16px; border: 0; border-radius: 10px; background: #14734c; color: #fff; font: inherit; font-weight: 650; cursor: pointer; }
185
+ button.link { margin-top: 12px; padding: 0; background: none; color: #0e6542; }
186
+ .message { padding: 20px 22px; border: 1px solid #c6d8ce; border-radius: 16px; background: rgba(255, 255, 255, .82); }
187
+ .error { margin: 0; color: #a3261b; }
188
+ .hint { color: #4f665b; }
189
+ `;
190
+ const README = `# somewhere.tech starter
191
+
192
+ This project starts signed in: a React page signs users up and in with the
193
+ SDK client (\`src/services/auth.ts\`), \`api/auth/[...path].ts\` is the SDK's
194
+ packaged auth handler, and \`api/greeting.ts\` is a protected endpoint
195
+ (\`sw.endpoint({ auth: 'required' })\`). The session is an httpOnly cookie.
196
+
197
+ \`\`\`sh
198
+ somewhere typecheck
199
+ somewhere deploy
200
+ somewhere verify
201
+ \`\`\`
202
+
203
+ Deploy the raw source. The platform compiles it; do not create or deploy a
204
+ \`dist/\` or \`build/\` directory. For a starter without sign-in, run
205
+ \`somewhere init --template minimal\` in an empty directory.
206
+ `;
207
+ export function createAuthTemplate() {
208
+ return [
209
+ { path: '.gitignore', content: 'node_modules\ndist\nbuild\n.env\n' },
210
+ { path: 'AGENTS.md', content: INIT_AGENTS_MD },
211
+ { path: 'CLAUDE.md', content: INIT_CLAUDE_MD },
212
+ { path: 'README.md', content: README },
213
+ { path: 'package.json', content: PACKAGE_JSON },
214
+ { path: 'tsconfig.json', content: TSCONFIG },
215
+ {
216
+ path: 'index.html',
217
+ content: '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>somewhere.tech starter</title>\n </head>\n <body>\n <div id="root"></div>\n <script type="module" src="/src/main.tsx"></script>\n </body>\n</html>\n',
218
+ },
219
+ { path: 'src/App.tsx', content: APP },
220
+ { path: 'src/main.tsx', content: MAIN },
221
+ { path: 'src/services/auth.ts', content: AUTH_SERVICE },
222
+ { path: 'src/services/greeting.ts', content: GREETING_SERVICE },
223
+ { path: 'src/styles.css', content: STYLES },
224
+ { path: 'api/auth/[...path].ts', content: AUTH_API },
225
+ { path: 'api/greeting.ts', content: GREETING_API },
226
+ { path: 'db/schema.ts', content: SCHEMA },
227
+ { path: 'types/app.ts', content: APP_TYPES },
228
+ ];
229
+ }
230
+ //# sourceMappingURL=init-auth-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-auth-template.js","sourceRoot":"","sources":["../../src/lib/init-auth-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAE3E,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;CAUd,CAAC;AAEF,MAAM,QAAQ,GAAG;CAChB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;CASpB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;CAMpB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;CAQxB,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;CAUZ,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;CAmBd,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;QAC/C,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5C;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,mUAAmU;SAC7U;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE;QACvD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC/D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE;QAClD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;KAC7C,CAAC;AACJ,CAAC"}
@@ -39,18 +39,6 @@ const APP_TYPES = `export interface GreetingResponse {
39
39
  message: string;
40
40
  }
41
41
  `;
42
- const RUNTIME_TYPES = `export interface QueryResult<T> {
43
- data: T[];
44
- count: number;
45
- changes: number;
46
- }
47
-
48
- export interface SomewhereRuntime {
49
- db: {
50
- from<T>(table: string, options: { limit: number }): Promise<QueryResult<T>>;
51
- };
52
- }
53
- `;
54
42
  const SCHEMA = `import { id, schema, serverOnly, table, text } from 'somewhere/db';
55
43
 
56
44
  export default schema({
@@ -62,22 +50,14 @@ export default schema({
62
50
  }),
63
51
  });
64
52
  `;
65
- const API = `import type { SomewhereRuntime } from '../types/runtime';
66
-
67
- interface GreetingRow {
68
- message: string;
69
- }
70
-
71
- export default async function greeting(
72
- _req: Request,
73
- sw: SomewhereRuntime,
74
- ): Promise<Response> {
75
- const result = await sw.db.from<GreetingRow>('greetings', { limit: 1 });
76
-
77
- return Response.json({
78
- message: result.data[0]?.message ?? 'Your full-stack app is ready.',
79
- });
80
- }
53
+ const API = `export default sw.endpoint({
54
+ auth: 'none',
55
+ handler: async (_input, sw) => {
56
+ const result = await sw.db.from('greetings', { limit: 1 });
57
+ const message = result.data[0]?.message;
58
+ return { message: typeof message === 'string' ? message : 'Your full-stack app is ready.' };
59
+ },
60
+ });
81
61
  `;
82
62
  const SERVICE = `import type { GreetingResponse } from '../../types/app';
83
63
 
@@ -173,7 +153,6 @@ export function createGreenTemplate() {
173
153
  { path: 'api/greeting.ts', content: API },
174
154
  { path: 'db/schema.ts', content: SCHEMA },
175
155
  { path: 'types/app.ts', content: APP_TYPES },
176
- { path: 'types/runtime.ts', content: RUNTIME_TYPES },
177
156
  ];
178
157
  }
179
158
  //# sourceMappingURL=init-green-template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-green-template.js","sourceRoot":"","sources":["../../src/lib/init-green-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;CAoBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;CAWrB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;CAUd,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;CAgBX,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;CAOf,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;CAUZ,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;CAcd,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;QAC/C,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5C;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,mUAAmU;SAC7U;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,OAAO,EAAE;QACtD,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;QAC5C,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE;KACrD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"init-green-template.js","sourceRoot":"","sources":["../../src/lib/init-green-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;CAoBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;CAUd,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;CAQX,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;CAOf,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;CAUZ,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;CAcd,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;QAC/C,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5C;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,mUAAmU;SAC7U;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,OAAO,EAAE;QACtD,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;KAC7C,CAAC;AACJ,CAAC"}
@@ -18,9 +18,49 @@ export const cyan = ansi('\x1b[36m', '\x1b[39m');
18
18
  export function success(msg) {
19
19
  console.log(`${green('✓')} ${msg}`);
20
20
  }
21
- export function error(msg) {
21
+ /**
22
+ * The platform's own refusal, exactly as it should reach `--json`.
23
+ *
24
+ * Both error types that carry one (the API's CliApiError and an MCP tool's
25
+ * PlatformToolError) are matched by shape rather than imported: output.ts sits
26
+ * below client.ts in the import graph. Anything else — a bad flag, a missing
27
+ * file — originated in the CLI and has no code of its own.
28
+ */
29
+ export function platformErrorEnvelope(cause) {
30
+ if (!(cause instanceof Error))
31
+ return null;
32
+ if (cause.name !== 'CliApiError' && cause.name !== 'PlatformToolError')
33
+ return null;
34
+ const typed = cause;
35
+ if (typeof typed.code !== 'string' || !typed.code)
36
+ return null;
37
+ const meta = typed.meta ?? {};
38
+ return {
39
+ code: typed.code,
40
+ message: typeof typed.detail === 'string' ? typed.detail : typed.message,
41
+ extra: {
42
+ ...(typeof typed.hint === 'string' && typed.hint ? { hint: typed.hint } : {}),
43
+ ...(meta.requestId ? { request_id: meta.requestId } : {}),
44
+ ...(meta.traceId ? { trace_id: meta.traceId } : {}),
45
+ ...(typeof meta.retry === 'boolean' ? { retry: meta.retry } : {}),
46
+ ...(typeof meta.retryAfterMs === 'number' ? { retry_after_ms: meta.retryAfterMs } : {}),
47
+ ...(typed.data && typeof typed.data === 'object' ? { data: typed.data } : {}),
48
+ },
49
+ };
50
+ }
51
+ /**
52
+ * Print a failure. `cause` is the error behind it, when there is one: in
53
+ * `--json` mode a platform refusal keeps its own code, message, hint and
54
+ * request id, and only a failure that began in the CLI says CLI_ERROR.
55
+ */
56
+ export function error(msg, cause) {
22
57
  if (jsonOutputMode) {
23
- if (!jsonErrorWritten)
58
+ if (jsonErrorWritten)
59
+ return;
60
+ const platform = platformErrorEnvelope(cause);
61
+ if (platform)
62
+ printJsonError(platform.code, platform.message, platform.extra);
63
+ else
24
64
  printJsonError('CLI_ERROR', stripAnsi(msg));
25
65
  return;
26
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,20 @@ const MCP_BASE_URL = process.env.SOMEWHERE_MCP_URL?.replace(/\/$/, '') || 'https
5
5
  let isSdkAuthError = () => false;
6
6
  export class PlatformToolError extends Error {
7
7
  tool;
8
- constructor(tool, message) {
8
+ code;
9
+ detail;
10
+ hint;
11
+ meta;
12
+ constructor(tool, message,
13
+ /** The platform's own error code, message, fix and request id, when the
14
+ * tool answered with its JSON envelope — `message` above flattens them. */
15
+ code, detail, hint, meta = {}) {
9
16
  super(message);
10
17
  this.tool = tool;
18
+ this.code = code;
19
+ this.detail = detail;
20
+ this.hint = hint;
21
+ this.meta = meta;
11
22
  this.name = 'PlatformToolError';
12
23
  }
13
24
  }
@@ -116,6 +127,23 @@ function textFromResult(result) {
116
127
  .map((block) => block.text)
117
128
  .join('\n');
118
129
  }
130
+ export function platformToolErrorFromText(name, text) {
131
+ const message = toolErrorMessage(text);
132
+ try {
133
+ const parsed = JSON.parse(text);
134
+ const field = (key) => typeof parsed[key] === 'string' && parsed[key] ? parsed[key] : undefined;
135
+ const code = field('error');
136
+ if (!code)
137
+ return new PlatformToolError(name, message);
138
+ return new PlatformToolError(name, message, code, field('message') ?? text, field('next_step') ?? field('hint'), {
139
+ requestId: field('request_id'),
140
+ traceId: field('trace_id'),
141
+ });
142
+ }
143
+ catch {
144
+ return new PlatformToolError(name, message);
145
+ }
146
+ }
119
147
  function toolErrorMessage(text) {
120
148
  try {
121
149
  const parsed = JSON.parse(text);
@@ -139,7 +167,7 @@ export async function callPlatformToolRaw(name, args, options = {}) {
139
167
  const result = await withPlatformClient(options, (client) => client.callTool({ name, arguments: invocationArgs }));
140
168
  const typed = result;
141
169
  if (typed.isError) {
142
- throw new PlatformToolError(name, toolErrorMessage(textFromResult(typed)));
170
+ throw platformToolErrorFromText(name, textFromResult(typed));
143
171
  }
144
172
  return typed;
145
173
  }