@mindrian_os/install 1.13.0-beta.11

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 (597) hide show
  1. package/.claude-plugin/plugin.json +21 -0
  2. package/.mcp.json +9 -0
  3. package/CHANGELOG.md +3333 -0
  4. package/LICENSE +123 -0
  5. package/README.md +673 -0
  6. package/agents/brain-query.md +80 -0
  7. package/agents/framework-runner.md +237 -0
  8. package/agents/grading.md +188 -0
  9. package/agents/investor.md +128 -0
  10. package/agents/larry-extended.md +135 -0
  11. package/agents/opportunity-scanner.md +91 -0
  12. package/agents/persona-analyst.md +132 -0
  13. package/agents/research.md +89 -0
  14. package/agents/reverse-salient-agent.md +27 -0
  15. package/bin/cli.js +142 -0
  16. package/bin/mindrian-mcp-server.cjs +182 -0
  17. package/bin/mindrian-tools.cjs +765 -0
  18. package/commands/act.md +439 -0
  19. package/commands/admin.md +404 -0
  20. package/commands/analyze-needs.md +42 -0
  21. package/commands/analyze-systems.md +39 -0
  22. package/commands/analyze-timing.md +42 -0
  23. package/commands/auto-explore.md +64 -0
  24. package/commands/beautiful-question.md +40 -0
  25. package/commands/brain-derive.md +78 -0
  26. package/commands/build-knowledge.md +42 -0
  27. package/commands/build-thesis.md +46 -0
  28. package/commands/causal.md +234 -0
  29. package/commands/challenge-assumptions.md +33 -0
  30. package/commands/compare-ventures.md +83 -0
  31. package/commands/dashboard.md +110 -0
  32. package/commands/deep-grade.md +82 -0
  33. package/commands/diagnose.md +58 -0
  34. package/commands/diagnostics.md +151 -0
  35. package/commands/doctor.md +151 -0
  36. package/commands/dominant-designs.md +40 -0
  37. package/commands/explain-decision.md +87 -0
  38. package/commands/explore-domains.md +42 -0
  39. package/commands/explore-futures.md +40 -0
  40. package/commands/explore-trends.md +42 -0
  41. package/commands/export.md +103 -0
  42. package/commands/file-meeting.md +724 -0
  43. package/commands/find-analogies.md +188 -0
  44. package/commands/find-bottlenecks.md +62 -0
  45. package/commands/find-connections.md +76 -0
  46. package/commands/funding.md +81 -0
  47. package/commands/grade.md +203 -0
  48. package/commands/graph.md +128 -0
  49. package/commands/hat-briefing.md +125 -0
  50. package/commands/heal.md +196 -0
  51. package/commands/help.md +399 -0
  52. package/commands/hmi-status.md +172 -0
  53. package/commands/jtbd.md +241 -0
  54. package/commands/leadership.md +73 -0
  55. package/commands/lean-canvas.md +40 -0
  56. package/commands/macro-trends.md +40 -0
  57. package/commands/map-unknowns.md +40 -0
  58. package/commands/memory.md +173 -0
  59. package/commands/models.md +175 -0
  60. package/commands/mos-reason.md +285 -0
  61. package/commands/mullins.md +120 -0
  62. package/commands/new-project.md +481 -0
  63. package/commands/onboard.md +434 -0
  64. package/commands/operator.md +149 -0
  65. package/commands/opportunities.md +144 -0
  66. package/commands/organize.md +497 -0
  67. package/commands/persona.md +198 -0
  68. package/commands/pipeline.md +112 -0
  69. package/commands/present.md +91 -0
  70. package/commands/publish.md +201 -0
  71. package/commands/query.md +124 -0
  72. package/commands/radar.md +72 -0
  73. package/commands/reanalyze.md +91 -0
  74. package/commands/research.md +196 -0
  75. package/commands/room.md +352 -0
  76. package/commands/rooms.md +598 -0
  77. package/commands/root-cause.md +40 -0
  78. package/commands/rs-experts.md +85 -0
  79. package/commands/rs-explain.md +100 -0
  80. package/commands/rs-fetch.md +94 -0
  81. package/commands/rs-thesis.md +85 -0
  82. package/commands/scenario-plan.md +40 -0
  83. package/commands/scheduled-tasks.md +285 -0
  84. package/commands/score-innovation.md +43 -0
  85. package/commands/scout.md +239 -0
  86. package/commands/setup.md +618 -0
  87. package/commands/snapshot.md +147 -0
  88. package/commands/speakers.md +84 -0
  89. package/commands/splash.md +28 -0
  90. package/commands/status.md +75 -0
  91. package/commands/structure-argument.md +42 -0
  92. package/commands/suggest-next.md +80 -0
  93. package/commands/systems-thinking.md +40 -0
  94. package/commands/think-hats.md +42 -0
  95. package/commands/update.md +181 -0
  96. package/commands/user-needs.md +40 -0
  97. package/commands/validate.md +40 -0
  98. package/commands/value-proposition.md +61 -0
  99. package/commands/vault.md +180 -0
  100. package/commands/visualize.md +52 -0
  101. package/commands/whitespace.md +507 -0
  102. package/commands/wiki.md +69 -0
  103. package/hooks/hooks.json +381 -0
  104. package/hooks/run-hook.cmd +64 -0
  105. package/lib/__init__.py +0 -0
  106. package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
  107. package/lib/agents/auto-explore-agent.cjs +1043 -0
  108. package/lib/agents/reverse-salient-agent.cjs +679 -0
  109. package/lib/agents/tension-hook-agent.cjs +544 -0
  110. package/lib/brain/ROOM.md +44 -0
  111. package/lib/brain/chain-recommender.cjs +301 -0
  112. package/lib/chat/chat-context.js +185 -0
  113. package/lib/chat/chat-panel.js +721 -0
  114. package/lib/chat/fabric-chat.cjs +288 -0
  115. package/lib/chat/generative-tools.js +219 -0
  116. package/lib/conversation/ROOM.md +39 -0
  117. package/lib/conversation/classifier-rules.json +38 -0
  118. package/lib/conversation/classifier.cjs +264 -0
  119. package/lib/conversation/operator.cjs +287 -0
  120. package/lib/copy/115-spec-strings.cjs +55 -0
  121. package/lib/core/__init__.py +0 -0
  122. package/lib/core/__nav-stub.cjs +14 -0
  123. package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
  124. package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
  125. package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
  126. package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
  127. package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
  128. package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
  129. package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
  130. package/lib/core/artifact-id.cjs +148 -0
  131. package/lib/core/asset-ops.cjs +151 -0
  132. package/lib/core/auto-commit-throttle.cjs +129 -0
  133. package/lib/core/bearer-token.cjs +199 -0
  134. package/lib/core/brain-client.cjs +865 -0
  135. package/lib/core/brain-derivation-prompts.cjs +326 -0
  136. package/lib/core/brain-derivation-queue.cjs +431 -0
  137. package/lib/core/brain-derivation.cjs +580 -0
  138. package/lib/core/brain-md-schema.cjs +528 -0
  139. package/lib/core/brain-md-staleness.cjs +357 -0
  140. package/lib/core/brain-response-sanitize.cjs +188 -0
  141. package/lib/core/bridge-writer.cjs +477 -0
  142. package/lib/core/chat-context-builder.cjs +253 -0
  143. package/lib/core/cross-room-aggregator.cjs +762 -0
  144. package/lib/core/daily-briefing.cjs +438 -0
  145. package/lib/core/decision-capture.cjs +618 -0
  146. package/lib/core/deep-links.cjs +82 -0
  147. package/lib/core/dispatch-optimizer.cjs +354 -0
  148. package/lib/core/dual-path-detector.cjs +84 -0
  149. package/lib/core/dual-path-detector.test.cjs +334 -0
  150. package/lib/core/exports-log.cjs +79 -0
  151. package/lib/core/feynman-minto-invariants.cjs +605 -0
  152. package/lib/core/folder-memory-async.cjs +338 -0
  153. package/lib/core/folder-memory-shared.cjs +890 -0
  154. package/lib/core/folder-memory.cjs +416 -0
  155. package/lib/core/framework-chain-composer.cjs +411 -0
  156. package/lib/core/frontmatter-schemas.cjs +330 -0
  157. package/lib/core/git-ops.cjs +141 -0
  158. package/lib/core/graph-ops.cjs +258 -0
  159. package/lib/core/hat-persistence.cjs +362 -0
  160. package/lib/core/index.cjs +60 -0
  161. package/lib/core/integration-registry.cjs +232 -0
  162. package/lib/core/intelligence-cascade.cjs +661 -0
  163. package/lib/core/lazygraph-ops.cjs +1057 -0
  164. package/lib/core/lru-cache.cjs +139 -0
  165. package/lib/core/mcp-profiles.cjs +182 -0
  166. package/lib/core/meeting-ops.cjs +54 -0
  167. package/lib/core/memory-ops.cjs +600 -0
  168. package/lib/core/migrations/ROOM.md +33 -0
  169. package/lib/core/migrations/phase-109-nodes-provenance.cjs +339 -0
  170. package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
  171. package/lib/core/model-profiles.cjs +246 -0
  172. package/lib/core/mullins-scaffold.cjs +160 -0
  173. package/lib/core/nav-dial.cjs +316 -0
  174. package/lib/core/navigation/ROOM.md +15 -0
  175. package/lib/core/navigation/explanation.cjs +43 -0
  176. package/lib/core/navigation/focus.cjs +135 -0
  177. package/lib/core/navigation/ingestion.cjs +82 -0
  178. package/lib/core/navigation/insights.cjs +350 -0
  179. package/lib/core/navigation/memory-events.cjs +118 -0
  180. package/lib/core/navigation/neighborhood.cjs +78 -0
  181. package/lib/core/navigation/packet.cjs +182 -0
  182. package/lib/core/navigation/room-home.cjs +127 -0
  183. package/lib/core/navigation/transitions.cjs +82 -0
  184. package/lib/core/navigation-engine-shared.cjs +242 -0
  185. package/lib/core/navigation-engine.cjs +664 -0
  186. package/lib/core/navigation.cjs +60 -0
  187. package/lib/core/nl-graph-queries.cjs +164 -0
  188. package/lib/core/offer-presenter.cjs +406 -0
  189. package/lib/core/opportunity-extractor.cjs +183 -0
  190. package/lib/core/opportunity-ops.cjs +1371 -0
  191. package/lib/core/persona-ops.cjs +537 -0
  192. package/lib/core/persona-taxonomy.cjs +190 -0
  193. package/lib/core/platform-gates.cjs +120 -0
  194. package/lib/core/platform.cjs +257 -0
  195. package/lib/core/proactive-intelligence.cjs +528 -0
  196. package/lib/core/problem-type-router.cjs +315 -0
  197. package/lib/core/reasoning-ops.cjs +639 -0
  198. package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
  199. package/lib/core/room-classifier-strict-mode.cjs +229 -0
  200. package/lib/core/room-db.cjs +127 -0
  201. package/lib/core/room-ops-async.cjs +92 -0
  202. package/lib/core/room-ops-shared.cjs +64 -0
  203. package/lib/core/room-ops-sync.cjs +70 -0
  204. package/lib/core/room-ops.cjs +32 -0
  205. package/lib/core/room-type-detector.cjs +386 -0
  206. package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
  207. package/lib/core/rs-brain-substrate.cjs +570 -0
  208. package/lib/core/rs-breakthrough-scorer.cjs +255 -0
  209. package/lib/core/rs-canon-violations.cjs +82 -0
  210. package/lib/core/rs-chain-feeder.cjs +343 -0
  211. package/lib/core/rs-commercial-assessor.cjs +280 -0
  212. package/lib/core/rs-differential-scorer.cjs +376 -0
  213. package/lib/core/rs-domain-analyzer.cjs +385 -0
  214. package/lib/core/rs-egress-prompts.cjs +113 -0
  215. package/lib/core/rs-egress-telemetry.cjs +225 -0
  216. package/lib/core/rs-egress-violations.cjs +53 -0
  217. package/lib/core/rs-expert-mapper.cjs +467 -0
  218. package/lib/core/rs-fetcher-academic.cjs +697 -0
  219. package/lib/core/rs-fetcher-experts.cjs +314 -0
  220. package/lib/core/rs-fetcher-industry.cjs +731 -0
  221. package/lib/core/rs-fetcher-patents.cjs +564 -0
  222. package/lib/core/rs-innovation-classifier.cjs +194 -0
  223. package/lib/core/rs-mind-map.cjs +656 -0
  224. package/lib/core/rs-neo4j-writer.cjs +388 -0
  225. package/lib/core/rs-nl-to-query.cjs +425 -0
  226. package/lib/core/rs-pinecone-bridge.cjs +303 -0
  227. package/lib/core/rs-preprocessor.cjs +350 -0
  228. package/lib/core/rs-query-matrix.cjs +316 -0
  229. package/lib/core/rs-query-to-text.cjs +438 -0
  230. package/lib/core/rs-sqlite-mirror.cjs +443 -0
  231. package/lib/core/rs-thesis-generator.cjs +188 -0
  232. package/lib/core/rs_cache.py +479 -0
  233. package/lib/core/rs_corpus.py +468 -0
  234. package/lib/core/rs_hybrid.py +586 -0
  235. package/lib/core/rs_math.py +287 -0
  236. package/lib/core/rs_rooms.py +193 -0
  237. package/lib/core/scheduled-scanner.cjs +463 -0
  238. package/lib/core/scratchpad-ops.cjs +201 -0
  239. package/lib/core/section-8-trace-schema.cjs +138 -0
  240. package/lib/core/section-registry.cjs +111 -0
  241. package/lib/core/session-state.cjs +144 -0
  242. package/lib/core/shallow-doc-parser.cjs +174 -0
  243. package/lib/core/shallow-doc-parser.test.cjs +226 -0
  244. package/lib/core/skill-activation-router.cjs +284 -0
  245. package/lib/core/state-ops.cjs +46 -0
  246. package/lib/core/statusline-cache.cjs +266 -0
  247. package/lib/core/token-estimator.cjs +348 -0
  248. package/lib/core/user-archetype.cjs +239 -0
  249. package/lib/core/user-md-ops.cjs +524 -0
  250. package/lib/core/visual-ops.cjs +624 -0
  251. package/lib/core/write-lock.cjs +149 -0
  252. package/lib/graph/canvas-graph.js +467 -0
  253. package/lib/graph/constellation-config.cjs +299 -0
  254. package/lib/graph/graph-detail-panel.js +165 -0
  255. package/lib/hmi/ROOM.md +47 -0
  256. package/lib/hmi/across-session-memory.cjs +604 -0
  257. package/lib/hmi/cross-room-memory.cjs +575 -0
  258. package/lib/hmi/decoy-tier.cjs +395 -0
  259. package/lib/hmi/jtbd-classifier.cjs +219 -0
  260. package/lib/hmi/jtbd-state.cjs +199 -0
  261. package/lib/hmi/jtbd-taxonomy.json +392 -0
  262. package/lib/hmi/selector-dispatcher.cjs +546 -0
  263. package/lib/hmi/selector-telemetry.cjs +263 -0
  264. package/lib/hmi/shape-f0-renderer.cjs +139 -0
  265. package/lib/hmi/shape-f1-fallback.cjs +80 -0
  266. package/lib/hmi/shape-f1-renderer.cjs +138 -0
  267. package/lib/hmi/shape-f2-renderer.cjs +132 -0
  268. package/lib/hmi/shape-f3-renderer.cjs +66 -0
  269. package/lib/hmi/shape-f4-renderer.cjs +72 -0
  270. package/lib/hmi/shape-f5-renderer.cjs +155 -0
  271. package/lib/hmi/shape-f6-plan-review-renderer.cjs +312 -0
  272. package/lib/hmi/shape-f6-renderer.cjs +144 -0
  273. package/lib/hmi/shape-g-renderer.cjs +219 -0
  274. package/lib/hmi/shape-h-renderer.cjs +222 -0
  275. package/lib/hmi/tier-check.cjs +63 -0
  276. package/lib/import/PRECONDITIONS.md +41 -0
  277. package/lib/import/branding.cjs +210 -0
  278. package/lib/import/branding.test.cjs +235 -0
  279. package/lib/import/classifications-sync.cjs +104 -0
  280. package/lib/import/classifications-sync.test.cjs +129 -0
  281. package/lib/import/enricher.cjs +296 -0
  282. package/lib/import/enricher.test.cjs +273 -0
  283. package/lib/import/integration.test.cjs +376 -0
  284. package/lib/import/manifest.cjs +129 -0
  285. package/lib/import/manifest.schema.json +185 -0
  286. package/lib/import/manifest.test.cjs +123 -0
  287. package/lib/import/meeting-detector.cjs +92 -0
  288. package/lib/import/meeting-detector.test.cjs +100 -0
  289. package/lib/import/person-detector.cjs +229 -0
  290. package/lib/import/person-detector.test.cjs +149 -0
  291. package/lib/import/report.cjs +186 -0
  292. package/lib/import/report.test.cjs +186 -0
  293. package/lib/import/room-md-scaffolder.cjs +49 -0
  294. package/lib/import/router.cjs +224 -0
  295. package/lib/import/router.test.cjs +356 -0
  296. package/lib/import/run-all-tests.cjs +36 -0
  297. package/lib/import/smoke-test.cjs +213 -0
  298. package/lib/import/smoke-test.test.cjs +148 -0
  299. package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +8 -0
  300. package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +7 -0
  301. package/lib/import/test-fixtures/collision-vault/source/onboarding.md +5 -0
  302. package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +1 -0
  303. package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +4 -0
  304. package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +9 -0
  305. package/lib/import/test-fixtures/tiny-vault/notes/empty.md +3 -0
  306. package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +5 -0
  307. package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +5 -0
  308. package/lib/import/test-fixtures/tiny-vault/notes/random.md +4 -0
  309. package/lib/import/undo.test.cjs +199 -0
  310. package/lib/import/vault-scanner.cjs +105 -0
  311. package/lib/import/vault-scanner.test.cjs +67 -0
  312. package/lib/mcp/app-html/dashboard.html +316 -0
  313. package/lib/mcp/app-html/graph.html +428 -0
  314. package/lib/mcp/app-html/mindrian-platform.html +1841 -0
  315. package/lib/mcp/app-html/wiki.html +383 -0
  316. package/lib/mcp/app-views.cjs +322 -0
  317. package/lib/mcp/brain-router.cjs +418 -0
  318. package/lib/mcp/capability-registry.cjs +62 -0
  319. package/lib/mcp/larry-context.cjs +46 -0
  320. package/lib/mcp/larry-server-instructions.md +114 -0
  321. package/lib/mcp/pipeline-state.cjs +275 -0
  322. package/lib/mcp/prompts.cjs +302 -0
  323. package/lib/mcp/resources.cjs +227 -0
  324. package/lib/mcp/session-catchup.cjs +327 -0
  325. package/lib/mcp/surface-detect.cjs +75 -0
  326. package/lib/mcp/tool-router.cjs +1034 -0
  327. package/lib/memory/aaak-compress.cjs +403 -0
  328. package/lib/memory/aaak-compress.test.cjs +288 -0
  329. package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
  330. package/lib/memory/bearer-token.test.cjs +315 -0
  331. package/lib/memory/brain-cache-lru.test.cjs +259 -0
  332. package/lib/memory/brain-client-query-shape.test.cjs +160 -0
  333. package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
  334. package/lib/memory/brain-derivation-queue.test.cjs +539 -0
  335. package/lib/memory/brain-derivation.test.cjs +634 -0
  336. package/lib/memory/brain-derive-command.test.cjs +534 -0
  337. package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
  338. package/lib/memory/brain-md-schema.test.cjs +467 -0
  339. package/lib/memory/brain-md-staleness.test.cjs +525 -0
  340. package/lib/memory/brain-server-resolution.test.cjs +314 -0
  341. package/lib/memory/chain-recommender.test.cjs +233 -0
  342. package/lib/memory/chat-context.test.cjs +128 -0
  343. package/lib/memory/command-registry.test.cjs +220 -0
  344. package/lib/memory/cross-room-aggregator.test.cjs +909 -0
  345. package/lib/memory/dashboard-server.test.cjs +256 -0
  346. package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
  347. package/lib/memory/decision-capture.test.cjs +632 -0
  348. package/lib/memory/decision-capture.worker.cjs +70 -0
  349. package/lib/memory/explain-decision-command.test.cjs +521 -0
  350. package/lib/memory/explain-decision-footer.test.cjs +316 -0
  351. package/lib/memory/explored-materials-store.cjs +392 -0
  352. package/lib/memory/feynman-minto-guardian.test.cjs +736 -0
  353. package/lib/memory/feynman-minto-invariants.test.cjs +511 -0
  354. package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
  355. package/lib/memory/feynman-prompts.cjs +151 -0
  356. package/lib/memory/feynman-prompts.test.cjs +96 -0
  357. package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
  358. package/lib/memory/folder-memory.test.cjs +503 -0
  359. package/lib/memory/framework-chain-composer.test.cjs +515 -0
  360. package/lib/memory/frontmatter-schema-validator.test.cjs +290 -0
  361. package/lib/memory/heal-command.test.cjs +604 -0
  362. package/lib/memory/index-artifact-transaction.test.cjs +333 -0
  363. package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
  364. package/lib/memory/mcp-input-validation.test.cjs +240 -0
  365. package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
  366. package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
  367. package/lib/memory/minto-debouncer.test.cjs +407 -0
  368. package/lib/memory/minto-debouncer.worker.cjs +46 -0
  369. package/lib/memory/minto-migration-v88.test.cjs +265 -0
  370. package/lib/memory/minto-schema-v88.test.cjs +390 -0
  371. package/lib/memory/mos-status-renderer.test.cjs +631 -0
  372. package/lib/memory/narrative-schema.cjs +376 -0
  373. package/lib/memory/narrative-schema.test.cjs +209 -0
  374. package/lib/memory/nav-dial.test.cjs +414 -0
  375. package/lib/memory/navigation-engine-core.test.cjs +722 -0
  376. package/lib/memory/navigation-invariants.test.cjs +483 -0
  377. package/lib/memory/offer-presenter.test.cjs +554 -0
  378. package/lib/memory/on-stop-snapshot.test.cjs +404 -0
  379. package/lib/memory/pending-tension-store.cjs +373 -0
  380. package/lib/memory/post-compact-reinjection.test.cjs +854 -0
  381. package/lib/memory/post-write-triple.test.cjs +317 -0
  382. package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
  383. package/lib/memory/problem-type-router.test.cjs +656 -0
  384. package/lib/memory/query-efficiency-telemetry.test.cjs +370 -0
  385. package/lib/memory/recompile-room-references.test.cjs +392 -0
  386. package/lib/memory/recompile-room-references.worker.cjs +42 -0
  387. package/lib/memory/record-decision-dual-write.test.cjs +454 -0
  388. package/lib/memory/room-classifier-strict-mode.test.cjs +417 -0
  389. package/lib/memory/room-minto-hook.test.cjs +398 -0
  390. package/lib/memory/rs-discovery-engine.test.cjs +323 -0
  391. package/lib/memory/run-feynman-tests.cjs +1247 -0
  392. package/lib/memory/security-trifecta.test.cjs +312 -0
  393. package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
  394. package/lib/memory/session-start-triple-injection.test.cjs +514 -0
  395. package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
  396. package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
  397. package/lib/memory/skill-activation-router.test.cjs +419 -0
  398. package/lib/memory/stamp-artifact-write.test.cjs +304 -0
  399. package/lib/memory/statusline-active-room.test.cjs +315 -0
  400. package/lib/memory/statusline-minto-segment.test.cjs +292 -0
  401. package/lib/memory/sync-async-entry-points.test.cjs +204 -0
  402. package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
  403. package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
  404. package/lib/memory/test-rs-brain-substrate.cjs +636 -0
  405. package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
  406. package/lib/memory/test-rs-canon-violations.cjs +218 -0
  407. package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
  408. package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
  409. package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
  410. package/lib/memory/test-rs-differential-scorer.cjs +480 -0
  411. package/lib/memory/test-rs-discovery-engine.cjs +603 -0
  412. package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
  413. package/lib/memory/test-rs-egress-primitives.cjs +420 -0
  414. package/lib/memory/test-rs-expert-mapper.cjs +547 -0
  415. package/lib/memory/test-rs-explain-command.cjs +443 -0
  416. package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
  417. package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
  418. package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
  419. package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
  420. package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
  421. package/lib/memory/test-rs-mind-map.cjs +646 -0
  422. package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
  423. package/lib/memory/test-rs-nl-to-query.cjs +449 -0
  424. package/lib/memory/test-rs-pinecone-bridge.cjs +277 -0
  425. package/lib/memory/test-rs-preprocessor.cjs +433 -0
  426. package/lib/memory/test-rs-query-matrix.cjs +391 -0
  427. package/lib/memory/test-rs-query-to-text.cjs +551 -0
  428. package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
  429. package/lib/memory/test-rs-thesis-generator.cjs +360 -0
  430. package/lib/memory/triple-context-formatter.cjs +473 -0
  431. package/lib/memory/triple-context-formatter.test.cjs +442 -0
  432. package/lib/memory/user-md-persona.test.cjs +565 -0
  433. package/lib/memory/userpromptsubmit-integration.test.cjs +690 -0
  434. package/lib/memory/validators/README.md +157 -0
  435. package/lib/memory/validators/brain-md-invariants.cjs +475 -0
  436. package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
  437. package/lib/memory/validators/external-academic-invariants.cjs +249 -0
  438. package/lib/memory/validators/external-industry-invariants.cjs +271 -0
  439. package/lib/memory/validators/external-patents-invariants.cjs +266 -0
  440. package/lib/memory/validators/minto-invariants.cjs +62 -0
  441. package/lib/memory/validators/navigation-invariants.cjs +340 -0
  442. package/lib/memory/validators/queue-health.cjs +95 -0
  443. package/lib/memory/validators/snapshot-integrity.cjs +129 -0
  444. package/lib/memory/validators/stale-lifecycle.cjs +116 -0
  445. package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
  446. package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
  447. package/lib/memory/write-lock-atomic.test.cjs +137 -0
  448. package/lib/memory/write-lock-atomic.worker.cjs +55 -0
  449. package/lib/parity/check-parity.cjs +83 -0
  450. package/lib/presentation/presentation-server.cjs +101 -0
  451. package/lib/presentation/presentation-watcher.cjs +123 -0
  452. package/lib/quickview/hub-server.cjs +719 -0
  453. package/lib/quickview/server.cjs +533 -0
  454. package/lib/render/JTBD-PALETTES.md +145 -0
  455. package/lib/render/ROOM.md +59 -0
  456. package/lib/render/render-v2.cjs +486 -0
  457. package/lib/render/render-v2.test.cjs +267 -0
  458. package/lib/render/render.cjs +65 -0
  459. package/lib/state/ROOM.md +46 -0
  460. package/lib/state/state-md-parser.cjs +215 -0
  461. package/lib/statusline/ROOM.md +38 -0
  462. package/lib/statusline/banner-suppression.cjs +50 -0
  463. package/lib/statusline/surface-detect.cjs +85 -0
  464. package/lib/update-bootstrap.sh.template +145 -0
  465. package/lib/vault/frontmatter-schema.cjs +297 -0
  466. package/lib/vault/room-scanner.cjs +352 -0
  467. package/lib/vault/wikilink-builder.cjs +231 -0
  468. package/lib/vault/wikilink-builder.test.cjs +182 -0
  469. package/lib/wiki/graph-links.cjs +281 -0
  470. package/lib/wiki/page-renderer.cjs +229 -0
  471. package/lib/wiki/wiki-chat.cjs +81 -0
  472. package/lib/wiki/wiki-layout.cjs +1459 -0
  473. package/lib/wiki/wiki-search.cjs +142 -0
  474. package/lib/wiki/wiki-server.cjs +678 -0
  475. package/lib/wiki/wiki-watcher.cjs +105 -0
  476. package/lib/workflow/ROOM.md +47 -0
  477. package/lib/workflow/command-resolver.cjs +155 -0
  478. package/lib/workflow/command-resolver.test.cjs +235 -0
  479. package/package.json +44 -0
  480. package/pipelines/analogy/01-decompose.md +80 -0
  481. package/pipelines/analogy/02-abstract.md +87 -0
  482. package/pipelines/analogy/03-search.md +135 -0
  483. package/pipelines/analogy/04-transfer.md +101 -0
  484. package/pipelines/analogy/05-validate.md +106 -0
  485. package/pipelines/analogy/CHAIN.md +56 -0
  486. package/pipelines/discovery/01-explore-domains.md +44 -0
  487. package/pipelines/discovery/02-think-hats.md +50 -0
  488. package/pipelines/discovery/03-analyze-needs.md +54 -0
  489. package/pipelines/discovery/CHAIN.md +37 -0
  490. package/pipelines/thesis/01-structure-argument.md +45 -0
  491. package/pipelines/thesis/02-challenge-assumptions.md +48 -0
  492. package/pipelines/thesis/03-build-thesis.md +54 -0
  493. package/pipelines/thesis/CHAIN.md +37 -0
  494. package/references/brain/causal-directives.md +91 -0
  495. package/references/brain/causal-enrichment.cypher +165 -0
  496. package/references/brain/command-triggers-schema.md +226 -0
  497. package/references/brain/graph-architecture.md +317 -0
  498. package/references/brain/query-patterns.md +460 -0
  499. package/references/brain/room-hierarchy-schema.md +218 -0
  500. package/references/brain/schema.md +76 -0
  501. package/references/capability-radar/capabilities-index.md +241 -0
  502. package/references/capability-radar/changelog-cache.md +81 -0
  503. package/references/causal/causal-schema.md +103 -0
  504. package/references/design/email-template-standard.md +155 -0
  505. package/references/design/graph-visualization-standard.md +178 -0
  506. package/references/document-generation.md +179 -0
  507. package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
  508. package/references/import-config.md +141 -0
  509. package/references/integrations/detection-patterns.md +101 -0
  510. package/references/meeting/artifact-template.md +377 -0
  511. package/references/meeting/cross-meeting-intelligence.md +216 -0
  512. package/references/meeting/cross-relationship-patterns.md +202 -0
  513. package/references/meeting/live-join-interface.md +244 -0
  514. package/references/meeting/section-mapping.md +192 -0
  515. package/references/meeting/segment-classification.md +258 -0
  516. package/references/meeting/speaker-profile-template.md +219 -0
  517. package/references/meeting/summary-template.md +348 -0
  518. package/references/meeting/transcript-patterns.md +226 -0
  519. package/references/methodology/analyze-needs.md +135 -0
  520. package/references/methodology/analyze-systems.md +121 -0
  521. package/references/methodology/analyze-timing.md +149 -0
  522. package/references/methodology/beautiful-question.md +109 -0
  523. package/references/methodology/build-knowledge.md +161 -0
  524. package/references/methodology/build-thesis.md +237 -0
  525. package/references/methodology/challenge-assumptions.md +127 -0
  526. package/references/methodology/diagnose.md +169 -0
  527. package/references/methodology/dominant-designs.md +212 -0
  528. package/references/methodology/explore-domains.md +147 -0
  529. package/references/methodology/explore-futures.md +163 -0
  530. package/references/methodology/explore-trends.md +129 -0
  531. package/references/methodology/find-bottlenecks.md +131 -0
  532. package/references/methodology/grade.md +211 -0
  533. package/references/methodology/index.md +97 -0
  534. package/references/methodology/leadership.md +200 -0
  535. package/references/methodology/lean-canvas.md +116 -0
  536. package/references/methodology/macro-trends.md +192 -0
  537. package/references/methodology/map-unknowns.md +137 -0
  538. package/references/methodology/mullins-7-domains.md +104 -0
  539. package/references/methodology/problem-types.md +65 -0
  540. package/references/methodology/root-cause.md +178 -0
  541. package/references/methodology/sapphire-encoding.md +355 -0
  542. package/references/methodology/scenario-plan.md +178 -0
  543. package/references/methodology/score-innovation.md +154 -0
  544. package/references/methodology/structure-argument.md +158 -0
  545. package/references/methodology/systems-thinking.md +159 -0
  546. package/references/methodology/think-hats.md +147 -0
  547. package/references/methodology/triz-matrix.json +751 -0
  548. package/references/methodology/triz-principles.md +501 -0
  549. package/references/methodology/user-needs.md +199 -0
  550. package/references/methodology/validate.md +163 -0
  551. package/references/methodology/value-proposition.md +244 -0
  552. package/references/opportunities/funding-lifecycle.md +103 -0
  553. package/references/opportunities/grant-api-patterns.md +99 -0
  554. package/references/opportunities/opportunity-template.md +84 -0
  555. package/references/personality/assessment-philosophy.md +72 -0
  556. package/references/personality/lexicon.md +100 -0
  557. package/references/personality/persona-chains.md +56 -0
  558. package/references/personality/pws-lexicon-full.md +499 -0
  559. package/references/personality/voice-dna.md +156 -0
  560. package/references/personas/hat-perspectives.md +76 -0
  561. package/references/personas/persona-template.md +63 -0
  562. package/references/pipeline/act-output-contract.md +88 -0
  563. package/references/pipeline/chains-index.md +39 -0
  564. package/references/pws-profile-generation.md +79 -0
  565. package/references/reasoning/reasoning-schema.md +143 -0
  566. package/references/reasoning/reasoning-template.md +68 -0
  567. package/references/reasoning/run-template.md +38 -0
  568. package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
  569. package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
  570. package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
  571. package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
  572. package/references/taxonomy/TAXONOMY.md +192 -0
  573. package/references/templates/MINTO.md +36 -0
  574. package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
  575. package/references/vault-kit/README.md +35 -0
  576. package/references/vault-kit/app.json +12 -0
  577. package/references/vault-kit/appearance.json +12 -0
  578. package/references/vault-kit/graph.json +35 -0
  579. package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
  580. package/references/vault-kit/templates/new-artifact.md +37 -0
  581. package/references/vault-kit/templates/new-meeting-note.md +35 -0
  582. package/references/vault-kit/templates/new-team-profile.md +29 -0
  583. package/references/vault-kit/templates/new-xref.md +35 -0
  584. package/references/visual/symbol-system.md +151 -0
  585. package/skills/MOSDeckEngine/SKILL.md +325 -0
  586. package/skills/brain-connector/SKILL.md +114 -0
  587. package/skills/context-engine/SKILL.md +147 -0
  588. package/skills/conversation-mode/SKILL.md +102 -0
  589. package/skills/larry-personality/SKILL.md +219 -0
  590. package/skills/larry-personality/framework-chains.md +92 -0
  591. package/skills/larry-personality/mode-engine.md +185 -0
  592. package/skills/mullins-scaffold/SKILL.md +61 -0
  593. package/skills/mullins-scaffold/scaffold.json +146 -0
  594. package/skills/pws-methodology/SKILL.md +49 -0
  595. package/skills/room-passive/SKILL.md +165 -0
  596. package/skills/room-proactive/SKILL.md +250 -0
  597. package/skills/ui-system/SKILL.md +277 -0
