@openrig/cli 0.4.3 → 0.4.4

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.
Files changed (287) hide show
  1. package/daemon/assets/guidance/openrig-start.md +6 -0
  2. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +49 -21
  3. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +12 -12
  4. package/daemon/dist/build-info.d.ts +12 -0
  5. package/daemon/dist/build-info.d.ts.map +1 -0
  6. package/daemon/dist/build-info.js +11 -0
  7. package/daemon/dist/build-info.js.map +1 -0
  8. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts +18 -0
  9. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts.map +1 -0
  10. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js +22 -0
  11. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js.map +1 -0
  12. package/daemon/dist/domain/feed/attention-aggregator.d.ts +31 -0
  13. package/daemon/dist/domain/feed/attention-aggregator.d.ts.map +1 -0
  14. package/daemon/dist/domain/feed/attention-aggregator.js +119 -0
  15. package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -0
  16. package/daemon/dist/domain/files/file-write-service.d.ts +11 -2
  17. package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -1
  18. package/daemon/dist/domain/files/file-write-service.js +77 -0
  19. package/daemon/dist/domain/files/file-write-service.js.map +1 -1
  20. package/daemon/dist/domain/hosts/fanout-contract.d.ts +33 -0
  21. package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -0
  22. package/daemon/dist/domain/hosts/fanout-contract.js +23 -0
  23. package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -0
  24. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +49 -0
  25. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -0
  26. package/daemon/dist/domain/hosts/hosts-registry-reader.js +165 -0
  27. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -0
  28. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +35 -0
  29. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -0
  30. package/daemon/dist/domain/hosts/remote-daemon-http.js +105 -0
  31. package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -0
  32. package/daemon/dist/domain/human-route-enforcer.d.ts +71 -0
  33. package/daemon/dist/domain/human-route-enforcer.d.ts.map +1 -0
  34. package/daemon/dist/domain/human-route-enforcer.js +80 -0
  35. package/daemon/dist/domain/human-route-enforcer.js.map +1 -0
  36. package/daemon/dist/domain/mission-control/audit-browse.d.ts +8 -0
  37. package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
  38. package/daemon/dist/domain/mission-control/audit-browse.js +19 -0
  39. package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
  40. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
  41. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
  42. package/daemon/dist/domain/mission-control/mission-control-action-log.js +4 -0
  43. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
  44. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +1 -1
  45. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
  46. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +1 -1
  47. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
  48. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +28 -0
  49. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  50. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +125 -0
  51. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  52. package/daemon/dist/domain/ps-projection.d.ts +28 -1
  53. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  54. package/daemon/dist/domain/ps-projection.js +39 -0
  55. package/daemon/dist/domain/ps-projection.js.map +1 -1
  56. package/daemon/dist/domain/queue-repository.d.ts +25 -1
  57. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  58. package/daemon/dist/domain/queue-repository.js +111 -7
  59. package/daemon/dist/domain/queue-repository.js.map +1 -1
  60. package/daemon/dist/domain/review/brief-spine.d.ts +19 -0
  61. package/daemon/dist/domain/review/brief-spine.d.ts.map +1 -0
  62. package/daemon/dist/domain/review/brief-spine.js +86 -0
  63. package/daemon/dist/domain/review/brief-spine.js.map +1 -0
  64. package/daemon/dist/domain/review/compose.d.ts +228 -0
  65. package/daemon/dist/domain/review/compose.d.ts.map +1 -0
  66. package/daemon/dist/domain/review/compose.js +773 -0
  67. package/daemon/dist/domain/review/compose.js.map +1 -0
  68. package/daemon/dist/domain/review/freeze.d.ts +31 -0
  69. package/daemon/dist/domain/review/freeze.d.ts.map +1 -0
  70. package/daemon/dist/domain/review/freeze.js +257 -0
  71. package/daemon/dist/domain/review/freeze.js.map +1 -0
  72. package/daemon/dist/domain/review/gather.d.ts +100 -0
  73. package/daemon/dist/domain/review/gather.d.ts.map +1 -0
  74. package/daemon/dist/domain/review/gather.js +676 -0
  75. package/daemon/dist/domain/review/gather.js.map +1 -0
  76. package/daemon/dist/domain/review/types.d.ts +258 -0
  77. package/daemon/dist/domain/review/types.d.ts.map +1 -0
  78. package/daemon/dist/domain/review/types.js +35 -0
  79. package/daemon/dist/domain/review/types.js.map +1 -0
  80. package/daemon/dist/domain/scope/scope-approve.d.ts +64 -0
  81. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -0
  82. package/daemon/dist/domain/scope/scope-approve.js +153 -0
  83. package/daemon/dist/domain/scope/scope-approve.js.map +1 -0
  84. package/daemon/dist/domain/scope/scope-audit.d.ts +9 -1
  85. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  86. package/daemon/dist/domain/scope/scope-audit.js +173 -1
  87. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  88. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts +49 -0
  89. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts.map +1 -0
  90. package/daemon/dist/domain/topology/multi-rig-launcher.js +132 -0
  91. package/daemon/dist/domain/topology/multi-rig-launcher.js.map +1 -0
  92. package/daemon/dist/domain/topology/remote-up-leaf.d.ts +29 -0
  93. package/daemon/dist/domain/topology/remote-up-leaf.d.ts.map +1 -0
  94. package/daemon/dist/domain/topology/remote-up-leaf.js +60 -0
  95. package/daemon/dist/domain/topology/remote-up-leaf.js.map +1 -0
  96. package/daemon/dist/domain/topology/topology-manifest.d.ts +34 -0
  97. package/daemon/dist/domain/topology/topology-manifest.d.ts.map +1 -0
  98. package/daemon/dist/domain/topology/topology-manifest.js +195 -0
  99. package/daemon/dist/domain/topology/topology-manifest.js.map +1 -0
  100. package/daemon/dist/domain/types.d.ts +5 -0
  101. package/daemon/dist/domain/types.d.ts.map +1 -1
  102. package/daemon/dist/domain/types.js.map +1 -1
  103. package/daemon/dist/domain/up-command-router.d.ts +1 -1
  104. package/daemon/dist/domain/up-command-router.d.ts.map +1 -1
  105. package/daemon/dist/domain/up-command-router.js +34 -2
  106. package/daemon/dist/domain/up-command-router.js.map +1 -1
  107. package/daemon/dist/domain/user-settings/settings-store.d.ts +17 -0
  108. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  109. package/daemon/dist/domain/user-settings/settings-store.js +109 -0
  110. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  111. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  112. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +51 -6
  113. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  114. package/daemon/dist/domain/workspace/workspace-doctor.d.ts +11 -0
  115. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  116. package/daemon/dist/domain/workspace/workspace-doctor.js +82 -0
  117. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  118. package/daemon/dist/routes/config.d.ts.map +1 -1
  119. package/daemon/dist/routes/config.js +15 -6
  120. package/daemon/dist/routes/config.js.map +1 -1
  121. package/daemon/dist/routes/files.d.ts.map +1 -1
  122. package/daemon/dist/routes/files.js +45 -1
  123. package/daemon/dist/routes/files.js.map +1 -1
  124. package/daemon/dist/routes/mission-control.d.ts.map +1 -1
  125. package/daemon/dist/routes/mission-control.js +67 -2
  126. package/daemon/dist/routes/mission-control.js.map +1 -1
  127. package/daemon/dist/routes/queue.d.ts +8 -2
  128. package/daemon/dist/routes/queue.d.ts.map +1 -1
  129. package/daemon/dist/routes/queue.js +44 -4
  130. package/daemon/dist/routes/queue.js.map +1 -1
  131. package/daemon/dist/routes/review.d.ts +3 -0
  132. package/daemon/dist/routes/review.d.ts.map +1 -0
  133. package/daemon/dist/routes/review.js +169 -0
  134. package/daemon/dist/routes/review.js.map +1 -0
  135. package/daemon/dist/routes/scope-approve.d.ts +3 -0
  136. package/daemon/dist/routes/scope-approve.d.ts.map +1 -0
  137. package/daemon/dist/routes/scope-approve.js +55 -0
  138. package/daemon/dist/routes/scope-approve.js.map +1 -0
  139. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  140. package/daemon/dist/routes/scope-audit.js +28 -1
  141. package/daemon/dist/routes/scope-audit.js.map +1 -1
  142. package/daemon/dist/routes/slices.d.ts.map +1 -1
  143. package/daemon/dist/routes/slices.js +49 -9
  144. package/daemon/dist/routes/slices.js.map +1 -1
  145. package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
  146. package/daemon/dist/routes/terminal-ws.js +58 -21
  147. package/daemon/dist/routes/terminal-ws.js.map +1 -1
  148. package/daemon/dist/routes/up.d.ts.map +1 -1
  149. package/daemon/dist/routes/up.js +84 -0
  150. package/daemon/dist/routes/up.js.map +1 -1
  151. package/daemon/dist/routes/workspace.js +2 -2
  152. package/daemon/dist/server.d.ts +1 -0
  153. package/daemon/dist/server.d.ts.map +1 -1
  154. package/daemon/dist/server.js +14 -1
  155. package/daemon/dist/server.js.map +1 -1
  156. package/daemon/dist/startup.d.ts.map +1 -1
  157. package/daemon/dist/startup.js +18 -3
  158. package/daemon/dist/startup.js.map +1 -1
  159. package/daemon/docs/reference/agent-startup-guide.md +1 -1
  160. package/daemon/docs/reference/product-factory-vps-runbook.md +132 -0
  161. package/daemon/docs/reference/sdlc-conventions.md +187 -0
  162. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
  163. package/daemon/specs/agents/conveyor/builder/guidance/role.md +1 -0
  164. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
  165. package/daemon/specs/agents/conveyor/lead/guidance/role.md +1 -0
  166. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
  167. package/daemon/specs/agents/conveyor/planner/guidance/role.md +1 -0
  168. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
  169. package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +1 -0
  170. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  171. package/daemon/specs/agents/design/product-designer/guidance/role.md +1 -0
  172. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  173. package/daemon/specs/agents/development/implementer/guidance/role.md +1 -0
  174. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  175. package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
  176. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  177. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +1 -0
  178. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  179. package/daemon/specs/agents/product-management/pm/guidance/role.md +13 -0
  180. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  181. package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +1 -0
  182. package/daemon/specs/agents/shared/agent.yaml +2 -0
  183. package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +115 -0
  184. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +4 -4
  185. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +69 -23
  186. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +2 -2
  187. package/daemon/specs/rigs/focused/pm-team/CULTURE.md +4 -0
  188. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +1 -1
  189. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +1 -1
  190. package/daemon/specs/rigs/preview/product-team/CULTURE.md +4 -0
  191. package/dist/build-info.d.ts +8 -0
  192. package/dist/build-info.d.ts.map +1 -0
  193. package/dist/build-info.js +11 -0
  194. package/dist/build-info.js.map +1 -0
  195. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  196. package/dist/commands/config-init-workspace.js +20 -4
  197. package/dist/commands/config-init-workspace.js.map +1 -1
  198. package/dist/commands/doctor.js +2 -2
  199. package/dist/commands/doctor.js.map +1 -1
  200. package/dist/commands/expand.js +1 -1
  201. package/dist/commands/expand.js.map +1 -1
  202. package/dist/commands/file.d.ts +7 -0
  203. package/dist/commands/file.d.ts.map +1 -0
  204. package/dist/commands/file.js +77 -0
  205. package/dist/commands/file.js.map +1 -0
  206. package/dist/commands/host.d.ts +34 -0
  207. package/dist/commands/host.d.ts.map +1 -0
  208. package/dist/commands/host.js +448 -0
  209. package/dist/commands/host.js.map +1 -0
  210. package/dist/commands/proof.d.ts +54 -0
  211. package/dist/commands/proof.d.ts.map +1 -0
  212. package/dist/commands/proof.js +311 -0
  213. package/dist/commands/proof.js.map +1 -0
  214. package/dist/commands/ps.d.ts +41 -7
  215. package/dist/commands/ps.d.ts.map +1 -1
  216. package/dist/commands/ps.js +343 -131
  217. package/dist/commands/ps.js.map +1 -1
  218. package/dist/commands/queue.d.ts.map +1 -1
  219. package/dist/commands/queue.js +76 -0
  220. package/dist/commands/queue.js.map +1 -1
  221. package/dist/commands/scope.d.ts.map +1 -1
  222. package/dist/commands/scope.js +140 -3
  223. package/dist/commands/scope.js.map +1 -1
  224. package/dist/commands/send.js +13 -4
  225. package/dist/commands/send.js.map +1 -1
  226. package/dist/commands/up.d.ts +2 -0
  227. package/dist/commands/up.d.ts.map +1 -1
  228. package/dist/commands/up.js +69 -2
  229. package/dist/commands/up.js.map +1 -1
  230. package/dist/commands/workspace.js +6 -6
  231. package/dist/commands/workspace.js.map +1 -1
  232. package/dist/config-store.d.ts +4 -0
  233. package/dist/config-store.d.ts.map +1 -1
  234. package/dist/config-store.js +68 -0
  235. package/dist/config-store.js.map +1 -1
  236. package/dist/cross-host-executor.d.ts +1 -0
  237. package/dist/cross-host-executor.d.ts.map +1 -1
  238. package/dist/cross-host-executor.js +4 -1
  239. package/dist/cross-host-executor.js.map +1 -1
  240. package/dist/daemon-lifecycle.d.ts.map +1 -1
  241. package/dist/daemon-lifecycle.js +4 -1
  242. package/dist/daemon-lifecycle.js.map +1 -1
  243. package/dist/host-registry.d.ts +9 -0
  244. package/dist/host-registry.d.ts.map +1 -1
  245. package/dist/host-registry.js +32 -2
  246. package/dist/host-registry.js.map +1 -1
  247. package/dist/index.d.ts.map +1 -1
  248. package/dist/index.js +7 -0
  249. package/dist/index.js.map +1 -1
  250. package/dist/lib/file-transfer.d.ts +89 -0
  251. package/dist/lib/file-transfer.d.ts.map +1 -0
  252. package/dist/lib/file-transfer.js +300 -0
  253. package/dist/lib/file-transfer.js.map +1 -0
  254. package/dist/lib/hosts/fanout-contract.d.ts +33 -0
  255. package/dist/lib/hosts/fanout-contract.d.ts.map +1 -0
  256. package/dist/lib/hosts/fanout-contract.js +23 -0
  257. package/dist/lib/hosts/fanout-contract.js.map +1 -0
  258. package/dist/lib/scope/scope-audit.d.ts +9 -1
  259. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  260. package/dist/lib/scope/scope-audit.js +173 -1
  261. package/dist/lib/scope/scope-audit.js.map +1 -1
  262. package/dist/lib/scope/templates.d.ts +1 -0
  263. package/dist/lib/scope/templates.d.ts.map +1 -1
  264. package/dist/lib/scope/templates.js +9 -0
  265. package/dist/lib/scope/templates.js.map +1 -1
  266. package/dist/lib/scope-templates/backlog-deprecation.md +16 -0
  267. package/dist/lib/scope-templates/backlog-tech-debt.md +16 -0
  268. package/dist/lib/scope-templates/bug-fix.md +16 -0
  269. package/dist/lib/scope-templates/implementation-prd.md +33 -0
  270. package/dist/lib/scope-templates/mission-placeholder.md +1 -1
  271. package/dist/lib/scope-templates/mission-progress.md +1 -1
  272. package/dist/lib/scope-templates/mission-release.md +1 -1
  273. package/dist/lib/scope-templates/placeholder.md +11 -7
  274. package/dist/lib/scope-templates/proof.md +5 -1
  275. package/dist/lib/scope-templates/release-feature.md +14 -6
  276. package/dist/lib/scope-templates/research.md +16 -0
  277. package/dist/lib/scope-templates/slice-progress.md +1 -1
  278. package/dist/version.d.ts +5 -0
  279. package/dist/version.d.ts.map +1 -1
  280. package/dist/version.js +11 -1
  281. package/dist/version.js.map +1 -1
  282. package/package.json +1 -1
  283. package/ui/dist/assets/index-D69ZhNIr.js +598 -0
  284. package/ui/dist/assets/index-DJYun-8d.css +32 -0
  285. package/ui/dist/index.html +2 -2
  286. package/ui/dist/assets/index-DYZniQcc.js +0 -597
  287. package/ui/dist/assets/index-trcb4Yf_.css +0 -32
