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,355 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Recoverability checkpoint — DD-16.
|
|
3
|
-
*
|
|
4
|
-
* Design authority:
|
|
5
|
-
* - learn-phase3-design-v9.md DD-16 (transient CheckpointPreparationResult)
|
|
6
|
-
* - learn-phase3-design-v8.md DD-16 (preparation vs artifact split)
|
|
7
|
-
* - learn-phase3-design-v7.md DD-16 (manifest_path + protection + retention)
|
|
8
|
-
*
|
|
9
|
-
* Responsibility:
|
|
10
|
-
* - Snapshot mutable roots (global/project learnings, audit-state) to a
|
|
11
|
-
* timestamped backup directory before Phase B mutates anything
|
|
12
|
-
* - Emit a restore-manifest.yaml so recovery has a single canonical seat
|
|
13
|
-
* for restore commands (RESTORE-MANIFEST-01)
|
|
14
|
-
* - Track protection state so prune respects active sessions and
|
|
15
|
-
* unrecoverable failures (BACKUP-PROTECTION-01)
|
|
16
|
-
* - Apply retention policy (keep_last_n + keep_for_days + storage budget)
|
|
17
|
-
* and append a prune-log entry per pruned session
|
|
18
|
-
*
|
|
19
|
-
* Transient vs persisted (v9 SYN-DIS-01):
|
|
20
|
-
* - CheckpointPreparationResult is a transient helper. Caller consumes it
|
|
21
|
-
* within the same function and discards. Not registry-registered.
|
|
22
|
-
* - RecoverabilityCheckpoint is the persisted artifact (via restore-manifest
|
|
23
|
-
* and backup-metadata).
|
|
24
|
-
*/
|
|
25
|
-
import fs from "node:fs";
|
|
26
|
-
import os from "node:os";
|
|
27
|
-
import path from "node:path";
|
|
28
|
-
import crypto from "node:crypto";
|
|
29
|
-
import { REGISTRY } from "./artifact-registry.js";
|
|
30
|
-
import { DEFAULT_AUDIT_STATE_PATH, } from "./audit-state.js";
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
// Defaults
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
/**
|
|
35
|
-
* PROVISIONAL — see DD-16 v6 RETENTION-POLICY-01. Defaults are calibrated to
|
|
36
|
-
* "small project, regular promote cadence" assumptions. Operators should
|
|
37
|
-
* tune these per environment after the first 1-2 production iterations.
|
|
38
|
-
*/
|
|
39
|
-
export const DEFAULT_RETENTION = {
|
|
40
|
-
backup_storage_max_bytes: 1073741824, // 1 GiB
|
|
41
|
-
keep_last_n: 10,
|
|
42
|
-
keep_for_days: 30,
|
|
43
|
-
};
|
|
44
|
-
export const BACKUP_ROOT = path.join(os.homedir(), ".onto", "backups");
|
|
45
|
-
export const PRUNE_LOG_PATH = path.join(BACKUP_ROOT, ".prune-log.jsonl");
|
|
46
|
-
function enumerateMutableRoots(projectRoot, override = {}) {
|
|
47
|
-
const targets = [];
|
|
48
|
-
const ontoHome = override.ontoHome ?? path.join(os.homedir(), ".onto");
|
|
49
|
-
const auditStatePath = override.auditStatePath ?? DEFAULT_AUDIT_STATE_PATH;
|
|
50
|
-
const globalLearnings = path.join(ontoHome, "learnings");
|
|
51
|
-
if (fs.existsSync(globalLearnings)) {
|
|
52
|
-
targets.push({
|
|
53
|
-
source_kind: "global_learnings",
|
|
54
|
-
source_path: globalLearnings,
|
|
55
|
-
is_directory: true,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
const projectLearnings = path.join(projectRoot, ".onto", "learnings");
|
|
59
|
-
if (fs.existsSync(projectLearnings)) {
|
|
60
|
-
targets.push({
|
|
61
|
-
source_kind: "project_learnings",
|
|
62
|
-
source_path: projectLearnings,
|
|
63
|
-
is_directory: true,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
if (fs.existsSync(auditStatePath)) {
|
|
67
|
-
targets.push({
|
|
68
|
-
source_kind: "audit_state",
|
|
69
|
-
source_path: auditStatePath,
|
|
70
|
-
is_directory: false,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
const domainDocsRoot = path.join(ontoHome, "domains");
|
|
74
|
-
if (fs.existsSync(domainDocsRoot)) {
|
|
75
|
-
targets.push({
|
|
76
|
-
source_kind: "domain_docs",
|
|
77
|
-
source_path: domainDocsRoot,
|
|
78
|
-
is_directory: true,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
return targets;
|
|
82
|
-
}
|
|
83
|
-
function copyDir(src, dst) {
|
|
84
|
-
let bytes = 0;
|
|
85
|
-
let files = 0;
|
|
86
|
-
fs.mkdirSync(dst, { recursive: true });
|
|
87
|
-
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
88
|
-
for (const e of entries) {
|
|
89
|
-
const s = path.join(src, e.name);
|
|
90
|
-
const d = path.join(dst, e.name);
|
|
91
|
-
if (e.isDirectory()) {
|
|
92
|
-
const r = copyDir(s, d);
|
|
93
|
-
bytes += r.bytes;
|
|
94
|
-
files += r.files;
|
|
95
|
-
}
|
|
96
|
-
else if (e.isFile()) {
|
|
97
|
-
fs.copyFileSync(s, d);
|
|
98
|
-
bytes += fs.statSync(s).size;
|
|
99
|
-
files += 1;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return { bytes, files };
|
|
103
|
-
}
|
|
104
|
-
function copyFile(src, dst) {
|
|
105
|
-
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
106
|
-
fs.copyFileSync(src, dst);
|
|
107
|
-
return { bytes: fs.statSync(src).size, files: 1 };
|
|
108
|
-
}
|
|
109
|
-
function buildRestoreCommand(target, backupPath) {
|
|
110
|
-
if (target.is_directory) {
|
|
111
|
-
return `rm -rf ${target.source_path} && cp -R ${backupPath} ${target.source_path}`;
|
|
112
|
-
}
|
|
113
|
-
return `cp ${backupPath} ${target.source_path}`;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Create a checkpoint for a Phase B attempt.
|
|
117
|
-
*
|
|
118
|
-
* Returns CheckpointPreparationResult — transient. The caller is expected to
|
|
119
|
-
* read prep.checkpoint, attach it to ApplyExecutionState, and let prep go out
|
|
120
|
-
* of scope. Do not persist this struct.
|
|
121
|
-
*
|
|
122
|
-
* U3 fix: `override` is an optional 5th parameter so callers that passed
|
|
123
|
-
* ontoHome / auditStatePath overrides to runPromoteExecutor can carry them
|
|
124
|
-
* into checkpoint creation too. Without this, backup scope would diverge
|
|
125
|
-
* from actual mutation scope on override runs.
|
|
126
|
-
*/
|
|
127
|
-
export async function createRecoverabilityCheckpoint(sessionId, projectRoot, attemptId, generation = 0, override = {}) {
|
|
128
|
-
const attemptedAt = new Date().toISOString();
|
|
129
|
-
const targets = enumerateMutableRoots(projectRoot, override);
|
|
130
|
-
if (targets.length === 0) {
|
|
131
|
-
return {
|
|
132
|
-
kind: "no_target",
|
|
133
|
-
session_id: sessionId,
|
|
134
|
-
attempted_at: attemptedAt,
|
|
135
|
-
checkpoint: null,
|
|
136
|
-
no_target_reason: "No mutable roots exist (fresh user, no learnings yet)",
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
const checkpointDir = path.join(BACKUP_ROOT, sessionId);
|
|
140
|
-
fs.mkdirSync(checkpointDir, { recursive: true });
|
|
141
|
-
const backups = [];
|
|
142
|
-
let totalBytes = 0;
|
|
143
|
-
for (const target of targets) {
|
|
144
|
-
const baseName = path.basename(target.source_path);
|
|
145
|
-
const backupName = `${target.source_kind}__${baseName}`;
|
|
146
|
-
const backupPath = path.join(checkpointDir, backupName);
|
|
147
|
-
const result = target.is_directory
|
|
148
|
-
? copyDir(target.source_path, backupPath)
|
|
149
|
-
: copyFile(target.source_path, backupPath);
|
|
150
|
-
totalBytes += result.bytes;
|
|
151
|
-
backups.push({
|
|
152
|
-
source_kind: target.source_kind,
|
|
153
|
-
source_path: target.source_path,
|
|
154
|
-
backup_path: backupPath,
|
|
155
|
-
bytes: result.bytes,
|
|
156
|
-
file_count: result.files,
|
|
157
|
-
restore_command: buildRestoreCommand(target, backupPath),
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
const manifestPath = path.join(checkpointDir, "restore-manifest.yaml");
|
|
161
|
-
const restoreOrder = backups
|
|
162
|
-
.map((b) => b.source_kind)
|
|
163
|
-
.sort(); // alphabetic — v9 §14.3 recommendation
|
|
164
|
-
const manifest = {
|
|
165
|
-
schema_version: "1",
|
|
166
|
-
session_id: sessionId,
|
|
167
|
-
attempt_id: attemptId,
|
|
168
|
-
generation,
|
|
169
|
-
created_at: attemptedAt,
|
|
170
|
-
backups,
|
|
171
|
-
restore_order: restoreOrder,
|
|
172
|
-
verification_after_restore: backups.map((b) => ({
|
|
173
|
-
command: `ls ${b.source_path}`,
|
|
174
|
-
expected: `${b.file_count} files`,
|
|
175
|
-
})),
|
|
176
|
-
};
|
|
177
|
-
REGISTRY.saveToFile("restore_manifest", manifestPath, manifest);
|
|
178
|
-
const metadata = {
|
|
179
|
-
schema_version: "1",
|
|
180
|
-
session_id: sessionId,
|
|
181
|
-
created_at: attemptedAt,
|
|
182
|
-
total_bytes: totalBytes,
|
|
183
|
-
protected: true,
|
|
184
|
-
protection_reason: "active_session",
|
|
185
|
-
protection_set_at: attemptedAt,
|
|
186
|
-
};
|
|
187
|
-
REGISTRY.saveToFile("backup_metadata", path.join(checkpointDir, "backup-metadata.yaml"), metadata);
|
|
188
|
-
const checkpoint = {
|
|
189
|
-
schema_version: "1",
|
|
190
|
-
session_id: sessionId,
|
|
191
|
-
created_at: attemptedAt,
|
|
192
|
-
manifest_path: manifestPath,
|
|
193
|
-
backups,
|
|
194
|
-
total_bytes: totalBytes,
|
|
195
|
-
protected: true,
|
|
196
|
-
protection_reason: "active_session",
|
|
197
|
-
attempt_id: attemptId,
|
|
198
|
-
generation,
|
|
199
|
-
};
|
|
200
|
-
return {
|
|
201
|
-
kind: "created",
|
|
202
|
-
session_id: sessionId,
|
|
203
|
-
attempted_at: attemptedAt,
|
|
204
|
-
checkpoint,
|
|
205
|
-
no_target_reason: null,
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
// ---------------------------------------------------------------------------
|
|
209
|
-
// Protection state transitions
|
|
210
|
-
// ---------------------------------------------------------------------------
|
|
211
|
-
/**
|
|
212
|
-
* Update a backup's protection status.
|
|
213
|
-
*
|
|
214
|
-
* `rootOverride` is an optional testing hook: when provided, it replaces
|
|
215
|
-
* BACKUP_ROOT as the base directory where the session's backup-metadata.yaml
|
|
216
|
-
* is read from and written to. Production callers omit it to use the
|
|
217
|
-
* module-level BACKUP_ROOT constant (~/.onto/backups).
|
|
218
|
-
*/
|
|
219
|
-
export function setBackupProtection(sessionId, protectionReason, rootOverride) {
|
|
220
|
-
const root = rootOverride ?? BACKUP_ROOT;
|
|
221
|
-
const metadataPath = path.join(root, sessionId, "backup-metadata.yaml");
|
|
222
|
-
if (!fs.existsSync(metadataPath))
|
|
223
|
-
return;
|
|
224
|
-
const metadata = REGISTRY.loadFromFile("backup_metadata", metadataPath);
|
|
225
|
-
metadata.protected = protectionReason !== null;
|
|
226
|
-
metadata.protection_reason = protectionReason;
|
|
227
|
-
metadata.protection_set_at = new Date().toISOString();
|
|
228
|
-
REGISTRY.saveToFile("backup_metadata", metadataPath, metadata);
|
|
229
|
-
}
|
|
230
|
-
// ---------------------------------------------------------------------------
|
|
231
|
-
// Restore command builder
|
|
232
|
-
// ---------------------------------------------------------------------------
|
|
233
|
-
/**
|
|
234
|
-
* Build the multi-step restore guidance for a checkpoint.
|
|
235
|
-
*
|
|
236
|
-
* SYN-C3 (v8): MUST use checkpoint.manifest_path. Do not derive paths from
|
|
237
|
-
* backup file names.
|
|
238
|
-
*/
|
|
239
|
-
export function buildMultiBackupRestoreCommands(checkpoint) {
|
|
240
|
-
return [
|
|
241
|
-
` 1. Read restore manifest:`,
|
|
242
|
-
` cat ${checkpoint.manifest_path}`,
|
|
243
|
-
` 2. Manifest contains restore commands in declared order.`,
|
|
244
|
-
` 3. Execute commands one by one and verify each step.`,
|
|
245
|
-
];
|
|
246
|
-
}
|
|
247
|
-
function listBackupDirs(root = BACKUP_ROOT) {
|
|
248
|
-
if (!fs.existsSync(root))
|
|
249
|
-
return [];
|
|
250
|
-
const entries = fs.readdirSync(root, { withFileTypes: true });
|
|
251
|
-
const result = [];
|
|
252
|
-
for (const e of entries) {
|
|
253
|
-
if (!e.isDirectory())
|
|
254
|
-
continue;
|
|
255
|
-
const dir = path.join(root, e.name);
|
|
256
|
-
const metadataPath = path.join(dir, "backup-metadata.yaml");
|
|
257
|
-
if (!fs.existsSync(metadataPath))
|
|
258
|
-
continue;
|
|
259
|
-
try {
|
|
260
|
-
const metadata = REGISTRY.loadFromFile("backup_metadata", metadataPath);
|
|
261
|
-
const stat = fs.statSync(dir);
|
|
262
|
-
result.push({
|
|
263
|
-
session_id: e.name,
|
|
264
|
-
path: dir,
|
|
265
|
-
metadata,
|
|
266
|
-
mtime: stat.mtime,
|
|
267
|
-
size_bytes: metadata.total_bytes,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
// Corrupted metadata: skip and let manual cleanup handle it.
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return result;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Append a prune log entry.
|
|
278
|
-
*
|
|
279
|
-
* `rootOverride` is an optional testing hook. When provided, the log file
|
|
280
|
-
* is written under `{rootOverride}/.prune-log.jsonl` instead of
|
|
281
|
-
* PRUNE_LOG_PATH (~/.onto/backups/.prune-log.jsonl).
|
|
282
|
-
*/
|
|
283
|
-
export function appendPruneLog(entry, rootOverride) {
|
|
284
|
-
const fullEntry = { schema_version: "1", ...entry };
|
|
285
|
-
const logPath = rootOverride
|
|
286
|
-
? path.join(rootOverride, ".prune-log.jsonl")
|
|
287
|
-
: PRUNE_LOG_PATH;
|
|
288
|
-
REGISTRY.appendToFile("prune_log_entry", logPath, fullEntry);
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Apply the retention policy and prune unprotected backups.
|
|
292
|
-
*
|
|
293
|
-
* `rootOverride` is an optional testing hook. When provided, pruneBackups
|
|
294
|
-
* scans that directory instead of BACKUP_ROOT and writes the prune log
|
|
295
|
-
* under that root. Production callers omit it to operate on ~/.onto/backups.
|
|
296
|
-
*/
|
|
297
|
-
export async function pruneBackups(policy = DEFAULT_RETENTION, rootOverride) {
|
|
298
|
-
const all = listBackupDirs(rootOverride);
|
|
299
|
-
const protectedBackups = all.filter((b) => b.metadata.protected);
|
|
300
|
-
const candidates = all
|
|
301
|
-
.filter((b) => !b.metadata.protected)
|
|
302
|
-
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first
|
|
303
|
-
const now = Date.now();
|
|
304
|
-
const cutoffMs = policy.keep_for_days * 24 * 60 * 60 * 1000;
|
|
305
|
-
// Decide which to keep using keep_last_n + keep_for_days first
|
|
306
|
-
const toKeep = [];
|
|
307
|
-
const toPrune = [];
|
|
308
|
-
for (let i = 0; i < candidates.length; i++) {
|
|
309
|
-
const c = candidates[i];
|
|
310
|
-
if (i < policy.keep_last_n && now - c.mtime.getTime() < cutoffMs) {
|
|
311
|
-
toKeep.push(c);
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
toPrune.push(c);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
// Storage-pressure pass: if total bytes still over limit, prune oldest
|
|
318
|
-
// unprotected until under threshold.
|
|
319
|
-
let totalBytes = toKeep.reduce((s, c) => s + c.size_bytes, 0) +
|
|
320
|
-
protectedBackups.reduce((s, c) => s + c.size_bytes, 0);
|
|
321
|
-
const keepSorted = toKeep.sort((a, b) => a.mtime.getTime() - b.mtime.getTime()); // oldest first
|
|
322
|
-
while (totalBytes > policy.backup_storage_max_bytes && keepSorted.length > 0) {
|
|
323
|
-
const victim = keepSorted.shift();
|
|
324
|
-
toPrune.push(victim);
|
|
325
|
-
totalBytes -= victim.size_bytes;
|
|
326
|
-
}
|
|
327
|
-
let bytesFreed = 0;
|
|
328
|
-
for (const v of toPrune) {
|
|
329
|
-
fs.rmSync(v.path, { recursive: true, force: true });
|
|
330
|
-
bytesFreed += v.size_bytes;
|
|
331
|
-
appendPruneLog({
|
|
332
|
-
session_id: v.session_id,
|
|
333
|
-
pruned_at: new Date().toISOString(),
|
|
334
|
-
reason: now - v.mtime.getTime() >= cutoffMs
|
|
335
|
-
? "keep_for_days_exceeded"
|
|
336
|
-
: keepSorted.length > 0 || toKeep.length > policy.keep_last_n
|
|
337
|
-
? "keep_last_n_exceeded"
|
|
338
|
-
: "storage_max_bytes_exceeded",
|
|
339
|
-
bytes_freed: v.size_bytes,
|
|
340
|
-
}, rootOverride);
|
|
341
|
-
}
|
|
342
|
-
return {
|
|
343
|
-
pruned: toPrune.length,
|
|
344
|
-
kept_unprotected: keepSorted.length,
|
|
345
|
-
kept_protected: protectedBackups.length,
|
|
346
|
-
bytes_freed: bytesFreed,
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Generate a checkpoint id for cases where a real attempt id is not yet known.
|
|
351
|
-
* Used by tests and dry-run paths.
|
|
352
|
-
*/
|
|
353
|
-
export function generateCheckpointId() {
|
|
354
|
-
return crypto.randomBytes(8).toString("hex");
|
|
355
|
-
}
|