blun-king-cli 9.1.566 → 9.1.569

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 (262) hide show
  1. package/agent-spine-plugin/.claude-plugin/marketplace.json +1 -1
  2. package/agent-spine-plugin/.claude-plugin/plugin.json +1 -1
  3. package/agent-spine-plugin/.codex-plugin/plugin.json +2 -1
  4. package/agent-spine-plugin/CHANGELOG.md +1581 -0
  5. package/agent-spine-plugin/README.md +30 -4
  6. package/agent-spine-plugin/blun.plugin.json +3 -3
  7. package/agent-spine-plugin/docs/acceptance.md +61 -0
  8. package/agent-spine-plugin/docs/assignment-continuation.md +48 -0
  9. package/agent-spine-plugin/docs/host-integration.md +178 -0
  10. package/agent-spine-plugin/docs/preflight-recall.md +69 -0
  11. package/agent-spine-plugin/docs/preservation-contract.md +53 -0
  12. package/agent-spine-plugin/docs/quality-gates.md +50 -0
  13. package/agent-spine-plugin/docs/releasing.md +85 -0
  14. package/agent-spine-plugin/docs/session-timeline.md +251 -0
  15. package/agent-spine-plugin/docs/source-roots.md +113 -0
  16. package/agent-spine-plugin/docs/structured-completion.md +67 -0
  17. package/agent-spine-plugin/docs/world-model.md +94 -0
  18. package/agent-spine-plugin/hooks/codex.json +2 -2
  19. package/agent-spine-plugin/hooks/hooks.json +1 -1
  20. package/agent-spine-plugin/hooks/version.json +1 -1
  21. package/agent-spine-plugin/package.json +13 -3
  22. package/agent-spine-plugin/scripts/check-codex-install.js +226 -0
  23. package/agent-spine-plugin/scripts/check-hosts.js +14 -5
  24. package/agent-spine-plugin/scripts/check-install-hook.js +226 -0
  25. package/agent-spine-plugin/scripts/check-install-selfstarter.js +154 -0
  26. package/agent-spine-plugin/scripts/check-install.js +478 -0
  27. package/agent-spine-plugin/scripts/check-line-budget.js +58 -0
  28. package/agent-spine-plugin/scripts/check-syntax.js +29 -0
  29. package/agent-spine-plugin/scripts/github-actions.js +11 -0
  30. package/agent-spine-plugin/scripts/hermetic-process.js +183 -0
  31. package/agent-spine-plugin/scripts/release-check.js +145 -0
  32. package/agent-spine-plugin/scripts/run-acceptance.js +19 -0
  33. package/agent-spine-plugin/scripts/run-checks.js +47 -0
  34. package/agent-spine-plugin/scripts/run-tests-hermetic.js +89 -0
  35. package/agent-spine-plugin/skills/agent-spine/SKILL.md +16 -2
  36. package/agent-spine-plugin/spine-example/1-identity.md +12 -0
  37. package/agent-spine-plugin/spine-example/2-voice.md +6 -0
  38. package/agent-spine-plugin/spine-example/3-conduct.md +8 -0
  39. package/agent-spine-plugin/spine-example/4-history.md +4 -0
  40. package/agent-spine-plugin/src/cli-agent.js +296 -0
  41. package/agent-spine-plugin/src/cli-attention.js +95 -0
  42. package/agent-spine-plugin/src/cli-autonomy.js +36 -0
  43. package/agent-spine-plugin/src/cli-common.js +71 -0
  44. package/agent-spine-plugin/src/cli-continuity.js +116 -0
  45. package/agent-spine-plugin/src/cli-core.js +128 -0
  46. package/agent-spine-plugin/src/cli-diagnostics.js +291 -0
  47. package/agent-spine-plugin/src/cli-host.js +21 -0
  48. package/agent-spine-plugin/src/cli-learning.js +305 -0
  49. package/agent-spine-plugin/src/cli-premortem.js +16 -0
  50. package/agent-spine-plugin/src/cli-sharing.js +230 -0
  51. package/agent-spine-plugin/src/cli.js +40 -1350
  52. package/agent-spine-plugin/src/codex-reader-launcher.js +182 -0
  53. package/agent-spine-plugin/src/hook.js +185 -567
  54. package/agent-spine-plugin/src/index.js +16 -2
  55. package/agent-spine-plugin/src/lib/acceptance.js +113 -11
  56. package/agent-spine-plugin/src/lib/action-lesson-recall.js +53 -0
  57. package/agent-spine-plugin/src/lib/attention-context.js +167 -0
  58. package/agent-spine-plugin/src/lib/attention-events.js +113 -0
  59. package/agent-spine-plugin/src/lib/attention-privacy.js +72 -0
  60. package/agent-spine-plugin/src/lib/attention-schema.js +164 -0
  61. package/agent-spine-plugin/src/lib/attention-storage.js +93 -0
  62. package/agent-spine-plugin/src/lib/attention.js +9 -600
  63. package/agent-spine-plugin/src/lib/audit-premortem.js +223 -0
  64. package/agent-spine-plugin/src/lib/audit.js +56 -6
  65. package/agent-spine-plugin/src/lib/autonomy-policy.js +110 -0
  66. package/agent-spine-plugin/src/lib/autonomy-store.js +202 -0
  67. package/agent-spine-plugin/src/lib/autonomy.js +8 -0
  68. package/agent-spine-plugin/src/lib/briefing.js +67 -4
  69. package/agent-spine-plugin/src/lib/catalog-document-read.js +51 -0
  70. package/agent-spine-plugin/src/lib/catalog.js +1 -1
  71. package/agent-spine-plugin/src/lib/codex-installation.js +231 -0
  72. package/agent-spine-plugin/src/lib/codex-skill-installation.js +211 -0
  73. package/agent-spine-plugin/src/lib/context.js +3 -1
  74. package/agent-spine-plugin/src/lib/delivery-agent-usage.js +224 -0
  75. package/agent-spine-plugin/src/lib/delivery-assignment.js +220 -0
  76. package/agent-spine-plugin/src/lib/delivery-command-actions.js +453 -0
  77. package/agent-spine-plugin/src/lib/delivery-knowledge.js +78 -0
  78. package/agent-spine-plugin/src/lib/delivery-premortem-binding.js +107 -0
  79. package/agent-spine-plugin/src/lib/delivery-premortem-closure.js +171 -0
  80. package/agent-spine-plugin/src/lib/delivery-premortem-codec.js +45 -0
  81. package/agent-spine-plugin/src/lib/delivery-premortem-correction.js +101 -0
  82. package/agent-spine-plugin/src/lib/delivery-premortem-file.js +21 -0
  83. package/agent-spine-plugin/src/lib/delivery-premortem-index.js +493 -0
  84. package/agent-spine-plugin/src/lib/delivery-premortem-inspection.js +37 -0
  85. package/agent-spine-plugin/src/lib/delivery-premortem-recovery.js +120 -0
  86. package/agent-spine-plugin/src/lib/delivery-premortem-rejection.js +65 -0
  87. package/agent-spine-plugin/src/lib/delivery-premortem-results.js +28 -0
  88. package/agent-spine-plugin/src/lib/delivery-premortem-session-guard.js +46 -0
  89. package/agent-spine-plugin/src/lib/delivery-premortem-write-ledger.js +285 -0
  90. package/agent-spine-plugin/src/lib/delivery-premortem.js +499 -0
  91. package/agent-spine-plugin/src/lib/delivery-shell-heredoc.js +115 -0
  92. package/agent-spine-plugin/src/lib/delivery-shell-substitutions.js +111 -0
  93. package/agent-spine-plugin/src/lib/delivery-shell-wrapper.js +64 -0
  94. package/agent-spine-plugin/src/lib/delivery-target.js +73 -0
  95. package/agent-spine-plugin/src/lib/delivery-verification.js +445 -0
  96. package/agent-spine-plugin/src/lib/documents.js +27 -5
  97. package/agent-spine-plugin/src/lib/filesystem-retry.js +2 -0
  98. package/agent-spine-plugin/src/lib/gateway-common.js +68 -0
  99. package/agent-spine-plugin/src/lib/gateway-control.js +302 -0
  100. package/agent-spine-plugin/src/lib/gateway-delivery.js +103 -0
  101. package/agent-spine-plugin/src/lib/gateway-execution.js +350 -0
  102. package/agent-spine-plugin/src/lib/gateway-host-lifecycle.js +185 -0
  103. package/agent-spine-plugin/src/lib/gateway-inspection.js +85 -0
  104. package/agent-spine-plugin/src/lib/gateway-knowledge.js +129 -0
  105. package/agent-spine-plugin/src/lib/gateway-policy-provenance.js +197 -0
  106. package/agent-spine-plugin/src/lib/gateway-premortem-disposition.js +82 -0
  107. package/agent-spine-plugin/src/lib/gateway-premortem.js +363 -0
  108. package/agent-spine-plugin/src/lib/gateway-runs.js +300 -0
  109. package/agent-spine-plugin/src/lib/gateway-runtime-identity.js +31 -0
  110. package/agent-spine-plugin/src/lib/gateway-runtime-records.js +21 -0
  111. package/agent-spine-plugin/src/lib/gateway-runtime.js +18 -1623
  112. package/agent-spine-plugin/src/lib/gateway-state-transaction.js +356 -0
  113. package/agent-spine-plugin/src/lib/gateway-state.js +342 -0
  114. package/agent-spine-plugin/src/lib/hook-artifact-guards.js +356 -0
  115. package/agent-spine-plugin/src/lib/hook-audit.js +16 -2
  116. package/agent-spine-plugin/src/lib/hook-briefing-use.js +68 -0
  117. package/agent-spine-plugin/src/lib/hook-context.js +424 -0
  118. package/agent-spine-plugin/src/lib/hook-final-message.js +26 -0
  119. package/agent-spine-plugin/src/lib/hook-input.js +27 -0
  120. package/agent-spine-plugin/src/lib/hook-output.js +140 -0
  121. package/agent-spine-plugin/src/lib/hook-premortem.js +257 -0
  122. package/agent-spine-plugin/src/lib/hook-process-advisory.js +37 -0
  123. package/agent-spine-plugin/src/lib/hook-protection.js +95 -0
  124. package/agent-spine-plugin/src/lib/hook-stop-verification.js +84 -0
  125. package/agent-spine-plugin/src/lib/hook-timeline.js +91 -0
  126. package/agent-spine-plugin/src/lib/identifier-analysis.js +446 -0
  127. package/agent-spine-plugin/src/lib/indexed-memory.js +23 -6
  128. package/agent-spine-plugin/src/lib/knowledge-evidence.js +431 -0
  129. package/agent-spine-plugin/src/lib/learning-applications.js +441 -0
  130. package/agent-spine-plugin/src/lib/learning-candidates.js +274 -0
  131. package/agent-spine-plugin/src/lib/learning-context.js +130 -0
  132. package/agent-spine-plugin/src/lib/learning-delivery-contracts.js +310 -0
  133. package/agent-spine-plugin/src/lib/learning-evaluation-contracts.js +350 -0
  134. package/agent-spine-plugin/src/lib/learning-evaluation-registration.js +372 -0
  135. package/agent-spine-plugin/src/lib/learning-evaluation-revocation.js +292 -0
  136. package/agent-spine-plugin/src/lib/learning-evidence-contracts.js +321 -0
  137. package/agent-spine-plugin/src/lib/learning-findings.js +458 -0
  138. package/agent-spine-plugin/src/lib/learning-measurement-contracts.js +285 -0
  139. package/agent-spine-plugin/src/lib/learning-measurements.js +265 -0
  140. package/agent-spine-plugin/src/lib/learning-outcome-contracts.js +165 -0
  141. package/agent-spine-plugin/src/lib/learning-outcomes.js +343 -0
  142. package/agent-spine-plugin/src/lib/learning-reconciliation.js +290 -0
  143. package/agent-spine-plugin/src/lib/learning-retry-contracts.js +188 -0
  144. package/agent-spine-plugin/src/lib/learning-schema.js +229 -0
  145. package/agent-spine-plugin/src/lib/learning-scope-targets.js +424 -0
  146. package/agent-spine-plugin/src/lib/learning-state-upgrade.js +477 -0
  147. package/agent-spine-plugin/src/lib/learning-status-configuration.js +476 -0
  148. package/agent-spine-plugin/src/lib/learning-storage.js +203 -0
  149. package/agent-spine-plugin/src/lib/learning-trial-recovery.js +218 -0
  150. package/agent-spine-plugin/src/lib/learning-validation-contracts.js +375 -0
  151. package/agent-spine-plugin/src/lib/learning-validation-renewal.js +298 -0
  152. package/agent-spine-plugin/src/lib/learning-validation-runtime.js +234 -0
  153. package/agent-spine-plugin/src/lib/learning.js +36 -6923
  154. package/agent-spine-plugin/src/lib/lesson-recall-session.js +172 -0
  155. package/agent-spine-plugin/src/lib/mcp-autonomy-tools.js +37 -0
  156. package/agent-spine-plugin/src/lib/mcp-delivery-completion.js +124 -0
  157. package/agent-spine-plugin/src/lib/mcp-delivery-tools.js +45 -0
  158. package/agent-spine-plugin/src/lib/mcp-premortem.js +68 -0
  159. package/agent-spine-plugin/src/lib/mcp-runtime.js +269 -0
  160. package/agent-spine-plugin/src/lib/mcp-source-context.js +51 -0
  161. package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +164 -0
  162. package/agent-spine-plugin/src/lib/mcp-world-tools.js +52 -0
  163. package/agent-spine-plugin/src/lib/owned-file-lock.js +30 -10
  164. package/agent-spine-plugin/src/lib/project-portfolio.js +176 -0
  165. package/agent-spine-plugin/src/lib/selfstarter-core.js +382 -0
  166. package/agent-spine-plugin/src/lib/selfstarter-jobs.js +149 -0
  167. package/agent-spine-plugin/src/lib/selfstarter-lease.js +204 -0
  168. package/agent-spine-plugin/src/lib/selfstarter-policy.js +90 -0
  169. package/agent-spine-plugin/src/lib/selfstarter-workspace.js +111 -0
  170. package/agent-spine-plugin/src/lib/selfstarter.js +11 -911
  171. package/agent-spine-plugin/src/lib/session-timeline-auth.js +316 -0
  172. package/agent-spine-plugin/src/lib/session-timeline-codex.js +58 -0
  173. package/agent-spine-plugin/src/lib/session-timeline-contract.js +48 -0
  174. package/agent-spine-plugin/src/lib/session-timeline-enrollment-source.js +41 -0
  175. package/agent-spine-plugin/src/lib/session-timeline-enrollment-storage.js +132 -0
  176. package/agent-spine-plugin/src/lib/session-timeline-enrollment-transport.js +17 -0
  177. package/agent-spine-plugin/src/lib/session-timeline-enrollment.js +500 -0
  178. package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +157 -0
  179. package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +74 -0
  180. package/agent-spine-plugin/src/lib/session-timeline-host-receipt.js +117 -0
  181. package/agent-spine-plugin/src/lib/session-timeline-invocation.js +201 -0
  182. package/agent-spine-plugin/src/lib/session-timeline-king.js +79 -0
  183. package/agent-spine-plugin/src/lib/session-timeline-prior.js +59 -0
  184. package/agent-spine-plugin/src/lib/session-timeline-provider.js +34 -0
  185. package/agent-spine-plugin/src/lib/session-timeline-query.js +55 -0
  186. package/agent-spine-plugin/src/lib/session-timeline-results.js +31 -0
  187. package/agent-spine-plugin/src/lib/session-timeline-root.js +11 -0
  188. package/agent-spine-plugin/src/lib/session-timeline-search.js +82 -0
  189. package/agent-spine-plugin/src/lib/session-timeline-sid-acl.js +217 -0
  190. package/agent-spine-plugin/src/lib/session-timeline-source.js +83 -0
  191. package/agent-spine-plugin/src/lib/session-timeline-state.js +45 -0
  192. package/agent-spine-plugin/src/lib/session-timeline-transport.js +50 -0
  193. package/agent-spine-plugin/src/lib/session-timeline-windows-acl.js +148 -0
  194. package/agent-spine-plugin/src/lib/session-timeline.js +453 -0
  195. package/agent-spine-plugin/src/lib/source-roots.js +69 -136
  196. package/agent-spine-plugin/src/lib/source-tree-scan.js +178 -0
  197. package/agent-spine-plugin/src/lib/task-knowledge-context.js +78 -0
  198. package/agent-spine-plugin/src/lib/timeline-tool-guard.js +202 -0
  199. package/agent-spine-plugin/src/lib/world-knowledge.js +249 -0
  200. package/agent-spine-plugin/src/lib/world-model.js +278 -0
  201. package/agent-spine-plugin/src/mcp.js +20 -161
  202. package/agent-spine-plugin/src/version.js +1 -1
  203. package/agent-spine-plugin/src/worker.js +22 -5
  204. package/bin/agent-resume-snapshot.cjs +2 -2
  205. package/bin/agentspine-king-goal-inbox.mjs +111 -0
  206. package/bin/agentspine-king-goal-intake.mjs +106 -0
  207. package/bin/baseline-skill-performance-policy.cjs +1 -16
  208. package/bin/core-bootstrap.js +2 -0
  209. package/bin/curiosity-scout-policy.cjs +5 -1
  210. package/bin/input-draft-persistence.cjs +2 -2
  211. package/bin/king-tui-function-contract.json +33 -0
  212. package/bin/launcher-restart-policy.cjs +150 -0
  213. package/bin/launcher-runtime.js +56 -44
  214. package/bin/managed-context-startup-policy.cjs +27 -0
  215. package/bin/managed-plugin-selection.cjs +116 -0
  216. package/bin/mistake-relevance-policy.cjs +1 -1
  217. package/bin/observer-hooks.cjs +14 -0
  218. package/bin/oversized-context-offload-policy.cjs +86 -0
  219. package/bin/plugin-bootstrap.js +7 -40
  220. package/bin/proactive-compaction-policy.cjs +1 -1
  221. package/bin/provider-model-refresh-deadline.cjs +53 -0
  222. package/bin/provider-model-refresh-policy.cjs +107 -0
  223. package/bin/release-artifact-freeze-policy.cjs +30 -0
  224. package/bin/repeated-user-message-projection.cjs +3 -126
  225. package/bin/research-page-result.cjs +74 -0
  226. package/bin/runtime-exit-ledger.cjs +1 -0
  227. package/bin/session-compaction-policy.cjs +84 -0
  228. package/bin/skill-listing-performance-policy.cjs +2 -2
  229. package/bin/standard-tools-bootstrap.js +0 -37
  230. package/bin/subagent-skill-policy.cjs +3 -1
  231. package/bin/telegram-approval-relay.cjs +12 -7
  232. package/bin/telegram-private-conversation-policy.cjs +3 -2
  233. package/bin/telegram-queue-handoff-policy.cjs +24 -0
  234. package/bin/thinking-activity-status-policy.cjs +1 -1
  235. package/bin/thinking-only-guard.cjs +16 -12
  236. package/bin/tool-call-loop-policy.cjs +0 -2
  237. package/bin/tool-result-offload-policy.cjs +11 -2
  238. package/bin/tui-functional-contract.cjs +55 -0
  239. package/bin/update-notice.js +18 -14
  240. package/bin/user-message-offload-policy.cjs +1 -1
  241. package/bin/user-prompt-hook-origin-policy.cjs +34 -0
  242. package/bin/windows-node-crash-dump.cjs +110 -0
  243. package/blun.mjs +2517 -1048
  244. package/codebase-index/codebase_index.py +4 -3
  245. package/package.json +3 -17
  246. package/standard-skills/research-evidence/SKILL.md +39 -0
  247. package/standard-skills/research-evidence/references/evidence-format.md +82 -0
  248. package/standard-skills/research-evidence/scripts/evidence-collection.cjs +254 -0
  249. package/standard-skills/research-evidence/scripts/score-report.cjs +112 -0
  250. package/standard-skills/web-lesen/SKILL.md +37 -22
  251. package/standard-skills/web-lesen/scripts/crawl_public.py +376 -0
  252. package/telegram-plugin/DELIVERY.md +36 -0
  253. package/telegram-plugin/bin/telegram-approval-relay.cjs +13 -7
  254. package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +122 -0
  255. package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +3 -2
  256. package/telegram-plugin/bin/telegram-reply-parts.cjs +149 -0
  257. package/telegram-plugin/dist/bridge.mjs +11 -57
  258. package/telegram-plugin/dist/mcp-server.mjs +33 -4
  259. package/agent-spine-plugin/skill/SKILL.md +0 -76
  260. package/bin/mnemo-connect-heartbeat.cjs +0 -204
  261. package/bin/mnemo-tool-agent-policy.cjs +0 -22
  262. package/telegram-plugin/bin/telegram-mnemo-capture.cjs +0 -297
