boxdown 1.0.0 → 1.2.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 (76) hide show
  1. package/README.md +135 -12
  2. package/assets/devcontainer/README.md +65 -21
  3. package/assets/devcontainer/devcontainer.json +27 -15
  4. package/assets/devcontainer/hooks/initialize.sh +76 -22
  5. package/assets/devcontainer/hooks/post-create.sh +70 -12
  6. package/assets/devcontainer/hooks/post-start.sh +20 -13
  7. package/assets/devcontainer/ssh-config-install.sh +12 -3
  8. package/assets/devcontainer/start.sh +721 -44
  9. package/assets/devcontainer/utils/coding-agent-cli-update.sh +267 -3
  10. package/assets/devcontainer/utils/deps-install.sh +68 -0
  11. package/assets/devcontainer/utils/git-config-bootstrap.sh +128 -0
  12. package/assets/devcontainer/utils/git-signing-bootstrap.sh +109 -0
  13. package/assets/devcontainer/utils/python-bootstrap.sh +69 -0
  14. package/assets/devcontainer/utils/secret-env-bootstrap.sh +22 -0
  15. package/assets/devcontainer/utils/ssh-agent-proxy-bootstrap.sh +27 -0
  16. package/assets/devcontainer/utils/ssh-agent-proxy.mjs +39 -0
  17. package/assets/devcontainer/utils/ssh-bootstrap.sh +9 -0
  18. package/dist/bin/cli.cjs +1 -1
  19. package/dist/bin/cli.mjs +1 -1
  20. package/dist/main-BDgyf2t5.cjs +5758 -0
  21. package/dist/main-J4_2Up3o.mjs +5718 -0
  22. package/dist/main-J4_2Up3o.mjs.map +1 -0
  23. package/dist/main.cjs +5 -2
  24. package/dist/main.d.cts +501 -4
  25. package/dist/main.d.cts.map +1 -1
  26. package/dist/main.d.mts +501 -4
  27. package/dist/main.d.mts.map +1 -1
  28. package/dist/main.mjs +2 -2
  29. package/docs/README.md +1 -0
  30. package/docs/architecture.md +32 -0
  31. package/docs/development.md +13 -6
  32. package/docs/features/README.md +2 -0
  33. package/docs/features/commit-signing.md +94 -0
  34. package/docs/features/generated-config-and-state.md +73 -5
  35. package/docs/features/github-auth-refresh.md +15 -2
  36. package/docs/features/lifecycle.md +103 -11
  37. package/docs/features/setup.md +66 -0
  38. package/docs/features/ssh-config-and-proxy.md +228 -7
  39. package/docs/features/start-and-shell.md +45 -5
  40. package/docs/superpowers/plans/2026-07-11-default-commit-signing.md +110 -0
  41. package/docs/superpowers/plans/2026-07-11-progress-ci-regression.md +125 -0
  42. package/docs/superpowers/plans/2026-07-17-node-ssh-agent-proxy-signing.md +132 -0
  43. package/docs/superpowers/plans/2026-07-17-runtime-secret-environment.md +174 -0
  44. package/docs/superpowers/specs/2026-07-11-default-commit-signing-design.md +416 -0
  45. package/docs/superpowers/specs/2026-07-11-progress-ci-regression-design.md +43 -0
  46. package/docs/superpowers/specs/2026-07-17-node-ssh-agent-proxy-design.md +63 -0
  47. package/docs/superpowers/specs/2026-07-17-runtime-secret-environment-design.md +194 -0
  48. package/docs/testing.md +35 -2
  49. package/docs/todo.md +2 -2
  50. package/package.json +1 -1
  51. package/src/claude-app-config.ts +304 -0
  52. package/src/cli-style.ts +43 -0
  53. package/src/codex-app-config.ts +656 -0
  54. package/src/config.ts +80 -10
  55. package/src/constants.ts +12 -0
  56. package/src/devcontainer.ts +511 -64
  57. package/src/doctor.ts +292 -30
  58. package/src/git-signing.ts +267 -0
  59. package/src/interactive-prompts.ts +692 -0
  60. package/src/list.ts +16 -2
  61. package/src/logging.ts +164 -0
  62. package/src/main.ts +1214 -63
  63. package/src/metadata.ts +52 -3
  64. package/src/package-info.ts +18 -0
  65. package/src/paths.ts +71 -11
  66. package/src/process.ts +80 -2
  67. package/src/progress.ts +593 -0
  68. package/src/purge.ts +216 -0
  69. package/src/shell.ts +25 -0
  70. package/src/ssh-config.ts +134 -16
  71. package/src/ssh-install-targets.ts +111 -0
  72. package/src/ssh-key.ts +53 -13
  73. package/src/status.ts +5 -0
  74. package/dist/main-BuEptwlL.cjs +0 -1707
  75. package/dist/main-ZFTrSVgt.mjs +0 -1685
  76. package/dist/main-ZFTrSVgt.mjs.map +0 -1
package/dist/main.cjs CHANGED
@@ -1,7 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_main = require('./main-BuEptwlL.cjs');
2
+ const require_main = require('./main-BDgyf2t5.cjs');
3
3
 
