@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,392 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
4
|
+
*
|
|
5
|
+
* Phase 88-03 -- recompile-room-references tests (RED -> GREEN)
|
|
6
|
+
* ==============================================================
|
|
7
|
+
* Ships the deterministic ROOM.md references recompiler. The compiler
|
|
8
|
+
* rebuilds ONLY the delimited
|
|
9
|
+
* <!-- BEGIN REFERENCES --> ... <!-- END REFERENCES -->
|
|
10
|
+
* block inside ROOM.md. Human-authored identity prose OUTSIDE the
|
|
11
|
+
* markers is preserved byte-for-byte across every recompile. The
|
|
12
|
+
* compiler is deterministic (no LLM), sub-200ms for typical sections,
|
|
13
|
+
* and composes with the Phase 87-02 atomic write-lock plus an
|
|
14
|
+
* mtime-stamp conflict detector so manual edits between sessions are
|
|
15
|
+
* never silently stomped.
|
|
16
|
+
*
|
|
17
|
+
* Test map (10 tests, one per PLAN <behavior> case):
|
|
18
|
+
* Test 1: ROOM.md without markers + 3 artifacts -> markers APPENDED with all 3 links; prose preserved
|
|
19
|
+
* Test 2: ROOM.md with existing REFERENCES block -> block REPLACED; prose outside byte-identical
|
|
20
|
+
* Test 3: artifact wikilink to other section surfaces under "Section links" Set-deduped
|
|
21
|
+
* Test 4: wikilink in identity prose OUTSIDE markers stays in prose (NOT moved into auto-block)
|
|
22
|
+
* Test 5: ROOM.md / STATE.md / MINTO.md filtered from artifact list (system files excluded)
|
|
23
|
+
* Test 6: mtime conflict detected (ROOM.md edited after last stamp) -> skip write, stderr warn, exit 0 on CLI
|
|
24
|
+
* Test 7: 3 concurrent forked recompiles on same section -> well-formed output, no duplicate block
|
|
25
|
+
* Test 8: 20-artifact section recompile completes in < 200ms wall-clock
|
|
26
|
+
* Test 9: empty section (ROOM.md + zero artifacts) -> block contains "No artifacts yet in this section."
|
|
27
|
+
* Test 10: no ROOM.md present -> exit code 2, stderr message, no file created
|
|
28
|
+
*
|
|
29
|
+
* BSL 1.1. Zero npm deps. Node built-ins only. Three-surface by construction.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
'use strict';
|
|
33
|
+
|
|
34
|
+
const assert = require('node:assert/strict');
|
|
35
|
+
const fs = require('node:fs');
|
|
36
|
+
const os = require('node:os');
|
|
37
|
+
const path = require('node:path');
|
|
38
|
+
const { fork, spawnSync } = require('node:child_process');
|
|
39
|
+
|
|
40
|
+
const recompiler = require('../../scripts/recompile-room-references.cjs');
|
|
41
|
+
|
|
42
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
43
|
+
const CLI = path.join(REPO_ROOT, 'scripts', 'recompile-room-references.cjs');
|
|
44
|
+
|
|
45
|
+
// ---------- Fixture helpers ----------
|
|
46
|
+
|
|
47
|
+
const TMPDIRS = [];
|
|
48
|
+
function mkTmp(prefix) {
|
|
49
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), prefix));
|
|
50
|
+
// Mark as a room root so downstream resolve-room style walkers could find it.
|
|
51
|
+
fs.writeFileSync(path.join(d, '.room-root'), '');
|
|
52
|
+
fs.mkdirSync(path.join(d, '.mindrian'), { recursive: true });
|
|
53
|
+
TMPDIRS.push(d);
|
|
54
|
+
return d;
|
|
55
|
+
}
|
|
56
|
+
process.on('exit', () => {
|
|
57
|
+
for (const d of TMPDIRS) {
|
|
58
|
+
try { fs.rmSync(d, { recursive: true, force: true }); } catch (_) {}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
function sectionDir(roomDir, name) {
|
|
63
|
+
const p = path.join(roomDir, name);
|
|
64
|
+
fs.mkdirSync(p, { recursive: true });
|
|
65
|
+
return p;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function writeArtifact(dir, baseName, title, body) {
|
|
69
|
+
const payload = '# ' + title + '\n\n' + (body || 'Content.\n');
|
|
70
|
+
fs.writeFileSync(path.join(dir, baseName + '.md'), payload, 'utf8');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function readRoomMd(dir) {
|
|
74
|
+
return fs.readFileSync(path.join(dir, 'ROOM.md'), 'utf8');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function writeRoomMd(dir, contents) {
|
|
78
|
+
fs.writeFileSync(path.join(dir, 'ROOM.md'), contents, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ---------- Runner ----------
|
|
82
|
+
|
|
83
|
+
let passed = 0;
|
|
84
|
+
let failed = 0;
|
|
85
|
+
const pendingAsync = [];
|
|
86
|
+
function run(name, fn) {
|
|
87
|
+
try {
|
|
88
|
+
const maybePromise = fn();
|
|
89
|
+
if (maybePromise && typeof maybePromise.then === 'function') {
|
|
90
|
+
// Defer pass/fail bookkeeping until the promise settles; drive it
|
|
91
|
+
// from main() below so a failing async test still exits non-zero.
|
|
92
|
+
pendingAsync.push(
|
|
93
|
+
maybePromise.then(
|
|
94
|
+
() => {
|
|
95
|
+
process.stdout.write(' OK ' + name + '\n');
|
|
96
|
+
passed += 1;
|
|
97
|
+
},
|
|
98
|
+
(e) => {
|
|
99
|
+
process.stderr.write(' FAIL ' + name + ': ' + (e && e.message || e) + '\n');
|
|
100
|
+
if (e && e.stack) process.stderr.write(e.stack + '\n');
|
|
101
|
+
failed += 1;
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
process.stdout.write(' OK ' + name + '\n');
|
|
108
|
+
passed += 1;
|
|
109
|
+
} catch (e) {
|
|
110
|
+
process.stderr.write(' FAIL ' + name + ': ' + (e && e.message || e) + '\n');
|
|
111
|
+
if (e && e.stack) process.stderr.write(e.stack + '\n');
|
|
112
|
+
failed += 1;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ---------- Tests ----------
|
|
117
|
+
|
|
118
|
+
run('test 1 -- no markers + 3 artifacts: markers APPENDED, prose preserved', () => {
|
|
119
|
+
const room = mkTmp('recomp-t1-');
|
|
120
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
121
|
+
const identityProse =
|
|
122
|
+
'# Market Analysis\n' +
|
|
123
|
+
'\n' +
|
|
124
|
+
'Bottom-up TAM analysis for the enterprise SaaS wedge.\n';
|
|
125
|
+
writeRoomMd(sec, identityProse);
|
|
126
|
+
writeArtifact(sec, 'tam-bottom-up', 'TAM Bottom-Up Analysis');
|
|
127
|
+
writeArtifact(sec, 'sam-calculation', 'SAM Calculation');
|
|
128
|
+
writeArtifact(sec, 'competitor-density', 'Competitor Density Report');
|
|
129
|
+
|
|
130
|
+
const result = recompiler.recompile(sec);
|
|
131
|
+
assert.equal(result.success, true, 'recompile returned non-success: ' + JSON.stringify(result));
|
|
132
|
+
assert.ok(result.references_count >= 3, 'expected >=3 references, got ' + result.references_count);
|
|
133
|
+
|
|
134
|
+
const out = readRoomMd(sec);
|
|
135
|
+
assert.ok(out.indexOf('<!-- BEGIN REFERENCES -->') !== -1, 'BEGIN marker missing');
|
|
136
|
+
assert.ok(out.indexOf('<!-- END REFERENCES -->') !== -1, 'END marker missing');
|
|
137
|
+
assert.ok(out.indexOf('tam-bottom-up') !== -1, 'tam-bottom-up link missing');
|
|
138
|
+
assert.ok(out.indexOf('sam-calculation') !== -1, 'sam-calculation link missing');
|
|
139
|
+
assert.ok(out.indexOf('competitor-density') !== -1, 'competitor-density link missing');
|
|
140
|
+
// Prose preserved verbatim
|
|
141
|
+
assert.ok(out.indexOf('Bottom-up TAM analysis for the enterprise SaaS wedge.') !== -1,
|
|
142
|
+
'identity prose was not preserved');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
run('test 2 -- existing REFERENCES block is REPLACED, prose outside byte-identical', () => {
|
|
146
|
+
const room = mkTmp('recomp-t2-');
|
|
147
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
148
|
+
const proseBefore = '# Market Analysis\n\nOriginal human prose.\n';
|
|
149
|
+
const proseAfter = '\n[More human-authored content -- preserved.]\n';
|
|
150
|
+
const staleBlock =
|
|
151
|
+
'<!-- BEGIN REFERENCES -->\n' +
|
|
152
|
+
'## Cross-References\n\n' +
|
|
153
|
+
'### Artifacts in this section\n' +
|
|
154
|
+
'- [[stale-artifact|Old Link]]\n' +
|
|
155
|
+
'<!-- END REFERENCES -->\n';
|
|
156
|
+
writeRoomMd(sec, proseBefore + staleBlock + proseAfter);
|
|
157
|
+
|
|
158
|
+
writeArtifact(sec, 'new-one', 'New One');
|
|
159
|
+
writeArtifact(sec, 'new-two', 'New Two');
|
|
160
|
+
|
|
161
|
+
const result = recompiler.recompile(sec);
|
|
162
|
+
assert.equal(result.success, true);
|
|
163
|
+
|
|
164
|
+
const out = readRoomMd(sec);
|
|
165
|
+
// Stale link gone, new links present
|
|
166
|
+
assert.equal(out.indexOf('stale-artifact'), -1, 'stale link was not removed');
|
|
167
|
+
assert.ok(out.indexOf('new-one') !== -1, 'new-one link missing');
|
|
168
|
+
assert.ok(out.indexOf('new-two') !== -1, 'new-two link missing');
|
|
169
|
+
// Prose outside preserved
|
|
170
|
+
assert.ok(out.indexOf('Original human prose.') !== -1, 'prose before markers lost');
|
|
171
|
+
assert.ok(out.indexOf('[More human-authored content -- preserved.]') !== -1,
|
|
172
|
+
'prose after markers lost');
|
|
173
|
+
// Exactly one BEGIN / one END marker (no duplication)
|
|
174
|
+
const beginCount = (out.match(/<!-- BEGIN REFERENCES -->/g) || []).length;
|
|
175
|
+
const endCount = (out.match(/<!-- END REFERENCES -->/g) || []).length;
|
|
176
|
+
assert.equal(beginCount, 1, 'expected exactly 1 BEGIN marker, got ' + beginCount);
|
|
177
|
+
assert.equal(endCount, 1, 'expected exactly 1 END marker, got ' + endCount);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
run('test 3 -- artifact wikilink to other section surfaces under Section links', () => {
|
|
181
|
+
const room = mkTmp('recomp-t3-');
|
|
182
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
183
|
+
writeRoomMd(sec, '# Market Analysis\n\nProse.\n');
|
|
184
|
+
fs.writeFileSync(
|
|
185
|
+
path.join(sec, 'tam-analysis.md'),
|
|
186
|
+
'# TAM Analysis\n\nSee [[problem-definition/wedge-spec]] and [[financial-model/pricing]].\n',
|
|
187
|
+
'utf8'
|
|
188
|
+
);
|
|
189
|
+
fs.writeFileSync(
|
|
190
|
+
path.join(sec, 'sam-calc.md'),
|
|
191
|
+
'# SAM Calc\n\nAlso references [[problem-definition/wedge-spec]] (duplicate target, should dedupe).\n',
|
|
192
|
+
'utf8'
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
const result = recompiler.recompile(sec);
|
|
196
|
+
assert.equal(result.success, true);
|
|
197
|
+
|
|
198
|
+
const out = readRoomMd(sec);
|
|
199
|
+
// Section-level links present
|
|
200
|
+
assert.ok(out.indexOf('problem-definition/wedge-spec') !== -1,
|
|
201
|
+
'cross-section link problem-definition/wedge-spec missing');
|
|
202
|
+
assert.ok(out.indexOf('financial-model/pricing') !== -1,
|
|
203
|
+
'cross-section link financial-model/pricing missing');
|
|
204
|
+
// Deduped: problem-definition/wedge-spec appears at most once under "Section links"
|
|
205
|
+
const sectionLinksMatch = out.match(
|
|
206
|
+
/### Section links\n([\s\S]*?)(?=\n###|\n<!-- END REFERENCES -->)/
|
|
207
|
+
);
|
|
208
|
+
assert.ok(sectionLinksMatch, 'Section links header missing');
|
|
209
|
+
const secBlock = sectionLinksMatch[1];
|
|
210
|
+
const occurrences = (secBlock.match(/problem-definition\/wedge-spec/g) || []).length;
|
|
211
|
+
assert.equal(occurrences, 1, 'cross-section link not deduped; occurrences=' + occurrences);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
run('test 4 -- wikilink in identity prose OUTSIDE markers stays in prose, not moved', () => {
|
|
215
|
+
const room = mkTmp('recomp-t4-');
|
|
216
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
217
|
+
const prose =
|
|
218
|
+
'# Market Analysis\n\n' +
|
|
219
|
+
'This section ties back to [[sibling-section/foo]] (a human-authored note).\n';
|
|
220
|
+
writeRoomMd(sec, prose);
|
|
221
|
+
writeArtifact(sec, 'real-artifact', 'Real Artifact');
|
|
222
|
+
|
|
223
|
+
const result = recompiler.recompile(sec);
|
|
224
|
+
assert.equal(result.success, true);
|
|
225
|
+
|
|
226
|
+
const out = readRoomMd(sec);
|
|
227
|
+
// The human wikilink survives in prose
|
|
228
|
+
assert.ok(out.indexOf('[[sibling-section/foo]]') !== -1,
|
|
229
|
+
'identity-prose wikilink was stripped');
|
|
230
|
+
// And it is NOT added into the auto-block section-links list.
|
|
231
|
+
const beginIdx = out.indexOf('<!-- BEGIN REFERENCES -->');
|
|
232
|
+
const endIdx = out.indexOf('<!-- END REFERENCES -->');
|
|
233
|
+
assert.ok(beginIdx !== -1 && endIdx > beginIdx);
|
|
234
|
+
const autoBlock = out.slice(beginIdx, endIdx);
|
|
235
|
+
assert.equal(autoBlock.indexOf('sibling-section/foo'), -1,
|
|
236
|
+
'prose wikilink leaked into auto-block');
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
run('test 5 -- ROOM.md / STATE.md / MINTO.md filtered from artifact list', () => {
|
|
240
|
+
const room = mkTmp('recomp-t5-');
|
|
241
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
242
|
+
writeRoomMd(sec, '# Market Analysis\n\nProse.\n');
|
|
243
|
+
// System files: must NOT appear in artifact list
|
|
244
|
+
fs.writeFileSync(path.join(sec, 'STATE.md'), '# State\n', 'utf8');
|
|
245
|
+
fs.writeFileSync(path.join(sec, 'MINTO.md'), '---\n---\n# Minto\n', 'utf8');
|
|
246
|
+
// A real artifact
|
|
247
|
+
writeArtifact(sec, 'valid-artifact', 'Valid Artifact');
|
|
248
|
+
|
|
249
|
+
const result = recompiler.recompile(sec);
|
|
250
|
+
assert.equal(result.success, true);
|
|
251
|
+
|
|
252
|
+
const out = readRoomMd(sec);
|
|
253
|
+
// Scope assertions to the machine-managed block only so the "ROOM.md"
|
|
254
|
+
// appearing in section-links target rendering (e.g. "section/ROOM.md")
|
|
255
|
+
// cannot poison the filter check.
|
|
256
|
+
const beginIdx = out.indexOf('<!-- BEGIN REFERENCES -->');
|
|
257
|
+
const endIdx = out.indexOf('<!-- END REFERENCES -->');
|
|
258
|
+
const block = out.slice(beginIdx, endIdx);
|
|
259
|
+
const artifactsBlockMatch = block.match(
|
|
260
|
+
/### Artifacts in this section\n([\s\S]*?)(?=\n###|$)/
|
|
261
|
+
);
|
|
262
|
+
assert.ok(artifactsBlockMatch, 'Artifacts subsection missing');
|
|
263
|
+
const aBlock = artifactsBlockMatch[1];
|
|
264
|
+
assert.ok(aBlock.indexOf('valid-artifact') !== -1, 'valid-artifact missing');
|
|
265
|
+
assert.equal(aBlock.indexOf('STATE'), -1, 'STATE.md leaked into artifact list');
|
|
266
|
+
assert.equal(aBlock.indexOf('MINTO'), -1, 'MINTO.md leaked into artifact list');
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
run('test 6 -- mtime conflict detection: ROOM.md edited after stamp -> skip', () => {
|
|
270
|
+
const room = mkTmp('recomp-t6-');
|
|
271
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
272
|
+
const prose = '# Market Analysis\n\nOriginal prose.\n';
|
|
273
|
+
writeRoomMd(sec, prose);
|
|
274
|
+
writeArtifact(sec, 'art-1', 'Art 1');
|
|
275
|
+
|
|
276
|
+
// Stamp at "now - 60s"; ROOM.md mtime pushed to "now + 60s" to simulate a
|
|
277
|
+
// human edit that post-dates the last recompile.
|
|
278
|
+
const stampPath = path.join(room, '.mindrian', 'recompile-stamps.json');
|
|
279
|
+
const nowMs = Date.now();
|
|
280
|
+
const stampData = {};
|
|
281
|
+
stampData[sec] = { last_recompile_at: nowMs - 60_000 };
|
|
282
|
+
fs.writeFileSync(stampPath, JSON.stringify(stampData, null, 2), 'utf8');
|
|
283
|
+
|
|
284
|
+
const futureSec = new Date(nowMs + 60_000) / 1000;
|
|
285
|
+
fs.utimesSync(path.join(sec, 'ROOM.md'), futureSec, futureSec);
|
|
286
|
+
|
|
287
|
+
const result = recompiler.recompile(sec);
|
|
288
|
+
assert.equal(result.success, false, 'expected skip on mtime conflict');
|
|
289
|
+
assert.equal(result.reason, 'mtime_conflict', 'wrong skip reason: ' + result.reason);
|
|
290
|
+
|
|
291
|
+
// ROOM.md unchanged (no markers injected)
|
|
292
|
+
const out = readRoomMd(sec);
|
|
293
|
+
assert.equal(out, prose, 'ROOM.md was modified despite mtime conflict');
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
run('test 7 -- concurrent recompiles: final state well-formed, no duplicate block', () => {
|
|
297
|
+
const room = mkTmp('recomp-t7-');
|
|
298
|
+
const sec = sectionDir(room, 'market-analysis');
|
|
299
|
+
writeRoomMd(sec, '# Market Analysis\n\nProse for concurrency test.\n');
|
|
300
|
+
// Several artifacts so writes have something to emit
|
|
301
|
+
for (let i = 0; i < 5; i++) {
|
|
302
|
+
writeArtifact(sec, 'art-' + i, 'Art ' + i);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Fork 3 workers that each recompile the same section in parallel.
|
|
306
|
+
// Workers exit 0 on success, 1 on throw.
|
|
307
|
+
const worker = path.join(__dirname, 'recompile-room-references.worker.cjs');
|
|
308
|
+
assert.ok(fs.existsSync(worker), 'worker file missing: ' + worker);
|
|
309
|
+
const promises = [];
|
|
310
|
+
for (let i = 0; i < 3; i++) {
|
|
311
|
+
promises.push(new Promise((resolve) => {
|
|
312
|
+
const child = fork(worker, [sec], { silent: true });
|
|
313
|
+
child.on('exit', (code) => resolve(code));
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
return Promise.all(promises).then((codes) => {
|
|
317
|
+
assert.ok(codes.every((c) => c === 0 || c === 2), // 2 is mtime-conflict skip, valid outcome
|
|
318
|
+
'some workers failed with non-0/2 exit: ' + JSON.stringify(codes));
|
|
319
|
+
const out = readRoomMd(sec);
|
|
320
|
+
const beginCount = (out.match(/<!-- BEGIN REFERENCES -->/g) || []).length;
|
|
321
|
+
const endCount = (out.match(/<!-- END REFERENCES -->/g) || []).length;
|
|
322
|
+
assert.equal(beginCount, 1, 'expected 1 BEGIN after concurrent recompiles, got ' + beginCount);
|
|
323
|
+
assert.equal(endCount, 1, 'expected 1 END after concurrent recompiles, got ' + endCount);
|
|
324
|
+
// Prose preserved
|
|
325
|
+
assert.ok(out.indexOf('Prose for concurrency test.') !== -1, 'prose lost in concurrent write');
|
|
326
|
+
// Block must be well-formed: END after BEGIN
|
|
327
|
+
assert.ok(out.indexOf('<!-- END REFERENCES -->') > out.indexOf('<!-- BEGIN REFERENCES -->'),
|
|
328
|
+
'END appears before BEGIN');
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
run('test 8 -- 20-artifact section completes in under 200ms', () => {
|
|
333
|
+
const room = mkTmp('recomp-t8-');
|
|
334
|
+
const sec = sectionDir(room, 'dense-section');
|
|
335
|
+
writeRoomMd(sec, '# Dense Section\n\nLots of artifacts.\n');
|
|
336
|
+
for (let i = 0; i < 20; i++) {
|
|
337
|
+
writeArtifact(sec, 'artifact-' + i, 'Artifact ' + i, 'Content number ' + i + '.\n');
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const start = Date.now();
|
|
341
|
+
const result = recompiler.recompile(sec);
|
|
342
|
+
const elapsed = Date.now() - start;
|
|
343
|
+
assert.equal(result.success, true);
|
|
344
|
+
assert.ok(result.references_count >= 20,
|
|
345
|
+
'expected >=20 references, got ' + result.references_count);
|
|
346
|
+
assert.ok(elapsed < 200, 'recompile took ' + elapsed + 'ms (budget 200ms)');
|
|
347
|
+
// Sanity: elapsed_ms reported by result is within ballpark
|
|
348
|
+
assert.ok(typeof result.elapsed_ms === 'number', 'result.elapsed_ms missing');
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
run('test 9 -- empty section produces placeholder line', () => {
|
|
352
|
+
const room = mkTmp('recomp-t9-');
|
|
353
|
+
const sec = sectionDir(room, 'empty-section');
|
|
354
|
+
writeRoomMd(sec, '# Empty Section\n\nNothing here yet.\n');
|
|
355
|
+
|
|
356
|
+
const result = recompiler.recompile(sec);
|
|
357
|
+
assert.equal(result.success, true);
|
|
358
|
+
assert.equal(result.references_count, 0);
|
|
359
|
+
|
|
360
|
+
const out = readRoomMd(sec);
|
|
361
|
+
assert.ok(out.indexOf('<!-- BEGIN REFERENCES -->') !== -1, 'BEGIN marker missing');
|
|
362
|
+
assert.ok(out.indexOf('No artifacts yet in this section.') !== -1,
|
|
363
|
+
'empty placeholder text missing');
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
run('test 10 -- missing ROOM.md: exit code 2 via CLI, no file created', () => {
|
|
367
|
+
const room = mkTmp('recomp-t10-');
|
|
368
|
+
const sec = sectionDir(room, 'no-room-md');
|
|
369
|
+
// Do NOT create ROOM.md
|
|
370
|
+
writeArtifact(sec, 'orphan', 'Orphan artifact');
|
|
371
|
+
|
|
372
|
+
// Programmatic call
|
|
373
|
+
const result = recompiler.recompile(sec);
|
|
374
|
+
assert.equal(result.success, false);
|
|
375
|
+
assert.equal(result.reason, 'no_room_md');
|
|
376
|
+
assert.equal(fs.existsSync(path.join(sec, 'ROOM.md')), false,
|
|
377
|
+
'recompiler wrongly created ROOM.md');
|
|
378
|
+
|
|
379
|
+
// CLI invocation
|
|
380
|
+
const res = spawnSync(process.execPath, [CLI, sec], { encoding: 'utf8' });
|
|
381
|
+
assert.equal(res.status, 2, 'CLI exit code ' + res.status + ' (expected 2). stderr: ' + res.stderr);
|
|
382
|
+
assert.ok(/ROOM\.md not found/i.test(res.stderr), 'stderr missing "ROOM.md not found": ' + res.stderr);
|
|
383
|
+
assert.equal(fs.existsSync(path.join(sec, 'ROOM.md')), false,
|
|
384
|
+
'CLI wrongly created ROOM.md');
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// ---------- Epilogue ----------
|
|
388
|
+
|
|
389
|
+
Promise.all(pendingAsync).then(() => {
|
|
390
|
+
process.stdout.write('\nrecompile-room-references: ' + passed + ' passed, ' + failed + ' failed\n');
|
|
391
|
+
process.exit(failed === 0 ? 0 : 1);
|
|
392
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
4
|
+
*
|
|
5
|
+
* Phase 88-03 -- recompile-room-references concurrent-worker driver
|
|
6
|
+
* =================================================================
|
|
7
|
+
* Standalone worker spawned by test 7 via child_process.fork. Calls
|
|
8
|
+
* recompile(sectionPath) exactly once then exits. Exit codes:
|
|
9
|
+
* 0 -- recompile succeeded
|
|
10
|
+
* 2 -- recompile skipped (mtime_conflict OR no_room_md, either is a
|
|
11
|
+
* valid outcome when multiple workers race on the same section)
|
|
12
|
+
* 1 -- recompile threw, or lock could not be acquired
|
|
13
|
+
*
|
|
14
|
+
* Written as a real file (not an inline template string) for
|
|
15
|
+
* cross-platform path-escape safety -- matches the pattern established
|
|
16
|
+
* in Phase 87-02 write-lock-atomic.worker.cjs.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
const path = require('node:path');
|
|
22
|
+
const recompiler = require(path.join(__dirname, '..', '..', 'scripts', 'recompile-room-references.cjs'));
|
|
23
|
+
|
|
24
|
+
const sectionPath = process.argv[2];
|
|
25
|
+
if (!sectionPath) {
|
|
26
|
+
process.stderr.write('usage: recompile-room-references.worker.cjs <sectionPath>\n');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const result = recompiler.recompile(sectionPath);
|
|
32
|
+
if (result && result.success === true) {
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
if (result && (result.reason === 'mtime_conflict' || result.reason === 'no_room_md')) {
|
|
36
|
+
process.exit(2);
|
|
37
|
+
}
|
|
38
|
+
process.exit(1);
|
|
39
|
+
} catch (e) {
|
|
40
|
+
process.stderr.write('[worker] ' + (e && e.message || e) + '\n');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|