@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,338 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
3
|
+
*
|
|
4
|
+
* Phase 88-01 -- folder-memory ASYNC entry point
|
|
5
|
+
* ===============================================
|
|
6
|
+
* Promise-returning twin of lib/core/folder-memory.cjs. Import this from
|
|
7
|
+
* MCP tool handlers and any caller that returns a Promise to the MCP
|
|
8
|
+
* runtime. NEVER import from CLI hook scripts that expect synchronous
|
|
9
|
+
* semantics -- use the sync entry point.
|
|
10
|
+
*
|
|
11
|
+
* Key-set parity with the sync entry point is enforced programmatically
|
|
12
|
+
* by lib/memory/folder-memory.test.cjs (mirrors the Phase 87-04
|
|
13
|
+
* sync-async-entry-points.test.cjs pattern). Future maintainers cannot
|
|
14
|
+
* drift signatures without breaking the test.
|
|
15
|
+
*
|
|
16
|
+
* All reads go through fs.promises so the MCP handler loop stays
|
|
17
|
+
* non-blocking. Invariant validation falls back to the sync validator
|
|
18
|
+
* (feynman-minto-invariants.cjs validate() is pure-CPU; the MCP loop
|
|
19
|
+
* does not see disk blocking because the file content is already
|
|
20
|
+
* loaded into memory at that point).
|
|
21
|
+
*
|
|
22
|
+
* License: BSL 1.1.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
'use strict';
|
|
26
|
+
|
|
27
|
+
const fs = require('node:fs');
|
|
28
|
+
const fsp = fs.promises;
|
|
29
|
+
const path = require('node:path');
|
|
30
|
+
const shared = require('./folder-memory-shared.cjs');
|
|
31
|
+
const invariants = require('./feynman-minto-invariants.cjs');
|
|
32
|
+
|
|
33
|
+
const RESERVED = new Set(['ROOM.md', 'STATE.md', 'MINTO.md', 'TEAM-STATE.md']);
|
|
34
|
+
|
|
35
|
+
async function safeStatAsync(p) {
|
|
36
|
+
try {
|
|
37
|
+
return await fsp.stat(p);
|
|
38
|
+
} catch (_e) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function safeReadAsync(p) {
|
|
44
|
+
try {
|
|
45
|
+
return await fsp.readFile(p, 'utf8');
|
|
46
|
+
} catch (_e) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function collectArtifactMtimesAsync(sectionPath) {
|
|
52
|
+
const mtimes = [];
|
|
53
|
+
let entries = [];
|
|
54
|
+
try {
|
|
55
|
+
entries = await fsp.readdir(sectionPath);
|
|
56
|
+
} catch (_e) {
|
|
57
|
+
return mtimes;
|
|
58
|
+
}
|
|
59
|
+
for (const name of entries) {
|
|
60
|
+
if (name[0] === '.') continue;
|
|
61
|
+
if (RESERVED.has(name)) continue;
|
|
62
|
+
const abs = path.join(sectionPath, name);
|
|
63
|
+
const st = await safeStatAsync(abs);
|
|
64
|
+
if (!st) continue;
|
|
65
|
+
if (st.isFile() && name.endsWith('.md')) {
|
|
66
|
+
mtimes.push(st.mtimeMs);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return mtimes;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Async readTriple. Promise resolves to the same shape as the sync
|
|
74
|
+
* entry point's return value. Never rejects for missing files; only
|
|
75
|
+
* rejects on truly unexpected errors (e.g. out-of-memory while reading
|
|
76
|
+
* a huge file) -- at which point the caller should fall back to the
|
|
77
|
+
* sync path or log and degrade.
|
|
78
|
+
*/
|
|
79
|
+
async function readTriple(sectionPath) {
|
|
80
|
+
const room = { ...shared.emptyRoom() };
|
|
81
|
+
const state = { ...shared.emptyState() };
|
|
82
|
+
const reasoning = { ...shared.emptyReasoning() };
|
|
83
|
+
|
|
84
|
+
const sectionStat = await safeStatAsync(sectionPath);
|
|
85
|
+
if (!sectionStat || !sectionStat.isDirectory()) {
|
|
86
|
+
reasoning.reasoning_health_score = shared.computeHealthScore(reasoning);
|
|
87
|
+
return { room: room, state: state, reasoning: reasoning };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const roomPath = path.join(sectionPath, 'ROOM.md');
|
|
91
|
+
const [roomStat, roomBuf] = await Promise.all([
|
|
92
|
+
safeStatAsync(roomPath),
|
|
93
|
+
safeReadAsync(roomPath),
|
|
94
|
+
]);
|
|
95
|
+
if (roomStat && roomStat.isFile() && roomBuf !== null) {
|
|
96
|
+
Object.assign(room, shared.parseRoomMd(roomBuf, roomStat.mtimeMs));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const statePath = path.join(sectionPath, 'STATE.md');
|
|
100
|
+
const [stateStat, stateBuf] = await Promise.all([
|
|
101
|
+
safeStatAsync(statePath),
|
|
102
|
+
safeReadAsync(statePath),
|
|
103
|
+
]);
|
|
104
|
+
if (stateStat && stateStat.isFile() && stateBuf !== null) {
|
|
105
|
+
Object.assign(state, shared.parseStateMd(stateBuf));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const mintoPath = path.join(sectionPath, 'MINTO.md');
|
|
109
|
+
const [mintoStat, mintoBuf] = await Promise.all([
|
|
110
|
+
safeStatAsync(mintoPath),
|
|
111
|
+
safeReadAsync(mintoPath),
|
|
112
|
+
]);
|
|
113
|
+
if (mintoStat && mintoStat.isFile() && mintoBuf !== null) {
|
|
114
|
+
const parsed = shared.parseMintoMd(mintoBuf);
|
|
115
|
+
Object.assign(reasoning, parsed);
|
|
116
|
+
reasoning.exists = true;
|
|
117
|
+
|
|
118
|
+
let invariantSeverity = null;
|
|
119
|
+
try {
|
|
120
|
+
const v = invariants.validate(mintoPath);
|
|
121
|
+
invariantSeverity = v.severity;
|
|
122
|
+
} catch (_e) {
|
|
123
|
+
invariantSeverity = null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const artifactMtimes = await collectArtifactMtimesAsync(sectionPath);
|
|
127
|
+
const stale = shared.computeStale(
|
|
128
|
+
reasoning,
|
|
129
|
+
artifactMtimes,
|
|
130
|
+
mintoStat.mtimeMs,
|
|
131
|
+
invariantSeverity
|
|
132
|
+
);
|
|
133
|
+
reasoning.is_stale = stale.is_stale;
|
|
134
|
+
reasoning.stale_reason = stale.stale_reason;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
reasoning.reasoning_health_score = shared.computeHealthScore(reasoning);
|
|
138
|
+
|
|
139
|
+
return { room: room, state: state, reasoning: reasoning };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Async readDecisionLog. Promise resolves to the decision_log array
|
|
144
|
+
* (same permissive shape as the sync twin).
|
|
145
|
+
*/
|
|
146
|
+
async function readDecisionLog(sectionPath) {
|
|
147
|
+
const mintoPath = path.join(sectionPath, 'MINTO.md');
|
|
148
|
+
const buf = await safeReadAsync(mintoPath);
|
|
149
|
+
if (buf === null) return [];
|
|
150
|
+
const parsed = shared.parseMintoMd(buf);
|
|
151
|
+
return Array.isArray(parsed.decision_log) ? parsed.decision_log : [];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* computeHealthScore is pure-CPU (no I/O). Wrapped in an async function
|
|
156
|
+
* so every exported name is an AsyncFunction, matching the Phase 87-04
|
|
157
|
+
* enforcement pattern: the parity test asserts every async export is
|
|
158
|
+
* constructor.name === 'AsyncFunction'. Wrapping eliminates the
|
|
159
|
+
* footgun where a future maintainer could accidentally expose a
|
|
160
|
+
* synchronous helper on the async surface.
|
|
161
|
+
*/
|
|
162
|
+
async function computeHealthScore(reasoning) {
|
|
163
|
+
return shared.computeHealthScore(reasoning);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ---------- Phase 90-04 readQuadruple async twin (additive) ----------
|
|
167
|
+
//
|
|
168
|
+
// Async pair of the sync readQuadruple. Same shape, same semantics.
|
|
169
|
+
// Key-set parity with the sync entry point is asserted by
|
|
170
|
+
// lib/memory/folder-memory-quadruple.test.cjs (the same mechanism used
|
|
171
|
+
// by the Phase 88-01 sync/async parity test).
|
|
172
|
+
//
|
|
173
|
+
// parseBrainMd in shared.cjs is a synchronous fs.readFileSync call.
|
|
174
|
+
// Wrapping the call inside an async function keeps the async surface
|
|
175
|
+
// consistent -- every exported name is an AsyncFunction, matching the
|
|
176
|
+
// Phase 87-04 enforcement pattern. The cost is one synchronous file
|
|
177
|
+
// read inside an async function; BRAIN.md is small (< 10KB in practice)
|
|
178
|
+
// and this call happens once per section per session-start, so the
|
|
179
|
+
// blocking cost is negligible compared to a dedicated promise-returning
|
|
180
|
+
// parse variant.
|
|
181
|
+
|
|
182
|
+
async function readQuadruple(sectionPath) {
|
|
183
|
+
const triple = await readTriple(sectionPath);
|
|
184
|
+
const brainPath = path.join(sectionPath, 'BRAIN.md');
|
|
185
|
+
const brain = shared.parseBrainMd(brainPath);
|
|
186
|
+
return shared.attachBrainToTriple(triple, brain);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Async isQuadrupleFresh. Pure function wrapped in async to keep
|
|
191
|
+
* key-set parity with the sync entry point. Same predicate semantics
|
|
192
|
+
* as the sync version: reasoning.is_stale:false AND
|
|
193
|
+
* (brain:null OR brain.staleness:'fresh' OR stale_reason:'brain_offline').
|
|
194
|
+
*/
|
|
195
|
+
async function isQuadrupleFresh(quadruple) {
|
|
196
|
+
if (!quadruple || typeof quadruple !== 'object') return false;
|
|
197
|
+
const reasoning = quadruple.reasoning;
|
|
198
|
+
if (!reasoning || reasoning.is_stale !== false) return false;
|
|
199
|
+
const brain = quadruple.brain;
|
|
200
|
+
if (brain === null || brain === undefined) return true;
|
|
201
|
+
if (brain.staleness === 'fresh') return true;
|
|
202
|
+
if (brain.stale_reason === 'brain_offline') return true;
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ---------- Phase 94-01 getCurrentRoom async twin ----------
|
|
207
|
+
//
|
|
208
|
+
// Async pair of the sync getCurrentRoom. Same shape, same fallback
|
|
209
|
+
// chain, same Tier 0 graceful null. Key-set parity required by the
|
|
210
|
+
// Phase 88-01 sync/async parity test in lib/memory/folder-memory.test.cjs.
|
|
211
|
+
//
|
|
212
|
+
// MCP / Desktop / Cowork callers consume this when the handler loop is
|
|
213
|
+
// async; CLI hook scripts (statusline, session-start, on-stop) consume
|
|
214
|
+
// the sync entry point. Both return identical {slug, path, source} | null
|
|
215
|
+
// shape so the canonical contract is surface-uniform.
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Resolve canonical STATE.md path async. Mirror of the sync helper.
|
|
219
|
+
* @param {string} workDir
|
|
220
|
+
* @returns {Promise<string|null>}
|
|
221
|
+
*/
|
|
222
|
+
async function resolveCanonicalStateMdAsync(workDir) {
|
|
223
|
+
let resolved;
|
|
224
|
+
try {
|
|
225
|
+
resolved = path.resolve(workDir);
|
|
226
|
+
} catch (_e) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const registryPath = path.join(resolved, '.rooms', 'registry.json');
|
|
231
|
+
const regStat = await safeStatAsync(registryPath);
|
|
232
|
+
if (regStat && regStat.isFile()) {
|
|
233
|
+
const regBuf = await safeReadAsync(registryPath);
|
|
234
|
+
if (regBuf !== null) {
|
|
235
|
+
try {
|
|
236
|
+
const reg = JSON.parse(regBuf);
|
|
237
|
+
if (reg && reg.active && reg.rooms && reg.rooms[reg.active]) {
|
|
238
|
+
const roomDir = path.resolve(resolved, reg.rooms[reg.active].path);
|
|
239
|
+
const candidate = path.join(roomDir, 'STATE.md');
|
|
240
|
+
const st = await safeStatAsync(candidate);
|
|
241
|
+
if (st && st.isFile()) return candidate;
|
|
242
|
+
}
|
|
243
|
+
} catch (_e) { /* fall through */ }
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const legacy = path.join(resolved, 'room', 'STATE.md');
|
|
248
|
+
const legacyStat = await safeStatAsync(legacy);
|
|
249
|
+
if (legacyStat && legacyStat.isFile()) return legacy;
|
|
250
|
+
|
|
251
|
+
const direct = path.join(resolved, 'STATE.md');
|
|
252
|
+
const directStat = await safeStatAsync(direct);
|
|
253
|
+
if (directStat && directStat.isFile()) return direct;
|
|
254
|
+
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Pure-CPU frontmatter sniff. Lifted byte-identical from the sync twin.
|
|
260
|
+
* @param {string} buf
|
|
261
|
+
* @returns {string|null}
|
|
262
|
+
*/
|
|
263
|
+
function parseCurrentRoomFieldAsync(buf) {
|
|
264
|
+
if (typeof buf !== 'string' || buf.length === 0) return null;
|
|
265
|
+
|
|
266
|
+
if (buf.indexOf('---') !== 0) return null;
|
|
267
|
+
if (buf.length < 4) return null;
|
|
268
|
+
if (buf[3] !== '\n' && buf[3] !== '\r') return null;
|
|
269
|
+
|
|
270
|
+
const rest = buf.slice(buf.indexOf('\n') + 1);
|
|
271
|
+
const closeMatch = rest.match(/^---\s*$/m);
|
|
272
|
+
if (!closeMatch) return null;
|
|
273
|
+
const fmText = rest.slice(0, closeMatch.index);
|
|
274
|
+
|
|
275
|
+
const lines = fmText.split(/\r?\n/);
|
|
276
|
+
for (const raw of lines) {
|
|
277
|
+
if (raw.length === 0) continue;
|
|
278
|
+
if (/^\s*#/.test(raw)) continue;
|
|
279
|
+
const m = raw.match(/^current_room\s*:\s*(.+?)\s*$/);
|
|
280
|
+
if (!m) continue;
|
|
281
|
+
let value = m[1].trim();
|
|
282
|
+
if (value.length === 0) return null;
|
|
283
|
+
if (value === 'null' || value === '~') return null;
|
|
284
|
+
|
|
285
|
+
if (
|
|
286
|
+
(value[0] === '"' && value[value.length - 1] === '"') ||
|
|
287
|
+
(value[0] === "'" && value[value.length - 1] === "'")
|
|
288
|
+
) {
|
|
289
|
+
if (value.length >= 2) value = value.slice(1, -1).trim();
|
|
290
|
+
}
|
|
291
|
+
if (value.length === 0) return null;
|
|
292
|
+
if (value.indexOf(':') !== -1) return null;
|
|
293
|
+
|
|
294
|
+
return value;
|
|
295
|
+
}
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Async getCurrentRoom. Mirror of sync twin. Returns Promise resolving
|
|
301
|
+
* to {slug, path, source: 'state_md'} | null. Never rejects on missing
|
|
302
|
+
* files or malformed YAML; the resolution chain plus null on every
|
|
303
|
+
* failure mode matches sync semantics byte for byte.
|
|
304
|
+
*
|
|
305
|
+
* @param {string} [workDir]
|
|
306
|
+
* @returns {Promise<{slug:string,path:string,source:'state_md'}|null>}
|
|
307
|
+
*/
|
|
308
|
+
async function getCurrentRoom(workDir) {
|
|
309
|
+
const root = workDir || process.cwd();
|
|
310
|
+
const statePath = await resolveCanonicalStateMdAsync(root);
|
|
311
|
+
if (!statePath) return null;
|
|
312
|
+
|
|
313
|
+
const buf = await safeReadAsync(statePath);
|
|
314
|
+
if (buf === null) return null;
|
|
315
|
+
|
|
316
|
+
let slug;
|
|
317
|
+
try {
|
|
318
|
+
slug = parseCurrentRoomFieldAsync(buf);
|
|
319
|
+
} catch (_e) {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
if (slug === null) return null;
|
|
323
|
+
|
|
324
|
+
return {
|
|
325
|
+
slug: slug,
|
|
326
|
+
path: statePath,
|
|
327
|
+
source: 'state_md',
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
module.exports = {
|
|
332
|
+
readTriple: readTriple,
|
|
333
|
+
readDecisionLog: readDecisionLog,
|
|
334
|
+
readQuadruple: readQuadruple,
|
|
335
|
+
isQuadrupleFresh: isQuadrupleFresh,
|
|
336
|
+
computeHealthScore: computeHealthScore,
|
|
337
|
+
getCurrentRoom: getCurrentRoom,
|
|
338
|
+
};
|