@@ -0,0 +1,448 @@
1
+ // OPR.0.4.4.13 — the host-registry verbs. CAPPED at exactly three
2
+ // (add / list / doctor — arch R13-2a): no edit/remove/tunnel/bootstrap
3
+ // verbs; hand-editing hosts.yaml remains the path for everything else,
4
+ // and the bootstrap ships as script + runbook.
5
+ //
6
+ // Secret hygiene (FR-1): every render carries bearer POINTERS (env var /
7
+ // file NAMES) only — no code path in this file resolves a bearer value
8
+ // for display.
9
+ import { Command } from "commander";
10
+ import { existsSync } from "node:fs";
11
+ import { connect } from "node:net";
12
+ import { addHostEntry, defaultHostRegistryPath, loadHostRegistry, hostDisplayTarget, resolveHost, resolveRemoteBearer } from "../host-registry.js";
13
+ import { runCrossHostCommand } from "../cross-host-executor.js";
14
+ function nestedBoolean(obj, path) {
15
+ let cur = obj;
16
+ for (const part of path) {
17
+ if (typeof cur !== "object" || cur === null)
18
+ return undefined;
19
+ cur = cur[part];
20
+ }
21
+ return typeof cur === "boolean" ? cur : undefined;
22
+ }
23
+ function tailscaleRunSshFromPrefs(text) {
24
+ if (!text.trim().startsWith("{"))
25
+ return undefined;
26
+ const parsed = JSON.parse(text);
27
+ return nestedBoolean(parsed, ["RunSSH"])
28
+ ?? nestedBoolean(parsed, ["Prefs", "RunSSH"])
29
+ ?? nestedBoolean(parsed, ["CurrentProfile", "RunSSH"]);
30
+ }
31
+ function defaultDoctorDeps() {
32
+ return {
33
+ run: (host, argv) => runCrossHostCommand(host, argv),
34
+ httpGet: async (url, headers) => {
35
+ const res = await fetch(url, { headers, signal: AbortSignal.timeout(10_000) });
36
+ return { status: res.status, body: await res.text() };
37
+ },
38
+ tcpProbe: (target, port, timeoutMs) => new Promise((resolve) => {
39
+ const sock = connect({ host: target, port, timeout: timeoutMs });
40
+ sock.on("connect", () => { sock.destroy(); resolve("open"); });
41
+ sock.on("timeout", () => { sock.destroy(); resolve("closed"); });
42
+ sock.on("error", () => { sock.destroy(); resolve("closed"); });
43
+ }),
44
+ };
45
+ }
46
+ /** FR-1 doctor legs — each failing step maps to a DISTINCT actionable error:
47
+ * "SSH works but daemon is down" ≠ "daemon works but registry is wrong" ≠
48
+ * "remote rig binary missing/old". */
49
+ export async function doctorLegs(host, deps) {
50
+ const rows = [];
51
+ if (host.transport === "ssh") {
52
+ const reach = await deps.run(host, ["true"]);
53
+ if (!reach.ok && (reach.failedStep === "ssh-unreachable" || reach.failedStep === "permission-gate")) {
54
+ rows.push({
55
+ step: "transport-reachability",
56
+ status: "fail",
57
+ detail: `ssh to ${host.target} failed (${reach.failedStep}): ${reach.sshStderr.trim()}`,
58
+ fix: reach.failedStep === "permission-gate"
59
+ ? "SSH auth/permission gate — check the key, agent, and remote authorized_keys"
60
+ : "verify the ssh target/alias, tailnet connectivity, and that sshd is running",
61
+ });
62
+ return rows; // later legs are meaningless without the shell
63
+ }
64
+ rows.push({ step: "transport-reachability", status: "pass", detail: `ssh to ${host.target} ok` });
65
+ const version = await deps.run(host, ["rig", "--version"]);
66
+ if (!version.ok) {
67
+ rows.push({
68
+ step: "remote-rig-binary",
69
+ status: "fail",
70
+ detail: "reached the remote shell, but `rig --version` failed — remote rig binary missing or broken",
71
+ fix: "install the published artifact on the host: npm install -g @openrig/cli (see the product-factory runbook)",
72
+ });
73
+ return rows;
74
+ }
75
+ rows.push({ step: "remote-rig-binary", status: "pass", detail: `remote rig ${version.stdout.trim() || "(version unreadable)"}` });
76
+ const daemon = await deps.run(host, ["rig", "daemon", "status"]);
77
+ const daemonUp = daemon.ok && /running/i.test(daemon.stdout);
78
+ rows.push(daemonUp
79
+ ? { step: "remote-daemon-health", status: "pass", detail: "remote daemon reports running" }
80
+ : {
81
+ step: "remote-daemon-health",
82
+ status: "fail",
83
+ detail: "SSH works and rig is installed, but the remote daemon is not running",
84
+ fix: "on the host: rig daemon start (then re-run doctor)",
85
+ });
86
+ if (!daemonUp)
87
+ return rows;
88
+ const whoami = await deps.run(host, ["rig", "ps", "--json", "--limit", "5"]);
89
+ let identityOk = false;
90
+ if (whoami.ok) {
91
+ try {
92
+ identityOk = typeof JSON.parse(whoami.stdout) === "object";
93
+ }
94
+ catch {
95
+ identityOk = false;
96
+ }
97
+ }
98
+ rows.push(identityOk
99
+ ? { step: "remote-identity", status: "pass", detail: "remote daemon identity/list resolves (rig ps --json parses)" }
100
+ : {
101
+ step: "remote-identity",
102
+ status: "fail",
103
+ detail: "daemon is up but remote identity/list did not resolve",
104
+ fix: "on the host: check `rig ps --json` directly; the daemon API may be unhealthy even though status says running",
105
+ });
106
+ return rows;
107
+ }
108
+ // http transport
109
+ const bearer = resolveRemoteBearer(host);
110
+ if (!bearer.ok) {
111
+ rows.push({ step: "transport-reachability", status: "fail", detail: bearer.error, fix: "set the bearer env var / file the registry entry points at (pointer names: rig host list)" });
112
+ return rows;
113
+ }
114
+ try {
115
+ const health = await deps.httpGet(`${host.url}/healthz`, { Authorization: `Bearer ${bearer.token}` });
116
+ if (health.status === 401 || health.status === 403) {
117
+ rows.push({ step: "transport-reachability", status: "fail", detail: `daemon reachable but rejected the bearer (HTTP ${health.status})`, fix: "registry is reachable but the token is wrong — rotate/set the bearer the entry points at" });
118
+ return rows;
119
+ }
120
+ if (health.status < 200 || health.status >= 300) {
121
+ rows.push({ step: "transport-reachability", status: "fail", detail: `healthz returned HTTP ${health.status}`, fix: "the daemon answered abnormally — check remote daemon logs" });
122
+ return rows;
123
+ }
124
+ rows.push({ step: "transport-reachability", status: "pass", detail: `healthz ok at ${host.url}` });
125
+ rows.push({ step: "remote-daemon-health", status: "pass", detail: "healthz IS the daemon health check on http transport" });
126
+ }
127
+ catch (err) {
128
+ rows.push({ step: "transport-reachability", status: "fail", detail: `daemon unreachable at ${host.url}: ${err.message}`, fix: "check tailnet connectivity and that the remote daemon is running (rig daemon start on the host)" });
129
+ return rows;
130
+ }
131
+ rows.push({
132
+ step: "remote-rig-binary",
133
+ status: "unknown",
134
+ detail: "not determinable over http transport (no shell)",
135
+ fix: "verify via an ssh-transport entry for this host, or on the host directly: rig --version",
136
+ });
137
+ try {
138
+ const ps = await deps.httpGet(`${host.url}/api/ps`, { Authorization: `Bearer ${bearer.token}` });
139
+ rows.push(ps.status >= 200 && ps.status < 300
140
+ ? { step: "remote-identity", status: "pass", detail: "authenticated daemon API answers (/api/ps)" }
141
+ : { step: "remote-identity", status: "fail", detail: `/api/ps returned HTTP ${ps.status}`, fix: "daemon healthz is up but the API is unhealthy — check remote daemon logs" });
142
+ }
143
+ catch (err) {
144
+ rows.push({ step: "remote-identity", status: "fail", detail: `/api/ps unreachable: ${err.message}`, fix: "check remote daemon logs" });
145
+ }
146
+ return rows;
147
+ }
148
+ /** FR-2 — THE one built-in posture profile (arch R13-2b: a named constant
149
+ * table, no framework). Every item is three-valued; UNKNOWN is never
150
+ * smoothed to pass, and every non-pass carries its fix. */
151
+ export const POSTURE_PROFILE_ID = "product-factory-vps";
152
+ export async function postureCheck(host, deps, opts = {}) {
153
+ if (host.transport !== "ssh") {
154
+ // Posture needs a shell. Report every item unknown — honestly.
155
+ return POSTURE_ITEM_IDS.map((id) => ({
156
+ step: id,
157
+ status: "unknown",
158
+ detail: "posture checks need shell access; this host is registered with http transport",
159
+ fix: "register an ssh-transport entry for this host (or run the checks on the host per the runbook)",
160
+ }));
161
+ }
162
+ const rows = [];
163
+ const sh = async (cmd) => deps.run(host, ["sh", "-c", cmd]);
164
+ // 1. non-root openrig user
165
+ const idOut = await sh("id -u openrig 2>/dev/null");
166
+ if (idOut.ok && idOut.stdout.trim() !== "") {
167
+ rows.push(idOut.stdout.trim() === "0"
168
+ ? { step: "nonroot-openrig-user", status: "fail", detail: "user 'openrig' resolves to uid 0", fix: "create a non-root openrig user per the runbook" }
169
+ : { step: "nonroot-openrig-user", status: "pass", detail: `user 'openrig' uid ${idOut.stdout.trim()}` });
170
+ }
171
+ else {
172
+ rows.push({ step: "nonroot-openrig-user", status: "fail", detail: "user 'openrig' does not exist", fix: "adduser openrig + key-only SSH per the runbook" });
173
+ }
174
+ // 2+3. sshd effective config (root SSH off, password auth off)
175
+ const sshd = await sh("sudo -n sshd -T 2>/dev/null || sshd -T 2>/dev/null || true");
176
+ const sshdOut = sshd.ok ? sshd.stdout.toLowerCase() : "";
177
+ const sshdItem = (step, key, want) => {
178
+ if (!sshdOut.includes(key)) {
179
+ return { step, status: "unknown", detail: "effective sshd config not readable from this vantage (sshd -T needs root)", fix: "on the host: sudo sshd -T | grep " + key };
180
+ }
181
+ return sshdOut.includes(`${key} ${want}`)
182
+ ? { step, status: "pass", detail: `${key} ${want}` }
183
+ : { step, status: "fail", detail: `sshd -T reports ${key} != ${want}`, fix: `set ${key} ${want} in /etc/ssh/sshd_config.d/99-openrig-hardening.conf and reload sshd` };
184
+ };
185
+ rows.push(sshdItem("root-ssh-disabled", "permitrootlogin", "no"));
186
+ rows.push(sshdItem("key-only-ssh", "passwordauthentication", "no"));
187
+ // 4+5. UFW default-deny + tailnet ingress
188
+ const ufw = await sh("sudo -n ufw status verbose 2>/dev/null || true");
189
+ const ufwOut = ufw.ok ? ufw.stdout.toLowerCase() : "";
190
+ if (ufwOut.trim() === "") {
191
+ const unknownUfw = (step) => ({ step, status: "unknown", detail: "ufw status not readable from this vantage (needs sudo)", fix: "on the host: sudo ufw status verbose" });
192
+ rows.push(unknownUfw("ufw-default-deny-incoming"));
193
+ rows.push(unknownUfw("tailnet-ingress-allowed"));
194
+ }
195
+ else {
196
+ rows.push(/default:\s*deny\s*\(incoming/.test(ufwOut)
197
+ ? { step: "ufw-default-deny-incoming", status: "pass", detail: "ufw default deny (incoming)" }
198
+ : { step: "ufw-default-deny-incoming", status: "fail", detail: "ufw incoming default is not deny", fix: "sudo ufw default deny incoming" });
199
+ // R2-B1: mentioning tailscale0 is NOT enough — a DENY on tailscale0
200
+ // must never pass. Pass requires an ALLOW IN rule on the interface.
201
+ const tailnetAllowIn = ufwOut.split("\n").some((line) => line.includes("tailscale0") && /allow\s+in/.test(line));
202
+ if (tailnetAllowIn) {
203
+ rows.push({ step: "tailnet-ingress-allowed", status: "pass", detail: "ufw has an ALLOW IN rule on tailscale0" });
204
+ }
205
+ else if (ufwOut.includes("tailscale0")) {
206
+ rows.push({ step: "tailnet-ingress-allowed", status: "fail", detail: "tailscale0 appears in ufw rules but with no ALLOW IN rule (deny/other only)", fix: "sudo ufw allow in on tailscale0" });
207
+ }
208
+ else {
209
+ rows.push({ step: "tailnet-ingress-allowed", status: "fail", detail: "no tailscale0 allow rule found", fix: "sudo ufw allow in on tailscale0" });
210
+ }
211
+ }
212
+ // 6. tailscale flags (no subnet routes / exit node / ts-SSH)
213
+ const ts = await sh("tailscale status --json 2>/dev/null || true");
214
+ const prefs = await sh("tailscale debug prefs --json 2>/dev/null || true");
215
+ let routes;
216
+ let exitNode;
217
+ let runSsh;
218
+ const unknownReasons = [];
219
+ try {
220
+ if (ts.ok && ts.stdout.trim().startsWith("{")) {
221
+ const parsed = JSON.parse(ts.stdout);
222
+ routes = parsed.Self?.PrimaryRoutes?.length ?? 0;
223
+ exitNode = (parsed.ExitNodeStatus !== undefined && parsed.ExitNodeStatus !== null) || parsed.Self?.ExitNodeOption === true;
224
+ }
225
+ else {
226
+ unknownReasons.push("tailscale status unreadable");
227
+ }
228
+ }
229
+ catch {
230
+ unknownReasons.push("tailscale status did not parse");
231
+ }
232
+ try {
233
+ runSsh = prefs.ok ? tailscaleRunSshFromPrefs(prefs.stdout) : undefined;
234
+ if (runSsh === undefined)
235
+ unknownReasons.push("tailscale debug prefs unreadable");
236
+ }
237
+ catch {
238
+ unknownReasons.push("tailscale debug prefs did not parse");
239
+ }
240
+ if ((routes ?? 0) > 0 || exitNode === true || runSsh === true) {
241
+ rows.push({
242
+ step: "tailscale-minimal-trust",
243
+ status: "fail",
244
+ detail: `subnet routes: ${routes ?? "unknown"}; exit node in use: ${exitNode ?? "unknown"}; Tailscale SSH enabled: ${runSsh ?? "unknown"}`,
245
+ fix: "remove advertised routes / exit-node use (tailscale set) and disable Tailscale SSH: tailscale set --ssh=false",
246
+ });
247
+ }
248
+ else if (routes === 0 && exitNode === false && runSsh === false) {
249
+ rows.push({ step: "tailscale-minimal-trust", status: "pass", detail: "no advertised subnet routes; no exit-node use; Tailscale SSH disabled" });
250
+ }
251
+ else {
252
+ rows.push({
253
+ step: "tailscale-minimal-trust",
254
+ status: "unknown",
255
+ detail: `tailscale posture not fully determined (${unknownReasons.join("; ")})`,
256
+ fix: "on the host: tailscale status --json && tailscale debug prefs --json; disable Tailscale SSH with tailscale set --ssh=false",
257
+ });
258
+ }
259
+ // 7. daemon bound loopback/tailnet — never public. R2-B1: a SPECIFIC
260
+ // public IP bind must fail exactly like a wildcard — pass is an
261
+ // ALLOWLIST (loopback or the tailnet CGNAT range 100.64.0.0/10), never
262
+ // "not wildcard".
263
+ const ss = await sh("ss -tln 2>/dev/null | grep ':7433' || true");
264
+ const ssOut = ss.ok ? ss.stdout : "";
265
+ const listenAddrs = ssOut
266
+ .split("\n")
267
+ .map((line) => line.match(/(\S+):7433\b/)?.[1])
268
+ .filter((a) => a !== undefined);
269
+ if (listenAddrs.length === 0) {
270
+ rows.push({ step: "daemon-bind-not-public", status: "unknown", detail: "no listener on :7433 observed (daemon may be down)", fix: "start the daemon, then re-check: ss -tln | grep 7433" });
271
+ }
272
+ else {
273
+ const isLoopbackOrTailnet = (addr) => {
274
+ const a = addr.replace(/^\[|\]$/g, "");
275
+ if (a.startsWith("127.") || a === "::1")
276
+ return true;
277
+ const m = a.match(/^100\.(\d+)\./);
278
+ return m !== null && Number(m[1]) >= 64 && Number(m[1]) <= 127;
279
+ };
280
+ const offending = listenAddrs.filter((a) => !isLoopbackOrTailnet(a));
281
+ rows.push(offending.length === 0
282
+ ? { step: "daemon-bind-not-public", status: "pass", detail: `listener(s) bound loopback/tailnet only: ${listenAddrs.join(", ")}` }
283
+ : { step: "daemon-bind-not-public", status: "fail", detail: `daemon listens on a non-loopback/non-tailnet address: ${offending.join(", ")}`, fix: "bind the daemon to loopback/tailnet only (OPENRIG daemon host config); never expose :7433 publicly" });
284
+ }
285
+ // 8+9. public reachability probes — only meaningful with a known PUBLIC address.
286
+ if (opts.publicAddr) {
287
+ for (const [step, port] of [["public-daemon-port-unreachable", 7433], ["public-ssh-unreachable-or-accepted", 22]]) {
288
+ const probe = await deps.tcpProbe(opts.publicAddr, port, 5000);
289
+ rows.push(probe === "open"
290
+ ? { step, status: "fail", detail: `${opts.publicAddr}:${port} is publicly reachable`, fix: "remove the public allow rule / firewall the port (the smoke-test hardening bar: public :22/:7433 time out)" }
291
+ : { step, status: "pass", detail: `${opts.publicAddr}:${port} not reachable (${probe})` });
292
+ }
293
+ }
294
+ else {
295
+ const unknownProbe = (step, port) => ({
296
+ step, status: "unknown",
297
+ detail: `public reachability of :${port} not probed (no public address known — the registry target may be a tailnet alias)`,
298
+ fix: `re-run with --public-addr <ip> to probe from this vantage`,
299
+ });
300
+ rows.push(unknownProbe("public-daemon-port-unreachable", 7433));
301
+ rows.push(unknownProbe("public-ssh-unreachable-or-accepted", 22));
302
+ }
303
+ return rows;
304
+ }
305
+ export const POSTURE_ITEM_IDS = [
306
+ "nonroot-openrig-user",
307
+ "root-ssh-disabled",
308
+ "key-only-ssh",
309
+ "ufw-default-deny-incoming",
310
+ "tailnet-ingress-allowed",
311
+ "tailscale-minimal-trust",
312
+ "daemon-bind-not-public",
313
+ "public-daemon-port-unreachable",
314
+ "public-ssh-unreachable-or-accepted",
315
+ ];
316
+ function renderRows(rows, json) {
317
+ if (json) {
318
+ console.log(JSON.stringify(rows));
319
+ return;
320
+ }
321
+ const glyph = { pass: "✓", fail: "✗", unknown: "?" };
322
+ for (const r of rows) {
323
+ console.log(`${glyph[r.status]} ${r.step}: ${r.detail}${r.fix ? `\n fix: ${r.fix}` : ""}`);
324
+ }
325
+ }
326
+ function authPointer(h) {
327
+ if (h.transport === "ssh")
328
+ return "ssh-key";
329
+ return h.bearer_env ? `env:${h.bearer_env}` : h.bearer_file ? `file:${h.bearer_file}` : "—";
330
+ }
331
+ export function hostCommand(doctorDepsOverride) {
332
+ const cmd = new Command("host").description("Manage the multi-host registry (~/.openrig/hosts.yaml)");
333
+ cmd
334
+ .command("add")
335
+ .description("Add a host entry (validated with the registry loader's own rules)")
336
+ .requiredOption("--id <id>", "Unique host id")
337
+ .requiredOption("--transport <transport>", "ssh or http")
338
+ .option("--target <target>", "SSH target (DNS name, ssh-config alias, or IP) — ssh transport")
339
+ .option("--user <user>", "SSH user — ssh transport")
340
+ .option("--url <url>", "Remote daemon base URL — http transport")
341
+ .option("--bearer-env <name>", "Env var NAME holding the bearer token — http transport (pointer, never a value)")
342
+ .option("--bearer-file <path>", "File PATH holding the bearer token — http transport (pointer, never a value)")
343
+ .option("--notes <text>", "Free-form operator note")
344
+ .option("--json", "JSON output")
345
+ .action((opts) => {
346
+ const rawEntry = { id: opts.id, transport: opts.transport };
347
+ if (opts.target !== undefined)
348
+ rawEntry["target"] = opts.target;
349
+ if (opts.user !== undefined)
350
+ rawEntry["user"] = opts.user;
351
+ if (opts.url !== undefined)
352
+ rawEntry["url"] = opts.url;
353
+ if (opts.bearerEnv !== undefined)
354
+ rawEntry["bearer_env"] = opts.bearerEnv;
355
+ if (opts.bearerFile !== undefined)
356
+ rawEntry["bearer_file"] = opts.bearerFile;
357
+ if (opts.notes !== undefined)
358
+ rawEntry["notes"] = opts.notes;
359
+ const res = addHostEntry(rawEntry);
360
+ if (!res.ok) {
361
+ console.error(res.error);
362
+ process.exitCode = 1;
363
+ return;
364
+ }
365
+ if (opts.json) {
366
+ console.log(JSON.stringify({ ok: true, path: res.path, entry: res.entry }));
367
+ return;
368
+ }
369
+ console.log(`Added host '${res.entry.id}' (${res.entry.transport}) to ${res.path}`);
370
+ console.log(`Verify it: rig host doctor ${res.entry.id}`);
371
+ });
372
+ cmd
373
+ .command("list")
374
+ .description("List registered hosts (config pointers only — never secret values)")
375
+ .option("--json", "JSON output")
376
+ .action((opts) => {
377
+ const registryPath = defaultHostRegistryPath();
378
+ if (!existsSync(registryPath)) {
379
+ if (opts.json) {
380
+ console.log(JSON.stringify([]));
381
+ return;
382
+ }
383
+ console.log(`No hosts registered in ${registryPath}. Add one: rig host add --id <id> --transport <ssh|http> ...`);
384
+ return;
385
+ }
386
+ const loaded = loadHostRegistry(registryPath);
387
+ if (!loaded.ok) {
388
+ console.error(loaded.error);
389
+ process.exitCode = 1;
390
+ return;
391
+ }
392
+ if (opts.json) {
393
+ // Entries as validated: bearer fields are NAMES by construction.
394
+ console.log(JSON.stringify(loaded.registry.hosts));
395
+ return;
396
+ }
397
+ if (loaded.registry.hosts.length === 0) {
398
+ console.log(`No hosts registered in ${registryPath}. Add one: rig host add --id <id> --transport <ssh|http> ...`);
399
+ return;
400
+ }
401
+ const pad = (s, n) => (s.length > n ? s.slice(0, n - 1) + "…" : s.padEnd(n));
402
+ console.log(`${pad("ID", 20)} ${pad("TRANSPORT", 10)} ${pad("TARGET", 36)} ${pad("AUTH", 24)} NOTES`);
403
+ for (const h of loaded.registry.hosts) {
404
+ console.log(`${pad(h.id, 20)} ${pad(h.transport, 10)} ${pad(hostDisplayTarget(h), 36)} ${pad(authPointer(h), 24)} ${h.notes ?? "—"}`);
405
+ }
406
+ });
407
+ cmd
408
+ .command("doctor")
409
+ .description("Stepwise host verification (+ --posture for the product-factory-vps baseline)")
410
+ .argument("<id>", "Registered host id")
411
+ .option("--posture <profile>", `Run the posture baseline (only built-in profile: ${POSTURE_PROFILE_ID})`)
412
+ .option("--public-addr <ip>", "Public address for the outside-vantage reachability probes (posture items 8-9)")
413
+ .option("--json", "JSON output")
414
+ .action(async (id, opts) => {
415
+ const deps = doctorDepsOverride ?? defaultDoctorDeps();
416
+ const loaded = loadHostRegistry();
417
+ if (!loaded.ok) {
418
+ console.error(loaded.error);
419
+ process.exitCode = 1;
420
+ return;
421
+ }
422
+ const resolved = resolveHost(loaded.registry, id);
423
+ if (!resolved.ok) {
424
+ // The DISTINCT "registry is wrong" error class.
425
+ console.error(`registry: ${resolved.error}`);
426
+ process.exitCode = 1;
427
+ return;
428
+ }
429
+ if (opts.posture !== undefined && opts.posture !== POSTURE_PROFILE_ID) {
430
+ console.error(`unknown posture profile '${opts.posture}'. The only built-in profile is: ${POSTURE_PROFILE_ID}`);
431
+ process.exitCode = 1;
432
+ return;
433
+ }
434
+ const rows = await doctorLegs(resolved.host, deps);
435
+ if (opts.posture) {
436
+ rows.push(...await postureCheck(resolved.host, deps, { publicAddr: opts.publicAddr }));
437
+ }
438
+ renderRows(rows, opts.json);
439
+ if (rows.some((r) => r.status === "fail"))
440
+ process.exitCode = 1;
441
+ const unknowns = rows.filter((r) => r.status === "unknown").length;
442
+ if (!opts.json && unknowns > 0) {
443
+ console.log(`${unknowns} item${unknowns === 1 ? "" : "s"} UNKNOWN — unknown is not pass; see the fix lines to verify.`);
444
+ }
445
+ });
446
+ return cmd;
447
+ }
448
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/commands/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * `rig proof` — the proof-drop write path (OPR.0.4.4.19 FR-8 + FR-11;
4
+ * conventions C1 + C2 + C8, D2 attestation).
5
+ *
6
+ * CLI-side filesystem only (plan-review + arch-lead confirmed): the drop
7
+ * validates the C1 header AT THE MOMENT THE EVIDENCE IS IN-HAND, writes the
8
+ * artifact into the slice's proof/ dir, and echoes the parsed header (the
9
+ * seat sees what the composer will see). No daemon involvement, no synthetic
10
+ * qitems, no DB writes.
11
+ *
12
+ * LOAD-BEARING boundaries:
13
+ * - Validation applies ONLY to drops made through this path. An artifact
14
+ * written by any other means (raw file write, existing workflows) is
15
+ * NEVER blocked at write time — the backstop is `rig scope audit`
16
+ * (FR-10), not a write-path gate on ordinary file I/O.
17
+ * - The D2 proof contract + self_check are AGENT JUDGMENT recorded here;
18
+ * the drop path ADVISES (exit 0) and never blocks on them. There is no
19
+ * configuration that makes any advisory blocking (BR-7).
20
+ */
21
+ /** C1 ratified closed sets (BR-4 — extending them is a convention change
22
+ * owned by pm-lead, not a code decision). */
23
+ export declare const C1_ARTIFACT_TYPES: readonly ["guard", "qa", "rev1-r1", "rev1-r2", "adjudication"];
24
+ export declare const C1_VERDICTS: readonly ["CLEAR", "BLOCKING", "CONCERNING", "PASS", "NOT-CLEAR"];
25
+ export interface C1Header {
26
+ slice: string;
27
+ candidate_sha: string;
28
+ artifact_type: string;
29
+ verdict: string;
30
+ money_evidence: string;
31
+ /** D2 optional attestation fields — advise-never-block. */
32
+ evidences?: string[];
33
+ self_check?: string;
34
+ }
35
+ export interface C1ValidationResult {
36
+ ok: boolean;
37
+ missing: string[];
38
+ invalid: Array<{
39
+ field: string;
40
+ value: string;
41
+ allowed: readonly string[];
42
+ }>;
43
+ }
44
+ /** Validate the five required C1 fields + closed sets. Pure. */
45
+ export declare function validateC1Header(header: Partial<C1Header>): C1ValidationResult;
46
+ /**
47
+ * Parse the pinned `## Proof contract` section out of a slice's
48
+ * IMPLEMENTATION-PRD.md (the C7 pinned name; PM-lane authored). Returns the
49
+ * promised items (checkbox-item form, one promised item per line), or null
50
+ * when the slice declares no contract (tier-1 degrade — zero noise).
51
+ */
52
+ export declare function parseProofContract(prdContent: string): string[] | null;
53
+ export declare function proofCommand(): Command;
54
+ //# sourceMappingURL=proof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../src/commands/proof.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;;;;;;GAkBG;AAEH;8CAC8C;AAC9C,eAAO,MAAM,iBAAiB,gEAAiE,CAAC;AAChG,eAAO,MAAM,WAAW,mEAAoE,CAAC;AAK7F,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC9E;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,kBAAkB,CAc9E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAYtE;AAMD,wBAAgB,YAAY,IAAI,OAAO,CA0PtC"}