@openrig/cli 0.3.2 → 0.3.3-rc.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/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +8 -8
- package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
- package/daemon/dist/adapters/cmux-transport.js +51 -9
- package/daemon/dist/adapters/cmux-transport.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +32 -4
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +32 -1
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +75 -2
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/042_rig_archive.d.ts +16 -0
- package/daemon/dist/db/migrations/042_rig_archive.d.ts.map +1 -0
- package/daemon/dist/db/migrations/042_rig_archive.js +21 -0
- package/daemon/dist/db/migrations/042_rig_archive.js.map +1 -0
- package/daemon/dist/domain/ps-projection.d.ts +6 -1
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +10 -1
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.js +12 -10
- package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +28 -2
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +40 -3
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +176 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +305 -37
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +19 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +30 -12
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts +1 -0
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +4 -1
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +15 -0
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +8 -3
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/topology-converge.d.ts +97 -0
- package/daemon/dist/domain/topology-converge.d.ts.map +1 -0
- package/daemon/dist/domain/topology-converge.js +70 -0
- package/daemon/dist/domain/topology-converge.js.map +1 -0
- package/daemon/dist/domain/types.d.ts +6 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/whoami-service.d.ts +8 -0
- package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
- package/daemon/dist/domain/whoami-service.js +1 -0
- package/daemon/dist/domain/whoami-service.js.map +1 -1
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +9 -1
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +19 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +26 -0
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/routes/ps.js +4 -1
- package/daemon/dist/routes/ps.js.map +1 -1
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +124 -2
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +2 -1
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/getting-started.md +69 -0
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +78 -9
- package/dist/commands/add.d.ts +4 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +115 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/archive.d.ts +10 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +68 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/bootstrap.js +2 -2
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/discover.js +2 -2
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/down.d.ts +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +91 -3
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +22 -3
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +11 -0
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +28 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +35 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/unarchive.d.ts +10 -0
- package/dist/commands/unarchive.d.ts.map +1 -0
- package/dist/commands/unarchive.js +53 -0
- package/dist/commands/unarchive.js.map +1 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +50 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +4 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +2 -3
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +2 -3
- package/dist/commands/workspace.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +23 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +24 -0
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +29 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/release-surface/affected-skills.d.ts +49 -0
- package/dist/release-surface/affected-skills.d.ts.map +1 -0
- package/dist/release-surface/affected-skills.js +153 -0
- package/dist/release-surface/affected-skills.js.map +1 -0
- package/dist/release-surface/extract-surface.d.ts +23 -0
- package/dist/release-surface/extract-surface.d.ts.map +1 -0
- package/dist/release-surface/extract-surface.js +193 -0
- package/dist/release-surface/extract-surface.js.map +1 -0
- package/dist/release-surface/generate.d.ts +2 -0
- package/dist/release-surface/generate.d.ts.map +1 -0
- package/dist/release-surface/generate.js +51 -0
- package/dist/release-surface/generate.js.map +1 -0
- package/dist/release-surface/surface-diff.d.ts +40 -0
- package/dist/release-surface/surface-diff.d.ts.map +1 -0
- package/dist/release-surface/surface-diff.js +212 -0
- package/dist/release-surface/surface-diff.js.map +1 -0
- package/package.json +1 -1
- package/ui/dist/assets/{index-GjTxfi9S.js → index-CrJgCmkX.js} +146 -141
- package/ui/dist/index.html +1 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { DaemonClient } from "../client.js";
|
|
4
|
+
import { getDaemonStatus, getDaemonUrl } from "../daemon-lifecycle.js";
|
|
5
|
+
import { realDeps } from "./daemon.js";
|
|
6
|
+
export function addMemberCommand(depsOverride) {
|
|
7
|
+
const cmd = new Command("add").description("Add a member to an existing pod in a running rig");
|
|
8
|
+
const getDeps = () => depsOverride ?? { lifecycleDeps: realDeps(), clientFactory: (url) => new DaemonClient(url) };
|
|
9
|
+
cmd
|
|
10
|
+
.argument("<rig-id>", "ID of the target rig")
|
|
11
|
+
.argument("<pod-namespace>", "Namespace of the existing pod to add the member to")
|
|
12
|
+
.argument("<member-fragment-path>", "Path to YAML/JSON member fragment file (spec snake_case fields)")
|
|
13
|
+
.option("--json", "JSON output for agents")
|
|
14
|
+
.option("--rig-root <path>", "Root directory for agent resolution")
|
|
15
|
+
.action(async (rigId, podNamespace, fragmentPath, opts) => {
|
|
16
|
+
const deps = getDeps();
|
|
17
|
+
const status = await getDaemonStatus(deps.lifecycleDeps);
|
|
18
|
+
if (status.state !== "running" || status.healthy === false) {
|
|
19
|
+
console.error("Daemon not running. Start it with: rig daemon start");
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
let fileContent;
|
|
24
|
+
try {
|
|
25
|
+
fileContent = readFileSync(fragmentPath, "utf-8");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
console.error(`Cannot read file: ${fragmentPath}`);
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let member;
|
|
33
|
+
let edges;
|
|
34
|
+
try {
|
|
35
|
+
// Dynamic import to avoid bundling yaml at module load (matches expand).
|
|
36
|
+
const { parse } = await import("yaml");
|
|
37
|
+
const parsed = (parse(fileContent) ?? {});
|
|
38
|
+
if (parsed["member"] && typeof parsed["member"] === "object" && !Array.isArray(parsed["member"])) {
|
|
39
|
+
// Wrapper form: { member: {...}, edges?: [...] }.
|
|
40
|
+
member = parsed["member"];
|
|
41
|
+
edges = parsed["edges"];
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Bare member form. Lift any top-level `edges:` out as pod-local edges
|
|
45
|
+
// so they are NOT silently dropped (the schema ignores unknown member
|
|
46
|
+
// fields). The rest is the member.
|
|
47
|
+
const { edges: bareEdges, ...rest } = parsed;
|
|
48
|
+
member = rest;
|
|
49
|
+
edges = bareEdges;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
console.error("Invalid YAML/JSON in member fragment file");
|
|
54
|
+
process.exitCode = 1;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// A PRESENT-but-non-array edges field is an honest error, never silently
|
|
58
|
+
// omitted (governance FM2 no-silent-drop).
|
|
59
|
+
if (edges !== undefined && edges !== null && !Array.isArray(edges)) {
|
|
60
|
+
console.error("Invalid member fragment: 'edges' must be an array of { from, to, kind }.");
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const body = { member };
|
|
65
|
+
if (Array.isArray(edges))
|
|
66
|
+
body["edges"] = edges;
|
|
67
|
+
if (opts.rigRoot)
|
|
68
|
+
body["rigRoot"] = opts.rigRoot;
|
|
69
|
+
const client = deps.clientFactory(getDaemonUrl(status));
|
|
70
|
+
const res = await client.post(`/api/rigs/${encodeURIComponent(rigId)}/pods/${encodeURIComponent(podNamespace)}/members`, body);
|
|
71
|
+
const data = res.data;
|
|
72
|
+
if (opts.json) {
|
|
73
|
+
console.log(JSON.stringify(data, null, 2));
|
|
74
|
+
// Non-zero if the HTTP failed OR the new node did not fully launch.
|
|
75
|
+
if (res.status >= 400 || (data.ok && data.result !== undefined && data.result.node.status !== "launched")) {
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (res.status >= 400 || !data.ok) {
|
|
81
|
+
// Honest 3-part error: the daemon's message already says what failed /
|
|
82
|
+
// why / what to do (pod_not_found lists pods; member_conflict suggests a
|
|
83
|
+
// new id); validation/preflight surface the specific field errors.
|
|
84
|
+
const msg = data.message
|
|
85
|
+
?? (data.errors && data.errors.length > 0 ? data.errors.join("; ") : data.error)
|
|
86
|
+
?? `Add member failed (HTTP ${res.status})`;
|
|
87
|
+
console.error(msg);
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const node = data.result.node;
|
|
92
|
+
const icon = node.status === "launched" ? "OK" : "FAIL";
|
|
93
|
+
const session = node.sessionName ? ` (${node.sessionName})` : "";
|
|
94
|
+
const error = node.error ? ` - ${node.error}` : "";
|
|
95
|
+
console.log(`Added member to rig ${rigId}`);
|
|
96
|
+
console.log(` Pod: ${data.result.podNamespace}`);
|
|
97
|
+
console.log(` Member: [${icon}] ${node.logicalId}${session}${error}`);
|
|
98
|
+
const persistedEdges = data.result.edges ?? [];
|
|
99
|
+
if (persistedEdges.length > 0) {
|
|
100
|
+
console.log(" Edges:");
|
|
101
|
+
for (const e of persistedEdges)
|
|
102
|
+
console.log(` ${e.from} ${e.kind} ${e.to}`);
|
|
103
|
+
}
|
|
104
|
+
if (data.result.warnings && data.result.warnings.length > 0) {
|
|
105
|
+
console.log("");
|
|
106
|
+
for (const w of data.result.warnings)
|
|
107
|
+
console.log(` Warning: ${w}`);
|
|
108
|
+
}
|
|
109
|
+
if (node.status !== "launched") {
|
|
110
|
+
process.exitCode = 1;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
return cmd;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { StatusDeps } from "./status.js";
|
|
3
|
+
/**
|
|
4
|
+
* `rig archive <rigId>` - OPR.0.3.3.19. Soft, REVERSIBLE archive: hides a rig
|
|
5
|
+
* from the default explorer + `rig ps`, while RETAINING the rigs row, topology,
|
|
6
|
+
* and snapshots. This is NOT `rig down --delete` (which is destructive). Reverse
|
|
7
|
+
* with `rig unarchive <rigId>`. Running/degraded rigs require `--force`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function archiveCommand(depsOverride?: StatusDeps): Command;
|
|
10
|
+
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAc9C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CA+DjE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { DaemonClient } from "../client.js";
|
|
3
|
+
import { getDaemonStatus, getDaemonUrl } from "../daemon-lifecycle.js";
|
|
4
|
+
import { realDeps } from "./daemon.js";
|
|
5
|
+
/**
|
|
6
|
+
* `rig archive <rigId>` - OPR.0.3.3.19. Soft, REVERSIBLE archive: hides a rig
|
|
7
|
+
* from the default explorer + `rig ps`, while RETAINING the rigs row, topology,
|
|
8
|
+
* and snapshots. This is NOT `rig down --delete` (which is destructive). Reverse
|
|
9
|
+
* with `rig unarchive <rigId>`. Running/degraded rigs require `--force`.
|
|
10
|
+
*/
|
|
11
|
+
export function archiveCommand(depsOverride) {
|
|
12
|
+
const cmd = new Command("archive").description("Archive a rig (soft + reversible: hides it from the default view, retains all data). NOT a delete; reverse with 'rig unarchive'.");
|
|
13
|
+
const getDepsF = () => depsOverride ?? { lifecycleDeps: realDeps(), clientFactory: (url) => new DaemonClient(url) };
|
|
14
|
+
cmd
|
|
15
|
+
.argument("<rigId>", "Rig identifier to archive")
|
|
16
|
+
.option("--force", "Archive even if the rig is running or degraded")
|
|
17
|
+
.option("--json", "JSON output for agents")
|
|
18
|
+
.action(async (rigId, opts) => {
|
|
19
|
+
const deps = getDepsF();
|
|
20
|
+
const status = await getDaemonStatus(deps.lifecycleDeps);
|
|
21
|
+
if (status.state !== "running" || status.healthy === false) {
|
|
22
|
+
console.error("Daemon not running. Start it with: rig daemon start");
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const client = deps.clientFactory(getDaemonUrl(status));
|
|
27
|
+
const res = await client.post(`/api/rigs/${encodeURIComponent(rigId)}/archive`, { force: opts.force ?? false });
|
|
28
|
+
if (opts.json) {
|
|
29
|
+
console.log(JSON.stringify(res.data));
|
|
30
|
+
if (res.status >= 400)
|
|
31
|
+
process.exitCode = res.status === 409 ? 2 : 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (res.status === 404) {
|
|
35
|
+
console.error(`Rig not found: ${rigId}. Check the id with: rig ps`);
|
|
36
|
+
process.exitCode = 1;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// AC-6: running/degraded without --force returns a 3-part honest error.
|
|
40
|
+
if (res.status === 409) {
|
|
41
|
+
const err = res.data.error;
|
|
42
|
+
if (err && typeof err === "object") {
|
|
43
|
+
process.stderr.write(`Error: ${err.fact}\n${err.consequence}\n${err.action}\n`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
process.stderr.write(`Error: ${String(err)}\n`);
|
|
47
|
+
}
|
|
48
|
+
process.exitCode = 2;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (res.status >= 400) {
|
|
52
|
+
console.error(`Archive failed (HTTP ${res.status}).`);
|
|
53
|
+
process.exitCode = 2;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const r = res.data;
|
|
57
|
+
if (r.archived) {
|
|
58
|
+
console.log(`Rig ${rigId} archived (reversible). It is hidden from the default view.`);
|
|
59
|
+
console.log(` See it with: rig ps --include-archived`);
|
|
60
|
+
console.log(` Bring it back: rig unarchive ${rigId}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(`Rig ${rigId} was already archived.`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return cmd;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import nodePath from "node:path";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { DaemonClient } from "../client.js";
|
|
4
|
-
import { getDaemonStatus, getDaemonUrl } from "../daemon-lifecycle.js";
|
|
4
|
+
import { getDaemonStatus, getDaemonUrl, printDaemonNotRunning } from "../daemon-lifecycle.js";
|
|
5
5
|
import { realDeps } from "./daemon.js";
|
|
6
6
|
const LONG_RUNNING_BOOTSTRAP_TIMEOUT_MS = 120_000;
|
|
7
7
|
function logStageDetailErrors(data) {
|
|
@@ -27,7 +27,7 @@ export function bootstrapCommand(depsOverride) {
|
|
|
27
27
|
async function getClient(deps) {
|
|
28
28
|
const status = await getDaemonStatus(deps.lifecycleDeps);
|
|
29
29
|
if (status.state !== "running" || status.healthy === false) {
|
|
30
|
-
|
|
30
|
+
printDaemonNotRunning();
|
|
31
31
|
return null;
|
|
32
32
|
}
|
|
33
33
|
return deps.clientFactory(getDaemonUrl(status));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { DaemonClient } from "../client.js";
|
|
3
|
-
import { getDaemonStatus, getDaemonUrl } from "../daemon-lifecycle.js";
|
|
3
|
+
import { getDaemonStatus, getDaemonUrl, printDaemonNotRunning } from "../daemon-lifecycle.js";
|
|
4
4
|
import { realDeps } from "./daemon.js";
|
|
5
5
|
export function discoverCommand(depsOverride) {
|
|
6
6
|
const cmd = new Command("discover").description("Scan for unmanaged tmux sessions");
|
|
@@ -8,7 +8,7 @@ export function discoverCommand(depsOverride) {
|
|
|
8
8
|
async function getClient(deps) {
|
|
9
9
|
const status = await getDaemonStatus(deps.lifecycleDeps);
|
|
10
10
|
if (status.state !== "running" || status.healthy === false) {
|
|
11
|
-
|
|
11
|
+
printDaemonNotRunning();
|
|
12
12
|
return null;
|
|
13
13
|
}
|
|
14
14
|
return deps.clientFactory(getDaemonUrl(status));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/down.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import type { StatusDeps } from "./status.js";
|
|
3
3
|
/**
|
|
4
|
-
* `rig down <
|
|
4
|
+
* `rig down <rig>` - tear down a rig by name or id.
|
|
5
5
|
* @param depsOverride - injectable deps for testing
|
|
6
6
|
* @returns Commander command
|
|
7
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwF9C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAiI9D"}
|
package/dist/commands/down.js
CHANGED
|
@@ -4,7 +4,57 @@ import { getDaemonStatus, getDaemonUrl } from "../daemon-lifecycle.js";
|
|
|
4
4
|
import { realDeps } from "./daemon.js";
|
|
5
5
|
const LONG_RUNNING_TIMEOUT_MS = 45_000;
|
|
6
6
|
/**
|
|
7
|
-
* `rig down
|
|
7
|
+
* Resolve a `rig down` handle (rig name OR id) to a concrete rig id, mirroring
|
|
8
|
+
* the `/api/rigs/summary` path `rig up` uses. Resolution is a PRE-STEP: the
|
|
9
|
+
* existing teardown + guards downstream are unchanged; this only maps the
|
|
10
|
+
* handle to an id.
|
|
11
|
+
*
|
|
12
|
+
* Safety order (destructive-op):
|
|
13
|
+
* 1. id-exact-match FIRST, across ALL rigs incl. archived - an id is unique, so
|
|
14
|
+
* it is never ambiguous, and an archived rig's id must still reach the
|
|
15
|
+
* canonical teardown id path (AC-2 unchanged).
|
|
16
|
+
* 2. else name-filter over ACTIVE (non-archived) rigs only:
|
|
17
|
+
* - exactly 1 active match -> resolve to that id;
|
|
18
|
+
* - >1 active matches -> AMBIGUOUS: halt, never guess (load-bearing AC-3);
|
|
19
|
+
* - 0 active matches -> NOT_FOUND: halt, honest error (AC-4).
|
|
20
|
+
*
|
|
21
|
+
* `/api/rigs/summary` defaults to ACTIVE-only and exposes `archivedAt`; we fetch
|
|
22
|
+
* with `includeArchived=true` so an archived id still id-matches, then filter
|
|
23
|
+
* names to active. So an active+archived same-name pair is NOT ambiguous (only
|
|
24
|
+
* the active candidate counts), and an archived-only name does not resolve by
|
|
25
|
+
* name (use the id, or the archive path).
|
|
26
|
+
*/
|
|
27
|
+
async function resolveRigHandle(client, handle) {
|
|
28
|
+
let summaries;
|
|
29
|
+
try {
|
|
30
|
+
// includeArchived=true so an archived rig's id still id-matches below
|
|
31
|
+
// (preserving today's `rig down <id>` path); names are filtered to active.
|
|
32
|
+
const res = await client.get("/api/rigs/summary?includeArchived=true");
|
|
33
|
+
if (res.status !== 200 || !Array.isArray(res.data)) {
|
|
34
|
+
return { kind: "passthrough", handle };
|
|
35
|
+
}
|
|
36
|
+
summaries = res.data;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { kind: "passthrough", handle };
|
|
40
|
+
}
|
|
41
|
+
// 1. id-exact-match first, across ALL rigs incl. archived (AC-2: down by id,
|
|
42
|
+
// unchanged; ids are never ambiguous; archived ids still reach teardown).
|
|
43
|
+
if (summaries.some((r) => r.id === handle)) {
|
|
44
|
+
return { kind: "resolved", id: handle };
|
|
45
|
+
}
|
|
46
|
+
// 2. name-filter over ACTIVE (non-archived) rigs only, symmetric with `up`.
|
|
47
|
+
const activeNameMatches = summaries.filter((r) => r.name === handle && r.archivedAt == null);
|
|
48
|
+
if (activeNameMatches.length === 1) {
|
|
49
|
+
return { kind: "resolved", id: activeNameMatches[0].id };
|
|
50
|
+
}
|
|
51
|
+
if (activeNameMatches.length > 1) {
|
|
52
|
+
return { kind: "ambiguous", name: handle, ids: activeNameMatches.map((r) => r.id) };
|
|
53
|
+
}
|
|
54
|
+
return { kind: "not_found", handle };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* `rig down <rig>` - tear down a rig by name or id.
|
|
8
58
|
* @param depsOverride - injectable deps for testing
|
|
9
59
|
* @returns Commander command
|
|
10
60
|
*/
|
|
@@ -12,12 +62,12 @@ export function downCommand(depsOverride) {
|
|
|
12
62
|
const cmd = new Command("down").description("Tear down a rig");
|
|
13
63
|
const getDepsF = () => depsOverride ?? { lifecycleDeps: realDeps(), clientFactory: (url) => new DaemonClient(url) };
|
|
14
64
|
cmd
|
|
15
|
-
.argument("<
|
|
65
|
+
.argument("<rig>", "Rig name or id to tear down")
|
|
16
66
|
.option("--delete", "Delete rig record after stopping")
|
|
17
67
|
.option("--force", "Kill sessions immediately")
|
|
18
68
|
.option("--snapshot", "Take snapshot before teardown")
|
|
19
69
|
.option("--json", "JSON output for agents")
|
|
20
|
-
.action(async (
|
|
70
|
+
.action(async (rigHandle, opts) => {
|
|
21
71
|
const deps = getDepsF();
|
|
22
72
|
const status = await getDaemonStatus(deps.lifecycleDeps);
|
|
23
73
|
if (status.state !== "running" || status.healthy === false) {
|
|
@@ -26,6 +76,44 @@ export function downCommand(depsOverride) {
|
|
|
26
76
|
return;
|
|
27
77
|
}
|
|
28
78
|
const client = deps.clientFactory(getDaemonUrl(status));
|
|
79
|
+
// Resolve the handle (name OR id) to a concrete id BEFORE the teardown POST.
|
|
80
|
+
// Ambiguous/not-found halt here and never reach `/api/down` - for a
|
|
81
|
+
// destructive op, ambiguity must stop, never guess (AC-3 load-bearing).
|
|
82
|
+
const resolution = await resolveRigHandle(client, rigHandle);
|
|
83
|
+
if (resolution.kind === "ambiguous") {
|
|
84
|
+
const fact = `'${resolution.name}' matches ${resolution.ids.length} rigs.`;
|
|
85
|
+
const consequence = "Refusing to tear down: an ambiguous name could destroy the wrong rig.";
|
|
86
|
+
const action = `Re-run with the specific id, e.g. ${resolution.ids.map((id) => `rig down ${id}`).join(" | ")}`;
|
|
87
|
+
if (opts.json) {
|
|
88
|
+
console.log(JSON.stringify({ error: { fact, consequence, action, candidates: resolution.ids } }));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.error(`Error: ${fact}`);
|
|
92
|
+
console.error(` ${consequence}`);
|
|
93
|
+
console.error(` ${action}`);
|
|
94
|
+
}
|
|
95
|
+
process.exitCode = 2;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (resolution.kind === "not_found") {
|
|
99
|
+
const fact = `No rig found matching '${resolution.handle}'.`;
|
|
100
|
+
const consequence = "Nothing was torn down.";
|
|
101
|
+
const action = "List rigs with: rig ps";
|
|
102
|
+
if (opts.json) {
|
|
103
|
+
console.log(JSON.stringify({ error: { fact, consequence, action } }));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.error(`Error: ${fact}`);
|
|
107
|
+
console.error(` ${consequence}`);
|
|
108
|
+
console.error(` ${action}`);
|
|
109
|
+
}
|
|
110
|
+
process.exitCode = 2;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// resolved -> the looked-up id; passthrough -> the raw handle (summary
|
|
114
|
+
// unavailable; daemon resolves by exact id, 404s if absent). Either way
|
|
115
|
+
// the SAME existing teardown path + guards run below - no forked path.
|
|
116
|
+
const rigId = resolution.kind === "resolved" ? resolution.id : resolution.handle;
|
|
29
117
|
const res = await client.post("/api/down", {
|
|
30
118
|
rigId,
|
|
31
119
|
delete: opts.delete ?? false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAavC,MAAM,uBAAuB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAe,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAe,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AA6K9F,MAAM,WAAW,MAAO,SAAQ,UAAU;IACxC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,CACb,IAAI,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAC/C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,CAAC,EAAE,uBAAuB,KAC3B,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;CAC7C;AAgPD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAmPxD"}
|
package/dist/commands/ps.js
CHANGED
|
@@ -246,6 +246,12 @@ function applyNodeFilter(entries, filter) {
|
|
|
246
246
|
return true;
|
|
247
247
|
});
|
|
248
248
|
}
|
|
249
|
+
// OPR.0.3.3.19 - build the /api/ps path, opting archived rigs back in when
|
|
250
|
+
// --include-archived is set. Default (no flag) leaves the daemon's
|
|
251
|
+
// archived-excluding default in force.
|
|
252
|
+
function psApiPath(opts) {
|
|
253
|
+
return opts.includeArchived ? "/api/ps?includeArchived=true" : "/api/ps";
|
|
254
|
+
}
|
|
249
255
|
function selectFields(entries, fields) {
|
|
250
256
|
return entries.map((e) => {
|
|
251
257
|
const out = {};
|
|
@@ -336,6 +342,7 @@ Examples:
|
|
|
336
342
|
rig ps --filter name-prefix=demo Filter by rig-name prefix
|
|
337
343
|
rig ps --nodes Per-node detail (human; truncated to ${HUMAN_NODE_BUDGET})
|
|
338
344
|
rig ps --nodes --json --limit 50 Bounded per-node JSON envelope
|
|
345
|
+
rig ps --include-archived Include archived rigs (marked with *); hidden by default
|
|
339
346
|
rig ps --nodes --active Show only nodes whose agentActivity.state == running (PL-019)
|
|
340
347
|
rig ps --nodes --filter agentActivity.state=running
|
|
341
348
|
Same as --active (the explicit form)
|
|
@@ -380,6 +387,7 @@ Exit codes:
|
|
|
380
387
|
.option("--summary", "Emit aggregate-only output (counts by status/lifecycle)")
|
|
381
388
|
.option("--filter <key=value>", "Filter entries; supported keys: status, lifecycleState, name-prefix, name, agentActivity.state")
|
|
382
389
|
.option("--active", "Shortcut for --filter agentActivity.state=running (PL-019)")
|
|
390
|
+
.option("--include-archived", "Include archived rigs (default hides them); parity with 'rig stream list --include-archived'")
|
|
383
391
|
.option("--host <id>", "Run on a remote host declared in ~/.openrig/hosts.yaml (CLI-side ssh shell-out)")
|
|
384
392
|
.action(async (opts) => {
|
|
385
393
|
const deps = getDepsF();
|
|
@@ -451,7 +459,7 @@ Exit codes:
|
|
|
451
459
|
await handleNodes(client, opts, parsedFilter, limit, fields, useEnvelope);
|
|
452
460
|
return;
|
|
453
461
|
}
|
|
454
|
-
const res = await client.get(
|
|
462
|
+
const res = await client.get(psApiPath(opts));
|
|
455
463
|
if (res.status >= 400) {
|
|
456
464
|
console.error(`Failed to fetch rig list from daemon (HTTP ${res.status}). Check daemon status with: rig status`);
|
|
457
465
|
process.exitCode = 2;
|
|
@@ -510,11 +518,20 @@ Exit codes:
|
|
|
510
518
|
const humanTruncated = !opts.full && limit === null && filtered.length > HUMAN_RIG_BUDGET;
|
|
511
519
|
const header = padRigRow("RIG", "NODES", "RUNNING", "ACTIVE", "WORK", "STATUS", "LIFECYCLE", "UPTIME", "SNAPSHOT");
|
|
512
520
|
console.log(header);
|
|
521
|
+
let anyArchivedShown = false;
|
|
513
522
|
for (const e of humanList) {
|
|
514
|
-
|
|
523
|
+
// OPR.0.3.3.19 - archived rigs only appear under --include-archived;
|
|
524
|
+
// mark them with a trailing "*" (legend footer below) so the operator
|
|
525
|
+
// can tell archived from active at a glance.
|
|
526
|
+
if (e.isArchived)
|
|
527
|
+
anyArchivedShown = true;
|
|
528
|
+
console.log(padRigRow(e.isArchived ? `${e.rigName ?? e.name} *` : (e.rigName ?? e.name), String(e.nodeCount), String(e.runningCount),
|
|
515
529
|
// Slice 15 — "—" when daemon predates the field; honest absence.
|
|
516
530
|
e.activeCount !== undefined ? String(e.activeCount) : "—", e.hasWorkCount !== undefined ? String(e.hasWorkCount) : "—", e.status, abbrevRigLifecycle(e.lifecycleState), e.uptime ?? "—", e.latestSnapshot ?? "—"));
|
|
517
531
|
}
|
|
532
|
+
if (anyArchivedShown) {
|
|
533
|
+
console.log("* = archived (hidden from the default view; shown via --include-archived). Reverse with: rig unarchive <rig>");
|
|
534
|
+
}
|
|
518
535
|
if (humanTruncated) {
|
|
519
536
|
const remaining = filtered.length - HUMAN_RIG_BUDGET;
|
|
520
537
|
console.log(`... and ${remaining} more rig${remaining === 1 ? "" : "s"} (truncated at ${HUMAN_RIG_BUDGET}).`);
|
|
@@ -528,7 +545,7 @@ Exit codes:
|
|
|
528
545
|
return cmd;
|
|
529
546
|
}
|
|
530
547
|
async function handleNodes(client, opts, parsedFilter, limit, fields, useEnvelope) {
|
|
531
|
-
const rigRes = await client.get(
|
|
548
|
+
const rigRes = await client.get(psApiPath(opts));
|
|
532
549
|
if (rigRes.status >= 400) {
|
|
533
550
|
console.error(`Failed to fetch rig list from daemon (HTTP ${rigRes.status}). Check daemon status with: rig status`);
|
|
534
551
|
process.exitCode = 2;
|
|
@@ -723,6 +740,8 @@ async function runCrossHostPs(hostId, opts, deps) {
|
|
|
723
740
|
argv.push("--summary");
|
|
724
741
|
if (opts.filter !== undefined)
|
|
725
742
|
argv.push("--filter", opts.filter);
|
|
743
|
+
if (opts.includeArchived)
|
|
744
|
+
argv.push("--include-archived");
|
|
726
745
|
if (opts.json)
|
|
727
746
|
argv.push("--json");
|
|
728
747
|
const result = await runner(host, argv);
|