onto-mcp 0.3.2 → 0.4.0
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/.onto/processes/reconstruct/actionable-ontology-seed-recomposition-design.md +447 -0
- package/.onto/processes/reconstruct/foundry-style-ontology-seed-contract.md +934 -0
- package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +303 -725
- package/.onto/processes/reconstruct/reconstruct-contract-registry.yaml +1645 -0
- package/.onto/processes/reconstruct/reconstruct-execution-ux-contract.md +26 -22
- package/.onto/processes/reconstruct/source-profile-contract.md +49 -23
- package/.onto/processes/reconstruct/source-profiles/code.md +6 -3
- package/.onto/processes/reconstruct/source-profiles/database.md +5 -2
- package/.onto/processes/reconstruct/source-profiles/document.md +5 -2
- package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +5 -4
- package/.onto/processes/review/review-execution-ux-contract.md +40 -0
- package/.onto/processes/shared/pipeline-execution-ledger-contract.md +26 -10
- package/.onto/processes/shared/target-material-kind-contract.md +29 -16
- package/AGENTS.md +6 -4
- package/README.md +135 -76
- package/dist/cli.js +8 -8
- package/dist/core-api/reconstruct-api.js +117 -31
- package/dist/core-api/review-api.js +47 -0
- package/dist/core-runtime/cli/codex-review-unit-executor.js +39 -2
- package/dist/core-runtime/cli/complete-review-session.js +2 -2
- package/dist/core-runtime/cli/mock-review-unit-executor.js +1 -1
- package/dist/core-runtime/cli/review-invoke.js +9 -9
- package/dist/core-runtime/cli/run-review-prompt-execution.js +39 -5
- package/dist/core-runtime/cli/spawn-watcher.js +266 -47
- package/dist/core-runtime/cli/start-review-session.js +3 -3
- package/dist/core-runtime/llm/llm-caller.js +11 -0
- package/dist/core-runtime/llm/llm-tool-loop.js +2 -0
- package/dist/core-runtime/observability/runtime-stream-observation.js +118 -0
- package/dist/core-runtime/onboard/cli-host.js +149 -0
- package/dist/core-runtime/onboard/host-target.js +22 -0
- package/dist/core-runtime/onboard/json-config-host.js +122 -0
- package/dist/core-runtime/onboard/path-scan.js +26 -0
- package/dist/core-runtime/onboard/prompt.js +51 -0
- package/dist/core-runtime/onboard/register.js +207 -0
- package/dist/core-runtime/onboard/types.js +27 -0
- package/dist/core-runtime/reconstruct/actionable-seed-validation.js +1777 -0
- package/dist/core-runtime/reconstruct/artifact-types.js +10 -4
- package/dist/core-runtime/reconstruct/contract-registry.js +623 -0
- package/dist/core-runtime/reconstruct/domain-id.js +10 -0
- package/dist/core-runtime/reconstruct/governing-snapshot.js +716 -0
- package/dist/core-runtime/reconstruct/material-profile-validation.js +191 -0
- package/dist/core-runtime/reconstruct/materialize-preparation.js +49 -11
- package/dist/core-runtime/reconstruct/pipeline-execution-ledger.js +269 -79
- package/dist/core-runtime/reconstruct/post-seed-validation.js +1194 -51
- package/dist/core-runtime/reconstruct/record.js +104 -20
- package/dist/core-runtime/reconstruct/run.js +2107 -413
- package/dist/core-runtime/reconstruct/seed-claim-projections.js +268 -0
- package/dist/core-runtime/reconstruct/source-profiles.js +93 -4
- package/dist/core-runtime/reconstruct/terminal-validation.js +807 -0
- package/dist/core-runtime/review/review-invocation-runner.js +4 -4
- package/dist/mcp/server.js +110 -38
- package/dist/mcp/tool-schemas.js +20 -6
- package/package.json +8 -17
- package/scripts/onto-review-watch.sh +486 -0
- package/scripts/onto-runtime-watch.sh +122 -0
- package/scripts/postinstall-hint.js +22 -0
- package/.onto/processes/reconstruct/top-level-concept-discovery-contract.md +0 -387
- package/dist/core-runtime/cli/bootstrap-review-binding.js +0 -186
- package/dist/core-runtime/cli/codex-nested-dispatch.test.js +0 -390
- package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +0 -335
- package/dist/core-runtime/cli/coordinator-helpers.js +0 -583
- package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +0 -167
- package/dist/core-runtime/cli/coordinator-state-machine.js +0 -794
- package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +0 -615
- package/dist/core-runtime/cli/e2e-start-review-session.test.js +0 -312
- package/dist/core-runtime/cli/health.js +0 -44
- package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +0 -567
- package/dist/core-runtime/cli/materialize-review-execution-preparation.js +0 -104
- package/dist/core-runtime/cli/migrate-session-roots.js +0 -118
- package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +0 -106
- package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +0 -268
- package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +0 -136
- package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +0 -201
- package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +0 -192
- package/dist/core-runtime/cli/session-root-guard.js +0 -168
- package/dist/core-runtime/cli/spawn-watcher.test.js +0 -457
- package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +0 -79
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +0 -412
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +0 -351
- package/dist/core-runtime/cli/topology-executor-mapping.js +0 -139
- package/dist/core-runtime/cli/topology-executor-mapping.test.js +0 -173
- package/dist/core-runtime/cli/write-review-interpretation.js +0 -81
- package/dist/core-runtime/config/onto-config-cli.js +0 -278
- package/dist/core-runtime/config/onto-config-key-path.js +0 -288
- package/dist/core-runtime/config/onto-config-key-path.test.js +0 -195
- package/dist/core-runtime/config/onto-config-preview.js +0 -108
- package/dist/core-runtime/config/onto-config-preview.test.js +0 -132
- package/dist/core-runtime/discovery/config-chain.js +0 -118
- package/dist/core-runtime/discovery/config-chain.test.js +0 -103
- package/dist/core-runtime/discovery/config-profile.js +0 -199
- package/dist/core-runtime/discovery/config-profile.test.js +0 -233
- package/dist/core-runtime/discovery/host-detection.test.js +0 -186
- package/dist/core-runtime/discovery/installation-paths.test.js +0 -65
- package/dist/core-runtime/discovery/lens-registry.test.js +0 -81
- package/dist/core-runtime/discovery/path-normalization.test.js +0 -22
- package/dist/core-runtime/discovery/plugin-path.js +0 -72
- package/dist/core-runtime/discovery/plugin-path.test.js +0 -95
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +0 -344
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +0 -915
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +0 -564
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +0 -708
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +0 -165
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +0 -227
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +0 -59
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +0 -205
- package/dist/core-runtime/evolve/adapters/methodology/adapter.js +0 -16
- package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +0 -9
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +0 -298
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +0 -70
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +0 -46
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +0 -73
- package/dist/core-runtime/evolve/adapters/registry.js +0 -47
- package/dist/core-runtime/evolve/adapters/registry.test.js +0 -67
- package/dist/core-runtime/evolve/cli.js +0 -256
- package/dist/core-runtime/evolve/commands/align.js +0 -194
- package/dist/core-runtime/evolve/commands/align.test.js +0 -82
- package/dist/core-runtime/evolve/commands/apply.js +0 -161
- package/dist/core-runtime/evolve/commands/apply.test.js +0 -138
- package/dist/core-runtime/evolve/commands/close.js +0 -39
- package/dist/core-runtime/evolve/commands/close.test.js +0 -99
- package/dist/core-runtime/evolve/commands/defer.js +0 -40
- package/dist/core-runtime/evolve/commands/defer.test.js +0 -134
- package/dist/core-runtime/evolve/commands/draft.js +0 -323
- package/dist/core-runtime/evolve/commands/draft.test.js +0 -178
- package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +0 -208
- package/dist/core-runtime/evolve/commands/error-messages.js +0 -125
- package/dist/core-runtime/evolve/commands/error-messages.test.js +0 -167
- package/dist/core-runtime/evolve/commands/propose-align.js +0 -222
- package/dist/core-runtime/evolve/commands/propose-align.test.js +0 -136
- package/dist/core-runtime/evolve/commands/reconstruct.js +0 -330
- package/dist/core-runtime/evolve/commands/reconstruct.test.js +0 -278
- package/dist/core-runtime/evolve/commands/shared.js +0 -22
- package/dist/core-runtime/evolve/commands/stale-check.js +0 -103
- package/dist/core-runtime/evolve/commands/stale-check.test.js +0 -84
- package/dist/core-runtime/evolve/commands/start.js +0 -887
- package/dist/core-runtime/evolve/commands/start.test.js +0 -396
- package/dist/core-runtime/evolve/config/project-config.js +0 -99
- package/dist/core-runtime/evolve/config/project-config.test.js +0 -170
- package/dist/core-runtime/evolve/renderers/align-packet.js +0 -280
- package/dist/core-runtime/evolve/renderers/align-packet.test.js +0 -332
- package/dist/core-runtime/evolve/renderers/draft-packet.js +0 -303
- package/dist/core-runtime/evolve/renderers/draft-packet.test.js +0 -377
- package/dist/core-runtime/evolve/renderers/format.js +0 -5
- package/dist/core-runtime/evolve/renderers/scope-md.js +0 -237
- package/dist/core-runtime/evolve/renderers/scope-md.test.js +0 -306
- package/dist/core-runtime/govern/cli.js +0 -369
- package/dist/core-runtime/govern/cli.test.js +0 -314
- package/dist/core-runtime/govern/drift-engine.js +0 -103
- package/dist/core-runtime/govern/drift-engine.test.js +0 -319
- package/dist/core-runtime/govern/promote-principle.js +0 -206
- package/dist/core-runtime/govern/promote-principle.test.js +0 -368
- package/dist/core-runtime/govern/queue.js +0 -81
- package/dist/core-runtime/govern/types.js +0 -16
- package/dist/core-runtime/install/cli.js +0 -530
- package/dist/core-runtime/install/detect.js +0 -128
- package/dist/core-runtime/install/detect.test.js +0 -155
- package/dist/core-runtime/install/gitignore-update.js +0 -74
- package/dist/core-runtime/install/gitignore-update.test.js +0 -64
- package/dist/core-runtime/install/install-integration.test.js +0 -373
- package/dist/core-runtime/install/prompts.js +0 -389
- package/dist/core-runtime/install/prompts.test.js +0 -293
- package/dist/core-runtime/install/types.js +0 -26
- package/dist/core-runtime/install/validation.js +0 -295
- package/dist/core-runtime/install/validation.test.js +0 -313
- package/dist/core-runtime/install/writer.js +0 -254
- package/dist/core-runtime/install/writer.test.js +0 -218
- package/dist/core-runtime/learning/extractor.js +0 -461
- package/dist/core-runtime/learning/feedback.js +0 -179
- package/dist/core-runtime/learning/health-report.js +0 -165
- package/dist/core-runtime/learning/health-report.test.js +0 -169
- package/dist/core-runtime/learning/loader.js +0 -388
- package/dist/core-runtime/learning/loader.test.js +0 -102
- package/dist/core-runtime/learning/promote/apply-state.js +0 -240
- package/dist/core-runtime/learning/promote/audit-obligation.js +0 -195
- package/dist/core-runtime/learning/promote/collector.js +0 -432
- package/dist/core-runtime/learning/promote/degraded-state.js +0 -125
- package/dist/core-runtime/learning/promote/domain-doc-proposer.js +0 -166
- package/dist/core-runtime/learning/promote/e2e-promote.test.js +0 -6385
- package/dist/core-runtime/learning/promote/health-snapshot.js +0 -150
- package/dist/core-runtime/learning/promote/insight-reclassifier.js +0 -544
- package/dist/core-runtime/learning/promote/judgment-auditor.js +0 -517
- package/dist/core-runtime/learning/promote/panel-reviewer.js +0 -1158
- package/dist/core-runtime/learning/promote/promote-executor.js +0 -1675
- package/dist/core-runtime/learning/promote/promoter.js +0 -307
- package/dist/core-runtime/learning/promote/retirement.js +0 -122
- package/dist/core-runtime/learning/promote/types.js +0 -23
- package/dist/core-runtime/learning/prompt-sections.js +0 -51
- package/dist/core-runtime/learning/shared/artifact-registry-init.js +0 -45
- package/dist/core-runtime/learning/shared/artifact-registry.js +0 -254
- package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +0 -73
- package/dist/core-runtime/learning/shared/audit-state.js +0 -99
- package/dist/core-runtime/learning/shared/duplicate-check.js +0 -28
- package/dist/core-runtime/learning/shared/llm-caller.js +0 -831
- package/dist/core-runtime/learning/shared/llm-caller.test.js +0 -601
- package/dist/core-runtime/learning/shared/llm-tool-loop.js +0 -393
- package/dist/core-runtime/learning/shared/mode.js +0 -25
- package/dist/core-runtime/learning/shared/paths.js +0 -84
- package/dist/core-runtime/learning/shared/paths.test.js +0 -79
- package/dist/core-runtime/learning/shared/patterns.js +0 -37
- package/dist/core-runtime/learning/shared/recoverability.js +0 -355
- package/dist/core-runtime/learning/shared/recovery-context.js +0 -374
- package/dist/core-runtime/learning/shared/scope.js +0 -1
- package/dist/core-runtime/learning/shared/semantic-classifier.js +0 -94
- package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +0 -42
- package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +0 -37
- package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +0 -39
- package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +0 -41
- package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +0 -38
- package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +0 -43
- package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +0 -113
- package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +0 -36
- package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +0 -48
- package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +0 -43
- package/dist/core-runtime/learning/shared/specs/spec-helpers.js +0 -64
- package/dist/core-runtime/learning/usage-tracker.js +0 -190
- package/dist/core-runtime/learning/usage-tracker.test.js +0 -176
- package/dist/core-runtime/onboard/detect-review-axes.js +0 -122
- package/dist/core-runtime/onboard/detect-review-axes.test.js +0 -127
- package/dist/core-runtime/onboard/write-review-block.js +0 -188
- package/dist/core-runtime/onboard/write-review-block.test.js +0 -240
- package/dist/core-runtime/readers/brownfield-builder.js +0 -150
- package/dist/core-runtime/readers/brownfield-builder.test.js +0 -136
- package/dist/core-runtime/readers/code-chunk-collector.js +0 -53
- package/dist/core-runtime/readers/code-chunk-collector.test.js +0 -136
- package/dist/core-runtime/readers/file-utils.js +0 -240
- package/dist/core-runtime/readers/file-utils.test.js +0 -146
- package/dist/core-runtime/readers/lexicon-citation-check.js +0 -93
- package/dist/core-runtime/readers/lexicon-citation-check.test.js +0 -77
- package/dist/core-runtime/readers/mcp-figma.js +0 -30
- package/dist/core-runtime/readers/mcp-figma.test.js +0 -82
- package/dist/core-runtime/readers/mcp-generic.js +0 -31
- package/dist/core-runtime/readers/mcp-generic.test.js +0 -76
- package/dist/core-runtime/readers/ontology-index.js +0 -148
- package/dist/core-runtime/readers/ontology-index.test.js +0 -245
- package/dist/core-runtime/readers/ontology-query.js +0 -168
- package/dist/core-runtime/readers/ontology-query.test.js +0 -311
- package/dist/core-runtime/readers/ontology-resolve.js +0 -48
- package/dist/core-runtime/readers/ontology-resolve.test.js +0 -48
- package/dist/core-runtime/readers/patterns/index.js +0 -7
- package/dist/core-runtime/readers/review-log.js +0 -213
- package/dist/core-runtime/readers/review-log.test.js +0 -313
- package/dist/core-runtime/readers/scan-local.js +0 -102
- package/dist/core-runtime/readers/scan-local.test.js +0 -102
- package/dist/core-runtime/readers/scan-tarball.js +0 -121
- package/dist/core-runtime/readers/scan-tarball.test.js +0 -283
- package/dist/core-runtime/readers/scan-vault.js +0 -34
- package/dist/core-runtime/readers/scan-vault.test.js +0 -81
- package/dist/core-runtime/readers/types.js +0 -42
- package/dist/core-runtime/readers/types.test.js +0 -94
- package/dist/core-runtime/readers/viewpoint-collectors.js +0 -229
- package/dist/core-runtime/reconstruct/seed-candidate-validation.js +0 -385
- package/dist/core-runtime/review/citation-audit.test.js +0 -165
- package/dist/core-runtime/review/execution-plan-resolver.js +0 -247
- package/dist/core-runtime/review/execution-plan-resolver.test.js +0 -243
- package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +0 -246
- package/dist/core-runtime/review/execution-topology-resolver.js +0 -401
- package/dist/core-runtime/review/execution-topology-resolver.test.js +0 -315
- package/dist/core-runtime/review/inline-context-embedder.test.js +0 -154
- package/dist/core-runtime/review/legacy-mode-policy.js +0 -88
- package/dist/core-runtime/review/materializers-effort-persist.test.js +0 -79
- package/dist/core-runtime/review/ontology-path-classifier.js +0 -179
- package/dist/core-runtime/review/ontology-path-classifier.test.js +0 -216
- package/dist/core-runtime/review/packet-boundary-policy.test.js +0 -107
- package/dist/core-runtime/review/participating-lens-paths.test.js +0 -73
- package/dist/core-runtime/review/review-config-legacy-translate.js +0 -244
- package/dist/core-runtime/review/review-config-legacy-translate.test.js +0 -161
- package/dist/core-runtime/review/review-config-validator.js +0 -289
- package/dist/core-runtime/review/review-config-validator.test.js +0 -236
- package/dist/core-runtime/review/shape-pipeline-audit.test.js +0 -311
- package/dist/core-runtime/review/shape-to-topology-id.js +0 -117
- package/dist/core-runtime/review/shape-to-topology-id.test.js +0 -132
- package/dist/core-runtime/review/topology-shape-derivation.js +0 -155
- package/dist/core-runtime/review/topology-shape-derivation.test.js +0 -195
- package/dist/core-runtime/scope-runtime/constants.js +0 -12
- package/dist/core-runtime/scope-runtime/constraint-pool.js +0 -166
- package/dist/core-runtime/scope-runtime/constraint-pool.test.js +0 -674
- package/dist/core-runtime/scope-runtime/domain-validation-log.js +0 -135
- package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +0 -156
- package/dist/core-runtime/scope-runtime/eval-persistence.js +0 -65
- package/dist/core-runtime/scope-runtime/eval-persistence.test.js +0 -84
- package/dist/core-runtime/scope-runtime/event-pipeline.js +0 -64
- package/dist/core-runtime/scope-runtime/event-pipeline.test.js +0 -450
- package/dist/core-runtime/scope-runtime/event-store.js +0 -39
- package/dist/core-runtime/scope-runtime/event-store.test.js +0 -95
- package/dist/core-runtime/scope-runtime/gate-guard.js +0 -348
- package/dist/core-runtime/scope-runtime/gate-guard.test.js +0 -1047
- package/dist/core-runtime/scope-runtime/hash.js +0 -4
- package/dist/core-runtime/scope-runtime/hash.test.js +0 -33
- package/dist/core-runtime/scope-runtime/id.js +0 -4
- package/dist/core-runtime/scope-runtime/id.test.js +0 -17
- package/dist/core-runtime/scope-runtime/reducer.js +0 -297
- package/dist/core-runtime/scope-runtime/reducer.test.js +0 -759
- package/dist/core-runtime/scope-runtime/scope-manager.js +0 -161
- package/dist/core-runtime/scope-runtime/state-machine.js +0 -309
- package/dist/core-runtime/scope-runtime/state-machine.test.js +0 -704
- package/dist/core-runtime/scope-runtime/types.js +0 -116
- package/dist/core-runtime/scope-runtime/types.test.js +0 -69
- package/dist/core-runtime/translate/render-for-user.js +0 -169
- package/dist/core-runtime/translate/render-for-user.test.js +0 -122
- package/dist/providers/capability-contract.js +0 -1
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* start-review-session — focused E2E test suite.
|
|
3
|
-
*
|
|
4
|
-
* Run: `npx vitest run src/core-runtime/cli/e2e-start-review-session.test.ts`
|
|
5
|
-
*
|
|
6
|
-
* Scope:
|
|
7
|
-
* Direct tests for resolveReviewSessionExtractMode — the helper that
|
|
8
|
-
* picks an extract mode from (env var > config.yml > default). The
|
|
9
|
-
* helper is exercised in isolation so the rest of startReviewSession
|
|
10
|
-
* (prepare + materialize + metadata I/O) does not need fixture setup.
|
|
11
|
-
*
|
|
12
|
-
* Isolation strategy:
|
|
13
|
-
* Each test builds a fake `ontoHome` tmpdir containing just enough to
|
|
14
|
-
* satisfy resolveOntoHome's validity check (package.json + roles/ or
|
|
15
|
-
* .onto/roles/ + .onto/authority/), then a separate `projectRoot` tmpdir with
|
|
16
|
-
* the config file under test. The `--onto-home` argv flag forces the
|
|
17
|
-
* resolver to use the fake ontoHome instead of walking up from the
|
|
18
|
-
* test's script directory (which would find the real repo and pick up
|
|
19
|
-
* the repo's live config.yml).
|
|
20
|
-
*
|
|
21
|
-
* Dual-layout coverage (Phase 3+):
|
|
22
|
-
* The main test block runs under `describe.each(["legacy", "phase3"])`.
|
|
23
|
-
* Each case rebuilds the fake ontoHome with the chosen roles layout —
|
|
24
|
-
* "legacy" writes top-level `roles/` (pre-Phase-3 shape), "phase3"
|
|
25
|
-
* writes `.onto/roles/` (Phase-3 canonical). This exercises isOntoRoot's
|
|
26
|
-
* dual-marker acceptance on both sides, not just the legacy fallback
|
|
27
|
-
* that Phase 7 will eventually remove.
|
|
28
|
-
*
|
|
29
|
-
* Format history:
|
|
30
|
-
* Converted from a tsx-run custom minimal test runner to vitest in
|
|
31
|
-
* 2026-04-18 (handoff §2 Priority 2 Phase B). See commit message for
|
|
32
|
-
* diagnosis of the PR #96 / PR #113 regression fixed alongside this
|
|
33
|
-
* conversion (resolveOrthogonalConfigChain). Parameterized across
|
|
34
|
-
* dual-path role layouts in 2026-04-21 (PR #170 Codex F-4 resolve).
|
|
35
|
-
*/
|
|
36
|
-
import { describe, it } from "vitest";
|
|
37
|
-
import fs from "node:fs";
|
|
38
|
-
import os from "node:os";
|
|
39
|
-
import path from "node:path";
|
|
40
|
-
import { resolveReviewSessionExtractMode } from "./start-review-session.js";
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
// Test helpers
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
function assert(condition, message) {
|
|
45
|
-
if (!condition)
|
|
46
|
-
throw new Error(message);
|
|
47
|
-
}
|
|
48
|
-
function assertEqual(actual, expected, message) {
|
|
49
|
-
if (actual !== expected) {
|
|
50
|
-
throw new Error(`${message} — expected ${JSON.stringify(expected)} got ${JSON.stringify(actual)}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
// Fixture helpers
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
function makeTmpDir(prefix) {
|
|
57
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), `onto-e2e-srs-${prefix}-`));
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Build a tmpdir that passes `isOntoRoot` validation: needs
|
|
61
|
-
* package.json with name "onto-core" AND (roles/ or .onto/roles/) AND
|
|
62
|
-
* .onto/authority/. The `layout` option selects which roles path is created
|
|
63
|
-
* so both branches of the dual-path fallback are exercised.
|
|
64
|
-
*/
|
|
65
|
-
function makeFakeOntoHome(prefix, opts = {}) {
|
|
66
|
-
const { homeConfigExtractMode } = opts;
|
|
67
|
-
const dir = makeTmpDir(prefix);
|
|
68
|
-
fs.writeFileSync(path.join(dir, "package.json"), JSON.stringify({ name: "onto-core", version: "0.0.0-test" }), "utf8");
|
|
69
|
-
fs.mkdirSync(path.join(dir, ".onto", "roles"), { recursive: true });
|
|
70
|
-
fs.mkdirSync(path.join(dir, ".onto", "authority"), { recursive: true });
|
|
71
|
-
if (homeConfigExtractMode !== undefined) {
|
|
72
|
-
fs.mkdirSync(path.join(dir, ".onto"), { recursive: true });
|
|
73
|
-
fs.writeFileSync(path.join(dir, ".onto", "config.yml"), `learning_extract_mode: ${homeConfigExtractMode}\n`, "utf8");
|
|
74
|
-
}
|
|
75
|
-
return dir;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Build a projectRoot tmpdir. When `configExtractMode` is provided,
|
|
79
|
-
* writes .onto/config.yml with that value. When `configExtractMode`
|
|
80
|
-
* is the sentinel `"<MISSING_FIELD>"`, writes a config with other
|
|
81
|
-
* fields but NO `learning_extract_mode` key. When `configExtractMode`
|
|
82
|
-
* is undefined, writes NO config.yml at all.
|
|
83
|
-
*/
|
|
84
|
-
function makeProjectRoot(prefix, configExtractMode) {
|
|
85
|
-
const dir = makeTmpDir(prefix);
|
|
86
|
-
if (configExtractMode === "<MISSING_FIELD>") {
|
|
87
|
-
fs.mkdirSync(path.join(dir, ".onto"), { recursive: true });
|
|
88
|
-
fs.writeFileSync(path.join(dir, ".onto", "config.yml"), "output_language: en\n", // some other field, no learning_extract_mode
|
|
89
|
-
"utf8");
|
|
90
|
-
}
|
|
91
|
-
else if (configExtractMode !== undefined) {
|
|
92
|
-
fs.mkdirSync(path.join(dir, ".onto"), { recursive: true });
|
|
93
|
-
fs.writeFileSync(path.join(dir, ".onto", "config.yml"), `learning_extract_mode: ${configExtractMode}\n`, "utf8");
|
|
94
|
-
}
|
|
95
|
-
return dir;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Save and restore the ONTO_LEARNING_EXTRACT_MODE env var so tests
|
|
99
|
-
* don't pollute each other or the host process.
|
|
100
|
-
*/
|
|
101
|
-
function withEnvExtractMode(value, fn) {
|
|
102
|
-
const prev = process.env.ONTO_LEARNING_EXTRACT_MODE;
|
|
103
|
-
if (value === undefined)
|
|
104
|
-
delete process.env.ONTO_LEARNING_EXTRACT_MODE;
|
|
105
|
-
else
|
|
106
|
-
process.env.ONTO_LEARNING_EXTRACT_MODE = value;
|
|
107
|
-
return Promise.resolve()
|
|
108
|
-
.then(fn)
|
|
109
|
-
.finally(() => {
|
|
110
|
-
if (prev === undefined)
|
|
111
|
-
delete process.env.ONTO_LEARNING_EXTRACT_MODE;
|
|
112
|
-
else
|
|
113
|
-
process.env.ONTO_LEARNING_EXTRACT_MODE = prev;
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
// ---------------------------------------------------------------------------
|
|
117
|
-
// Parameterized tests — each case runs under both roles layouts.
|
|
118
|
-
// ---------------------------------------------------------------------------
|
|
119
|
-
describe.each(["phase3"])("start-review-session E2E (layout=%s)", (layout) => {
|
|
120
|
-
// E-SRS-1 — env var set → env var wins even if config has a different value.
|
|
121
|
-
// Primary proof that ONTO_LEARNING_EXTRACT_MODE has highest
|
|
122
|
-
// precedence.
|
|
123
|
-
it("E-SRS-1 env var wins over project config", async () => {
|
|
124
|
-
const ontoHome = makeFakeOntoHome("e-srs-1-home", { layout });
|
|
125
|
-
const projectRoot = makeProjectRoot("e-srs-1-proj", "active");
|
|
126
|
-
const argv = ["--onto-home", ontoHome];
|
|
127
|
-
await withEnvExtractMode("shadow", async () => {
|
|
128
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
129
|
-
assertEqual(mode, "shadow", "env shadow beats config active");
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
// E-SRS-2 — env var unset, project config has learning_extract_mode: shadow
|
|
133
|
-
// → resolver picks the config value.
|
|
134
|
-
it("E-SRS-2 project config value used when env var is unset", async () => {
|
|
135
|
-
const ontoHome = makeFakeOntoHome("e-srs-2-home", { layout });
|
|
136
|
-
const projectRoot = makeProjectRoot("e-srs-2-proj", "shadow");
|
|
137
|
-
const argv = ["--onto-home", ontoHome];
|
|
138
|
-
await withEnvExtractMode(undefined, async () => {
|
|
139
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
140
|
-
assertEqual(mode, "shadow", "config shadow used");
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
// E-SRS-3 — env var set to the empty string → treated the same as unset.
|
|
144
|
-
// The check `envExtractMode.length === 0` is what makes an
|
|
145
|
-
// empty env var fall through to config.
|
|
146
|
-
it("E-SRS-3 empty env var falls through to project config", async () => {
|
|
147
|
-
const ontoHome = makeFakeOntoHome("e-srs-3-home", { layout });
|
|
148
|
-
const projectRoot = makeProjectRoot("e-srs-3-proj", "active");
|
|
149
|
-
const argv = ["--onto-home", ontoHome];
|
|
150
|
-
await withEnvExtractMode("", async () => {
|
|
151
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
152
|
-
assertEqual(mode, "active", "empty env var yields to config active");
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
// E-SRS-4 — env var unset + project config has NO learning_extract_mode
|
|
156
|
-
// field → falls through to validateExtractMode's default "disabled".
|
|
157
|
-
it("E-SRS-4 missing config field defaults to disabled", async () => {
|
|
158
|
-
const ontoHome = makeFakeOntoHome("e-srs-4-home", { layout });
|
|
159
|
-
const projectRoot = makeProjectRoot("e-srs-4-proj", "<MISSING_FIELD>");
|
|
160
|
-
const argv = ["--onto-home", ontoHome];
|
|
161
|
-
await withEnvExtractMode(undefined, async () => {
|
|
162
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
163
|
-
assertEqual(mode, "disabled", "no field → default disabled");
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
// E-SRS-5 — env var unset + project has NO .onto/config.yml file at all
|
|
167
|
-
// → readConfigAt returns {}, resolver falls through to default.
|
|
168
|
-
it("E-SRS-5 no project config file defaults to disabled", async () => {
|
|
169
|
-
const ontoHome = makeFakeOntoHome("e-srs-5-home", { layout });
|
|
170
|
-
const projectRoot = makeProjectRoot("e-srs-5-proj"); // no config.yml
|
|
171
|
-
const argv = ["--onto-home", ontoHome];
|
|
172
|
-
await withEnvExtractMode(undefined, async () => {
|
|
173
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
174
|
-
assertEqual(mode, "disabled", "no config file → default disabled");
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
// E-SRS-6 — project config has an INVALID learning_extract_mode value →
|
|
178
|
-
// resolver throws via validateExtractMode. Fail-fast, no silent
|
|
179
|
-
// fallback to default.
|
|
180
|
-
it("E-SRS-6 invalid config value fails fast", async () => {
|
|
181
|
-
const ontoHome = makeFakeOntoHome("e-srs-6-home", { layout });
|
|
182
|
-
const projectRoot = makeProjectRoot("e-srs-6-proj", "not-a-real-mode");
|
|
183
|
-
const argv = ["--onto-home", ontoHome];
|
|
184
|
-
let caught = null;
|
|
185
|
-
await withEnvExtractMode(undefined, async () => {
|
|
186
|
-
try {
|
|
187
|
-
await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
188
|
-
}
|
|
189
|
-
catch (e) {
|
|
190
|
-
caught = e;
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
assert(caught instanceof Error, "invalid config throws");
|
|
194
|
-
assert(caught.message.includes("not-a-real-mode"), "error names the bad value");
|
|
195
|
-
assert(caught.message.toLowerCase().includes("invalid"), "error explains invalid");
|
|
196
|
-
});
|
|
197
|
-
// E-SRS-7 — env var set to an INVALID value → resolver throws. Regression:
|
|
198
|
-
// this was the existing behavior before the config field was
|
|
199
|
-
// added, verify it still holds when config is ALSO present.
|
|
200
|
-
it("E-SRS-7 invalid env var fails fast (overrides config)", async () => {
|
|
201
|
-
const ontoHome = makeFakeOntoHome("e-srs-7-home", { layout });
|
|
202
|
-
const projectRoot = makeProjectRoot("e-srs-7-proj", "shadow"); // valid config
|
|
203
|
-
const argv = ["--onto-home", ontoHome];
|
|
204
|
-
let caught = null;
|
|
205
|
-
await withEnvExtractMode("totally-bogus", async () => {
|
|
206
|
-
try {
|
|
207
|
-
await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
208
|
-
}
|
|
209
|
-
catch (e) {
|
|
210
|
-
caught = e;
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
assert(caught instanceof Error, "invalid env var throws");
|
|
214
|
-
assert(caught.message.includes("totally-bogus"), "error names the env var bad value, not the config value");
|
|
215
|
-
});
|
|
216
|
-
// E-SRS-8 — home-level config has shadow + project config has active →
|
|
217
|
-
// project wins (resolveConfigChain merge order). Exercises the
|
|
218
|
-
// 4-tier merge so this test also pins the chain semantics for
|
|
219
|
-
// the new field.
|
|
220
|
-
it("E-SRS-8 project config overrides home config for extract mode", async () => {
|
|
221
|
-
const ontoHome = makeFakeOntoHome("e-srs-8-home", {
|
|
222
|
-
layout,
|
|
223
|
-
homeConfigExtractMode: "shadow",
|
|
224
|
-
});
|
|
225
|
-
const projectRoot = makeProjectRoot("e-srs-8-proj", "active");
|
|
226
|
-
const argv = ["--onto-home", ontoHome];
|
|
227
|
-
await withEnvExtractMode(undefined, async () => {
|
|
228
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
229
|
-
assertEqual(mode, "active", "project active overrides home shadow");
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
// E-SRS-9 — home-level config has shadow + project config missing field →
|
|
233
|
-
// home value is used (merge surfaces homeConfig's value when
|
|
234
|
-
// projectConfig has no field to override with).
|
|
235
|
-
it("E-SRS-9 home config value used when project has no field", async () => {
|
|
236
|
-
const ontoHome = makeFakeOntoHome("e-srs-9-home", {
|
|
237
|
-
layout,
|
|
238
|
-
homeConfigExtractMode: "shadow",
|
|
239
|
-
});
|
|
240
|
-
const projectRoot = makeProjectRoot("e-srs-9-proj", "<MISSING_FIELD>");
|
|
241
|
-
const argv = ["--onto-home", ontoHome];
|
|
242
|
-
await withEnvExtractMode(undefined, async () => {
|
|
243
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
244
|
-
assertEqual(mode, "shadow", "home shadow surfaces when project has no field");
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
// E-SRS-11 — env unset + project has MALFORMED .onto/config.yml (invalid
|
|
248
|
-
// YAML that fails to parse) → resolver swallows the read/parse
|
|
249
|
-
// failure and falls through to default "disabled". Pins the
|
|
250
|
-
// narrowed try/catch contract: only config read/parse is
|
|
251
|
-
// best-effort. Regression lock for the review's coverage gap:
|
|
252
|
-
// previously no test directly exercised the catch branch.
|
|
253
|
-
it("E-SRS-11 malformed project config falls through to default", async () => {
|
|
254
|
-
const ontoHome = makeFakeOntoHome("e-srs-11-home", { layout });
|
|
255
|
-
const projectRoot = makeTmpDir("e-srs-11-proj");
|
|
256
|
-
fs.mkdirSync(path.join(projectRoot, ".onto"), { recursive: true });
|
|
257
|
-
// Write syntactically invalid YAML. `yaml` parser will throw on the
|
|
258
|
-
// unclosed flow mapping / mismatched indentation below.
|
|
259
|
-
fs.writeFileSync(path.join(projectRoot, ".onto", "config.yml"), "learning_extract_mode: [unterminated\n : : : not valid yaml\n", "utf8");
|
|
260
|
-
const argv = ["--onto-home", ontoHome];
|
|
261
|
-
await withEnvExtractMode(undefined, async () => {
|
|
262
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
263
|
-
assertEqual(mode, "disabled", "malformed config read/parse failure → default disabled");
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
// ---------------------------------------------------------------------------
|
|
268
|
-
// Layout-independent tests — the bogus-onto-home path does not construct a
|
|
269
|
-
// valid installation, so the roles layout option does not apply here.
|
|
270
|
-
// ---------------------------------------------------------------------------
|
|
271
|
-
describe("start-review-session E2E (layout-independent)", () => {
|
|
272
|
-
// E-SRS-10 — invalid --onto-home (directory exists but fails isOntoRoot)
|
|
273
|
-
// → resolveOntoHome throws a HARD error. The resolver MUST NOT
|
|
274
|
-
// silently fall through to default "disabled". Pins the
|
|
275
|
-
// exception-boundary contract: resolveOntoHome is called OUTSIDE
|
|
276
|
-
// the swallowed try, so invalid --onto-home surfaces as a startup
|
|
277
|
-
// error. Regression lock for the 9-lens consensus finding.
|
|
278
|
-
it("E-SRS-10 invalid --onto-home fails fast (not swallowed)", async () => {
|
|
279
|
-
// A real directory that is NOT an onto root (no package.json with
|
|
280
|
-
// name "onto-core", no roles/ or .onto/roles/, no .onto/authority/).
|
|
281
|
-
const bogusOntoHome = makeTmpDir("e-srs-10-bogus-home");
|
|
282
|
-
const projectRoot = makeProjectRoot("e-srs-10-proj", "shadow");
|
|
283
|
-
const argv = ["--onto-home", bogusOntoHome];
|
|
284
|
-
let caught = null;
|
|
285
|
-
await withEnvExtractMode(undefined, async () => {
|
|
286
|
-
try {
|
|
287
|
-
await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
288
|
-
}
|
|
289
|
-
catch (e) {
|
|
290
|
-
caught = e;
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
assert(caught instanceof Error, "invalid --onto-home must throw, not fall through to default");
|
|
294
|
-
assert(caught.message.toLowerCase().includes("onto"), "error mentions onto-home / onto root context");
|
|
295
|
-
});
|
|
296
|
-
// E-SRS-11 — Phase 6 review follow-up (UNIQ-U1). Prior fixtures only
|
|
297
|
-
// created legacy `authority/`. Pin canonical `.onto/authority/` as a
|
|
298
|
-
// valid onto-home marker via the end-to-end resolver path (not just
|
|
299
|
-
// isOntoRoot unit tests).
|
|
300
|
-
it("E-SRS-11 canonical .onto/authority/ is accepted by resolveOntoHome (Phase 6)", async () => {
|
|
301
|
-
const ontoHome = makeFakeOntoHome("e-srs-11-home", {
|
|
302
|
-
layout: "phase3",
|
|
303
|
-
authorityLayout: "phase6",
|
|
304
|
-
});
|
|
305
|
-
const projectRoot = makeProjectRoot("e-srs-11-proj", "active");
|
|
306
|
-
const argv = ["--onto-home", ontoHome];
|
|
307
|
-
await withEnvExtractMode(undefined, async () => {
|
|
308
|
-
const mode = await resolveReviewSessionExtractMode(argv, projectRoot);
|
|
309
|
-
assertEqual(mode, "active", "resolver accepts canonical phase6 authority layout");
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
});
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Learning health CLI adapter.
|
|
3
|
-
*
|
|
4
|
-
* Design authority: .onto/processes/learn/health.md (rule owner)
|
|
5
|
-
*
|
|
6
|
-
* Responsibility:
|
|
7
|
-
* - Parse target (global | project) from argv
|
|
8
|
-
* - Load learning items via collector (reads files)
|
|
9
|
-
* - Delegate aggregation + rendering to learning/health-report.ts
|
|
10
|
-
* - Write markdown dashboard to stdout
|
|
11
|
-
*
|
|
12
|
-
* Scope: read-only. Does not mutate learning files.
|
|
13
|
-
*/
|
|
14
|
-
import { resolveProjectRoot } from "../discovery/project-root.js";
|
|
15
|
-
import { collect } from "../learning/promote/collector.js";
|
|
16
|
-
import { buildHealthReport, renderHealthReport, } from "../learning/health-report.js";
|
|
17
|
-
function parseTarget(argv) {
|
|
18
|
-
for (const arg of argv) {
|
|
19
|
-
if (arg === "project" || arg === "--project")
|
|
20
|
-
return "project";
|
|
21
|
-
if (arg === "global" || arg === "--global")
|
|
22
|
-
return "global";
|
|
23
|
-
}
|
|
24
|
-
return "global";
|
|
25
|
-
}
|
|
26
|
-
function resolveProjectRootFromArgv(argv) {
|
|
27
|
-
const idx = argv.indexOf("--project-root");
|
|
28
|
-
if (idx >= 0 && idx + 1 < argv.length) {
|
|
29
|
-
const value = argv[idx + 1];
|
|
30
|
-
if (typeof value === "string" && value.length > 0)
|
|
31
|
-
return value;
|
|
32
|
-
}
|
|
33
|
-
return resolveProjectRoot();
|
|
34
|
-
}
|
|
35
|
-
export async function handleHealth(ontoHome, argv) {
|
|
36
|
-
void ontoHome;
|
|
37
|
-
const target = parseTarget(argv);
|
|
38
|
-
const projectRoot = resolveProjectRootFromArgv(argv);
|
|
39
|
-
const result = collect({ mode: "promote", projectRoot });
|
|
40
|
-
const items = target === "project" ? result.project_items : result.global_items;
|
|
41
|
-
const report = buildHealthReport(items, target);
|
|
42
|
-
console.log(renderHealthReport(report));
|
|
43
|
-
return 0;
|
|
44
|
-
}
|