@doriandev/devcc 0.1.2 → 0.2.0
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 +556 -386
- package/bin/devcc.mjs +50 -23
- package/dist/devcc/agents/agents.d.ts +112 -0
- package/dist/devcc/agents/agents.d.ts.map +1 -0
- package/dist/devcc/agents/agents.js +179 -0
- package/dist/devcc/agents/agents.js.map +1 -0
- package/dist/devcc/app/App.d.ts +15 -0
- package/dist/devcc/app/App.d.ts.map +1 -1
- package/dist/devcc/app/App.js +326 -17
- package/dist/devcc/app/App.js.map +1 -1
- package/dist/devcc/app/controlPlaneCommands.d.ts +14 -0
- package/dist/devcc/app/controlPlaneCommands.d.ts.map +1 -0
- package/dist/devcc/app/controlPlaneCommands.js +179 -0
- package/dist/devcc/app/controlPlaneCommands.js.map +1 -0
- package/dist/devcc/app/keymap.d.ts.map +1 -1
- package/dist/devcc/app/keymap.js +24 -3
- package/dist/devcc/app/keymap.js.map +1 -1
- package/dist/devcc/automation.d.ts +31 -0
- package/dist/devcc/automation.d.ts.map +1 -0
- package/dist/devcc/automation.js +202 -0
- package/dist/devcc/automation.js.map +1 -0
- package/dist/devcc/cli.d.ts.map +1 -1
- package/dist/devcc/cli.js +46 -3
- package/dist/devcc/cli.js.map +1 -1
- package/dist/devcc/components/Sidebar.d.ts.map +1 -1
- package/dist/devcc/components/Sidebar.js +1 -0
- package/dist/devcc/components/Sidebar.js.map +1 -1
- package/dist/devcc/components/primitives.d.ts.map +1 -1
- package/dist/devcc/components/primitives.js +3 -0
- package/dist/devcc/components/primitives.js.map +1 -1
- package/dist/devcc/core/commands.d.ts +25 -0
- package/dist/devcc/core/commands.d.ts.map +1 -1
- package/dist/devcc/core/commands.js.map +1 -1
- package/dist/devcc/core/config.d.ts +69 -3
- package/dist/devcc/core/config.d.ts.map +1 -1
- package/dist/devcc/core/config.js +185 -5
- package/dist/devcc/core/config.js.map +1 -1
- package/dist/devcc/core/state.d.ts +19 -1
- package/dist/devcc/core/state.d.ts.map +1 -1
- package/dist/devcc/core/state.js +6 -0
- package/dist/devcc/core/state.js.map +1 -1
- package/dist/devcc/environment/EnvironmentService.d.ts +58 -0
- package/dist/devcc/environment/EnvironmentService.d.ts.map +1 -0
- package/dist/devcc/environment/EnvironmentService.js +159 -0
- package/dist/devcc/environment/EnvironmentService.js.map +1 -0
- package/dist/devcc/environment/integrations.d.ts +52 -0
- package/dist/devcc/environment/integrations.d.ts.map +1 -0
- package/dist/devcc/environment/integrations.js +94 -0
- package/dist/devcc/environment/integrations.js.map +1 -0
- package/dist/devcc/environment/tools.d.ts +51 -0
- package/dist/devcc/environment/tools.d.ts.map +1 -0
- package/dist/devcc/environment/tools.js +99 -0
- package/dist/devcc/environment/tools.js.map +1 -0
- package/dist/devcc/git/GitService.d.ts +26 -0
- package/dist/devcc/git/GitService.d.ts.map +1 -1
- package/dist/devcc/git/GitService.js +71 -2
- package/dist/devcc/git/GitService.js.map +1 -1
- package/dist/devcc/git/worktrees.d.ts +88 -0
- package/dist/devcc/git/worktrees.d.ts.map +1 -0
- package/dist/devcc/git/worktrees.js +226 -0
- package/dist/devcc/git/worktrees.js.map +1 -0
- package/dist/devcc/index.d.ts +13 -3
- package/dist/devcc/index.d.ts.map +1 -1
- package/dist/devcc/index.js +11 -1
- package/dist/devcc/index.js.map +1 -1
- package/dist/devcc/platform/launch.d.ts +30 -0
- package/dist/devcc/platform/launch.d.ts.map +1 -0
- package/dist/devcc/platform/launch.js +93 -0
- package/dist/devcc/platform/launch.js.map +1 -0
- package/dist/devcc/services/ServiceManager.d.ts +10 -2
- package/dist/devcc/services/ServiceManager.d.ts.map +1 -1
- package/dist/devcc/services/ServiceManager.js +18 -4
- package/dist/devcc/services/ServiceManager.js.map +1 -1
- package/dist/devcc/services/ollama.d.ts +64 -5
- package/dist/devcc/services/ollama.d.ts.map +1 -1
- package/dist/devcc/services/ollama.js +118 -17
- package/dist/devcc/services/ollama.js.map +1 -1
- package/dist/devcc/services/remote.d.ts +90 -0
- package/dist/devcc/services/remote.d.ts.map +1 -0
- package/dist/devcc/services/remote.js +233 -0
- package/dist/devcc/services/remote.js.map +1 -0
- package/dist/devcc/services/types.d.ts +8 -1
- package/dist/devcc/services/types.d.ts.map +1 -1
- package/dist/devcc/services/types.js.map +1 -1
- package/dist/devcc/utils/exec.d.ts +6 -0
- package/dist/devcc/utils/exec.d.ts.map +1 -1
- package/dist/devcc/utils/exec.js +12 -2
- package/dist/devcc/utils/exec.js.map +1 -1
- package/dist/devcc/verify/verify.d.ts +107 -0
- package/dist/devcc/verify/verify.d.ts.map +1 -0
- package/dist/devcc/verify/verify.js +203 -0
- package/dist/devcc/verify/verify.js.map +1 -0
- package/dist/devcc/views/OverviewView.d.ts.map +1 -1
- package/dist/devcc/views/OverviewView.js +55 -1
- package/dist/devcc/views/OverviewView.js.map +1 -1
- package/dist/devcc/views/ServicesView.d.ts +2 -0
- package/dist/devcc/views/ServicesView.d.ts.map +1 -1
- package/dist/devcc/views/ServicesView.js +15 -0
- package/dist/devcc/views/ServicesView.js.map +1 -1
- package/dist/devcc/views/SystemView.d.ts +10 -1
- package/dist/devcc/views/SystemView.d.ts.map +1 -1
- package/dist/devcc/views/SystemView.js +127 -19
- package/dist/devcc/views/SystemView.js.map +1 -1
- package/dist/devcc/views/WorktreesView.d.ts +48 -0
- package/dist/devcc/views/WorktreesView.d.ts.map +1 -0
- package/dist/devcc/views/WorktreesView.js +235 -0
- package/dist/devcc/views/WorktreesView.js.map +1 -0
- package/package.json +1 -1
- package/src/devcc/agents/agents.ts +282 -0
- package/src/devcc/app/App.ts +376 -20
- package/src/devcc/app/controlPlaneCommands.ts +197 -0
- package/src/devcc/app/keymap.ts +24 -3
- package/src/devcc/automation.ts +242 -0
- package/src/devcc/cli.ts +45 -3
- package/src/devcc/components/Sidebar.ts +1 -0
- package/src/devcc/components/primitives.ts +3 -0
- package/src/devcc/core/commands.ts +26 -0
- package/src/devcc/core/config.ts +271 -11
- package/src/devcc/core/state.ts +25 -0
- package/src/devcc/environment/EnvironmentService.ts +215 -0
- package/src/devcc/environment/integrations.ts +133 -0
- package/src/devcc/environment/tools.ts +151 -0
- package/src/devcc/git/GitService.ts +104 -2
- package/src/devcc/git/worktrees.ts +256 -0
- package/src/devcc/index.ts +57 -2
- package/src/devcc/platform/launch.ts +125 -0
- package/src/devcc/services/ServiceManager.ts +15 -3
- package/src/devcc/services/ollama.ts +162 -19
- package/src/devcc/services/remote.ts +306 -0
- package/src/devcc/services/types.ts +9 -1
- package/src/devcc/utils/exec.ts +26 -2
- package/src/devcc/verify/verify.ts +316 -0
- package/src/devcc/views/OverviewView.ts +76 -1
- package/src/devcc/views/ServicesView.ts +17 -0
- package/src/devcc/views/SystemView.ts +144 -22
- package/src/devcc/views/WorktreesView.ts +270 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentService.js","sourceRoot":"","sources":["../../../src/devcc/environment/EnvironmentService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure parsers for mise and direnv. Both tools offer machine-readable output,
|
|
3
|
+
* so nothing here scrapes their human-oriented formatting.
|
|
4
|
+
*/
|
|
5
|
+
export interface RuntimeVersion {
|
|
6
|
+
tool: string;
|
|
7
|
+
version: string;
|
|
8
|
+
/** What the config asked for, e.g. `22` or `lts`. */
|
|
9
|
+
requested?: string;
|
|
10
|
+
/** Config file that pinned it. */
|
|
11
|
+
source?: string;
|
|
12
|
+
installed: boolean;
|
|
13
|
+
active: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface MiseStatus {
|
|
16
|
+
installed: boolean;
|
|
17
|
+
runtimes: RuntimeVersion[];
|
|
18
|
+
/** Set when mise is installed but could not report (e.g. untrusted config). */
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
/** `mise ls --current --json`: an object keyed by tool name, each an array of version records. */
|
|
22
|
+
export declare const MISE_ARGS: readonly ["ls", "--current", "--json"];
|
|
23
|
+
export declare function parseMiseLs(output: string): RuntimeVersion[];
|
|
24
|
+
/** Turn a failed `mise ls` into a short, actionable message. */
|
|
25
|
+
export declare function miseErrorMessage(stderr: string): string;
|
|
26
|
+
export type DirenvApproval = "allowed" | "not-allowed" | "denied" | "unknown";
|
|
27
|
+
export interface DirenvStatus {
|
|
28
|
+
installed: boolean;
|
|
29
|
+
/** The `.envrc` direnv would load for this project, if any. */
|
|
30
|
+
rcPath?: string;
|
|
31
|
+
approval: DirenvApproval;
|
|
32
|
+
/**
|
|
33
|
+
* Whether devcc's own environment has this `.envrc` loaded (it was started
|
|
34
|
+
* from a direnv-enabled shell in the project). Null when there is nothing to load.
|
|
35
|
+
*/
|
|
36
|
+
loaded: boolean | null;
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse `direnv status --json`, falling back to the plain `direnv status`
|
|
41
|
+
* text for versions without JSON support.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseDirenvStatus(output: string): {
|
|
44
|
+
rcPath?: string;
|
|
45
|
+
approval: DirenvApproval;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* direnv exports `DIRENV_DIR=-<dir>` into shells where it loaded an `.envrc`.
|
|
49
|
+
* If devcc inherited that for this `.envrc`'s directory, the environment is loaded.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isDirenvLoaded(rcPath: string, env?: NodeJS.ProcessEnv): boolean;
|
|
52
|
+
//# sourceMappingURL=integrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/devcc/environment/integrations.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,kGAAkG;AAClG,eAAO,MAAM,SAAS,wCAAyC,CAAA;AAE/D,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CA6B5D;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvD;AAMD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAA;IAClB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB;;;OAGG;IACH,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAiBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAc/F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAI5F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import { firstLine } from "./tools.js";
|
|
3
|
+
/** `mise ls --current --json`: an object keyed by tool name, each an array of version records. */
|
|
4
|
+
export const MISE_ARGS = ["ls", "--current", "--json"];
|
|
5
|
+
export function parseMiseLs(output) {
|
|
6
|
+
let data;
|
|
7
|
+
try {
|
|
8
|
+
data = JSON.parse(output);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
if (typeof data !== "object" || data === null || Array.isArray(data))
|
|
14
|
+
return [];
|
|
15
|
+
const runtimes = [];
|
|
16
|
+
for (const [tool, records] of Object.entries(data)) {
|
|
17
|
+
if (!Array.isArray(records))
|
|
18
|
+
continue;
|
|
19
|
+
for (const record of records) {
|
|
20
|
+
if (typeof record !== "object" || record === null)
|
|
21
|
+
continue;
|
|
22
|
+
const entry = record;
|
|
23
|
+
const version = typeof entry.version === "string" ? entry.version : undefined;
|
|
24
|
+
if (!version)
|
|
25
|
+
continue;
|
|
26
|
+
const source = entry.source;
|
|
27
|
+
runtimes.push({
|
|
28
|
+
tool,
|
|
29
|
+
version,
|
|
30
|
+
requested: typeof entry.requested_version === "string" ? entry.requested_version : undefined,
|
|
31
|
+
source: typeof source?.path === "string" ? source.path : undefined,
|
|
32
|
+
installed: entry.installed !== false,
|
|
33
|
+
active: entry.active === true,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return runtimes.sort((a, b) => a.tool.localeCompare(b.tool));
|
|
38
|
+
}
|
|
39
|
+
/** Turn a failed `mise ls` into a short, actionable message. */
|
|
40
|
+
export function miseErrorMessage(stderr) {
|
|
41
|
+
if (/not trusted/iu.test(stderr))
|
|
42
|
+
return "config is not trusted - run `mise trust` if you expect it";
|
|
43
|
+
return firstLine(stderr.replace(/^mise\s+(ERROR|WARN)\s*/imu, "")) ?? "mise ls failed";
|
|
44
|
+
}
|
|
45
|
+
/** direnv's numeric allow states (`internal/cmd/rc.go`). */
|
|
46
|
+
const APPROVAL_CODES = { 0: "allowed", 1: "not-allowed", 2: "denied" };
|
|
47
|
+
function approvalFrom(value) {
|
|
48
|
+
if (typeof value === "number")
|
|
49
|
+
return APPROVAL_CODES[value] ?? "unknown";
|
|
50
|
+
if (typeof value === "boolean")
|
|
51
|
+
return value ? "allowed" : "not-allowed";
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
const numeric = Number(value);
|
|
54
|
+
if (value.trim() !== "" && Number.isInteger(numeric))
|
|
55
|
+
return APPROVAL_CODES[numeric] ?? "unknown";
|
|
56
|
+
if (value === "true")
|
|
57
|
+
return "allowed";
|
|
58
|
+
if (value === "false")
|
|
59
|
+
return "not-allowed";
|
|
60
|
+
}
|
|
61
|
+
return "unknown";
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse `direnv status --json`, falling back to the plain `direnv status`
|
|
65
|
+
* text for versions without JSON support.
|
|
66
|
+
*/
|
|
67
|
+
export function parseDirenvStatus(output) {
|
|
68
|
+
try {
|
|
69
|
+
const data = JSON.parse(output);
|
|
70
|
+
const found = data.state?.foundRC;
|
|
71
|
+
if (!found || typeof found.path !== "string")
|
|
72
|
+
return { approval: "unknown" };
|
|
73
|
+
return { rcPath: found.path, approval: approvalFrom(found.allowed) };
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Not JSON: older direnv. Fall through to the text format.
|
|
77
|
+
}
|
|
78
|
+
const path = /^Found RC path (.+)$/mu.exec(output)?.[1]?.trim();
|
|
79
|
+
if (!path)
|
|
80
|
+
return { approval: "unknown" };
|
|
81
|
+
const allowed = /^Found RC allowed (.+)$/mu.exec(output)?.[1]?.trim();
|
|
82
|
+
return { rcPath: path, approval: allowed === undefined ? "unknown" : approvalFrom(allowed) };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* direnv exports `DIRENV_DIR=-<dir>` into shells where it loaded an `.envrc`.
|
|
86
|
+
* If devcc inherited that for this `.envrc`'s directory, the environment is loaded.
|
|
87
|
+
*/
|
|
88
|
+
export function isDirenvLoaded(rcPath, env = process.env) {
|
|
89
|
+
const dir = env.DIRENV_DIR;
|
|
90
|
+
if (!dir)
|
|
91
|
+
return false;
|
|
92
|
+
return dir.replace(/^-/u, "") === dirname(rcPath);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../src/devcc/environment/integrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA6BtC,kGAAkG;AAClG,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAA;AAE/D,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,IAAa,CAAA;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IAE/E,MAAM,QAAQ,GAAqB,EAAE,CAAA;IACrC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAQ;QACrC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAQ;YAC3D,MAAM,KAAK,GAAG,MAAiC,CAAA;YAC/C,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;YAC7E,IAAI,CAAC,OAAO;gBAAE,SAAQ;YACtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAA6C,CAAA;YAClE,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,OAAO;gBACP,SAAS,EAAE,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;gBAC5F,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBAClE,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK;gBACpC,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI;aAC9B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,2DAA2D,CAAA;IACpG,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC,IAAI,gBAAgB,CAAA;AACxF,CAAC;AAqBD,4DAA4D;AAC5D,MAAM,cAAc,GAAmC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAA;AAEtG,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,SAAS,CAAA;IACxE,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAA;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,SAAS,CAAA;QACjG,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,SAAS,CAAA;QACtC,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,aAAa,CAAA;IAC7C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2E,CAAA;QACzG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAA;QACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;QAC5E,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IAED,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;IACzC,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;IACrE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAA;AAC9F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IACjF,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAA;IAC1B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ExecOptions, type ExecResult } from "../utils/exec.js";
|
|
2
|
+
/**
|
|
3
|
+
* Tool detection for the Environment panel and `devcc env`.
|
|
4
|
+
*
|
|
5
|
+
* Observation only: devcc reports what is installed and whether it answers, it
|
|
6
|
+
* never installs or upgrades anything. A missing tool is a normal state, not
|
|
7
|
+
* an error.
|
|
8
|
+
*/
|
|
9
|
+
export type ToolHealth = "ready" | "warning" | "error";
|
|
10
|
+
export interface ToolStatus {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
installed: boolean;
|
|
14
|
+
version?: string;
|
|
15
|
+
/** Resolved executable path. */
|
|
16
|
+
path?: string;
|
|
17
|
+
/** Absent when the tool is not installed. */
|
|
18
|
+
status?: ToolHealth;
|
|
19
|
+
message?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ToolDefinition {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
command: string;
|
|
25
|
+
/** Arguments that print a version (default `--version`). */
|
|
26
|
+
versionArgs?: string[];
|
|
27
|
+
/** Capture group 1 is the version; defaults to the first dotted number. */
|
|
28
|
+
versionPattern?: RegExp;
|
|
29
|
+
/** Absolute paths to try when the command is not on PATH (e.g. app bundles). */
|
|
30
|
+
fallbackPaths?: string[];
|
|
31
|
+
}
|
|
32
|
+
export declare const DEFAULT_TOOLS: readonly ToolDefinition[];
|
|
33
|
+
export declare const TOOL_TIMEOUT_MS = 3000;
|
|
34
|
+
/** First `x.y[.z…]` version in the output, or the pattern's first group. */
|
|
35
|
+
export declare function parseVersion(output: string, pattern?: RegExp): string | undefined;
|
|
36
|
+
export type Which = (command: string) => string | undefined;
|
|
37
|
+
/** Look a command up on PATH the way a shell would, without running a shell. */
|
|
38
|
+
export declare function findExecutable(command: string, pathEnv?: string, isExecutable?: (path: string) => boolean): string | undefined;
|
|
39
|
+
export type Exec = (command: string, args: readonly string[], options?: ExecOptions) => Promise<ExecResult>;
|
|
40
|
+
export interface DetectToolDeps {
|
|
41
|
+
run?: Exec;
|
|
42
|
+
which?: Which;
|
|
43
|
+
timeoutMs?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Detect one tool: resolve it on PATH, then ask for its version with a hard
|
|
47
|
+
* timeout. Never throws - every failure becomes diagnostic state.
|
|
48
|
+
*/
|
|
49
|
+
export declare function detectTool(definition: ToolDefinition, deps?: DetectToolDeps): Promise<ToolStatus>;
|
|
50
|
+
export declare function firstLine(text: string): string | undefined;
|
|
51
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/devcc/environment/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE1E;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAEtD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,cAAc,EAoBlD,CAAA;AAED,eAAO,MAAM,eAAe,OAAQ,CAAA;AAEpC,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQjF;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;AAE3D,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAA+B,EACxC,YAAY,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACnD,MAAM,GAAG,SAAS,CAQpB;AAWD,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;AAE3G,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+B3G;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM1D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { accessSync, constants } from "node:fs";
|
|
2
|
+
import { delimiter, isAbsolute, join } from "node:path";
|
|
3
|
+
import { exec } from "../utils/exec.js";
|
|
4
|
+
export const DEFAULT_TOOLS = [
|
|
5
|
+
{ id: "node", name: "Node", command: "node" },
|
|
6
|
+
{ id: "pnpm", name: "pnpm", command: "pnpm" },
|
|
7
|
+
{ id: "npm", name: "npm", command: "npm" },
|
|
8
|
+
{ id: "bun", name: "Bun", command: "bun" },
|
|
9
|
+
{ id: "git", name: "Git", command: "git" },
|
|
10
|
+
{ id: "mise", name: "mise", command: "mise" },
|
|
11
|
+
{ id: "direnv", name: "direnv", command: "direnv", versionArgs: ["version"] },
|
|
12
|
+
{ id: "docker", name: "Docker", command: "docker" },
|
|
13
|
+
{ id: "cargo", name: "Rust/Cargo", command: "cargo" },
|
|
14
|
+
{ id: "claude", name: "Claude Code", command: "claude" },
|
|
15
|
+
{ id: "codex", name: "Codex", command: "codex" },
|
|
16
|
+
{
|
|
17
|
+
id: "tailscale",
|
|
18
|
+
name: "Tailscale",
|
|
19
|
+
command: "tailscale",
|
|
20
|
+
versionArgs: ["version"],
|
|
21
|
+
fallbackPaths: ["/Applications/Tailscale.app/Contents/MacOS/Tailscale"],
|
|
22
|
+
},
|
|
23
|
+
{ id: "ollama", name: "Ollama", command: "ollama" },
|
|
24
|
+
];
|
|
25
|
+
export const TOOL_TIMEOUT_MS = 3_000;
|
|
26
|
+
/** First `x.y[.z…]` version in the output, or the pattern's first group. */
|
|
27
|
+
export function parseVersion(output, pattern) {
|
|
28
|
+
const text = output.trim();
|
|
29
|
+
if (text === "")
|
|
30
|
+
return undefined;
|
|
31
|
+
if (pattern) {
|
|
32
|
+
const match = pattern.exec(text);
|
|
33
|
+
if (match?.[1])
|
|
34
|
+
return match[1];
|
|
35
|
+
}
|
|
36
|
+
return /\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?/u.exec(text)?.[0];
|
|
37
|
+
}
|
|
38
|
+
/** Look a command up on PATH the way a shell would, without running a shell. */
|
|
39
|
+
export function findExecutable(command, pathEnv = process.env.PATH ?? "", isExecutable = canExecute) {
|
|
40
|
+
if (command.includes("/"))
|
|
41
|
+
return isAbsolute(command) && isExecutable(command) ? command : undefined;
|
|
42
|
+
for (const dir of pathEnv.split(delimiter)) {
|
|
43
|
+
if (dir === "")
|
|
44
|
+
continue;
|
|
45
|
+
const candidate = join(dir, command);
|
|
46
|
+
if (isExecutable(candidate))
|
|
47
|
+
return candidate;
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
function canExecute(path) {
|
|
52
|
+
try {
|
|
53
|
+
accessSync(path, constants.X_OK);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Detect one tool: resolve it on PATH, then ask for its version with a hard
|
|
62
|
+
* timeout. Never throws - every failure becomes diagnostic state.
|
|
63
|
+
*/
|
|
64
|
+
export async function detectTool(definition, deps = {}) {
|
|
65
|
+
const which = deps.which ?? ((command) => findExecutable(command));
|
|
66
|
+
const run = deps.run ?? exec;
|
|
67
|
+
const timeoutMs = deps.timeoutMs ?? TOOL_TIMEOUT_MS;
|
|
68
|
+
const base = { id: definition.id, name: definition.name };
|
|
69
|
+
const path = which(definition.command) ?? definition.fallbackPaths?.find((candidate) => which(candidate) !== undefined);
|
|
70
|
+
if (!path)
|
|
71
|
+
return { ...base, installed: false, message: "not installed" };
|
|
72
|
+
let result;
|
|
73
|
+
try {
|
|
74
|
+
result = await run(path, definition.versionArgs ?? ["--version"], { timeoutMs });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return { ...base, installed: true, path, status: "error", message: String(error) };
|
|
78
|
+
}
|
|
79
|
+
if (result.timedOut) {
|
|
80
|
+
return { ...base, installed: true, path, status: "warning", message: `no answer within ${timeoutMs}ms` };
|
|
81
|
+
}
|
|
82
|
+
if (result.spawnError) {
|
|
83
|
+
return { ...base, installed: true, path, status: "error", message: result.spawnError.message };
|
|
84
|
+
}
|
|
85
|
+
if (!result.ok) {
|
|
86
|
+
const reason = firstLine(result.stderr) ?? firstLine(result.stdout) ?? `exited with code ${result.code ?? "?"}`;
|
|
87
|
+
return { ...base, installed: true, path, status: "error", message: reason };
|
|
88
|
+
}
|
|
89
|
+
const version = parseVersion(result.stdout || result.stderr, definition.versionPattern);
|
|
90
|
+
return { ...base, installed: true, path, version, status: "ready" };
|
|
91
|
+
}
|
|
92
|
+
export function firstLine(text) {
|
|
93
|
+
const line = text
|
|
94
|
+
.split("\n")
|
|
95
|
+
.map((entry) => entry.trim())
|
|
96
|
+
.find((entry) => entry !== "");
|
|
97
|
+
return line;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/devcc/environment/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,IAAI,EAAqC,MAAM,kBAAkB,CAAA;AAoC1E,MAAM,CAAC,MAAM,aAAa,GAA8B;IACtD,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAC7C,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;IAC1C,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;IAC1C,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;IAC1C,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAC7C,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE;IAC7E,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;IACnD,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;IACrD,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;IACxD,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;IAChD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,CAAC,SAAS,CAAC;QACxB,aAAa,EAAE,CAAC,sDAAsD,CAAC;KACxE;IACD,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;CACpD,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA;AAEpC,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAgB;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACrE,CAAC;AAID,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,UAAkB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EACxC,eAA0C,UAAU;IAEpD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IACpG,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,IAAI,GAAG,KAAK,EAAE;YAAE,SAAQ;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACpC,IAAI,YAAY,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAC/C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA0B,EAAE,OAAuB,EAAE;IACpF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAA;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,CAAA;IACnD,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAA;IAEzD,MAAM,IAAI,GACR,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAA;IAC5G,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IAEzE,IAAI,MAAkB,CAAA;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,SAAS,IAAI,EAAE,CAAA;IAC1G,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAA;IAChG,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,MAAM,GACV,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,oBAAoB,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;QAClG,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC,CAAA;IACvF,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,IAAI;SACd,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;IAChC,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -2,17 +2,27 @@ import { TypedEmitter } from "../core/events.js";
|
|
|
2
2
|
import { DevccError } from "../utils/errors.js";
|
|
3
3
|
import type { ScopedLogger } from "../utils/logger.js";
|
|
4
4
|
import { type GitCommit, type GitStatus } from "./parse.js";
|
|
5
|
+
import { type GitWorktree } from "./worktrees.js";
|
|
5
6
|
export interface GitSnapshot {
|
|
6
7
|
available: boolean;
|
|
7
8
|
isRepository: boolean;
|
|
8
9
|
status: GitStatus;
|
|
9
10
|
commits: GitCommit[];
|
|
11
|
+
/** Every worktree of the repository, current one flagged. Empty outside a repo. */
|
|
12
|
+
worktrees: GitWorktree[];
|
|
10
13
|
version: string | null;
|
|
11
14
|
lastRefreshedAt: Date | null;
|
|
12
15
|
/** Set when the last refresh failed; the previous snapshot is kept. */
|
|
13
16
|
error: string | null;
|
|
14
17
|
}
|
|
15
18
|
export declare const EMPTY_GIT_SNAPSHOT: GitSnapshot;
|
|
19
|
+
export interface CreateWorktreeInput {
|
|
20
|
+
branch: string;
|
|
21
|
+
/** Start point when the branch does not exist yet (default: HEAD). */
|
|
22
|
+
base?: string;
|
|
23
|
+
/** Absolute destination directory. */
|
|
24
|
+
path: string;
|
|
25
|
+
}
|
|
16
26
|
export type GitServiceEvents = {
|
|
17
27
|
"git:changed": [GitSnapshot];
|
|
18
28
|
"git:error": [DevccError];
|
|
@@ -51,9 +61,25 @@ export declare class GitService extends TypedEmitter<GitServiceEvents> {
|
|
|
51
61
|
/** Destructive: throws away worktree changes. Callers must confirm first. */
|
|
52
62
|
discard(paths: readonly string[]): Promise<void>;
|
|
53
63
|
commit(message: string): Promise<void>;
|
|
64
|
+
/** Fresh worktree list, independent of the polling snapshot. */
|
|
65
|
+
listWorktrees(): Promise<GitWorktree[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Create a worktree. An existing local branch is checked out; otherwise the
|
|
68
|
+
* branch is created from `base` (default HEAD). Input is validated before git
|
|
69
|
+
* runs, and git's own ref check has the final word on the branch name.
|
|
70
|
+
*/
|
|
71
|
+
createWorktree(input: CreateWorktreeInput): Promise<string>;
|
|
72
|
+
/**
|
|
73
|
+
* Remove a worktree without `--force`. devcc refuses the main and current
|
|
74
|
+
* worktrees and ones with running work (`busy`); git refuses dirty ones, and
|
|
75
|
+
* that refusal is surfaced verbatim rather than overridden.
|
|
76
|
+
*/
|
|
77
|
+
removeWorktree(path: string, busy?: readonly string[]): Promise<void>;
|
|
54
78
|
/** Read-only diff for the inspect panel. */
|
|
55
79
|
diff(path: string, staged: boolean): Promise<string>;
|
|
56
80
|
private mutate;
|
|
81
|
+
/** Real path of the project root, so git's resolved paths compare equal (macOS /var -> /private/var). */
|
|
82
|
+
private currentPath;
|
|
57
83
|
private git;
|
|
58
84
|
private publish;
|
|
59
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitService.d.ts","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"GitService.d.ts","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { TypedEmitter } from "../core/events.js";
|
|
2
2
|
import { DevccError } from "../utils/errors.js";
|
|
3
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
4
|
+
import { resolve } from "node:path";
|
|
3
5
|
import { exec } from "../utils/exec.js";
|
|
4
6
|
import { EMPTY_GIT_STATUS, LOG_FORMAT, parseCommits, parsePorcelainV2, } from "./parse.js";
|
|
7
|
+
import { parseWorktreeList, removalBlocker, validateBranchName, validateRef, validateWorktreePath, worktreeAddArgs, worktreeRemoveArgs, } from "./worktrees.js";
|
|
5
8
|
export const EMPTY_GIT_SNAPSHOT = {
|
|
6
9
|
available: false,
|
|
7
10
|
isRepository: false,
|
|
8
11
|
status: EMPTY_GIT_STATUS,
|
|
9
12
|
commits: [],
|
|
13
|
+
worktrees: [],
|
|
10
14
|
version: null,
|
|
11
15
|
lastRefreshedAt: null,
|
|
12
16
|
error: null,
|
|
@@ -43,10 +47,11 @@ export class GitService extends TypedEmitter {
|
|
|
43
47
|
return this.refreshing;
|
|
44
48
|
}
|
|
45
49
|
async doRefresh() {
|
|
46
|
-
const [versionResult, statusResult, logResult] = await Promise.all([
|
|
50
|
+
const [versionResult, statusResult, logResult, worktreeResult] = await Promise.all([
|
|
47
51
|
this.git(["--version"]),
|
|
48
52
|
this.git(["status", "--porcelain=v2", "--branch", "--untracked-files=all"]),
|
|
49
53
|
this.git(["log", `--max-count=${this.commitLimit}`, `--pretty=format:${LOG_FORMAT}`]),
|
|
54
|
+
this.git(["worktree", "list", "--porcelain"]),
|
|
50
55
|
]);
|
|
51
56
|
const available = versionResult.spawnError === undefined;
|
|
52
57
|
if (!available) {
|
|
@@ -66,6 +71,7 @@ export class GitService extends TypedEmitter {
|
|
|
66
71
|
isRepository: false,
|
|
67
72
|
status: EMPTY_GIT_STATUS,
|
|
68
73
|
commits: [],
|
|
74
|
+
worktrees: [],
|
|
69
75
|
version,
|
|
70
76
|
lastRefreshedAt: new Date(),
|
|
71
77
|
error: notARepo ? null : statusResult.stderr.trim() || "git status failed",
|
|
@@ -77,6 +83,7 @@ export class GitService extends TypedEmitter {
|
|
|
77
83
|
status: parsePorcelainV2(statusResult.stdout),
|
|
78
84
|
// A fresh repository with no commits fails `git log`; an empty list is correct there.
|
|
79
85
|
commits: logResult.ok ? parseCommits(logResult.stdout) : [],
|
|
86
|
+
worktrees: worktreeResult.ok ? parseWorktreeList(worktreeResult.stdout, this.currentPath()) : [],
|
|
80
87
|
version,
|
|
81
88
|
lastRefreshedAt: new Date(),
|
|
82
89
|
error: null,
|
|
@@ -118,6 +125,55 @@ export class GitService extends TypedEmitter {
|
|
|
118
125
|
}
|
|
119
126
|
await this.mutate(["commit", "--message", trimmed], "git commit");
|
|
120
127
|
}
|
|
128
|
+
/** Fresh worktree list, independent of the polling snapshot. */
|
|
129
|
+
async listWorktrees() {
|
|
130
|
+
const result = await this.git(["worktree", "list", "--porcelain"]);
|
|
131
|
+
if (!result.ok) {
|
|
132
|
+
throw new DevccError({
|
|
133
|
+
scope: "git",
|
|
134
|
+
message: "git worktree list failed",
|
|
135
|
+
detail: result.stderr.trim() || (result.spawnError ? "git executable not found" : undefined),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return parseWorktreeList(result.stdout, this.currentPath());
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create a worktree. An existing local branch is checked out; otherwise the
|
|
142
|
+
* branch is created from `base` (default HEAD). Input is validated before git
|
|
143
|
+
* runs, and git's own ref check has the final word on the branch name.
|
|
144
|
+
*/
|
|
145
|
+
async createWorktree(input) {
|
|
146
|
+
const branch = input.branch.trim();
|
|
147
|
+
const base = input.base?.trim() || undefined;
|
|
148
|
+
const path = resolve(input.path.trim());
|
|
149
|
+
const problem = validateBranchName(branch) ??
|
|
150
|
+
(base ? validateRef(base) : null) ??
|
|
151
|
+
validateWorktreePath(path, existsSync);
|
|
152
|
+
if (problem)
|
|
153
|
+
throw new DevccError({ scope: "git", message: problem });
|
|
154
|
+
const refCheck = await this.git(["check-ref-format", "--branch", branch]);
|
|
155
|
+
if (!refCheck.ok) {
|
|
156
|
+
throw new DevccError({ scope: "git", message: `"${branch}" is not a valid branch name` });
|
|
157
|
+
}
|
|
158
|
+
const existing = await this.git(["show-ref", "--verify", "--quiet", `refs/heads/${branch}`]);
|
|
159
|
+
const createBranch = !existing.ok;
|
|
160
|
+
await this.mutate(worktreeAddArgs({ path, branch, base: createBranch ? base : undefined, createBranch }), "git worktree add", 60_000);
|
|
161
|
+
return path;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Remove a worktree without `--force`. devcc refuses the main and current
|
|
165
|
+
* worktrees and ones with running work (`busy`); git refuses dirty ones, and
|
|
166
|
+
* that refusal is surfaced verbatim rather than overridden.
|
|
167
|
+
*/
|
|
168
|
+
async removeWorktree(path, busy = []) {
|
|
169
|
+
const target = (await this.listWorktrees()).find((worktree) => worktree.path === path);
|
|
170
|
+
if (!target)
|
|
171
|
+
throw new DevccError({ scope: "git", message: `${path} is not a worktree of this repository` });
|
|
172
|
+
const blocker = removalBlocker(target, busy);
|
|
173
|
+
if (blocker)
|
|
174
|
+
throw new DevccError({ scope: "git", message: blocker });
|
|
175
|
+
await this.mutate(worktreeRemoveArgs(target.path), "git worktree remove");
|
|
176
|
+
}
|
|
121
177
|
/** Read-only diff for the inspect panel. */
|
|
122
178
|
async diff(path, staged) {
|
|
123
179
|
const args = ["--no-pager", "diff", "--no-color"];
|
|
@@ -132,9 +188,12 @@ export class GitService extends TypedEmitter {
|
|
|
132
188
|
if (!result.ok) {
|
|
133
189
|
const detail = [result.stdout, result.stderr].filter(Boolean).join("\n").trim();
|
|
134
190
|
this.options.logger.warn(`${label} failed`, { code: result.code, detail });
|
|
191
|
+
// Prefer git's fatal/error line: progress chatter ("Preparing worktree…") can come first.
|
|
192
|
+
const lines = detail.split("\n");
|
|
193
|
+
const reason = (lines.find((line) => /^(fatal|error): /u.test(line)) ?? lines[0])?.replace(/^(fatal|error): /u, "");
|
|
135
194
|
const error = new DevccError({
|
|
136
195
|
scope: "git",
|
|
137
|
-
message: `${label} failed`,
|
|
196
|
+
message: reason ? `${label} failed: ${reason}` : `${label} failed`,
|
|
138
197
|
detail: detail || (result.timedOut ? "timed out" : undefined),
|
|
139
198
|
});
|
|
140
199
|
this.emit("git:error", error);
|
|
@@ -143,10 +202,20 @@ export class GitService extends TypedEmitter {
|
|
|
143
202
|
this.options.logger.info(`${label} ok`);
|
|
144
203
|
await this.refresh();
|
|
145
204
|
}
|
|
205
|
+
/** Real path of the project root, so git's resolved paths compare equal (macOS /var -> /private/var). */
|
|
206
|
+
currentPath() {
|
|
207
|
+
try {
|
|
208
|
+
return realpathSync(this.options.rootDir);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return resolve(this.options.rootDir);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
146
214
|
git(args, timeoutMs) {
|
|
147
215
|
return exec("git", args, {
|
|
148
216
|
cwd: this.options.rootDir,
|
|
149
217
|
timeoutMs: timeoutMs ?? this.timeoutMs,
|
|
218
|
+
logger: this.options.logger,
|
|
150
219
|
// Never let git open an editor or a credential prompt under the TUI.
|
|
151
220
|
env: { ...process.env, GIT_TERMINAL_PROMPT: "0", GIT_OPTIONAL_LOCKS: "0", GIT_EDITOR: "true" },
|
|
152
221
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitService.js","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAA;AAExD,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,gBAAgB,GAGjB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"GitService.js","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"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"}
|