@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,383 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Data Room Wiki</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
9
+ <style>
10
+ :root {
11
+ --ds-bg: #1a1a1a;
12
+ --ds-surface: #2d2d2d;
13
+ --ds-elevated: #3a3a3a;
14
+ --ds-cream: #f5f1e8;
15
+ --ds-muted: #a8a39f;
16
+ --ds-text: #d4cfc7;
17
+ --ds-border: #404040;
18
+ --ds-red: #A63D2F;
19
+ --ds-blue: #1E3A6E;
20
+ --ds-yellow: #C8A43C;
21
+ --ds-green: #2D6B4A;
22
+ --ds-teal: #2A6B5E;
23
+ --ds-sienna: #B5602A;
24
+ --ds-gray: #5C5A56;
25
+ --ds-amethyst: #6B4E8B;
26
+ --ds-blue-text: #4A7BC8;
27
+ --ds-yellow-text: #C8A43C;
28
+ --ds-green-text: #4A9B72;
29
+ --ds-teal-text: #4A9B8E;
30
+ --ds-font-display: 'Bebas Neue', sans-serif;
31
+ --ds-font-body: 'Inter', system-ui, sans-serif;
32
+ --ds-font-mono: 'JetBrains Mono', monospace;
33
+ --ds-transition: 150ms ease;
34
+ }
35
+
36
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
37
+ body {
38
+ font-family: var(--ds-font-body);
39
+ background: var(--ds-bg);
40
+ color: var(--ds-cream);
41
+ line-height: 1.6;
42
+ -webkit-font-smoothing: antialiased;
43
+ min-height: 100vh;
44
+ }
45
+
46
+ /* Layout */
47
+ .wiki-layout {
48
+ display: flex;
49
+ height: 100vh;
50
+ }
51
+ .wiki-sidebar {
52
+ width: 260px;
53
+ background: var(--ds-surface);
54
+ border-right: 1px solid var(--ds-border);
55
+ overflow-y: auto;
56
+ flex-shrink: 0;
57
+ padding: 16px;
58
+ }
59
+ .wiki-main {
60
+ flex: 1;
61
+ overflow-y: auto;
62
+ padding: 24px 32px;
63
+ }
64
+
65
+ /* Sidebar */
66
+ .wiki-brand {
67
+ font-family: var(--ds-font-display);
68
+ font-size: 1.25rem;
69
+ letter-spacing: 0.04em;
70
+ margin-bottom: 4px;
71
+ }
72
+ .wiki-stage {
73
+ font-family: var(--ds-font-mono);
74
+ font-size: 0.6875rem;
75
+ color: var(--ds-yellow-text);
76
+ letter-spacing: 0.1em;
77
+ text-transform: uppercase;
78
+ margin-bottom: 12px;
79
+ }
80
+ .wiki-search {
81
+ width: 100%;
82
+ padding: 8px 12px;
83
+ background: var(--ds-bg);
84
+ border: 1px solid var(--ds-border);
85
+ color: var(--ds-cream);
86
+ font-family: var(--ds-font-body);
87
+ font-size: 0.875rem;
88
+ margin-bottom: 16px;
89
+ }
90
+ .wiki-search:focus { outline: none; border-color: var(--ds-blue); }
91
+ .wiki-section-group { margin-bottom: 12px; }
92
+ .wiki-section-label {
93
+ font-family: var(--ds-font-mono);
94
+ font-size: 0.6875rem;
95
+ letter-spacing: 0.1em;
96
+ text-transform: uppercase;
97
+ cursor: pointer;
98
+ padding: 4px 0;
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 6px;
102
+ transition: var(--ds-transition);
103
+ }
104
+ .wiki-section-label:hover { color: var(--ds-cream); }
105
+ .wiki-section-dot {
106
+ width: 8px;
107
+ height: 8px;
108
+ display: inline-block;
109
+ flex-shrink: 0;
110
+ }
111
+ .wiki-entry-link {
112
+ display: block;
113
+ font-size: 0.8125rem;
114
+ color: var(--ds-muted);
115
+ padding: 2px 0 2px 14px;
116
+ text-decoration: none;
117
+ border-left: 2px solid transparent;
118
+ cursor: pointer;
119
+ transition: var(--ds-transition);
120
+ }
121
+ .wiki-entry-link:hover {
122
+ color: var(--ds-cream);
123
+ }
124
+ .wiki-entry-link.active {
125
+ color: var(--ds-cream);
126
+ border-left-color: var(--ds-blue);
127
+ }
128
+
129
+ /* Main content */
130
+ .wiki-welcome {
131
+ padding: 48px 0;
132
+ text-align: center;
133
+ }
134
+ .wiki-welcome h2 {
135
+ font-family: var(--ds-font-display);
136
+ font-size: 2rem;
137
+ letter-spacing: 0.04em;
138
+ margin-bottom: 8px;
139
+ }
140
+ .wiki-welcome p {
141
+ color: var(--ds-muted);
142
+ font-size: 0.875rem;
143
+ }
144
+
145
+ .article-header {
146
+ margin-bottom: 24px;
147
+ padding-bottom: 16px;
148
+ border-bottom: 1px solid var(--ds-border);
149
+ }
150
+ .article-section-label {
151
+ font-family: var(--ds-font-mono);
152
+ font-size: 0.6875rem;
153
+ letter-spacing: 0.1em;
154
+ text-transform: uppercase;
155
+ margin-bottom: 4px;
156
+ }
157
+ .article-title {
158
+ font-family: var(--ds-font-display);
159
+ font-size: 1.75rem;
160
+ letter-spacing: 0.04em;
161
+ }
162
+ .article-meta {
163
+ font-family: var(--ds-font-mono);
164
+ font-size: 0.6875rem;
165
+ color: var(--ds-muted);
166
+ margin-top: 4px;
167
+ }
168
+ .article-body {
169
+ color: var(--ds-text);
170
+ font-size: 0.9375rem;
171
+ line-height: 1.8;
172
+ white-space: pre-wrap;
173
+ word-wrap: break-word;
174
+ }
175
+ .article-body h1, .article-body h2, .article-body h3 {
176
+ font-family: var(--ds-font-display);
177
+ letter-spacing: 0.04em;
178
+ margin: 24px 0 8px;
179
+ color: var(--ds-cream);
180
+ }
181
+ .article-body h2 { font-size: 1.25rem; }
182
+ .article-body h3 { font-size: 1rem; }
183
+
184
+ /* Accent bar */
185
+ .accent-bar {
186
+ display: flex;
187
+ height: 3px;
188
+ }
189
+ .accent-bar span { flex: 1; }
190
+ .accent-bar span:nth-child(1) { background: var(--ds-red); }
191
+ .accent-bar span:nth-child(2) { background: var(--ds-blue); }
192
+ .accent-bar span:nth-child(3) { background: var(--ds-yellow); }
193
+ .accent-bar span:nth-child(4) { background: var(--ds-cream); }
194
+ .accent-bar span:nth-child(5) { background: var(--ds-bg); }
195
+
196
+ /* Responsive */
197
+ @media (max-width: 767px) {
198
+ .wiki-sidebar { width: 200px; padding: 12px; }
199
+ .wiki-main { padding: 16px; }
200
+ }
201
+ @media (max-width: 480px) {
202
+ .wiki-layout { flex-direction: column; }
203
+ .wiki-sidebar { width: 100%; height: auto; max-height: 200px; border-right: none; border-bottom: 1px solid var(--ds-border); }
204
+ }
205
+
206
+ .loading {
207
+ text-align: center;
208
+ padding: 48px;
209
+ color: var(--ds-muted);
210
+ font-family: var(--ds-font-mono);
211
+ }
212
+ .refresh-btn {
213
+ background: var(--ds-surface);
214
+ border: 1px solid var(--ds-border);
215
+ color: var(--ds-muted);
216
+ font-family: var(--ds-font-mono);
217
+ font-size: 0.6875rem;
218
+ padding: 4px 8px;
219
+ cursor: pointer;
220
+ letter-spacing: 0.08em;
221
+ text-transform: uppercase;
222
+ margin-top: 12px;
223
+ }
224
+ .refresh-btn:hover { border-color: var(--ds-blue); color: var(--ds-cream); }
225
+ </style>
226
+ </head>
227
+ <body>
228
+ <div id="app" class="loading">Loading Wiki...</div>
229
+
230
+ <script src="https://cdn.jsdelivr.net/npm/@modelcontextprotocol/ext-apps/dist/src/app-with-deps.js"></script>
231
+ <script>
232
+ (async function() {
233
+ const app = new App();
234
+ let connected = false;
235
+ try {
236
+ await app.connect();
237
+ connected = true;
238
+ } catch (e) {
239
+ console.warn('MCP Apps bridge not available');
240
+ }
241
+
242
+ let roomData = null;
243
+ let activeArticle = null;
244
+
245
+ app.ontoolresult = function(result) {
246
+ try {
247
+ const text = result.content && result.content[0] && result.content[0].text;
248
+ if (text) {
249
+ roomData = JSON.parse(text);
250
+ render(roomData);
251
+ }
252
+ } catch (e) {
253
+ document.getElementById('app').innerHTML = '<p>Error parsing data</p>';
254
+ }
255
+ };
256
+
257
+ window.refreshWiki = async function() {
258
+ if (connected) {
259
+ try {
260
+ const result = await app.callServerTool({ name: 'room-wiki', arguments: {} });
261
+ if (result && result.content && result.content[0]) {
262
+ roomData = JSON.parse(result.content[0].text);
263
+ render(roomData);
264
+ }
265
+ } catch (e) { console.error('Refresh failed:', e); }
266
+ }
267
+ };
268
+
269
+ window.selectArticle = function(sectionId, articleIdx) {
270
+ if (!roomData) return;
271
+ const sec = roomData.sections.find(function(s) { return s.id === sectionId; });
272
+ if (!sec || !sec.articles[articleIdx]) return;
273
+ activeArticle = { section: sec, article: sec.articles[articleIdx] };
274
+ renderMain();
275
+ // Update sidebar active state
276
+ document.querySelectorAll('.wiki-entry-link').forEach(function(el) { el.classList.remove('active'); });
277
+ var linkId = 'link-' + sectionId + '-' + articleIdx;
278
+ var el = document.getElementById(linkId);
279
+ if (el) el.classList.add('active');
280
+ // Update model context
281
+ if (connected) {
282
+ app.updateModelContext({
283
+ content: [{ type: 'text', text: 'User is reading: ' + sec.label + ' / ' + sec.articles[articleIdx].title }]
284
+ }).catch(function() {});
285
+ }
286
+ };
287
+
288
+ window.filterEntries = function(query) {
289
+ if (!roomData) return;
290
+ var q = query.toLowerCase();
291
+ document.querySelectorAll('.wiki-entry-link').forEach(function(el) {
292
+ var text = el.textContent.toLowerCase();
293
+ el.style.display = (!q || text.indexOf(q) >= 0) ? 'block' : 'none';
294
+ });
295
+ document.querySelectorAll('.wiki-section-group').forEach(function(grp) {
296
+ var links = grp.querySelectorAll('.wiki-entry-link');
297
+ var visible = Array.from(links).some(function(l) { return l.style.display !== 'none'; });
298
+ grp.style.display = (!q || visible) ? 'block' : 'none';
299
+ });
300
+ };
301
+
302
+ function escapeHtml(str) {
303
+ if (!str) return '';
304
+ return String(str).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
305
+ }
306
+
307
+ function renderSidebar() {
308
+ if (!roomData) return '';
309
+ var sections = roomData.sections || [];
310
+ var html = '';
311
+ html += '<div class="wiki-brand">' + escapeHtml(roomData.name || 'Data Room') + '</div>';
312
+ html += '<div class="wiki-stage">' + escapeHtml(roomData.stage || '') + '</div>';
313
+ html += '<input class="wiki-search" type="text" placeholder="Search entries..." oninput="filterEntries(this.value)">';
314
+
315
+ for (var s = 0; s < sections.length; s++) {
316
+ var sec = sections[s];
317
+ html += '<div class="wiki-section-group">';
318
+ html += '<div class="wiki-section-label" style="color:' + (sec.color||'#4A7BC8') + '">';
319
+ html += '<span class="wiki-section-dot" style="background:' + (sec.color||'#4A7BC8') + '"></span>';
320
+ html += escapeHtml(sec.label) + ' (' + (sec.entryCount||0) + ')';
321
+ html += '</div>';
322
+ for (var a = 0; a < (sec.articles||[]).length; a++) {
323
+ html += '<a class="wiki-entry-link" id="link-' + sec.id + '-' + a + '" onclick="selectArticle(\'' + sec.id + '\', ' + a + ')">';
324
+ html += escapeHtml(sec.articles[a].title);
325
+ html += '</a>';
326
+ }
327
+ html += '</div>';
328
+ }
329
+
330
+ html += '<button class="refresh-btn" onclick="refreshWiki()">REFRESH</button>';
331
+ return html;
332
+ }
333
+
334
+ function renderMain() {
335
+ var mainEl = document.getElementById('wiki-main');
336
+ if (!mainEl) return;
337
+ if (!activeArticle) {
338
+ var total = roomData ? (roomData.stats.entry_count || 0) : 0;
339
+ mainEl.innerHTML = '<div class="wiki-welcome"><h2>DATA ROOM WIKI</h2><p>Select an entry from the sidebar to read. ' + total + ' entries available.</p></div>';
340
+ return;
341
+ }
342
+ var sec = activeArticle.section;
343
+ var art = activeArticle.article;
344
+ var fm = art.frontmatter || {};
345
+
346
+ var html = '<div class="article-header">';
347
+ html += '<div class="article-section-label" style="color:' + (sec.color||'#4A7BC8') + '">' + escapeHtml(sec.label) + '</div>';
348
+ html += '<div class="article-title">' + escapeHtml(art.title) + '</div>';
349
+ var metaParts = [];
350
+ if (fm.date) metaParts.push(fm.date);
351
+ if (fm.type) metaParts.push(fm.type);
352
+ if (fm.status) metaParts.push(fm.status);
353
+ if (metaParts.length) html += '<div class="article-meta">' + escapeHtml(metaParts.join(' | ')) + '</div>';
354
+ html += '</div>';
355
+
356
+ html += '<div class="article-body">' + escapeHtml(art.body || '(No content)') + '</div>';
357
+ mainEl.innerHTML = html;
358
+ }
359
+
360
+ function render(data) {
361
+ var html = '<div class="accent-bar"><span></span><span></span><span></span><span></span><span></span></div>';
362
+ html += '<div class="wiki-layout">';
363
+ html += '<aside class="wiki-sidebar">' + renderSidebar() + '</aside>';
364
+ html += '<main class="wiki-main" id="wiki-main"></main>';
365
+ html += '</div>';
366
+
367
+ document.getElementById('app').innerHTML = html;
368
+ document.getElementById('app').className = '';
369
+
370
+ // Auto-select section if specified
371
+ if (data._activeSection) {
372
+ var sec = data.sections.find(function(s) { return s.id === data._activeSection; });
373
+ if (sec && sec.articles && sec.articles.length > 0) {
374
+ selectArticle(sec.id, 0);
375
+ return;
376
+ }
377
+ }
378
+ renderMain();
379
+ }
380
+ })();
381
+ </script>
382
+ </body>
383
+ </html>
@@ -0,0 +1,322 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * MindrianOS MCP App Views -- Phase 60
5
+ *
6
+ * Registers 3 MCP App tools + ui:// resources for inline Data Room
7
+ * rendering in Claude Desktop and Cowork:
8
+ *
9
+ * 1. room-dashboard -- De Stijl Mondrian grid overview
10
+ * 2. room-wiki -- Section browser with navigation
11
+ * 3. room-graph -- Cytoscape.js knowledge graph
12
+ *
13
+ * Each tool returns room data as JSON. Each has a ui:// resource with
14
+ * self-contained HTML (De Stijl style, vanilla JS, Cytoscape via CDN).
15
+ *
16
+ * Bidirectional: HTML templates use postMessage JSON-RPC to call back
17
+ * to MCP tools for on-demand data refresh (APP-06).
18
+ *
19
+ * Requirements: APP-01, APP-02, APP-03, APP-04, APP-05, APP-06
20
+ */
21
+
22
+ const fs = require('fs');
23
+ const path = require('path');
24
+ const { z } = require('zod');
25
+ const { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE } = require('@modelcontextprotocol/ext-apps/server');
26
+
27
+ // -- HTML template loader --
28
+
29
+ const TEMPLATE_DIR = path.join(__dirname, 'app-html');
30
+
31
+ function loadTemplate(filename) {
32
+ const filePath = path.join(TEMPLATE_DIR, filename);
33
+ try {
34
+ return fs.readFileSync(filePath, 'utf-8');
35
+ } catch (err) {
36
+ return `<html><body><p>Template not found: ${filename}</p></body></html>`;
37
+ }
38
+ }
39
+
40
+ // -- Room data helpers --
41
+
42
+ const SKIP_DIRS = new Set(['.lazygraph', '.mindrian', '.sparks', '.snapshots', '.mindrian', '.context', '.graph',
43
+ 'meetings', 'team', 'exports', 'assets', 'personas', 'intelligence']);
44
+ const SKIP_FILES = new Set([
45
+ 'ROOM.md', 'STATE.md', 'MINTO.md', 'USER.md', 'JTBD.md',
46
+ 'ROOM-INTELLIGENCE.md', 'MEETINGS-INTELLIGENCE.md',
47
+ 'action-items.md', 'assumptions.json', 'ASSET_MANIFEST.md'
48
+ ]);
49
+
50
+ const SECTION_COLORS = {
51
+ 'problem-definition': '#A63D2F',
52
+ 'market-analysis': '#C8A43C',
53
+ 'solution-design': '#5C5A56',
54
+ 'business-model': '#2D6B4A',
55
+ 'competitive-analysis': '#B5602A',
56
+ 'team-execution': '#1E3A6E',
57
+ 'legal-ip': '#6B4E8B',
58
+ 'financial-model': '#2A6B5E',
59
+ 'opportunity-bank': '#C87137',
60
+ 'funding-strategy': '#3A7B5E',
61
+ 'literature': '#C8A43C',
62
+ 'clinical-pathway': '#2A6B5E'
63
+ };
64
+
65
+ function parseFrontmatter(content) {
66
+ const fm = {};
67
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
68
+ if (!match) return fm;
69
+ for (const line of match[1].split('\n')) {
70
+ const idx = line.indexOf(':');
71
+ if (idx > 0) {
72
+ const key = line.slice(0, idx).trim();
73
+ const val = line.slice(idx + 1).trim().replace(/^["']|["']$/g, '');
74
+ fm[key] = val;
75
+ }
76
+ }
77
+ return fm;
78
+ }
79
+
80
+ function extractTitle(content, filePath) {
81
+ const h1 = content.match(/^# (.+)$/m);
82
+ return h1 ? h1[1].trim() : path.basename(filePath, '.md');
83
+ }
84
+
85
+ function extractBody(content) {
86
+ let body = content.replace(/^---\n[\s\S]*?\n---\n?/, '');
87
+ body = body.replace(/^# .+\n?/, '');
88
+ return body.trim();
89
+ }
90
+
91
+ /**
92
+ * Scan room directory and return structured data for all views.
93
+ */
94
+ function scanRoomData(roomDir) {
95
+ const result = {
96
+ name: path.basename(roomDir),
97
+ stage: 'Discovery',
98
+ subtitle: '',
99
+ sections: [],
100
+ stats: { section_count: 0, entry_count: 0, thread_count: 0 },
101
+ threads: [],
102
+ graphNodes: [],
103
+ graphEdges: []
104
+ };
105
+
106
+ // Read STATE.md
107
+ const stateFile = path.join(roomDir, 'STATE.md');
108
+ if (fs.existsSync(stateFile)) {
109
+ const content = fs.readFileSync(stateFile, 'utf-8');
110
+ const fm = parseFrontmatter(content);
111
+ if (fm.venture_name) result.name = fm.venture_name;
112
+ else if (fm.room_name) result.name = fm.room_name;
113
+ else if (fm.name) result.name = fm.name;
114
+ if (fm.venture_stage) result.stage = fm.venture_stage;
115
+ else if (fm.stage) result.stage = fm.stage;
116
+ if (fm.subtitle) result.subtitle = fm.subtitle;
117
+ else if (fm.description) result.subtitle = fm.description;
118
+ }
119
+
120
+ // Scan sections
121
+ let dirEntries;
122
+ try { dirEntries = fs.readdirSync(roomDir, { withFileTypes: true }); }
123
+ catch (_) { dirEntries = []; }
124
+
125
+ for (const entry of dirEntries) {
126
+ if (!entry.isDirectory()) continue;
127
+ const dirName = entry.name;
128
+ if (dirName.startsWith('.') || SKIP_DIRS.has(dirName)) continue;
129
+
130
+ const sectionDir = path.join(roomDir, dirName);
131
+ const articles = [];
132
+
133
+ try {
134
+ const files = fs.readdirSync(sectionDir).filter(f => f.endsWith('.md') && !SKIP_FILES.has(f));
135
+ for (const file of files) {
136
+ try {
137
+ const content = fs.readFileSync(path.join(sectionDir, file), 'utf-8');
138
+ const fm = parseFrontmatter(content);
139
+ articles.push({
140
+ filename: file,
141
+ title: extractTitle(content, file),
142
+ body: extractBody(content),
143
+ frontmatter: fm,
144
+ section: dirName
145
+ });
146
+ } catch (_) {}
147
+ }
148
+ } catch (_) {}
149
+
150
+ const label = dirName.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
151
+ const color = SECTION_COLORS[dirName] || '#4A7BC8';
152
+
153
+ result.sections.push({
154
+ id: dirName,
155
+ label,
156
+ color,
157
+ entryCount: articles.length,
158
+ articles
159
+ });
160
+
161
+ // Graph: section node
162
+ result.graphNodes.push({
163
+ data: { id: dirName, label, color, type: 'section' }
164
+ });
165
+
166
+ // Graph: entry nodes + edges to section
167
+ for (const art of articles) {
168
+ const nodeId = `${dirName}/${art.filename}`;
169
+ result.graphNodes.push({
170
+ data: { id: nodeId, label: art.title, color, type: 'entry' }
171
+ });
172
+ result.graphEdges.push({
173
+ data: { source: dirName, target: nodeId, type: 'BELONGS_TO' }
174
+ });
175
+ }
176
+ }
177
+
178
+ result.stats.section_count = result.sections.length;
179
+ result.stats.entry_count = result.sections.reduce((sum, s) => sum + s.entryCount, 0);
180
+
181
+ // Load threads from LazyGraph if available
182
+ const threadsFile = path.join(roomDir, '.mindrian', 'threads.json');
183
+ if (fs.existsSync(threadsFile)) {
184
+ try {
185
+ const threads = JSON.parse(fs.readFileSync(threadsFile, 'utf-8'));
186
+ if (Array.isArray(threads)) {
187
+ result.threads = threads;
188
+ result.stats.thread_count = threads.length;
189
+ for (const t of threads) {
190
+ result.graphEdges.push({
191
+ data: {
192
+ source: t.source || t.from,
193
+ target: t.target || t.to,
194
+ type: t.type || t.label || 'INFORMS'
195
+ }
196
+ });
197
+ }
198
+ }
199
+ } catch (_) {}
200
+ }
201
+
202
+ // Also check SQLite causal export
203
+ const causalExport = path.join(roomDir, '.mindrian/causal-export.json');
204
+ if (fs.existsSync(causalExport)) {
205
+ try {
206
+ const data = JSON.parse(fs.readFileSync(causalExport, 'utf-8'));
207
+ if (data.nodes) {
208
+ for (const n of data.nodes) {
209
+ const exists = result.graphNodes.some(gn => gn.data.id === n.id);
210
+ if (!exists) {
211
+ result.graphNodes.push({ data: { id: n.id, label: n.label || n.id, color: n.color || '#4A7BC8', type: n.type || 'concept' } });
212
+ }
213
+ }
214
+ }
215
+ if (data.edges) {
216
+ for (const e of data.edges) {
217
+ result.graphEdges.push({ data: { source: e.source, target: e.target, type: e.type || 'INFORMS' } });
218
+ }
219
+ result.stats.thread_count = Math.max(result.stats.thread_count, data.edges.length);
220
+ }
221
+ } catch (_) {}
222
+ }
223
+
224
+ return result;
225
+ }
226
+
227
+ // -- Registration --
228
+
229
+ /**
230
+ * Register all 3 MCP App views on the server.
231
+ *
232
+ * @param {import('@modelcontextprotocol/sdk/server/mcp.js').McpServer} server
233
+ * @param {string} roomDir
234
+ */
235
+ function registerAppViews(server, roomDir) {
236
+ // -- 1. Dashboard --
237
+ const dashboardUri = 'ui://mindrian-os/room-dashboard';
238
+
239
+ registerAppTool(server, 'room-dashboard', {
240
+ title: 'Data Room Dashboard',
241
+ description: 'De Stijl Mondrian grid dashboard showing room sections, entry counts, stage, and health overview. Read-only. Rendered inline in Desktop/Cowork.',
242
+ schema: z.object({
243
+ room_path: z.string().optional().describe('Path to room directory (uses server default if omitted)')
244
+ }),
245
+ _meta: { ui: { resourceUri: dashboardUri } }
246
+ }, async (args) => {
247
+ const dir = args.room_path || roomDir;
248
+ const data = scanRoomData(dir);
249
+ return {
250
+ content: [{ type: 'text', text: JSON.stringify(data) }]
251
+ };
252
+ });
253
+
254
+ registerAppResource(server, dashboardUri, dashboardUri,
255
+ { mimeType: RESOURCE_MIME_TYPE },
256
+ async () => ({
257
+ contents: [{ uri: dashboardUri, mimeType: RESOURCE_MIME_TYPE, text: loadTemplate('dashboard.html') }]
258
+ })
259
+ );
260
+
261
+ // -- 2. Wiki --
262
+ const wikiUri = 'ui://mindrian-os/room-wiki';
263
+
264
+ registerAppTool(server, 'room-wiki', {
265
+ title: 'Data Room Wiki',
266
+ description: 'Browse room sections and articles as navigable wiki pages. Click sections to view entries, search across all content. Rendered inline.',
267
+ schema: z.object({
268
+ room_path: z.string().optional().describe('Path to room directory'),
269
+ section: z.string().optional().describe('Jump to a specific section')
270
+ }),
271
+ _meta: { ui: { resourceUri: wikiUri } }
272
+ }, async (args) => {
273
+ const dir = args.room_path || roomDir;
274
+ const data = scanRoomData(dir);
275
+ if (args.section) {
276
+ data._activeSection = args.section;
277
+ }
278
+ return {
279
+ content: [{ type: 'text', text: JSON.stringify(data) }]
280
+ };
281
+ });
282
+
283
+ registerAppResource(server, wikiUri, wikiUri,
284
+ { mimeType: RESOURCE_MIME_TYPE },
285
+ async () => ({
286
+ contents: [{ uri: wikiUri, mimeType: RESOURCE_MIME_TYPE, text: loadTemplate('wiki.html') }]
287
+ })
288
+ );
289
+
290
+ // -- 3. Graph --
291
+ const graphUri = 'ui://mindrian-os/room-graph';
292
+
293
+ registerAppTool(server, 'room-graph', {
294
+ title: 'Knowledge Graph',
295
+ description: 'Interactive Cytoscape.js knowledge graph showing room sections, entries, and cross-references with De Stijl styling. Filter by thread type.',
296
+ schema: z.object({
297
+ room_path: z.string().optional().describe('Path to room directory'),
298
+ layout: z.enum(['cose', 'circle', 'grid', 'breadthfirst']).optional().describe('Graph layout algorithm')
299
+ }),
300
+ _meta: { ui: { resourceUri: graphUri } }
301
+ }, async (args) => {
302
+ const dir = args.room_path || roomDir;
303
+ const data = scanRoomData(dir);
304
+ if (args.layout) {
305
+ data._layout = args.layout;
306
+ }
307
+ return {
308
+ content: [{ type: 'text', text: JSON.stringify(data) }]
309
+ };
310
+ });
311
+
312
+ registerAppResource(server, graphUri, graphUri,
313
+ { mimeType: RESOURCE_MIME_TYPE },
314
+ async () => ({
315
+ contents: [{ uri: graphUri, mimeType: RESOURCE_MIME_TYPE, text: loadTemplate('graph.html') }]
316
+ })
317
+ );
318
+
319
+ process.stderr.write(`[mindrian-os] MCP Apps registered: room-dashboard, room-wiki, room-graph\n`);
320
+ }
321
+
322
+ module.exports = { registerAppViews, scanRoomData };