@doriandev/devcc 0.1.2 → 0.3.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 +589 -389
- package/bin/devcc.mjs +50 -23
- package/dist/devcc/agents/agents.d.ts +119 -0
- package/dist/devcc/agents/agents.d.ts.map +1 -0
- package/dist/devcc/agents/agents.js +182 -0
- package/dist/devcc/agents/agents.js.map +1 -0
- package/dist/devcc/app/App.d.ts +23 -0
- package/dist/devcc/app/App.d.ts.map +1 -1
- package/dist/devcc/app/App.js +451 -19
- 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 +204 -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 +25 -3
- package/dist/devcc/app/keymap.js.map +1 -1
- package/dist/devcc/automation.d.ts +52 -0
- package/dist/devcc/automation.d.ts.map +1 -0
- package/dist/devcc/automation.js +339 -0
- package/dist/devcc/automation.js.map +1 -0
- package/dist/devcc/cli.d.ts.map +1 -1
- package/dist/devcc/cli.js +73 -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 +33 -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 +71 -3
- package/dist/devcc/core/config.d.ts.map +1 -1
- package/dist/devcc/core/config.js +189 -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 +15 -3
- package/dist/devcc/index.d.ts.map +1 -1
- package/dist/devcc/index.js +14 -2
- package/dist/devcc/index.js.map +1 -1
- package/dist/devcc/init/detect.d.ts +55 -0
- package/dist/devcc/init/detect.d.ts.map +1 -0
- package/dist/devcc/init/detect.js +207 -0
- package/dist/devcc/init/detect.js.map +1 -0
- package/dist/devcc/init/prompt.d.ts +25 -0
- package/dist/devcc/init/prompt.d.ts.map +1 -0
- package/dist/devcc/init/prompt.js +156 -0
- package/dist/devcc/init/prompt.js.map +1 -0
- 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/node.d.ts +11 -0
- package/dist/devcc/services/node.d.ts.map +1 -1
- package/dist/devcc/services/node.js +20 -18
- package/dist/devcc/services/node.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 +58 -2
- 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 +292 -0
- package/src/devcc/app/App.ts +529 -22
- package/src/devcc/app/controlPlaneCommands.ts +227 -0
- package/src/devcc/app/keymap.ts +25 -3
- package/src/devcc/automation.ts +409 -0
- package/src/devcc/cli.ts +77 -3
- package/src/devcc/components/Sidebar.ts +1 -0
- package/src/devcc/components/primitives.ts +3 -0
- package/src/devcc/core/commands.ts +34 -0
- package/src/devcc/core/config.ts +275 -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 +66 -2
- package/src/devcc/init/detect.ts +268 -0
- package/src/devcc/init/prompt.ts +179 -0
- package/src/devcc/platform/launch.ts +125 -0
- package/src/devcc/services/ServiceManager.ts +15 -3
- package/src/devcc/services/node.ts +17 -14
- 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 +84 -2
- package/src/devcc/views/ServicesView.ts +17 -0
- package/src/devcc/views/SystemView.ts +144 -22
- package/src/devcc/views/WorktreesView.ts +270 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/devcc/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACvF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/devcc/core/state.ts"],"names":[],"mappings":"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"}
|
package/dist/devcc/core/state.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EMPTY_ENVIRONMENT } from "../environment/EnvironmentService.js";
|
|
1
2
|
import { EMPTY_GIT_SNAPSHOT } from "../git/GitService.js";
|
|
2
3
|
import { EMPTY_DEPENDENCY_SNAPSHOT } from "../deps/DependencyService.js";
|
|
3
4
|
export const VIEW_IDS = [
|
|
@@ -6,11 +7,13 @@ export const VIEW_IDS = [
|
|
|
6
7
|
"services",
|
|
7
8
|
"scripts",
|
|
8
9
|
"git",
|
|
10
|
+
"worktrees",
|
|
9
11
|
"logs",
|
|
10
12
|
"dependencies",
|
|
11
13
|
"system",
|
|
12
14
|
"settings",
|
|
13
15
|
];
|
|
16
|
+
export const EMPTY_VERIFY = { configured: 0, running: false, steps: [] };
|
|
14
17
|
/** Terminal narrower than this hides the sidebar. */
|
|
15
18
|
export const NARROW_WIDTH = 76;
|
|
16
19
|
/** Terminal shorter than this drops decorative rows. */
|
|
@@ -38,6 +41,9 @@ export function createInitialState(project, width, height) {
|
|
|
38
41
|
scripts: { available: [], runs: {} },
|
|
39
42
|
git: EMPTY_GIT_SNAPSHOT,
|
|
40
43
|
dependencies: EMPTY_DEPENDENCY_SNAPSHOT,
|
|
44
|
+
agents: [],
|
|
45
|
+
environment: EMPTY_ENVIRONMENT,
|
|
46
|
+
verify: EMPTY_VERIFY,
|
|
41
47
|
system: null,
|
|
42
48
|
logSources: [],
|
|
43
49
|
notifications: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/devcc/core/state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/devcc/core/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { TypedEmitter } from "../core/events.js";
|
|
2
|
+
import type { ScopedLogger } from "../utils/logger.js";
|
|
3
|
+
import { type DirenvStatus, type MiseStatus } from "./integrations.js";
|
|
4
|
+
import { type Exec, type ToolDefinition, type ToolStatus, type Which } from "./tools.js";
|
|
5
|
+
export interface EnvironmentSnapshot {
|
|
6
|
+
tools: ToolStatus[];
|
|
7
|
+
mise: MiseStatus;
|
|
8
|
+
direnv: DirenvStatus;
|
|
9
|
+
/** Null until the first detection finishes. */
|
|
10
|
+
checkedAt: Date | null;
|
|
11
|
+
checking: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const EMPTY_ENVIRONMENT: EnvironmentSnapshot;
|
|
14
|
+
export type EnvironmentServiceEvents = {
|
|
15
|
+
"environment:changed": [EnvironmentSnapshot];
|
|
16
|
+
};
|
|
17
|
+
export interface EnvironmentServiceOptions {
|
|
18
|
+
rootDir: string;
|
|
19
|
+
logger?: ScopedLogger;
|
|
20
|
+
tools?: readonly ToolDefinition[];
|
|
21
|
+
/** Injected for tests. */
|
|
22
|
+
run?: Exec;
|
|
23
|
+
which?: Which;
|
|
24
|
+
env?: NodeJS.ProcessEnv;
|
|
25
|
+
exists?: (path: string) => boolean;
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Machine and project environment health.
|
|
30
|
+
*
|
|
31
|
+
* Detection runs asynchronously, every external call has a timeout, and the
|
|
32
|
+
* result is cached until someone asks for a refresh: tool versions change
|
|
33
|
+
* rarely, so there is nothing to poll.
|
|
34
|
+
*/
|
|
35
|
+
export declare class EnvironmentService extends TypedEmitter<EnvironmentServiceEvents> {
|
|
36
|
+
private readonly options;
|
|
37
|
+
private snapshot;
|
|
38
|
+
private pending;
|
|
39
|
+
private readonly run;
|
|
40
|
+
private readonly which;
|
|
41
|
+
private readonly env;
|
|
42
|
+
constructor(options: EnvironmentServiceOptions);
|
|
43
|
+
getSnapshot(): EnvironmentSnapshot;
|
|
44
|
+
/** Detect everything. Concurrent calls share one run. */
|
|
45
|
+
refresh(): Promise<EnvironmentSnapshot>;
|
|
46
|
+
/** The cached snapshot, detecting first if nothing has been checked yet. */
|
|
47
|
+
ensure(): Promise<EnvironmentSnapshot>;
|
|
48
|
+
/**
|
|
49
|
+
* `direnv allow` for this project's `.envrc`. Only ever called from an
|
|
50
|
+
* explicit, confirmed user action - devcc never approves an `.envrc` itself.
|
|
51
|
+
*/
|
|
52
|
+
allowDirenv(): Promise<void>;
|
|
53
|
+
private detect;
|
|
54
|
+
private detectMise;
|
|
55
|
+
private detectDirenv;
|
|
56
|
+
private publish;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=EnvironmentService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentService.d.ts","sourceRoot":"","sources":["../../../src/devcc/environment/EnvironmentService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAKL,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,KAAK,EACX,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,YAAY,CAAA;IACpB,+CAA+C;IAC/C,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,iBAAiB,EAAE,mBAM/B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,qBAAqB,EAAE,CAAC,mBAAmB,CAAC,CAAA;CAC7C,CAAA;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IACjC,0BAA0B;IAC1B,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,wBAAwB,CAAC;IAOhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;gBAEV,OAAO,EAAE,yBAAyB;IAO/D,WAAW,IAAI,mBAAmB;IAIlC,yDAAyD;IACzD,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;IASvC,4EAA4E;IACtE,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI5C;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAoBpB,MAAM;YA2BN,UAAU;YAaV,YAAY;IA8C1B,OAAO,CAAC,OAAO;CAKhB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { TypedEmitter } from "../core/events.js";
|
|
4
|
+
import { DevccError } from "../utils/errors.js";
|
|
5
|
+
import { exec } from "../utils/exec.js";
|
|
6
|
+
import { isDirenvLoaded, MISE_ARGS, miseErrorMessage, parseDirenvStatus, parseMiseLs, } from "./integrations.js";
|
|
7
|
+
import { DEFAULT_TOOLS, detectTool, findExecutable, firstLine, } from "./tools.js";
|
|
8
|
+
export const EMPTY_ENVIRONMENT = {
|
|
9
|
+
tools: [],
|
|
10
|
+
mise: { installed: false, runtimes: [] },
|
|
11
|
+
direnv: { installed: false, approval: "unknown", loaded: null },
|
|
12
|
+
checkedAt: null,
|
|
13
|
+
checking: false,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Machine and project environment health.
|
|
17
|
+
*
|
|
18
|
+
* Detection runs asynchronously, every external call has a timeout, and the
|
|
19
|
+
* result is cached until someone asks for a refresh: tool versions change
|
|
20
|
+
* rarely, so there is nothing to poll.
|
|
21
|
+
*/
|
|
22
|
+
export class EnvironmentService extends TypedEmitter {
|
|
23
|
+
options;
|
|
24
|
+
snapshot = EMPTY_ENVIRONMENT;
|
|
25
|
+
pending = null;
|
|
26
|
+
run;
|
|
27
|
+
which;
|
|
28
|
+
env;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
super();
|
|
31
|
+
this.options = options;
|
|
32
|
+
this.env = options.env ?? process.env;
|
|
33
|
+
this.run = options.run ?? exec;
|
|
34
|
+
this.which = options.which ?? ((command) => findExecutable(command, this.env.PATH ?? ""));
|
|
35
|
+
}
|
|
36
|
+
getSnapshot() {
|
|
37
|
+
return this.snapshot;
|
|
38
|
+
}
|
|
39
|
+
/** Detect everything. Concurrent calls share one run. */
|
|
40
|
+
refresh() {
|
|
41
|
+
if (this.pending)
|
|
42
|
+
return this.pending;
|
|
43
|
+
this.publish({ ...this.snapshot, checking: true });
|
|
44
|
+
this.pending = this.detect().finally(() => {
|
|
45
|
+
this.pending = null;
|
|
46
|
+
});
|
|
47
|
+
return this.pending;
|
|
48
|
+
}
|
|
49
|
+
/** The cached snapshot, detecting first if nothing has been checked yet. */
|
|
50
|
+
async ensure() {
|
|
51
|
+
return this.snapshot.checkedAt ? this.snapshot : this.refresh();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* `direnv allow` for this project's `.envrc`. Only ever called from an
|
|
55
|
+
* explicit, confirmed user action - devcc never approves an `.envrc` itself.
|
|
56
|
+
*/
|
|
57
|
+
async allowDirenv() {
|
|
58
|
+
const { rcPath, installed } = this.snapshot.direnv;
|
|
59
|
+
if (!installed || !rcPath) {
|
|
60
|
+
throw new DevccError({ scope: "system", message: "No .envrc for direnv to allow" });
|
|
61
|
+
}
|
|
62
|
+
const result = await this.run("direnv", ["allow", rcPath], {
|
|
63
|
+
cwd: this.options.rootDir,
|
|
64
|
+
timeoutMs: 10_000,
|
|
65
|
+
logger: this.options.logger,
|
|
66
|
+
});
|
|
67
|
+
if (!result.ok) {
|
|
68
|
+
throw new DevccError({
|
|
69
|
+
scope: "system",
|
|
70
|
+
message: "direnv allow failed",
|
|
71
|
+
detail: result.stderr.trim() || undefined,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
await this.refresh();
|
|
75
|
+
}
|
|
76
|
+
async detect() {
|
|
77
|
+
const startedAt = Date.now();
|
|
78
|
+
const definitions = this.options.tools ?? DEFAULT_TOOLS;
|
|
79
|
+
const tools = await Promise.all(definitions.map((definition) => detectTool(definition, {
|
|
80
|
+
run: (command, args, options) => this.run(command, args, { ...options, logger: this.options.logger }),
|
|
81
|
+
which: this.which,
|
|
82
|
+
timeoutMs: this.options.timeoutMs,
|
|
83
|
+
})));
|
|
84
|
+
const installed = (id) => tools.find((tool) => tool.id === id)?.installed === true;
|
|
85
|
+
const [mise, direnv] = await Promise.all([
|
|
86
|
+
this.detectMise(installed("mise")),
|
|
87
|
+
this.detectDirenv(installed("direnv")),
|
|
88
|
+
]);
|
|
89
|
+
this.options.logger?.debug("environment detected", {
|
|
90
|
+
durationMs: Date.now() - startedAt,
|
|
91
|
+
installed: tools.filter((tool) => tool.installed).map((tool) => tool.id),
|
|
92
|
+
});
|
|
93
|
+
return this.publish({ tools, mise, direnv, checkedAt: new Date(), checking: false });
|
|
94
|
+
}
|
|
95
|
+
async detectMise(installed) {
|
|
96
|
+
if (!installed)
|
|
97
|
+
return { installed: false, runtimes: [] };
|
|
98
|
+
const result = await this.run("mise", MISE_ARGS, {
|
|
99
|
+
cwd: this.options.rootDir,
|
|
100
|
+
timeoutMs: this.options.timeoutMs ?? 5_000,
|
|
101
|
+
// stdin is closed by exec, so mise cannot stop to prompt (e.g. to trust a config).
|
|
102
|
+
logger: this.options.logger,
|
|
103
|
+
});
|
|
104
|
+
if (result.timedOut)
|
|
105
|
+
return { installed: true, runtimes: [], error: "mise did not answer in time" };
|
|
106
|
+
if (!result.ok)
|
|
107
|
+
return { installed: true, runtimes: [], error: miseErrorMessage(result.stderr) };
|
|
108
|
+
return { installed: true, runtimes: parseMiseLs(result.stdout) };
|
|
109
|
+
}
|
|
110
|
+
async detectDirenv(installed) {
|
|
111
|
+
const exists = this.options.exists ?? existsSync;
|
|
112
|
+
const localRc = [".envrc", ".env"]
|
|
113
|
+
.map((name) => join(this.options.rootDir, name))
|
|
114
|
+
.find((path) => exists(path));
|
|
115
|
+
if (!installed) {
|
|
116
|
+
return {
|
|
117
|
+
installed: false,
|
|
118
|
+
rcPath: localRc,
|
|
119
|
+
approval: "unknown",
|
|
120
|
+
loaded: localRc ? false : null,
|
|
121
|
+
error: localRc?.endsWith(".envrc")
|
|
122
|
+
? "direnv is not installed; .envrc is not being loaded"
|
|
123
|
+
: undefined,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const options = {
|
|
127
|
+
cwd: this.options.rootDir,
|
|
128
|
+
timeoutMs: this.options.timeoutMs ?? 5_000,
|
|
129
|
+
logger: this.options.logger,
|
|
130
|
+
};
|
|
131
|
+
let result = await this.run("direnv", ["status", "--json"], options);
|
|
132
|
+
if (!result.ok && !result.timedOut)
|
|
133
|
+
result = await this.run("direnv", ["status"], options);
|
|
134
|
+
if (!result.ok) {
|
|
135
|
+
return {
|
|
136
|
+
installed: true,
|
|
137
|
+
rcPath: localRc,
|
|
138
|
+
approval: "unknown",
|
|
139
|
+
loaded: null,
|
|
140
|
+
error: result.timedOut
|
|
141
|
+
? "direnv did not answer in time"
|
|
142
|
+
: (firstLine(result.stderr) ?? "direnv status failed"),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const parsed = parseDirenvStatus(result.stdout);
|
|
146
|
+
return {
|
|
147
|
+
installed: true,
|
|
148
|
+
rcPath: parsed.rcPath,
|
|
149
|
+
approval: parsed.rcPath ? parsed.approval : "unknown",
|
|
150
|
+
loaded: parsed.rcPath ? isDirenvLoaded(parsed.rcPath, this.env) : null,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
publish(snapshot) {
|
|
154
|
+
this.snapshot = snapshot;
|
|
155
|
+
this.emit("environment:changed", snapshot);
|
|
156
|
+
return snapshot;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=EnvironmentService.js.map
|
|
@@ -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":"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"}
|
|
@@ -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":"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"}
|