dockai 0.2.5 → 0.2.7
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 +13 -5
- package/dist/commands/accounts.js +28 -12
- package/dist/commands/accounts.js.map +1 -1
- package/dist/commands/claude.js +3 -5
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/completion.js +129 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/doctor.js +159 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/logs.js +33 -2
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/sessions.js +6 -14
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/ssh-config.js +10 -0
- package/dist/commands/ssh-config.js.map +1 -1
- package/dist/commands/start-stop.js +32 -0
- package/dist/commands/start-stop.js.map +1 -1
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/accounts.test.js +1 -10
- package/dist/lib/__tests__/accounts.test.js.map +1 -1
- package/dist/lib/__tests__/doctor.test.js +41 -0
- package/dist/lib/__tests__/doctor.test.js.map +1 -0
- package/dist/lib/__tests__/git-remote.test.js +26 -0
- package/dist/lib/__tests__/git-remote.test.js.map +1 -0
- package/dist/lib/__tests__/recent.test.js +11 -0
- package/dist/lib/__tests__/recent.test.js.map +1 -1
- package/dist/lib/__tests__/select.test.js +50 -0
- package/dist/lib/__tests__/select.test.js.map +1 -0
- package/dist/lib/accounts.js +1 -19
- package/dist/lib/accounts.js.map +1 -1
- package/dist/lib/follow.js +32 -0
- package/dist/lib/follow.js.map +1 -0
- package/dist/lib/format.js +71 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/git-remote.js +42 -0
- package/dist/lib/git-remote.js.map +1 -0
- package/dist/lib/pick-project.js +7 -89
- package/dist/lib/pick-project.js.map +1 -1
- package/dist/lib/recent.js +12 -5
- package/dist/lib/recent.js.map +1 -1
- package/dist/lib/remote.js +21 -0
- package/dist/lib/remote.js.map +1 -1
- package/dist/lib/select.js +148 -0
- package/dist/lib/select.js.map +1 -0
- package/dist/lib/update-check.js +92 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* "A newer dockai exists" — one dim line on stderr, at most once a day.
|
|
6
|
+
*
|
|
7
|
+
* A laptop ran 0.1.0 for five weeks behind a symlink into a stale checkout,
|
|
8
|
+
* with 0.2.5 on npm, and nothing said so until a feature was missing
|
|
9
|
+
* (2026-09-23). The registry is asked at most once a day, in the background,
|
|
10
|
+
* with a short deadline; the answer is kept and the line printed from it,
|
|
11
|
+
* so no command waits on the network for this.
|
|
12
|
+
*/
|
|
13
|
+
const FILE = path.join(homedir(), ".config", "dockai", "update-check.json");
|
|
14
|
+
const DAY = 86_400_000;
|
|
15
|
+
/** -1, 0 or 1, comparing dotted numeric versions; pre-release tags lose. */
|
|
16
|
+
export function compareVersions(a, b) {
|
|
17
|
+
const parse = (v) => {
|
|
18
|
+
const [core, pre] = v.replace(/^v/, "").split("-", 2);
|
|
19
|
+
return { nums: core.split(".").map((n) => Number.parseInt(n, 10) || 0), pre: pre ?? null };
|
|
20
|
+
};
|
|
21
|
+
const x = parse(a);
|
|
22
|
+
const y = parse(b);
|
|
23
|
+
for (let i = 0; i < Math.max(x.nums.length, y.nums.length); i++) {
|
|
24
|
+
const d = (x.nums[i] ?? 0) - (y.nums[i] ?? 0);
|
|
25
|
+
if (d)
|
|
26
|
+
return d > 0 ? 1 : -1;
|
|
27
|
+
}
|
|
28
|
+
if (x.pre === y.pre)
|
|
29
|
+
return 0;
|
|
30
|
+
if (x.pre === null)
|
|
31
|
+
return 1;
|
|
32
|
+
if (y.pre === null)
|
|
33
|
+
return -1;
|
|
34
|
+
return x.pre > y.pre ? 1 : -1;
|
|
35
|
+
}
|
|
36
|
+
export function updateNotice(current, latest) {
|
|
37
|
+
if (!latest || compareVersions(latest, current) <= 0)
|
|
38
|
+
return null;
|
|
39
|
+
return `\x1b[2mdockai ${latest} is available (you have ${current}) — npm i -g dockai\x1b[22m`;
|
|
40
|
+
}
|
|
41
|
+
function read(file) {
|
|
42
|
+
try {
|
|
43
|
+
return existsSync(file) ? JSON.parse(readFileSync(file, "utf8")) : null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** The latest version on npm, or null; never throws, never waits long. */
|
|
50
|
+
export async function fetchLatest(timeoutMs = 1500) {
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch("https://registry.npmjs.org/dockai/latest", { signal: AbortSignal.timeout(timeoutMs) });
|
|
53
|
+
if (!res.ok)
|
|
54
|
+
return null;
|
|
55
|
+
const body = (await res.json());
|
|
56
|
+
return typeof body.version === "string" ? body.version : null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Print the notice from what is known, and refresh what is known when it is
|
|
64
|
+
* a day old. Skipped where a stray line would do harm: not a terminal, the
|
|
65
|
+
* ssh ProxyCommand transport (its stderr is ssh's), completion, JSON output,
|
|
66
|
+
* or DOCKAI_NO_UPDATE_CHECK set.
|
|
67
|
+
*/
|
|
68
|
+
export function checkForUpdate(current, argv, file = FILE) {
|
|
69
|
+
if (process.env.DOCKAI_NO_UPDATE_CHECK || process.env.CI)
|
|
70
|
+
return;
|
|
71
|
+
if (!process.stderr.isTTY)
|
|
72
|
+
return;
|
|
73
|
+
const cmd = argv[2];
|
|
74
|
+
if (!cmd || cmd === "proxy" || cmd.startsWith("__") || cmd === "completion" || argv.includes("--json"))
|
|
75
|
+
return;
|
|
76
|
+
const cache = read(file);
|
|
77
|
+
const notice = updateNotice(current, cache?.latest ?? null);
|
|
78
|
+
if (notice)
|
|
79
|
+
process.stderr.write(`${notice}\n`);
|
|
80
|
+
if (cache && Date.now() - cache.checkedAt < DAY)
|
|
81
|
+
return;
|
|
82
|
+
void fetchLatest().then((latest) => {
|
|
83
|
+
try {
|
|
84
|
+
mkdirSync(path.dirname(file), { recursive: true });
|
|
85
|
+
writeFileSync(file, JSON.stringify({ checkedAt: Date.now(), latest: latest ?? cache?.latest ?? null }));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
/* a read-only home is not a reason to fail anything */
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.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.7";
|
|
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);
|