@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,222 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Phase 101-03 - Shape H (Timeline / Roadmap) renderer.
|
|
4
|
+
* ASCII-art horizontal timeline. 4-zone anatomy. 12-glyph compliant.
|
|
5
|
+
* Glyphs: filled-square (marker), dash (axis), right-tri-fill (primary),
|
|
6
|
+
* right-tri-empty (alt). Spec: 101-RESEARCH.md Section 4.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
const FILLED_SQUARE = '■'; // filled-square
|
|
14
|
+
const DASH = '─'; // dash
|
|
15
|
+
const PRIMARY = '▶'; // right-tri-fill
|
|
16
|
+
const ALT = '▷'; // right-tri-empty
|
|
17
|
+
|
|
18
|
+
const DEFAULT_WIDTH = 60;
|
|
19
|
+
const MIN_WIDTH = 40;
|
|
20
|
+
const MAX_WIDTH = 80;
|
|
21
|
+
const CROWD_THRESHOLD = 3;
|
|
22
|
+
|
|
23
|
+
const DEFAULT_FOOTER = [
|
|
24
|
+
{ glyph: PRIMARY, command: '/mos:act', description: 'Run methodology' },
|
|
25
|
+
{ glyph: ALT, command: '/mos:add-phase', description: 'Add phase to roadmap' },
|
|
26
|
+
{ glyph: ALT, command: '/mos:milestone-summary', description: 'Generate milestone summary' },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
function parseDate(d) {
|
|
30
|
+
if (d instanceof Date) return isNaN(d.getTime()) ? null : d;
|
|
31
|
+
const p = new Date(d);
|
|
32
|
+
return isNaN(p.getTime()) ? null : p;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function fmtDate(d) {
|
|
36
|
+
const m = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
|
|
37
|
+
return m[d.getUTCMonth()] + ' ' + d.getUTCDate();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function err(line1, line2, line3) {
|
|
41
|
+
return { error: 'x ' + line1 + '\nWhy: ' + line2 + '\nFix: ' + line3 };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function clampWidth(w) {
|
|
45
|
+
if (typeof w !== 'number' || !isFinite(w)) return DEFAULT_WIDTH;
|
|
46
|
+
return Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, Math.round(w)));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function buildHeader(jtbd, title, start, end) {
|
|
50
|
+
const tag = jtbd || 'plan-execution';
|
|
51
|
+
const subtitle = title || (fmtDate(start) + ' to ' + fmtDate(end));
|
|
52
|
+
return '-- mindrianOS -- ' + tag + ' -- timeline (' + subtitle + ') --';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function buildAxis(width, start, end) {
|
|
56
|
+
const a = fmtDate(start), b = fmtDate(end);
|
|
57
|
+
const middle = width - a.length - b.length - 2;
|
|
58
|
+
if (middle <= 0) return DASH.repeat(Math.max(width, 1));
|
|
59
|
+
return a + ' ' + DASH.repeat(middle) + ' ' + b;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function placeMarkers(milestones, start, end, width) {
|
|
63
|
+
const span = end.getTime() - start.getTime();
|
|
64
|
+
const pixelsPerMs = (width - 2) / span;
|
|
65
|
+
return milestones.map((m, idx) => {
|
|
66
|
+
const at = parseDate(m.at);
|
|
67
|
+
let col = Math.round((at.getTime() - start.getTime()) * pixelsPerMs);
|
|
68
|
+
if (col < 0) col = 0;
|
|
69
|
+
if (col > width - 1) col = width - 1;
|
|
70
|
+
return { idx, col, label: String(m.label || ''), at };
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function markerLine(marks, width) {
|
|
75
|
+
const arr = new Array(width).fill(' ');
|
|
76
|
+
for (const m of marks) arr[m.col] = FILLED_SQUARE;
|
|
77
|
+
return arr.join('').replace(/\s+$/, '');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function isCrowded(marks) {
|
|
81
|
+
if (marks.length < 2) return false;
|
|
82
|
+
const s = marks.slice().sort((a, b) => a.col - b.col);
|
|
83
|
+
for (let i = 1; i < s.length; i++) {
|
|
84
|
+
if (s[i].col - s[i - 1].col < CROWD_THRESHOLD) return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function stampLabel(arr, col, label, room) {
|
|
90
|
+
let lab = label;
|
|
91
|
+
if (lab.length > room) lab = lab.slice(0, Math.max(1, room - 1)) + '.';
|
|
92
|
+
for (let k = 0; k < lab.length && (col + k) < arr.length; k++) {
|
|
93
|
+
arr[col + k] = lab[k];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function labelRowsUncrowded(marks, width) {
|
|
98
|
+
const sorted = marks.slice().sort((a, b) => a.col - b.col);
|
|
99
|
+
const arr = new Array(width).fill(' ');
|
|
100
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
101
|
+
const m = sorted[i];
|
|
102
|
+
const nextCol = (i + 1 < sorted.length) ? sorted[i + 1].col : width;
|
|
103
|
+
stampLabel(arr, m.col, m.label, Math.max(1, nextCol - m.col - 1));
|
|
104
|
+
}
|
|
105
|
+
return [arr.join('').replace(/\s+$/, '')];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function labelRowsCrowded(marks, width) {
|
|
109
|
+
const sorted = marks.slice().sort((a, b) => a.col - b.col);
|
|
110
|
+
return sorted.map((m) => {
|
|
111
|
+
const arr = new Array(width).fill(' ');
|
|
112
|
+
stampLabel(arr, m.col, m.label, Math.max(1, width - m.col));
|
|
113
|
+
return arr.join('').replace(/\s+$/, '');
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function buildBody(start, end, marks, width, title) {
|
|
118
|
+
const lines = [];
|
|
119
|
+
if (title) { lines.push(FILLED_SQUARE + ' ' + title); lines.push(''); }
|
|
120
|
+
lines.push(buildAxis(width, start, end));
|
|
121
|
+
lines.push(markerLine(marks, width));
|
|
122
|
+
const rows = isCrowded(marks)
|
|
123
|
+
? labelRowsCrowded(marks, width)
|
|
124
|
+
: labelRowsUncrowded(marks, width);
|
|
125
|
+
for (const r of rows) lines.push(r);
|
|
126
|
+
return lines.join('\n');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Phase 101-05: Mode-aware footer marker selection.
|
|
131
|
+
*
|
|
132
|
+
* Per Canon Part 3 "Option generation tier-awareness":
|
|
133
|
+
* Mode A (tier >= 2) -> first verb may carry RECOMMENDED ▶ marker (Brain-derived).
|
|
134
|
+
* Mode B (tier === 1) -> all verbs use the empty triangle ▷ marker; ▶ NEVER renders.
|
|
135
|
+
*
|
|
136
|
+
* Defense-in-depth: this guard lives inside the renderer regardless of whether
|
|
137
|
+
* the dispatcher already gated the call.
|
|
138
|
+
*/
|
|
139
|
+
function buildFooter(footerVerbs, mode) {
|
|
140
|
+
const verbs = (Array.isArray(footerVerbs) && footerVerbs.length > 0)
|
|
141
|
+
? footerVerbs : DEFAULT_FOOTER;
|
|
142
|
+
const isModeB = (mode === 'B');
|
|
143
|
+
return verbs.map((v, i) => {
|
|
144
|
+
const defaultGlyph = (i === 0 && !isModeB) ? PRIMARY : ALT;
|
|
145
|
+
const rawGlyph = v.glyph || defaultGlyph;
|
|
146
|
+
const g = isModeB ? ALT : rawGlyph;
|
|
147
|
+
const cmd = v.command || '';
|
|
148
|
+
const desc = v.description ? (' ' + v.description) : '';
|
|
149
|
+
return g + ' ' + cmd + desc;
|
|
150
|
+
}).join('\n');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* renderShapeH({ start, end, milestones, title?, width?, jtbd?, tier?,
|
|
155
|
+
* footerVerbs? }) -> { zones, contract } | { error }
|
|
156
|
+
*/
|
|
157
|
+
function renderShapeH(opts) {
|
|
158
|
+
const o = opts || {};
|
|
159
|
+
const start = parseDate(o.start);
|
|
160
|
+
const end = parseDate(o.end);
|
|
161
|
+
if (!start || !end) {
|
|
162
|
+
return err('Invalid timeline dates',
|
|
163
|
+
'start or end could not be parsed as ISO date',
|
|
164
|
+
'/mos:plan-execution add-milestone');
|
|
165
|
+
}
|
|
166
|
+
if (end.getTime() <= start.getTime()) {
|
|
167
|
+
return err('Timeline end is not after start',
|
|
168
|
+
'Shape H needs end > start to compute scale',
|
|
169
|
+
'/mos:plan-execution add-milestone');
|
|
170
|
+
}
|
|
171
|
+
const milestones = Array.isArray(o.milestones) ? o.milestones : [];
|
|
172
|
+
if (milestones.length === 0) {
|
|
173
|
+
return err('No milestones in scope',
|
|
174
|
+
'Shape H needs at least one milestone',
|
|
175
|
+
'/mos:plan-execution add-milestone');
|
|
176
|
+
}
|
|
177
|
+
for (const m of milestones) {
|
|
178
|
+
if (!parseDate(m && m.at)) {
|
|
179
|
+
return err('Milestone date invalid',
|
|
180
|
+
'one or more milestones lack a parseable at: field',
|
|
181
|
+
'/mos:plan-execution add-milestone');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const width = clampWidth(o.width);
|
|
185
|
+
const marks = placeMarkers(milestones, start, end, width);
|
|
186
|
+
|
|
187
|
+
// Phase 101-05: derive mode from explicit `mode` arg or fall back to `tier`.
|
|
188
|
+
// Mode A renders RECOMMENDED ▶ on first footer verb; Mode B suppresses across the footer.
|
|
189
|
+
let mode;
|
|
190
|
+
if (o.mode === 'A' || o.mode === 'B') {
|
|
191
|
+
mode = o.mode;
|
|
192
|
+
} else if (typeof o.tier === 'number') {
|
|
193
|
+
mode = o.tier >= 2 ? 'A' : 'B';
|
|
194
|
+
} else {
|
|
195
|
+
mode = 'A'; // back-compat: pre-101-05 callers default to Mode A
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
zones: {
|
|
200
|
+
header: buildHeader(o.jtbd, o.title, start, end),
|
|
201
|
+
body: buildBody(start, end, marks, width, o.title),
|
|
202
|
+
footer: buildFooter(o.footerVerbs, mode),
|
|
203
|
+
},
|
|
204
|
+
contract: {
|
|
205
|
+
shape: 'H',
|
|
206
|
+
width: width,
|
|
207
|
+
milestoneCount: marks.length,
|
|
208
|
+
crowded: isCrowded(marks),
|
|
209
|
+
tier: o.tier == null ? null : o.tier,
|
|
210
|
+
jtbd: o.jtbd || null,
|
|
211
|
+
mode: mode,
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
module.exports = {
|
|
217
|
+
renderShapeH: renderShapeH,
|
|
218
|
+
__glyphs: { FILLED_SQUARE, DASH, PRIMARY, ALT },
|
|
219
|
+
__defaults: { DEFAULT_WIDTH, MIN_WIDTH, MAX_WIDTH, CROWD_THRESHOLD },
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
void path;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
3
|
+
*
|
|
4
|
+
* Phase 101-05 Task 1 -- tier-check helper (v1 stub).
|
|
5
|
+
*
|
|
6
|
+
* Per Canon Part 3 (docs/MINDRIAN-CANON.md "Option generation tier-awareness"):
|
|
7
|
+
*
|
|
8
|
+
* Tier 0 (no Brain, no usable local graph) -> hardcoded minimal option set
|
|
9
|
+
* Tier 1 (Local Only / Mode B) -> Navigation Engine; no RECOMMENDED
|
|
10
|
+
* Tier >= 2 (Full Loop / Mode A) -> Brain-derived options + RECOMMENDED >= 0.7
|
|
11
|
+
*
|
|
12
|
+
* docs/CANON-PHASE-MAP.md Part 3 row "Option generation tier-awareness shipped"
|
|
13
|
+
* points at Phase 90 Plan 90-09 + .planning/research/navigation-engine-brain-interface.md.
|
|
14
|
+
* No standalone tier-check helper landed in main as of 2026-05-01; the contract
|
|
15
|
+
* is currently inferred from `lib/core/brain-client.cjs#isAvailable()` plus
|
|
16
|
+
* BRAIN.md presence checks scattered across `scripts/brain-derive-command.cjs`
|
|
17
|
+
* and `lib/memory/*`.
|
|
18
|
+
*
|
|
19
|
+
* v1 stub semantics (PLAN 101-05 Task 1, autonomous execution, no Phase 90
|
|
20
|
+
* follow-on hard-blocking us):
|
|
21
|
+
* - tier 2 if `process.env.MINDRIAN_BRAIN_KEY` is set (Brain reachable)
|
|
22
|
+
* - tier 1 otherwise (Local Only)
|
|
23
|
+
* - tier 0 is currently never returned by getTier(); callers may pass
|
|
24
|
+
* `tier: 0` explicitly to exercise the dispatcher refuse path.
|
|
25
|
+
*
|
|
26
|
+
* Real Phase 90 wiring (Brain ping + reachability cache + BRAIN.md presence
|
|
27
|
+
* audit) is deferred. When Phase 90's full helper lands, this stub becomes
|
|
28
|
+
* the back-compat shim.
|
|
29
|
+
*
|
|
30
|
+
* Pure CJS, node built-ins only, zero deps (Phase 87 invariant).
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
'use strict';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Return current tier based on Brain key presence.
|
|
37
|
+
*
|
|
38
|
+
* @returns {0|1|2|3} tier
|
|
39
|
+
*/
|
|
40
|
+
function getTier() {
|
|
41
|
+
// v1 stub: env var is the only signal. Phase 90 follow-on will replace
|
|
42
|
+
// with a Brain-ping + cache + BRAIN.md presence audit.
|
|
43
|
+
if (process.env.MINDRIAN_BRAIN_KEY) return 2;
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Map a tier integer to a Mode A / Mode B / Tier 0 string per Canon Part 3.
|
|
49
|
+
*
|
|
50
|
+
* @param {number} tier
|
|
51
|
+
* @returns {'A'|'B'|'0'}
|
|
52
|
+
*/
|
|
53
|
+
function modeForTier(tier) {
|
|
54
|
+
const t = (typeof tier === 'number' && Number.isFinite(tier)) ? tier : 0;
|
|
55
|
+
if (t >= 2) return 'A';
|
|
56
|
+
if (t === 1) return 'B';
|
|
57
|
+
return '0';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = {
|
|
61
|
+
getTier: getTier,
|
|
62
|
+
modeForTier: modeForTier,
|
|
63
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Phase 80 Preconditions
|
|
2
|
+
|
|
3
|
+
## Known: bin/mindrian-tools.cjs MODULE_NOT_FOUND via lazygraph-ops (Phase 78-02 carryover)
|
|
4
|
+
|
|
5
|
+
**Status:** still broken as of 2026-04-13 (Phase 80-01 execution).
|
|
6
|
+
|
|
7
|
+
**Symptom:** `node bin/mindrian-tools.cjs --help` crashes at startup with:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Error: Cannot find module 'better-sqlite3'
|
|
11
|
+
requireStack:
|
|
12
|
+
- lib/core/lazygraph-ops.cjs
|
|
13
|
+
- lib/core/graph-ops.cjs
|
|
14
|
+
- bin/mindrian-tools.cjs
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`lib/core/lazygraph-ops.cjs` does a top-level `require('better-sqlite3')`
|
|
18
|
+
and `bin/mindrian-tools.cjs` eagerly loads `graph-ops.cjs` which pulls in
|
|
19
|
+
`lazygraph-ops.cjs`, so ANY subcommand (even `--help`) fails before
|
|
20
|
+
argv parsing. This is the same class of issue as Phase 78-02 (lazygraph-ops
|
|
21
|
+
side-effect load), just surfaced through a different native dep.
|
|
22
|
+
|
|
23
|
+
**Root cause (not fixed here):** `better-sqlite3` is declared in
|
|
24
|
+
package.json but is a native module that was not built against this
|
|
25
|
+
Node version / WSL env. Either `npm rebuild better-sqlite3`, pin a
|
|
26
|
+
pre-built version, or lazy-require better-sqlite3 inside the functions
|
|
27
|
+
that actually need it.
|
|
28
|
+
|
|
29
|
+
**Workaround for Phase 80:**
|
|
30
|
+
|
|
31
|
+
- Plan 80-05 (command wiring) must NOT add the `vault import` subcommand to
|
|
32
|
+
`bin/mindrian-tools.cjs` via the graph-ops require chain.
|
|
33
|
+
- Instead, wire `/mos:vault import` through `node scripts/vault-import.cjs`
|
|
34
|
+
directly (no import of graph-ops / lazygraph-ops in the entry path).
|
|
35
|
+
- If any downstream plan wants to call mindrian-tools.cjs as a smoke test
|
|
36
|
+
(IMPORT-11), it MUST first confirm mindrian-tools.cjs runs cleanly OR
|
|
37
|
+
stub the smoke test behind this precondition until fixed.
|
|
38
|
+
|
|
39
|
+
**Fix target:** separate plan (not Phase 80 scope). File as a post-Phase-80
|
|
40
|
+
follow-up task against `lib/core/lazygraph-ops.cjs` to lazy-require
|
|
41
|
+
better-sqlite3 at function-call time, not module-load time.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Phase 80 Plan 80-06 Task 1 (IMPORT-10) -- Branding injection.
|
|
5
|
+
*
|
|
6
|
+
* Applied by Stage 04 enricher AFTER wikilink injection. For every routed
|
|
7
|
+
* artifact this module:
|
|
8
|
+
*
|
|
9
|
+
* 1. normalizeFrontmatter -- rewrites frontmatter to the De Stijl canonical
|
|
10
|
+
* shape (title, section, status, imported_from, imported_at, import_id,
|
|
11
|
+
* source_wikilinks, tags). Non-canonical source fields are preserved
|
|
12
|
+
* under _source_frontmatter so nothing is lost.
|
|
13
|
+
* 2. promoteCalloutFields -- promotes known source frontmatter fields
|
|
14
|
+
* (author, attendees, date, tags) into Obsidian-style callout blocks
|
|
15
|
+
* ([!author], [!attendees], [!date], [!tags]) at the top of the body.
|
|
16
|
+
* These render via the De Stijl .callout / .callout-blue / .callout-teal
|
|
17
|
+
* / .callout-red CSS classes shipped by scripts/generate-hub.cjs (v1.9.7).
|
|
18
|
+
* 3. injectBrandedFooter -- appends a MindrianOS branded footer using the
|
|
19
|
+
* same FOOTER_MARKER string as scripts/vault-footer-injector.cjs (Phase
|
|
20
|
+
* 76) so idempotency checks cover both paths.
|
|
21
|
+
*
|
|
22
|
+
* Phase 76 discovery (scripts/vault-footer-injector.cjs):
|
|
23
|
+
* - Exports buildFooter, hasExistingFooter, appendFooter, processFile.
|
|
24
|
+
* - FOOTER_MARKER = '> MindrianOS |', FOOTER_BRAND = '> [SQUARE] MindrianOS |'
|
|
25
|
+
* (the square glyph is intentionally preserved verbatim from that file).
|
|
26
|
+
* - Uses enrichFrontmatter from lib/vault/frontmatter-schema.cjs.
|
|
27
|
+
* - The Phase 76 module is CLI-first but exports are reusable; however the
|
|
28
|
+
* 80-06 branding flow needs a per-file, per-import-context API that
|
|
29
|
+
* Phase 76 does not expose (it walks a whole room and computes its own
|
|
30
|
+
* import context from roomName). So this module reimplements the thin
|
|
31
|
+
* per-file footer pathway while reusing the SAME marker so the two
|
|
32
|
+
* paths are mutually idempotent.
|
|
33
|
+
*
|
|
34
|
+
* Idempotent: running applyBranding twice on the same file produces no
|
|
35
|
+
* second-pass changes (footer not doubled, callouts not duplicated,
|
|
36
|
+
* frontmatter already canonical).
|
|
37
|
+
*
|
|
38
|
+
* Zero em-dashes in this file and in branding.test.cjs (hyphens only).
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
const fs = require('node:fs');
|
|
42
|
+
const path = require('node:path');
|
|
43
|
+
const matter = require('gray-matter');
|
|
44
|
+
|
|
45
|
+
// FOOTER_MARKER must match scripts/vault-footer-injector.cjs (Phase 76).
|
|
46
|
+
const FOOTER_MARKER = '> MindrianOS |';
|
|
47
|
+
// The branded prefix uses a bracketed token instead of a box glyph so the
|
|
48
|
+
// source file stays plain ASCII and is trivially greppable across platforms.
|
|
49
|
+
const FOOTER_BRAND = '> [MOS] MindrianOS |';
|
|
50
|
+
|
|
51
|
+
const CALLOUT_MARKER = '<!-- destijl-callout -->';
|
|
52
|
+
const CALLOUT_FIELDS = ['author', 'attendees', 'date', 'tags'];
|
|
53
|
+
|
|
54
|
+
const CANONICAL_KEYS = new Set([
|
|
55
|
+
'title',
|
|
56
|
+
'section',
|
|
57
|
+
'status',
|
|
58
|
+
'imported_from',
|
|
59
|
+
'imported_at',
|
|
60
|
+
'import_id',
|
|
61
|
+
'source_wikilinks',
|
|
62
|
+
'tags'
|
|
63
|
+
]);
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Footer injection
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
function hasExistingFooter(content) {
|
|
70
|
+
return /^>\s*(?:\[MOS\]\s*)?MindrianOS\s*\|/m.test(content);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function injectBrandedFooter(artifactPath, importContext) {
|
|
74
|
+
const content = fs.readFileSync(artifactPath, 'utf8');
|
|
75
|
+
if (hasExistingFooter(content)) return false;
|
|
76
|
+
|
|
77
|
+
const importedAt = (importContext && importContext.imported_at) || new Date().toISOString();
|
|
78
|
+
const sourceVault = (importContext && importContext.source_vault) || 'unknown';
|
|
79
|
+
const importId = (importContext && importContext.import_id) || 'unknown';
|
|
80
|
+
|
|
81
|
+
const footer = [
|
|
82
|
+
'',
|
|
83
|
+
'---',
|
|
84
|
+
'',
|
|
85
|
+
FOOTER_BRAND + ' imported ' + importedAt + ' | from ' + sourceVault + ' | import_id: ' + importId,
|
|
86
|
+
''
|
|
87
|
+
].join('\n');
|
|
88
|
+
|
|
89
|
+
const trimmed = content.replace(/\s+$/, '');
|
|
90
|
+
// Avoid doubling an existing horizontal rule at the tail of the body.
|
|
91
|
+
const endsWithHr = /(^|\n)---\s*$/.test(trimmed);
|
|
92
|
+
const out = endsWithHr
|
|
93
|
+
? trimmed + '\n\n' + FOOTER_BRAND + ' imported ' + importedAt + ' | from ' + sourceVault + ' | import_id: ' + importId + '\n'
|
|
94
|
+
: trimmed + footer;
|
|
95
|
+
|
|
96
|
+
fs.writeFileSync(artifactPath, out);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Frontmatter normalization
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
function normalizeFrontmatter(artifactPath, classification, importContext) {
|
|
105
|
+
const raw = fs.readFileSync(artifactPath, 'utf8');
|
|
106
|
+
const parsed = matter(raw);
|
|
107
|
+
const src = parsed.data || {};
|
|
108
|
+
|
|
109
|
+
const importedAt = (importContext && importContext.imported_at) || new Date().toISOString();
|
|
110
|
+
|
|
111
|
+
// Preserve any previously-seeded _source_frontmatter so re-runs do not
|
|
112
|
+
// nest it recursively on every invocation.
|
|
113
|
+
const previouslyPreserved = (src._source_frontmatter && typeof src._source_frontmatter === 'object')
|
|
114
|
+
? src._source_frontmatter
|
|
115
|
+
: {};
|
|
116
|
+
|
|
117
|
+
const canonical = {};
|
|
118
|
+
canonical.title = src.title || path.basename(artifactPath, '.md');
|
|
119
|
+
canonical.section = (classification && classification.section) || src.section || '';
|
|
120
|
+
canonical.status = 'imported';
|
|
121
|
+
canonical.imported_from = (importContext && importContext.source_path) || src.imported_from || '';
|
|
122
|
+
canonical.imported_at = src.imported_at || importedAt;
|
|
123
|
+
canonical.import_id = (importContext && importContext.import_id) || src.import_id || '';
|
|
124
|
+
|
|
125
|
+
if (Array.isArray(src.source_wikilinks)) {
|
|
126
|
+
canonical.source_wikilinks = src.source_wikilinks;
|
|
127
|
+
} else if (importContext && Array.isArray(importContext.source_wikilinks)) {
|
|
128
|
+
canonical.source_wikilinks = importContext.source_wikilinks;
|
|
129
|
+
} else {
|
|
130
|
+
canonical.source_wikilinks = [];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (Array.isArray(src.tags)) canonical.tags = src.tags;
|
|
134
|
+
else if (src.tags) canonical.tags = [src.tags];
|
|
135
|
+
else canonical.tags = [];
|
|
136
|
+
|
|
137
|
+
// Everything else goes under _source_frontmatter so it round-trips.
|
|
138
|
+
const preserved = Object.assign({}, previouslyPreserved);
|
|
139
|
+
for (const [k, v] of Object.entries(src)) {
|
|
140
|
+
if (CANONICAL_KEYS.has(k)) continue;
|
|
141
|
+
if (k === '_source_frontmatter') continue;
|
|
142
|
+
preserved[k] = v;
|
|
143
|
+
}
|
|
144
|
+
if (Object.keys(preserved).length > 0) canonical._source_frontmatter = preserved;
|
|
145
|
+
|
|
146
|
+
const out = matter.stringify(parsed.content, canonical);
|
|
147
|
+
fs.writeFileSync(artifactPath, out);
|
|
148
|
+
return canonical;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
// Callout promotion
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
|
|
155
|
+
function formatCalloutValue(v) {
|
|
156
|
+
if (Array.isArray(v)) return v.map(formatCalloutValue).join(', ');
|
|
157
|
+
if (v instanceof Date) return v.toISOString().slice(0, 10);
|
|
158
|
+
return String(v);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function promoteCalloutFields(artifactPath) {
|
|
162
|
+
const raw = fs.readFileSync(artifactPath, 'utf8');
|
|
163
|
+
if (raw.includes(CALLOUT_MARKER)) return false; // idempotent
|
|
164
|
+
|
|
165
|
+
const parsed = matter(raw);
|
|
166
|
+
const fm = parsed.data || {};
|
|
167
|
+
const src = (fm._source_frontmatter && typeof fm._source_frontmatter === 'object') ? fm._source_frontmatter : {};
|
|
168
|
+
|
|
169
|
+
const callouts = [];
|
|
170
|
+
for (const key of CALLOUT_FIELDS) {
|
|
171
|
+
let v = src[key];
|
|
172
|
+
if (v == null || v === '') v = fm[key];
|
|
173
|
+
if (v == null || v === '') continue;
|
|
174
|
+
if (Array.isArray(v) && v.length === 0) continue;
|
|
175
|
+
callouts.push('> [!' + key + '] ' + formatCalloutValue(v));
|
|
176
|
+
}
|
|
177
|
+
if (callouts.length === 0) return false;
|
|
178
|
+
|
|
179
|
+
// Block uses De Stijl callout rendering (scripts/generate-hub.cjs .callout
|
|
180
|
+
// classes). The marker comment makes the block detectable on re-runs and
|
|
181
|
+
// also acts as a hint for the hub renderer to wrap with callout-blue.
|
|
182
|
+
const block = [CALLOUT_MARKER, ...callouts, ''].join('\n');
|
|
183
|
+
const newBody = block + '\n' + parsed.content.replace(/^\s+/, '');
|
|
184
|
+
const out = matter.stringify(newBody, fm);
|
|
185
|
+
fs.writeFileSync(artifactPath, out);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Orchestrator
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
|
|
193
|
+
function applyBranding(artifactPath, classification, importContext) {
|
|
194
|
+
normalizeFrontmatter(artifactPath, classification, importContext);
|
|
195
|
+
promoteCalloutFields(artifactPath);
|
|
196
|
+
injectBrandedFooter(artifactPath, importContext);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
module.exports = {
|
|
200
|
+
injectBrandedFooter: injectBrandedFooter,
|
|
201
|
+
normalizeFrontmatter: normalizeFrontmatter,
|
|
202
|
+
promoteCalloutFields: promoteCalloutFields,
|
|
203
|
+
applyBranding: applyBranding,
|
|
204
|
+
hasExistingFooter: hasExistingFooter,
|
|
205
|
+
FOOTER_MARKER: FOOTER_MARKER,
|
|
206
|
+
FOOTER_BRAND: FOOTER_BRAND,
|
|
207
|
+
CALLOUT_MARKER: CALLOUT_MARKER,
|
|
208
|
+
CALLOUT_FIELDS: CALLOUT_FIELDS,
|
|
209
|
+
CANONICAL_KEYS: CANONICAL_KEYS
|
|
210
|
+
};
|