4
4
  exports.USAGE = require_main.USAGE;
5
5
  exports.commandWritesWorkspaceMetadata = require_main.commandWritesWorkspaceMetadata;
6
6
  exports.parseCliArgs = require_main.parseCliArgs;
7
- exports.runCli = require_main.runCli;
7
+ exports.parseTunnelPort = require_main.parseTunnelPort;
8
+ exports.parseTunnelPortList = require_main.parseTunnelPortList;
9
+ exports.runCli = require_main.runCli;
10
+ exports.setupWorkspace = require_main.setupWorkspace;
package/dist/main.d.cts CHANGED
@@ -4,21 +4,518 @@ type CodingAgentCommandAlias = CodingAgentCli | 'cc';
4
4
  declare function codingAgentFromCommand(command: string): CodingAgentCli | undefined;
5
5
  declare function codingAgentBinary(agent: CodingAgentCli): string;
6
6
  //#endregion
7
+ //#region src/paths.d.ts
8
+ interface WorkspaceContextOptions {
9
+ workspace?: string;
10
+ cwd?: string;
11
+ env?: NodeJS.ProcessEnv;
12
+ packageRoot?: string;
13
+ assetsDevcontainerDir?: string;
14
+ }
15
+ interface WorkspaceContext {
16
+ workspaceFolder: string;
17
+ workspaceBasename: string;
18
+ workspaceId: string;
19
+ packageRoot: string;
20
+ assetsDevcontainerDir: string;
21
+ cacheRoot: string;
22
+ dataRoot: string;
23
+ runtimeRoot: string;
24
+ workspaceCacheDir: string;
25
+ workspaceDataDir: string;
26
+ workspaceRuntimeDir: string;
27
+ workspaceSecretEnvDir: string;
28
+ generatedConfigPath: string;
29
+ hostAgentsDir: string;
30
+ hostCodexAuthPath: string;
31
+ hostGitconfigPath: string;
32
+ hostGitconfigSnapshotDir: string;
33
+ hostGitconfigSnapshotPath: string;
34
+ gitSigningStateDir: string;
35
+ gitSigningPublicKeyPath: string;
36
+ sshKeyDir: string;
37
+ sshKeyPath: string;
38
+ sshPublicKeyPath: string;
39
+ sshPublicKeyRuntimeDir: string;
40
+ sshPublicKeyRuntimePath: string;
41
+ workspaceLogPath: string;
42
+ }
43
+ interface WorkspaceContextIdentity {
44
+ workspaceFolder: string;
45
+ workspaceBasename: string;
46
+ workspaceId: string;
47
+ }
48
+ declare function packageRootFromImportMeta(importMetaUrl?: string): string;
49
+ declare function workspaceIdFor(workspaceFolder: string): string;
50
+ declare function resolveWorkspaceFolder(workspace: string | undefined, cwd?: string): string;
51
+ declare function defaultCacheRoot(env?: NodeJS.ProcessEnv): string;
52
+ declare function defaultDataRoot(env?: NodeJS.ProcessEnv): string;
53
+ declare function defaultRuntimeRoot(env?: NodeJS.ProcessEnv): string;
54
+ declare function defaultHostAgentsDir(env?: NodeJS.ProcessEnv): string;
55
+ declare function defaultHostCodexAuthPath(env?: NodeJS.ProcessEnv): string;
56
+ declare function defaultHostGitconfigPath(env?: NodeJS.ProcessEnv): string;
57
+ declare function createWorkspaceContextFromIdentity(identity: WorkspaceContextIdentity, options?: Omit<WorkspaceContextOptions, 'workspace' | 'cwd'>): WorkspaceContext;
58
+ declare function createWorkspaceContext(options?: WorkspaceContextOptions): WorkspaceContext;
59
+ //#endregion
60
+ //#region src/doctor.d.ts
61
+ type DoctorLevel = 'ok' | 'fail' | 'warn';
62
+ interface DoctorCheck {
63
+ name: string;
64
+ level: DoctorLevel;
65
+ message: string;
66
+ }
67
+ interface DoctorCommandResult {
68
+ code: number;
69
+ stdout: string;
70
+ stderr: string;
71
+ }
72
+ type DoctorCommandRunner = (command: string, args: string[]) => Promise<DoctorCommandResult>;
73
+ interface RunDoctorChecksOptions {
74
+ includeOptional?: boolean;
75
+ includeDockerMountProbe?: boolean;
76
+ runCommand?: DoctorCommandRunner;
77
+ }
78
+ declare function runDoctorChecks(context: WorkspaceContext, options?: RunDoctorChecksOptions): Promise<DoctorCheck[]>;
79
+ declare function doctorHasFailures(checks: DoctorCheck[]): boolean;
80
+ declare function formatDoctorText(checks: DoctorCheck[]): string;
81
+ //#endregion
82
+ //#region src/logging.d.ts
83
+ type LogStreamName = 'stdout' | 'stderr' | 'boxdown';
84
+ interface WorkspaceCommandLoggerOptions {
85
+ redactions?: string[];
86
+ now?: () => Date;
87
+ }
88
+ interface LoggedCommand {
89
+ stream: (stream: Extract<LogStreamName, 'stdout' | 'stderr'>, chunk: Buffer | string) => void;
90
+ error: (error: unknown) => void;
91
+ finish: (code: number) => void;
92
+ }
93
+ declare function redactKnownSecretEnvironmentAssignments(value: string): string;
94
+ declare class WorkspaceCommandLogger {
95
+ #private;
96
+ readonly logPath: string;
97
+ readonly workspaceFolder: string;
98
+ constructor(context: Pick<WorkspaceContext, 'workspaceFolder' | 'workspaceLogPath'>, options?: WorkspaceCommandLoggerOptions);
99
+ addRedaction(value: string): void;
100
+ disable(): void;
101
+ section(title: string, details?: Record<string, string | number | boolean | undefined>): void;
102
+ boxdown(chunk: Buffer | string): void;
103
+ startCommand(command: string, args: string[], options?: {
104
+ cwd?: string;
105
+ }): LoggedCommand;
106
+ }
107
+ declare function createWorkspaceCommandLogger(context: Pick<WorkspaceContext, 'workspaceFolder' | 'workspaceLogPath'>, options?: WorkspaceCommandLoggerOptions): WorkspaceCommandLogger;
108
+ declare function withLoggedProcessOutput<T>(logger: WorkspaceCommandLogger, action: () => Promise<T>): Promise<T>;
109
+ //#endregion
110
+ //#region src/process.d.ts
111
+ interface BufferedCommandOptions {
112
+ cwd?: string;
113
+ env?: NodeJS.ProcessEnv;
114
+ input?: string;
115
+ mirrorStdout?: 'stdout' | 'stderr' | false;
116
+ mirrorStderr?: 'stdout' | 'stderr' | false;
117
+ logger?: WorkspaceCommandLogger;
118
+ onStdout?: (chunk: Buffer) => void;
119
+ onStderr?: (chunk: Buffer) => void;
120
+ }
121
+ interface CommandResult {
122
+ code: number;
123
+ stdout: string;
124
+ stderr: string;
125
+ }
126
+ declare function buildHostToolPath(env?: NodeJS.ProcessEnv): string;
127
+ declare function runBuffered(command: string, args: string[], options?: BufferedCommandOptions): Promise<CommandResult>;
128
+ declare function runInteractive(command: string, args: string[], options?: Pick<BufferedCommandOptions, 'cwd' | 'env' | 'logger'>): Promise<number>;
129
+ //#endregion
130
+ //#region src/progress.d.ts
131
+ type ProgressOutputTarget = 'stdout' | 'stderr';
132
+ type ProgressMode = 'interactive' | 'verbose' | 'none';
133
+ type ProgressWriter = (target: ProgressOutputTarget, message: string) => void;
134
+ type ProgressRawWriter = (target: ProgressOutputTarget, message: string) => void;
135
+ interface ProgressReporterOptions {
136
+ mode?: ProgressMode;
137
+ verbose?: boolean;
138
+ target?: ProgressOutputTarget;
139
+ write?: ProgressWriter;
140
+ writeRaw?: ProgressRawWriter;
141
+ isTTY?: boolean;
142
+ spinnerFrames?: readonly string[];
143
+ spinnerIntervalMs?: number;
144
+ }
145
+ interface ProgressCommandOptions extends Pick<BufferedCommandOptions, 'cwd' | 'env' | 'input'> {
146
+ logger?: BufferedCommandOptions['logger'];
147
+ progress?: ProgressReporter;
148
+ verboseStdout?: ProgressOutputTarget | false;
149
+ verboseStderr?: ProgressOutputTarget | false;
150
+ spinnerLabel?: string;
151
+ stepId?: string;
152
+ }
153
+ interface ResolveProgressModeOptions {
154
+ verbose?: boolean;
155
+ json?: boolean;
156
+ target?: ProgressOutputTarget;
157
+ env?: NodeJS.ProcessEnv;
158
+ isTTY?: boolean;
159
+ }
160
+ type ProgressStepState = 'pending' | 'running' | 'complete' | 'failed' | 'skipped';
161
+ interface ProgressStepDefinition {
162
+ id: string;
163
+ label: string;
164
+ }
165
+ declare function resolveProgressMode(options?: ResolveProgressModeOptions): ProgressMode;
166
+ declare class ProgressReporter {
167
+ #private;
168
+ readonly mode: ProgressMode;
169
+ readonly verbose: boolean;
170
+ readonly target: ProgressOutputTarget;
171
+ constructor(options?: ProgressReporterOptions);
172
+ section(title: string): void;
173
+ end(): void;
174
+ item(message: string): void;
175
+ detail(message: string): void;
176
+ warn(message: string): void;
177
+ marker(message: string): void;
178
+ setSteps(steps: readonly ProgressStepDefinition[]): void;
179
+ isChecklistActive(): boolean;
180
+ startStep(id: string): void;
181
+ completeStep(id: string): void;
182
+ failStep(id: string): void;
183
+ skipStep(id: string): void;
184
+ hasStep(id: string): boolean;
185
+ startSpinner(message: string): void;
186
+ tickSpinner(): void;
187
+ stopSpinner(status?: 'complete' | 'clear'): void;
188
+ commandEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
189
+ }
190
+ declare function createProgress(options?: ProgressReporterOptions): ProgressReporter;
191
+ declare function progressMarkerLine(message: string): string;
192
+ declare function formatCommandFailure(label: string, result: CommandResult, options?: {
193
+ tailLines?: number;
194
+ }): string;
195
+ declare function runProgressCommand(label: string, command: string, args: string[], options?: ProgressCommandOptions): Promise<CommandResult>;
196
+ declare function assertProgressCommandSucceeded(label: string, result: CommandResult, message: string): void;
197
+ //#endregion
198
+ //#region src/status.d.ts
199
+ type SshAliasSource = 'default' | 'provided';
200
+ type SshManagedBlockState = 'missing' | 'installed' | 'outdated';
201
+ interface ContainerSummary {
202
+ id: string;
203
+ name?: string;
204
+ state?: string;
205
+ status?: string;
206
+ localFolder?: string;
207
+ }
208
+ interface StatusInfo {
209
+ workspace: {
210
+ folder: string;
211
+ basename: string;
212
+ id: string;
213
+ };
214
+ ssh: {
215
+ alias: string;
216
+ aliasSource: SshAliasSource;
217
+ configPath: string;
218
+ configExists: boolean;
219
+ managedBlockState: SshManagedBlockState;
220
+ keyPath: string;
221
+ keyExists: boolean;
222
+ publicKeyPath: string;
223
+ publicKeyExists: boolean;
224
+ publicKeyRuntimePath: string;
225
+ publicKeyRuntimeExists: boolean;
226
+ };
227
+ paths: {
228
+ cacheRoot: string;
229
+ dataRoot: string;
230
+ workspaceCacheDir: string;
231
+ workspaceDataDir: string;
232
+ generatedConfigPath: string;
233
+ generatedConfigExists: boolean;
234
+ logPath: string;
235
+ logExists: boolean;
236
+ assetsDevcontainerDir: string;
237
+ assetsDevcontainerExists: boolean;
238
+ };
239
+ container: {
240
+ found: boolean;
241
+ running: boolean;
242
+ id?: string;
243
+ name?: string;
244
+ state?: string;
245
+ status?: string;
246
+ };
247
+ }
248
+ interface SshConfigStatus {
249
+ configPath: string;
250
+ configExists: boolean;
251
+ managedBlockState: SshManagedBlockState;
252
+ }
253
+ declare function parseDockerPsJsonLines(output: string): ContainerSummary[];
254
+ declare function inspectSshConfigStatus(context: WorkspaceContext, alias: string, configPath: string, exists: (path: string) => boolean, readFile?: (path: string) => string): SshConfigStatus;
255
+ declare function createStatusInfo(context: WorkspaceContext, alias: string, container: ContainerSummary | undefined, exists: (path: string) => boolean, options?: {
256
+ aliasSource?: SshAliasSource;
257
+ sshConfigPath?: string;
258
+ readFile?: (path: string) => string;
259
+ }): StatusInfo;
260
+ declare function statusIsHealthy(status: StatusInfo): boolean;
261
+ declare function formatStatusText(status: StatusInfo, options?: {
262
+ color?: boolean;
263
+ }): string;
264
+ //#endregion
265
+ //#region src/devcontainer.d.ts
266
+ interface StartOptions {
267
+ recreate?: boolean;
268
+ proxyMode?: boolean;
269
+ progress?: ProgressReporter;
270
+ logger?: WorkspaceCommandLogger;
271
+ reuseRunning?: boolean;
272
+ }
273
+ interface ContainerCommandOptions {
274
+ progress?: ProgressReporter;
275
+ logger?: WorkspaceCommandLogger;
276
+ }
277
+ interface TunnelPortForward {
278
+ localPort: number;
279
+ remotePort: number;
280
+ }
281
+ interface SshTunnelOptions {
282
+ bindAddress?: string;
283
+ remoteHost?: string;
284
+ }
285
+ interface DockerImageInfo {
286
+ id: string;
287
+ name?: string;
288
+ }
289
+ declare function parseContainerIdFromUpOutput(output: string): string | undefined;
290
+ declare function findWorkspaceContainer(context: WorkspaceContext, options?: {
291
+ logger?: WorkspaceCommandLogger;
292
+ }): Promise<ContainerSummary | undefined>;
293
+ declare function listWorkspaceContainers(): Promise<ContainerSummary[] | undefined>;
294
+ declare function findRunningContainerId(context: WorkspaceContext, options?: {
295
+ logger?: WorkspaceCommandLogger;
296
+ }): Promise<string | undefined>;
297
+ declare function parseDockerInspectImage(output: string, containerId: string): DockerImageInfo | undefined;
298
+ declare function inspectContainerImage(containerId: string, options?: {
299
+ logger?: WorkspaceCommandLogger;
300
+ }): Promise<DockerImageInfo | undefined>;
301
+ declare function stopWorkspaceContainer(context: WorkspaceContext, options?: {
302
+ logger?: WorkspaceCommandLogger;
303
+ }): Promise<void>;
304
+ declare function removeWorkspaceContainer(context: WorkspaceContext, options?: {
305
+ logger?: WorkspaceCommandLogger;
306
+ }): Promise<void>;
307
+ declare function removeContainerById(containerId: string, options?: {
308
+ volumes?: boolean;
309
+ logger?: WorkspaceCommandLogger;
310
+ }): Promise<void>;
311
+ declare function removeDockerImage(imageId: string, options?: {
312
+ logger?: WorkspaceCommandLogger;
313
+ }): Promise<boolean>;
314
+ declare function startDevcontainer(context: WorkspaceContext, options?: StartOptions): Promise<string>;
315
+ declare function printPortHint(context: WorkspaceContext, containerId: string, options?: {
316
+ logger?: WorkspaceCommandLogger;
317
+ }): Promise<void>;
318
+ declare function openShell(context: WorkspaceContext, options?: {
319
+ logger?: WorkspaceCommandLogger;
320
+ }): Promise<number>;
321
+ declare function codingAgentDevcontainerExecArgs(context: WorkspaceContext, agent: CodingAgentCli, agentArgs?: string[]): string[];
322
+ declare function openCodingAgentCli(context: WorkspaceContext, agent: CodingAgentCli, agentArgs?: string[], options?: {
323
+ logger?: WorkspaceCommandLogger;
324
+ }): Promise<number>;
325
+ declare function ensureContainerSshRuntime(context: WorkspaceContext, options?: ContainerCommandOptions): Promise<void>;
326
+ declare function refreshContainerCodingAgentClis(context: WorkspaceContext, proxyMode?: boolean, agents?: CodingAgentCli[], options?: ContainerCommandOptions): Promise<void>;
327
+ declare function ensureContainerCodingAgentCli(context: WorkspaceContext, agent: CodingAgentCli, options?: ContainerCommandOptions): Promise<void>;
328
+ declare function runSshdProxy(containerId: string, options?: {
329
+ logger?: WorkspaceCommandLogger;
330
+ }): Promise<number>;
331
+ declare function sshTunnelArgs(alias: string, ports: TunnelPortForward[], options?: SshTunnelOptions): string[];
332
+ declare function openSshTunnel(alias: string, ports: TunnelPortForward[], options?: SshTunnelOptions & {
333
+ logger?: WorkspaceCommandLogger;
334
+ }): Promise<number>;
335
+ declare function refreshContainerGhAuth(context: WorkspaceContext, options?: ContainerCommandOptions): Promise<void>;
336
+ //#endregion
337
+ //#region src/cli-style.d.ts
338
+ declare const ansi: {
339
+ readonly bold: "\u001B[1m";
340
+ readonly cyan: "\u001B[36m";
341
+ readonly dim: "\u001B[2m";
342
+ readonly green: "\u001B[32m";
343
+ readonly red: "\u001B[31m";
344
+ readonly yellow: "\u001B[33m";
345
+ readonly reset: "\u001B[0m";
346
+ };
347
+ type CliColor = keyof typeof ansi;
348
+ declare function color(value: string, colorName: CliColor): string;
349
+ declare function selectedMark(): string;
350
+ declare function emptyMark(isFocused: boolean): string;
351
+ declare function promptRail(): string;
352
+ declare function formatPromptTitle(title: string): string;
353
+ declare function formatPromptEnd(): string;
354
+ declare function formatPromptLabel(label: string, isFocused: boolean): string;
355
+ declare function formatPromptDetailLine(detail: string): string;
356
+ //#endregion
357
+ //#region src/interactive-prompts.d.ts
358
+ interface MultiSelectDescriptionSegment {
359
+ text: string;
360
+ color: CliColor;
361
+ }
362
+ interface MultiSelectChoice<T extends string> {
363
+ value: T;
364
+ label: string;
365
+ description: string;
366
+ focusedDescription?: readonly MultiSelectDescriptionSegment[];
367
+ }
368
+ type MultiSelectPromptResult<T extends string> = {
369
+ status: 'selected';
370
+ values: T[];
371
+ } | {
372
+ status: 'skipped';
373
+ values: [];
374
+ } | {
375
+ status: 'cancelled';
376
+ values: [];
377
+ } | {
378
+ status: 'non-interactive';
379
+ values: [];
380
+ };
381
+ type PromptInput = NodeJS.ReadableStream & {
382
+ isTTY?: boolean;
383
+ setRawMode?: (mode: boolean) => void;
384
+ resume: () => PromptInput;
385
+ pause: () => PromptInput;
386
+ };
387
+ type PromptOutput = NodeJS.WritableStream & {
388
+ isTTY?: boolean;
389
+ columns?: number;
390
+ };
391
+ interface MultiSelectPromptOptions<T extends string> {
392
+ title: string;
393
+ choices: readonly MultiSelectChoice<T>[];
394
+ skipLabel: string;
395
+ summaryLabel?: string;
396
+ input?: PromptInput;
397
+ output?: PromptOutput;
398
+ env?: NodeJS.ProcessEnv;
399
+ }
400
+ type TextPromptResult = {
401
+ status: 'submitted';
402
+ value: string;
403
+ } | {
404
+ status: 'cancelled';
405
+ value?: undefined;
406
+ } | {
407
+ status: 'non-interactive';
408
+ value?: undefined;
409
+ };
410
+ interface TextPromptOptions {
411
+ title: string;
412
+ details?: readonly string[];
413
+ defaultValue?: string;
414
+ summaryLabel: string;
415
+ validate?: (value: string) => string | undefined;
416
+ input?: PromptInput;
417
+ output?: PromptOutput;
418
+ env?: NodeJS.ProcessEnv;
419
+ }
420
+ type ConfirmPromptResult = {
421
+ status: 'confirmed';
422
+ } | {
423
+ status: 'denied';
424
+ } | {
425
+ status: 'cancelled';
426
+ } | {
427
+ status: 'non-interactive';
428
+ };
429
+ interface ConfirmPromptOptions {
430
+ title: string;
431
+ details?: readonly string[];
432
+ confirmLabel: string;
433
+ cancelLabel: string;
434
+ summaryLabel: string;
435
+ input?: PromptInput;
436
+ output?: PromptOutput;
437
+ env?: NodeJS.ProcessEnv;
438
+ }
439
+ declare function canPromptInteractively(input: PromptInput, output: PromptOutput, env: NodeJS.ProcessEnv): boolean;
440
+ declare function promptMultiSelect<T extends string>(options: MultiSelectPromptOptions<T>): Promise<MultiSelectPromptResult<T>>;
441
+ declare function promptText(options: TextPromptOptions): Promise<TextPromptResult>;
442
+ declare function promptConfirm(options: ConfirmPromptOptions): Promise<ConfirmPromptResult>;
443
+ //#endregion
444
+ //#region src/ssh-config.d.ts
445
+ declare function defaultSshAlias(workspaceBasename: string): string;
446
+ declare function validateSshAlias(alias: string): void;
447
+ declare function defaultSshConfigPath(env?: NodeJS.ProcessEnv): string;
448
+ declare function buildProxyCommand(context: WorkspaceContext, alias: string): string;
449
+ declare function buildSshConfigBlock(context: WorkspaceContext, alias: string): string;
450
+ declare function replaceSshConfigBlock(existingConfig: string, alias: string, block: string): string;
451
+ declare function removeSshConfigBlock(existingConfig: string, alias: string): string;
452
+ declare function installSshConfig(context: WorkspaceContext, alias: string, options?: {
453
+ quiet?: boolean;
454
+ configPath?: string;
455
+ }): Promise<void>;
456
+ declare function uninstallSshConfig(alias: string, options?: {
457
+ quiet?: boolean;
458
+ configPath?: string;
459
+ }): boolean;
460
+ //#endregion
461
+ //#region src/ssh-install-targets.d.ts
462
+ type SshConfigInstallTarget = 'codex' | 'claude';
463
+ interface SshInstallTargetDefinition {
464
+ value: SshConfigInstallTarget;
465
+ label: string;
466
+ description: string;
467
+ flag: string;
468
+ install: (context: WorkspaceContext, alias: string, options?: SshInstallTargetInstallOptions) => Promise<void> | void;
469
+ }
470
+ interface SshInstallTargetInstallOptions {
471
+ quiet?: boolean;
472
+ }
473
+ declare const SSH_INSTALL_TARGETS: readonly SshInstallTargetDefinition[];
474
+ declare function supportedSshInstallTargetsText(): string;
475
+ declare function sshInstallTargetFlagHintsText(): string;
476
+ declare function isSshConfigInstallTarget(value: string): value is SshConfigInstallTarget;
477
+ declare function dedupeSshInstallTargets(targets: readonly SshConfigInstallTarget[]): SshConfigInstallTarget[];
478
+ declare function installSshInstallTarget(context: WorkspaceContext, alias: string, targetValue: SshConfigInstallTarget, options?: SshInstallTargetInstallOptions): Promise<void>;
479
+ //#endregion
7
480
  //#region src/main.d.ts
