@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,330 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
3
|
+
*
|
|
4
|
+
* Phase 88.1-07 -- per-section frontmatter schema validator (pure).
|
|
5
|
+
* ==================================================================
|
|
6
|
+
* Single source of truth for the NON-MINTO frontmatter contract. MINTO.md
|
|
7
|
+
* validation is delegated to lib/core/feynman-minto-invariants.cjs (Phase
|
|
8
|
+
* 88-00-B), which owns the Feynman-MINTO memory-triple invariants. This
|
|
9
|
+
* module handles:
|
|
10
|
+
*
|
|
11
|
+
* ROOM.md required: name, type. optional: references.
|
|
12
|
+
* STATE.md required: artifact_count. optional: completeness_score,
|
|
13
|
+
* last_activity_at.
|
|
14
|
+
* every other .md required: title, source, status. optional:
|
|
15
|
+
* (artifact- governing_thought, confidence, evidence_tier.
|
|
16
|
+
* default)
|
|
17
|
+
*
|
|
18
|
+
* Contract:
|
|
19
|
+
*
|
|
20
|
+
* validate(filePath, frontmatter) -> { valid, violations[], severity }
|
|
21
|
+
*
|
|
22
|
+
* where frontmatter is:
|
|
23
|
+
* - an object (parsed YAML frontmatter), OR
|
|
24
|
+
* - null, signaling a parser failure upstream (hook saw malformed YAML
|
|
25
|
+
* and wants the aggregator to record a critical malformed violation).
|
|
26
|
+
*
|
|
27
|
+
* Each violation has shape:
|
|
28
|
+
* { field, type: 'missing' | 'malformed' | 'unknown', severity }
|
|
29
|
+
*
|
|
30
|
+
* Aggregate severity is the max across violations; null-safe per-tier ordering
|
|
31
|
+
* is (critical > error > warning > info). A result with zero violations is
|
|
32
|
+
* valid:true with severity 'info' for artifact/ROOM/STATE schemas. MINTO.md
|
|
33
|
+
* returns whatever the invariants validator returns (its shape already
|
|
34
|
+
* matches: { valid, violations, severity }).
|
|
35
|
+
*
|
|
36
|
+
* Purity invariants (enforced by frontmatter-schema-validator.test.cjs):
|
|
37
|
+
* - No fs I/O. Accepts pre-loaded frontmatter object.
|
|
38
|
+
* - BSL 1.1 header in first 20 lines.
|
|
39
|
+
* - Zero em-dashes or en-dashes (project hard rule).
|
|
40
|
+
* - CJS only (no import / export default).
|
|
41
|
+
*
|
|
42
|
+
* Consumed by scripts/frontmatter-schema-validator.cjs (the PostToolUse hook
|
|
43
|
+
* that handles fs I/O, stdin envelope parsing, .room-root scope walk, and
|
|
44
|
+
* the violation JSONL offense log). The split keeps the validator core
|
|
45
|
+
* testable without any filesystem fixture.
|
|
46
|
+
*
|
|
47
|
+
* Canon obligations:
|
|
48
|
+
* Part 5 -- schemas formalize claim-level evidence-tier properties so
|
|
49
|
+
* Part 5 enforcement has something to measure against.
|
|
50
|
+
* Part 6 -- dog-fooding: plugin validates its own artifact frontmatter
|
|
51
|
+
* through its own mechanism (the hook).
|
|
52
|
+
* Part 8 -- validator is LOCAL-only by construction (pure function, no
|
|
53
|
+
* fs, no network).
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
'use strict';
|
|
57
|
+
|
|
58
|
+
// Path module only for basename detection. No fs. No network.
|
|
59
|
+
const path = require('node:path');
|
|
60
|
+
|
|
61
|
+
// MINTO delegation target. Required at module load (not at call time) so
|
|
62
|
+
// the static wiring can be grep-asserted by the test harness.
|
|
63
|
+
const mintoInvariants = require('./feynman-minto-invariants.cjs');
|
|
64
|
+
|
|
65
|
+
// ---------- Severity ordering ----------
|
|
66
|
+
|
|
67
|
+
const SEVERITY_ORDER = ['info', 'warning', 'error', 'critical'];
|
|
68
|
+
|
|
69
|
+
function compareSeverity(a, b) {
|
|
70
|
+
// Returns positive if a > b in severity.
|
|
71
|
+
return SEVERITY_ORDER.indexOf(a) - SEVERITY_ORDER.indexOf(b);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function aggregateSeverity(violations) {
|
|
75
|
+
if (!Array.isArray(violations) || violations.length === 0) return 'info';
|
|
76
|
+
let worst = 'info';
|
|
77
|
+
for (const v of violations) {
|
|
78
|
+
if (compareSeverity(v.severity, worst) > 0) worst = v.severity;
|
|
79
|
+
}
|
|
80
|
+
return worst;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ---------- Schemas (per-section definitions) ----------
|
|
84
|
+
|
|
85
|
+
const SCHEMAS = Object.freeze({
|
|
86
|
+
'artifact-default': Object.freeze({
|
|
87
|
+
required: Object.freeze(['title', 'source', 'status']),
|
|
88
|
+
optional: Object.freeze([
|
|
89
|
+
'governing_thought',
|
|
90
|
+
'confidence',
|
|
91
|
+
'evidence_tier',
|
|
92
|
+
// These common fields are allowed without triggering unknown warnings.
|
|
93
|
+
// They are NOT required by artifact-default but surface in practice:
|
|
94
|
+
'created_at',
|
|
95
|
+
'last_updated_at',
|
|
96
|
+
'tags',
|
|
97
|
+
'cross_refs',
|
|
98
|
+
'author',
|
|
99
|
+
'domain',
|
|
100
|
+
'section',
|
|
101
|
+
'hsi_score',
|
|
102
|
+
'decision_log',
|
|
103
|
+
]),
|
|
104
|
+
}),
|
|
105
|
+
'ROOM.md': Object.freeze({
|
|
106
|
+
required: Object.freeze(['name', 'type']),
|
|
107
|
+
optional: Object.freeze(['references', 'description', 'parent', 'slug']),
|
|
108
|
+
}),
|
|
109
|
+
'STATE.md': Object.freeze({
|
|
110
|
+
required: Object.freeze(['artifact_count']),
|
|
111
|
+
optional: Object.freeze([
|
|
112
|
+
'completeness_score',
|
|
113
|
+
'last_activity_at',
|
|
114
|
+
'gap_status',
|
|
115
|
+
'minto_health',
|
|
116
|
+
]),
|
|
117
|
+
}),
|
|
118
|
+
'MINTO.md': Object.freeze({
|
|
119
|
+
required: Object.freeze(['schema_version']),
|
|
120
|
+
optional: Object.freeze([
|
|
121
|
+
'governing_thought',
|
|
122
|
+
'last_generated_at',
|
|
123
|
+
'last_artifact_write_seen_at',
|
|
124
|
+
'reasoning_health_score',
|
|
125
|
+
'flagged_weaknesses',
|
|
126
|
+
'decision_log',
|
|
127
|
+
'key_claims',
|
|
128
|
+
'mece_arguments',
|
|
129
|
+
'cross_refs',
|
|
130
|
+
]),
|
|
131
|
+
}),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// ---------- Schema selection ----------
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Select the schema key based on filename basename.
|
|
138
|
+
* ROOM.md, STATE.md, MINTO.md are explicit; everything else falls back to
|
|
139
|
+
* artifact-default. Case-sensitive per the canonical file naming rule
|
|
140
|
+
* (Decision 15: ROOM.md everywhere).
|
|
141
|
+
*/
|
|
142
|
+
function selectSchemaKey(filePath) {
|
|
143
|
+
if (typeof filePath !== 'string' || filePath.length === 0) {
|
|
144
|
+
return 'artifact-default';
|
|
145
|
+
}
|
|
146
|
+
const base = path.basename(filePath);
|
|
147
|
+
if (base === 'ROOM.md') return 'ROOM.md';
|
|
148
|
+
if (base === 'STATE.md') return 'STATE.md';
|
|
149
|
+
if (base === 'MINTO.md') return 'MINTO.md';
|
|
150
|
+
return 'artifact-default';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------- Validation core (non-MINTO) ----------
|
|
154
|
+
|
|
155
|
+
function validateAgainstSchema(schema, frontmatter) {
|
|
156
|
+
const violations = [];
|
|
157
|
+
|
|
158
|
+
// Required fields missing -> error severity each.
|
|
159
|
+
for (const req of schema.required) {
|
|
160
|
+
const v = frontmatter[req];
|
|
161
|
+
const missing =
|
|
162
|
+
v === undefined ||
|
|
163
|
+
v === null ||
|
|
164
|
+
(typeof v === 'string' && v.trim().length === 0);
|
|
165
|
+
if (missing) {
|
|
166
|
+
violations.push({
|
|
167
|
+
field: req,
|
|
168
|
+
type: 'missing',
|
|
169
|
+
severity: 'error',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Unknown fields -> warning severity each.
|
|
175
|
+
const knownFields = new Set(schema.required.concat(schema.optional));
|
|
176
|
+
for (const key of Object.keys(frontmatter)) {
|
|
177
|
+
if (!knownFields.has(key)) {
|
|
178
|
+
violations.push({
|
|
179
|
+
field: key,
|
|
180
|
+
type: 'unknown',
|
|
181
|
+
severity: 'warning',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return violations;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// ---------- Critical escalation ----------
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* If ALL required fields of a schema are missing, escalate the aggregate
|
|
193
|
+
* severity to 'critical'. This mirrors Phase 88-00-B's posture: a completely
|
|
194
|
+
* empty frontmatter is a more severe failure than a single-field lapse.
|
|
195
|
+
*/
|
|
196
|
+
function escalateIfAllRequiredMissing(schema, violations) {
|
|
197
|
+
const missingFields = new Set(
|
|
198
|
+
violations
|
|
199
|
+
.filter(function (v) { return v.type === 'missing'; })
|
|
200
|
+
.map(function (v) { return v.field; })
|
|
201
|
+
);
|
|
202
|
+
if (missingFields.size === 0) return violations;
|
|
203
|
+
const allMissing = schema.required.every(function (r) {
|
|
204
|
+
return missingFields.has(r);
|
|
205
|
+
});
|
|
206
|
+
if (!allMissing) return violations;
|
|
207
|
+
// Escalate each missing-required violation to critical. Unknown field
|
|
208
|
+
// warnings stay warnings; they are not load-bearing here.
|
|
209
|
+
return violations.map(function (v) {
|
|
210
|
+
if (v.type === 'missing') {
|
|
211
|
+
return { field: v.field, type: v.type, severity: 'critical' };
|
|
212
|
+
}
|
|
213
|
+
return v;
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// ---------- Entry point ----------
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* validate(filePath, frontmatter) -> { valid, violations, severity }
|
|
221
|
+
*
|
|
222
|
+
* filePath string absolute or relative path; only the basename is
|
|
223
|
+
* used for schema selection.
|
|
224
|
+
* frontmatter object pre-parsed YAML frontmatter. Pass null to signal
|
|
225
|
+
* the upstream parser failed (malformed YAML); the
|
|
226
|
+
* returned result is a critical malformed violation.
|
|
227
|
+
* Pass {} for an empty frontmatter block.
|
|
228
|
+
*
|
|
229
|
+
* Returns:
|
|
230
|
+
* {
|
|
231
|
+
* valid: boolean true iff violations[] is empty after filtering
|
|
232
|
+
* warnings that do not gate validity (none today;
|
|
233
|
+
* aligned with Phase 88-00-B: any violation makes
|
|
234
|
+
* valid:false except unknown-field warnings).
|
|
235
|
+
* violations: array [{field, type, severity}, ...]
|
|
236
|
+
* severity: string aggregate severity (critical|error|warning|info).
|
|
237
|
+
* }
|
|
238
|
+
*
|
|
239
|
+
* MINTO.md is delegated to feynman-minto-invariants.cjs; its shape already
|
|
240
|
+
* matches this contract by construction (Phase 88-00-B).
|
|
241
|
+
*/
|
|
242
|
+
function validate(filePath, frontmatter) {
|
|
243
|
+
// --- Parser-failure signal ---
|
|
244
|
+
if (frontmatter === null) {
|
|
245
|
+
return {
|
|
246
|
+
valid: false,
|
|
247
|
+
violations: [{
|
|
248
|
+
field: '__frontmatter__',
|
|
249
|
+
type: 'malformed',
|
|
250
|
+
severity: 'critical',
|
|
251
|
+
}],
|
|
252
|
+
severity: 'critical',
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// --- Non-object guard (defensive; upstream should pass an object or null) ---
|
|
257
|
+
if (typeof frontmatter !== 'object' || Array.isArray(frontmatter)) {
|
|
258
|
+
return {
|
|
259
|
+
valid: false,
|
|
260
|
+
violations: [{
|
|
261
|
+
field: '__frontmatter__',
|
|
262
|
+
type: 'malformed',
|
|
263
|
+
severity: 'critical',
|
|
264
|
+
}],
|
|
265
|
+
severity: 'critical',
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const schemaKey = selectSchemaKey(filePath);
|
|
270
|
+
|
|
271
|
+
// --- MINTO.md delegation ---
|
|
272
|
+
if (schemaKey === 'MINTO.md') {
|
|
273
|
+
// The invariants validator reads from disk (Phase 88-00-B contract).
|
|
274
|
+
// We call it with filePath; it returns { valid, violations, severity }.
|
|
275
|
+
// If the caller did not supply a real path (pure unit test), the
|
|
276
|
+
// invariants validator will surface an existence violation, which is
|
|
277
|
+
// correct behavior for the MINTO delegation arm.
|
|
278
|
+
try {
|
|
279
|
+
const r = mintoInvariants.validate(filePath);
|
|
280
|
+
// Normalize: invariants may return severity:null when zero
|
|
281
|
+
// violations. We harmonize to 'info' to keep the schema-module
|
|
282
|
+
// aggregate contract consistent.
|
|
283
|
+
const sev = r && r.severity ? r.severity : 'info';
|
|
284
|
+
return {
|
|
285
|
+
valid: r && r.valid === true,
|
|
286
|
+
violations: (r && Array.isArray(r.violations)) ? r.violations : [],
|
|
287
|
+
severity: sev,
|
|
288
|
+
};
|
|
289
|
+
} catch (_e) {
|
|
290
|
+
// Never crash the schema module on a delegated call.
|
|
291
|
+
return {
|
|
292
|
+
valid: false,
|
|
293
|
+
violations: [{
|
|
294
|
+
field: '__delegate__',
|
|
295
|
+
type: 'malformed',
|
|
296
|
+
severity: 'error',
|
|
297
|
+
}],
|
|
298
|
+
severity: 'error',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// --- Non-MINTO schemas (ROOM.md, STATE.md, artifact-default) ---
|
|
304
|
+
const schema = SCHEMAS[schemaKey];
|
|
305
|
+
let violations = validateAgainstSchema(schema, frontmatter);
|
|
306
|
+
violations = escalateIfAllRequiredMissing(schema, violations);
|
|
307
|
+
|
|
308
|
+
const severity = aggregateSeverity(violations);
|
|
309
|
+
|
|
310
|
+
// Validity gate: any non-warning violation invalidates; warnings alone
|
|
311
|
+
// do NOT invalidate (unknown fields are advisory drift signals).
|
|
312
|
+
const blockingViolations = violations.filter(function (v) {
|
|
313
|
+
return v.severity === 'critical' || v.severity === 'error';
|
|
314
|
+
});
|
|
315
|
+
const valid = blockingViolations.length === 0;
|
|
316
|
+
|
|
317
|
+
return {
|
|
318
|
+
valid: valid,
|
|
319
|
+
violations: violations,
|
|
320
|
+
severity: severity,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
module.exports = {
|
|
325
|
+
SCHEMAS: SCHEMAS,
|
|
326
|
+
validate: validate,
|
|
327
|
+
// Exported for the hook script and observability tooling.
|
|
328
|
+
selectSchemaKey: selectSchemaKey,
|
|
329
|
+
aggregateSeverity: aggregateSeverity,
|
|
330
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindrianOS Plugin -- Git Operations
|
|
3
|
+
* Wraps existing Bash scripts via execSync. Does NOT rewrite Bash logic.
|
|
4
|
+
* Pure Node.js built-ins only.
|
|
5
|
+
*
|
|
6
|
+
* Every function returns a safe default on error. No function ever throws.
|
|
7
|
+
* Git operations are ENHANCEMENTS, not gates.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const { execSync } = require('child_process');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const SCRIPTS_DIR = path.resolve(__dirname, '../../scripts');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Check if git is enabled for a room directory.
|
|
19
|
+
* @param {string} roomDir - Path to room directory
|
|
20
|
+
* @returns {boolean} true if git is initialized, false otherwise
|
|
21
|
+
*/
|
|
22
|
+
function isGitEnabled(roomDir) {
|
|
23
|
+
try {
|
|
24
|
+
const resolved = path.resolve(roomDir);
|
|
25
|
+
const scriptPath = path.join(SCRIPTS_DIR, 'git-ops');
|
|
26
|
+
const result = execSync(`bash "${scriptPath}" is-enabled "${resolved}"`, {
|
|
27
|
+
timeout: 5000,
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
+
});
|
|
31
|
+
return result.trim() === 'true';
|
|
32
|
+
} catch (e) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Commit an artifact file in a room's git repository.
|
|
39
|
+
* @param {string} roomDir - Path to room directory
|
|
40
|
+
* @param {string} filePath - Path to the file to commit
|
|
41
|
+
* @param {string} [message] - Optional commit message (auto-generated if omitted)
|
|
42
|
+
* @returns {{ committed: boolean, message: string }}
|
|
43
|
+
*/
|
|
44
|
+
function commitArtifact(roomDir, filePath, message) {
|
|
45
|
+
try {
|
|
46
|
+
const resolved = path.resolve(roomDir);
|
|
47
|
+
const resolvedFile = path.resolve(filePath);
|
|
48
|
+
const scriptPath = path.join(SCRIPTS_DIR, 'git-ops');
|
|
49
|
+
const msgArg = message ? ` "${message.replace(/"/g, '\\"')}"` : '';
|
|
50
|
+
execSync(`bash "${scriptPath}" commit "${resolved}" "${resolvedFile}"${msgArg}`, {
|
|
51
|
+
timeout: 10000,
|
|
52
|
+
encoding: 'utf-8',
|
|
53
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
54
|
+
});
|
|
55
|
+
return { committed: true, message: message || 'auto-generated' };
|
|
56
|
+
} catch (e) {
|
|
57
|
+
return { committed: false, message: 'git not enabled' };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Push room repo if configured for auto-push.
|
|
63
|
+
* @param {string} roomDir - Path to room directory
|
|
64
|
+
* @returns {boolean} true if push was attempted
|
|
65
|
+
*/
|
|
66
|
+
function pushIfConfigured(roomDir) {
|
|
67
|
+
try {
|
|
68
|
+
const resolved = path.resolve(roomDir);
|
|
69
|
+
const scriptPath = path.join(SCRIPTS_DIR, 'git-ops');
|
|
70
|
+
execSync(`bash "${scriptPath}" push "${resolved}"`, {
|
|
71
|
+
timeout: 10000,
|
|
72
|
+
encoding: 'utf-8',
|
|
73
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
74
|
+
});
|
|
75
|
+
return true;
|
|
76
|
+
} catch (e) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Initialize a git repository in a room directory.
|
|
83
|
+
* @param {string} roomDir - Path to room directory
|
|
84
|
+
* @returns {boolean} true if initialization succeeded
|
|
85
|
+
*/
|
|
86
|
+
function initRepo(roomDir) {
|
|
87
|
+
try {
|
|
88
|
+
const resolved = path.resolve(roomDir);
|
|
89
|
+
const scriptPath = path.join(SCRIPTS_DIR, 'git-ops');
|
|
90
|
+
const result = execSync(`bash "${scriptPath}" init "${resolved}"`, {
|
|
91
|
+
timeout: 10000,
|
|
92
|
+
encoding: 'utf-8',
|
|
93
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
94
|
+
});
|
|
95
|
+
return result.trim() === 'initialized';
|
|
96
|
+
} catch (e) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Set up Git LFS for a room repository.
|
|
103
|
+
* @param {string} roomDir - Path to room directory
|
|
104
|
+
* @returns {boolean} true if LFS setup succeeded or was already configured
|
|
105
|
+
*/
|
|
106
|
+
function setupLfs(roomDir) {
|
|
107
|
+
try {
|
|
108
|
+
const resolved = path.resolve(roomDir);
|
|
109
|
+
const scriptPath = path.join(SCRIPTS_DIR, 'git-ops');
|
|
110
|
+
execSync(`bash "${scriptPath}" lfs-setup "${resolved}"`, {
|
|
111
|
+
timeout: 10000,
|
|
112
|
+
encoding: 'utf-8',
|
|
113
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
114
|
+
});
|
|
115
|
+
return true;
|
|
116
|
+
} catch (e) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get git status for a room directory.
|
|
123
|
+
* @param {string} roomDir - Path to room directory
|
|
124
|
+
* @returns {{ enabled: boolean, remote?: string|null, auto_push?: string, lfs?: boolean, dirty_files?: number }}
|
|
125
|
+
*/
|
|
126
|
+
function getStatus(roomDir) {
|
|
127
|
+
try {
|
|
128
|
+
const resolved = path.resolve(roomDir);
|
|
129
|
+
const scriptPath = path.join(SCRIPTS_DIR, 'git-ops');
|
|
130
|
+
const result = execSync(`bash "${scriptPath}" status "${resolved}"`, {
|
|
131
|
+
timeout: 5000,
|
|
132
|
+
encoding: 'utf-8',
|
|
133
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
134
|
+
});
|
|
135
|
+
return JSON.parse(result.trim());
|
|
136
|
+
} catch (e) {
|
|
137
|
+
return { enabled: false };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
module.exports = { isGitEnabled, commitArtifact, pushIfConfigured, initRepo, setupLfs, getStatus };
|