@tacuchi/agent-workflow-cli 12.9.0 → 12.10.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/dist/adapters/node-process.d.ts +4 -1
- package/dist/adapters/node-process.d.ts.map +1 -1
- package/dist/adapters/node-process.js +65 -0
- package/dist/adapters/node-process.js.map +1 -1
- package/dist/application/paths-service.d.ts +4 -0
- package/dist/application/paths-service.d.ts.map +1 -1
- package/dist/application/paths-service.js +8 -0
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/process-registry-service.d.ts +53 -0
- package/dist/application/process-registry-service.d.ts.map +1 -0
- package/dist/application/process-registry-service.js +95 -0
- package/dist/application/process-registry-service.js.map +1 -0
- package/dist/application/project-tab-data.d.ts +5 -0
- package/dist/application/project-tab-data.d.ts.map +1 -1
- package/dist/application/project-tab-data.js +20 -0
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/source-launch-scripts-service.d.ts +63 -0
- package/dist/application/source-launch-scripts-service.d.ts.map +1 -0
- package/dist/application/source-launch-scripts-service.js +302 -0
- package/dist/application/source-launch-scripts-service.js.map +1 -0
- package/dist/application/source-launch-service.d.ts +52 -0
- package/dist/application/source-launch-service.d.ts.map +1 -0
- package/dist/application/source-launch-service.js +116 -0
- package/dist/application/source-launch-service.js.map +1 -0
- package/dist/application/workspace-init-service.d.ts +3 -0
- package/dist/application/workspace-init-service.d.ts.map +1 -1
- package/dist/application/workspace-init-service.js +40 -4
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/tui/components/process-list.d.ts +15 -0
- package/dist/cli/tui/components/process-list.d.ts.map +1 -0
- package/dist/cli/tui/components/process-list.js +37 -0
- package/dist/cli/tui/components/process-list.js.map +1 -0
- package/dist/cli/tui/components/source-launch-form.d.ts +19 -0
- package/dist/cli/tui/components/source-launch-form.d.ts.map +1 -0
- package/dist/cli/tui/components/source-launch-form.js +68 -0
- package/dist/cli/tui/components/source-launch-form.js.map +1 -0
- package/dist/cli/tui/tabs/project-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +188 -16
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ports/process.d.ts +22 -0
- package/dist/ports/process.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { ProcessPort, RunOptions, RunResult } from "../ports/process.js";
|
|
1
|
+
import type { ProcessPort, RunOptions, RunResult, SpawnDetachedOptions, SpawnDetachedResult } from "../ports/process.js";
|
|
2
2
|
export declare class NodeProcess implements ProcessPort {
|
|
3
3
|
run(cmd: string, args: string[], opts?: RunOptions): Promise<RunResult>;
|
|
4
4
|
which(cmd: string): Promise<string | undefined>;
|
|
5
|
+
spawnDetached(cmd: string, args: string[], opts: SpawnDetachedOptions): Promise<SpawnDetachedResult>;
|
|
6
|
+
killTree(pid: number): Promise<void>;
|
|
7
|
+
isAlive(pid: number): Promise<boolean>;
|
|
5
8
|
}
|
|
6
9
|
//# sourceMappingURL=node-process.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-process.d.ts","sourceRoot":"","sources":["../../src/adapters/node-process.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node-process.d.ts","sourceRoot":"","sources":["../../src/adapters/node-process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAI7B,qBAAa,WAAY,YAAW,WAAW;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IA8C3E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAU/C,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC;IA4BzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAW7C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { closeSync, openSync } from "node:fs";
|
|
2
3
|
const WIN_SHELL_CMDS = new Set(["npm", "npx", "yarn", "pnpm", "node-gyp"]);
|
|
3
4
|
export class NodeProcess {
|
|
4
5
|
async run(cmd, args, opts = {}) {
|
|
@@ -52,5 +53,69 @@ export class NodeProcess {
|
|
|
52
53
|
const first = result.stdout.split("\n")[0]?.trim();
|
|
53
54
|
return first && first.length > 0 ? first : undefined;
|
|
54
55
|
}
|
|
56
|
+
async spawnDetached(cmd, args, opts) {
|
|
57
|
+
const useShell = process.platform === "win32" && WIN_SHELL_CMDS.has(cmd);
|
|
58
|
+
// Open the log in append mode and hand the fd to the child for stdout+stderr.
|
|
59
|
+
const fd = openSync(opts.logPath, "a");
|
|
60
|
+
try {
|
|
61
|
+
const child = spawn(cmd, args, {
|
|
62
|
+
cwd: opts.cwd,
|
|
63
|
+
env: opts.env ?? process.env,
|
|
64
|
+
detached: true,
|
|
65
|
+
stdio: ["ignore", fd, fd],
|
|
66
|
+
windowsHide: true,
|
|
67
|
+
shell: useShell,
|
|
68
|
+
});
|
|
69
|
+
// Async spawn failures (e.g. ENOENT) surface as an 'error' event; swallow
|
|
70
|
+
// it so it never crashes the parent — liveness/the log reveal the failure.
|
|
71
|
+
child.on("error", () => { });
|
|
72
|
+
if (child.pid === undefined) {
|
|
73
|
+
throw new Error(`Failed to spawn detached process: ${cmd}`);
|
|
74
|
+
}
|
|
75
|
+
// Let the child outlive this process.
|
|
76
|
+
child.unref();
|
|
77
|
+
return { pid: child.pid };
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
// The child inherited its own copy of the fd; close ours.
|
|
81
|
+
closeSync(fd);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async killTree(pid) {
|
|
85
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
86
|
+
return;
|
|
87
|
+
if (process.platform === "win32") {
|
|
88
|
+
// Kill the process and its child tree, forcefully.
|
|
89
|
+
await this.run("taskkill", ["/PID", String(pid), "/T", "/F"]).catch(() => { });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// *nix: a detached child is a process-group leader (pgid === pid), so a
|
|
93
|
+
// negative pid signals the whole group. Fall back to the lone pid if the
|
|
94
|
+
// group is already gone or the pid is not a leader.
|
|
95
|
+
try {
|
|
96
|
+
process.kill(-pid, "SIGTERM");
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
try {
|
|
100
|
+
process.kill(pid, "SIGTERM");
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Already dead — nothing to do.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async isAlive(pid) {
|
|
108
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
109
|
+
return false;
|
|
110
|
+
try {
|
|
111
|
+
// Signal 0 performs existence/permission checks without delivering a signal.
|
|
112
|
+
process.kill(pid, 0);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
// EPERM → the process exists but is owned by another user → still alive.
|
|
117
|
+
return err.code === "EPERM";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
55
120
|
}
|
|
56
121
|
//# sourceMappingURL=node-process.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-process.js","sourceRoot":"","sources":["../../src/adapters/node-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-process.js","sourceRoot":"","sources":["../../src/adapters/node-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,10 @@ export declare class PathsService {
|
|
|
29
29
|
cwdLogsDir(): string;
|
|
30
30
|
cwdLogFile(): string;
|
|
31
31
|
cwdLockFile(): string;
|
|
32
|
+
/** Persistent registry of detached source processes (machine-specific; gitignored). */
|
|
33
|
+
cwdProcessesFile(): string;
|
|
34
|
+
/** Workspace docs/logs dir — per-process launch logs (gitignored). */
|
|
35
|
+
cwdDocsLogsDir(): string;
|
|
32
36
|
userSkillsToml(): string;
|
|
33
37
|
cwdSkillsToml(): string;
|
|
34
38
|
blockMarkers(): ProjectBlockMarkers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths-service.d.ts","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM;IAG9B,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,sEAAsE;IACtE,YAAY,IAAI,MAAM;IAKtB,QAAQ,IAAI,MAAM;IAGlB,UAAU,IAAI,MAAM;IAGpB,WAAW,IAAI,MAAM;IAGrB,sBAAsB,IAAI,MAAM;IAGhC,WAAW,IAAI,MAAM;IAGrB,gBAAgB,IAAI,MAAM;IAG1B,eAAe,IAAI,MAAM;IAGzB,YAAY,IAAI,MAAM;IAGtB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAG3C,iBAAiB,IAAI,MAAM;IAK3B,OAAO,IAAI,MAAM;IAGjB,cAAc,IAAI,MAAM;IAGxB,cAAc,IAAI,MAAM;IAGxB,UAAU,IAAI,MAAM;IAGpB,UAAU,IAAI,MAAM;IAGpB,WAAW,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"paths-service.d.ts","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM;IAG9B,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,sEAAsE;IACtE,YAAY,IAAI,MAAM;IAKtB,QAAQ,IAAI,MAAM;IAGlB,UAAU,IAAI,MAAM;IAGpB,WAAW,IAAI,MAAM;IAGrB,sBAAsB,IAAI,MAAM;IAGhC,WAAW,IAAI,MAAM;IAGrB,gBAAgB,IAAI,MAAM;IAG1B,eAAe,IAAI,MAAM;IAGzB,YAAY,IAAI,MAAM;IAGtB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAG3C,iBAAiB,IAAI,MAAM;IAK3B,OAAO,IAAI,MAAM;IAGjB,cAAc,IAAI,MAAM;IAGxB,cAAc,IAAI,MAAM;IAGxB,UAAU,IAAI,MAAM;IAGpB,UAAU,IAAI,MAAM;IAGpB,WAAW,IAAI,MAAM;IAGrB,uFAAuF;IACvF,gBAAgB,IAAI,MAAM;IAG1B,sEAAsE;IACtE,cAAc,IAAI,MAAM;IAKxB,cAAc,IAAI,MAAM;IAGxB,aAAa,IAAI,MAAM;IAKvB,YAAY,IAAI,mBAAmB;CAOpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CAUjB"}
|
|
@@ -65,6 +65,14 @@ export class PathsService {
|
|
|
65
65
|
cwdLockFile() {
|
|
66
66
|
return join(this.cwdRoot(), ".lock");
|
|
67
67
|
}
|
|
68
|
+
/** Persistent registry of detached source processes (machine-specific; gitignored). */
|
|
69
|
+
cwdProcessesFile() {
|
|
70
|
+
return join(this.cwdRoot(), "processes.json");
|
|
71
|
+
}
|
|
72
|
+
/** Workspace docs/logs dir — per-process launch logs (gitignored). */
|
|
73
|
+
cwdDocsLogsDir() {
|
|
74
|
+
return join(this.cwd, "docs", "logs");
|
|
75
|
+
}
|
|
68
76
|
// skills.toml — capability role → skill bindings (cascade: global then workspace)
|
|
69
77
|
userSkillsToml() {
|
|
70
78
|
return join(this.userRoot(), "skills.toml");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { FileSystemPort } from "../ports/file-system.js";
|
|
2
|
+
import type { ProcessPort } from "../ports/process.js";
|
|
3
|
+
/** Lifecycle state of a registered detached process. */
|
|
4
|
+
export type ProcessState = "running" | "exited" | "stopped";
|
|
5
|
+
/** One detached source process tracked in `.workflow/processes.json`. */
|
|
6
|
+
export interface ProcessRecord {
|
|
7
|
+
/** Stable id within the registry: `<alias>__<profile>__<pid>`. */
|
|
8
|
+
id: string;
|
|
9
|
+
sourceAlias: string;
|
|
10
|
+
profile: string | null;
|
|
11
|
+
command: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
pid: number;
|
|
14
|
+
/** ISO timestamp of when the launch was registered. */
|
|
15
|
+
startedAt: string;
|
|
16
|
+
/** Absolute path to the per-process log file. */
|
|
17
|
+
logPath: string;
|
|
18
|
+
/** Non-secret param values entered at launch, so a relaunch reuses them (secrets never persisted). */
|
|
19
|
+
values?: Record<string, string>;
|
|
20
|
+
state: ProcessState;
|
|
21
|
+
}
|
|
22
|
+
/** Fields the caller supplies when registering a launch (id/state are derived). */
|
|
23
|
+
export type ProcessRegistration = Omit<ProcessRecord, "id" | "state">;
|
|
24
|
+
/**
|
|
25
|
+
* Persistent registry of detached source processes, backed by a JSON array on
|
|
26
|
+
* disk (`.workflow/processes.json`). `list()` reconciles each record against
|
|
27
|
+
* live OS state (via `ProcessPort.isAlive`) before returning, and persists the
|
|
28
|
+
* reconciled snapshot so the file stays honest across TUI restarts.
|
|
29
|
+
*
|
|
30
|
+
* A corrupt/unreadable registry degrades to empty rather than crashing callers
|
|
31
|
+
* (the TUI must keep working).
|
|
32
|
+
*/
|
|
33
|
+
export declare class ProcessRegistryService {
|
|
34
|
+
private readonly fs;
|
|
35
|
+
private readonly proc;
|
|
36
|
+
private readonly filePath;
|
|
37
|
+
constructor(fs: FileSystemPort, proc: ProcessPort, filePath: string);
|
|
38
|
+
private read;
|
|
39
|
+
private write;
|
|
40
|
+
/** Register a freshly launched process as `running`. Returns the stored record. */
|
|
41
|
+
register(reg: ProcessRegistration): Promise<ProcessRecord>;
|
|
42
|
+
/**
|
|
43
|
+
* Return all records with their state reconciled against live OS state:
|
|
44
|
+
* `running` records whose pid is no longer alive become `exited`; `stopped`
|
|
45
|
+
* and `exited` records are sticky. Persists the reconciled snapshot.
|
|
46
|
+
*/
|
|
47
|
+
list(): Promise<ProcessRecord[]>;
|
|
48
|
+
/** Mark a record as deliberately stopped (sticky; survives reconciliation). */
|
|
49
|
+
markStopped(id: string): Promise<void>;
|
|
50
|
+
/** Drop a record from the registry entirely. */
|
|
51
|
+
remove(id: string): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=process-registry-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry-service.d.ts","sourceRoot":"","sources":["../../src/application/process-registry-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wDAAwD;AACxD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,mFAAmF;AACnF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC;AAMtE;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM;YAGrB,IAAI;YAYJ,KAAK;IAKnB,mFAAmF;IAC7E,QAAQ,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAchE;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAetC,+EAA+E;IACzE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,gDAAgD;IAC1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKxC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
function recordId(alias, profile, pid) {
|
|
3
|
+
return `${alias}__${profile ?? "default"}__${pid}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Persistent registry of detached source processes, backed by a JSON array on
|
|
7
|
+
* disk (`.workflow/processes.json`). `list()` reconciles each record against
|
|
8
|
+
* live OS state (via `ProcessPort.isAlive`) before returning, and persists the
|
|
9
|
+
* reconciled snapshot so the file stays honest across TUI restarts.
|
|
10
|
+
*
|
|
11
|
+
* A corrupt/unreadable registry degrades to empty rather than crashing callers
|
|
12
|
+
* (the TUI must keep working).
|
|
13
|
+
*/
|
|
14
|
+
export class ProcessRegistryService {
|
|
15
|
+
fs;
|
|
16
|
+
proc;
|
|
17
|
+
filePath;
|
|
18
|
+
constructor(fs, proc, filePath) {
|
|
19
|
+
this.fs = fs;
|
|
20
|
+
this.proc = proc;
|
|
21
|
+
this.filePath = filePath;
|
|
22
|
+
}
|
|
23
|
+
async read() {
|
|
24
|
+
if (!(await this.fs.exists(this.filePath)))
|
|
25
|
+
return [];
|
|
26
|
+
try {
|
|
27
|
+
const raw = await this.fs.readText(this.filePath);
|
|
28
|
+
const parsed = JSON.parse(raw);
|
|
29
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Corrupt registry → degrade to empty (best-effort; never brick the TUI).
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async write(records) {
|
|
37
|
+
await this.fs.mkdirp(dirname(this.filePath));
|
|
38
|
+
await this.fs.writeText(this.filePath, `${JSON.stringify(records, null, 2)}\n`);
|
|
39
|
+
}
|
|
40
|
+
/** Register a freshly launched process as `running`. Returns the stored record. */
|
|
41
|
+
async register(reg) {
|
|
42
|
+
const records = await this.read();
|
|
43
|
+
const record = {
|
|
44
|
+
...reg,
|
|
45
|
+
id: recordId(reg.sourceAlias, reg.profile, reg.pid),
|
|
46
|
+
state: "running",
|
|
47
|
+
};
|
|
48
|
+
// A recycled pid could collide with a stale record id — replace it.
|
|
49
|
+
const next = records.filter((r) => r.id !== record.id);
|
|
50
|
+
next.push(record);
|
|
51
|
+
await this.write(next);
|
|
52
|
+
return record;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Return all records with their state reconciled against live OS state:
|
|
56
|
+
* `running` records whose pid is no longer alive become `exited`; `stopped`
|
|
57
|
+
* and `exited` records are sticky. Persists the reconciled snapshot.
|
|
58
|
+
*/
|
|
59
|
+
async list() {
|
|
60
|
+
const records = await this.read();
|
|
61
|
+
const reconciled = await Promise.all(records.map(async (r) => {
|
|
62
|
+
if (r.state !== "running")
|
|
63
|
+
return r;
|
|
64
|
+
const alive = await this.proc.isAlive(r.pid);
|
|
65
|
+
return alive ? r : { ...r, state: "exited" };
|
|
66
|
+
}));
|
|
67
|
+
// Only rewrite when the reconciliation actually changed something.
|
|
68
|
+
const changed = reconciled.some((r, i) => r.state !== records[i]?.state);
|
|
69
|
+
if (changed)
|
|
70
|
+
await this.write(reconciled);
|
|
71
|
+
return reconciled;
|
|
72
|
+
}
|
|
73
|
+
/** Mark a record as deliberately stopped (sticky; survives reconciliation). */
|
|
74
|
+
async markStopped(id) {
|
|
75
|
+
const records = await this.read();
|
|
76
|
+
let touched = false;
|
|
77
|
+
const next = records.map((r) => {
|
|
78
|
+
if (r.id === id && r.state !== "stopped") {
|
|
79
|
+
touched = true;
|
|
80
|
+
return { ...r, state: "stopped" };
|
|
81
|
+
}
|
|
82
|
+
return r;
|
|
83
|
+
});
|
|
84
|
+
if (touched)
|
|
85
|
+
await this.write(next);
|
|
86
|
+
}
|
|
87
|
+
/** Drop a record from the registry entirely. */
|
|
88
|
+
async remove(id) {
|
|
89
|
+
const records = await this.read();
|
|
90
|
+
const next = records.filter((r) => r.id !== id);
|
|
91
|
+
if (next.length !== records.length)
|
|
92
|
+
await this.write(next);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=process-registry-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry-service.js","sourceRoot":"","sources":["../../src/application/process-registry-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { GitPort } from "../ports/git.js";
|
|
|
4
4
|
import type { ProcessPort } from "../ports/process.js";
|
|
5
5
|
import { type ParsedProjectBlock } from "./parsers/project-block.js";
|
|
6
6
|
import type { PathsService } from "./paths-service.js";
|
|
7
|
+
import { type ProcessRecord } from "./process-registry-service.js";
|
|
7
8
|
export interface ProjectGitData {
|
|
8
9
|
branch: string;
|
|
9
10
|
base: string;
|
|
@@ -37,6 +38,8 @@ export interface ProjectSource {
|
|
|
37
38
|
mainBranch: string;
|
|
38
39
|
dirty: boolean;
|
|
39
40
|
changedFiles: number;
|
|
41
|
+
/** True when a launch descriptor (docs/tools/<alias>/launch.json) exists with a command. */
|
|
42
|
+
launchable: boolean;
|
|
40
43
|
}
|
|
41
44
|
export interface ProjectTabData {
|
|
42
45
|
workspaceName: string;
|
|
@@ -60,6 +63,8 @@ export interface ProjectTabData {
|
|
|
60
63
|
workingBranches: Record<string, string>;
|
|
61
64
|
/** Ramas QA actuales por alias de fuente (bloque WORKSPACE > Status > Ramas QA) */
|
|
62
65
|
qaBranches: Record<string, string>;
|
|
66
|
+
/** Procesos lanzados en segundo plano (registry reconciliado contra liveness). */
|
|
67
|
+
processes: ProcessRecord[];
|
|
63
68
|
/** Si hubo error parcial fetcheando data */
|
|
64
69
|
warnings: string[];
|
|
65
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-tab-data.d.ts","sourceRoot":"","sources":["../../src/application/project-tab-data.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,kBAAkB,EAAqB,MAAM,4BAA4B,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-tab-data.d.ts","sourceRoot":"","sources":["../../src/application/project-tab-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// Read-only puro: ningún side-effect en disco ni en remoto.
|
|
13
13
|
import { basename, join } from "node:path";
|
|
14
14
|
import { parseProjectBlock } from "./parsers/project-block.js";
|
|
15
|
+
import { ProcessRegistryService } from "./process-registry-service.js";
|
|
15
16
|
/**
|
|
16
17
|
* Construye toda la data del tab Proyecto en una pasada.
|
|
17
18
|
*
|
|
@@ -45,6 +46,7 @@ export async function buildProjectTabData(deps, options = {}) {
|
|
|
45
46
|
continue;
|
|
46
47
|
const branch = await safeRun(`branch:${f.alias}`, () => git.currentBranch(repoPath), warnings, undefined);
|
|
47
48
|
const changed = await safeRun(`dirty:${f.alias}`, () => git.changedFiles(repoPath), warnings, []);
|
|
49
|
+
const launchable = await safeRun(`launchable:${f.alias}`, () => readLaunchable(fs, cwd, f.alias), warnings, false);
|
|
48
50
|
sources.push({
|
|
49
51
|
alias: f.alias,
|
|
50
52
|
path: f.path,
|
|
@@ -52,9 +54,13 @@ export async function buildProjectTabData(deps, options = {}) {
|
|
|
52
54
|
mainBranch: f.main_branch,
|
|
53
55
|
dirty: changed.length > 0,
|
|
54
56
|
changedFiles: changed.length,
|
|
57
|
+
launchable,
|
|
55
58
|
});
|
|
56
59
|
}
|
|
57
60
|
}
|
|
61
|
+
// Procesos en segundo plano — el registry reconcilia liveness en list().
|
|
62
|
+
const registry = new ProcessRegistryService(fs, proc, paths.cwdProcessesFile());
|
|
63
|
+
const processes = await safeRun("processes", () => registry.list(), warnings, []);
|
|
58
64
|
return {
|
|
59
65
|
workspaceName,
|
|
60
66
|
workspacePath: cwd,
|
|
@@ -64,9 +70,23 @@ export async function buildProjectTabData(deps, options = {}) {
|
|
|
64
70
|
sources,
|
|
65
71
|
workingBranches: block?.working_branches ?? {},
|
|
66
72
|
qaBranches: block?.qa_branches ?? {},
|
|
73
|
+
processes,
|
|
67
74
|
warnings,
|
|
68
75
|
};
|
|
69
76
|
}
|
|
77
|
+
/** True when docs/tools/<alias>/launch.json exists and declares a command. */
|
|
78
|
+
async function readLaunchable(fs, cwd, alias) {
|
|
79
|
+
const file = join(cwd, "docs", "tools", alias, "launch.json");
|
|
80
|
+
if (!(await fs.exists(file)))
|
|
81
|
+
return false;
|
|
82
|
+
try {
|
|
83
|
+
const desc = JSON.parse(await fs.readText(file));
|
|
84
|
+
return typeof desc.command === "string" && desc.command.length > 0;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
70
90
|
// ---------- subfetchers ----------
|
|
71
91
|
async function buildGitData(git, proc, repoPath, mainBranch, workBranch) {
|
|
72
92
|
const isRepo = await git.isGitRepo(repoPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-tab-data.js","sourceRoot":"","sources":["../../src/application/project-tab-data.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,EAAE;AACF,+EAA+E;AAC/E,cAAc;AACd,EAAE;AACF,+FAA+F;AAC/F,yCAAyC;AACzC,uDAAuD;AACvD,gFAAgF;AAChF,EAAE;AACF,4EAA4E;AAC5E,4DAA4D;AAE5D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAK3C,OAAO,EAA2B,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-tab-data.js","sourceRoot":"","sources":["../../src/application/project-tab-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { FileSystemPort } from "../ports/file-system.js";
|
|
2
|
+
/** A launch parameter discovered from a source's config (env-vars). */
|
|
3
|
+
export interface LaunchParam {
|
|
4
|
+
name: string;
|
|
5
|
+
default: string;
|
|
6
|
+
/** True when the name looks like a secret → masked in the TUI, never baked into versioned files. */
|
|
7
|
+
secret: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Machine-readable launch descriptor for one source (`docs/tools/<alias>/launch.json`).
|
|
11
|
+
* The TUI reads this; it never parses the shell scripts.
|
|
12
|
+
*/
|
|
13
|
+
export interface LaunchDescriptor {
|
|
14
|
+
version: 1;
|
|
15
|
+
source: string;
|
|
16
|
+
/** "npm" | "gradle" | "maven" | "angular" | "unknown". */
|
|
17
|
+
stack: string;
|
|
18
|
+
/** Working directory the command runs from (the source's absolute path). */
|
|
19
|
+
cwd: string;
|
|
20
|
+
/** Launch command, or null when no runnable command was detected (→ TUI disables "Lanzar"). */
|
|
21
|
+
command: string | null;
|
|
22
|
+
args: string[];
|
|
23
|
+
params: LaunchParam[];
|
|
24
|
+
/** Profiles discovered from config (`.env.<profile>`, `application-<profile>.yml`). */
|
|
25
|
+
profiles: string[];
|
|
26
|
+
}
|
|
27
|
+
/** Detect the launch descriptor for a source by inspecting its files. Pure (read-only). */
|
|
28
|
+
export declare function detectLaunchDescriptor(fs: FileSystemPort, sourcePath: string, alias: string): Promise<LaunchDescriptor>;
|
|
29
|
+
export declare function renderLaunchJson(desc: LaunchDescriptor): string;
|
|
30
|
+
export declare function renderRunSh(desc: LaunchDescriptor): string;
|
|
31
|
+
export declare function renderRunPs1(desc: LaunchDescriptor): string;
|
|
32
|
+
export type WriteOutcome = "created" | "regenerated" | "preserved";
|
|
33
|
+
export interface SourceArtifactResult {
|
|
34
|
+
alias: string;
|
|
35
|
+
stack: string;
|
|
36
|
+
launchable: boolean;
|
|
37
|
+
outcomes: {
|
|
38
|
+
launchJson: WriteOutcome;
|
|
39
|
+
runSh: WriteOutcome;
|
|
40
|
+
runPs1: WriteOutcome;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Generate (idempotently) the descriptor + per-OS scripts for one source. */
|
|
44
|
+
export declare function generateSourceLaunchArtifacts(fs: FileSystemPort, toolsDir: string, sourcePath: string, alias: string): Promise<SourceArtifactResult>;
|
|
45
|
+
export interface LaunchArtifactsSummary {
|
|
46
|
+
/** "enabled" when the `tools` capability is on; "off" when disabled (no generation). */
|
|
47
|
+
toolsRole: "enabled" | "off";
|
|
48
|
+
generated: SourceArtifactResult[];
|
|
49
|
+
skipped: {
|
|
50
|
+
alias: string;
|
|
51
|
+
reason: "path_not_found" | "tools_role_off";
|
|
52
|
+
}[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate launch artifacts for every source under `toolsDir/<alias>/`. Degrades
|
|
56
|
+
* cleanly: with the `tools` capability off, nothing is generated (and it says so);
|
|
57
|
+
* a source whose path is missing is skipped rather than producing junk.
|
|
58
|
+
*/
|
|
59
|
+
export declare function generateLaunchArtifacts(fs: FileSystemPort, toolsDir: string, sources: {
|
|
60
|
+
alias: string;
|
|
61
|
+
path: string;
|
|
62
|
+
}[], toolsEnabled: boolean): Promise<LaunchArtifactsSummary>;
|
|
63
|
+
//# sourceMappingURL=source-launch-scripts-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-launch-scripts-service.d.ts","sourceRoot":"","sources":["../../src/application/source-launch-scripts-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,+FAA+F;IAC/F,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AA4JD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAI/D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAoB1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAoB3D;AAiBD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAkDnE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE;QAAE,UAAU,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC;CACnF;AAED,8EAA8E;AAC9E,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,oBAAoB,CAAC,CAuB/B;AAED,MAAM,WAAW,sBAAsB;IACrC,wFAAwF;IACxF,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC;IAC7B,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAA;KAAE,EAAE,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAC1C,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,sBAAsB,CAAC,CAkBjC"}
|