@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.
- package/.claude-plugin/plugin.json +21 -0
- package/.mcp.json +9 -0
- package/CHANGELOG.md +3333 -0
- package/LICENSE +123 -0
- package/README.md +673 -0
- package/agents/brain-query.md +80 -0
- package/agents/framework-runner.md +237 -0
- package/agents/grading.md +188 -0
- package/agents/investor.md +128 -0
- package/agents/larry-extended.md +135 -0
- package/agents/opportunity-scanner.md +91 -0
- package/agents/persona-analyst.md +132 -0
- package/agents/research.md +89 -0
- package/agents/reverse-salient-agent.md +27 -0
- package/bin/cli.js +142 -0
- package/bin/mindrian-mcp-server.cjs +182 -0
- package/bin/mindrian-tools.cjs +765 -0
- package/commands/act.md +439 -0
- package/commands/admin.md +404 -0
- package/commands/analyze-needs.md +42 -0
- package/commands/analyze-systems.md +39 -0
- package/commands/analyze-timing.md +42 -0
- package/commands/auto-explore.md +64 -0
- package/commands/beautiful-question.md +40 -0
- package/commands/brain-derive.md +78 -0
- package/commands/build-knowledge.md +42 -0
- package/commands/build-thesis.md +46 -0
- package/commands/causal.md +234 -0
- package/commands/challenge-assumptions.md +33 -0
- package/commands/compare-ventures.md +83 -0
- package/commands/dashboard.md +110 -0
- package/commands/deep-grade.md +82 -0
- package/commands/diagnose.md +58 -0
- package/commands/diagnostics.md +151 -0
- package/commands/doctor.md +151 -0
- package/commands/dominant-designs.md +40 -0
- package/commands/explain-decision.md +87 -0
- package/commands/explore-domains.md +42 -0
- package/commands/explore-futures.md +40 -0
- package/commands/explore-trends.md +42 -0
- package/commands/export.md +103 -0
- package/commands/file-meeting.md +724 -0
- package/commands/find-analogies.md +188 -0
- package/commands/find-bottlenecks.md +62 -0
- package/commands/find-connections.md +76 -0
- package/commands/funding.md +81 -0
- package/commands/grade.md +203 -0
- package/commands/graph.md +128 -0
- package/commands/hat-briefing.md +125 -0
- package/commands/heal.md +196 -0
- package/commands/help.md +399 -0
- package/commands/hmi-status.md +172 -0
- package/commands/jtbd.md +241 -0
- package/commands/leadership.md +73 -0
- package/commands/lean-canvas.md +40 -0
- package/commands/macro-trends.md +40 -0
- package/commands/map-unknowns.md +40 -0
- package/commands/memory.md +173 -0
- package/commands/models.md +175 -0
- package/commands/mos-reason.md +285 -0
- package/commands/mullins.md +120 -0
- package/commands/new-project.md +481 -0
- package/commands/onboard.md +434 -0
- package/commands/operator.md +149 -0
- package/commands/opportunities.md +144 -0
- package/commands/organize.md +497 -0
- package/commands/persona.md +198 -0
- package/commands/pipeline.md +112 -0
- package/commands/present.md +91 -0
- package/commands/publish.md +201 -0
- package/commands/query.md +124 -0
- package/commands/radar.md +72 -0
- package/commands/reanalyze.md +91 -0
- package/commands/research.md +196 -0
- package/commands/room.md +352 -0
- package/commands/rooms.md +598 -0
- package/commands/root-cause.md +40 -0
- package/commands/rs-experts.md +85 -0
- package/commands/rs-explain.md +100 -0
- package/commands/rs-fetch.md +94 -0
- package/commands/rs-thesis.md +85 -0
- package/commands/scenario-plan.md +40 -0
- package/commands/scheduled-tasks.md +285 -0
- package/commands/score-innovation.md +43 -0
- package/commands/scout.md +239 -0
- package/commands/setup.md +618 -0
- package/commands/snapshot.md +147 -0
- package/commands/speakers.md +84 -0
- package/commands/splash.md +28 -0
- package/commands/status.md +75 -0
- package/commands/structure-argument.md +42 -0
- package/commands/suggest-next.md +80 -0
- package/commands/systems-thinking.md +40 -0
- package/commands/think-hats.md +42 -0
- package/commands/update.md +181 -0
- package/commands/user-needs.md +40 -0
- package/commands/validate.md +40 -0
- package/commands/value-proposition.md +61 -0
- package/commands/vault.md +180 -0
- package/commands/visualize.md +52 -0
- package/commands/whitespace.md +507 -0
- package/commands/wiki.md +69 -0
- package/hooks/hooks.json +381 -0
- package/hooks/run-hook.cmd +64 -0
- package/lib/__init__.py +0 -0
- package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/agents/auto-explore-agent.cjs +1043 -0
- package/lib/agents/reverse-salient-agent.cjs +679 -0
- package/lib/agents/tension-hook-agent.cjs +544 -0
- package/lib/brain/ROOM.md +44 -0
- package/lib/brain/chain-recommender.cjs +301 -0
- package/lib/chat/chat-context.js +185 -0
- package/lib/chat/chat-panel.js +721 -0
- package/lib/chat/fabric-chat.cjs +288 -0
- package/lib/chat/generative-tools.js +219 -0
- package/lib/conversation/ROOM.md +39 -0
- package/lib/conversation/classifier-rules.json +38 -0
- package/lib/conversation/classifier.cjs +264 -0
- package/lib/conversation/operator.cjs +287 -0
- package/lib/copy/115-spec-strings.cjs +55 -0
- package/lib/core/__init__.py +0 -0
- package/lib/core/__nav-stub.cjs +14 -0
- package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
- package/lib/core/artifact-id.cjs +148 -0
- package/lib/core/asset-ops.cjs +151 -0
- package/lib/core/auto-commit-throttle.cjs +129 -0
- package/lib/core/bearer-token.cjs +199 -0
- package/lib/core/brain-client.cjs +865 -0
- package/lib/core/brain-derivation-prompts.cjs +326 -0
- package/lib/core/brain-derivation-queue.cjs +431 -0
- package/lib/core/brain-derivation.cjs +580 -0
- package/lib/core/brain-md-schema.cjs +528 -0
- package/lib/core/brain-md-staleness.cjs +357 -0
- package/lib/core/brain-response-sanitize.cjs +188 -0
- package/lib/core/bridge-writer.cjs +477 -0
- package/lib/core/chat-context-builder.cjs +253 -0
- package/lib/core/cross-room-aggregator.cjs +762 -0
- package/lib/core/daily-briefing.cjs +438 -0
- package/lib/core/decision-capture.cjs +618 -0
- package/lib/core/deep-links.cjs +82 -0
- package/lib/core/dispatch-optimizer.cjs +354 -0
- package/lib/core/dual-path-detector.cjs +84 -0
- package/lib/core/dual-path-detector.test.cjs +334 -0
- package/lib/core/exports-log.cjs +79 -0
- package/lib/core/feynman-minto-invariants.cjs +605 -0
- package/lib/core/folder-memory-async.cjs +338 -0
- package/lib/core/folder-memory-shared.cjs +890 -0
- package/lib/core/folder-memory.cjs +416 -0
- package/lib/core/framework-chain-composer.cjs +411 -0
- package/lib/core/frontmatter-schemas.cjs +330 -0
- package/lib/core/git-ops.cjs +141 -0
- package/lib/core/graph-ops.cjs +258 -0
- package/lib/core/hat-persistence.cjs +362 -0
- package/lib/core/index.cjs +60 -0
- package/lib/core/integration-registry.cjs +232 -0
- package/lib/core/intelligence-cascade.cjs +661 -0
- package/lib/core/lazygraph-ops.cjs +1057 -0
- package/lib/core/lru-cache.cjs +139 -0
- package/lib/core/mcp-profiles.cjs +182 -0
- package/lib/core/meeting-ops.cjs +54 -0
- package/lib/core/memory-ops.cjs +600 -0
- package/lib/core/migrations/ROOM.md +33 -0
- package/lib/core/migrations/phase-109-nodes-provenance.cjs +339 -0
- package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
- package/lib/core/model-profiles.cjs +246 -0
- package/lib/core/mullins-scaffold.cjs +160 -0
- package/lib/core/nav-dial.cjs +316 -0
- package/lib/core/navigation/ROOM.md +15 -0
- package/lib/core/navigation/explanation.cjs +43 -0
- package/lib/core/navigation/focus.cjs +135 -0
- package/lib/core/navigation/ingestion.cjs +82 -0
- package/lib/core/navigation/insights.cjs +350 -0
- package/lib/core/navigation/memory-events.cjs +118 -0
- package/lib/core/navigation/neighborhood.cjs +78 -0
- package/lib/core/navigation/packet.cjs +182 -0
- package/lib/core/navigation/room-home.cjs +127 -0
- package/lib/core/navigation/transitions.cjs +82 -0
- package/lib/core/navigation-engine-shared.cjs +242 -0
- package/lib/core/navigation-engine.cjs +664 -0
- package/lib/core/navigation.cjs +60 -0
- package/lib/core/nl-graph-queries.cjs +164 -0
- package/lib/core/offer-presenter.cjs +406 -0
- package/lib/core/opportunity-extractor.cjs +183 -0
- package/lib/core/opportunity-ops.cjs +1371 -0
- package/lib/core/persona-ops.cjs +537 -0
- package/lib/core/persona-taxonomy.cjs +190 -0
- package/lib/core/platform-gates.cjs +120 -0
- package/lib/core/platform.cjs +257 -0
- package/lib/core/proactive-intelligence.cjs +528 -0
- package/lib/core/problem-type-router.cjs +315 -0
- package/lib/core/reasoning-ops.cjs +639 -0
- package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
- package/lib/core/room-classifier-strict-mode.cjs +229 -0
- package/lib/core/room-db.cjs +127 -0
- package/lib/core/room-ops-async.cjs +92 -0
- package/lib/core/room-ops-shared.cjs +64 -0
- package/lib/core/room-ops-sync.cjs +70 -0
- package/lib/core/room-ops.cjs +32 -0
- package/lib/core/room-type-detector.cjs +386 -0
- package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
- package/lib/core/rs-brain-substrate.cjs +570 -0
- package/lib/core/rs-breakthrough-scorer.cjs +255 -0
- package/lib/core/rs-canon-violations.cjs +82 -0
- package/lib/core/rs-chain-feeder.cjs +343 -0
- package/lib/core/rs-commercial-assessor.cjs +280 -0
- package/lib/core/rs-differential-scorer.cjs +376 -0
- package/lib/core/rs-domain-analyzer.cjs +385 -0
- package/lib/core/rs-egress-prompts.cjs +113 -0
- package/lib/core/rs-egress-telemetry.cjs +225 -0
- package/lib/core/rs-egress-violations.cjs +53 -0
- package/lib/core/rs-expert-mapper.cjs +467 -0
- package/lib/core/rs-fetcher-academic.cjs +697 -0
- package/lib/core/rs-fetcher-experts.cjs +314 -0
- package/lib/core/rs-fetcher-industry.cjs +731 -0
- package/lib/core/rs-fetcher-patents.cjs +564 -0
- package/lib/core/rs-innovation-classifier.cjs +194 -0
- package/lib/core/rs-mind-map.cjs +656 -0
- package/lib/core/rs-neo4j-writer.cjs +388 -0
- package/lib/core/rs-nl-to-query.cjs +425 -0
- package/lib/core/rs-pinecone-bridge.cjs +303 -0
- package/lib/core/rs-preprocessor.cjs +350 -0
- package/lib/core/rs-query-matrix.cjs +316 -0
- package/lib/core/rs-query-to-text.cjs +438 -0
- package/lib/core/rs-sqlite-mirror.cjs +443 -0
- package/lib/core/rs-thesis-generator.cjs +188 -0
- package/lib/core/rs_cache.py +479 -0
- package/lib/core/rs_corpus.py +468 -0
- package/lib/core/rs_hybrid.py +586 -0
- package/lib/core/rs_math.py +287 -0
- package/lib/core/rs_rooms.py +193 -0
- package/lib/core/scheduled-scanner.cjs +463 -0
- package/lib/core/scratchpad-ops.cjs +201 -0
- package/lib/core/section-8-trace-schema.cjs +138 -0
- package/lib/core/section-registry.cjs +111 -0
- package/lib/core/session-state.cjs +144 -0
- package/lib/core/shallow-doc-parser.cjs +174 -0
- package/lib/core/shallow-doc-parser.test.cjs +226 -0
- package/lib/core/skill-activation-router.cjs +284 -0
- package/lib/core/state-ops.cjs +46 -0
- package/lib/core/statusline-cache.cjs +266 -0
- package/lib/core/token-estimator.cjs +348 -0
- package/lib/core/user-archetype.cjs +239 -0
- package/lib/core/user-md-ops.cjs +524 -0
- package/lib/core/visual-ops.cjs +624 -0
- package/lib/core/write-lock.cjs +149 -0
- package/lib/graph/canvas-graph.js +467 -0
- package/lib/graph/constellation-config.cjs +299 -0
- package/lib/graph/graph-detail-panel.js +165 -0
- package/lib/hmi/ROOM.md +47 -0
- package/lib/hmi/across-session-memory.cjs +604 -0
- package/lib/hmi/cross-room-memory.cjs +575 -0
- package/lib/hmi/decoy-tier.cjs +395 -0
- package/lib/hmi/jtbd-classifier.cjs +219 -0
- package/lib/hmi/jtbd-state.cjs +199 -0
- package/lib/hmi/jtbd-taxonomy.json +392 -0
- package/lib/hmi/selector-dispatcher.cjs +546 -0
- package/lib/hmi/selector-telemetry.cjs +263 -0
- package/lib/hmi/shape-f0-renderer.cjs +139 -0
- package/lib/hmi/shape-f1-fallback.cjs +80 -0
- package/lib/hmi/shape-f1-renderer.cjs +138 -0
- package/lib/hmi/shape-f2-renderer.cjs +132 -0
- package/lib/hmi/shape-f3-renderer.cjs +66 -0
- package/lib/hmi/shape-f4-renderer.cjs +72 -0
- package/lib/hmi/shape-f5-renderer.cjs +155 -0
- package/lib/hmi/shape-f6-plan-review-renderer.cjs +312 -0
- package/lib/hmi/shape-f6-renderer.cjs +144 -0
- package/lib/hmi/shape-g-renderer.cjs +219 -0
- package/lib/hmi/shape-h-renderer.cjs +222 -0
- package/lib/hmi/tier-check.cjs +63 -0
- package/lib/import/PRECONDITIONS.md +41 -0
- package/lib/import/branding.cjs +210 -0
- package/lib/import/branding.test.cjs +235 -0
- package/lib/import/classifications-sync.cjs +104 -0
- package/lib/import/classifications-sync.test.cjs +129 -0
- package/lib/import/enricher.cjs +296 -0
- package/lib/import/enricher.test.cjs +273 -0
- package/lib/import/integration.test.cjs +376 -0
- package/lib/import/manifest.cjs +129 -0
- package/lib/import/manifest.schema.json +185 -0
- package/lib/import/manifest.test.cjs +123 -0
- package/lib/import/meeting-detector.cjs +92 -0
- package/lib/import/meeting-detector.test.cjs +100 -0
- package/lib/import/person-detector.cjs +229 -0
- package/lib/import/person-detector.test.cjs +149 -0
- package/lib/import/report.cjs +186 -0
- package/lib/import/report.test.cjs +186 -0
- package/lib/import/room-md-scaffolder.cjs +49 -0
- package/lib/import/router.cjs +224 -0
- package/lib/import/router.test.cjs +356 -0
- package/lib/import/run-all-tests.cjs +36 -0
- package/lib/import/smoke-test.cjs +213 -0
- package/lib/import/smoke-test.test.cjs +148 -0
- package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +8 -0
- package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +7 -0
- package/lib/import/test-fixtures/collision-vault/source/onboarding.md +5 -0
- package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +1 -0
- package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +4 -0
- package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +9 -0
- package/lib/import/test-fixtures/tiny-vault/notes/empty.md +3 -0
- package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +5 -0
- package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +5 -0
- package/lib/import/test-fixtures/tiny-vault/notes/random.md +4 -0
- package/lib/import/undo.test.cjs +199 -0
- package/lib/import/vault-scanner.cjs +105 -0
- package/lib/import/vault-scanner.test.cjs +67 -0
- package/lib/mcp/app-html/dashboard.html +316 -0
- package/lib/mcp/app-html/graph.html +428 -0
- package/lib/mcp/app-html/mindrian-platform.html +1841 -0
- package/lib/mcp/app-html/wiki.html +383 -0
- package/lib/mcp/app-views.cjs +322 -0
- package/lib/mcp/brain-router.cjs +418 -0
- package/lib/mcp/capability-registry.cjs +62 -0
- package/lib/mcp/larry-context.cjs +46 -0
- package/lib/mcp/larry-server-instructions.md +114 -0
- package/lib/mcp/pipeline-state.cjs +275 -0
- package/lib/mcp/prompts.cjs +302 -0
- package/lib/mcp/resources.cjs +227 -0
- package/lib/mcp/session-catchup.cjs +327 -0
- package/lib/mcp/surface-detect.cjs +75 -0
- package/lib/mcp/tool-router.cjs +1034 -0
- package/lib/memory/aaak-compress.cjs +403 -0
- package/lib/memory/aaak-compress.test.cjs +288 -0
- package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
- package/lib/memory/bearer-token.test.cjs +315 -0
- package/lib/memory/brain-cache-lru.test.cjs +259 -0
- package/lib/memory/brain-client-query-shape.test.cjs +160 -0
- package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
- package/lib/memory/brain-derivation-queue.test.cjs +539 -0
- package/lib/memory/brain-derivation.test.cjs +634 -0
- package/lib/memory/brain-derive-command.test.cjs +534 -0
- package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
- package/lib/memory/brain-md-schema.test.cjs +467 -0
- package/lib/memory/brain-md-staleness.test.cjs +525 -0
- package/lib/memory/brain-server-resolution.test.cjs +314 -0
- package/lib/memory/chain-recommender.test.cjs +233 -0
- package/lib/memory/chat-context.test.cjs +128 -0
- package/lib/memory/command-registry.test.cjs +220 -0
- package/lib/memory/cross-room-aggregator.test.cjs +909 -0
- package/lib/memory/dashboard-server.test.cjs +256 -0
- package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
- package/lib/memory/decision-capture.test.cjs +632 -0
- package/lib/memory/decision-capture.worker.cjs +70 -0
- package/lib/memory/explain-decision-command.test.cjs +521 -0
- package/lib/memory/explain-decision-footer.test.cjs +316 -0
- package/lib/memory/explored-materials-store.cjs +392 -0
- package/lib/memory/feynman-minto-guardian.test.cjs +736 -0
- package/lib/memory/feynman-minto-invariants.test.cjs +511 -0
- package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
- package/lib/memory/feynman-prompts.cjs +151 -0
- package/lib/memory/feynman-prompts.test.cjs +96 -0
- package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
- package/lib/memory/folder-memory.test.cjs +503 -0
- package/lib/memory/framework-chain-composer.test.cjs +515 -0
- package/lib/memory/frontmatter-schema-validator.test.cjs +290 -0
- package/lib/memory/heal-command.test.cjs +604 -0
- package/lib/memory/index-artifact-transaction.test.cjs +333 -0
- package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
- package/lib/memory/mcp-input-validation.test.cjs +240 -0
- package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
- package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
- package/lib/memory/minto-debouncer.test.cjs +407 -0
- package/lib/memory/minto-debouncer.worker.cjs +46 -0
- package/lib/memory/minto-migration-v88.test.cjs +265 -0
- package/lib/memory/minto-schema-v88.test.cjs +390 -0
- package/lib/memory/mos-status-renderer.test.cjs +631 -0
- package/lib/memory/narrative-schema.cjs +376 -0
- package/lib/memory/narrative-schema.test.cjs +209 -0
- package/lib/memory/nav-dial.test.cjs +414 -0
- package/lib/memory/navigation-engine-core.test.cjs +722 -0
- package/lib/memory/navigation-invariants.test.cjs +483 -0
- package/lib/memory/offer-presenter.test.cjs +554 -0
- package/lib/memory/on-stop-snapshot.test.cjs +404 -0
- package/lib/memory/pending-tension-store.cjs +373 -0
- package/lib/memory/post-compact-reinjection.test.cjs +854 -0
- package/lib/memory/post-write-triple.test.cjs +317 -0
- package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
- package/lib/memory/problem-type-router.test.cjs +656 -0
- package/lib/memory/query-efficiency-telemetry.test.cjs +370 -0
- package/lib/memory/recompile-room-references.test.cjs +392 -0
- package/lib/memory/recompile-room-references.worker.cjs +42 -0
- package/lib/memory/record-decision-dual-write.test.cjs +454 -0
- package/lib/memory/room-classifier-strict-mode.test.cjs +417 -0
- package/lib/memory/room-minto-hook.test.cjs +398 -0
- package/lib/memory/rs-discovery-engine.test.cjs +323 -0
- package/lib/memory/run-feynman-tests.cjs +1247 -0
- package/lib/memory/security-trifecta.test.cjs +312 -0
- package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
- package/lib/memory/session-start-triple-injection.test.cjs +514 -0
- package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
- package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
- package/lib/memory/skill-activation-router.test.cjs +419 -0
- package/lib/memory/stamp-artifact-write.test.cjs +304 -0
- package/lib/memory/statusline-active-room.test.cjs +315 -0
- package/lib/memory/statusline-minto-segment.test.cjs +292 -0
- package/lib/memory/sync-async-entry-points.test.cjs +204 -0
- package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
- package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
- package/lib/memory/test-rs-brain-substrate.cjs +636 -0
- package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
- package/lib/memory/test-rs-canon-violations.cjs +218 -0
- package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
- package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
- package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
- package/lib/memory/test-rs-differential-scorer.cjs +480 -0
- package/lib/memory/test-rs-discovery-engine.cjs +603 -0
- package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
- package/lib/memory/test-rs-egress-primitives.cjs +420 -0
- package/lib/memory/test-rs-expert-mapper.cjs +547 -0
- package/lib/memory/test-rs-explain-command.cjs +443 -0
- package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
- package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
- package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
- package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
- package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
- package/lib/memory/test-rs-mind-map.cjs +646 -0
- package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
- package/lib/memory/test-rs-nl-to-query.cjs +449 -0
- package/lib/memory/test-rs-pinecone-bridge.cjs +277 -0
- package/lib/memory/test-rs-preprocessor.cjs +433 -0
- package/lib/memory/test-rs-query-matrix.cjs +391 -0
- package/lib/memory/test-rs-query-to-text.cjs +551 -0
- package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
- package/lib/memory/test-rs-thesis-generator.cjs +360 -0
- package/lib/memory/triple-context-formatter.cjs +473 -0
- package/lib/memory/triple-context-formatter.test.cjs +442 -0
- package/lib/memory/user-md-persona.test.cjs +565 -0
- package/lib/memory/userpromptsubmit-integration.test.cjs +690 -0
- package/lib/memory/validators/README.md +157 -0
- package/lib/memory/validators/brain-md-invariants.cjs +475 -0
- package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
- package/lib/memory/validators/external-academic-invariants.cjs +249 -0
- package/lib/memory/validators/external-industry-invariants.cjs +271 -0
- package/lib/memory/validators/external-patents-invariants.cjs +266 -0
- package/lib/memory/validators/minto-invariants.cjs +62 -0
- package/lib/memory/validators/navigation-invariants.cjs +340 -0
- package/lib/memory/validators/queue-health.cjs +95 -0
- package/lib/memory/validators/snapshot-integrity.cjs +129 -0
- package/lib/memory/validators/stale-lifecycle.cjs +116 -0
- package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
- package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
- package/lib/memory/write-lock-atomic.test.cjs +137 -0
- package/lib/memory/write-lock-atomic.worker.cjs +55 -0
- package/lib/parity/check-parity.cjs +83 -0
- package/lib/presentation/presentation-server.cjs +101 -0
- package/lib/presentation/presentation-watcher.cjs +123 -0
- package/lib/quickview/hub-server.cjs +719 -0
- package/lib/quickview/server.cjs +533 -0
- package/lib/render/JTBD-PALETTES.md +145 -0
- package/lib/render/ROOM.md +59 -0
- package/lib/render/render-v2.cjs +486 -0
- package/lib/render/render-v2.test.cjs +267 -0
- package/lib/render/render.cjs +65 -0
- package/lib/state/ROOM.md +46 -0
- package/lib/state/state-md-parser.cjs +215 -0
- package/lib/statusline/ROOM.md +38 -0
- package/lib/statusline/banner-suppression.cjs +50 -0
- package/lib/statusline/surface-detect.cjs +85 -0
- package/lib/update-bootstrap.sh.template +145 -0
- package/lib/vault/frontmatter-schema.cjs +297 -0
- package/lib/vault/room-scanner.cjs +352 -0
- package/lib/vault/wikilink-builder.cjs +231 -0
- package/lib/vault/wikilink-builder.test.cjs +182 -0
- package/lib/wiki/graph-links.cjs +281 -0
- package/lib/wiki/page-renderer.cjs +229 -0
- package/lib/wiki/wiki-chat.cjs +81 -0
- package/lib/wiki/wiki-layout.cjs +1459 -0
- package/lib/wiki/wiki-search.cjs +142 -0
- package/lib/wiki/wiki-server.cjs +678 -0
- package/lib/wiki/wiki-watcher.cjs +105 -0
- package/lib/workflow/ROOM.md +47 -0
- package/lib/workflow/command-resolver.cjs +155 -0
- package/lib/workflow/command-resolver.test.cjs +235 -0
- package/package.json +44 -0
- package/pipelines/analogy/01-decompose.md +80 -0
- package/pipelines/analogy/02-abstract.md +87 -0
- package/pipelines/analogy/03-search.md +135 -0
- package/pipelines/analogy/04-transfer.md +101 -0
- package/pipelines/analogy/05-validate.md +106 -0
- package/pipelines/analogy/CHAIN.md +56 -0
- package/pipelines/discovery/01-explore-domains.md +44 -0
- package/pipelines/discovery/02-think-hats.md +50 -0
- package/pipelines/discovery/03-analyze-needs.md +54 -0
- package/pipelines/discovery/CHAIN.md +37 -0
- package/pipelines/thesis/01-structure-argument.md +45 -0
- package/pipelines/thesis/02-challenge-assumptions.md +48 -0
- package/pipelines/thesis/03-build-thesis.md +54 -0
- package/pipelines/thesis/CHAIN.md +37 -0
- package/references/brain/causal-directives.md +91 -0
- package/references/brain/causal-enrichment.cypher +165 -0
- package/references/brain/command-triggers-schema.md +226 -0
- package/references/brain/graph-architecture.md +317 -0
- package/references/brain/query-patterns.md +460 -0
- package/references/brain/room-hierarchy-schema.md +218 -0
- package/references/brain/schema.md +76 -0
- package/references/capability-radar/capabilities-index.md +241 -0
- package/references/capability-radar/changelog-cache.md +81 -0
- package/references/causal/causal-schema.md +103 -0
- package/references/design/email-template-standard.md +155 -0
- package/references/design/graph-visualization-standard.md +178 -0
- package/references/document-generation.md +179 -0
- package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
- package/references/import-config.md +141 -0
- package/references/integrations/detection-patterns.md +101 -0
- package/references/meeting/artifact-template.md +377 -0
- package/references/meeting/cross-meeting-intelligence.md +216 -0
- package/references/meeting/cross-relationship-patterns.md +202 -0
- package/references/meeting/live-join-interface.md +244 -0
- package/references/meeting/section-mapping.md +192 -0
- package/references/meeting/segment-classification.md +258 -0
- package/references/meeting/speaker-profile-template.md +219 -0
- package/references/meeting/summary-template.md +348 -0
- package/references/meeting/transcript-patterns.md +226 -0
- package/references/methodology/analyze-needs.md +135 -0
- package/references/methodology/analyze-systems.md +121 -0
- package/references/methodology/analyze-timing.md +149 -0
- package/references/methodology/beautiful-question.md +109 -0
- package/references/methodology/build-knowledge.md +161 -0
- package/references/methodology/build-thesis.md +237 -0
- package/references/methodology/challenge-assumptions.md +127 -0
- package/references/methodology/diagnose.md +169 -0
- package/references/methodology/dominant-designs.md +212 -0
- package/references/methodology/explore-domains.md +147 -0
- package/references/methodology/explore-futures.md +163 -0
- package/references/methodology/explore-trends.md +129 -0
- package/references/methodology/find-bottlenecks.md +131 -0
- package/references/methodology/grade.md +211 -0
- package/references/methodology/index.md +97 -0
- package/references/methodology/leadership.md +200 -0
- package/references/methodology/lean-canvas.md +116 -0
- package/references/methodology/macro-trends.md +192 -0
- package/references/methodology/map-unknowns.md +137 -0
- package/references/methodology/mullins-7-domains.md +104 -0
- package/references/methodology/problem-types.md +65 -0
- package/references/methodology/root-cause.md +178 -0
- package/references/methodology/sapphire-encoding.md +355 -0
- package/references/methodology/scenario-plan.md +178 -0
- package/references/methodology/score-innovation.md +154 -0
- package/references/methodology/structure-argument.md +158 -0
- package/references/methodology/systems-thinking.md +159 -0
- package/references/methodology/think-hats.md +147 -0
- package/references/methodology/triz-matrix.json +751 -0
- package/references/methodology/triz-principles.md +501 -0
- package/references/methodology/user-needs.md +199 -0
- package/references/methodology/validate.md +163 -0
- package/references/methodology/value-proposition.md +244 -0
- package/references/opportunities/funding-lifecycle.md +103 -0
- package/references/opportunities/grant-api-patterns.md +99 -0
- package/references/opportunities/opportunity-template.md +84 -0
- package/references/personality/assessment-philosophy.md +72 -0
- package/references/personality/lexicon.md +100 -0
- package/references/personality/persona-chains.md +56 -0
- package/references/personality/pws-lexicon-full.md +499 -0
- package/references/personality/voice-dna.md +156 -0
- package/references/personas/hat-perspectives.md +76 -0
- package/references/personas/persona-template.md +63 -0
- package/references/pipeline/act-output-contract.md +88 -0
- package/references/pipeline/chains-index.md +39 -0
- package/references/pws-profile-generation.md +79 -0
- package/references/reasoning/reasoning-schema.md +143 -0
- package/references/reasoning/reasoning-template.md +68 -0
- package/references/reasoning/run-template.md +38 -0
- package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
- package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
- package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
- package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
- package/references/taxonomy/TAXONOMY.md +192 -0
- package/references/templates/MINTO.md +36 -0
- package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
- package/references/vault-kit/README.md +35 -0
- package/references/vault-kit/app.json +12 -0
- package/references/vault-kit/appearance.json +12 -0
- package/references/vault-kit/graph.json +35 -0
- package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
- package/references/vault-kit/templates/new-artifact.md +37 -0
- package/references/vault-kit/templates/new-meeting-note.md +35 -0
- package/references/vault-kit/templates/new-team-profile.md +29 -0
- package/references/vault-kit/templates/new-xref.md +35 -0
- package/references/visual/symbol-system.md +151 -0
- package/skills/MOSDeckEngine/SKILL.md +325 -0
- package/skills/brain-connector/SKILL.md +114 -0
- package/skills/context-engine/SKILL.md +147 -0
- package/skills/conversation-mode/SKILL.md +102 -0
- package/skills/larry-personality/SKILL.md +219 -0
- package/skills/larry-personality/framework-chains.md +92 -0
- package/skills/larry-personality/mode-engine.md +185 -0
- package/skills/mullins-scaffold/SKILL.md +61 -0
- package/skills/mullins-scaffold/scaffold.json +146 -0
- package/skills/pws-methodology/SKILL.md +49 -0
- package/skills/room-passive/SKILL.md +165 -0
- package/skills/room-proactive/SKILL.md +250 -0
- package/skills/ui-system/SKILL.md +277 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindrianOS Plugin -- AI Team Persona Operations
|
|
3
|
+
* Core operations for personas/ room section.
|
|
4
|
+
* Generates De Bono Six Thinking Hat personas from room intelligence.
|
|
5
|
+
* Pure Node.js built-ins only (zero npm deps per Phase 10 decision).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const crypto = require('crypto');
|
|
13
|
+
const { discoverSections } = require('./section-registry.cjs');
|
|
14
|
+
const { safeReadFile } = require('./index.cjs');
|
|
15
|
+
const { loadHatState, saveHatState, logSession } = require('./hat-persistence.cjs');
|
|
16
|
+
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Frontmatter parser (same regex/split approach as opportunity-ops.cjs)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Parse YAML frontmatter from a markdown string.
|
|
23
|
+
* Simple regex/split parsing (no yaml library).
|
|
24
|
+
* @param {string} content
|
|
25
|
+
* @returns {Object}
|
|
26
|
+
*/
|
|
27
|
+
function parseFrontmatter(content) {
|
|
28
|
+
if (!content || typeof content !== 'string') return {};
|
|
29
|
+
|
|
30
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
31
|
+
if (!match) return {};
|
|
32
|
+
|
|
33
|
+
const yaml = match[1];
|
|
34
|
+
const result = {};
|
|
35
|
+
const lines = yaml.split('\n');
|
|
36
|
+
|
|
37
|
+
let currentKey = null;
|
|
38
|
+
let currentList = null;
|
|
39
|
+
|
|
40
|
+
for (let i = 0; i < lines.length; i++) {
|
|
41
|
+
const line = lines[i];
|
|
42
|
+
|
|
43
|
+
// Top-level key: value
|
|
44
|
+
const topMatch = line.match(/^([a-z_]+):\s*(.*)$/);
|
|
45
|
+
if (topMatch) {
|
|
46
|
+
// Flush pending list
|
|
47
|
+
if (currentList !== null && currentKey) {
|
|
48
|
+
result[currentKey] = currentList;
|
|
49
|
+
currentList = null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
currentKey = topMatch[1];
|
|
53
|
+
const val = topMatch[2].trim();
|
|
54
|
+
|
|
55
|
+
if (val === '' || val === 'null') {
|
|
56
|
+
result[currentKey] = null;
|
|
57
|
+
} else if (val === 'true') {
|
|
58
|
+
result[currentKey] = true;
|
|
59
|
+
} else if (val === 'false') {
|
|
60
|
+
result[currentKey] = false;
|
|
61
|
+
} else if (/^-?\d+(\.\d+)?$/.test(val)) {
|
|
62
|
+
result[currentKey] = parseFloat(val);
|
|
63
|
+
} else {
|
|
64
|
+
result[currentKey] = val.replace(/^["']|["']$/g, '');
|
|
65
|
+
}
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// List item ( - value)
|
|
70
|
+
const listMatch = line.match(/^\s+-\s+(.+)$/);
|
|
71
|
+
if (listMatch && currentKey) {
|
|
72
|
+
if (currentList === null) currentList = [];
|
|
73
|
+
currentList.push(listMatch[1].trim());
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Flush trailing list
|
|
79
|
+
if (currentList !== null && currentKey) {
|
|
80
|
+
result[currentKey] = currentList;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Hat definitions (hardcoded for zero-IO performance)
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
const DISCLAIMER = 'This is a perspective lens generated from your room data. It is NOT professional advice. Validate all insights with qualified professionals.';
|
|
91
|
+
|
|
92
|
+
const HAT_DEFINITIONS = {
|
|
93
|
+
white: {
|
|
94
|
+
color: 'white',
|
|
95
|
+
label: 'Facts & Data',
|
|
96
|
+
perspective: 'What do we actually know? Strip opinion. Data only.',
|
|
97
|
+
focus_areas: ['numbers', 'metrics', 'market data', 'financial figures', 'validated claims', 'data gaps'],
|
|
98
|
+
tension_hat: 'red',
|
|
99
|
+
complementary_hat: 'blue',
|
|
100
|
+
question_style: 'evidence-seeking',
|
|
101
|
+
},
|
|
102
|
+
red: {
|
|
103
|
+
color: 'red',
|
|
104
|
+
label: 'Emotions & Intuition',
|
|
105
|
+
perspective: 'What does your gut say about this venture? No justification needed.',
|
|
106
|
+
focus_areas: ['team passion', 'market excitement', 'user pain intensity', 'founder conviction', 'emotional resonance'],
|
|
107
|
+
tension_hat: 'white',
|
|
108
|
+
complementary_hat: 'yellow',
|
|
109
|
+
question_style: 'feeling-focused',
|
|
110
|
+
},
|
|
111
|
+
black: {
|
|
112
|
+
color: 'black',
|
|
113
|
+
label: 'Risks & Dangers',
|
|
114
|
+
perspective: 'What kills this? What fails? What\'s the worst case?',
|
|
115
|
+
focus_areas: ['competitive threats', 'financial risks', 'regulatory barriers', 'technical debt', 'team gaps', 'assumption fragility'],
|
|
116
|
+
tension_hat: 'yellow',
|
|
117
|
+
complementary_hat: 'white',
|
|
118
|
+
question_style: 'risk-probing',
|
|
119
|
+
},
|
|
120
|
+
yellow: {
|
|
121
|
+
color: 'yellow',
|
|
122
|
+
label: 'Benefits & Opportunities',
|
|
123
|
+
perspective: 'What\'s the upside? Why could this work brilliantly?',
|
|
124
|
+
focus_areas: ['market opportunity', 'competitive advantages', 'team strengths', 'timing benefits', 'growth potential'],
|
|
125
|
+
tension_hat: 'black',
|
|
126
|
+
complementary_hat: 'green',
|
|
127
|
+
question_style: 'opportunity-seeking',
|
|
128
|
+
},
|
|
129
|
+
green: {
|
|
130
|
+
color: 'green',
|
|
131
|
+
label: 'Creativity & Alternatives',
|
|
132
|
+
perspective: 'What else? What\'s weird? What hasn\'t been tried?',
|
|
133
|
+
focus_areas: ['alternative approaches', 'unconventional strategies', 'pivot possibilities', 'adjacent markets', 'creative partnerships'],
|
|
134
|
+
tension_hat: 'blue',
|
|
135
|
+
complementary_hat: 'yellow',
|
|
136
|
+
question_style: 'divergent-thinking',
|
|
137
|
+
},
|
|
138
|
+
blue: {
|
|
139
|
+
color: 'blue',
|
|
140
|
+
label: 'Process & Meta',
|
|
141
|
+
perspective: 'Are we asking the right questions? What\'s missing from the analysis?',
|
|
142
|
+
focus_areas: ['analysis completeness', 'missing sections', 'methodology gaps', 'decision framework', 'next steps'],
|
|
143
|
+
tension_hat: 'green',
|
|
144
|
+
complementary_hat: 'white',
|
|
145
|
+
question_style: 'meta-analytical',
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const HAT_COLORS = Object.keys(HAT_DEFINITIONS);
|
|
150
|
+
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
// Domain signal extraction
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Extract domain signals from room state and sections.
|
|
157
|
+
* @param {string} roomDir - Path to room directory
|
|
158
|
+
* @returns {{ primaryDomain: string, ventureStage: string, populatedSections: string[], sectionCount: number, ventureName: string, sectionContent: Object }}
|
|
159
|
+
*/
|
|
160
|
+
function extractDomainSignals(roomDir) {
|
|
161
|
+
const resolved = path.resolve(roomDir);
|
|
162
|
+
const stateContent = safeReadFile(path.join(resolved, 'STATE.md')) || '';
|
|
163
|
+
const sections = discoverSections(resolved);
|
|
164
|
+
|
|
165
|
+
const signals = {
|
|
166
|
+
primaryDomain: 'venture',
|
|
167
|
+
ventureStage: 'unknown',
|
|
168
|
+
populatedSections: [],
|
|
169
|
+
sectionCount: 0,
|
|
170
|
+
ventureName: 'Unknown Venture',
|
|
171
|
+
stateContent: stateContent,
|
|
172
|
+
sectionContent: {},
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// Extract venture name from STATE.md frontmatter or heading
|
|
176
|
+
const ventureMatch = stateContent.match(/venture:\s*(.+)/i);
|
|
177
|
+
if (ventureMatch) {
|
|
178
|
+
signals.ventureName = ventureMatch[1].trim();
|
|
179
|
+
} else {
|
|
180
|
+
const headingMatch = stateContent.match(/^#\s+(.+)/m);
|
|
181
|
+
if (headingMatch) signals.ventureName = headingMatch[1].trim();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Extract stage
|
|
185
|
+
const stageMatch = stateContent.match(/stage:\s*(.+)/i);
|
|
186
|
+
if (stageMatch) signals.ventureStage = stageMatch[1].trim();
|
|
187
|
+
|
|
188
|
+
// Derive domain slug from venture name
|
|
189
|
+
signals.primaryDomain = signals.ventureName
|
|
190
|
+
.toLowerCase()
|
|
191
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
192
|
+
.replace(/\s+/g, '-')
|
|
193
|
+
.replace(/-+/g, '-')
|
|
194
|
+
.slice(0, 40);
|
|
195
|
+
|
|
196
|
+
// Scan sections for populated content
|
|
197
|
+
for (const name of sections.all) {
|
|
198
|
+
// Skip the personas section itself
|
|
199
|
+
if (name === 'personas') continue;
|
|
200
|
+
|
|
201
|
+
const sectionDir = path.join(resolved, name);
|
|
202
|
+
try {
|
|
203
|
+
const files = fs.readdirSync(sectionDir).filter(f => f.endsWith('.md') && f !== 'STATE.md');
|
|
204
|
+
if (files.length > 0) {
|
|
205
|
+
signals.populatedSections.push(name);
|
|
206
|
+
// Read first file content for signal extraction
|
|
207
|
+
const firstFile = safeReadFile(path.join(sectionDir, files[0])) || '';
|
|
208
|
+
signals.sectionContent[name] = firstFile;
|
|
209
|
+
}
|
|
210
|
+
} catch (e) {
|
|
211
|
+
// skip unreadable dirs
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
signals.sectionCount = signals.populatedSections.length;
|
|
216
|
+
return signals;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// Persona content builders
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Extract a brief summary from section content (first meaningful paragraph).
|
|
225
|
+
* @param {string} content
|
|
226
|
+
* @returns {string}
|
|
227
|
+
*/
|
|
228
|
+
function extractSectionSummary(content) {
|
|
229
|
+
if (!content) return 'Content available for analysis.';
|
|
230
|
+
|
|
231
|
+
// Remove frontmatter
|
|
232
|
+
const body = content.replace(/^---[\s\S]*?---\s*/, '');
|
|
233
|
+
|
|
234
|
+
// Find first non-heading, non-empty paragraph
|
|
235
|
+
const lines = body.split('\n').filter(l => l.trim() && !l.startsWith('#'));
|
|
236
|
+
if (lines.length > 0) {
|
|
237
|
+
const summary = lines[0].trim();
|
|
238
|
+
return summary.length > 120 ? summary.slice(0, 117) + '...' : summary;
|
|
239
|
+
}
|
|
240
|
+
return 'Content available for analysis.';
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Build hat-specific questions based on hat focus and section content.
|
|
245
|
+
* @param {Object} hat - Hat definition
|
|
246
|
+
* @param {Object} signals - Domain signals
|
|
247
|
+
* @returns {string[]}
|
|
248
|
+
*/
|
|
249
|
+
function buildQuestions(hat, signals) {
|
|
250
|
+
const domain = signals.ventureName;
|
|
251
|
+
const sections = signals.populatedSections;
|
|
252
|
+
|
|
253
|
+
const questionTemplates = {
|
|
254
|
+
white: [
|
|
255
|
+
`What validated data points support the core assumptions in ${domain}?`,
|
|
256
|
+
`Which claims in your ${sections[0] || 'analysis'} section lack quantitative backing?`,
|
|
257
|
+
`What metrics would you need to track to prove or disprove your thesis?`,
|
|
258
|
+
],
|
|
259
|
+
red: [
|
|
260
|
+
`When you describe ${domain} to someone, what part makes you most excited?`,
|
|
261
|
+
`Which aspect of this venture keeps you up at night -- not logically, but emotionally?`,
|
|
262
|
+
`If you had to bet your reputation on one strength of this venture, what would it be?`,
|
|
263
|
+
],
|
|
264
|
+
black: [
|
|
265
|
+
`What single point of failure could kill ${domain} in the next 12 months?`,
|
|
266
|
+
`Which competitor could pivot into your space faster than you can build defensibility?`,
|
|
267
|
+
`What assumption, if proven wrong, would invalidate your entire business model?`,
|
|
268
|
+
],
|
|
269
|
+
yellow: [
|
|
270
|
+
`What unfair advantage does ${domain} have that competitors cannot easily replicate?`,
|
|
271
|
+
`Which market trend is accelerating in your favor right now?`,
|
|
272
|
+
`What is the best possible outcome for this venture in 3 years?`,
|
|
273
|
+
],
|
|
274
|
+
green: [
|
|
275
|
+
`What if ${domain} served a completely different customer segment?`,
|
|
276
|
+
`What would a radically different business model look like for this same problem?`,
|
|
277
|
+
`What adjacent market could you enter with minimal modification to your core offering?`,
|
|
278
|
+
],
|
|
279
|
+
blue: [
|
|
280
|
+
`Are we analyzing ${domain} at the right level of granularity?`,
|
|
281
|
+
`Which room section is most underdeveloped relative to its importance?`,
|
|
282
|
+
`What methodology or framework would challenge our current analysis approach?`,
|
|
283
|
+
],
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
return questionTemplates[hat.color] || [
|
|
287
|
+
`What do you see in ${domain} from this perspective?`,
|
|
288
|
+
`What are others missing about this venture?`,
|
|
289
|
+
`What should be examined more carefully?`,
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Build the full persona markdown content.
|
|
295
|
+
* @param {string} hatColor
|
|
296
|
+
* @param {Object} signals
|
|
297
|
+
* @returns {string}
|
|
298
|
+
*/
|
|
299
|
+
function buildPersonaContent(hatColor, signals) {
|
|
300
|
+
const hat = HAT_DEFINITIONS[hatColor];
|
|
301
|
+
const tensionHat = HAT_DEFINITIONS[hat.tension_hat];
|
|
302
|
+
const compHat = HAT_DEFINITIONS[hat.complementary_hat];
|
|
303
|
+
const date = new Date().toISOString().split('T')[0];
|
|
304
|
+
const roomHash = crypto.createHash('md5').update(signals.stateContent).digest('hex').slice(0, 7);
|
|
305
|
+
|
|
306
|
+
// Build frontmatter
|
|
307
|
+
const frontmatter = [
|
|
308
|
+
'---',
|
|
309
|
+
`hat: ${hat.color}`,
|
|
310
|
+
`hat_label: ${hat.label}`,
|
|
311
|
+
`domain: ${signals.primaryDomain}`,
|
|
312
|
+
`perspective: ${hat.perspective}`,
|
|
313
|
+
`generated_from:`,
|
|
314
|
+
...signals.populatedSections.map(s => ` - ${s}`),
|
|
315
|
+
`generated_date: ${date}`,
|
|
316
|
+
`room_hash: ${roomHash}`,
|
|
317
|
+
`disclaimer: "${DISCLAIMER}"`,
|
|
318
|
+
'---',
|
|
319
|
+
].join('\n');
|
|
320
|
+
|
|
321
|
+
// Build "Who I Am"
|
|
322
|
+
const whoIAm = `I examine your ${signals.ventureName} venture through the lens of ${hat.label.toLowerCase()}. My perspective: ${hat.perspective} I focus on: ${hat.focus_areas.join(', ')}.`;
|
|
323
|
+
|
|
324
|
+
// Build "What I See" sections
|
|
325
|
+
const seeInRoom = signals.populatedSections.map(section => {
|
|
326
|
+
const content = signals.sectionContent[section] || '';
|
|
327
|
+
const summary = extractSectionSummary(content);
|
|
328
|
+
const sectionLabel = section.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
|
|
329
|
+
return `### From ${sectionLabel}\n${summary}`;
|
|
330
|
+
}).join('\n\n');
|
|
331
|
+
|
|
332
|
+
// Build questions
|
|
333
|
+
const questions = buildQuestions(hat, signals);
|
|
334
|
+
const questionBlock = questions.map((q, i) => `${i + 1}. ${q}`).join('\n');
|
|
335
|
+
|
|
336
|
+
// Build disagreements
|
|
337
|
+
const disagreements = [
|
|
338
|
+
`- **vs ${tensionHat.color.charAt(0).toUpperCase() + tensionHat.color.slice(1)} (${tensionHat.label}):** Our perspectives naturally tension -- ${hat.label.toLowerCase()} vs ${tensionHat.label.toLowerCase()}. Where I see ${hat.focus_areas[0]}, they see ${tensionHat.focus_areas[0]}.`,
|
|
339
|
+
`- **vs ${compHat.color.charAt(0).toUpperCase() + compHat.color.slice(1)} (${compHat.label}):** We often align, but I emphasize ${hat.focus_areas[1] || hat.focus_areas[0]} while they focus on ${compHat.focus_areas[1] || compHat.focus_areas[0]}.`,
|
|
340
|
+
].join('\n');
|
|
341
|
+
|
|
342
|
+
// Assemble
|
|
343
|
+
return `${frontmatter}
|
|
344
|
+
|
|
345
|
+
# ${hat.color.charAt(0).toUpperCase() + hat.color.slice(1)} Hat -- ${hat.label} Perspective
|
|
346
|
+
|
|
347
|
+
## Who I Am
|
|
348
|
+
|
|
349
|
+
${whoIAm}
|
|
350
|
+
|
|
351
|
+
## What I See In Your Room
|
|
352
|
+
|
|
353
|
+
${seeInRoom}
|
|
354
|
+
|
|
355
|
+
## My Questions For You
|
|
356
|
+
|
|
357
|
+
${questionBlock}
|
|
358
|
+
|
|
359
|
+
## Where I Disagree With Other Hats
|
|
360
|
+
|
|
361
|
+
${disagreements}
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
*${DISCLAIMER} Generated from room state on ${date}.*
|
|
365
|
+
`;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// ---------------------------------------------------------------------------
|
|
369
|
+
// Core operations
|
|
370
|
+
// ---------------------------------------------------------------------------
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Generate 6 hat-colored persona files from room intelligence.
|
|
374
|
+
* Requires 2+ populated sections (rejects thin rooms).
|
|
375
|
+
*
|
|
376
|
+
* @param {string} roomDir - Path to room directory
|
|
377
|
+
* @returns {{ generated: string[], domain: string, sections_used: number } | { error: string }}
|
|
378
|
+
*/
|
|
379
|
+
function generatePersonas(roomDir) {
|
|
380
|
+
const resolved = path.resolve(roomDir);
|
|
381
|
+
|
|
382
|
+
const stateContent = safeReadFile(path.join(resolved, 'STATE.md'));
|
|
383
|
+
if (!stateContent) return { error: 'No room STATE.md found' };
|
|
384
|
+
|
|
385
|
+
const signals = extractDomainSignals(resolved);
|
|
386
|
+
if (signals.sectionCount < 2) {
|
|
387
|
+
return {
|
|
388
|
+
error: 'Room needs content in 2+ sections for meaningful personas',
|
|
389
|
+
sections: signals.sectionCount,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Ensure personas/ directory exists
|
|
394
|
+
const personasDir = path.join(resolved, 'personas');
|
|
395
|
+
fs.mkdirSync(personasDir, { recursive: true });
|
|
396
|
+
|
|
397
|
+
const generated = [];
|
|
398
|
+
for (const hatColor of HAT_COLORS) {
|
|
399
|
+
const content = buildPersonaContent(hatColor, signals);
|
|
400
|
+
const filename = `${hatColor}-${signals.primaryDomain}.md`;
|
|
401
|
+
fs.writeFileSync(path.join(personasDir, filename), content, 'utf-8');
|
|
402
|
+
generated.push(filename);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return {
|
|
406
|
+
generated,
|
|
407
|
+
domain: signals.primaryDomain,
|
|
408
|
+
sections_used: signals.sectionCount,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* List all personas in a room's personas/ directory.
|
|
414
|
+
* @param {string} roomDir
|
|
415
|
+
* @returns {Array<{ hat: string, hat_label: string, domain: string, filename: string, disclaimer: string }>}
|
|
416
|
+
*/
|
|
417
|
+
function listPersonas(roomDir) {
|
|
418
|
+
const resolved = path.resolve(roomDir);
|
|
419
|
+
const personasDir = path.join(resolved, 'personas');
|
|
420
|
+
|
|
421
|
+
let files;
|
|
422
|
+
try {
|
|
423
|
+
files = fs.readdirSync(personasDir).filter(f => f.endsWith('.md') && f !== 'STATE.md');
|
|
424
|
+
} catch (e) {
|
|
425
|
+
return [];
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return files.map(filename => {
|
|
429
|
+
const content = safeReadFile(path.join(personasDir, filename)) || '';
|
|
430
|
+
const fm = parseFrontmatter(content);
|
|
431
|
+
return {
|
|
432
|
+
hat: fm.hat || null,
|
|
433
|
+
hat_label: fm.hat_label || null,
|
|
434
|
+
domain: fm.domain || null,
|
|
435
|
+
filename,
|
|
436
|
+
disclaimer: fm.disclaimer || null,
|
|
437
|
+
};
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Invoke a specific hat persona, optionally with a target artifact.
|
|
443
|
+
* @param {string} roomDir
|
|
444
|
+
* @param {string} hatColor - white|red|black|yellow|green|blue
|
|
445
|
+
* @param {string} [artifactPath] - Optional path to artifact for analysis
|
|
446
|
+
* @returns {{ persona: string, artifact: string|null, hat: string } | { error: string }}
|
|
447
|
+
*/
|
|
448
|
+
function invokePersona(roomDir, hatColor, artifactPath) {
|
|
449
|
+
const resolved = path.resolve(roomDir);
|
|
450
|
+
const personasDir = path.join(resolved, 'personas');
|
|
451
|
+
|
|
452
|
+
let files;
|
|
453
|
+
try {
|
|
454
|
+
files = fs.readdirSync(personasDir).filter(f => f.startsWith(hatColor + '-') && f.endsWith('.md'));
|
|
455
|
+
} catch (e) {
|
|
456
|
+
return { error: `No ${hatColor} hat persona generated. Run persona generate first.` };
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (files.length === 0) {
|
|
460
|
+
return { error: `No ${hatColor} hat persona generated. Run persona generate first.` };
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
const personaContent = safeReadFile(path.join(personasDir, files[0]));
|
|
464
|
+
const artifactContent = artifactPath ? safeReadFile(path.resolve(artifactPath)) : null;
|
|
465
|
+
|
|
466
|
+
// Load persistent hat state to enrich the persona context
|
|
467
|
+
const hatState = loadHatState(resolved, hatColor);
|
|
468
|
+
|
|
469
|
+
return {
|
|
470
|
+
persona: personaContent,
|
|
471
|
+
artifact: artifactContent,
|
|
472
|
+
hat: hatColor,
|
|
473
|
+
hatState: hatState.error ? null : hatState,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Persist findings after a persona analysis completes.
|
|
479
|
+
* Called after Claude generates perspective output for a hat.
|
|
480
|
+
* ONE subagent loads persona files on demand (NOT 6 concurrent agents).
|
|
481
|
+
*
|
|
482
|
+
* @param {string} roomDir
|
|
483
|
+
* @param {string} hatColor
|
|
484
|
+
* @param {{ focus: string, findings: string[], concerns: string[], opportunities: string[], artifact?: string }} findings
|
|
485
|
+
* @returns {{ persisted: boolean, state_path: string, log_path: string }}
|
|
486
|
+
*/
|
|
487
|
+
function persistPersonaFindings(roomDir, hatColor, findings) {
|
|
488
|
+
const resolved = path.resolve(roomDir);
|
|
489
|
+
|
|
490
|
+
const logResult = logSession(resolved, hatColor, findings);
|
|
491
|
+
if (logResult.error) return { persisted: false, error: logResult.error };
|
|
492
|
+
|
|
493
|
+
return {
|
|
494
|
+
persisted: true,
|
|
495
|
+
state_path: path.join(resolved, '.mindrian', 'hats', hatColor, 'STATE.md'),
|
|
496
|
+
log_path: logResult.path,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Run all 6 personas against a single artifact.
|
|
502
|
+
* ONE subagent loads persona files on demand (NOT 6 concurrent agents).
|
|
503
|
+
* Each hat is loaded sequentially, enriched with persistent state.
|
|
504
|
+
* @param {string} roomDir
|
|
505
|
+
* @param {string} [artifactPath]
|
|
506
|
+
* @returns {{ perspectives: Object, artifact: string|null, hat_states: Object }}
|
|
507
|
+
*/
|
|
508
|
+
function analyzeAllPerspectives(roomDir, artifactPath) {
|
|
509
|
+
const resolved = path.resolve(roomDir);
|
|
510
|
+
const perspectives = {};
|
|
511
|
+
const hatStates = {};
|
|
512
|
+
|
|
513
|
+
// Sequential loading -- one hat at a time, not 6 concurrent agents
|
|
514
|
+
for (const hatColor of HAT_COLORS) {
|
|
515
|
+
perspectives[hatColor] = invokePersona(resolved, hatColor, artifactPath);
|
|
516
|
+
hatStates[hatColor] = loadHatState(resolved, hatColor);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return {
|
|
520
|
+
perspectives,
|
|
521
|
+
artifact: artifactPath || null,
|
|
522
|
+
hat_states: hatStates,
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// ---------------------------------------------------------------------------
|
|
527
|
+
// Exports
|
|
528
|
+
// ---------------------------------------------------------------------------
|
|
529
|
+
|
|
530
|
+
module.exports = {
|
|
531
|
+
generatePersonas,
|
|
532
|
+
listPersonas,
|
|
533
|
+
invokePersona,
|
|
534
|
+
analyzeAllPerspectives,
|
|
535
|
+
extractDomainSignals,
|
|
536
|
+
persistPersonaFindings,
|
|
537
|
+
};
|