@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,233 @@
|
|
|
1
|
+
import { findExecutable, firstLine } from "../environment/tools.js";
|
|
2
|
+
import { exec, probeTcpPort } from "../utils/exec.js";
|
|
3
|
+
/**
|
|
4
|
+
* Remote development machines and Tailscale.
|
|
5
|
+
*
|
|
6
|
+
* Both are observed, never managed: devcc resolves hosts through the user's own
|
|
7
|
+
* SSH configuration, checks reachability, and reads Tailscale's structured
|
|
8
|
+
* status. Opening a session is a separate, explicit action (see `platform/`).
|
|
9
|
+
*/
|
|
10
|
+
const REMOTE_REFRESH_MS = 60_000;
|
|
11
|
+
const TAILSCALE_REFRESH_MS = 30_000;
|
|
12
|
+
/** Arguments for `ssh -G`, which prints the effective config without connecting. */
|
|
13
|
+
export function sshConfigArgs(machine) {
|
|
14
|
+
const args = ["-G"];
|
|
15
|
+
if (machine.port)
|
|
16
|
+
args.push("-p", String(machine.port));
|
|
17
|
+
if (machine.user)
|
|
18
|
+
args.push("-l", machine.user);
|
|
19
|
+
args.push(machine.host);
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
/** Parse the `key value` lines of `ssh -G`. */
|
|
23
|
+
export function parseSshConfig(output) {
|
|
24
|
+
const target = {};
|
|
25
|
+
for (const line of output.split("\n")) {
|
|
26
|
+
const [key, ...rest] = line.trim().split(/\s+/u);
|
|
27
|
+
const value = rest.join(" ");
|
|
28
|
+
if (!value)
|
|
29
|
+
continue;
|
|
30
|
+
if (key === "hostname")
|
|
31
|
+
target.hostname = value;
|
|
32
|
+
else if (key === "port" && Number.isInteger(Number(value)))
|
|
33
|
+
target.port = Number(value);
|
|
34
|
+
else if (key === "user")
|
|
35
|
+
target.user = value;
|
|
36
|
+
}
|
|
37
|
+
return target;
|
|
38
|
+
}
|
|
39
|
+
/** The destination `ssh` should connect to: the alias, so the user's config applies in full. */
|
|
40
|
+
export function sshDestination(machine) {
|
|
41
|
+
return machine.user ? `${machine.user}@${machine.host}` : machine.host;
|
|
42
|
+
}
|
|
43
|
+
function asNode(value) {
|
|
44
|
+
if (typeof value !== "object" || value === null)
|
|
45
|
+
return undefined;
|
|
46
|
+
const node = value;
|
|
47
|
+
return {
|
|
48
|
+
hostName: typeof node.HostName === "string" ? node.HostName : "",
|
|
49
|
+
dnsName: typeof node.DNSName === "string" ? node.DNSName.replace(/\.$/u, "") : "",
|
|
50
|
+
ips: Array.isArray(node.TailscaleIPs)
|
|
51
|
+
? node.TailscaleIPs.filter((ip) => typeof ip === "string")
|
|
52
|
+
: [],
|
|
53
|
+
online: node.Online === true,
|
|
54
|
+
os: typeof node.OS === "string" ? node.OS : undefined,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Parse `tailscale status --json`. Returns null for output that is not a status object. */
|
|
58
|
+
export function parseTailscaleStatus(output) {
|
|
59
|
+
let data;
|
|
60
|
+
try {
|
|
61
|
+
data = JSON.parse(output);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (typeof data !== "object" || data === null)
|
|
67
|
+
return null;
|
|
68
|
+
const status = data;
|
|
69
|
+
const backendState = typeof status.BackendState === "string" ? status.BackendState : "Unknown";
|
|
70
|
+
const peerRecord = typeof status.Peer === "object" && status.Peer !== null ? status.Peer : {};
|
|
71
|
+
const tailnet = status.CurrentTailnet?.Name;
|
|
72
|
+
return {
|
|
73
|
+
backendState,
|
|
74
|
+
connected: backendState === "Running",
|
|
75
|
+
self: asNode(status.Self),
|
|
76
|
+
peers: Object.values(peerRecord)
|
|
77
|
+
.map(asNode)
|
|
78
|
+
.filter((node) => node !== undefined),
|
|
79
|
+
tailnet: typeof tailnet === "string" ? tailnet : undefined,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Find the tailnet peer a configured host refers to: MagicDNS name, short name, host name or IP. */
|
|
83
|
+
export function findTailscalePeer(status, host) {
|
|
84
|
+
const wanted = host.toLowerCase().replace(/\.$/u, "");
|
|
85
|
+
return status.peers.find((peer) => {
|
|
86
|
+
const dns = peer.dnsName.toLowerCase();
|
|
87
|
+
return (dns === wanted ||
|
|
88
|
+
dns.split(".")[0] === wanted ||
|
|
89
|
+
peer.hostName.toLowerCase() === wanted ||
|
|
90
|
+
peer.ips.includes(host));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const TAILSCALE_APP_CLI = "/Applications/Tailscale.app/Contents/MacOS/Tailscale";
|
|
94
|
+
export class TailscaleService {
|
|
95
|
+
options;
|
|
96
|
+
id = "tailscale";
|
|
97
|
+
name = "Tailscale";
|
|
98
|
+
category = "remote";
|
|
99
|
+
refreshIntervalMs = TAILSCALE_REFRESH_MS;
|
|
100
|
+
run;
|
|
101
|
+
which;
|
|
102
|
+
last = null;
|
|
103
|
+
constructor(options = {}) {
|
|
104
|
+
this.options = options;
|
|
105
|
+
this.run = options.run ?? exec;
|
|
106
|
+
this.which = options.which ?? ((command) => findExecutable(command));
|
|
107
|
+
}
|
|
108
|
+
/** The most recent parsed status, for remote machines to look up peers. */
|
|
109
|
+
getLastStatus() {
|
|
110
|
+
return this.last;
|
|
111
|
+
}
|
|
112
|
+
command() {
|
|
113
|
+
return this.which("tailscale") ?? this.which(TAILSCALE_APP_CLI);
|
|
114
|
+
}
|
|
115
|
+
async detect() {
|
|
116
|
+
return this.command() !== undefined;
|
|
117
|
+
}
|
|
118
|
+
async getStatus() {
|
|
119
|
+
const checkedAt = new Date();
|
|
120
|
+
const command = this.command();
|
|
121
|
+
if (!command)
|
|
122
|
+
return { state: "unavailable", detail: "not installed", checkedAt };
|
|
123
|
+
const result = await this.run(command, ["status", "--json"], {
|
|
124
|
+
timeoutMs: 4_000,
|
|
125
|
+
logger: this.options.logger,
|
|
126
|
+
});
|
|
127
|
+
const status = parseTailscaleStatus(result.stdout);
|
|
128
|
+
this.last = status;
|
|
129
|
+
if (!status) {
|
|
130
|
+
const reason = result.timedOut ? "no answer" : (firstLine(result.stderr) ?? "status unavailable");
|
|
131
|
+
return { state: "unknown", detail: reason, checkedAt };
|
|
132
|
+
}
|
|
133
|
+
const items = [];
|
|
134
|
+
for (const machine of this.options.machines ?? []) {
|
|
135
|
+
const peer = findTailscalePeer(status, machine.host);
|
|
136
|
+
if (!peer)
|
|
137
|
+
continue;
|
|
138
|
+
items.push({
|
|
139
|
+
name: machine.name,
|
|
140
|
+
state: peer.online ? "running" : "stopped",
|
|
141
|
+
detail: `${peer.dnsName || peer.hostName} · ${peer.online ? "online" : "offline"}`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (!status.connected) {
|
|
145
|
+
return { state: "stopped", detail: `disconnected (${status.backendState})`, items, checkedAt };
|
|
146
|
+
}
|
|
147
|
+
const online = status.peers.filter((peer) => peer.online).length;
|
|
148
|
+
return {
|
|
149
|
+
state: "running",
|
|
150
|
+
endpoint: status.self?.dnsName || status.self?.ips[0],
|
|
151
|
+
detail: `connected · ${online}/${status.peers.length} peers online`,
|
|
152
|
+
items,
|
|
153
|
+
checkedAt,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function remoteServiceId(machineId) {
|
|
158
|
+
return `remote:${machineId}`;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A configured remote machine as a service: reachability of its SSH port, the
|
|
162
|
+
* effective target from `ssh -G`, Tailscale presence and associated services.
|
|
163
|
+
* It connects to nothing but the TCP port, and only once a minute while polling.
|
|
164
|
+
*/
|
|
165
|
+
export class RemoteMachineService {
|
|
166
|
+
options;
|
|
167
|
+
id;
|
|
168
|
+
name;
|
|
169
|
+
category = "remote";
|
|
170
|
+
refreshIntervalMs = REMOTE_REFRESH_MS;
|
|
171
|
+
run;
|
|
172
|
+
probe;
|
|
173
|
+
target = null;
|
|
174
|
+
constructor(options) {
|
|
175
|
+
this.options = options;
|
|
176
|
+
this.id = remoteServiceId(options.machine.id);
|
|
177
|
+
this.name = options.machine.name;
|
|
178
|
+
this.run = options.run ?? exec;
|
|
179
|
+
this.probe = options.probe ?? probeTcpPort;
|
|
180
|
+
}
|
|
181
|
+
get machine() {
|
|
182
|
+
return this.options.machine;
|
|
183
|
+
}
|
|
184
|
+
async detect() {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
/** Effective host/port/user, resolved once through `ssh -G` and cached. */
|
|
188
|
+
async resolveTarget() {
|
|
189
|
+
if (this.target)
|
|
190
|
+
return this.target;
|
|
191
|
+
const { machine } = this.options;
|
|
192
|
+
const result = await this.run("ssh", sshConfigArgs(machine), {
|
|
193
|
+
timeoutMs: 3_000,
|
|
194
|
+
logger: this.options.logger,
|
|
195
|
+
});
|
|
196
|
+
const parsed = result.ok ? parseSshConfig(result.stdout) : {};
|
|
197
|
+
const target = {
|
|
198
|
+
hostname: parsed.hostname ?? machine.host,
|
|
199
|
+
port: machine.port ?? parsed.port ?? 22,
|
|
200
|
+
user: machine.user ?? parsed.user,
|
|
201
|
+
};
|
|
202
|
+
if (result.ok)
|
|
203
|
+
this.target = target;
|
|
204
|
+
return target;
|
|
205
|
+
}
|
|
206
|
+
async getStatus() {
|
|
207
|
+
const checkedAt = new Date();
|
|
208
|
+
const { machine } = this.options;
|
|
209
|
+
const target = await this.resolveTarget();
|
|
210
|
+
const endpoint = `${target.user ? `${target.user}@` : ""}${target.hostname}:${target.port}`;
|
|
211
|
+
const startedAt = Date.now();
|
|
212
|
+
const reachable = await this.probe(target.port, target.hostname, 2_000);
|
|
213
|
+
const latencyMs = Date.now() - startedAt;
|
|
214
|
+
const tailscale = this.options.tailscale?.();
|
|
215
|
+
const peer = tailscale
|
|
216
|
+
? (findTailscalePeer(tailscale, machine.host) ?? findTailscalePeer(tailscale, target.hostname))
|
|
217
|
+
: undefined;
|
|
218
|
+
const items = (machine.services ?? []).map((serviceId) => {
|
|
219
|
+
const snapshot = this.options.service?.(serviceId);
|
|
220
|
+
return snapshot
|
|
221
|
+
? { name: snapshot.name, state: snapshot.status.state, detail: snapshot.status.detail }
|
|
222
|
+
: { name: serviceId, state: "unknown", detail: "not checked yet" };
|
|
223
|
+
});
|
|
224
|
+
const detail = [
|
|
225
|
+
reachable ? `ssh reachable · ${latencyMs}ms` : "ssh unreachable",
|
|
226
|
+
peer ? `tailscale ${peer.online ? "online" : "offline"}` : undefined,
|
|
227
|
+
]
|
|
228
|
+
.filter(Boolean)
|
|
229
|
+
.join(" · ");
|
|
230
|
+
return { state: reachable ? "running" : "stopped", endpoint, detail, items, checkedAt };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/devcc/services/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,11 +26,18 @@ export interface ServiceActionContext {
|
|
|
26
26
|
/** Ask the user before doing something destructive. Resolves to the answer. */
|
|
27
27
|
confirm: (title: string, message: string) => Promise<boolean>;
|
|
28
28
|
}
|
|
29
|
+
export type ServiceCategory = "container" | "database" | "runtime" | "ai" | "web" | "remote";
|
|
29
30
|
export interface ServiceAdapter {
|
|
30
31
|
id: string;
|
|
31
32
|
name: string;
|
|
32
33
|
/** Grouping label shown in the Services view. */
|
|
33
|
-
category:
|
|
34
|
+
category: ServiceCategory;
|
|
35
|
+
/**
|
|
36
|
+
* Minimum time between polled status checks. Remote and slow adapters set
|
|
37
|
+
* this so an open dashboard does not generate constant network traffic; an
|
|
38
|
+
* explicit refresh always checks immediately.
|
|
39
|
+
*/
|
|
40
|
+
refreshIntervalMs?: number;
|
|
34
41
|
/** Cheap check: is this service relevant to this project/host at all? */
|
|
35
42
|
detect: () => Promise<boolean>;
|
|
36
43
|
getStatus: () => Promise<ServiceStatus>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/devcc/services/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAA;AAEzF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAA;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC3B,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9D;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/devcc/services/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAA;AAEzF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAA;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC3B,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9D;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE5F,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,QAAQ,EAAE,eAAe,CAAA;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,yEAAyE;IACzE,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9B,SAAS,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;IAEvC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,aAA4D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/devcc/services/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/devcc/services/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2DH,MAAM,CAAC,MAAM,cAAc,GAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ScopedLogger } from "./logger.js";
|
|
1
2
|
/**
|
|
2
3
|
* Small, safe process helpers.
|
|
3
4
|
*
|
|
@@ -13,6 +14,11 @@ export interface ExecOptions {
|
|
|
13
14
|
maxBuffer?: number;
|
|
14
15
|
input?: string;
|
|
15
16
|
signal?: AbortSignal;
|
|
17
|
+
/**
|
|
18
|
+
* When given, each run is logged at debug level: executable, arguments, cwd,
|
|
19
|
+
* duration, exit code and failure reason. The environment is never logged.
|
|
20
|
+
*/
|
|
21
|
+
logger?: ScopedLogger;
|
|
16
22
|
}
|
|
17
23
|
export interface ExecResult {
|
|
18
24
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/devcc/utils/exec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/devcc/utils/exec.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB;AAED,eAAO,MAAM,uBAAuB,OAAQ,CAAA;AAE5C;;GAEG;AACH,wBAAgB,IAAI,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAoFrB;AAED,0FAA0F;AAC1F,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB;AAED,wEAAwE;AACxE,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,SAAS,MAAM,EAAkB,GAC3C,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAc,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBhG;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAc9F"}
|
package/dist/devcc/utils/exec.js
CHANGED
|
@@ -5,7 +5,7 @@ export const DEFAULT_EXEC_TIMEOUT_MS = 5_000;
|
|
|
5
5
|
* Run a command and collect its output. Never rejects - inspect `ok`/`spawnError`.
|
|
6
6
|
*/
|
|
7
7
|
export function exec(command, args = [], options = {}) {
|
|
8
|
-
const { cwd, env, timeoutMs = DEFAULT_EXEC_TIMEOUT_MS, maxBuffer = 1024 * 1024, input, signal } = options;
|
|
8
|
+
const { cwd, env, timeoutMs = DEFAULT_EXEC_TIMEOUT_MS, maxBuffer = 1024 * 1024, input, signal, logger, } = options;
|
|
9
9
|
return new Promise((resolve) => {
|
|
10
10
|
const startedAt = Date.now();
|
|
11
11
|
const spawnOptions = {
|
|
@@ -25,7 +25,17 @@ export function exec(command, args = [], options = {}) {
|
|
|
25
25
|
settled = true;
|
|
26
26
|
clearTimeout(timer);
|
|
27
27
|
signal?.removeEventListener("abort", onAbort);
|
|
28
|
-
|
|
28
|
+
const durationMs = Date.now() - startedAt;
|
|
29
|
+
logger?.debug("exec", {
|
|
30
|
+
command,
|
|
31
|
+
args,
|
|
32
|
+
cwd,
|
|
33
|
+
durationMs,
|
|
34
|
+
code: result.code,
|
|
35
|
+
...(result.timedOut ? { timedOut: true } : {}),
|
|
36
|
+
...(result.spawnError ? { error: result.spawnError.message } : {}),
|
|
37
|
+
});
|
|
38
|
+
resolve({ ...result, durationMs });
|
|
29
39
|
};
|
|
30
40
|
const timer = setTimeout(() => {
|
|
31
41
|
timedOut = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/devcc/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/devcc/utils/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { CommandConfigEntry } from "../core/config.js";
|
|
2
|
+
import { type PackageManager } from "../utils/packageManager.js";
|
|
3
|
+
/**
|
|
4
|
+
* Project verification: the quality gate behind `devcc verify`.
|
|
5
|
+
*
|
|
6
|
+
* Steps are resolved from config (a command id, a package.json script, or an
|
|
7
|
+
* inline command) and run sequentially. The loop is independent of how a step
|
|
8
|
+
* executes, so the CLI can spawn directly while the TUI runs the same steps
|
|
9
|
+
* through the ProcessManager and gets log capture for free.
|
|
10
|
+
*/
|
|
11
|
+
export interface VerifyStepConfig {
|
|
12
|
+
id: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
command: string;
|
|
15
|
+
args?: string[];
|
|
16
|
+
cwd?: string;
|
|
17
|
+
}
|
|
18
|
+
/** A command id or package.json script name, or an inline step. */
|
|
19
|
+
export type VerifyEntry = string | VerifyStepConfig;
|
|
20
|
+
export interface VerifyStep {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
command: string;
|
|
24
|
+
args: string[];
|
|
25
|
+
cwd?: string;
|
|
26
|
+
source: "command" | "script" | "inline";
|
|
27
|
+
}
|
|
28
|
+
export interface ResolveVerifyContext {
|
|
29
|
+
commands: readonly CommandConfigEntry[];
|
|
30
|
+
scripts: readonly {
|
|
31
|
+
name: string;
|
|
32
|
+
}[];
|
|
33
|
+
packageManager: PackageManager;
|
|
34
|
+
}
|
|
35
|
+
export interface ResolvedVerify {
|
|
36
|
+
steps: VerifyStep[];
|
|
37
|
+
issues: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Turn config entries into runnable steps. A string names a configured
|
|
41
|
+
* command first, then a package.json script, so `verify: ["lint", "test"]`
|
|
42
|
+
* works without repeating what `package.json` already says.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveVerifySteps(entries: readonly VerifyEntry[], context: ResolveVerifyContext): ResolvedVerify;
|
|
45
|
+
/** Config issues about `verify`, which must block a run rather than silently shrink it. */
|
|
46
|
+
export declare function isVerifyIssue(issue: string): boolean;
|
|
47
|
+
export type VerifyStepStatus = "pending" | "running" | "passed" | "failed" | "skipped";
|
|
48
|
+
export interface VerifyStepResult {
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
command: string;
|
|
52
|
+
args: string[];
|
|
53
|
+
status: VerifyStepStatus;
|
|
54
|
+
exitCode: number | null;
|
|
55
|
+
durationMs: number;
|
|
56
|
+
stdout: string;
|
|
57
|
+
stderr: string;
|
|
58
|
+
/** Why the step could not run or was stopped (spawn error, signal, cancellation). */
|
|
59
|
+
error?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface VerifyReport {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
passed: number;
|
|
64
|
+
failed: number;
|
|
65
|
+
skipped: number;
|
|
66
|
+
total: number;
|
|
67
|
+
durationMs: number;
|
|
68
|
+
steps: VerifyStepResult[];
|
|
69
|
+
}
|
|
70
|
+
export interface StepOutcome {
|
|
71
|
+
exitCode: number | null;
|
|
72
|
+
stdout?: string;
|
|
73
|
+
stderr?: string;
|
|
74
|
+
error?: string;
|
|
75
|
+
}
|
|
76
|
+
export type StepExecutor = (step: VerifyStep, signal: AbortSignal) => Promise<StepOutcome>;
|
|
77
|
+
export interface RunVerificationOptions {
|
|
78
|
+
/** Called whenever a step changes state, with the full current list. */
|
|
79
|
+
onProgress?: (steps: readonly VerifyStepResult[]) => void;
|
|
80
|
+
signal?: AbortSignal;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Run every step in order. A failing step does not stop the run: the report
|
|
84
|
+
* shows every failure at once. Cancelling marks the remaining steps skipped.
|
|
85
|
+
*/
|
|
86
|
+
export declare function runVerification(steps: readonly VerifyStep[], execute: StepExecutor, options?: RunVerificationOptions): Promise<VerifyReport>;
|
|
87
|
+
/** One-line summary: `5/5 passed` or `3/5 passed, 2 failed (lint, test)`. */
|
|
88
|
+
export declare function summariseVerify(report: Pick<VerifyReport, "passed" | "failed" | "skipped" | "total" | "steps">): string;
|
|
89
|
+
/** Remove terminal escape sequences, so JSON and logs stay plain text. */
|
|
90
|
+
export declare function stripAnsi(text: string): string;
|
|
91
|
+
/** Keep the end of a long output, where test runners and compilers put the verdict. */
|
|
92
|
+
export declare function keepTail(text: string, maxLength: number): string;
|
|
93
|
+
export interface SpawnExecutorOptions {
|
|
94
|
+
rootDir: string;
|
|
95
|
+
env?: NodeJS.ProcessEnv;
|
|
96
|
+
/** Characters of stdout/stderr kept per step (default 200k, from the end). */
|
|
97
|
+
maxOutput?: number;
|
|
98
|
+
/** Live output, e.g. to mirror a failing step. */
|
|
99
|
+
onOutput?: (step: VerifyStep, chunk: string, stream: "stdout" | "stderr") => void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Executor for the CLI: `spawn(command, args)` in the project, colour disabled,
|
|
103
|
+
* output captured (tail kept) and ANSI-stripped. No shell, no timeout - a test
|
|
104
|
+
* suite takes as long as it takes - but an abort signal stops the child.
|
|
105
|
+
*/
|
|
106
|
+
export declare function createSpawnExecutor(options: SpawnExecutorOptions): StepExecutor;
|
|
107
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/devcc/verify/verify.ts"],"names":[],"mappings":"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"}
|