8
- type BoxdownCommand = 'help' | 'start' | 'list' | 'status' | 'stop' | 'down' | 'doctor' | 'ssh-config-install' | 'ssh-proxy' | 'refresh-gh-token' | 'refresh-gh-token-running' | 'coding-agent';
481
+ type BoxdownCommand = 'help' | 'version' | 'setup' | 'start' | 'list' | 'status' | 'stop' | 'down' | 'purge' | 'doctor' | 'ssh-install' | 'ssh-uninstall' | 'ssh-proxy' | 'tunnel' | 'refresh-gh-token' | 'refresh-gh-token-running' | 'coding-agent';
9
482
  interface ParsedCli {
10
483
  command: BoxdownCommand;
11
484
  agent?: CodingAgentCli;
12
485
  agentArgs?: string[];
13
486
  workspace?: string;
487
+ workspaces?: string[];
14
488
  alias?: string;
489
+ targets?: SshConfigInstallTarget[];
490
+ tunnelPorts?: TunnelPortForward[];
15
491
  recreate: boolean;
16
492
  json: boolean;
493
+ details?: boolean;
494
+ verbose: boolean;
17
495
  }
18
- declare const USAGE = "Usage:\n boxdown start [--workspace <path>] [--recreate]\n boxdown codex [--workspace <path>] [--recreate] [-- <codex args...>]\n boxdown claude [--workspace <path>] [--recreate] [-- <claude args...>]\n boxdown cc [--workspace <path>] [--recreate] [-- <claude args...>]\n boxdown opencode [--workspace <path>] [--recreate] [-- <opencode args...>]\n boxdown antigravity [--workspace <path>] [--recreate] [-- <agy args...>]\n boxdown list [--json]\n boxdown status [--workspace <path>] [--alias <name>] [--json]\n boxdown stop [--workspace <path>]\n boxdown down [--workspace <path>]\n boxdown doctor [--workspace <path>]\n boxdown ssh-config install [--workspace <path>] [--alias <name>]\n boxdown ssh-proxy [--workspace <path>] [--alias <name>]\n boxdown refresh-gh-token [--workspace <path>]\n boxdown refresh-gh-token-running [--workspace <path>]\n\nCommands:\n start Start or reuse the workspace devcontainer, then open\n an interactive shell inside it. Alias: shell.\n codex Start or reuse the devcontainer, then launch Codex.\n claude Start or reuse the devcontainer, then launch Claude\n Code. Alias: cc.\n opencode Start or reuse the devcontainer, then launch\n OpenCode.\n antigravity Start or reuse the devcontainer, then launch\n Antigravity CLI (agy).\n list List Boxdown-known devcontainer workspaces from any\n directory.\n status Show workspace state, generated paths, SSH key paths,\n and the matching devcontainer state.\n stop Stop the workspace devcontainer if it is running.\n down Remove the workspace devcontainer. Keeps Boxdown\n cache, generated config, data, and SSH keys.\n doctor Check required host tools and Boxdown assets.\n ssh-config install Install or update an SSH host alias for the workspace\n devcontainer.\n ssh-proxy Internal command used by the generated SSH\n ProxyCommand. Starts or reuses the devcontainer and\n bridges SSH over docker exec.\n refresh-gh-token Start or reuse the devcontainer, then copy host\n GitHub CLI auth into the container when available.\n refresh-gh-token-running Refresh GitHub CLI auth only if the workspace\n devcontainer is already running.\n\nOptions:\n --workspace <path> Target project directory. Defaults to the current directory.\n --alias <name> SSH host alias. Defaults to <repo-name>-devcontainer.\n --recreate Remove the existing devcontainer before starting.\n --json Print JSON output. Supported by status and list.\n --help, -h Show help.\n";
496
+ interface RunCliOptions {
497
+ promptInput?: PromptInput;
498
+ promptOutput?: PromptOutput;
499
+ env?: NodeJS.ProcessEnv;
500
+ runDoctorChecks?: typeof runDoctorChecks;
501
+ setupWorkspace?: typeof setupWorkspace;
502
+ }
503
+ declare const USAGE = "Usage:\n boxdown setup [--workspace <path>] [--alias <name>] [--recreate] [--target <name>]...\n boxdown start [--workspace <path>] [--recreate]\n boxdown codex [--workspace <path>] [--recreate] [-- <codex args...>]\n boxdown claude [--workspace <path>] [--recreate] [-- <claude args...>]\n boxdown opencode [--workspace <path>] [--recreate] [-- <opencode args...>]\n boxdown antigravity [--workspace <path>] [--recreate] [-- <agy args...>]\n boxdown list [--details] [--json|--format json]\n boxdown status [--workspace <path>] [--alias <name>] [--json|--format json]\n boxdown stop [--workspace <path>]\n boxdown down [--workspace <path>]...\n boxdown purge [--workspace <path|ssh-alias|repo>] [--alias <name>]\n boxdown doctor [--workspace <path>]\n boxdown ssh install [--workspace <path>] [--alias <name>] [--target <name>]...\n boxdown ssh uninstall [--workspace <path>] [--alias <name>]\n boxdown ssh-proxy [--workspace <path>] [--alias <name>]\n boxdown tunnel [--port <port>] [--port <local:remote>] [--workspace <path>] [--alias <name>]\n boxdown refresh-gh-token [--workspace <path>]\n boxdown refresh-gh-token-running [--workspace <path>]\n\nCommands:\n setup Prepare the workspace devcontainer and SSH/app\n integration without opening a shell.\n start, shell Start or reuse the workspace devcontainer, then open\n an interactive shell inside it.\n codex Start or reuse the devcontainer, then launch Codex.\n claude, cc Start or reuse the devcontainer, then launch Claude\n Code.\n opencode Start or reuse the devcontainer, then launch\n OpenCode, installing it first when needed.\n antigravity Start or reuse the devcontainer, then launch\n Antigravity CLI (agy), installing it first when\n needed.\n list List Boxdown-known devcontainer workspaces from any\n directory.\n status Show workspace state, generated paths, SSH key paths,\n and the matching devcontainer state.\n stop Stop the workspace devcontainer if it is running.\n down Remove the workspace devcontainer. Keeps Boxdown\n cache, generated config, data, and SSH keys.\n purge Remove the workspace devcontainer, exact Docker\n image, managed SSH/app config, and Boxdown\n cache/data for this workspace. Prompts for\n tracked workspaces from untracked directories.\n doctor Check required host tools and Boxdown assets.\n ssh install Install or update an SSH host alias for the workspace\n devcontainer.\n ssh uninstall Remove Boxdown's managed SSH host alias block and\n matching Codex/Claude app entries.\n ssh-proxy Internal command used by the generated SSH\n ProxyCommand. Starts or reuses the devcontainer and\n bridges SSH over docker exec.\n tunnel Start or reuse the devcontainer, then keep an SSH\n local port tunnel open for host/browser access.\n refresh-gh-token Start or reuse the devcontainer, then copy host\n GitHub CLI auth into the container when available.\n refresh-gh-token-running Refresh GitHub CLI auth only if the workspace\n devcontainer is already running.\n\nOptions:\n --workspace <path> Target project directory. Defaults to the current directory.\n Repeatable with down. With purge, also accepts PATH,\n SSH ALIAS, or an unambiguous REPO from boxdown list.\n Without --workspace, purge only targets the current\n directory when it is tracked; otherwise interactive\n terminals prompt for tracked workspaces.\n --alias <name> SSH host alias. Defaults to <repo-name>-devcontainer.\n --target <name> Optional SSH install target. Repeatable. Supported by\n setup and ssh install: codex, claude.\n --port <port> Tunnel a local port to the same remote port, or use\n <local:remote>. Repeatable. Supported by tunnel.\n --recreate Remove the existing devcontainer before starting.\n --json Print JSON output. Supported by status and list.\n --format json Print JSON output. Equivalent to --json.\n --details Print detailed human list output. Supported by list.\n --verbose Stream raw Docker, devcontainer, and hook command output.\n Lifecycle commands append the same managed output to the\n per-workspace command log either way.\n --help, -h Show help.\n --version, -v Show version.\n";
19
504
  declare function commandWritesWorkspaceMetadata(command: BoxdownCommand): boolean;
