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
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
4
|
+
import { isTargetMaterialKind, } from "../target-material-kind.js";
|
|
5
|
+
import { loadReconstructContractRegistry, resolveRegistryRef, } from "./contract-registry.js";
|
|
6
|
+
function isoNow() {
|
|
7
|
+
return new Date().toISOString();
|
|
8
|
+
}
|
|
9
|
+
function violation(args) {
|
|
10
|
+
return {
|
|
11
|
+
code: args.code,
|
|
12
|
+
message: args.message,
|
|
13
|
+
subject_id: args.subjectId ?? null,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async function readYamlDocument(filePath) {
|
|
17
|
+
return parseYaml(await fs.readFile(filePath, "utf8"));
|
|
18
|
+
}
|
|
19
|
+
async function writeYamlDocument(filePath, value) {
|
|
20
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
21
|
+
await fs.writeFile(filePath, stringifyYaml(value), "utf8");
|
|
22
|
+
}
|
|
23
|
+
function sourceProfileKey(args) {
|
|
24
|
+
return `${args.profile_id}\u0000${args.target_material_kind}`;
|
|
25
|
+
}
|
|
26
|
+
function sourceProfileRecordsByKey(registry) {
|
|
27
|
+
return new Map(registry.source_profile_records.map((record) => [
|
|
28
|
+
sourceProfileKey(record),
|
|
29
|
+
record,
|
|
30
|
+
]));
|
|
31
|
+
}
|
|
32
|
+
function projectRootFromRegistryPath(registryPath) {
|
|
33
|
+
if (!registryPath)
|
|
34
|
+
return process.cwd();
|
|
35
|
+
return path.resolve(path.dirname(registryPath), "../../..");
|
|
36
|
+
}
|
|
37
|
+
function requiredSelectedProfileFields(registry) {
|
|
38
|
+
const fields = registry.version_policy?.selected_source_profile_snapshot_required_fields;
|
|
39
|
+
if (!fields || fields.length === 0) {
|
|
40
|
+
throw new Error("registry version_policy.selected_source_profile_snapshot_required_fields is required");
|
|
41
|
+
}
|
|
42
|
+
return fields;
|
|
43
|
+
}
|
|
44
|
+
function selectedProfileFieldMissing(selected, field) {
|
|
45
|
+
return selected[field] === undefined;
|
|
46
|
+
}
|
|
47
|
+
export function validateTargetMaterialProfile(args) {
|
|
48
|
+
const profile = args.targetMaterialProfile;
|
|
49
|
+
const violations = [];
|
|
50
|
+
const projectRoot = projectRootFromRegistryPath(args.registryRef);
|
|
51
|
+
if (!isTargetMaterialKind(profile.target_material_kind)) {
|
|
52
|
+
violations.push(violation({
|
|
53
|
+
code: "schema_shape_invalid",
|
|
54
|
+
message: `invalid target_material_kind: ${profile.target_material_kind}`,
|
|
55
|
+
subjectId: "target_material_kind",
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
const targetKindRecord = args.contractRegistry.source_profile_records.find((record) => record.target_material_kind === profile.target_material_kind);
|
|
59
|
+
if (!targetKindRecord) {
|
|
60
|
+
violations.push(violation({
|
|
61
|
+
code: "target_kind_registry_record_missing",
|
|
62
|
+
message: `target material kind has no registry source_profile_records row: ${profile.target_material_kind}`,
|
|
63
|
+
subjectId: profile.target_material_kind,
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
if (profile.target_refs.length === 0) {
|
|
67
|
+
violations.push(violation({
|
|
68
|
+
code: "target_refs_empty",
|
|
69
|
+
message: "target material profile must include at least one target ref",
|
|
70
|
+
subjectId: "target_refs",
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
const detectionRefs = new Set(profile.detection.per_ref.map((detection) => path.resolve(detection.ref)));
|
|
74
|
+
for (const targetRef of profile.target_refs) {
|
|
75
|
+
if (!detectionRefs.has(path.resolve(targetRef))) {
|
|
76
|
+
violations.push(violation({
|
|
77
|
+
code: "detection_ref_mismatch",
|
|
78
|
+
message: `target ref has no matching detection row: ${targetRef}`,
|
|
79
|
+
subjectId: targetRef,
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (profile.target_material_kind === "mixed") {
|
|
84
|
+
const selectedKinds = new Set(profile.selected_source_profiles.map((selected) => selected.target_material_kind));
|
|
85
|
+
if (!selectedKinds.has("mixed")) {
|
|
86
|
+
violations.push(violation({
|
|
87
|
+
code: "mixed_candidate_profile_missing",
|
|
88
|
+
message: "mixed material profiles must include the registry mixed-source-profile row as the composite authority record",
|
|
89
|
+
subjectId: "mixed",
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
for (const candidate of profile.target_material_kind_candidates) {
|
|
93
|
+
if (!selectedKinds.has(candidate)) {
|
|
94
|
+
violations.push(violation({
|
|
95
|
+
code: "mixed_candidate_profile_missing",
|
|
96
|
+
message: `mixed material profile is missing per-member selected source profile for ${candidate}`,
|
|
97
|
+
subjectId: candidate,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (profile.support_status === "supported" ||
|
|
103
|
+
profile.support_status === "partial" ||
|
|
104
|
+
profile.support_status === "supported_composite" ||
|
|
105
|
+
profile.support_status === "partial_composite") {
|
|
106
|
+
if (profile.selected_source_profiles.length === 0) {
|
|
107
|
+
violations.push(violation({
|
|
108
|
+
code: "selected_profile_missing",
|
|
109
|
+
message: "supported material profile must select at least one source profile",
|
|
110
|
+
subjectId: "selected_source_profiles",
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if ((profile.support_status === "unsupported" ||
|
|
115
|
+
profile.support_status === "unknown" ||
|
|
116
|
+
profile.support_status === "reserved_future") &&
|
|
117
|
+
!profile.unsupported_reason) {
|
|
118
|
+
violations.push(violation({
|
|
119
|
+
code: "unsupported_reason_missing",
|
|
120
|
+
message: "unsupported, unknown, or future-reserved material profiles must explain unsupported_reason",
|
|
121
|
+
subjectId: "unsupported_reason",
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
const registryProfiles = sourceProfileRecordsByKey(args.contractRegistry);
|
|
125
|
+
const requiredFields = requiredSelectedProfileFields(args.contractRegistry);
|
|
126
|
+
for (const selected of profile.selected_source_profiles) {
|
|
127
|
+
for (const field of requiredFields) {
|
|
128
|
+
if (selectedProfileFieldMissing(selected, field)) {
|
|
129
|
+
violations.push(violation({
|
|
130
|
+
code: "selected_profile_required_field_missing",
|
|
131
|
+
message: `selected source profile ${selected.profile_id} is missing required snapshot field: ${field}`,
|
|
132
|
+
subjectId: selected.profile_id,
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const registryRecord = registryProfiles.get(sourceProfileKey(selected));
|
|
137
|
+
if (!registryRecord) {
|
|
138
|
+
violations.push(violation({
|
|
139
|
+
code: "selected_profile_registry_mismatch",
|
|
140
|
+
message: `selected source profile is not present in registry: ${selected.profile_id}`,
|
|
141
|
+
subjectId: selected.profile_id,
|
|
142
|
+
}));
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const expectedProfileRef = registryRecord.definition_ref === null
|
|
146
|
+
? `registry:${registryRecord.profile_id}`
|
|
147
|
+
: resolveRegistryRef({
|
|
148
|
+
projectRoot,
|
|
149
|
+
ref: registryRecord.definition_ref,
|
|
150
|
+
});
|
|
151
|
+
const mismatchedFields = [...requiredFields, "profile_ref"].filter((field) => field === "profile_ref"
|
|
152
|
+
? selected.profile_ref !== expectedProfileRef
|
|
153
|
+
: JSON.stringify(selected[field]) !==
|
|
154
|
+
JSON.stringify(registryRecord[field]));
|
|
155
|
+
if (mismatchedFields.length > 0) {
|
|
156
|
+
violations.push(violation({
|
|
157
|
+
code: "selected_profile_registry_mismatch",
|
|
158
|
+
message: `selected source profile ${selected.profile_id} does not match registry fields: ${mismatchedFields.join(", ")}`,
|
|
159
|
+
subjectId: selected.profile_id,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
schema_version: "1",
|
|
165
|
+
session_id: profile.session_id,
|
|
166
|
+
created_at: isoNow(),
|
|
167
|
+
target_material_profile_ref: args.targetMaterialProfileRef ?? null,
|
|
168
|
+
registry_ref: args.registryRef ?? null,
|
|
169
|
+
validation_status: violations.length === 0 ? "valid" : "invalid",
|
|
170
|
+
target_ref_count: profile.target_refs.length,
|
|
171
|
+
selected_source_profile_count: profile.selected_source_profiles.length,
|
|
172
|
+
validation_results: violations.length === 0
|
|
173
|
+
? ["target_material_profile_valid"]
|
|
174
|
+
: ["target_material_profile_invalid"],
|
|
175
|
+
violations,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export async function writeTargetMaterialProfileValidationArtifact(args) {
|
|
179
|
+
const [targetMaterialProfile, contractRegistry] = await Promise.all([
|
|
180
|
+
readYamlDocument(args.targetMaterialProfilePath),
|
|
181
|
+
loadReconstructContractRegistry({ registryPath: args.registryPath }),
|
|
182
|
+
]);
|
|
183
|
+
const validation = validateTargetMaterialProfile({
|
|
184
|
+
targetMaterialProfile,
|
|
185
|
+
contractRegistry,
|
|
186
|
+
targetMaterialProfileRef: path.resolve(args.targetMaterialProfilePath),
|
|
187
|
+
registryRef: path.resolve(args.registryPath),
|
|
188
|
+
});
|
|
189
|
+
await writeYamlDocument(args.outputPath, validation);
|
|
190
|
+
return validation;
|
|
191
|
+
}
|
|
@@ -48,11 +48,21 @@ function supportForMaterial(args) {
|
|
|
48
48
|
unsupported_reason: "no reconstruct source profile exists for the detected target material kind",
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
+
const runnableProfiles = args.selectedProfiles.filter((profile) => isRunnableProfileRuntimeStatus(profile.runtime_implementation_status));
|
|
52
|
+
if (runnableProfiles.length === 0) {
|
|
53
|
+
return {
|
|
54
|
+
support_status: "unsupported",
|
|
55
|
+
unsupported_reason: `selected source profile runtime status is ${args.selectedProfiles.map((profile) => profile.runtime_implementation_status).join(", ")}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
51
58
|
return {
|
|
52
59
|
support_status: "partial",
|
|
53
60
|
unsupported_reason: "source profile exists, but only minimal structural observation is implemented",
|
|
54
61
|
};
|
|
55
62
|
}
|
|
63
|
+
function isRunnableProfileRuntimeStatus(status) {
|
|
64
|
+
return status === "partially_wired" || status === "wired" || status === "supported";
|
|
65
|
+
}
|
|
56
66
|
function inventoryUnitForMaterial(kind) {
|
|
57
67
|
switch (kind) {
|
|
58
68
|
case "code":
|
|
@@ -69,25 +79,41 @@ function inventoryUnitForMaterial(kind) {
|
|
|
69
79
|
return "unknown_material_unit";
|
|
70
80
|
}
|
|
71
81
|
}
|
|
72
|
-
function profileRefForKind(profiles, kind) {
|
|
73
|
-
return profiles.find((profile) => profile.target_material_kind === kind)
|
|
74
|
-
?.profile_path ?? null;
|
|
75
|
-
}
|
|
76
82
|
function selectedProfileRefs(profiles, candidates) {
|
|
77
83
|
const selected = [];
|
|
78
84
|
for (const kind of candidates) {
|
|
79
|
-
const profile = profiles
|
|
85
|
+
const profile = defaultProfileForKind(profiles, kind);
|
|
80
86
|
if (!profile)
|
|
81
87
|
continue;
|
|
82
88
|
selected.push({
|
|
89
|
+
profile_id: profile.profile_id,
|
|
83
90
|
target_material_kind: profile.target_material_kind,
|
|
91
|
+
is_default_for_kind: profile.is_default_for_kind,
|
|
92
|
+
definition_ref: profile.definition_ref,
|
|
93
|
+
definition_sha256: profile.definition_sha256,
|
|
84
94
|
profile_ref: profile.profile_path,
|
|
95
|
+
contract_status: profile.contract_status,
|
|
96
|
+
runtime_implementation_status: profile.runtime_implementation_status,
|
|
97
|
+
schema_version: profile.schema_version,
|
|
98
|
+
profile_version: profile.profile_version,
|
|
99
|
+
migration_status: profile.migration_status,
|
|
100
|
+
supersedes: profile.supersedes,
|
|
101
|
+
replaced_by: profile.replaced_by,
|
|
102
|
+
split_from: profile.split_from,
|
|
103
|
+
split_into: profile.split_into,
|
|
104
|
+
merged_from: profile.merged_from,
|
|
105
|
+
merged_into: profile.merged_into,
|
|
85
106
|
support_summary: profile.support_summary,
|
|
86
107
|
scan_targets: profile.scan_targets,
|
|
87
108
|
});
|
|
88
109
|
}
|
|
89
110
|
return selected;
|
|
90
111
|
}
|
|
112
|
+
function defaultProfileForKind(profiles, kind) {
|
|
113
|
+
const matchingProfiles = profiles.filter((candidate) => candidate.target_material_kind === kind);
|
|
114
|
+
return matchingProfiles.find((candidate) => candidate.is_default_for_kind) ??
|
|
115
|
+
matchingProfiles[0];
|
|
116
|
+
}
|
|
91
117
|
async function textStats(ref) {
|
|
92
118
|
try {
|
|
93
119
|
const text = await fs.readFile(ref, "utf8");
|
|
@@ -95,6 +121,7 @@ async function textStats(ref) {
|
|
|
95
121
|
return {
|
|
96
122
|
line_count: text.length === 0 ? 0 : text.split(/\r?\n/).length,
|
|
97
123
|
char_count: text.length,
|
|
124
|
+
content_sha256: crypto.createHash("sha256").update(text).digest("hex"),
|
|
98
125
|
content_excerpt: text.slice(0, excerptLimit),
|
|
99
126
|
excerpt_truncated: text.length > excerptLimit,
|
|
100
127
|
};
|
|
@@ -103,6 +130,7 @@ async function textStats(ref) {
|
|
|
103
130
|
return {
|
|
104
131
|
line_count: null,
|
|
105
132
|
char_count: null,
|
|
133
|
+
content_sha256: null,
|
|
106
134
|
content_excerpt: null,
|
|
107
135
|
excerpt_truncated: false,
|
|
108
136
|
};
|
|
@@ -118,6 +146,7 @@ async function buildObservation(detection) {
|
|
|
118
146
|
const stats = stat.isFile() ? await textStats(detection.ref) : {
|
|
119
147
|
line_count: null,
|
|
120
148
|
char_count: null,
|
|
149
|
+
content_sha256: null,
|
|
121
150
|
content_excerpt: null,
|
|
122
151
|
excerpt_truncated: false,
|
|
123
152
|
};
|
|
@@ -139,6 +168,7 @@ async function buildObservation(detection) {
|
|
|
139
168
|
size_bytes: stat.isFile() ? stat.size : null,
|
|
140
169
|
line_count: stats.line_count,
|
|
141
170
|
char_count: stats.char_count,
|
|
171
|
+
content_sha256: stats.content_sha256,
|
|
142
172
|
content_excerpt: stats.content_excerpt,
|
|
143
173
|
excerpt_truncated: stats.excerpt_truncated,
|
|
144
174
|
},
|
|
@@ -185,10 +215,15 @@ function buildInitialSourceFrontier(args) {
|
|
|
185
215
|
}
|
|
186
216
|
function buildInventoryUnits(args) {
|
|
187
217
|
return args.detections.map((detection) => {
|
|
188
|
-
const
|
|
218
|
+
const profile = defaultProfileForKind(args.profiles, detection.kind);
|
|
219
|
+
const profileRef = profile?.profile_path ?? null;
|
|
220
|
+
const runnable = profile
|
|
221
|
+
? isRunnableProfileRuntimeStatus(profile.runtime_implementation_status)
|
|
222
|
+
: false;
|
|
189
223
|
const planned = detection.exists &&
|
|
190
224
|
isConcreteTargetMaterialKind(detection.kind) &&
|
|
191
|
-
profileRef !== null
|
|
225
|
+
profileRef !== null &&
|
|
226
|
+
runnable;
|
|
192
227
|
return {
|
|
193
228
|
ref: detection.ref,
|
|
194
229
|
exists: detection.exists,
|
|
@@ -199,7 +234,9 @@ function buildInventoryUnits(args) {
|
|
|
199
234
|
skip_reason: planned
|
|
200
235
|
? null
|
|
201
236
|
: detection.exists
|
|
202
|
-
?
|
|
237
|
+
? profile
|
|
238
|
+
? `source profile ${profile.profile_id} runtime_implementation_status=${profile.runtime_implementation_status}`
|
|
239
|
+
: `no reconstruct source profile for target_material_kind=${detection.kind}`
|
|
203
240
|
: "target ref does not exist",
|
|
204
241
|
};
|
|
205
242
|
});
|
|
@@ -214,9 +251,10 @@ export async function materializeReconstructPreparationArtifacts(params) {
|
|
|
214
251
|
const profiles = await loadReconstructSourceProfiles(params.profilesRoot);
|
|
215
252
|
const perRefDetections = await detectTargetMaterialRefs(targetRefs);
|
|
216
253
|
const detection = aggregateTargetMaterialDetections(perRefDetections);
|
|
217
|
-
const
|
|
218
|
-
? detection.target_material_kind_candidates
|
|
219
|
-
: [detection.target_material_kind]
|
|
254
|
+
const profileCandidateKinds = detection.target_material_kind === "mixed"
|
|
255
|
+
? ["mixed", ...detection.target_material_kind_candidates]
|
|
256
|
+
: [detection.target_material_kind];
|
|
257
|
+
const selectedProfiles = selectedProfileRefs(profiles, profileCandidateKinds);
|
|
220
258
|
const support = supportForMaterial({
|
|
221
259
|
targetMaterialKind: detection.target_material_kind,
|
|
222
260
|
selectedProfiles,
|