codebase-cli 2.0.0-pre.2 → 2.0.0-pre.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent.js +2 -0
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/config.js +76 -9
- package/dist/agent/config.js.map +1 -1
- package/dist/app-server/protocol.js +7 -0
- package/dist/app-server/protocol.js.map +1 -0
- package/dist/app-server/server.js +241 -0
- package/dist/app-server/server.js.map +1 -0
- package/dist/auth/flow.js +174 -41
- package/dist/auth/flow.js.map +1 -1
- package/dist/cli.js +47 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/builtins.js +88 -5
- package/dist/commands/builtins.js.map +1 -1
- package/dist/commands/registry.js +46 -1
- package/dist/commands/registry.js.map +1 -1
- package/dist/headless/run.js +1 -1
- package/dist/headless/run.js.map +1 -1
- package/dist/permissions/store.js +4 -0
- package/dist/permissions/store.js.map +1 -1
- package/dist/projects/cli.js +92 -0
- package/dist/projects/cli.js.map +1 -0
- package/dist/projects/client.js +120 -0
- package/dist/projects/client.js.map +1 -0
- package/dist/projects/types.js +2 -0
- package/dist/projects/types.js.map +1 -0
- package/dist/skills/platform-loader.js +133 -38
- package/dist/skills/platform-loader.js.map +1 -1
- package/dist/tools/read-file.js +8 -2
- package/dist/tools/read-file.js.map +1 -1
- package/dist/ui/App.js +122 -12
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/FirstRunSetup.js +90 -15
- package/dist/ui/FirstRunSetup.js.map +1 -1
- package/dist/ui/Input.js +245 -13
- package/dist/ui/Input.js.map +1 -1
- package/dist/ui/Markdown.js +286 -0
- package/dist/ui/Markdown.js.map +1 -0
- package/dist/ui/Message.js +449 -25
- package/dist/ui/Message.js.map +1 -1
- package/dist/ui/MessageList.js +7 -2
- package/dist/ui/MessageList.js.map +1 -1
- package/dist/ui/Permission.js +43 -20
- package/dist/ui/Permission.js.map +1 -1
- package/dist/ui/PixelC.js +25 -0
- package/dist/ui/PixelC.js.map +1 -0
- package/dist/ui/Status.js +213 -7
- package/dist/ui/Status.js.map +1 -1
- package/dist/ui/Throbber.js +11 -7
- package/dist/ui/Throbber.js.map +1 -1
- package/dist/ui/Welcome.js +59 -0
- package/dist/ui/Welcome.js.map +1 -0
- package/dist/ui/attachments.js +68 -0
- package/dist/ui/attachments.js.map +1 -0
- package/dist/ui/debug-input.js +44 -0
- package/dist/ui/debug-input.js.map +1 -0
- package/dist/ui/highlight.js +324 -0
- package/dist/ui/highlight.js.map +1 -0
- package/dist/ui/history-store.js +60 -0
- package/dist/ui/history-store.js.map +1 -0
- package/dist/ui/path-complete.js +102 -0
- package/dist/ui/path-complete.js.map +1 -0
- package/dist/ui/terminal-restore.js +83 -0
- package/dist/ui/terminal-restore.js.map +1 -0
- package/package.json +3 -1
package/dist/auth/flow.js
CHANGED
|
@@ -87,28 +87,151 @@ export function awaitCallback(server, expectedState, timeoutMs) {
|
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
function renderResponse(res, ok, message) {
|
|
90
|
+
const title = ok ? "Signed in" : "Sign-in failed";
|
|
91
|
+
const accent = ok ? "#22c55e" : "#ef4444";
|
|
92
|
+
const subtitle = ok ? "You can close this tab." : "Return to your terminal for details.";
|
|
93
|
+
// Inline SVG logo + minimal CSS. No external deps so the page renders
|
|
94
|
+
// before any network even on the CLI's localhost-only callback host.
|
|
90
95
|
const html = `<!doctype html>
|
|
91
|
-
<html
|
|
92
|
-
<
|
|
93
|
-
<
|
|
94
|
-
<
|
|
95
|
-
</
|
|
96
|
+
<html lang="en">
|
|
97
|
+
<head>
|
|
98
|
+
<meta charset="utf-8" />
|
|
99
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
100
|
+
<title>codebase · ${title}</title>
|
|
101
|
+
<style>
|
|
102
|
+
:root { color-scheme: light dark; }
|
|
103
|
+
* { box-sizing: border-box; }
|
|
104
|
+
html, body { margin: 0; padding: 0; }
|
|
105
|
+
body {
|
|
106
|
+
font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
|
|
107
|
+
background: #0a0a0b;
|
|
108
|
+
color: #f1f1f3;
|
|
109
|
+
min-height: 100vh;
|
|
110
|
+
display: flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
padding: 24px;
|
|
114
|
+
}
|
|
115
|
+
@media (prefers-color-scheme: light) {
|
|
116
|
+
body { background: #fafafa; color: #0a0a0b; }
|
|
117
|
+
.card { background: #fff; border-color: #e5e5ea; box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 8px 24px rgba(0,0,0,0.06); }
|
|
118
|
+
.subtitle { color: #6b6b73; }
|
|
119
|
+
.hint { color: #6b6b73; }
|
|
120
|
+
}
|
|
121
|
+
.card {
|
|
122
|
+
max-width: 440px;
|
|
123
|
+
width: 100%;
|
|
124
|
+
padding: 40px 36px 32px;
|
|
125
|
+
border: 1px solid #1f1f23;
|
|
126
|
+
border-radius: 16px;
|
|
127
|
+
background: #131316;
|
|
128
|
+
box-shadow: 0 1px 2px rgba(0,0,0,0.4), 0 12px 40px rgba(0,0,0,0.4);
|
|
129
|
+
text-align: center;
|
|
130
|
+
}
|
|
131
|
+
.logo {
|
|
132
|
+
width: 64px;
|
|
133
|
+
height: 64px;
|
|
134
|
+
margin: 0 auto 24px;
|
|
135
|
+
display: block;
|
|
136
|
+
}
|
|
137
|
+
.logo rect { fill: currentColor; }
|
|
138
|
+
.icon {
|
|
139
|
+
width: 48px;
|
|
140
|
+
height: 48px;
|
|
141
|
+
margin: 0 auto 12px;
|
|
142
|
+
border-radius: 999px;
|
|
143
|
+
background: ${accent}22;
|
|
144
|
+
color: ${accent};
|
|
145
|
+
display: flex;
|
|
146
|
+
align-items: center;
|
|
147
|
+
justify-content: center;
|
|
148
|
+
font-size: 28px;
|
|
149
|
+
font-weight: 600;
|
|
150
|
+
}
|
|
151
|
+
h1 {
|
|
152
|
+
font-size: 22px;
|
|
153
|
+
font-weight: 600;
|
|
154
|
+
margin: 0 0 4px;
|
|
155
|
+
letter-spacing: -0.01em;
|
|
156
|
+
}
|
|
157
|
+
.subtitle {
|
|
158
|
+
color: #a3a3ab;
|
|
159
|
+
font-size: 14px;
|
|
160
|
+
margin: 0 0 24px;
|
|
161
|
+
}
|
|
162
|
+
.message {
|
|
163
|
+
background: rgba(255,255,255,0.04);
|
|
164
|
+
border: 1px solid rgba(255,255,255,0.06);
|
|
165
|
+
padding: 12px 14px;
|
|
166
|
+
border-radius: 8px;
|
|
167
|
+
font-size: 13px;
|
|
168
|
+
text-align: left;
|
|
169
|
+
white-space: pre-wrap;
|
|
170
|
+
}
|
|
171
|
+
@media (prefers-color-scheme: light) {
|
|
172
|
+
.message { background: #f5f5f7; border-color: #e5e5ea; }
|
|
173
|
+
}
|
|
174
|
+
.hint {
|
|
175
|
+
margin-top: 18px;
|
|
176
|
+
font-size: 12px;
|
|
177
|
+
color: #6b6b73;
|
|
178
|
+
}
|
|
179
|
+
.brand {
|
|
180
|
+
font-size: 12px;
|
|
181
|
+
color: #6b6b73;
|
|
182
|
+
letter-spacing: 0.02em;
|
|
183
|
+
text-transform: uppercase;
|
|
184
|
+
margin-bottom: 8px;
|
|
185
|
+
}
|
|
186
|
+
</style>
|
|
187
|
+
</head>
|
|
188
|
+
<body>
|
|
189
|
+
<div class="card">
|
|
190
|
+
<svg class="logo" viewBox="7 6 6 7" shape-rendering="crispEdges" aria-hidden="true">
|
|
191
|
+
<rect width="1" height="1" x="9" y="7" /><rect width="1" height="1" x="10" y="7" /><rect width="1" height="1" x="11" y="7" />
|
|
192
|
+
<rect width="1" height="1" x="8" y="8" /><rect width="1" height="1" x="8" y="9" /><rect width="1" height="1" x="8" y="10" />
|
|
193
|
+
<rect width="1" height="1" x="9" y="11" /><rect width="1" height="1" x="10" y="11" /><rect width="1" height="1" x="11" y="11" />
|
|
194
|
+
</svg>
|
|
195
|
+
<div class="brand">codebase</div>
|
|
196
|
+
<div class="icon" aria-hidden="true">${ok ? "✓" : "!"}</div>
|
|
197
|
+
<h1>${title}</h1>
|
|
198
|
+
<p class="subtitle">${subtitle}</p>
|
|
199
|
+
<div class="message">${escapeHtml(message)}</div>
|
|
200
|
+
<p class="hint">${ok ? "Your terminal is signed in via codebase.design." : "Try <code>codebase auth login</code> again, or check your terminal for the error."}</p>
|
|
201
|
+
</div>
|
|
202
|
+
</body>
|
|
203
|
+
</html>`;
|
|
96
204
|
res.statusCode = ok ? 200 : 400;
|
|
97
205
|
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
206
|
+
res.setHeader("Cache-Control", "no-store");
|
|
98
207
|
res.end(html);
|
|
99
208
|
}
|
|
209
|
+
function escapeHtml(s) {
|
|
210
|
+
return s
|
|
211
|
+
.replace(/&/g, "&")
|
|
212
|
+
.replace(/</g, "<")
|
|
213
|
+
.replace(/>/g, ">")
|
|
214
|
+
.replace(/"/g, """)
|
|
215
|
+
.replace(/'/g, "'");
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Token endpoints on codebase.design's web app expect JSON bodies —
|
|
219
|
+
* `app.js` only mounts `express.json()`, no `express.urlencoded()`.
|
|
220
|
+
* OAuth 2.0 RFC 6749 §4.1.3 says token endpoints MUST accept
|
|
221
|
+
* form-urlencoded; the web app is non-standard there but it's easier
|
|
222
|
+
* to send JSON from the CLI than to upstream a middleware change.
|
|
223
|
+
*/
|
|
100
224
|
export async function exchangeCode(config, params) {
|
|
101
|
-
const body = new URLSearchParams({
|
|
102
|
-
grant_type: "authorization_code",
|
|
103
|
-
client_id: config.clientId,
|
|
104
|
-
code: params.code,
|
|
105
|
-
code_verifier: params.codeVerifier,
|
|
106
|
-
redirect_uri: params.redirectUri,
|
|
107
|
-
});
|
|
108
225
|
const res = await fetch(config.tokenUrl, {
|
|
109
226
|
method: "POST",
|
|
110
|
-
headers: { "Content-Type": "application/
|
|
111
|
-
body
|
|
227
|
+
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
228
|
+
body: JSON.stringify({
|
|
229
|
+
grant_type: "authorization_code",
|
|
230
|
+
client_id: config.clientId,
|
|
231
|
+
code: params.code,
|
|
232
|
+
code_verifier: params.codeVerifier,
|
|
233
|
+
redirect_uri: params.redirectUri,
|
|
234
|
+
}),
|
|
112
235
|
});
|
|
113
236
|
if (!res.ok) {
|
|
114
237
|
const text = await res.text();
|
|
@@ -118,15 +241,14 @@ export async function exchangeCode(config, params) {
|
|
|
118
241
|
return tokenToCredentials(json, config);
|
|
119
242
|
}
|
|
120
243
|
export async function refreshAccessToken(config, refreshToken) {
|
|
121
|
-
const body = new URLSearchParams({
|
|
122
|
-
grant_type: "refresh_token",
|
|
123
|
-
client_id: config.clientId,
|
|
124
|
-
refresh_token: refreshToken,
|
|
125
|
-
});
|
|
126
244
|
const res = await fetch(config.refreshUrl, {
|
|
127
245
|
method: "POST",
|
|
128
|
-
headers: { "Content-Type": "application/
|
|
129
|
-
body
|
|
246
|
+
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
247
|
+
body: JSON.stringify({
|
|
248
|
+
grant_type: "refresh_token",
|
|
249
|
+
client_id: config.clientId,
|
|
250
|
+
refresh_token: refreshToken,
|
|
251
|
+
}),
|
|
130
252
|
});
|
|
131
253
|
if (!res.ok) {
|
|
132
254
|
const text = await res.text();
|
|
@@ -138,12 +260,11 @@ export async function refreshAccessToken(config, refreshToken) {
|
|
|
138
260
|
export async function revokeToken(config, accessToken) {
|
|
139
261
|
if (!config.revokeUrl)
|
|
140
262
|
return;
|
|
141
|
-
const body = new URLSearchParams({ token: accessToken, client_id: config.clientId });
|
|
142
263
|
try {
|
|
143
264
|
await fetch(config.revokeUrl, {
|
|
144
265
|
method: "POST",
|
|
145
|
-
headers: { "Content-Type": "application/
|
|
146
|
-
body,
|
|
266
|
+
headers: { "Content-Type": "application/json" },
|
|
267
|
+
body: JSON.stringify({ token: accessToken, client_id: config.clientId }),
|
|
147
268
|
});
|
|
148
269
|
}
|
|
149
270
|
catch {
|
|
@@ -165,17 +286,10 @@ function tokenToCredentials(token, config) {
|
|
|
165
286
|
source: "codebase",
|
|
166
287
|
};
|
|
167
288
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
* 3. Open the authorization URL in the user's browser
|
|
173
|
-
* 4. Wait for /callback, validate state
|
|
174
|
-
* 5. Exchange the code for tokens
|
|
175
|
-
*
|
|
176
|
-
* Returns ready-to-save Credentials.
|
|
177
|
-
*/
|
|
178
|
-
export async function runOAuthLogin(config, openBrowserFn = openBrowser) {
|
|
289
|
+
export async function runOAuthLogin(config, options = {}) {
|
|
290
|
+
// Backwards-compat: callers used to pass a bare openBrowserFn.
|
|
291
|
+
const opts = typeof options === "function" ? { openBrowserFn: options } : options;
|
|
292
|
+
const openBrowserFn = opts.openBrowserFn ?? openBrowser;
|
|
179
293
|
const verifier = generateCodeVerifier();
|
|
180
294
|
const challenge = generateCodeChallenge(verifier);
|
|
181
295
|
const state = generateState();
|
|
@@ -188,17 +302,36 @@ export async function runOAuthLogin(config, openBrowserFn = openBrowser) {
|
|
|
188
302
|
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
189
303
|
const authUrl = buildAuthorizationUrl(config, { codeChallenge: challenge, state, redirectUri });
|
|
190
304
|
const callbackPromise = awaitCallback(server, state, config.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
191
|
-
|
|
192
|
-
|
|
305
|
+
if (isHeadlessSession()) {
|
|
306
|
+
opts.onManualUrl?.(authUrl, "headless session detected — open the URL manually in your browser");
|
|
193
307
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
308
|
+
else {
|
|
309
|
+
try {
|
|
310
|
+
await openBrowserFn(authUrl);
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
// DON'T tear down the server: the user can still complete
|
|
314
|
+
// sign-in by opening the URL themselves. Surface the URL via
|
|
315
|
+
// onManualUrl and continue waiting for the callback.
|
|
316
|
+
opts.onManualUrl?.(authUrl, `auto-open failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
317
|
+
}
|
|
198
318
|
}
|
|
199
319
|
const { code } = await callbackPromise;
|
|
200
320
|
return exchangeCode(config, { code, codeVerifier: verifier, redirectUri });
|
|
201
321
|
}
|
|
322
|
+
/**
|
|
323
|
+
* Heuristic: is this process running somewhere that obviously can't
|
|
324
|
+
* launch a GUI browser? We bail out of the auto-open attempt instead
|
|
325
|
+
* of letting xdg-open ENOENT or `open` hang on a headless macOS box.
|
|
326
|
+
*/
|
|
327
|
+
function isHeadlessSession() {
|
|
328
|
+
const env = process.env;
|
|
329
|
+
if (env.SSH_CONNECTION || env.SSH_TTY || env.SSH_CLIENT)
|
|
330
|
+
return true;
|
|
331
|
+
if (process.platform === "linux" && !env.DISPLAY && !env.WAYLAND_DISPLAY)
|
|
332
|
+
return true;
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
202
335
|
/** Best-effort browser open. Falls back to printing the URL on platforms we can't detect. */
|
|
203
336
|
export async function openBrowser(url) {
|
|
204
337
|
const command = browserOpenCommand(url);
|
package/dist/auth/flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/auth/flow.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/auth/flow.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -2,13 +2,29 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { render } from "ink";
|
|
5
|
+
import { runAppServer } from "./app-server/server.js";
|
|
5
6
|
import { runAuthSubcommand } from "./auth/cli.js";
|
|
6
7
|
import { loadDotEnv } from "./dotenv/loader.js";
|
|
7
8
|
import { runHeadless } from "./headless/run.js";
|
|
9
|
+
import { runProjectSubcommand } from "./projects/cli.js";
|
|
8
10
|
import { App } from "./ui/App.js";
|
|
11
|
+
import { installTerminalRestoreHandlers } from "./ui/terminal-restore.js";
|
|
9
12
|
// Auto-load .env files before any subsystem reads process.env.
|
|
10
13
|
loadDotEnv();
|
|
11
|
-
const
|
|
14
|
+
const VALID_OUTPUT_FORMATS = new Set(["text", "json", "stream-json"]);
|
|
15
|
+
const rawArgv = process.argv.slice(2);
|
|
16
|
+
// Strip flags consumed at the top-level dispatcher before subcommand
|
|
17
|
+
// matching. `--debug-input` is one of those: it sets an env var that
|
|
18
|
+
// the Input component picks up, then disappears from argv so it can't
|
|
19
|
+
// confuse downstream parsers.
|
|
20
|
+
const argv = [];
|
|
21
|
+
for (const a of rawArgv) {
|
|
22
|
+
if (a === "--debug-input") {
|
|
23
|
+
process.env.CODEBASE_DEBUG_INPUT = "1";
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
argv.push(a);
|
|
27
|
+
}
|
|
12
28
|
if (argv[0] === "--version" || argv[0] === "-v") {
|
|
13
29
|
process.stdout.write(`${readPackageVersion()}\n`);
|
|
14
30
|
process.exit(0);
|
|
@@ -20,28 +36,42 @@ else if (argv[0] === "--help" || argv[0] === "-h") {
|
|
|
20
36
|
else if (argv[0] === "auth") {
|
|
21
37
|
runAuthSubcommand(argv).then((code) => process.exit(code));
|
|
22
38
|
}
|
|
39
|
+
else if (argv[0] === "project" || argv[0] === "projects") {
|
|
40
|
+
runProjectSubcommand(argv).then((code) => process.exit(code));
|
|
41
|
+
}
|
|
42
|
+
else if (argv[0] === "app-server") {
|
|
43
|
+
// JSON-RPC-ish over stdio for IDE extensions. Auto-approve permissions
|
|
44
|
+
// by default — IDE clients render approval UIs themselves and we don't
|
|
45
|
+
// want the server to hang waiting on a TUI prompt no one's watching.
|
|
46
|
+
// The `--no-auto-approve` flag is for clients that DO implement their
|
|
47
|
+
// own approval flow via the `permission_request` event.
|
|
48
|
+
const noAutoApprove = argv.includes("--no-auto-approve");
|
|
49
|
+
const resume = argv.includes("--resume");
|
|
50
|
+
runAppServer({ autoApprove: !noAutoApprove, resume }).then((code) => process.exit(code));
|
|
51
|
+
}
|
|
23
52
|
else if (argv[0] === "run") {
|
|
24
|
-
const { prompt, outputFormat, error } = parseRunArgs(argv.slice(1));
|
|
53
|
+
const { prompt, outputFormat, autoApprove, error } = parseRunArgs(argv.slice(1));
|
|
25
54
|
if (error) {
|
|
26
55
|
process.stderr.write(`${error}\n`);
|
|
27
56
|
process.exit(2);
|
|
28
57
|
}
|
|
29
58
|
if (!prompt) {
|
|
30
|
-
process.stderr.write("usage: codebase run [--output text|json|stream-json] <prompt>\n");
|
|
59
|
+
process.stderr.write("usage: codebase run [--output text|json|stream-json] [--auto-approve] <prompt>\n");
|
|
31
60
|
process.exit(2);
|
|
32
61
|
}
|
|
33
|
-
runHeadless({ prompt, outputFormat }).then((code) => process.exit(code));
|
|
62
|
+
runHeadless({ prompt, outputFormat, autoApprove }).then((code) => process.exit(code));
|
|
34
63
|
}
|
|
35
64
|
else {
|
|
36
65
|
const instance = render(_jsx(App, {}));
|
|
66
|
+
installTerminalRestoreHandlers(instance);
|
|
37
67
|
instance.waitUntilExit().catch(() => {
|
|
38
68
|
process.exit(1);
|
|
39
69
|
});
|
|
40
70
|
}
|
|
41
|
-
const VALID_OUTPUT_FORMATS = new Set(["text", "json", "stream-json"]);
|
|
42
71
|
function parseRunArgs(args) {
|
|
43
72
|
const remaining = [];
|
|
44
73
|
let outputFormat;
|
|
74
|
+
let autoApprove = false;
|
|
45
75
|
for (let i = 0; i < args.length; i++) {
|
|
46
76
|
const a = args[i];
|
|
47
77
|
if (a === "--output" || a === "-o") {
|
|
@@ -61,10 +91,14 @@ function parseRunArgs(args) {
|
|
|
61
91
|
outputFormat = value;
|
|
62
92
|
continue;
|
|
63
93
|
}
|
|
94
|
+
if (a === "--auto-approve" || a === "--yes" || a === "-y") {
|
|
95
|
+
autoApprove = true;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
64
98
|
remaining.push(a);
|
|
65
99
|
}
|
|
66
100
|
const prompt = remaining.join(" ").trim();
|
|
67
|
-
return { prompt: prompt || undefined, outputFormat };
|
|
101
|
+
return { prompt: prompt || undefined, outputFormat, autoApprove };
|
|
68
102
|
}
|
|
69
103
|
function readPackageVersion() {
|
|
70
104
|
// dist/cli.js → ../package.json. Works for tsc-emitted output; if
|
|
@@ -93,9 +127,16 @@ function printHelp() {
|
|
|
93
127
|
" codebase auth status show current sign-in",
|
|
94
128
|
" codebase auth refresh force-refresh the access token",
|
|
95
129
|
" codebase auth <cbk_xxx> save a manual API key (for SSH / headless)",
|
|
130
|
+
" codebase project list list your projects on codebase.design",
|
|
131
|
+
" codebase project pull <id> download a project as a ZIP",
|
|
132
|
+
" codebase app-server JSON-RPC server on stdio (for IDE extensions)",
|
|
96
133
|
" codebase --version print version and exit",
|
|
97
134
|
" codebase --help show this message",
|
|
98
135
|
"",
|
|
136
|
+
"Diagnostics:",
|
|
137
|
+
" --debug-input log every keystroke to ~/.codebase/logs/input.log",
|
|
138
|
+
" (use when reporting a keyboard/terminal issue)",
|
|
139
|
+
"",
|
|
99
140
|
"More: https://github.com/codebase-foundation/codebase-cli",
|
|
100
141
|
"",
|
|
101
142
|
].join("\n"));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAA6B,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAA6B,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,+DAA+D;AAC/D,UAAU,EAAE,CAAC;AAab,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAE5F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEtC,qEAAqE;AACrE,qEAAqE;AACrE,sEAAsE;AACtE,8BAA8B;AAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;AAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,eAAe,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC;QACvC,SAAS;IACV,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAC;AAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IACrD,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;IAC/B,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;IAC5D,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;IACrC,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,sEAAsE;IACtE,wDAAwD;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1F,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC;KAAM,CAAC;IACP,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;IACjC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IACnC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,YAA8C,CAAC;IACnD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAA6B,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,KAAK,EAAE,4BAA4B,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACtF,CAAC;YACD,YAAY,GAAG,KAA6B,CAAC;YAC7C,CAAC,EAAE,CAAC;YACJ,SAAS;QACV,CAAC;QACD,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAA6B,CAAC,EAAE,CAAC;gBAC9D,OAAO,EAAE,KAAK,EAAE,4BAA4B,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACtF,CAAC;YACD,YAAY,GAAG,KAA6B,CAAC;YAC7C,SAAS;QACV,CAAC;QACD,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3D,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACV,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,kBAAkB;IAC1B,kEAAkE;IAClE,qEAAqE;IACrE,oBAAoB;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAyB,CAAC;QAC1E,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,SAAS;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,6CAA6C;QAC7C,EAAE;QACF,QAAQ;QACR,iFAAiF;QACjF,wEAAwE;QACxE,mDAAmD;QACnD,oEAAoE;QACpE,sEAAsE;QACtE,2DAA2D;QAC3D,qDAAqD;QACrD,+DAA+D;QAC/D,2EAA2E;QAC3E,sEAAsE;QACtE,4DAA4D;QAC5D,8EAA8E;QAC9E,uDAAuD;QACvD,kDAAkD;QAClD,EAAE;QACF,cAAc;QACd,kFAAkF;QAClF,+EAA+E;QAC/E,EAAE;QACF,2DAA2D;QAC3D,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;AACH,CAAC"}
|
|
@@ -4,15 +4,22 @@ import { homedir } from "node:os";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { CredentialsStore } from "../auth/credentials.js";
|
|
6
6
|
import { copyToClipboard, extractLastCodeBlock } from "../clipboard/copy.js";
|
|
7
|
+
import { NotAuthenticatedError, ProjectClient, ProjectClientError } from "../projects/client.js";
|
|
7
8
|
const help = {
|
|
8
9
|
name: "help",
|
|
9
|
-
description: "List available slash commands.",
|
|
10
|
+
description: "List available slash commands and keyboard shortcuts.",
|
|
10
11
|
handler: (_args, ctx) => {
|
|
11
|
-
const lines = [
|
|
12
|
+
const lines = [];
|
|
13
|
+
lines.push("Keyboard shortcuts:");
|
|
14
|
+
lines.push(" / slash-command autocomplete (Tab to complete, ↑↓ to choose)");
|
|
15
|
+
lines.push(" !cmd run a shell command directly (e.g. !git status)");
|
|
16
|
+
lines.push(" @path inline a file's contents into the next prompt");
|
|
17
|
+
lines.push(" ↑/↓ recall prior prompts (at line start)");
|
|
18
|
+
lines.push(" \\<Enter> insert a newline instead of submitting");
|
|
19
|
+
lines.push(" Ctrl-C cancel turn (busy) · twice to exit (idle)");
|
|
20
|
+
lines.push("");
|
|
21
|
+
lines.push("Slash commands:");
|
|
12
22
|
const reg = ctx.registry;
|
|
13
|
-
// builtins() is built before registry is constructed, so the registry
|
|
14
|
-
// reference is injected via ctx by the App. If absent (e.g. in tests),
|
|
15
|
-
// we print just this message.
|
|
16
23
|
if (reg) {
|
|
17
24
|
for (const cmd of reg.list()) {
|
|
18
25
|
const aliasPart = cmd.aliases?.length ? ` (${cmd.aliases.map((a) => `/${a}`).join(", ")})` : "";
|
|
@@ -395,6 +402,48 @@ const init = {
|
|
|
395
402
|
return { handled: true };
|
|
396
403
|
},
|
|
397
404
|
};
|
|
405
|
+
const projects = {
|
|
406
|
+
name: "projects",
|
|
407
|
+
aliases: ["project"],
|
|
408
|
+
description: "List your projects from codebase.design (requires sign-in via `codebase auth login`).",
|
|
409
|
+
handler: async (_args, ctx) => {
|
|
410
|
+
const client = new ProjectClient();
|
|
411
|
+
if (!client.hasCredentials()) {
|
|
412
|
+
ctx.emit("not signed in. Run `codebase auth login` from a fresh terminal, then come back. " +
|
|
413
|
+
"Env-var providers (ANTHROPIC_API_KEY etc.) work fine for inference but the projects " +
|
|
414
|
+
"endpoint is gated on a codebase.design account.");
|
|
415
|
+
return { handled: true };
|
|
416
|
+
}
|
|
417
|
+
try {
|
|
418
|
+
const list = await client.list();
|
|
419
|
+
if (list.length === 0) {
|
|
420
|
+
ctx.emit("(no projects yet — build one at https://codebase.design)");
|
|
421
|
+
return { handled: true };
|
|
422
|
+
}
|
|
423
|
+
const lines = [`${list.length} project${list.length === 1 ? "" : "s"} on your account:`, ""];
|
|
424
|
+
for (const p of list) {
|
|
425
|
+
const tag = p.source === "storage-only" ? " [storage]" : "";
|
|
426
|
+
const date = p.publishedAt ? ` · ${p.publishedAt.slice(0, 10)}` : "";
|
|
427
|
+
lines.push(` ${p.id} ${p.title ?? "(untitled)"}${tag}${date}`);
|
|
428
|
+
}
|
|
429
|
+
lines.push("");
|
|
430
|
+
lines.push("pull one with: codebase project pull <id>");
|
|
431
|
+
ctx.emit(lines.join("\n"));
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
if (err instanceof NotAuthenticatedError) {
|
|
435
|
+
ctx.emit(err.message);
|
|
436
|
+
}
|
|
437
|
+
else if (err instanceof ProjectClientError) {
|
|
438
|
+
ctx.emit(`/projects failed: ${err.message}`);
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
ctx.emit(`/projects failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return { handled: true };
|
|
445
|
+
},
|
|
446
|
+
};
|
|
398
447
|
const mcp = {
|
|
399
448
|
name: "mcp",
|
|
400
449
|
description: "Manage MCP (Model Context Protocol) servers — placeholder until Phase 9 lands.",
|
|
@@ -406,6 +455,37 @@ const mcp = {
|
|
|
406
455
|
return { handled: true };
|
|
407
456
|
},
|
|
408
457
|
};
|
|
458
|
+
const redo = {
|
|
459
|
+
name: "redo",
|
|
460
|
+
aliases: ["retry"],
|
|
461
|
+
description: "Resend the last user prompt to the agent (e.g. after an error or aborted turn).",
|
|
462
|
+
handler: (_args, ctx) => {
|
|
463
|
+
const lastUser = [...ctx.state.messages].reverse().find((m) => m.role === "user");
|
|
464
|
+
if (!lastUser) {
|
|
465
|
+
ctx.emit("nothing to redo — no prior user prompts.");
|
|
466
|
+
return { handled: true };
|
|
467
|
+
}
|
|
468
|
+
const text = typeof lastUser.content === "string" ? lastUser.content : "";
|
|
469
|
+
if (!text) {
|
|
470
|
+
ctx.emit("can't redo — the last user message had non-text content.");
|
|
471
|
+
return { handled: true };
|
|
472
|
+
}
|
|
473
|
+
ctx.emit(`(redo) ${text.slice(0, 80)}${text.length > 80 ? "…" : ""}`);
|
|
474
|
+
void ctx.bundle.agent.prompt(text).catch(() => undefined);
|
|
475
|
+
return { handled: true };
|
|
476
|
+
},
|
|
477
|
+
};
|
|
478
|
+
const pwd = {
|
|
479
|
+
name: "pwd",
|
|
480
|
+
aliases: ["cwd"],
|
|
481
|
+
description: "Print the current working directory and copy it to the clipboard.",
|
|
482
|
+
handler: async (_args, ctx) => {
|
|
483
|
+
const cwd = ctx.bundle.toolContext.cwd;
|
|
484
|
+
const copied = await copyToClipboard(cwd).catch(() => false);
|
|
485
|
+
ctx.emit(copied ? `${cwd}\n(copied to clipboard)` : cwd);
|
|
486
|
+
return { handled: true };
|
|
487
|
+
},
|
|
488
|
+
};
|
|
409
489
|
export const BUILTIN_COMMANDS = [
|
|
410
490
|
help,
|
|
411
491
|
clear,
|
|
@@ -424,7 +504,10 @@ export const BUILTIN_COMMANDS = [
|
|
|
424
504
|
logout,
|
|
425
505
|
resume,
|
|
426
506
|
init,
|
|
507
|
+
projects,
|
|
427
508
|
mcp,
|
|
509
|
+
pwd,
|
|
510
|
+
redo,
|
|
428
511
|
exit,
|
|
429
512
|
];
|
|
430
513
|
//# sourceMappingURL=builtins.js.map
|