20
505
  declare function parseCliArgs(argv: string[]): ParsedCli;
21
- declare function runCli(argv?: string[]): Promise<number>;
506
+ declare function parseTunnelPort(value: string): TunnelPortForward;
507
+ declare function parseTunnelPortList(value: string): TunnelPortForward[];
508
+ interface SetupWorkspaceOptions {
509
+ recreate?: boolean;
510
+ targets?: SshConfigInstallTarget[];
511
+ progress?: ProgressReporter;
512
+ logger?: WorkspaceCommandLogger;
513
+ start?: typeof startDevcontainer;
514
+ installSsh?: typeof installSshConfig;
515
+ installTarget?: typeof installSshInstallTarget;
516
+ }
517
+ declare function setupWorkspace(context: WorkspaceContext, alias: string, options?: SetupWorkspaceOptions): Promise<void>;
518
+ declare function runCli(argv?: string[], options?: RunCliOptions): Promise<number>;
22
519
  //#endregion
23
- export { BoxdownCommand, ParsedCli, USAGE, commandWritesWorkspaceMetadata, parseCliArgs, runCli };
520
+ export { BoxdownCommand, ParsedCli, RunCliOptions, USAGE, commandWritesWorkspaceMetadata, parseCliArgs, parseTunnelPort, parseTunnelPortList, runCli, setupWorkspace };
24
521
  //# sourceMappingURL=main.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.cts","names":[],"sources":["../src/coding-agents.ts","../src/main.ts"],"mappings":";KAAY,cAAA;AAAA,KACA,uBAAA,GAA0B,cAAA;AAAA,iBAUtB,sBAAA,CAAwB,OAAA,WAAkB,cAAA;AAAA,iBAI1C,iBAAA,CAAmB,KAAA,EAAO,cAAA;;;KCJ9B,cAAA;AAAA,UAcK,SAAA;EACf,OAAA,EAAS,cAAA;EACT,KAAA,GAAQ,cAAA;EACR,SAAA;EACA,SAAA;EACA,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,cAGW,KAAA;AAAA,iBAqDG,8BAAA,CAAgC,OAAA,EAAS,cAAA;AAAA,iBAWzC,YAAA,CAAc,IAAA,aAAiB,SAAA;AAAA,iBAoJzB,MAAA,CAAQ,IAAA,cAAyC,OAAA"}
1
+ {"version":3,"file":"main.d.cts","names":[],"sources":["../src/coding-agents.ts","../src/paths.ts","../src/doctor.ts","../src/logging.ts","../src/process.ts","../src/progress.ts","../src/status.ts","../src/devcontainer.ts","../src/cli-style.ts","../src/interactive-prompts.ts","../src/ssh-config.ts","../src/ssh-install-targets.ts","../src/main.ts"],"mappings":"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"}