dockai 0.2.1 → 0.2.3
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/README.md +37 -22
- package/dist/commands/connect.js +6 -1
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/deploy.js +2 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/login.js +26 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +10 -6
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/open.js +11 -12
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/projects.js +14 -6
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/start-stop.js +8 -10
- package/dist/commands/start-stop.js.map +1 -1
- package/dist/commands/status.js +5 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/index.js +38 -22
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/fail.test.js +33 -0
- package/dist/lib/__tests__/fail.test.js.map +1 -0
- package/dist/lib/__tests__/remote.test.js +81 -0
- package/dist/lib/__tests__/remote.test.js.map +1 -0
- package/dist/lib/fail.js +48 -0
- package/dist/lib/fail.js.map +1 -0
- package/dist/lib/pick-project.js +7 -0
- package/dist/lib/pick-project.js.map +1 -1
- package/dist/lib/remote.js +11 -2
- package/dist/lib/remote.js.map +1 -1
- package/dist/terminal.js +11 -6
- package/dist/terminal.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ npm install -g dockai
|
|
|
12
12
|
npx dockai <command>
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
Requires Node.js 20
|
|
15
|
+
Requires Node.js 20+ (the package declares `>=20`).
|
|
16
16
|
|
|
17
17
|
## Setup
|
|
18
18
|
|
|
@@ -30,31 +30,46 @@ The CLI stores `{ serverUrl, token }` in `~/.config/dockai/config.json`.
|
|
|
30
30
|
## Commands
|
|
31
31
|
|
|
32
32
|
```
|
|
33
|
-
dockai login [--server <url>]
|
|
34
|
-
dockai logout
|
|
35
|
-
dockai whoami
|
|
36
|
-
dockai projects
|
|
37
|
-
dockai
|
|
38
|
-
|
|
39
|
-
dockai
|
|
40
|
-
dockai
|
|
41
|
-
dockai
|
|
42
|
-
dockai
|
|
43
|
-
|
|
44
|
-
dockai
|
|
33
|
+
dockai login [--server <url>] Authenticate, and write the ~/.ssh config block
|
|
34
|
+
dockai logout Clear the saved API token
|
|
35
|
+
dockai whoami Show the account you are signed in as
|
|
36
|
+
dockai projects List your projects
|
|
37
|
+
dockai status Server status and a project overview
|
|
38
|
+
|
|
39
|
+
dockai start <slug> Start a project's worker
|
|
40
|
+
dockai stop <slug> Stop a project's worker
|
|
41
|
+
dockai logs <slug> [--tail N] Tail a project's logs
|
|
42
|
+
dockai open <slug> Open the project in claude.ai
|
|
43
|
+
|
|
44
|
+
dockai claude <slug> [claude args…] Run Claude Code in the worker, over the
|
|
45
|
+
tunnel, in tmux — this is the main one
|
|
46
|
+
dockai connect <slug> A shell in the worker
|
|
47
|
+
dockai code <slug> Open the worker in VS Code Remote-SSH
|
|
48
|
+
|
|
49
|
+
dockai sessions list <slug> The project's conversations
|
|
50
|
+
dockai sessions resume <slug> <id> Attach to one
|
|
51
|
+
dockai sessions handoff <slug> <ref> Carry a conversation's context into a new one
|
|
52
|
+
dockai push <slug> <paths…> Copy files from here into the workspace
|
|
53
|
+
dockai sessions push <slug> Send the current directory's diff to a conversation
|
|
54
|
+
dockai paste <slug> Put the Mac clipboard into the workspace
|
|
55
|
+
|
|
56
|
+
dockai ssh-config Print the ~/.ssh/config block
|
|
57
|
+
dockai proxy <host> The ProxyCommand transport (not run by hand)
|
|
58
|
+
dockai deploy [target] Redeploy DockAI, or a named Compose stack
|
|
45
59
|
```
|
|
46
60
|
|
|
47
|
-
|
|
61
|
+
Flags written after the project name are passed to `claude` untouched, so
|
|
62
|
+
`dockai claude app --permission-mode bypassPermissions -r` works. That is also
|
|
63
|
+
why `dockai`'s own options go before the name.
|
|
48
64
|
|
|
49
|
-
|
|
50
|
-
serves on, so it works from anywhere your DockAI server is reachable on the
|
|
51
|
-
internet.
|
|
65
|
+
## How it reaches the worker
|
|
52
66
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
No SSH port is published on the DockAI host. `dockai login` writes a
|
|
68
|
+
`Host dockai-*` block into `~/.ssh/config` whose `ProxyCommand` runs
|
|
69
|
+
`dockai proxy`, which pipes stdin and stdout over an authenticated WebSocket
|
|
70
|
+
to the worker's sshd. So `ssh dockai-<slug>`, VS Code Remote-SSH and the
|
|
71
|
+
Claude app's SSH backend all work from anywhere the server is reachable —
|
|
72
|
+
there is nothing LAN-only about it, and nothing to open on a firewall.
|
|
58
73
|
|
|
59
74
|
## License
|
|
60
75
|
|
package/dist/commands/connect.js
CHANGED
|
@@ -30,7 +30,12 @@ async function connectSSH(slug) {
|
|
|
30
30
|
const api = createApiClient();
|
|
31
31
|
const info = (await api.project.sshInfo.query({ slug }));
|
|
32
32
|
if (!info) {
|
|
33
|
-
|
|
33
|
+
// Not a missing project and not a stopped one. DockAI never publishes an
|
|
34
|
+
// SSH port on the Docker host — that is the design, and the reason the
|
|
35
|
+
// tunnel exists — so `sshInfo` is null for every healthy project and this
|
|
36
|
+
// said "Is the project running?" forever (audit 6 §3).
|
|
37
|
+
console.error("DockAI does not publish an SSH port; workers are reached through an authenticated tunnel.");
|
|
38
|
+
console.error(`Run \`dockai ssh-config\` once, then \`ssh dockai-${slug}\` — or \`dockai claude ${slug}\` to go straight to Claude.`);
|
|
34
39
|
process.exit(1);
|
|
35
40
|
}
|
|
36
41
|
// Resolve host from server URL if SSH_HOST not set
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,OAA4C;IAE5C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAmB,CAAC;IAE3E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createApiClient } from "../api.js";
|
|
2
2
|
import { getToken } from "../config.js";
|
|
3
|
+
import { fail } from "../lib/fail.js";
|
|
3
4
|
/**
|
|
4
5
|
* Redeploy DockAI on its host, through DockAI itself.
|
|
5
6
|
*
|
|
@@ -21,8 +22,7 @@ export async function deployCommand(name, options) {
|
|
|
21
22
|
await api.admin.system.deploy.mutate();
|
|
22
23
|
}
|
|
23
24
|
catch (err) {
|
|
24
|
-
|
|
25
|
-
process.exit(1);
|
|
25
|
+
fail(err);
|
|
26
26
|
}
|
|
27
27
|
console.log("Deploy started.");
|
|
28
28
|
if (options.wait === false)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createInterface } from "node:readline";
|
|
2
2
|
import { saveConfig, getConfig } from "../config.js";
|
|
3
3
|
import { CLI_VERSION, compareSemver } from "../version.js";
|
|
4
|
+
import { explain } from "../lib/fail.js";
|
|
5
|
+
import { createApiClient } from "../api.js";
|
|
4
6
|
function prompt(question) {
|
|
5
7
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
6
8
|
return new Promise((resolve) => {
|
|
@@ -86,8 +88,28 @@ export async function loginCommand(options) {
|
|
|
86
88
|
console.error("No token provided. Aborting.");
|
|
87
89
|
process.exit(1);
|
|
88
90
|
}
|
|
91
|
+
// Verify before declaring success. It used to save whatever was pasted and
|
|
92
|
+
// print "Logged in", so a mistyped token surfaced one command later as the
|
|
93
|
+
// bare word UNAUTHORIZED — by which time the person believed login had
|
|
94
|
+
// worked and went looking elsewhere (audit 6 §11).
|
|
89
95
|
saveConfig({ serverUrl, token });
|
|
90
|
-
|
|
96
|
+
let who = "";
|
|
97
|
+
try {
|
|
98
|
+
const me = (await createApiClient().users.me.query());
|
|
99
|
+
who = me?.email ? ` as ${me.email}` : "";
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
103
|
+
if (/UNAUTHORIZED|\b401\b/.test(msg)) {
|
|
104
|
+
saveConfig({ serverUrl, token: "" });
|
|
105
|
+
console.error("\nThat token was rejected. Copy it again from Settings → API Tokens.");
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
// Reachable but something else went wrong: the token may be fine, so keep
|
|
109
|
+
// it and say what happened rather than sending them round again.
|
|
110
|
+
console.error(`\nSaved, but could not verify it: ${explain(err)}`);
|
|
111
|
+
}
|
|
112
|
+
console.log(`\nLogged in to ${serverUrl}${who} (server ${serverVersionLabel}).`);
|
|
91
113
|
// The ssh host block is what `dockai claude`, VS Code and the Claude app
|
|
92
114
|
// all use; writing it here is what makes login the only setup step.
|
|
93
115
|
try {
|
|
@@ -99,5 +121,8 @@ export async function loginCommand(options) {
|
|
|
99
121
|
catch (err) {
|
|
100
122
|
console.error(`Could not write ~/.ssh/config (${err instanceof Error ? err.message : String(err)}); run \`dockai ssh-config\` later.`);
|
|
101
123
|
}
|
|
124
|
+
// Login never named a next step, which is the one thing a first-time user
|
|
125
|
+
// wants after it (audit 6 §11).
|
|
126
|
+
console.log("\nNext: `dockai projects` to see them, `dockai claude <slug>` to work in one.");
|
|
102
127
|
}
|
|
103
128
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { createApiClient } from "../api.js";
|
|
2
|
+
import { fail, noSuchProject } from "../lib/fail.js";
|
|
2
3
|
export async function logsCommand(slug, options) {
|
|
3
4
|
const api = createApiClient();
|
|
4
|
-
|
|
5
|
+
// `--tail abc` used to send NaN to the server (audit 6 §17).
|
|
6
|
+
const parsed = Number.parseInt(options.tail || "100", 10);
|
|
7
|
+
if (!Number.isFinite(parsed) || parsed < 1) {
|
|
8
|
+
console.error(`--tail wants a number of lines, not "${options.tail}".`);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const tail = Math.min(parsed, 10_000);
|
|
5
12
|
try {
|
|
6
13
|
const projects = (await api.project.list.query());
|
|
7
14
|
const project = projects.find((p) => p.slug === slug);
|
|
8
15
|
if (!project) {
|
|
9
|
-
|
|
10
|
-
process.exit(1);
|
|
16
|
+
noSuchProject(slug, projects);
|
|
11
17
|
}
|
|
12
18
|
const result = (await api.project.logs.query({ id: project.id, tail }));
|
|
13
19
|
if (result.logs) {
|
|
@@ -18,9 +24,7 @@ export async function logsCommand(slug, options) {
|
|
|
18
24
|
}
|
|
19
25
|
}
|
|
20
26
|
catch (err) {
|
|
21
|
-
|
|
22
|
-
console.error("Failed to fetch logs:", msg);
|
|
23
|
-
process.exit(1);
|
|
27
|
+
fail(err, "Could not fetch the logs");
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
//# sourceMappingURL=logs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,OAA0B;IAE1B,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,6DAA6D;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,wCAAwC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAc,CAAC;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAErE,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
package/dist/commands/open.js
CHANGED
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
import open from "open";
|
|
2
2
|
import { createApiClient } from "../api.js";
|
|
3
|
+
import { getServerUrl } from "../config.js";
|
|
4
|
+
import { fail, noSuchProject } from "../lib/fail.js";
|
|
3
5
|
export async function openCommand(slug) {
|
|
4
6
|
const api = createApiClient();
|
|
5
7
|
try {
|
|
6
8
|
const projects = (await api.project.list.query());
|
|
7
9
|
const project = projects.find((p) => p.slug === slug);
|
|
8
10
|
if (!project) {
|
|
9
|
-
|
|
10
|
-
process.exit(1);
|
|
11
|
-
}
|
|
12
|
-
if (project.container?.sessionUrl) {
|
|
13
|
-
console.log(`Opening ${project.container.sessionUrl}...`);
|
|
14
|
-
await open(project.container.sessionUrl);
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
console.log("No active session URL. Is the project running?");
|
|
11
|
+
noSuchProject(slug, projects);
|
|
18
12
|
}
|
|
13
|
+
// This used to read `container.sessionUrl`, a column nothing in the
|
|
14
|
+
// server ever writes — so it answered "No active session URL. Is the
|
|
15
|
+
// project running?" on a running project, every time (audit 6 §3). What
|
|
16
|
+
// a person means by `dockai open <slug>` is the project's page.
|
|
17
|
+
const url = `${getServerUrl().replace(/\/$/, "")}/projects/${project.slug}`;
|
|
18
|
+
console.log(`Opening ${url}`);
|
|
19
|
+
await open(url);
|
|
19
20
|
}
|
|
20
21
|
catch (err) {
|
|
21
|
-
|
|
22
|
-
console.error("Failed:", msg);
|
|
23
|
-
process.exit(1);
|
|
22
|
+
fail(err);
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
25
|
//# sourceMappingURL=open.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAc,CAAC;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,oEAAoE;QACpE,qEAAqE;QACrE,wEAAwE;QACxE,gEAAgE;QAChE,MAAM,GAAG,GAAG,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createApiClient } from "../api.js";
|
|
2
|
+
import { fail } from "../lib/fail.js";
|
|
2
3
|
const statusIcons = {
|
|
3
4
|
RUNNING: "\x1b[32m●\x1b[0m",
|
|
4
5
|
STARTING: "\x1b[33m◐\x1b[0m",
|
|
@@ -6,10 +7,17 @@ const statusIcons = {
|
|
|
6
7
|
ERROR: "\x1b[31m●\x1b[0m",
|
|
7
8
|
STOPPED: "\x1b[90m○\x1b[0m",
|
|
8
9
|
};
|
|
9
|
-
export async function projectsCommand() {
|
|
10
|
+
export async function projectsCommand(options = {}) {
|
|
10
11
|
const api = createApiClient();
|
|
11
12
|
try {
|
|
12
13
|
const projects = (await api.project.list.query());
|
|
14
|
+
// The list was unparsable for scripting except by stripping ANSI, which
|
|
15
|
+
// is the kind of thing a person writes once and then maintains for ever
|
|
16
|
+
// (audit 6 §17).
|
|
17
|
+
if (options.json) {
|
|
18
|
+
console.log(JSON.stringify(projects.map((p) => ({ name: p.name, slug: p.slug, status: p.status })), null, 2));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
13
21
|
if (!projects.length) {
|
|
14
22
|
console.log("No projects found. Create one in the dashboard.");
|
|
15
23
|
return;
|
|
@@ -17,15 +25,15 @@ export async function projectsCommand() {
|
|
|
17
25
|
console.log("\nProjects:\n");
|
|
18
26
|
for (const p of projects) {
|
|
19
27
|
const icon = statusIcons[p.status] || "?";
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
// `container.sessionUrl` is a column nothing in the server writes, so
|
|
29
|
+
// this suffix never appeared (audit 6 §3, the same dead field `open`
|
|
30
|
+
// was reading).
|
|
31
|
+
console.log(` ${icon} ${p.name} (${p.slug}) [${p.status}]`);
|
|
22
32
|
}
|
|
23
33
|
console.log();
|
|
24
34
|
}
|
|
25
35
|
catch (err) {
|
|
26
|
-
|
|
27
|
-
console.error("Failed to list projects:", msg);
|
|
28
|
-
process.exit(1);
|
|
36
|
+
fail(err, "Could not list your projects");
|
|
29
37
|
}
|
|
30
38
|
}
|
|
31
39
|
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,GAA2B;IAC1C,OAAO,EAAE,kBAAkB;IAC3B,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,EAAE,kBAAkB;IACzB,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAO,GAAuB,EAAE;IACpE,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAc,CAAC;QAE/D,wEAAwE;QACxE,wEAAwE;QACxE,iBAAiB;QACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9G,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YAC1C,sEAAsE;YACtE,qEAAqE;YACrE,gBAAgB;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,8BAA8B,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -1,37 +1,35 @@
|
|
|
1
1
|
import { createApiClient } from "../api.js";
|
|
2
|
+
import { fail, noSuchProject } from "../lib/fail.js";
|
|
2
3
|
async function findProject(api, slug) {
|
|
3
4
|
const projects = (await api.project.list.query());
|
|
4
5
|
const project = projects.find((p) => p.slug === slug);
|
|
5
6
|
if (!project) {
|
|
6
|
-
|
|
7
|
-
process.exit(1);
|
|
7
|
+
noSuchProject(slug, projects);
|
|
8
8
|
}
|
|
9
9
|
return project;
|
|
10
10
|
}
|
|
11
11
|
export async function startCommand(slug) {
|
|
12
12
|
const api = createApiClient();
|
|
13
|
-
|
|
13
|
+
// Inside the try: `findProject` is an API call, and with the server down it
|
|
14
|
+
// threw a raw `TRPCClientError` straight to the terminal (audit 6 §9).
|
|
14
15
|
try {
|
|
16
|
+
const project = await findProject(api, slug);
|
|
15
17
|
await api.project.start.mutate({ id: project.id });
|
|
16
18
|
console.log(`Starting ${project.name}...`);
|
|
17
19
|
}
|
|
18
20
|
catch (err) {
|
|
19
|
-
|
|
20
|
-
console.error("Failed to start:", msg);
|
|
21
|
-
process.exit(1);
|
|
21
|
+
fail(err, "Could not start it");
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
export async function stopCommand(slug) {
|
|
25
25
|
const api = createApiClient();
|
|
26
|
-
const project = await findProject(api, slug);
|
|
27
26
|
try {
|
|
27
|
+
const project = await findProject(api, slug);
|
|
28
28
|
await api.project.stop.mutate({ id: project.id });
|
|
29
29
|
console.log(`Stopping ${project.name}...`);
|
|
30
30
|
}
|
|
31
31
|
catch (err) {
|
|
32
|
-
|
|
33
|
-
console.error("Failed to stop:", msg);
|
|
34
|
-
process.exit(1);
|
|
32
|
+
fail(err, "Could not stop it");
|
|
35
33
|
}
|
|
36
34
|
}
|
|
37
35
|
//# sourceMappingURL=start-stop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-stop.js","sourceRoot":"","sources":["../../src/commands/start-stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"start-stop.js","sourceRoot":"","sources":["../../src/commands/start-stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAErD,KAAK,UAAU,WAAW,CAAC,GAAc,EAAE,IAAY;IACrD,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAc,CAAC;IAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,4EAA4E;IAC5E,uEAAuE;IACvE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
package/dist/commands/status.js
CHANGED
|
@@ -14,11 +14,14 @@ export async function statusCommand() {
|
|
|
14
14
|
catch {
|
|
15
15
|
console.log(`\nServer: ${serverUrl}`);
|
|
16
16
|
console.log(`Status: \x1b[31munreachable\x1b[0m\n`);
|
|
17
|
-
|
|
17
|
+
// Exit non-zero, or `dockai status` cannot be used as a health check —
|
|
18
|
+
// it reported success for an unreachable server and for a missing login
|
|
19
|
+
// alike (audit 6 §17).
|
|
20
|
+
process.exit(1);
|
|
18
21
|
}
|
|
19
22
|
if (!token) {
|
|
20
23
|
console.log("\nNot logged in. Run 'dockai login' first.\n");
|
|
21
|
-
|
|
24
|
+
process.exit(1);
|
|
22
25
|
}
|
|
23
26
|
try {
|
|
24
27
|
const projects = (await api.project.list.query());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,aAAa,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,aAAa,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,uEAAuE;QACvE,wEAAwE;QACxE,uBAAuB;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAc,CAAC;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,MAAM,WAAW,OAAO,YAAY,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,11 +21,24 @@ import { CLI_VERSION } from "./version.js";
|
|
|
21
21
|
const program = new Command();
|
|
22
22
|
program
|
|
23
23
|
.name("dockai")
|
|
24
|
-
.description("CLI for DockAI — self-hosted Claude Code
|
|
24
|
+
.description("CLI for DockAI — self-hosted Claude Code workers")
|
|
25
25
|
.version(CLI_VERSION)
|
|
26
26
|
// Lets `dockai claude <slug> --resume x -r` hand every flag after the slug to
|
|
27
27
|
// claude untouched, without a `--` separator.
|
|
28
|
-
.enablePositionalOptions()
|
|
28
|
+
.enablePositionalOptions()
|
|
29
|
+
// There were no examples anywhere, and the three flag rules a person cannot
|
|
30
|
+
// guess live in four different command descriptions (audit 6 §17).
|
|
31
|
+
.addHelpText("after", `
|
|
32
|
+
Examples:
|
|
33
|
+
$ dockai login set the server and token, once per laptop
|
|
34
|
+
$ dockai projects --json machine-readable, for scripts
|
|
35
|
+
$ dockai claude app Claude Code in the "app" worker, in tmux
|
|
36
|
+
$ dockai claude app --permission-mode bypassPermissions
|
|
37
|
+
flags AFTER the project name go to claude
|
|
38
|
+
$ dockai claude -s scratch app flags BEFORE it are dockai's own
|
|
39
|
+
$ ssh dockai-app the same worker as a plain ssh host
|
|
40
|
+
$ dockai status exits non-zero if the server is unreachable
|
|
41
|
+
`);
|
|
29
42
|
program
|
|
30
43
|
.command("login")
|
|
31
44
|
.description("Authenticate with the DockAI server")
|
|
@@ -43,6 +56,7 @@ program
|
|
|
43
56
|
program
|
|
44
57
|
.command("projects")
|
|
45
58
|
.description("List all projects with status")
|
|
59
|
+
.option("--json", "Print the raw list, for scripts")
|
|
46
60
|
.action(projectsCommand);
|
|
47
61
|
program
|
|
48
62
|
.command("start <slug>")
|
|
@@ -54,8 +68,8 @@ program
|
|
|
54
68
|
.action(stopCommand);
|
|
55
69
|
program
|
|
56
70
|
.command("connect <slug>")
|
|
57
|
-
.description("
|
|
58
|
-
.option("--claude", "
|
|
71
|
+
.description("Open a terminal in the project's worker")
|
|
72
|
+
.option("--claude", "Open Claude instead of a shell")
|
|
59
73
|
.option("--ssh", "Connect via SSH instead of WebSocket")
|
|
60
74
|
.action(connectCommand);
|
|
61
75
|
program
|
|
@@ -65,7 +79,7 @@ program
|
|
|
65
79
|
.action(logsCommand);
|
|
66
80
|
program
|
|
67
81
|
.command("open <slug>")
|
|
68
|
-
.description("Open the
|
|
82
|
+
.description("Open the conversation's claude.ai URL in a browser")
|
|
69
83
|
.action(openCommand);
|
|
70
84
|
program
|
|
71
85
|
.command("ssh-config")
|
|
@@ -78,15 +92,15 @@ program
|
|
|
78
92
|
.action(codeCommand);
|
|
79
93
|
program
|
|
80
94
|
.command("claude <slug> [claudeArgs...]")
|
|
81
|
-
.description("Run Claude Code inside the project's worker, in tmux — joining the conversation
|
|
95
|
+
.description("Run Claude Code inside the project's worker, in tmux — joining the live conversation when there is one. -r / --resume <id|title> picks among the project's conversations; other flags after the project name go to claude: dockai claude app --permission-mode bypassPermissions")
|
|
82
96
|
// No default here: an unset session is what lets the command join the
|
|
83
97
|
// conversation the phone is on; naming one is an explicit choice.
|
|
84
98
|
.option("-s, --session <name>", "tmux session to attach to or create (before the project name; default claude-cli)")
|
|
85
99
|
.option("--no-tmux", "Skip tmux — the session ends when you disconnect (before the project name)")
|
|
86
|
-
.option("--no-chrome", "Don't forward this
|
|
87
|
-
.option("--no-client", "Don't offer this
|
|
88
|
-
.option("--root <dir>", "Directory the
|
|
89
|
-
.option("--allow-run", "Let the
|
|
100
|
+
.option("--no-chrome", "Don't forward this laptop's Claude in Chrome bridge into the worker (before the project name)")
|
|
101
|
+
.option("--no-client", "Don't offer this laptop's files and clipboard to the conversation (before the project name)")
|
|
102
|
+
.option("--root <dir>", "Directory the conversation may read from on this laptop; repeatable (default: the current directory)", (v, prev) => [...(prev ?? []), v], [])
|
|
103
|
+
.option("--allow-run", "Let the conversation run commands on this laptop (each run is logged here); the project's own setting is the default")
|
|
90
104
|
.option("--no-allow-run", "Refuse commands on this machine even if the project allows them by default")
|
|
91
105
|
.passThroughOptions()
|
|
92
106
|
.action((slug, claudeArgs, options) => claudeCommand(slug, options, claudeArgs));
|
|
@@ -97,14 +111,14 @@ program
|
|
|
97
111
|
.action(pushCommand);
|
|
98
112
|
const sessions = program
|
|
99
113
|
.command("sessions")
|
|
100
|
-
.description("Move
|
|
114
|
+
.description("Move this laptop's Claude conversations into a project");
|
|
101
115
|
sessions
|
|
102
116
|
.command("list <slug>")
|
|
103
|
-
.description("Conversations on the worker, with ids and whether each is live
|
|
117
|
+
.description("Conversations on the worker, with ids and whether each is live")
|
|
104
118
|
.action(sessionsListCommand);
|
|
105
119
|
sessions
|
|
106
120
|
.command("resume <slug> <session>")
|
|
107
|
-
.description("Open a conversation by id, id prefix or name — in a terminal here, or
|
|
121
|
+
.description("Open a conversation by id, id prefix or name — in a terminal here, or in the Claude app with --remote")
|
|
108
122
|
.option("--remote", "Register it with Remote Control through DockAI instead of opening a terminal")
|
|
109
123
|
.action(sessionsResumeCommand);
|
|
110
124
|
sessions
|
|
@@ -114,21 +128,21 @@ sessions
|
|
|
114
128
|
.option("--title <title>", "Title for the new conversation (default: the old one's)")
|
|
115
129
|
.option("--file-only", "Write the hand-off file without creating a conversation, to send the message in one that already exists")
|
|
116
130
|
.option("--into <id>", "Continue in this existing conversation instead of creating one: a cse_… id (environment) or a local id with --terminal")
|
|
117
|
-
.option("--terminal", "Continue in
|
|
131
|
+
.option("--terminal", "Continue in a terminal conversation — in the Claude app and joinable with dockai claude — instead of an app-only one")
|
|
118
132
|
.action(sessionsHandoffCommand);
|
|
119
133
|
sessions
|
|
120
134
|
.command("push <slug>")
|
|
121
|
-
.description("Copy this directory's Claude
|
|
122
|
-
.option("--from <dir>", "Local project directory whose
|
|
123
|
-
.option("--latest <n>", "Only the n most recently used
|
|
124
|
-
.option("--session <id...>", "Only these
|
|
125
|
-
.option("--overwrite", "Replace
|
|
126
|
-
.option("--remote", "Then
|
|
135
|
+
.description("Copy this directory's Claude conversations and memory into the project, with paths rewritten to the workspace")
|
|
136
|
+
.option("--from <dir>", "Local project directory whose conversations to push (default: current directory)")
|
|
137
|
+
.option("--latest <n>", "Only the n most recently used conversations")
|
|
138
|
+
.option("--session <id...>", "Only these conversations (id or unique prefix); repeatable")
|
|
139
|
+
.option("--overwrite", "Replace conversations that already exist on the worker")
|
|
140
|
+
.option("--remote", "Then register each pushed conversation with Remote Control, so it appears in the Claude app")
|
|
127
141
|
.option("--dry-run", "Show what would be pushed without sending anything")
|
|
128
142
|
.action(sessionsPushCommand);
|
|
129
143
|
program
|
|
130
144
|
.command("paste <slug>")
|
|
131
|
-
.description("Paste the image on your clipboard into a running dockai claude
|
|
145
|
+
.description("Paste the image on your clipboard into a running dockai claude conversation (macOS)")
|
|
132
146
|
.option("-s, --session <name>", "tmux session to type into", "claude-cli")
|
|
133
147
|
.action(pasteCommand);
|
|
134
148
|
program
|
|
@@ -147,7 +161,9 @@ program
|
|
|
147
161
|
// Commands that take a project first: ask for it when it was left out.
|
|
148
162
|
let argv = process.argv;
|
|
149
163
|
argv = await ensureSlug(argv, ["claude"], { flags: ["--no-tmux", "--tmux", "--no-chrome", "--chrome", "--no-client", "--allow-run", "--no-allow-run"], valued: ["-s", "--session", "--root"] });
|
|
150
|
-
|
|
164
|
+
// `sessions handoff` was missing from this list, so it alone asked for a slug
|
|
165
|
+
// differently from its three siblings (audit 6 §17).
|
|
166
|
+
for (const path of [["push"], ["paste"], ["sessions", "list"], ["sessions", "resume"], ["sessions", "push"], ["sessions", "handoff"]]) {
|
|
151
167
|
argv = await ensureSlug(argv, path);
|
|
152
168
|
}
|
|
153
169
|
await program.parseAsync(argv);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACjI,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
vi.mock("../../config.js", () => ({ getServerUrl: () => "https://dockai.example.com" }));
|
|
3
|
+
const { explain } = await import("../fail.js");
|
|
4
|
+
/**
|
|
5
|
+
* One sentence, never a stack.
|
|
6
|
+
*
|
|
7
|
+
* `start`, `stop` and `ssh-config` called the API outside their `try`, so a
|
|
8
|
+
* server that was down printed twelve lines of `node_modules` paths and an
|
|
9
|
+
* undici frame — while `dockai projects`, in the same situation, printed one
|
|
10
|
+
* sentence. Four more commands let a bare `UNAUTHORIZED` reach the screen as
|
|
11
|
+
* their entire output (audit 6 §9).
|
|
12
|
+
*/
|
|
13
|
+
describe("explain", () => {
|
|
14
|
+
it("names the server when it cannot be reached", () => {
|
|
15
|
+
const msg = explain(new Error("fetch failed"));
|
|
16
|
+
expect(msg).toContain("dockai.example.com");
|
|
17
|
+
expect(msg).toMatch(/dockai login/);
|
|
18
|
+
});
|
|
19
|
+
it("says what a rejected token is, not its code", () => {
|
|
20
|
+
expect(explain(new Error("UNAUTHORIZED"))).toMatch(/token was rejected/i);
|
|
21
|
+
expect(explain(new Error("UNAUTHORIZED"))).not.toMatch(/UNAUTHORIZED/);
|
|
22
|
+
});
|
|
23
|
+
it("keeps a tRPC message written for a person", () => {
|
|
24
|
+
expect(explain(new Error("Start the project first"))).toBe("Start the project first");
|
|
25
|
+
});
|
|
26
|
+
it("drops the stack, which is what used to be the output", () => {
|
|
27
|
+
const err = new Error("TRPCClientError: fetch failed\n\n at node:internal/deps/undici/undici:15157:13\n at process.processTicksAndRejections");
|
|
28
|
+
const msg = explain(err);
|
|
29
|
+
expect(msg, "a node_modules frame reached the terminal").not.toMatch(/node:internal|at process/);
|
|
30
|
+
expect(msg.split("\n").length).toBeLessThanOrEqual(3);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=fail.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fail.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/fail.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;AAEzF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAE/C;;;;;;;;GAQG;AACH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG,IAAI,KAAK,CACnB,6HAA6H,CAC9H,CAAC;QACF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACjG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { sq, dq } from "../remote.js";
|
|
4
|
+
/**
|
|
5
|
+
* The quoting that carries a command across two shells.
|
|
6
|
+
*
|
|
7
|
+
* `dockai claude <slug>` builds one string that ssh hands to `sh -c`, which
|
|
8
|
+
* hands part of it to tmux, which hands that to `sh -c` again. CLAUDE.md §7
|
|
9
|
+
* says these are "verified against `$VAR`, quotes, backticks, and directories
|
|
10
|
+
* containing spaces — change `sq`/`dq` only with an equivalent test". There
|
|
11
|
+
* was no test: `pnpm -r test:run` skipped this package entirely, because it
|
|
12
|
+
* had no `test:run`, so no failure was possible in the one part of the repo
|
|
13
|
+
* that ships to npm (audit 5 §8.2).
|
|
14
|
+
*
|
|
15
|
+
* These run a real `/bin/sh`. Asserting the escaped string looks right is
|
|
16
|
+
* asserting a guess about a shell; asking the shell is the contract.
|
|
17
|
+
*/
|
|
18
|
+
const HOSTILE = [
|
|
19
|
+
"plain",
|
|
20
|
+
"with spaces",
|
|
21
|
+
"$HOME",
|
|
22
|
+
"${HOME}",
|
|
23
|
+
"`id`",
|
|
24
|
+
"$(id)",
|
|
25
|
+
'double"quote',
|
|
26
|
+
"single'quote",
|
|
27
|
+
"back\\slash",
|
|
28
|
+
"semi;colon && echo pwned",
|
|
29
|
+
"new\nline",
|
|
30
|
+
"tab\there",
|
|
31
|
+
"a|b&c<d>e*f?g[h]i{j}k",
|
|
32
|
+
"emoji 🐸 and accents ñáü",
|
|
33
|
+
];
|
|
34
|
+
/** What `sh -c <script>` prints on stdout, exactly. */
|
|
35
|
+
const shell = (script) => execFileSync("/bin/sh", ["-c", script], { encoding: "utf8" });
|
|
36
|
+
describe("sq — POSIX single-quote", () => {
|
|
37
|
+
it.each(HOSTILE)("survives one shell unchanged: %j", (value) => {
|
|
38
|
+
expect(shell(`printf %s ${sq(value)}`)).toBe(value);
|
|
39
|
+
});
|
|
40
|
+
it("is what makes a workspace path with a space work", () => {
|
|
41
|
+
// The real call site: `cd ${sq(workspace)} && exec …`
|
|
42
|
+
expect(shell(`cd ${sq("/tmp")} && printf %s "$PWD"`)).toBe("/tmp");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("dq — survives one round of double-quoted expansion", () => {
|
|
46
|
+
it.each(HOSTILE)("survives being inside double quotes: %j", (value) => {
|
|
47
|
+
expect(shell(`printf %s ${dq(value)}`)).toBe(value);
|
|
48
|
+
});
|
|
49
|
+
it("carries a whole command through the outer shell to the inner one", () => {
|
|
50
|
+
// The real call site: `tmux new-session … ${dq(claudeCmd)}`, where tmux
|
|
51
|
+
// runs the result through a shell of its own.
|
|
52
|
+
const inner = `printf %s ${sq("it survived $HOME `id`")}`;
|
|
53
|
+
expect(shell(`sh -c ${dq(inner)}`)).toBe("it survived $HOME `id`");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* `--help` reaches Commander.
|
|
58
|
+
*
|
|
59
|
+
* `ensureSlug` runs before `program.parseAsync` and treated `--help` as a
|
|
60
|
+
* missing project: logged out, `dockai claude --help` answered *"Not logged
|
|
61
|
+
* in. Run `dockai login` first."* and exited 1; logged in, it opened an
|
|
62
|
+
* interactive picker. Five commands, including the flagship one and the four
|
|
63
|
+
* with the subtlest flag rules — among them the rule a person cannot guess,
|
|
64
|
+
* that flags *after* the project name go to `claude` untouched, documented in
|
|
65
|
+
* the help you could not print (audit 6 §3).
|
|
66
|
+
*/
|
|
67
|
+
describe("ensureSlug", () => {
|
|
68
|
+
it("leaves --help alone instead of asking which project", async () => {
|
|
69
|
+
const { ensureSlug } = await import("../pick-project.js");
|
|
70
|
+
for (const argv of [
|
|
71
|
+
["node", "dockai", "claude", "--help"],
|
|
72
|
+
["node", "dockai", "claude", "-h"],
|
|
73
|
+
["node", "dockai", "push", "--help"],
|
|
74
|
+
]) {
|
|
75
|
+
// Returns untouched, and — the half that matters — never reaches the
|
|
76
|
+
// network, so this resolves with no server and no token.
|
|
77
|
+
await expect(ensureSlug([...argv], [argv[2]])).resolves.toEqual(argv);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=remote.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/remote.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,GAAG;IACd,OAAO;IACP,aAAa;IACb,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,cAAc;IACd,cAAc;IACd,aAAa;IACb,0BAA0B;IAC1B,WAAW;IACX,WAAW;IACX,uBAAuB;IACvB,0BAA0B;CAC3B,CAAC;AAEF,uDAAuD;AACvD,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAEhG,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,EAAE;QAC7D,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,sDAAsD;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,yCAAyC,EAAE,CAAC,KAAK,EAAE,EAAE;QACpE,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,wEAAwE;QACxE,8CAA8C;QAC9C,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI;YACjB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACtC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;YAClC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACrC,EAAE,CAAC;YACF,qEAAqE;YACrE,yDAAyD;YACzD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/lib/fail.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getServerUrl } from "../config.js";
|
|
2
|
+
/**
|
|
3
|
+
* One sentence, never a stack.
|
|
4
|
+
*
|
|
5
|
+
* `start`, `stop` and `ssh-config` called the API outside their `try`, so a
|
|
6
|
+
* server that was down printed twelve lines of `node_modules` paths and an
|
|
7
|
+
* undici frame — while `dockai projects`, in the same situation, printed one
|
|
8
|
+
* sentence. And four commands let a bare `UNAUTHORIZED` or `FORBIDDEN` reach
|
|
9
|
+
* the screen as their entire output (audit 6 §9). `whoami` already did this
|
|
10
|
+
* properly; this is that, in one place.
|
|
11
|
+
*/
|
|
12
|
+
export function explain(err) {
|
|
13
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
14
|
+
if (/fetch failed|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|network|socket hang up/i.test(msg)) {
|
|
15
|
+
return `Could not reach ${getServerUrl()}. Is the server up, and is that the right address? \`dockai login\` sets it.`;
|
|
16
|
+
}
|
|
17
|
+
if (/UNAUTHORIZED|\b401\b/.test(msg))
|
|
18
|
+
return "Your token was rejected. Run `dockai login` again.";
|
|
19
|
+
if (/FORBIDDEN|\b403\b/.test(msg))
|
|
20
|
+
return "Your account is not allowed to do that.";
|
|
21
|
+
if (/NOT_FOUND|\b404\b/.test(msg))
|
|
22
|
+
return "The server does not have that. Check the name with `dockai projects`.";
|
|
23
|
+
if (/TIMEOUT/i.test(msg))
|
|
24
|
+
return "The server took too long to answer.";
|
|
25
|
+
// A tRPC error's own message is written for a person; everything after the
|
|
26
|
+
// first blank line is the stack that used to be the output.
|
|
27
|
+
return msg.split("\n\n")[0].split("\n").slice(0, 3).join("\n");
|
|
28
|
+
}
|
|
29
|
+
/** Print it and stop. */
|
|
30
|
+
export function fail(err, prefix) {
|
|
31
|
+
const detail = explain(err);
|
|
32
|
+
console.error(prefix ? `${prefix}: ${detail}` : detail);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* "No project X. Known projects: …" — the sentence `remote.ts` already gave,
|
|
37
|
+
* everywhere else too.
|
|
38
|
+
*
|
|
39
|
+
* `start`, `stop`, `logs` and `open` each printed `Project "foo" not found.`
|
|
40
|
+
* while holding the very list that would have answered the question
|
|
41
|
+
* (audit 6 §17). A typo is the commonest cause and the list is the fix.
|
|
42
|
+
*/
|
|
43
|
+
export function noSuchProject(slug, projects) {
|
|
44
|
+
const known = projects.map((p) => p.slug).sort().join(", ");
|
|
45
|
+
console.error(`No project "${slug}".${known ? ` Known projects: ${known}` : " You have none yet — create one in the dashboard."}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=fail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fail.js","sourceRoot":"","sources":["../../src/lib/fail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE7D,IAAI,iFAAiF,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChG,OAAO,mBAAmB,YAAY,EAAE,8EAA8E,CAAC;IACzH,CAAC;IACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,oDAAoD,CAAC;IAClG,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,yCAAyC,CAAC;IACpF,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,uEAAuE,CAAC;IAClH,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,qCAAqC,CAAC;IAEvE,2EAA2E;IAC3E,4DAA4D;IAC5D,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,IAAI,CAAC,GAAY,EAAE,MAAe;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAA4B;IACtE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC,mDAAmD,EAAE,CAAC,CAAC;IACnI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/lib/pick-project.js
CHANGED
|
@@ -116,6 +116,13 @@ export async function ensureSlug(argv, commandPath, opts = {}) {
|
|
|
116
116
|
const current = argv[pos];
|
|
117
117
|
if (current && !current.startsWith("-"))
|
|
118
118
|
return argv;
|
|
119
|
+
// `--help` is not a missing project. This pre-pass runs before Commander
|
|
120
|
+
// parses, so `dockai claude --help` asked the *server* for a project list
|
|
121
|
+
// and answered "Not logged in. Run `dockai login` first." — on the flagship
|
|
122
|
+
// command, and on the four with the subtlest flag rules (audit 6 §3).
|
|
123
|
+
// Logged in it was worse: an interactive picker instead of the manual.
|
|
124
|
+
if (argv.slice(pos).some((a) => a === "--help" || a === "-h"))
|
|
125
|
+
return argv;
|
|
119
126
|
const slug = await pickProject();
|
|
120
127
|
return [...argv.slice(0, pos), slug, ...argv.slice(pos)];
|
|
121
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick-project.js","sourceRoot":"","sources":["../../src/lib/pick-project.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pick-project.js","sourceRoot":"","sources":["../../src/lib/pick-project.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/remote.js
CHANGED
|
@@ -3,6 +3,7 @@ import { readdirSync } from "node:fs";
|
|
|
3
3
|
import { userInfo } from "node:os";
|
|
4
4
|
import { createApiClient } from "../api.js";
|
|
5
5
|
import { getToken } from "../config.js";
|
|
6
|
+
import { fail } from "./fail.js";
|
|
6
7
|
/** POSIX single-quote — safe for anything, including quotes themselves. */
|
|
7
8
|
export function sq(s) {
|
|
8
9
|
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
@@ -34,8 +35,16 @@ export async function assertRunning(slug) {
|
|
|
34
35
|
try {
|
|
35
36
|
projects = (await createApiClient().project.list.query());
|
|
36
37
|
}
|
|
37
|
-
catch {
|
|
38
|
-
|
|
38
|
+
catch (err) {
|
|
39
|
+
// A dead token is not an unreachable server. Swallowing *every* failure
|
|
40
|
+
// here sent an expired token through to ssh, and the journey ended at
|
|
41
|
+
// "Is the ssh config block installed?" — the config was fine, the token
|
|
42
|
+
// was dead, and that is the difference between a thirty-second and a
|
|
43
|
+
// thirty-minute debug (audit 6 §10).
|
|
44
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
45
|
+
if (/UNAUTHORIZED|\b401\b|FORBIDDEN|\b403\b/.test(msg))
|
|
46
|
+
fail(err);
|
|
47
|
+
return; // Genuinely unreachable — let ssh produce the error instead.
|
|
39
48
|
}
|
|
40
49
|
const project = projects.find((p) => p.slug === slug);
|
|
41
50
|
if (!project) {
|
package/dist/lib/remote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/lib/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/lib/remote.ts"],"names":[],"mappings":"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"}
|
package/dist/terminal.js
CHANGED
|
@@ -21,14 +21,19 @@ export async function connectTerminal(slug, options = {}) {
|
|
|
21
21
|
process.stdin.setRawMode(true);
|
|
22
22
|
}
|
|
23
23
|
process.stdin.resume();
|
|
24
|
-
//
|
|
24
|
+
// The server starts a session only once it has *both* a session name
|
|
25
|
+
// and a mode, and this sent neither — a `resize` and then silence, so
|
|
26
|
+
// `dockai connect` hung for ten seconds and closed with 1008, exit 0.
|
|
27
|
+
// The combined `init` is the shape the server prefers (audit 6 §3).
|
|
25
28
|
const cols = process.stdout.columns || 80;
|
|
26
29
|
const rows = process.stdout.rows || 24;
|
|
27
|
-
ws.send(JSON.stringify({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
ws.send(JSON.stringify({
|
|
31
|
+
type: "init",
|
|
32
|
+
mode: options.claude ? "claude" : "shell",
|
|
33
|
+
sessionName: options.session ?? `cli-${Math.random().toString(36).slice(2, 8)}`,
|
|
34
|
+
cols,
|
|
35
|
+
rows,
|
|
36
|
+
}));
|
|
32
37
|
// stdin → WebSocket
|
|
33
38
|
process.stdin.on("data", (data) => {
|
|
34
39
|
if (ws.readyState === WebSocket.OPEN) {
|
package/dist/terminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,OAAO,
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/version.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CLI version. Kept in sync with apps/cli/package.json by the release workflow.
|
|
3
3
|
* Hardcoded so it works whether the CLI is run via npx, global install, or local link.
|
|
4
4
|
*/
|
|
5
|
-
export const CLI_VERSION = "0.2.
|
|
5
|
+
export const CLI_VERSION = "0.2.3";
|
|
6
6
|
export function compareSemver(a, b) {
|
|
7
7
|
const pa = a.split(".").map((n) => parseInt(n, 10) || 0);
|
|
8
8
|
const pb = b.split(".").map((n) => parseInt(n, 10) || 0);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dockai",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "CLI for DockAI — self-hosted Claude Code session manager",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Pol Amoros",
|
|
@@ -42,11 +42,14 @@
|
|
|
42
42
|
"@types/node": "^22.19.15",
|
|
43
43
|
"@types/ws": "^8.18.1",
|
|
44
44
|
"tsx": "^4.23.11",
|
|
45
|
-
"typescript": "^7.0.2"
|
|
45
|
+
"typescript": "^7.0.2",
|
|
46
|
+
"vitest": "4.1.10"
|
|
46
47
|
},
|
|
47
48
|
"scripts": {
|
|
48
49
|
"dev": "tsx src/index.ts",
|
|
49
50
|
"build": "tsc",
|
|
50
|
-
"typecheck": "tsc --noEmit"
|
|
51
|
+
"typecheck": "tsc --noEmit",
|
|
52
|
+
"test:run": "vitest run",
|
|
53
|
+
"test": "vitest"
|
|
51
54
|
}
|
|
52
55
|
}
|