@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,765 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MindrianOS Plugin — CLI Entry Point
|
|
4
|
+
* Routes subcommands to lib/core modules.
|
|
5
|
+
* Pattern: GSD gsd-tools.cjs (switch-case routing, async main, catch).
|
|
6
|
+
* Surface-agnostic — no CLI/MCP/Desktop branching here.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { execFileSync } = require('child_process');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { output, error } = require('../lib/core/index.cjs');
|
|
14
|
+
// Phase 87-04: CLI path uses the sync entry point directly (self-documenting).
|
|
15
|
+
// The legacy './room-ops.cjs' shim still works but emits a DeprecationWarning.
|
|
16
|
+
const roomOps = require('../lib/core/room-ops-sync.cjs');
|
|
17
|
+
const stateOps = require('../lib/core/state-ops.cjs');
|
|
18
|
+
const meetingOps = require('../lib/core/meeting-ops.cjs');
|
|
19
|
+
const graphOps = require('../lib/core/graph-ops.cjs');
|
|
20
|
+
const opportunityOps = require('../lib/core/opportunity-ops.cjs');
|
|
21
|
+
const personaOps = require('../lib/core/persona-ops.cjs');
|
|
22
|
+
const reasoningOps = require('../lib/core/reasoning-ops.cjs');
|
|
23
|
+
const visualOps = require('../lib/core/visual-ops.cjs');
|
|
24
|
+
const scratchpadOps = require('../lib/core/scratchpad-ops.cjs');
|
|
25
|
+
|
|
26
|
+
const USAGE = `Usage: mindrian-tools.cjs <command> <subcommand> [roomDir] [--raw]
|
|
27
|
+
|
|
28
|
+
Commands:
|
|
29
|
+
room list-sections [roomDir] List discovered sections with metadata
|
|
30
|
+
room analyze [roomDir] Run analyze-room script
|
|
31
|
+
state compute [roomDir] Run compute-state script
|
|
32
|
+
state get [roomDir] Read STATE.md from room
|
|
33
|
+
meeting compute-intel [roomDir] Run compute-meetings-intelligence script
|
|
34
|
+
meeting compute-team [roomDir] Run compute-team script
|
|
35
|
+
graph build [roomDir] [outputPath] Generate knowledge graph JSON
|
|
36
|
+
graph build-sqlite [roomDir] [outputPath] Build graph.json from SQLite (primary)
|
|
37
|
+
graph index [roomDir] <filePath> Index single artifact in room graph (SQLite)
|
|
38
|
+
graph rebuild [roomDir] Rebuild entire room graph from artifacts
|
|
39
|
+
graph query [roomDir] "<sql>" Execute SQL query against room graph
|
|
40
|
+
graph stats [roomDir] Show room graph node/edge statistics
|
|
41
|
+
opportunity scan [roomDir] Context-driven grant discovery
|
|
42
|
+
opportunity list [roomDir] List filed opportunities
|
|
43
|
+
opportunity file [roomDir] [dataJson] File an opportunity
|
|
44
|
+
funding list [roomDir] List funding pipeline entries
|
|
45
|
+
funding create [roomDir] [slug] [source] Create funding entry from opportunity
|
|
46
|
+
funding advance [roomDir] [slug] [note] Advance to next stage
|
|
47
|
+
funding status [roomDir] [slug] Show funding entry details
|
|
48
|
+
funding outcome [roomDir] [slug] [outcome] Set outcome (awarded|rejected|withdrawn)
|
|
49
|
+
funding compute-state [roomDir] Compute opportunity-bank + funding STATE.md
|
|
50
|
+
persona generate [roomDir] Generate 6 De Bono hat personas from room state
|
|
51
|
+
persona list [roomDir] List generated personas
|
|
52
|
+
persona invoke [roomDir] [hat] [artifact] Invoke a specific hat perspective
|
|
53
|
+
persona analyze [roomDir] [artifact] Run all 6 perspectives on an artifact
|
|
54
|
+
reasoning get [roomDir] [section] Get REASONING.md for a section
|
|
55
|
+
reasoning generate [roomDir] [section] Generate/regenerate REASONING.md
|
|
56
|
+
reasoning verify [roomDir] [section] Check verification criteria
|
|
57
|
+
reasoning run [roomDir] [section] Execute full methodology run
|
|
58
|
+
reasoning list [roomDir] Show all sections with reasoning status
|
|
59
|
+
reasoning frontmatter [roomDir] [json|section] [field] Read/write reasoning frontmatter
|
|
60
|
+
visualize room [roomDir] Generate room structure Mermaid diagram
|
|
61
|
+
visualize graph [roomDir] Generate knowledge graph Mermaid diagram
|
|
62
|
+
visualize chain [roomDir] Generate methodology chain Mermaid diagram
|
|
63
|
+
visualize mermaid [roomDir] [type] Output raw Mermaid syntax to stdout
|
|
64
|
+
cascade [roomDir] [filePath] Run intelligence cascade on a filed artifact
|
|
65
|
+
bank-opportunity [roomDir] <json> Bank an opportunity from conversation (room or scratchpad)
|
|
66
|
+
record-decision --room DIR --key KEY --decision approve|reject|defer [--reason "..."] [--source-artifact ID] [--target-artifact ID]
|
|
67
|
+
Record user decision on a proactive intelligence finding
|
|
68
|
+
detect-integrations Detect all integration statuses (env, MCP, filesystem)
|
|
69
|
+
vault [room] [--path <target>] [--in-place]
|
|
70
|
+
Export room as Obsidian vault (or linkify in-place)
|
|
71
|
+
room linkify [room] Retroactively inject wikilinks + footers in-place (WIKI-08)`;
|
|
72
|
+
|
|
73
|
+
async function main() {
|
|
74
|
+
const argv = process.argv.slice(2);
|
|
75
|
+
|
|
76
|
+
// Detect --raw flag
|
|
77
|
+
const rawIndex = argv.indexOf('--raw');
|
|
78
|
+
const raw = rawIndex !== -1;
|
|
79
|
+
if (raw) argv.splice(rawIndex, 1);
|
|
80
|
+
|
|
81
|
+
const command = argv[0];
|
|
82
|
+
const subcommand = argv[1];
|
|
83
|
+
const roomDir = argv[2] || './room';
|
|
84
|
+
|
|
85
|
+
if (!command) {
|
|
86
|
+
error('No command specified.\n\n' + USAGE);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
switch (command) {
|
|
90
|
+
case 'room': {
|
|
91
|
+
switch (subcommand) {
|
|
92
|
+
case 'list-sections': {
|
|
93
|
+
const result = roomOps.listSections(roomDir);
|
|
94
|
+
output(result, raw, JSON.stringify(result));
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case 'analyze': {
|
|
98
|
+
const result = roomOps.analyzeRoom(roomDir);
|
|
99
|
+
output({ output: result }, raw, result);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'linkify': {
|
|
103
|
+
const orchestrator = path.resolve(__dirname, '..', 'scripts', 'vault-export-orchestrator.cjs');
|
|
104
|
+
// User invocation forms:
|
|
105
|
+
// room linkify -> orchestrator --in-place (resolves active room)
|
|
106
|
+
// room linkify <room> -> orchestrator <room> --in-place
|
|
107
|
+
const extra = argv.slice(2);
|
|
108
|
+
const args = extra.length > 0 ? [...extra, '--in-place'] : ['--in-place'];
|
|
109
|
+
try {
|
|
110
|
+
execFileSync(process.execPath, [orchestrator, ...args], { stdio: 'inherit' });
|
|
111
|
+
} catch (err) {
|
|
112
|
+
error(`room linkify failed: ${err.message}`);
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
default:
|
|
117
|
+
error(`Unknown room subcommand: ${subcommand}\n\n${USAGE}`);
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
case 'state': {
|
|
123
|
+
switch (subcommand) {
|
|
124
|
+
case 'compute': {
|
|
125
|
+
const result = stateOps.computeState(roomDir);
|
|
126
|
+
output({ output: result }, raw, result);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
case 'get': {
|
|
130
|
+
const result = stateOps.getState(roomDir);
|
|
131
|
+
if (result === null) {
|
|
132
|
+
error(`No STATE.md found in ${roomDir}`);
|
|
133
|
+
}
|
|
134
|
+
output({ content: result }, raw, result);
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
default:
|
|
138
|
+
error(`Unknown state subcommand: ${subcommand}\n\n${USAGE}`);
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
case 'meeting': {
|
|
144
|
+
switch (subcommand) {
|
|
145
|
+
case 'compute-intel': {
|
|
146
|
+
const result = meetingOps.computeMeetingsIntel(roomDir);
|
|
147
|
+
output({ output: result }, raw, result);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case 'compute-team': {
|
|
151
|
+
const result = meetingOps.computeTeam(roomDir);
|
|
152
|
+
output({ output: result }, raw, result);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
default:
|
|
156
|
+
error(`Unknown meeting subcommand: ${subcommand}\n\n${USAGE}`);
|
|
157
|
+
}
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
case 'graph': {
|
|
162
|
+
switch (subcommand) {
|
|
163
|
+
case 'build': {
|
|
164
|
+
const outputPath = argv[3]; // optional 4th arg
|
|
165
|
+
const result = graphOps.buildGraph(roomDir, outputPath);
|
|
166
|
+
output(result, raw, JSON.stringify(result));
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case 'index': {
|
|
170
|
+
const filePath = argv[3];
|
|
171
|
+
if (!filePath) error('Usage: graph index <roomDir> <filePath>');
|
|
172
|
+
const result = await graphOps.indexArtifact(roomDir, filePath);
|
|
173
|
+
output(result, raw, JSON.stringify(result));
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case 'rebuild': {
|
|
177
|
+
const result = await graphOps.rebuildGraph(roomDir);
|
|
178
|
+
output(result, raw, JSON.stringify(result));
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
case 'query': {
|
|
182
|
+
const sql = argv[3];
|
|
183
|
+
if (!sql) error('Usage: graph query <roomDir> "<sql>"');
|
|
184
|
+
const result = await graphOps.queryGraph(roomDir, sql);
|
|
185
|
+
output(result, raw, JSON.stringify(result));
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
case 'stats': {
|
|
189
|
+
const result = await graphOps.graphStats(roomDir);
|
|
190
|
+
output(result, raw, JSON.stringify(result));
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case 'build-sqlite':
|
|
194
|
+
case 'build-kuzu': { // backward-compat alias
|
|
195
|
+
const outputPath = argv[3]; // optional 4th arg
|
|
196
|
+
const result = graphOps.buildGraphFromSQLite(roomDir, outputPath);
|
|
197
|
+
output(result, raw, JSON.stringify(result));
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
default:
|
|
201
|
+
error(`Unknown graph subcommand: ${subcommand}\n\n${USAGE}`);
|
|
202
|
+
}
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
case 'opportunity': {
|
|
207
|
+
switch (subcommand) {
|
|
208
|
+
case 'scan': {
|
|
209
|
+
const result = await opportunityOps.scanOpportunities(roomDir);
|
|
210
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case 'list': {
|
|
214
|
+
const result = opportunityOps.listOpportunities(roomDir);
|
|
215
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case 'file': {
|
|
219
|
+
const dataJson = argv[3];
|
|
220
|
+
if (!dataJson) {
|
|
221
|
+
error('opportunity file requires a JSON data argument');
|
|
222
|
+
}
|
|
223
|
+
let data;
|
|
224
|
+
try {
|
|
225
|
+
data = JSON.parse(dataJson);
|
|
226
|
+
} catch (_e) {
|
|
227
|
+
error('Invalid JSON data for opportunity file');
|
|
228
|
+
}
|
|
229
|
+
const result = opportunityOps.fileOpportunity(roomDir, data);
|
|
230
|
+
output(result, raw, JSON.stringify(result));
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
default:
|
|
234
|
+
error(`Unknown opportunity subcommand: ${subcommand}\n\n${USAGE}`);
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
case 'funding': {
|
|
240
|
+
switch (subcommand) {
|
|
241
|
+
case 'list': {
|
|
242
|
+
const result = opportunityOps.listFunding(roomDir);
|
|
243
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case 'create': {
|
|
247
|
+
const slug = argv[3];
|
|
248
|
+
const source = argv[4];
|
|
249
|
+
if (!slug) {
|
|
250
|
+
error('funding create requires a slug argument');
|
|
251
|
+
}
|
|
252
|
+
if (!source) {
|
|
253
|
+
error('funding create requires a source opportunity filename');
|
|
254
|
+
}
|
|
255
|
+
const result = opportunityOps.createFunding(roomDir, slug, source);
|
|
256
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
case 'advance': {
|
|
260
|
+
const slug = argv[3];
|
|
261
|
+
const note = argv[4] || '';
|
|
262
|
+
if (!slug) {
|
|
263
|
+
error('funding advance requires a slug argument');
|
|
264
|
+
}
|
|
265
|
+
// Determine next stage from current entry
|
|
266
|
+
const fundResult = opportunityOps.listFunding(roomDir);
|
|
267
|
+
const entry = fundResult.entries.find(e => e.name === slug);
|
|
268
|
+
if (!entry) {
|
|
269
|
+
error(`Funding entry not found: ${slug}`);
|
|
270
|
+
}
|
|
271
|
+
const stageIdx = opportunityOps.FUNDING_STAGES.indexOf(entry.stage);
|
|
272
|
+
const nextStage = opportunityOps.FUNDING_STAGES[stageIdx + 1];
|
|
273
|
+
if (!nextStage) {
|
|
274
|
+
error(`Entry ${slug} is already at final stage: ${entry.stage}`);
|
|
275
|
+
}
|
|
276
|
+
const result = opportunityOps.updateFundingStage(roomDir, slug, nextStage, note);
|
|
277
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
case 'status': {
|
|
281
|
+
const slug = argv[3];
|
|
282
|
+
if (!slug) {
|
|
283
|
+
error('funding status requires a slug argument');
|
|
284
|
+
}
|
|
285
|
+
const statusPath = require('path').join(require('path').resolve(roomDir), 'funding', slug, 'STATUS.md');
|
|
286
|
+
try {
|
|
287
|
+
const content = require('fs').readFileSync(statusPath, 'utf-8');
|
|
288
|
+
output({ slug, content }, raw, content);
|
|
289
|
+
} catch (_e) {
|
|
290
|
+
error(`Funding entry not found: ${slug}`);
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 'outcome': {
|
|
295
|
+
const slug = argv[3];
|
|
296
|
+
const outcomeVal = argv[4];
|
|
297
|
+
if (!slug || !outcomeVal) {
|
|
298
|
+
error('funding outcome requires slug and outcome arguments');
|
|
299
|
+
}
|
|
300
|
+
const result = opportunityOps.setFundingOutcome(roomDir, slug, outcomeVal);
|
|
301
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
case 'compute-state': {
|
|
305
|
+
const fundState = opportunityOps.computeFundingState(roomDir);
|
|
306
|
+
const oppState = opportunityOps.computeOpportunityBankState(roomDir);
|
|
307
|
+
const result = { funding: fundState, opportunity_bank: oppState };
|
|
308
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
default:
|
|
312
|
+
error(`Unknown funding subcommand: ${subcommand}\n\n${USAGE}`);
|
|
313
|
+
}
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
case 'persona': {
|
|
318
|
+
switch (subcommand) {
|
|
319
|
+
case 'generate': {
|
|
320
|
+
const result = personaOps.generatePersonas(roomDir);
|
|
321
|
+
output(result, raw, JSON.stringify(result));
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case 'list': {
|
|
325
|
+
const result = personaOps.listPersonas(roomDir);
|
|
326
|
+
output(result, raw, JSON.stringify(result));
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
case 'invoke': {
|
|
330
|
+
const hatColor = argv[3];
|
|
331
|
+
const artifactPath = argv[4] || null;
|
|
332
|
+
if (!hatColor) {
|
|
333
|
+
error('persona invoke requires a hat color argument (white|red|black|yellow|green|blue)');
|
|
334
|
+
}
|
|
335
|
+
const result = personaOps.invokePersona(roomDir, hatColor, artifactPath);
|
|
336
|
+
output(result, raw, JSON.stringify(result));
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
case 'analyze': {
|
|
340
|
+
const artifactPath = argv[3] || null;
|
|
341
|
+
const result = personaOps.analyzeAllPerspectives(roomDir, artifactPath);
|
|
342
|
+
output(result, raw, JSON.stringify(result));
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
default:
|
|
346
|
+
error(`Unknown persona subcommand: ${subcommand}\n\n${USAGE}`);
|
|
347
|
+
}
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
case 'reasoning': {
|
|
352
|
+
switch (subcommand) {
|
|
353
|
+
case 'get': {
|
|
354
|
+
const section = argv[3];
|
|
355
|
+
if (!section) error('reasoning get requires a section name');
|
|
356
|
+
const result = reasoningOps.getReasoning(roomDir, section);
|
|
357
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
case 'generate': {
|
|
361
|
+
const section = argv[3] || null;
|
|
362
|
+
const result = reasoningOps.generateReasoning(roomDir, section);
|
|
363
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
case 'verify': {
|
|
367
|
+
const section = argv[3];
|
|
368
|
+
if (!section) error('reasoning verify requires a section name');
|
|
369
|
+
const result = reasoningOps.verifyReasoning(roomDir, section);
|
|
370
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
case 'run': {
|
|
374
|
+
const section = argv[3];
|
|
375
|
+
if (!section) error('reasoning run requires a section name');
|
|
376
|
+
const result = reasoningOps.createRun(roomDir, section);
|
|
377
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
case 'list': {
|
|
381
|
+
const result = reasoningOps.listReasoning(roomDir);
|
|
382
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
383
|
+
break;
|
|
384
|
+
}
|
|
385
|
+
case 'frontmatter': {
|
|
386
|
+
const fmArg = argv[3];
|
|
387
|
+
if (!fmArg) error('reasoning frontmatter requires a section name or JSON argument');
|
|
388
|
+
// Try parsing as JSON first (for set/merge operations)
|
|
389
|
+
let parsed;
|
|
390
|
+
try {
|
|
391
|
+
parsed = JSON.parse(fmArg);
|
|
392
|
+
} catch (_e) {
|
|
393
|
+
// Not JSON — treat as section name, optional field in argv[4]
|
|
394
|
+
const result = reasoningOps.getReasoningFrontmatter(roomDir, fmArg, argv[4] || null);
|
|
395
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
// JSON parsed — route by action
|
|
399
|
+
const { action, section, field, value } = parsed;
|
|
400
|
+
let result;
|
|
401
|
+
switch (action) {
|
|
402
|
+
case 'set':
|
|
403
|
+
result = reasoningOps.setReasoningFrontmatter(roomDir, section, field, value);
|
|
404
|
+
break;
|
|
405
|
+
case 'merge':
|
|
406
|
+
result = reasoningOps.mergeReasoningFrontmatter(roomDir, section, parsed);
|
|
407
|
+
break;
|
|
408
|
+
case 'get':
|
|
409
|
+
default:
|
|
410
|
+
result = reasoningOps.getReasoningFrontmatter(roomDir, section, field || null);
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
default:
|
|
417
|
+
error(`Unknown reasoning subcommand: ${subcommand}\n\n${USAGE}`);
|
|
418
|
+
}
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
case 'visualize': {
|
|
423
|
+
const vizType = subcommand || 'room';
|
|
424
|
+
const fs = require('fs');
|
|
425
|
+
const path = require('path');
|
|
426
|
+
|
|
427
|
+
// Helper: collect section data from room
|
|
428
|
+
function collectSections() {
|
|
429
|
+
try {
|
|
430
|
+
const sectionData = roomOps.listSections(roomDir);
|
|
431
|
+
let stage = 'discovery';
|
|
432
|
+
try {
|
|
433
|
+
const stateContent = stateOps.getState(roomDir);
|
|
434
|
+
if (stateContent) {
|
|
435
|
+
const stageMatch = stateContent.match(/venture_stage:\s*(.+)/);
|
|
436
|
+
if (stageMatch) stage = stageMatch[1].trim();
|
|
437
|
+
}
|
|
438
|
+
} catch (_e) {}
|
|
439
|
+
if (sectionData && sectionData.sections) {
|
|
440
|
+
return sectionData.sections.map(s => ({
|
|
441
|
+
name: s.name || s,
|
|
442
|
+
entryCount: s.entryCount || s.entries || 0,
|
|
443
|
+
stage: stage,
|
|
444
|
+
edges: s.edges || []
|
|
445
|
+
}));
|
|
446
|
+
}
|
|
447
|
+
} catch (_e) {}
|
|
448
|
+
return [{ name: 'No room data', entryCount: 0, stage: 'discovery', edges: [] }];
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
switch (vizType) {
|
|
452
|
+
case 'room': {
|
|
453
|
+
const sections = collectSections();
|
|
454
|
+
const mermaid = visualOps.generateMermaidRoom(sections);
|
|
455
|
+
const block = visualOps.generateMermaidBlock(mermaid);
|
|
456
|
+
output({ mermaid, block }, raw, block);
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
case 'graph': {
|
|
460
|
+
let nodes = [];
|
|
461
|
+
let edges = [];
|
|
462
|
+
try {
|
|
463
|
+
const stats = await graphOps.graphStats(roomDir);
|
|
464
|
+
if (stats && stats.nodes) {
|
|
465
|
+
nodes = stats.nodes;
|
|
466
|
+
edges = stats.edges || [];
|
|
467
|
+
}
|
|
468
|
+
} catch (_e) {}
|
|
469
|
+
if (nodes.length === 0) {
|
|
470
|
+
nodes = [{ id: 'empty', type: 'Section', label: 'No graph data' }];
|
|
471
|
+
}
|
|
472
|
+
const mermaid = visualOps.generateMermaidGraph(nodes, edges);
|
|
473
|
+
const block = visualOps.generateMermaidBlock(mermaid);
|
|
474
|
+
output({ mermaid, block }, raw, block);
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
case 'chain': {
|
|
478
|
+
let steps = [];
|
|
479
|
+
try {
|
|
480
|
+
const reasonDir = path.join(path.resolve(roomDir), '.reasoning');
|
|
481
|
+
if (fs.existsSync(reasonDir)) {
|
|
482
|
+
const runs = fs.readdirSync(reasonDir)
|
|
483
|
+
.filter(f => f.endsWith('.md'))
|
|
484
|
+
.sort()
|
|
485
|
+
.reverse();
|
|
486
|
+
if (runs.length > 0) {
|
|
487
|
+
const content = fs.readFileSync(path.join(reasonDir, runs[0]), 'utf-8');
|
|
488
|
+
const stepMatches = content.match(/##\s+Step\s+\d+[^#]*/g) || [];
|
|
489
|
+
steps = stepMatches.map((blk, i) => {
|
|
490
|
+
const nameMatch = blk.match(/##\s+Step\s+\d+:\s*(.+)/);
|
|
491
|
+
const fwMatch = blk.match(/framework:\s*(.+)/i);
|
|
492
|
+
const statusMatch = blk.match(/status:\s*(.+)/i);
|
|
493
|
+
return {
|
|
494
|
+
name: nameMatch ? nameMatch[1].trim() : `Step ${i + 1}`,
|
|
495
|
+
framework: fwMatch ? fwMatch[1].trim() : '',
|
|
496
|
+
status: statusMatch ? statusMatch[1].trim() : 'pending'
|
|
497
|
+
};
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
} catch (_e) {}
|
|
502
|
+
if (steps.length === 0) {
|
|
503
|
+
steps = [
|
|
504
|
+
{ name: 'Diagnose', framework: 'diagnose', status: 'pending' },
|
|
505
|
+
{ name: 'Framework', framework: '', status: 'pending' },
|
|
506
|
+
{ name: 'Apply', framework: '', status: 'pending' },
|
|
507
|
+
{ name: 'File', framework: '', status: 'pending' },
|
|
508
|
+
{ name: 'Cross-ref', framework: '', status: 'pending' },
|
|
509
|
+
{ name: 'Graph Update', framework: '', status: 'pending' }
|
|
510
|
+
];
|
|
511
|
+
}
|
|
512
|
+
const mermaid = visualOps.generateMermaidChain(steps);
|
|
513
|
+
const block = visualOps.generateMermaidBlock(mermaid);
|
|
514
|
+
output({ mermaid, block }, raw, block);
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
case 'mermaid': {
|
|
518
|
+
// Raw Mermaid output — type from argv[3]
|
|
519
|
+
const mermaidType = argv[3] || 'room';
|
|
520
|
+
let mermaid;
|
|
521
|
+
if (mermaidType === 'graph') {
|
|
522
|
+
let nodes = [];
|
|
523
|
+
let edges = [];
|
|
524
|
+
try {
|
|
525
|
+
const stats = await graphOps.graphStats(roomDir);
|
|
526
|
+
if (stats && stats.nodes) { nodes = stats.nodes; edges = stats.edges || []; }
|
|
527
|
+
} catch (_e) {}
|
|
528
|
+
if (nodes.length === 0) nodes = [{ id: 'empty', type: 'Section', label: 'No graph data' }];
|
|
529
|
+
mermaid = visualOps.generateMermaidGraph(nodes, edges);
|
|
530
|
+
} else if (mermaidType === 'chain') {
|
|
531
|
+
mermaid = visualOps.generateMermaidChain([
|
|
532
|
+
{ name: 'Diagnose', framework: 'diagnose', status: 'pending' },
|
|
533
|
+
{ name: 'Framework', framework: '', status: 'pending' },
|
|
534
|
+
{ name: 'Apply', framework: '', status: 'pending' },
|
|
535
|
+
{ name: 'File', framework: '', status: 'pending' },
|
|
536
|
+
{ name: 'Cross-ref', framework: '', status: 'pending' },
|
|
537
|
+
{ name: 'Graph Update', framework: '', status: 'pending' }
|
|
538
|
+
]);
|
|
539
|
+
} else {
|
|
540
|
+
const sections = collectSections();
|
|
541
|
+
mermaid = visualOps.generateMermaidRoom(sections);
|
|
542
|
+
}
|
|
543
|
+
output({ mermaid }, raw, mermaid);
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
default:
|
|
547
|
+
error(`Unknown visualize subcommand: ${vizType}\n\nValid: room, graph, chain, mermaid`);
|
|
548
|
+
}
|
|
549
|
+
break;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
case 'cascade': {
|
|
553
|
+
const cascadeRoomDir = argv[1] || './room';
|
|
554
|
+
const cascadeFilePath = argv[2] || null;
|
|
555
|
+
const cascade = require('../lib/core/intelligence-cascade.cjs');
|
|
556
|
+
const cascadeResult = await cascade.runCascade(cascadeRoomDir, {
|
|
557
|
+
trigger: 'cli-hook',
|
|
558
|
+
filePath: cascadeFilePath
|
|
559
|
+
});
|
|
560
|
+
if (raw) {
|
|
561
|
+
process.stdout.write(JSON.stringify(cascadeResult));
|
|
562
|
+
} else {
|
|
563
|
+
process.stdout.write(JSON.stringify(cascadeResult, null, 2));
|
|
564
|
+
}
|
|
565
|
+
process.exit(0);
|
|
566
|
+
break;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
case 'record-decision': {
|
|
570
|
+
// Parse named flags from argv
|
|
571
|
+
const rdFlags = {};
|
|
572
|
+
for (let i = 1; i < argv.length; i++) {
|
|
573
|
+
if (argv[i].startsWith('--') && i + 1 < argv.length) {
|
|
574
|
+
rdFlags[argv[i].slice(2)] = argv[++i];
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
const rdRoom = rdFlags['room'];
|
|
578
|
+
const rdKey = rdFlags['key'];
|
|
579
|
+
const rdDecision = rdFlags['decision'];
|
|
580
|
+
const rdReason = rdFlags['reason'] || '';
|
|
581
|
+
const rdSourceArtifact = rdFlags['source-artifact'];
|
|
582
|
+
const rdTargetArtifact = rdFlags['target-artifact'];
|
|
583
|
+
|
|
584
|
+
// Validate required args
|
|
585
|
+
if (!rdRoom || !rdKey || !rdDecision) {
|
|
586
|
+
process.stderr.write('Usage: mindrian-tools.cjs record-decision --room DIR --key KEY --decision approve|reject|defer [--reason "..."] [--source-artifact ID] [--target-artifact ID]\n');
|
|
587
|
+
process.exit(1);
|
|
588
|
+
}
|
|
589
|
+
if (!['approve', 'reject', 'defer'].includes(rdDecision)) {
|
|
590
|
+
process.stderr.write('Error: --decision must be one of: approve, reject, defer\n');
|
|
591
|
+
process.exit(1);
|
|
592
|
+
}
|
|
593
|
+
if (rdDecision === 'reject' && !rdReason) {
|
|
594
|
+
process.stderr.write('Error: --reason is required when decision is reject\n');
|
|
595
|
+
process.exit(1);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Record decision in .proactive-intelligence.json
|
|
599
|
+
const proactiveIntel = require('../lib/core/proactive-intelligence.cjs');
|
|
600
|
+
const rdResult = proactiveIntel.recordDecision(rdRoom, rdKey, rdDecision, rdReason);
|
|
601
|
+
|
|
602
|
+
// Optionally persist graph edge (best-effort, Tier 0: works without graph)
|
|
603
|
+
let graphEdge = false;
|
|
604
|
+
if (rdSourceArtifact && rdTargetArtifact) {
|
|
605
|
+
const fs = require('fs');
|
|
606
|
+
const graphDb = require('path').join(require('path').resolve(rdRoom), '.mindrian', 'room.db');
|
|
607
|
+
if (fs.existsSync(graphDb)) {
|
|
608
|
+
try {
|
|
609
|
+
await graphOps.persistDecisionEdge(
|
|
610
|
+
rdRoom,
|
|
611
|
+
rdSourceArtifact,
|
|
612
|
+
rdTargetArtifact,
|
|
613
|
+
rdResult.edgeType,
|
|
614
|
+
{ reason: rdReason, timestamp: new Date().toISOString() }
|
|
615
|
+
);
|
|
616
|
+
graphEdge = true;
|
|
617
|
+
} catch (_e) {
|
|
618
|
+
// Graph edge creation is best-effort
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// --- Phase 88 dual-write to decision_log (additive; primary write already completed) ---
|
|
624
|
+
//
|
|
625
|
+
// Primary writer above (proactive-intelligence.cjs + optional graph edge) is
|
|
626
|
+
// authoritative and byte-frozen. This block is a tertiary convenience write that
|
|
627
|
+
// lands the decision in the owning section's Feynman-MINTO decision_log for
|
|
628
|
+
// session-start TRIPLE_CONTEXT injection (88-07). Section is derived from
|
|
629
|
+
// --source-artifact; without a derivable section, dual-write is a documented
|
|
630
|
+
// skip (NOT a failure: no error log entry). Any failure of the dual-write is
|
|
631
|
+
// logged to .mindrian/decision-dual-write-errors.jsonl and then swallowed;
|
|
632
|
+
// CLI exit 0 is preserved because primary write already succeeded.
|
|
633
|
+
try {
|
|
634
|
+
const path = require('path');
|
|
635
|
+
const fs = require('fs');
|
|
636
|
+
let derivedSection = null;
|
|
637
|
+
if (rdSourceArtifact) {
|
|
638
|
+
const roomAbs = path.resolve(rdRoom);
|
|
639
|
+
const absArt = path.isAbsolute(rdSourceArtifact)
|
|
640
|
+
? rdSourceArtifact
|
|
641
|
+
: path.join(roomAbs, rdSourceArtifact);
|
|
642
|
+
const rel = path.relative(roomAbs, absArt);
|
|
643
|
+
if (!rel.startsWith('..') && !path.isAbsolute(rel)) {
|
|
644
|
+
const firstSeg = rel.split(path.sep)[0];
|
|
645
|
+
if (firstSeg && firstSeg !== '.' && !firstSeg.startsWith('.')) {
|
|
646
|
+
derivedSection = firstSeg;
|
|
647
|
+
}
|
|
648
|
+
} else {
|
|
649
|
+
process.stderr.write(
|
|
650
|
+
'record-decision: --source-artifact outside --room; dual-write skipped\n'
|
|
651
|
+
);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (derivedSection) {
|
|
655
|
+
const { recordDecision: persistDecision } = require('../lib/core/decision-capture.cjs');
|
|
656
|
+
const decision = {
|
|
657
|
+
session_id: process.env.CLAUDE_SESSION_ID || 'sess-' + Date.now(),
|
|
658
|
+
timestamp: new Date().toISOString(),
|
|
659
|
+
action: rdKey,
|
|
660
|
+
user_response: rdDecision,
|
|
661
|
+
reason: rdReason || '(no reason)',
|
|
662
|
+
};
|
|
663
|
+
const dualResult = persistDecision(rdRoom, derivedSection, decision);
|
|
664
|
+
if (!dualResult || dualResult.success === false) {
|
|
665
|
+
const errPath = path.join(
|
|
666
|
+
path.resolve(rdRoom),
|
|
667
|
+
'.mindrian',
|
|
668
|
+
'decision-dual-write-errors.jsonl'
|
|
669
|
+
);
|
|
670
|
+
try {
|
|
671
|
+
fs.mkdirSync(path.dirname(errPath), { recursive: true });
|
|
672
|
+
fs.appendFileSync(
|
|
673
|
+
errPath,
|
|
674
|
+
JSON.stringify({
|
|
675
|
+
timestamp: new Date().toISOString(),
|
|
676
|
+
reason: 'decision_log_failed',
|
|
677
|
+
decision,
|
|
678
|
+
violations: (dualResult && dualResult.violations) || [],
|
|
679
|
+
}) + '\n'
|
|
680
|
+
);
|
|
681
|
+
} catch (logErr) {
|
|
682
|
+
process.stderr.write(
|
|
683
|
+
'dual-write error logging failed: ' + logErr.message + '\n'
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
} catch (e) {
|
|
689
|
+
process.stderr.write(
|
|
690
|
+
'decision-capture dual-write error: ' + (e && e.message ? e.message : e) + '\n'
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
// --- end Phase 88 ---
|
|
694
|
+
|
|
695
|
+
const rdOutput = {
|
|
696
|
+
recorded: true,
|
|
697
|
+
decision: rdDecision,
|
|
698
|
+
edgeType: rdResult.edgeType,
|
|
699
|
+
graphEdge
|
|
700
|
+
};
|
|
701
|
+
|
|
702
|
+
if (raw) {
|
|
703
|
+
process.stdout.write(JSON.stringify(rdOutput));
|
|
704
|
+
} else {
|
|
705
|
+
process.stdout.write(JSON.stringify(rdOutput, null, 2));
|
|
706
|
+
}
|
|
707
|
+
process.exit(0);
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
case 'bank-opportunity': {
|
|
712
|
+
// argv[1] could be roomDir or JSON. If it parses as JSON, no roomDir given.
|
|
713
|
+
let bkRoom = null;
|
|
714
|
+
let bkJson = argv[1];
|
|
715
|
+
if (argv[2]) {
|
|
716
|
+
// Two args: roomDir + JSON
|
|
717
|
+
bkRoom = argv[1];
|
|
718
|
+
bkJson = argv[2];
|
|
719
|
+
}
|
|
720
|
+
if (!bkJson) error('bank-opportunity requires a JSON argument');
|
|
721
|
+
let bkData;
|
|
722
|
+
try { bkData = JSON.parse(bkJson); } catch (_e) { error('Invalid JSON for bank-opportunity'); }
|
|
723
|
+
|
|
724
|
+
// If room exists, bank directly to room
|
|
725
|
+
if (bkRoom) {
|
|
726
|
+
const fs = require('fs');
|
|
727
|
+
if (fs.existsSync(require('path').resolve(bkRoom))) {
|
|
728
|
+
const result = opportunityOps.bankOpportunity(bkRoom, bkData);
|
|
729
|
+
output(result, raw, JSON.stringify(result));
|
|
730
|
+
break;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
// No room or room not found -- bank to scratchpad
|
|
735
|
+
const spResult = scratchpadOps.writeScratchpadEntry('opportunity', bkData);
|
|
736
|
+
output(spResult, raw, JSON.stringify(spResult));
|
|
737
|
+
break;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
case 'vault': {
|
|
741
|
+
const orchestrator = path.resolve(__dirname, '..', 'scripts', 'vault-export-orchestrator.cjs');
|
|
742
|
+
const forwarded = argv.slice(1);
|
|
743
|
+
try {
|
|
744
|
+
execFileSync(process.execPath, [orchestrator, ...forwarded], { stdio: 'inherit' });
|
|
745
|
+
} catch (err) {
|
|
746
|
+
error(`vault export failed: ${err.message}`);
|
|
747
|
+
}
|
|
748
|
+
break;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
case 'detect-integrations': {
|
|
752
|
+
const integrationRegistry = require('../lib/core/integration-registry.cjs');
|
|
753
|
+
const result = integrationRegistry.detectIntegrations();
|
|
754
|
+
output(result, raw, JSON.stringify(result, null, 2));
|
|
755
|
+
break;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
default:
|
|
759
|
+
error(`Unknown command: ${command}\n\n${USAGE}`);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
main().catch(e => {
|
|
764
|
+
error(e.message);
|
|
765
|
+
});
|