@@ -0,0 +1,765 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MindrianOS Plugin — CLI Entry Point
4
+ * Routes subcommands to lib/core modules.
5
+ * Pattern: GSD gsd-tools.cjs (switch-case routing, async main, catch).
6
+ * Surface-agnostic — no CLI/MCP/Desktop branching here.
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { execFileSync } = require('child_process');
12
+ const path = require('path');
13
+ const { output, error } = require('../lib/core/index.cjs');
14
+ // Phase 87-04: CLI path uses the sync entry point directly (self-documenting).
15
+ // The legacy './room-ops.cjs' shim still works but emits a DeprecationWarning.
16
+ const roomOps = require('../lib/core/room-ops-sync.cjs');
17
+ const stateOps = require('../lib/core/state-ops.cjs');
18
+ const meetingOps = require('../lib/core/meeting-ops.cjs');
19
+ const graphOps = require('../lib/core/graph-ops.cjs');
20
+ const opportunityOps = require('../lib/core/opportunity-ops.cjs');
21
+ const personaOps = require('../lib/core/persona-ops.cjs');
22
+ const reasoningOps = require('../lib/core/reasoning-ops.cjs');
23
+ const visualOps = require('../lib/core/visual-ops.cjs');
24
+ const scratchpadOps = require('../lib/core/scratchpad-ops.cjs');
25
+
26
+ const USAGE = `Usage: mindrian-tools.cjs <command> <subcommand> [roomDir] [--raw]
27
+
28
+ Commands:
29
+ room list-sections [roomDir] List discovered sections with metadata
30
+ room analyze [roomDir] Run analyze-room script
31
+ state compute [roomDir] Run compute-state script
32
+ state get [roomDir] Read STATE.md from room
33
+ meeting compute-intel [roomDir] Run compute-meetings-intelligence script
34
+ meeting compute-team [roomDir] Run compute-team script
35
+ graph build [roomDir] [outputPath] Generate knowledge graph JSON
36
+ graph build-sqlite [roomDir] [outputPath] Build graph.json from SQLite (primary)
37
+ graph index [roomDir] <filePath> Index single artifact in room graph (SQLite)
38
+ graph rebuild [roomDir] Rebuild entire room graph from artifacts
39
+ graph query [roomDir] "<sql>" Execute SQL query against room graph
40
+ graph stats [roomDir] Show room graph node/edge statistics
41
+ opportunity scan [roomDir] Context-driven grant discovery
42
+ opportunity list [roomDir] List filed opportunities
43
+ opportunity file [roomDir] [dataJson] File an opportunity
44
+ funding list [roomDir] List funding pipeline entries
45
+ funding create [roomDir] [slug] [source] Create funding entry from opportunity
46
+ funding advance [roomDir] [slug] [note] Advance to next stage
47
+ funding status [roomDir] [slug] Show funding entry details
48
+ funding outcome [roomDir] [slug] [outcome] Set outcome (awarded|rejected|withdrawn)
49
+ funding compute-state [roomDir] Compute opportunity-bank + funding STATE.md
50
+ persona generate [roomDir] Generate 6 De Bono hat personas from room state
51
+ persona list [roomDir] List generated personas
52
+ persona invoke [roomDir] [hat] [artifact] Invoke a specific hat perspective
53
+ persona analyze [roomDir] [artifact] Run all 6 perspectives on an artifact
54
+ reasoning get [roomDir] [section] Get REASONING.md for a section
55
+ reasoning generate [roomDir] [section] Generate/regenerate REASONING.md
56
+ reasoning verify [roomDir] [section] Check verification criteria
57
+ reasoning run [roomDir] [section] Execute full methodology run
58
+ reasoning list [roomDir] Show all sections with reasoning status
59
+ reasoning frontmatter [roomDir] [json|section] [field] Read/write reasoning frontmatter
60
+ visualize room [roomDir] Generate room structure Mermaid diagram
61
+ visualize graph [roomDir] Generate knowledge graph Mermaid diagram
62
+ visualize chain [roomDir] Generate methodology chain Mermaid diagram
63
+ visualize mermaid [roomDir] [type] Output raw Mermaid syntax to stdout
64
+ cascade [roomDir] [filePath] Run intelligence cascade on a filed artifact
65
+ bank-opportunity [roomDir] <json> Bank an opportunity from conversation (room or scratchpad)
66
+ record-decision --room DIR --key KEY --decision approve|reject|defer [--reason "..."] [--source-artifact ID] [--target-artifact ID]
67
+ Record user decision on a proactive intelligence finding
68
+ detect-integrations Detect all integration statuses (env, MCP, filesystem)
69
+ vault [room] [--path <target>] [--in-place]
70
+ Export room as Obsidian vault (or linkify in-place)
71
+ room linkify [room] Retroactively inject wikilinks + footers in-place (WIKI-08)`;
72
+
73
+ async function main() {
74
+ const argv = process.argv.slice(2);
75
+
76
+ // Detect --raw flag
77
+ const rawIndex = argv.indexOf('--raw');
78
+ const raw = rawIndex !== -1;
79
+ if (raw) argv.splice(rawIndex, 1);
80
+
81
+ const command = argv[0];
82
+ const subcommand = argv[1];
83
+ const roomDir = argv[2] || './room';
84
+
85
+ if (!command) {
86
+ error('No command specified.\n\n' + USAGE);
87
+ }
88
+
89
+ switch (command) {
90
+ case 'room': {
91
+ switch (subcommand) {
92
+ case 'list-sections': {
93
+ const result = roomOps.listSections(roomDir);
94
+ output(result, raw, JSON.stringify(result));
95
+ break;
96
+ }
97
+ case 'analyze': {
98
+ const result = roomOps.analyzeRoom(roomDir);
99
+ output({ output: result }, raw, result);
100
+ break;
101
+ }
102
+ case 'linkify': {
103
+ const orchestrator = path.resolve(__dirname, '..', 'scripts', 'vault-export-orchestrator.cjs');
104
+ // User invocation forms:
105
+ // room linkify -> orchestrator --in-place (resolves active room)
106
+ // room linkify <room> -> orchestrator <room> --in-place
107
+ const extra = argv.slice(2);
108
+ const args = extra.length > 0 ? [...extra, '--in-place'] : ['--in-place'];
109
+ try {
110
+ execFileSync(process.execPath, [orchestrator, ...args], { stdio: 'inherit' });
111
+ } catch (err) {
112
+ error(`room linkify failed: ${err.message}`);
113
+ }
114
+ break;
115
+ }
116
+ default:
117
+ error(`Unknown room subcommand: ${subcommand}\n\n${USAGE}`);
118
+ }
119
+ break;
120
+ }
121
+
122
+ case 'state': {
123
+ switch (subcommand) {
124
+ case 'compute': {
125
+ const result = stateOps.computeState(roomDir);
126
+ output({ output: result }, raw, result);
127
+ break;
128
+ }
129
+ case 'get': {
130
+ const result = stateOps.getState(roomDir);
131
+ if (result === null) {
132
+ error(`No STATE.md found in ${roomDir}`);
133
+ }
134
+ output({ content: result }, raw, result);
135
+ break;
136
+ }
137
+ default:
138
+ error(`Unknown state subcommand: ${subcommand}\n\n${USAGE}`);
139
+ }
140
+ break;
141
+ }
142
+
143
+ case 'meeting': {
144
+ switch (subcommand) {
145
+ case 'compute-intel': {
146
+ const result = meetingOps.computeMeetingsIntel(roomDir);
147
+ output({ output: result }, raw, result);
148
+ break;
149
+ }
150
+ case 'compute-team': {
151
+ const result = meetingOps.computeTeam(roomDir);
152
+ output({ output: result }, raw, result);
153
+ break;
154
+ }
155
+ default:
156
+ error(`Unknown meeting subcommand: ${subcommand}\n\n${USAGE}`);
157
+ }
158
+ break;
159
+ }
160
+
161
+ case 'graph': {
162
+ switch (subcommand) {
163
+ case 'build': {
164
+ const outputPath = argv[3]; // optional 4th arg
165
+ const result = graphOps.buildGraph(roomDir, outputPath);
166
+ output(result, raw, JSON.stringify(result));
167
+ break;
168
+ }
169
+ case 'index': {
170
+ const filePath = argv[3];
171
+ if (!filePath) error('Usage: graph index <roomDir> <filePath>');
172
+ const result = await graphOps.indexArtifact(roomDir, filePath);
173
+ output(result, raw, JSON.stringify(result));
174
+ break;
175
+ }
176
+ case 'rebuild': {
177
+ const result = await graphOps.rebuildGraph(roomDir);
178
+ output(result, raw, JSON.stringify(result));
179
+ break;
180
+ }
181
+ case 'query': {
182
+ const sql = argv[3];
183
+ if (!sql) error('Usage: graph query <roomDir> "<sql>"');
184
+ const result = await graphOps.queryGraph(roomDir, sql);
185
+ output(result, raw, JSON.stringify(result));
186
+ break;
187
+ }
188
+ case 'stats': {
189
+ const result = await graphOps.graphStats(roomDir);
190
+ output(result, raw, JSON.stringify(result));
191
+ break;
192
+ }
193
+ case 'build-sqlite':
194
+ case 'build-kuzu': { // backward-compat alias
195
+ const outputPath = argv[3]; // optional 4th arg
196
+ const result = graphOps.buildGraphFromSQLite(roomDir, outputPath);
197
+ output(result, raw, JSON.stringify(result));
198
+ break;
199
+ }
200
+ default:
201
+ error(`Unknown graph subcommand: ${subcommand}\n\n${USAGE}`);
202
+ }
203
+ break;
204
+ }
205
+
206
+ case 'opportunity': {
207
+ switch (subcommand) {
208
+ case 'scan': {
209
+ const result = await opportunityOps.scanOpportunities(roomDir);
210
+ output(result, raw, JSON.stringify(result, null, 2));
211
+ break;
212
+ }
213
+ case 'list': {
214
+ const result = opportunityOps.listOpportunities(roomDir);
215
+ output(result, raw, JSON.stringify(result, null, 2));
216
+ break;
217
+ }
218
+ case 'file': {
219
+ const dataJson = argv[3];
220
+ if (!dataJson) {
221
+ error('opportunity file requires a JSON data argument');
222
+ }
223
+ let data;
224
+ try {
225
+ data = JSON.parse(dataJson);
226
+ } catch (_e) {
227
+ error('Invalid JSON data for opportunity file');
228
+ }
229
+ const result = opportunityOps.fileOpportunity(roomDir, data);
230
+ output(result, raw, JSON.stringify(result));
231
+ break;
232
+ }
233
+ default:
234
+ error(`Unknown opportunity subcommand: ${subcommand}\n\n${USAGE}`);
235
+ }
236
+ break;
237
+ }
238
+
239
+ case 'funding': {
240
+ switch (subcommand) {
241
+ case 'list': {
242
+ const result = opportunityOps.listFunding(roomDir);
243
+ output(result, raw, JSON.stringify(result, null, 2));
244
+ break;
245
+ }
246
+ case 'create': {
247
+ const slug = argv[3];
248
+ const source = argv[4];
249
+ if (!slug) {
250
+ error('funding create requires a slug argument');
251
+ }
252
+ if (!source) {
253
+ error('funding create requires a source opportunity filename');
254
+ }
255
+ const result = opportunityOps.createFunding(roomDir, slug, source);
256
+ output(result, raw, JSON.stringify(result, null, 2));
257
+ break;
258
+ }
259
+ case 'advance': {
260
+ const slug = argv[3];
261
+ const note = argv[4] || '';
262
+ if (!slug) {
263
+ error('funding advance requires a slug argument');
264
+ }
265
+ // Determine next stage from current entry
266
+ const fundResult = opportunityOps.listFunding(roomDir);
267
+ const entry = fundResult.entries.find(e => e.name === slug);
268
+ if (!entry) {
269
+ error(`Funding entry not found: ${slug}`);
270
+ }
271
+ const stageIdx = opportunityOps.FUNDING_STAGES.indexOf(entry.stage);
272
+ const nextStage = opportunityOps.FUNDING_STAGES[stageIdx + 1];
273
+ if (!nextStage) {
274
+ error(`Entry ${slug} is already at final stage: ${entry.stage}`);
275
+ }
276
+ const result = opportunityOps.updateFundingStage(roomDir, slug, nextStage, note);
277
+ output(result, raw, JSON.stringify(result, null, 2));
278
+ break;
279
+ }
280
+ case 'status': {
281
+ const slug = argv[3];
282
+ if (!slug) {
283
+ error('funding status requires a slug argument');
284
+ }
285
+ const statusPath = require('path').join(require('path').resolve(roomDir), 'funding', slug, 'STATUS.md');
286
+ try {
287
+ const content = require('fs').readFileSync(statusPath, 'utf-8');
288
+ output({ slug, content }, raw, content);
289
+ } catch (_e) {
290
+ error(`Funding entry not found: ${slug}`);
291
+ }
292
+ break;
293
+ }
294
+ case 'outcome': {
295
+ const slug = argv[3];
296
+ const outcomeVal = argv[4];
297
+ if (!slug || !outcomeVal) {
298
+ error('funding outcome requires slug and outcome arguments');
299
+ }
300
+ const result = opportunityOps.setFundingOutcome(roomDir, slug, outcomeVal);
301
+ output(result, raw, JSON.stringify(result, null, 2));
302
+ break;
303
+ }
304
+ case 'compute-state': {
305
+ const fundState = opportunityOps.computeFundingState(roomDir);
306
+ const oppState = opportunityOps.computeOpportunityBankState(roomDir);
307
+ const result = { funding: fundState, opportunity_bank: oppState };
308
+ output(result, raw, JSON.stringify(result, null, 2));
309
+ break;
310
+ }
311
+ default:
312
+ error(`Unknown funding subcommand: ${subcommand}\n\n${USAGE}`);
313
+ }
314
+ break;
315
+ }
316
+
317
+ case 'persona': {
318
+ switch (subcommand) {
319
+ case 'generate': {
320
+ const result = personaOps.generatePersonas(roomDir);
321
+ output(result, raw, JSON.stringify(result));
322
+ break;
323
+ }
324
+ case 'list': {
325
+ const result = personaOps.listPersonas(roomDir);
326
+ output(result, raw, JSON.stringify(result));
327
+ break;
328
+ }
329
+ case 'invoke': {
330
+ const hatColor = argv[3];
331
+ const artifactPath = argv[4] || null;
332
+ if (!hatColor) {
333
+ error('persona invoke requires a hat color argument (white|red|black|yellow|green|blue)');
334
+ }
335
+ const result = personaOps.invokePersona(roomDir, hatColor, artifactPath);
336
+ output(result, raw, JSON.stringify(result));
337
+ break;
338
+ }
339
+ case 'analyze': {
340
+ const artifactPath = argv[3] || null;
341
+ const result = personaOps.analyzeAllPerspectives(roomDir, artifactPath);
342
+ output(result, raw, JSON.stringify(result));
343
+ break;
344
+ }
345
+ default:
346
+ error(`Unknown persona subcommand: ${subcommand}\n\n${USAGE}`);
347
+ }
348
+ break;
349
+ }
350
+
351
+ case 'reasoning': {
352
+ switch (subcommand) {
353
+ case 'get': {
354
+ const section = argv[3];
355
+ if (!section) error('reasoning get requires a section name');
356
+ const result = reasoningOps.getReasoning(roomDir, section);
357
+ output(result, raw, JSON.stringify(result, null, 2));
358
+ break;
359
+ }
360
+ case 'generate': {
361
+ const section = argv[3] || null;
362
+ const result = reasoningOps.generateReasoning(roomDir, section);
363
+ output(result, raw, JSON.stringify(result, null, 2));
364
+ break;
365
+ }
366
+ case 'verify': {
367
+ const section = argv[3];
368
+ if (!section) error('reasoning verify requires a section name');
369
+ const result = reasoningOps.verifyReasoning(roomDir, section);
370
+ output(result, raw, JSON.stringify(result, null, 2));
371
+ break;
372
+ }
373
+ case 'run': {
374
+ const section = argv[3];
375
+ if (!section) error('reasoning run requires a section name');
376
+ const result = reasoningOps.createRun(roomDir, section);
377
+ output(result, raw, JSON.stringify(result, null, 2));
378
+ break;
379
+ }
380
+ case 'list': {
381
+ const result = reasoningOps.listReasoning(roomDir);
382
+ output(result, raw, JSON.stringify(result, null, 2));
383
+ break;
384
+ }
385
+ case 'frontmatter': {
386
+ const fmArg = argv[3];
387
+ if (!fmArg) error('reasoning frontmatter requires a section name or JSON argument');
388
+ // Try parsing as JSON first (for set/merge operations)
389
+ let parsed;
390
+ try {
391
+ parsed = JSON.parse(fmArg);
392
+ } catch (_e) {
393
+ // Not JSON — treat as section name, optional field in argv[4]
394
+ const result = reasoningOps.getReasoningFrontmatter(roomDir, fmArg, argv[4] || null);
395
+ output(result, raw, JSON.stringify(result, null, 2));
396
+ break;
397
+ }
398
+ // JSON parsed — route by action
399
+ const { action, section, field, value } = parsed;
400
+ let result;
401
+ switch (action) {
402
+ case 'set':
403
+ result = reasoningOps.setReasoningFrontmatter(roomDir, section, field, value);
404
+ break;
405
+ case 'merge':
406
+ result = reasoningOps.mergeReasoningFrontmatter(roomDir, section, parsed);
407
+ break;
408
+ case 'get':
409
+ default:
410
+ result = reasoningOps.getReasoningFrontmatter(roomDir, section, field || null);
411
+ break;
412
+ }
413
+ output(result, raw, JSON.stringify(result, null, 2));
414
+ break;
415
+ }
416
+ default:
417
+ error(`Unknown reasoning subcommand: ${subcommand}\n\n${USAGE}`);
418
+ }
419
+ break;
420
+ }
421
+
422
+ case 'visualize': {
423
+ const vizType = subcommand || 'room';
424
+ const fs = require('fs');
425
+ const path = require('path');
426
+
427
+ // Helper: collect section data from room
428
+ function collectSections() {
429
+ try {
430
+ const sectionData = roomOps.listSections(roomDir);
431
+ let stage = 'discovery';
432
+ try {
433
+ const stateContent = stateOps.getState(roomDir);
434
+ if (stateContent) {
435
+ const stageMatch = stateContent.match(/venture_stage:\s*(.+)/);
436
+ if (stageMatch) stage = stageMatch[1].trim();
437
+ }
438
+ } catch (_e) {}
439
+ if (sectionData && sectionData.sections) {
440
+ return sectionData.sections.map(s => ({
441
+ name: s.name || s,
442
+ entryCount: s.entryCount || s.entries || 0,
443
+ stage: stage,
444
+ edges: s.edges || []
445
+ }));
446
+ }
447
+ } catch (_e) {}
448
+ return [{ name: 'No room data', entryCount: 0, stage: 'discovery', edges: [] }];
449
+ }
450
+
451
+ switch (vizType) {
452
+ case 'room': {
453
+ const sections = collectSections();
454
+ const mermaid = visualOps.generateMermaidRoom(sections);
455
+ const block = visualOps.generateMermaidBlock(mermaid);
456
+ output({ mermaid, block }, raw, block);
457
+ break;
458
+ }
459
+ case 'graph': {
460
+ let nodes = [];
461
+ let edges = [];
462
+ try {
463
+ const stats = await graphOps.graphStats(roomDir);
464
+ if (stats && stats.nodes) {
465
+ nodes = stats.nodes;
466
+ edges = stats.edges || [];
467
+ }
468
+ } catch (_e) {}
469
+ if (nodes.length === 0) {
470
+ nodes = [{ id: 'empty', type: 'Section', label: 'No graph data' }];
471
+ }
472
+ const mermaid = visualOps.generateMermaidGraph(nodes, edges);
473
+ const block = visualOps.generateMermaidBlock(mermaid);
474
+ output({ mermaid, block }, raw, block);
475
+ break;
476
+ }
477
+ case 'chain': {
478
+ let steps = [];
479
+ try {
480
+ const reasonDir = path.join(path.resolve(roomDir), '.reasoning');
481
+ if (fs.existsSync(reasonDir)) {
482
+ const runs = fs.readdirSync(reasonDir)
483
+ .filter(f => f.endsWith('.md'))
484
+ .sort()
485
+ .reverse();
486
+ if (runs.length > 0) {
487
+ const content = fs.readFileSync(path.join(reasonDir, runs[0]), 'utf-8');
488
+ const stepMatches = content.match(/##\s+Step\s+\d+[^#]*/g) || [];
489
+ steps = stepMatches.map((blk, i) => {
490
+ const nameMatch = blk.match(/##\s+Step\s+\d+:\s*(.+)/);
491
+ const fwMatch = blk.match(/framework:\s*(.+)/i);
492
+ const statusMatch = blk.match(/status:\s*(.+)/i);
493
+ return {
494
+ name: nameMatch ? nameMatch[1].trim() : `Step ${i + 1}`,
495
+ framework: fwMatch ? fwMatch[1].trim() : '',
496
+ status: statusMatch ? statusMatch[1].trim() : 'pending'
497
+ };
498
+ });
499
+ }
500
+ }
501
+ } catch (_e) {}
502
+ if (steps.length === 0) {
503
+ steps = [
504
+ { name: 'Diagnose', framework: 'diagnose', status: 'pending' },
505
+ { name: 'Framework', framework: '', status: 'pending' },
506
+ { name: 'Apply', framework: '', status: 'pending' },
507
+ { name: 'File', framework: '', status: 'pending' },
508
+ { name: 'Cross-ref', framework: '', status: 'pending' },
509
+ { name: 'Graph Update', framework: '', status: 'pending' }
510
+ ];
511
+ }
512
+ const mermaid = visualOps.generateMermaidChain(steps);
513
+ const block = visualOps.generateMermaidBlock(mermaid);
514
+ output({ mermaid, block }, raw, block);
515
+ break;
516
+ }
517
+ case 'mermaid': {
518
+ // Raw Mermaid output — type from argv[3]
519
+ const mermaidType = argv[3] || 'room';
520
+ let mermaid;
521
+ if (mermaidType === 'graph') {
522
+ let nodes = [];
523
+ let edges = [];
524
+ try {
525
+ const stats = await graphOps.graphStats(roomDir);
526
+ if (stats && stats.nodes) { nodes = stats.nodes; edges = stats.edges || []; }
527
+ } catch (_e) {}
528
+ if (nodes.length === 0) nodes = [{ id: 'empty', type: 'Section', label: 'No graph data' }];
529
+ mermaid = visualOps.generateMermaidGraph(nodes, edges);
530
+ } else if (mermaidType === 'chain') {
531
+ mermaid = visualOps.generateMermaidChain([
532
+ { name: 'Diagnose', framework: 'diagnose', status: 'pending' },
533
+ { name: 'Framework', framework: '', status: 'pending' },
534
+ { name: 'Apply', framework: '', status: 'pending' },
535
+ { name: 'File', framework: '', status: 'pending' },
536
+ { name: 'Cross-ref', framework: '', status: 'pending' },
537
+ { name: 'Graph Update', framework: '', status: 'pending' }
538
+ ]);
539
+ } else {
540
+ const sections = collectSections();
541
+ mermaid = visualOps.generateMermaidRoom(sections);
542
+ }
543
+ output({ mermaid }, raw, mermaid);
544
+ break;
545
+ }
546
+ default:
547
+ error(`Unknown visualize subcommand: ${vizType}\n\nValid: room, graph, chain, mermaid`);
548
+ }
549
+ break;
550
+ }
551
+
552
+ case 'cascade': {
553
+ const cascadeRoomDir = argv[1] || './room';
554
+ const cascadeFilePath = argv[2] || null;
555
+ const cascade = require('../lib/core/intelligence-cascade.cjs');
556
+ const cascadeResult = await cascade.runCascade(cascadeRoomDir, {
557
+ trigger: 'cli-hook',
558
+ filePath: cascadeFilePath
559
+ });
560
+ if (raw) {
561
+ process.stdout.write(JSON.stringify(cascadeResult));
562
+ } else {
563
+ process.stdout.write(JSON.stringify(cascadeResult, null, 2));
564
+ }
565
+ process.exit(0);
566
+ break;
567
+ }
568
+
569
+ case 'record-decision': {
570
+ // Parse named flags from argv
571
+ const rdFlags = {};
572
+ for (let i = 1; i < argv.length; i++) {
573
+ if (argv[i].startsWith('--') && i + 1 < argv.length) {
574
+ rdFlags[argv[i].slice(2)] = argv[++i];
575
+ }
576
+ }
577
+ const rdRoom = rdFlags['room'];
578
+ const rdKey = rdFlags['key'];
579
+ const rdDecision = rdFlags['decision'];
580
+ const rdReason = rdFlags['reason'] || '';
581
+ const rdSourceArtifact = rdFlags['source-artifact'];
582
+ const rdTargetArtifact = rdFlags['target-artifact'];
583
+
584
+ // Validate required args
585
+ if (!rdRoom || !rdKey || !rdDecision) {
586
+ process.stderr.write('Usage: mindrian-tools.cjs record-decision --room DIR --key KEY --decision approve|reject|defer [--reason "..."] [--source-artifact ID] [--target-artifact ID]\n');
587
+ process.exit(1);
588
+ }
589
+ if (!['approve', 'reject', 'defer'].includes(rdDecision)) {
590
+ process.stderr.write('Error: --decision must be one of: approve, reject, defer\n');
591
+ process.exit(1);
592
+ }
593
+ if (rdDecision === 'reject' && !rdReason) {
594
+ process.stderr.write('Error: --reason is required when decision is reject\n');
595
+ process.exit(1);
596
+ }
597
+
598
+ // Record decision in .proactive-intelligence.json
599
+ const proactiveIntel = require('../lib/core/proactive-intelligence.cjs');
600
+ const rdResult = proactiveIntel.recordDecision(rdRoom, rdKey, rdDecision, rdReason);
601
+
602
+ // Optionally persist graph edge (best-effort, Tier 0: works without graph)
603
+ let graphEdge = false;
604
+ if (rdSourceArtifact && rdTargetArtifact) {
605
+ const fs = require('fs');
606
+ const graphDb = require('path').join(require('path').resolve(rdRoom), '.mindrian', 'room.db');
607
+ if (fs.existsSync(graphDb)) {
608
+ try {
609
+ await graphOps.persistDecisionEdge(
610
+ rdRoom,
611
+ rdSourceArtifact,
612
+ rdTargetArtifact,
613
+ rdResult.edgeType,
614
+ { reason: rdReason, timestamp: new Date().toISOString() }
615
+ );
616
+ graphEdge = true;
617
+ } catch (_e) {
618
+ // Graph edge creation is best-effort
619
+ }
620
+ }
621
+ }
622
+
623
+ // --- Phase 88 dual-write to decision_log (additive; primary write already completed) ---
624
+ //
625
+ // Primary writer above (proactive-intelligence.cjs + optional graph edge) is
626
+ // authoritative and byte-frozen. This block is a tertiary convenience write that
627
+ // lands the decision in the owning section's Feynman-MINTO decision_log for
628
+ // session-start TRIPLE_CONTEXT injection (88-07). Section is derived from
629
+ // --source-artifact; without a derivable section, dual-write is a documented
630
+ // skip (NOT a failure: no error log entry). Any failure of the dual-write is
631
+ // logged to .mindrian/decision-dual-write-errors.jsonl and then swallowed;
632
+ // CLI exit 0 is preserved because primary write already succeeded.
633
+ try {
634
+ const path = require('path');
635
+ const fs = require('fs');
636
+ let derivedSection = null;
637
+ if (rdSourceArtifact) {
638
+ const roomAbs = path.resolve(rdRoom);
639
+ const absArt = path.isAbsolute(rdSourceArtifact)
640
+ ? rdSourceArtifact
641
+ : path.join(roomAbs, rdSourceArtifact);
642
+ const rel = path.relative(roomAbs, absArt);
643
+ if (!rel.startsWith('..') && !path.isAbsolute(rel)) {
644
+ const firstSeg = rel.split(path.sep)[0];
645
+ if (firstSeg && firstSeg !== '.' && !firstSeg.startsWith('.')) {
646
+ derivedSection = firstSeg;
647
+ }
648
+ } else {
649
+ process.stderr.write(
650
+ 'record-decision: --source-artifact outside --room; dual-write skipped\n'
651
+ );
652
+ }
653
+ }
654
+ if (derivedSection) {
655
+ const { recordDecision: persistDecision } = require('../lib/core/decision-capture.cjs');
656
+ const decision = {
657
+ session_id: process.env.CLAUDE_SESSION_ID || 'sess-' + Date.now(),
658
+ timestamp: new Date().toISOString(),
659
+ action: rdKey,
660
+ user_response: rdDecision,
661
+ reason: rdReason || '(no reason)',
662
+ };
663
+ const dualResult = persistDecision(rdRoom, derivedSection, decision);
664
+ if (!dualResult || dualResult.success === false) {
665
+ const errPath = path.join(
666
+ path.resolve(rdRoom),
667
+ '.mindrian',
668
+ 'decision-dual-write-errors.jsonl'
669
+ );
670
+ try {
671
+ fs.mkdirSync(path.dirname(errPath), { recursive: true });
672
+ fs.appendFileSync(
673
+ errPath,
674
+ JSON.stringify({
675
+ timestamp: new Date().toISOString(),
676
+ reason: 'decision_log_failed',
677
+ decision,
678
+ violations: (dualResult && dualResult.violations) || [],
679
+ }) + '\n'
680
+ );
681
+ } catch (logErr) {
682
+ process.stderr.write(
683
+ 'dual-write error logging failed: ' + logErr.message + '\n'
684
+ );
685
+ }
686
+ }
687
+ }
688
+ } catch (e) {
689
+ process.stderr.write(
690
+ 'decision-capture dual-write error: ' + (e && e.message ? e.message : e) + '\n'
691
+ );
692
+ }
693
+ // --- end Phase 88 ---
694
+
695
+ const rdOutput = {
696
+ recorded: true,
697
+ decision: rdDecision,
698
+ edgeType: rdResult.edgeType,
699
+ graphEdge
700
+ };
701
+
702
+ if (raw) {
703
+ process.stdout.write(JSON.stringify(rdOutput));
704
+ } else {
705
+ process.stdout.write(JSON.stringify(rdOutput, null, 2));
706
+ }
707
+ process.exit(0);
708
+ break;
709
+ }
710
+
711
+ case 'bank-opportunity': {
712
+ // argv[1] could be roomDir or JSON. If it parses as JSON, no roomDir given.
713
+ let bkRoom = null;
714
+ let bkJson = argv[1];
715
+ if (argv[2]) {
716
+ // Two args: roomDir + JSON
717
+ bkRoom = argv[1];
718
+ bkJson = argv[2];
719
+ }
720
+ if (!bkJson) error('bank-opportunity requires a JSON argument');
721
+ let bkData;
722
+ try { bkData = JSON.parse(bkJson); } catch (_e) { error('Invalid JSON for bank-opportunity'); }
723
+
724
+ // If room exists, bank directly to room
725
+ if (bkRoom) {
726
+ const fs = require('fs');
727
+ if (fs.existsSync(require('path').resolve(bkRoom))) {
728
+ const result = opportunityOps.bankOpportunity(bkRoom, bkData);
729
+ output(result, raw, JSON.stringify(result));
730
+ break;
731
+ }
732
+ }
733
+
734
+ // No room or room not found -- bank to scratchpad
735
+ const spResult = scratchpadOps.writeScratchpadEntry('opportunity', bkData);
736
+ output(spResult, raw, JSON.stringify(spResult));
737
+ break;
738
+ }
739
+
740
+ case 'vault': {
741
+ const orchestrator = path.resolve(__dirname, '..', 'scripts', 'vault-export-orchestrator.cjs');
742
+ const forwarded = argv.slice(1);
743
+ try {
744
+ execFileSync(process.execPath, [orchestrator, ...forwarded], { stdio: 'inherit' });
745
+ } catch (err) {
746
+ error(`vault export failed: ${err.message}`);
747
+ }
748
+ break;
749
+ }
750
+
751
+ case 'detect-integrations': {
752
+ const integrationRegistry = require('../lib/core/integration-registry.cjs');
753
+ const result = integrationRegistry.detectIntegrations();
754
+ output(result, raw, JSON.stringify(result, null, 2));
755
+ break;
756
+ }
757
+
758
+ default:
759
+ error(`Unknown command: ${command}\n\n${USAGE}`);
760
+ }
761
+ }
762
+
763
+ main().catch(e => {
764
+ error(e.message);
765
+ });