@@ -0,0 +1,128 @@
1
+ import { scanAndSave, verifyCatalog } from "./lib/catalog.js";
2
+ import { readDocument, resolveContext } from "./lib/context.js";
3
+ import { sessionBriefing } from "./lib/briefing.js";
4
+ import { annotateDocument, linkDocuments, linkEntities, relationshipContext, upsertEntity } from "./lib/graph.js";
5
+ import { renderAcceptanceReport, runVisibleAcceptance } from "./lib/acceptance.js";
6
+ import { booleanFlag, output } from "./cli-common.js";
7
+
8
+ export const coreCommands = new Set([
9
+ "acceptance",
10
+ "scan",
11
+ "context",
12
+ "briefing",
13
+ "read",
14
+ "verify",
15
+ "link",
16
+ "annotate",
17
+ "entity",
18
+ "relate",
19
+ "relationships"
20
+ ]);
21
+
22
+ export async function runCoreCommand({ command, flags, positional, json }) {
23
+ if (command === "acceptance") {
24
+ if (positional.length || Object.keys(flags).some((name) => name !== "json")) {
25
+ throw new Error("acceptance supports only --json");
26
+ }
27
+ const report = await runVisibleAcceptance();
28
+ if (json) return output(report, true);
29
+ process.stdout.write(renderAcceptanceReport(report));
30
+ return;
31
+ }
32
+
33
+ if (command === "scan") {
34
+ const result = await scanAndSave(positional[0] || process.cwd());
35
+ return output(json ? result : {
36
+ root: result.catalog.root,
37
+ catalog: result.catalogPath,
38
+ documents: result.catalog.summary.total,
39
+ protected: result.catalog.summary.protected,
40
+ layers: result.catalog.summary.byLayer
41
+ }, json);
42
+ }
43
+
44
+ if (command === "context") {
45
+ const root = positional[0] || process.cwd();
46
+ const result = await resolveContext({
47
+ root,
48
+ cwd: flags.cwd || root,
49
+ host: flags.host || "generic",
50
+ maxBytes: Number(flags["max-bytes"] || 65536),
51
+ includeContent: flags["no-content"] !== true
52
+ });
53
+ return output(result, json);
54
+ }
55
+
56
+ if (command === "briefing") {
57
+ const root = positional[0] || process.cwd();
58
+ return output(await sessionBriefing({
59
+ root, cwd: flags.cwd || root, host: flags.host || "generic",
60
+ entityId: flags.entity || null, groupId: flags.group || null,
61
+ userId: flags.user || null, tenantId: flags.tenant || null,
62
+ projectId: flags.project || null, currentTaskId: flags["current-task"] || null,
63
+ includePrivate: booleanFlag(flags["include-private"]),
64
+ focusActive: !booleanFlag(flags["allow-attention"]),
65
+ includeSourceContent: !booleanFlag(flags["no-source-content"]),
66
+ maxBytes: Number(flags["max-bytes"] ?? 16384)
67
+ }), json);
68
+ }
69
+
70
+ if (command === "read") {
71
+ const result = await readDocument({
72
+ root: flags.root || process.cwd(),
73
+ path: positional[0],
74
+ offset: Number(flags.offset || 0),
75
+ length: Number(flags.length || 65536)
76
+ });
77
+ return output(json ? result : result.content, json);
78
+ }
79
+
80
+ if (command === "verify") {
81
+ const result = await verifyCatalog(positional[0] || process.cwd());
82
+ output(result, json);
83
+ if (!result.ok) process.exitCode = 1;
84
+ return;
85
+ }
86
+
87
+ if (command === "link") {
88
+ const result = await linkDocuments({
89
+ root: flags.root || process.cwd(), from: positional[0], to: positional[1],
90
+ relation: flags.relation || "related", reason: flags.reason || "",
91
+ confidence: Number(flags.confidence ?? 0.5)
92
+ });
93
+ return output(result, json);
94
+ }
95
+
96
+ if (command === "annotate") {
97
+ const result = await annotateDocument({
98
+ root: flags.root || process.cwd(), path: positional[0], layer: flags.layer,
99
+ reason: flags.reason || "", confidence: Number(flags.confidence ?? 0.5)
100
+ });
101
+ return output(result, json);
102
+ }
103
+
104
+ if (command === "entity") {
105
+ const result = await upsertEntity({
106
+ root: flags.root || process.cwd(), id: positional[0], kind: flags.kind,
107
+ displayName: flags.name || "", confidence: Number(flags.confidence ?? 0.5),
108
+ privacy: flags.privacy || "private"
109
+ });
110
+ return output(result, json);
111
+ }
112
+
113
+ if (command === "relate") {
114
+ const result = await linkEntities({
115
+ root: flags.root || process.cwd(), from: positional[0], to: positional[1],
116
+ relation: flags.relation || "related", reason: flags.reason || "",
117
+ confidence: Number(flags.confidence ?? 0.5), privacy: flags.privacy || "private"
118
+ });
119
+ return output(result, json);
120
+ }
121
+
122
+ if (command === "relationships") {
123
+ return output(await relationshipContext({
124
+ root: flags.root || process.cwd(), entityId: positional[0],
125
+ includePrivate: Boolean(flags["include-private"]), groupId: flags.group || null
126
+ }), json);
127
+ }
128
+ }
@@ -0,0 +1,291 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { runAudit } from "./lib/audit.js";
3
+ import { learningOutcomeStatus } from "./lib/learning.js";
4
+ import { checkHosts } from "../scripts/check-hosts.js";
5
+ import { resolveHostSourceCatalog } from "./lib/source-roots.js";
6
+ import { scanIndexedMemoryOrphans } from "./lib/indexed-memory-offline.js";
7
+ import { preflightStatus } from "./lib/preflight.js";
8
+ import { VERSION } from "./version.js";
9
+ import { booleanFlag, output } from "./cli-common.js";
10
+
11
+ export const diagnosticsCommands = new Set([
12
+ "doctor",
13
+ "audit",
14
+ "mcp"
15
+ ]);
16
+
17
+ export async function runDiagnosticsCommand({ command, flags, positional, json }) {
18
+ if (command === "doctor") {
19
+ let hostIntegration;
20
+ try {
21
+ hostIntegration = await checkHosts(fileURLToPath(new URL("..", import.meta.url)));
22
+ } catch (error) {
23
+ hostIntegration = { ok: false, error: error.message };
24
+ }
25
+ let sourceResolution = null;
26
+ let orphanScan = null;
27
+ const sourceHost = flags.host || process.env.AGENTSPINE_HOST;
28
+ if (["claude", "codex"].includes(sourceHost)) {
29
+ try {
30
+ const resolved = await resolveHostSourceCatalog({ host: sourceHost, cwd: flags.cwd || process.cwd() });
31
+ sourceResolution = resolved.diagnostics;
32
+ if (booleanFlag(flags["offline-memory-orphans"])) {
33
+ if (sourceHost !== "claude" || !resolved.memoryRoot) throw new Error("offline memory orphan scan requires a resolved Claude project-memory root");
34
+ orphanScan = await scanIndexedMemoryOrphans(resolved.memoryRoot);
35
+ }
36
+ }
37
+ catch (error) { sourceResolution = { status: "failed-closed", reason: error.message }; }
38
+ }
39
+ let preflight;
40
+ try { preflight = await preflightStatus(); }
41
+ catch (error) { preflight = { status: "failed-closed", error: error.message }; }
42
+ let learningOutcomes;
43
+ try {
44
+ const status = await learningOutcomeStatus({ root: positional[0] || process.cwd() });
45
+ const unboundAfterReceipts = status.records.reduce((sum, item) => sum + item.afterReceipts - item.boundAfterReceipts, 0);
46
+ const undeliveredAfterReceipts = status.records.reduce((sum, item) => sum + item.afterReceipts - item.deliveredAfterReceipts, 0);
47
+ const stalePendingApplications = status.records.reduce((sum, item) => sum + item.stalePendingApplications, 0);
48
+ const totalOutcomeReceipts = status.records.reduce((sum, item) => sum + item.beforeReceipts + item.afterReceipts, 0);
49
+ const plannedOutcomeReceipts = status.records.reduce((sum, item) => sum + item.plannedOutcomeReceipts, 0);
50
+ const coverageBoundReceipts = status.records.reduce((sum, item) => sum + item.coverageBoundReceipts, 0);
51
+ const legacyCoverageReceipts = status.records.reduce((sum, item) => sum + item.legacyCoverageReceipts, 0);
52
+ const provenanceBoundReceipts = status.records.reduce((sum, item) => sum + item.provenanceBoundReceipts, 0);
53
+ const legacyProvenanceReceipts = status.records.reduce((sum, item) => sum + item.legacyProvenanceReceipts, 0);
54
+ const measurementReceipts = status.records.reduce((sum, item) => sum + item.measurementReceipts, 0);
55
+ const measurementLineageReceipts = status.records.reduce((sum, item) => sum + item.measurementLineageReceipts, 0);
56
+ const candidateEvidenceLineageReceipts = status.candidateEvidenceLineageReceipts;
57
+ const consumedMeasurementReceipts = status.records.reduce((sum, item) => sum + item.consumedMeasurementReceipts, 0);
58
+ const staleUnconsumedMeasurements = status.records.reduce((sum, item) => sum + item.staleUnconsumedMeasurements, 0);
59
+ const lineageBoundReceipts = status.records.reduce((sum, item) => sum + item.lineageBoundReceipts, 0);
60
+ const pairedOutcomeReceipts = status.records.reduce((sum, item) => sum + item.pairedOutcomeReceipts, 0);
61
+ const pairedEvaluatorPairs = status.records.reduce((sum, item) => sum + item.pairedEvaluatorPairs, 0);
62
+ const evaluatorRootBoundReceipts = status.records.reduce((sum, item) => sum + item.evaluatorRootBoundReceipts, 0);
63
+ const independentEvaluatorRoots = status.records.reduce((sum, item) => sum + item.independentEvaluatorRoots, 0);
64
+ const evaluatorRegistryContracts = status.records.reduce((sum, item) => sum + item.evaluatorRegistryContracts, 0);
65
+ const inactiveEvaluatorRegistryContracts = status.records.reduce((sum, item) => sum + item.inactiveEvaluatorRegistryContracts, 0);
66
+ const currentValidatedLessons = status.records.filter((item) => item.validationLeaseStatus === "current-validated").length;
67
+ const staleValidatedLessons = status.records.filter((item) => item.validationLeaseStatus === "stale-validated").length;
68
+ const unprovenValidatedLessons = status.records.filter((item) => item.validationLeaseStatus === "unproven-validated").length;
69
+ const revokedValidatedLessons = status.records.filter((item) => item.validationLeaseStatus === "revoked-validated").length;
70
+ const renewedValidationLeases = status.records.filter((item) =>
71
+ ["agentspine.learning-validation/v2", "agentspine.learning-validation/v3",
72
+ "agentspine.learning-validation/v4", "agentspine.learning-validation/v5"].includes(item.validationLeaseSchema)).length;
73
+ const fixedCohortValidationLeases = status.records.filter((item) =>
74
+ ["agentspine.learning-validation/v3", "agentspine.learning-validation/v4",
75
+ "agentspine.learning-validation/v5"]
76
+ .includes(item.validationLeaseSchema)).length;
77
+ const admissionBoundValidationLeases = status.records.filter((item) =>
78
+ ["agentspine.learning-validation/v4", "agentspine.learning-validation/v5"]
79
+ .includes(item.validationLeaseSchema)).length;
80
+ const trialBoundValidationLeases = status.records.filter((item) =>
81
+ item.validationLeaseSchema === "agentspine.learning-validation/v5").length;
82
+ const activeRevalidations = status.records.filter((item) => item.revalidationStatus === "active").length;
83
+ const staleRevalidations = status.records.filter((item) => item.revalidationStatus === "stale").length;
84
+ const fixedCohortRevalidations = status.records.filter((item) =>
85
+ item.revalidationStatus === "active"
86
+ && ["first-completed-turns", "first-admitted-turns",
87
+ "first-admitted-trials"].includes(item.revalidationSelectionMode)).length;
88
+ const admissionBoundRevalidations = status.records.filter((item) =>
89
+ item.revalidationStatus === "active" && ["first-admitted-turns", "first-admitted-trials"]
90
+ .includes(item.revalidationSelectionMode)).length;
91
+ const trialBoundRevalidations = status.records.filter((item) =>
92
+ item.revalidationStatus === "active" && item.revalidationSelectionMode === "first-admitted-trials").length;
93
+ const requiredRevalidationDeliveries = status.records.reduce((sum, item) =>
94
+ sum + item.revalidationRequiredDeliveries, 0);
95
+ const completedRevalidationDeliveries = status.records.reduce((sum, item) =>
96
+ sum + item.revalidationCompletedDeliveries, 0);
97
+ const admittedRevalidationApplications = status.records.reduce((sum, item) =>
98
+ sum + item.revalidationAdmittedApplications, 0);
99
+ const initialTrialContracts = status.records.filter((item) => item.initialTrialMode === "first-admitted-trials").length;
100
+ const requiredInitialTrials = status.records.reduce((sum, item) => sum + item.initialTrialSlots, 0);
101
+ const admittedInitialApplications = status.records.reduce((sum, item) =>
102
+ sum + item.initialAdmittedApplications, 0);
103
+ const completedInitialDeliveries = status.records.reduce((sum, item) =>
104
+ sum + item.initialCompletedDeliveries, 0);
105
+ const incompleteInitialAdmissions = status.records.reduce((sum, item) =>
106
+ sum + item.incompleteInitialAdmissions, 0);
107
+ const targetBoundEvaluationContracts = status.records.reduce((sum, item) =>
108
+ sum + item.targetBoundEvaluationContracts, 0);
109
+ const targetBoundApplications = status.records.reduce((sum, item) =>
110
+ sum + item.targetBoundApplications, 0);
111
+ const deadlineBoundEvaluationContracts = status.records.reduce((sum, item) =>
112
+ sum + item.deadlineBoundEvaluationContracts, 0);
113
+ const stalenessBoundEvaluationContracts = status.records.reduce((sum, item) =>
114
+ sum + item.stalenessBoundEvaluationContracts, 0);
115
+ const promotionBoundEvaluationContracts = status.records.reduce((sum, item) =>
116
+ sum + item.promotionBoundEvaluationContracts, 0);
117
+ const candidateAdmissionEvaluationContracts = status.records.reduce((sum, item) =>
118
+ sum + item.candidateAdmissionEvaluationContracts, 0);
119
+ const evidenceSourceAttestedEvaluationContracts = status.records.reduce((sum, item) =>
120
+ sum + item.evidenceSourceAttestedEvaluationContracts, 0);
121
+ const candidateEvidenceLineageEvaluationContracts = status.records.reduce((sum, item) =>
122
+ sum + item.candidateEvidenceLineageEvaluationContracts, 0);
123
+ const candidateEvidenceCohortEvaluationContracts = status.records.reduce((sum, item) =>
124
+ sum + item.candidateEvidenceCohortEvaluationContracts, 0);
125
+ const blockingDefectBoundEvaluationContracts = status.records.reduce((sum, item) =>
126
+ sum + item.blockingDefectBoundEvaluationContracts, 0);
127
+ const evidenceSourceBoundEvaluationContracts = status.records.reduce((sum, item) =>
128
+ sum + item.evidenceSourceBoundEvaluationContracts, 0);
129
+ const blockingDefectOutcomeReceipts = status.records.reduce((sum, item) =>
130
+ sum + item.blockingDefectOutcomeReceipts, 0);
131
+ const deadlineBoundApplications = status.records.reduce((sum, item) =>
132
+ sum + item.deadlineBoundApplications, 0);
133
+ const trialRetryEvaluationContracts = status.records.reduce((sum, item) =>
134
+ sum + item.trialRetryEvaluationContracts, 0);
135
+ const comparableTrialRetryEvaluationContracts = status.records.reduce((sum, item) =>
136
+ sum + item.comparableTrialRetryEvaluationContracts, 0);
137
+ const boundedTrialRetryEvaluationContracts = status.records.reduce((sum, item) =>
138
+ sum + item.boundedTrialRetryEvaluationContracts, 0);
139
+ const trialRetryExhaustionReceipts = status.records.reduce((sum, item) =>
140
+ sum + item.trialRetryExhaustionReceipts, 0);
141
+ const trialFailureReceipts = status.records.reduce((sum, item) => sum + item.trialFailureReceipts, 0);
142
+ const trialFailureRevocationReceipts = status.records.reduce((sum, item) =>
143
+ sum + item.trialFailureRevocationReceipts, 0);
144
+ const evaluationRevocationReceipts = status.records.reduce((sum, item) => sum + item.evaluationRevocationReceipts, 0);
145
+ const evidenceSourceAttestationRevocationReceipts = status.records.reduce((sum, item) =>
146
+ sum + item.evidenceSourceAttestationRevocationReceipts, 0);
147
+ const validationRevocationReceipts = status.records.reduce((sum, item) => sum + item.validationRevocationReceipts, 0);
148
+ const evidenceRevocationReceipts = status.records.reduce((sum, item) => sum + item.evidenceRevocationReceipts, 0);
149
+ const measurementRevocationReceipts = status.records.reduce((sum, item) => sum + item.measurementRevocationReceipts, 0);
150
+ const applicationRevocationReceipts = status.records.reduce((sum, item) => sum + item.applicationRevocationReceipts, 0);
151
+ const deliveryRevocationReceipts = status.records.reduce((sum, item) => sum + item.deliveryRevocationReceipts, 0);
152
+ const outcomeRevocationReceipts = status.records.reduce((sum, item) => sum + item.outcomeRevocationReceipts, 0);
153
+ const deliveryTimeoutFailures = status.records.reduce((sum, item) => sum + item.deliveryTimeoutFailures, 0);
154
+ const outcomeTimeoutFailures = status.records.reduce((sum, item) => sum + item.outcomeTimeoutFailures, 0);
155
+ const pendingInitialOutcomes = status.records.reduce((sum, item) => sum + item.pendingInitialOutcomes, 0);
156
+ const staleInitialOutcomes = status.records.reduce((sum, item) => sum + item.staleInitialOutcomes, 0);
157
+ const unplannedOutcomeReceipts = totalOutcomeReceipts - plannedOutcomeReceipts;
158
+ learningOutcomes = {
159
+ status: status.records.some((item) => ["stale", "revoked", "revoked-evaluation",
160
+ "revoked-evidence-source-attestation", "revoked-validation", "revoked-evidence",
161
+ "revoked-measurement", "revoked-application", "revoked-delivery", "revoked-outcome",
162
+ "unproven", "failed-trial"].includes(item.canaryStatus))
163
+ || unboundAfterReceipts > 0 || undeliveredAfterReceipts > 0 || unplannedOutcomeReceipts > 0
164
+ || stalePendingApplications > 0 || staleUnconsumedMeasurements > 0
165
+ || inactiveEvaluatorRegistryContracts > 0 || staleRevalidations > 0
166
+ || staleInitialOutcomes > 0 || trialFailureRevocationReceipts > 0 ? "degraded" : "healthy",
167
+ candidates: status.records.length,
168
+ activeCanaries: status.records.filter((item) => item.canaryStatus === "active").length,
169
+ validatedCanaries: status.records.filter((item) => item.canaryStatus === "validated").length,
170
+ staleCanaries: status.records.filter((item) => item.canaryStatus === "stale").length,
171
+ awaitingApplication: status.records.filter((item) => item.canaryStatus === "active" && item.applicationReceipts === 0).length,
172
+ applicationReceipts: status.records.reduce((sum, item) => sum + item.applicationReceipts, 0),
173
+ deliveryReceipts: status.records.reduce((sum, item) => sum + item.deliveryReceipts, 0),
174
+ pendingApplications: status.records.reduce((sum, item) => sum + item.pendingApplications, 0),
175
+ stalePendingApplications,
176
+ evaluationContracts: status.records.reduce((sum, item) => sum + item.evaluationContracts, 0),
177
+ targetBoundEvaluationContracts,
178
+ targetBoundApplications,
179
+ deadlineBoundEvaluationContracts,
180
+ stalenessBoundEvaluationContracts,
181
+ promotionBoundEvaluationContracts,
182
+ candidateAdmissionEvaluationContracts,
183
+ evidenceSourceAttestedEvaluationContracts,
184
+ candidateEvidenceLineageEvaluationContracts,
185
+ candidateEvidenceLineageReceipts,
186
+ candidateEvidenceCohortEvaluationContracts,
187
+ blockingDefectBoundEvaluationContracts,
188
+ evidenceSourceBoundEvaluationContracts,
189
+ blockingDefectOutcomeReceipts,
190
+ deadlineBoundApplications,
191
+ trialRetryEvaluationContracts,
192
+ comparableTrialRetryEvaluationContracts,
193
+ boundedTrialRetryEvaluationContracts,
194
+ trialRetryExhaustionReceipts,
195
+ trialFailureReceipts,
196
+ trialFailureRevocationReceipts,
197
+ evaluationRevocationReceipts,
198
+ evidenceSourceAttestationRevocationReceipts,
199
+ validationRevocationReceipts,
200
+ evidenceRevocationReceipts,
201
+ measurementRevocationReceipts,
202
+ applicationRevocationReceipts,
203
+ deliveryRevocationReceipts,
204
+ outcomeRevocationReceipts,
205
+ deliveryTimeoutFailures,
206
+ outcomeTimeoutFailures,
207
+ pendingInitialOutcomes,
208
+ staleInitialOutcomes,
209
+ plannedOutcomeReceipts,
210
+ coverageBoundReceipts,
211
+ legacyCoverageReceipts,
212
+ provenanceBoundReceipts,
213
+ legacyProvenanceReceipts,
214
+ measurementReceipts,
215
+ measurementLineageReceipts,
216
+ consumedMeasurementReceipts,
217
+ staleUnconsumedMeasurements,
218
+ lineageBoundReceipts,
219
+ pairedOutcomeReceipts,
220
+ pairedEvaluatorPairs,
221
+ evaluatorRootBoundReceipts,
222
+ independentEvaluatorRoots,
223
+ activeEvaluatorRoots: status.evaluatorRegistry.active,
224
+ revokedEvaluatorRoots: status.evaluatorRegistry.revoked,
225
+ evaluatorRegistryBindings: status.evaluatorRegistry.bindings,
226
+ validationLeases: status.evaluatorRegistry.validationLeases,
227
+ renewedValidationLeases,
228
+ fixedCohortValidationLeases,
229
+ admissionBoundValidationLeases,
230
+ trialBoundValidationLeases,
231
+ initialTrialContracts,
232
+ requiredInitialTrials,
233
+ admittedInitialApplications,
234
+ completedInitialDeliveries,
235
+ incompleteInitialAdmissions,
236
+ activeRevalidations,
237
+ staleRevalidations,
238
+ fixedCohortRevalidations,
239
+ admissionBoundRevalidations,
240
+ trialBoundRevalidations,
241
+ requiredRevalidationDeliveries,
242
+ admittedRevalidationApplications,
243
+ completedRevalidationDeliveries,
244
+ currentValidatedLessons,
245
+ staleValidatedLessons,
246
+ unprovenValidatedLessons,
247
+ revokedValidatedLessons,
248
+ evaluatorRegistryContracts,
249
+ inactiveEvaluatorRegistryContracts,
250
+ unplannedOutcomeReceipts,
251
+ boundAfterReceipts: status.records.reduce((sum, item) => sum + item.boundAfterReceipts, 0),
252
+ unboundAfterReceipts,
253
+ deliveredAfterReceipts: status.records.reduce((sum, item) => sum + item.deliveredAfterReceipts, 0),
254
+ undeliveredAfterReceipts,
255
+ contradictions: status.records.filter((item) => item.conflictsWith.length > 0).length,
256
+ authority: "context-only"
257
+ };
258
+ } catch (error) { learningOutcomes = { status: "failed-closed", error: error.message, authority: "context-only" }; }
259
+ const result = {
260
+ ok: Number(process.versions.node.split(".")[0]) >= 20 && hostIntegration.ok
261
+ && (!sourceResolution || sourceResolution.status === "loaded")
262
+ && learningOutcomes.status !== "failed-closed",
263
+ version: VERSION,
264
+ node: process.versions.node,
265
+ platform: process.platform,
266
+ preservationMode: "read-only-source-overlay",
267
+ stateDirectory: process.env.AGENTSPINE_STATE_DIR || "platform-default",
268
+ hostIntegration,
269
+ sourceResolution,
270
+ orphanScan,
271
+ preflight,
272
+ learningOutcomes
273
+ };
274
+ output(result, json);
275
+ if (!result.ok) process.exitCode = 1;
276
+ return;
277
+ }
278
+
279
+ if (command === "audit") {
280
+ const result = await runAudit(positional[0] || process.cwd(), { host: flags.host || process.env.AGENTSPINE_HOST || null });
281
+ output(result, json);
282
+ if (!result.ok) process.exitCode = 1;
283
+ return;
284
+ }
285
+
286
+ if (command === "mcp") {
287
+ const { startMcpServer } = await import("./mcp.js");
288
+ startMcpServer();
289
+ return;
290
+ }
291
+ }
@@ -0,0 +1,21 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { installCodexMcp } from "./lib/codex-installation.js";
3
+ import { output } from "./cli-common.js";
4
+
5
+ export const hostCommands = new Set(["host-install"]);
6
+
7
+ export async function runHostCommand({ command, flags, positional, json }) {
8
+ if (command !== "host-install" || positional[0] !== "codex" || positional.length !== 1) {
9
+ throw new Error("host-install requires exactly the host name codex");
10
+ }
11
+ if (flags["confirm-local-host-install"] !== true) {
12
+ throw new Error("host-install requires --confirm-local-host-install from the local user");
13
+ }
14
+ const result = await installCodexMcp({
15
+ codexHome: flags["codex-home"],
16
+ skillsRoot: flags["skills-root"],
17
+ packageRoot: flags["package-root"] || fileURLToPath(new URL("..", import.meta.url)),
18
+ nodePath: flags["node-path"] || process.execPath
19
+ });
20
+ return output(result, json);
21
+ }