@agent-teams/engineering-foundation 0.7.0 → 0.9.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/README.md +6 -2
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.d.ts +6 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.js +7 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.d.ts +8 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.js +131 -0
- package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.d.ts +37 -0
- package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.js +258 -0
- package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/model/protobuf-release-evidence.d.ts +52 -2
- package/dist/capabilities/contract-protobuf-evolution/application/model/protobuf-release-evidence.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/application/policies/evaluate-protobuf-evolution.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/application/policies/evaluate-protobuf-evolution.js +0 -3
- package/dist/capabilities/contract-protobuf-evolution/application/policies/evaluate-protobuf-evolution.js.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.d.ts +14 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.js +2 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.d.ts +5 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.js +2 -0
- package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.d.ts +2 -0
- package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.js +10 -1
- package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.js.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/contract/config.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/contract/config.js +30 -15
- package/dist/capabilities/contract-protobuf-evolution/contract/config.js.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/module.d.ts +3 -1
- package/dist/capabilities/contract-protobuf-evolution/module.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/module.js +4 -1
- package/dist/capabilities/contract-protobuf-evolution/module.js.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.d.ts +21 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.js +301 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.d.ts +2 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.js +28 -41
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.js.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.d.ts +8 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.js +102 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/module.d.ts +14 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/module.d.ts.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/qualification/module.js +22 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/module.js.map +1 -1
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.d.ts +21 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.js +2 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.d.ts +18 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.js +2 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.js.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.d.ts +22 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.d.ts.map +1 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.js +221 -0
- package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.js.map +1 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js +1 -14
- package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/public-api-baseline-mapper.d.ts +4 -4
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/public-api-baseline-mapper.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/public-api-baseline-mapper.js +34 -46
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/public-api-baseline-mapper.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts +18 -75
- package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/model/public-api.js +7 -29
- package/dist/capabilities/public-api-compatibility/application/model/public-api.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/policies/accepted-breaking-change.d.ts +1 -5
- package/dist/capabilities/public-api-compatibility/application/policies/accepted-breaking-change.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/policies/accepted-breaking-change.js +1 -8
- package/dist/capabilities/public-api-compatibility/application/policies/accepted-breaking-change.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.js +5 -38
- package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/policies/validate-package-export-coverage.d.ts +1 -1
- package/dist/capabilities/public-api-compatibility/application/policies/validate-package-export-coverage.js +2 -2
- package/dist/capabilities/public-api-compatibility/application/policies/validate-package-export-coverage.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.js +0 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js +0 -38
- package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/contract/config.d.ts +1 -1
- package/dist/capabilities/public-api-compatibility/contract/config.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/contract/config.js +32 -106
- package/dist/capabilities/public-api-compatibility/contract/config.js.map +1 -1
- package/dist/cli-arguments.d.ts +2 -0
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +34 -2
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli.js +40 -1
- package/dist/cli.js.map +1 -1
- package/dist/scaffolding/adapters/node/filesystem-authority-workspace.d.ts +13 -0
- package/dist/scaffolding/adapters/node/filesystem-authority-workspace.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-authority-workspace.js +257 -0
- package/dist/scaffolding/adapters/node/filesystem-authority-workspace.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-authority.d.ts +20 -0
- package/dist/scaffolding/adapters/node/filesystem-authority.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-authority.js +55 -0
- package/dist/scaffolding/adapters/node/filesystem-authority.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-file-identity.d.ts +20 -0
- package/dist/scaffolding/adapters/node/filesystem-file-identity.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-file-identity.js +122 -0
- package/dist/scaffolding/adapters/node/filesystem-file-identity.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-finalization.d.ts +22 -0
- package/dist/scaffolding/adapters/node/filesystem-finalization.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-finalization.js +169 -0
- package/dist/scaffolding/adapters/node/filesystem-finalization.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-journal-state.d.ts +25 -0
- package/dist/scaffolding/adapters/node/filesystem-journal-state.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-journal-state.js +119 -0
- package/dist/scaffolding/adapters/node/filesystem-journal-state.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-journal.d.ts +7 -4
- package/dist/scaffolding/adapters/node/filesystem-journal.d.ts.map +1 -1
- package/dist/scaffolding/adapters/node/filesystem-journal.js +104 -29
- package/dist/scaffolding/adapters/node/filesystem-journal.js.map +1 -1
- package/dist/scaffolding/adapters/node/filesystem-operation-state.d.ts +16 -0
- package/dist/scaffolding/adapters/node/filesystem-operation-state.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-operation-state.js +158 -0
- package/dist/scaffolding/adapters/node/filesystem-operation-state.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts +2 -2
- package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts.map +1 -1
- package/dist/scaffolding/adapters/node/filesystem-path-guard.js.map +1 -1
- package/dist/scaffolding/adapters/node/node-authority-error.d.ts +4 -0
- package/dist/scaffolding/adapters/node/node-authority-error.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-authority-error.js +7 -0
- package/dist/scaffolding/adapters/node/node-authority-error.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-authority-input-loader.d.ts +20 -0
- package/dist/scaffolding/adapters/node/node-authority-input-loader.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-authority-input-loader.js +180 -0
- package/dist/scaffolding/adapters/node/node-authority-input-loader.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-authority-receipt-validator.d.ts +4 -0
- package/dist/scaffolding/adapters/node/node-authority-receipt-validator.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-authority-receipt-validator.js +10 -0
- package/dist/scaffolding/adapters/node/node-authority-receipt-validator.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-owner-document-resolver.d.ts +17 -0
- package/dist/scaffolding/adapters/node/node-owner-document-resolver.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-owner-document-resolver.js +161 -0
- package/dist/scaffolding/adapters/node/node-owner-document-resolver.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-plan-authority.d.ts +14 -2
- package/dist/scaffolding/adapters/node/node-plan-authority.d.ts.map +1 -1
- package/dist/scaffolding/adapters/node/node-plan-authority.js +28 -9
- package/dist/scaffolding/adapters/node/node-plan-authority.js.map +1 -1
- package/dist/scaffolding/adapters/node/node-repository-file.d.ts +9 -0
- package/dist/scaffolding/adapters/node/node-repository-file.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-repository-file.js +65 -0
- package/dist/scaffolding/adapters/node/node-repository-file.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-scaffold-limits.d.ts +2 -0
- package/dist/scaffolding/adapters/node/node-scaffold-limits.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-scaffold-limits.js +2 -0
- package/dist/scaffolding/adapters/node/node-scaffold-limits.js.map +1 -0
- package/dist/scaffolding/authority-service.d.ts +7 -0
- package/dist/scaffolding/authority-service.d.ts.map +1 -0
- package/dist/scaffolding/authority-service.js +15 -0
- package/dist/scaffolding/authority-service.js.map +1 -0
- package/dist/scaffolding/canonical-api.d.ts +14 -0
- package/dist/scaffolding/canonical-api.d.ts.map +1 -0
- package/dist/scaffolding/canonical-api.js +32 -0
- package/dist/scaffolding/canonical-api.js.map +1 -0
- package/dist/scaffolding/cli-command.d.ts.map +1 -1
- package/dist/scaffolding/cli-command.js +1 -2
- package/dist/scaffolding/cli-command.js.map +1 -1
- package/dist/scaffolding/contract/receipt-authority-types.d.ts +125 -0
- package/dist/scaffolding/contract/receipt-authority-types.d.ts.map +1 -0
- package/dist/scaffolding/contract/receipt-authority-types.js +2 -0
- package/dist/scaffolding/contract/receipt-authority-types.js.map +1 -0
- package/dist/scaffolding/contract/scaffold-contract.d.ts +329 -0
- package/dist/scaffolding/contract/scaffold-contract.d.ts.map +1 -0
- package/dist/scaffolding/contract/scaffold-contract.js +2 -0
- package/dist/scaffolding/contract/scaffold-contract.js.map +1 -0
- package/dist/scaffolding/contract/types.d.ts +130 -193
- package/dist/scaffolding/contract/types.d.ts.map +1 -1
- package/dist/scaffolding/definitions/node-typescript-library.d.ts +3 -0
- package/dist/scaffolding/definitions/node-typescript-library.d.ts.map +1 -0
- package/dist/scaffolding/definitions/node-typescript-library.js +134 -0
- package/dist/scaffolding/definitions/node-typescript-library.js.map +1 -0
- package/dist/scaffolding/definitions/registry.d.ts +1 -1
- package/dist/scaffolding/definitions/registry.d.ts.map +1 -1
- package/dist/scaffolding/definitions/registry.js +6 -2
- package/dist/scaffolding/definitions/registry.js.map +1 -1
- package/dist/scaffolding/index.d.ts +4 -8
- package/dist/scaffolding/index.d.ts.map +1 -1
- package/dist/scaffolding/index.js +2 -7
- package/dist/scaffolding/index.js.map +1 -1
- package/dist/scaffolding/kernel/authority-compiler.d.ts +4 -0
- package/dist/scaffolding/kernel/authority-compiler.d.ts.map +1 -0
- package/dist/scaffolding/kernel/authority-compiler.js +78 -0
- package/dist/scaffolding/kernel/authority-compiler.js.map +1 -0
- package/dist/scaffolding/kernel/authority-evidence.d.ts +13 -0
- package/dist/scaffolding/kernel/authority-evidence.d.ts.map +1 -0
- package/dist/scaffolding/kernel/authority-evidence.js +79 -0
- package/dist/scaffolding/kernel/authority-evidence.js.map +1 -0
- package/dist/scaffolding/kernel/authority-receipt.d.ts +11 -0
- package/dist/scaffolding/kernel/authority-receipt.d.ts.map +1 -0
- package/dist/scaffolding/kernel/authority-receipt.js +189 -0
- package/dist/scaffolding/kernel/authority-receipt.js.map +1 -0
- package/dist/scaffolding/kernel/compiler.d.ts +28 -2
- package/dist/scaffolding/kernel/compiler.d.ts.map +1 -1
- package/dist/scaffolding/kernel/compiler.js +22 -36
- package/dist/scaffolding/kernel/compiler.js.map +1 -1
- package/dist/scaffolding/kernel/definition-registry.d.ts +6 -3
- package/dist/scaffolding/kernel/definition-registry.d.ts.map +1 -1
- package/dist/scaffolding/kernel/definition-registry.js +17 -1
- package/dist/scaffolding/kernel/definition-registry.js.map +1 -1
- package/dist/scaffolding/kernel/plan-content-validation.d.ts +3 -0
- package/dist/scaffolding/kernel/plan-content-validation.d.ts.map +1 -0
- package/dist/scaffolding/kernel/plan-content-validation.js +44 -0
- package/dist/scaffolding/kernel/plan-content-validation.js.map +1 -0
- package/dist/scaffolding/kernel/plan-validation.d.ts +2 -2
- package/dist/scaffolding/kernel/plan-validation.d.ts.map +1 -1
- package/dist/scaffolding/kernel/plan-validation.js +16 -40
- package/dist/scaffolding/kernel/plan-validation.js.map +1 -1
- package/dist/scaffolding/scaffold-defaults.d.ts +2 -0
- package/dist/scaffolding/scaffold-defaults.d.ts.map +1 -0
- package/dist/scaffolding/scaffold-defaults.js +2 -0
- package/dist/scaffolding/scaffold-defaults.js.map +1 -0
- package/dist/scaffolding/scaffold-error.d.ts +3 -3
- package/dist/scaffolding/scaffold-error.d.ts.map +1 -1
- package/dist/scaffolding/scaffold-error.js.map +1 -1
- package/dist/schema-catalog.d.ts +2 -2
- package/dist/schema-catalog.d.ts.map +1 -1
- package/dist/schema-catalog.js +41 -8
- package/dist/schema-catalog.js.map +1 -1
- package/dist/schema-ids.d.ts +2 -1
- package/dist/schema-ids.d.ts.map +1 -1
- package/dist/schema-ids.js +3 -2
- package/dist/schema-ids.js.map +1 -1
- package/package.json +25 -2
- package/schemas/contract-protobuf-breaking-qualification/v1.schema.json +93 -0
- package/schemas/contract-protobuf-evolution/v1.schema.json +47 -15
- package/schemas/package-public-api-baseline/v1.schema.json +49 -12
- package/schemas/package-public-api-compatibility/v1.schema.json +46 -5
- package/schemas/scaffold-authority-evidence/v1.schema.json +103 -0
- package/schemas/scaffold-intent/v1.schema.json +1 -1
- package/schemas/scaffold-plan/v1.schema.json +86 -8
- package/schemas/scaffold-receipt/v1.schema.json +102 -221
- package/schemas/scaffold-recovery-journal/v1.schema.json +31 -0
- package/schemas/scaffold-target-catalog/v1.schema.json +9 -8
- package/schemas/scaffolding-config/v1.schema.json +38 -2
- package/dist/scaffolding/adapters/memory/memory-workspace.d.ts +0 -9
- package/dist/scaffolding/adapters/memory/memory-workspace.d.ts.map +0 -1
- package/dist/scaffolding/adapters/memory/memory-workspace.js +0 -93
- package/dist/scaffolding/adapters/memory/memory-workspace.js.map +0 -1
- package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts +0 -13
- package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts.map +0 -1
- package/dist/scaffolding/adapters/node/filesystem-workspace.js +0 -336
- package/dist/scaffolding/adapters/node/filesystem-workspace.js.map +0 -1
- package/dist/scaffolding/adapters/node/node-input-loader.d.ts +0 -17
- package/dist/scaffolding/adapters/node/node-input-loader.d.ts.map +0 -1
- package/dist/scaffolding/adapters/node/node-input-loader.js +0 -157
- package/dist/scaffolding/adapters/node/node-input-loader.js.map +0 -1
- package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts +0 -4
- package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts.map +0 -1
- package/dist/scaffolding/adapters/node/node-receipt-validator.js +0 -10
- package/dist/scaffolding/adapters/node/node-receipt-validator.js.map +0 -1
- package/dist/scaffolding/kernel/receipt.d.ts +0 -35
- package/dist/scaffolding/kernel/receipt.d.ts.map +0 -1
- package/dist/scaffolding/kernel/receipt.js +0 -206
- package/dist/scaffolding/kernel/receipt.js.map +0 -1
- package/dist/scaffolding/service.d.ts +0 -8
- package/dist/scaffolding/service.d.ts.map +0 -1
- package/dist/scaffolding/service.js +0 -15
- package/dist/scaffolding/service.js.map +0 -1
- package/schemas/package-public-api-baseline/v2.schema.json +0 -62
- package/schemas/package-public-api-compatibility/v2.schema.json +0 -113
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { createAuthorityScaffoldReceipt } from "../../kernel/authority-receipt.js";
|
|
2
|
+
import { recoveryRequiredForAuthority, resolveAuthority, safeClassifyPlan } from "./filesystem-authority.js";
|
|
3
|
+
import { createAuthorityDiagnostic, freshAuthorityScaffoldJournal, replaceScaffoldJournalOperation, receiptFromJournalStates } from "./filesystem-journal-state.js";
|
|
4
|
+
import { captureExpectedAuthorityScaffoldJournal, removeExpectedAuthorityScaffoldJournal, writeAuthorityScaffoldJournal } from "./filesystem-journal.js";
|
|
5
|
+
import { assessScaffoldPlanAuthority } from "./node-plan-authority.js";
|
|
6
|
+
export function staleBeforeJournal(plan) {
|
|
7
|
+
return createAuthorityScaffoldReceipt({
|
|
8
|
+
plan,
|
|
9
|
+
outcome: "authority-stale",
|
|
10
|
+
commitState: "rolled-back",
|
|
11
|
+
operations: plan.operations.map((operation) => ({
|
|
12
|
+
operationId: operation.id,
|
|
13
|
+
path: operation.path,
|
|
14
|
+
outcome: "not-applied"
|
|
15
|
+
})),
|
|
16
|
+
diagnostics: [
|
|
17
|
+
createAuthorityDiagnostic("scaffolding.authority.stale", "apply", plan.projectId, "Consumer authority changed after planning.", "Compile a new Plan from the current consumer authority.")
|
|
18
|
+
]
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function authorityUnverifiableBeforeJournal(plan) {
|
|
22
|
+
return recoveryRequiredForAuthority({
|
|
23
|
+
plan,
|
|
24
|
+
phase: "apply",
|
|
25
|
+
ruleId: "scaffolding.authority.unverifiable",
|
|
26
|
+
message: "Authority cannot be re-verified safely; no output was created.",
|
|
27
|
+
remediation: "Restore readable authority sources, then compile a new Plan."
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function classifyBeforeJournal(options) {
|
|
31
|
+
let states;
|
|
32
|
+
try {
|
|
33
|
+
states = await safeClassifyPlan(options.root, options.plan);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return recoveryRequiredForAuthority({
|
|
37
|
+
plan: options.plan,
|
|
38
|
+
phase: "apply",
|
|
39
|
+
ruleId: "scaffolding.apply.unverifiable-workspace",
|
|
40
|
+
message: "The workspace cannot be safely verified before commit.",
|
|
41
|
+
remediation: "Resolve the filesystem state manually, then compile a new Plan."
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (states.every(({ state }) => state === "after")) {
|
|
45
|
+
return states;
|
|
46
|
+
}
|
|
47
|
+
let journal = freshAuthorityScaffoldJournal(options.plan);
|
|
48
|
+
for (const { operation, state } of states) {
|
|
49
|
+
if (state === "after") {
|
|
50
|
+
journal = replaceScaffoldJournalOperation(journal, operation.id, "preexisting");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return receiptFromJournalStates({
|
|
54
|
+
plan: options.plan,
|
|
55
|
+
journal,
|
|
56
|
+
outcome: "rejected",
|
|
57
|
+
phase: "apply",
|
|
58
|
+
conflictOperationIds: new Set(states
|
|
59
|
+
.filter(({ state }) => state === "conflict")
|
|
60
|
+
.map(({ operation }) => operation.id))
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export async function verifyAlreadyAppliedScaffold(options) {
|
|
64
|
+
await options.faultInjector?.({ phase: "before-final-authority-recheck" });
|
|
65
|
+
for (let pass = 0; pass < 2; pass += 1) {
|
|
66
|
+
const authority = await assessScaffoldPlanAuthority(options.root, options.plan);
|
|
67
|
+
if (authority.state === "stale") {
|
|
68
|
+
return staleBeforeJournal(options.plan);
|
|
69
|
+
}
|
|
70
|
+
if (authority.state === "unverifiable") {
|
|
71
|
+
return authorityUnverifiableBeforeJournal(options.plan);
|
|
72
|
+
}
|
|
73
|
+
const states = await classifyBeforeJournal(options);
|
|
74
|
+
if (isReceipt(states)) {
|
|
75
|
+
return states;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
await options.faultInjector?.({ phase: "after-final-verification" });
|
|
79
|
+
return createAuthorityScaffoldReceipt({
|
|
80
|
+
plan: options.plan,
|
|
81
|
+
outcome: "already-applied",
|
|
82
|
+
commitState: "committed",
|
|
83
|
+
operations: options.plan.operations.map((operation) => ({
|
|
84
|
+
operationId: operation.id,
|
|
85
|
+
path: operation.path,
|
|
86
|
+
outcome: "already-satisfied",
|
|
87
|
+
resultDigest: operation.after.digest
|
|
88
|
+
}))
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function isReceipt(value) {
|
|
92
|
+
return typeof value === "object" && value !== null && "receiptDigest" in value;
|
|
93
|
+
}
|
|
94
|
+
async function verifyOutputs(options) {
|
|
95
|
+
let states;
|
|
96
|
+
try {
|
|
97
|
+
states = await safeClassifyPlan(options.root, options.journal.plan);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return recoveryRequiredForAuthority({
|
|
101
|
+
plan: options.journal.plan,
|
|
102
|
+
phase: options.recovered ? "recovery" : "apply",
|
|
103
|
+
ruleId: "scaffolding.recovery.unverifiable-workspace",
|
|
104
|
+
message: "The workspace cannot be safely verified after publication.",
|
|
105
|
+
remediation: "Resolve the filesystem state manually, then retry recovery."
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const conflictIds = new Set(states
|
|
109
|
+
.filter(({ state }) => state !== "after")
|
|
110
|
+
.map(({ operation }) => operation.id));
|
|
111
|
+
if (conflictIds.size === 0) {
|
|
112
|
+
return states;
|
|
113
|
+
}
|
|
114
|
+
await writeAuthorityScaffoldJournal(options.journalPath, options.journal);
|
|
115
|
+
return receiptFromJournalStates({
|
|
116
|
+
plan: options.journal.plan,
|
|
117
|
+
journal: options.journal,
|
|
118
|
+
outcome: "recovery-required",
|
|
119
|
+
phase: "recovery",
|
|
120
|
+
conflictOperationIds: conflictIds
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function observedOperations(states) {
|
|
124
|
+
return states.map(({ operation }) => ({
|
|
125
|
+
operationId: operation.id,
|
|
126
|
+
path: operation.path,
|
|
127
|
+
outcome: "already-satisfied",
|
|
128
|
+
resultDigest: operation.after.digest
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
export async function finalizeAuthorityScaffoldJournal(options) {
|
|
132
|
+
await options.faultInjector?.({ phase: "before-final-authority-recheck" });
|
|
133
|
+
const firstAuthority = await resolveAuthority(options);
|
|
134
|
+
if (firstAuthority !== undefined) {
|
|
135
|
+
return firstAuthority;
|
|
136
|
+
}
|
|
137
|
+
const firstStates = await verifyOutputs(options);
|
|
138
|
+
if (isReceipt(firstStates)) {
|
|
139
|
+
return firstStates;
|
|
140
|
+
}
|
|
141
|
+
const finalAuthority = await resolveAuthority({
|
|
142
|
+
...options,
|
|
143
|
+
observedOperations: observedOperations(firstStates)
|
|
144
|
+
});
|
|
145
|
+
if (finalAuthority !== undefined) {
|
|
146
|
+
return finalAuthority;
|
|
147
|
+
}
|
|
148
|
+
const finalStates = await verifyOutputs(options);
|
|
149
|
+
if (isReceipt(finalStates)) {
|
|
150
|
+
return finalStates;
|
|
151
|
+
}
|
|
152
|
+
const journalIdentity = await captureExpectedAuthorityScaffoldJournal(options.journalPath, options.journal);
|
|
153
|
+
await options.faultInjector?.({ phase: "after-final-verification" });
|
|
154
|
+
await removeExpectedAuthorityScaffoldJournal(options.journalPath, journalIdentity, options.faultInjector === undefined
|
|
155
|
+
? undefined
|
|
156
|
+
: () => options.faultInjector?.({ phase: "after-journal-unlinked" }));
|
|
157
|
+
return createAuthorityScaffoldReceipt({
|
|
158
|
+
plan: options.journal.plan,
|
|
159
|
+
outcome: options.recovered ? "failed-recovered" : "applied",
|
|
160
|
+
commitState: options.recovered ? "recovered" : "committed",
|
|
161
|
+
operations: options.journal.plan.operations.map((operation) => options.receipts.get(operation.id) ?? {
|
|
162
|
+
operationId: operation.id,
|
|
163
|
+
path: operation.path,
|
|
164
|
+
outcome: "already-satisfied",
|
|
165
|
+
resultDigest: operation.after.digest
|
|
166
|
+
})
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=filesystem-finalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-finalization.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-finalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ScaffoldDiagnosticV1, AuthorityScaffoldJournalOperation, AuthorityScaffoldJournal, AuthorityScaffoldOperationReceipt, AuthorityScaffoldPlan, AuthorityScaffoldReceipt } from "../../contract/types.js";
|
|
2
|
+
export declare function createAuthorityDiagnostic(ruleId: string, phase: ScaffoldDiagnosticV1["phase"], subject: string, message: string, remediation: string): ScaffoldDiagnosticV1;
|
|
3
|
+
export declare function receiptFromJournalStates(options: {
|
|
4
|
+
readonly plan: AuthorityScaffoldPlan;
|
|
5
|
+
readonly journal: AuthorityScaffoldJournal;
|
|
6
|
+
readonly outcome: "recovery-required" | "rejected";
|
|
7
|
+
readonly phase: "apply" | "recovery";
|
|
8
|
+
readonly conflictOperationIds: ReadonlySet<string>;
|
|
9
|
+
}): AuthorityScaffoldReceipt;
|
|
10
|
+
export declare function createRecoveryRequiredReceipt(options: {
|
|
11
|
+
readonly plan: AuthorityScaffoldPlan;
|
|
12
|
+
readonly phase: "apply" | "recovery";
|
|
13
|
+
readonly ruleId: string;
|
|
14
|
+
readonly subject: string;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
readonly remediation: string;
|
|
17
|
+
readonly operations?: readonly AuthorityScaffoldOperationReceipt[];
|
|
18
|
+
}): AuthorityScaffoldReceipt;
|
|
19
|
+
export declare function freshAuthorityScaffoldJournal(plan: AuthorityScaffoldPlan): AuthorityScaffoldJournal;
|
|
20
|
+
export declare function replaceScaffoldJournalOperation(journal: AuthorityScaffoldJournal, operationId: string, state: AuthorityScaffoldJournalOperation["state"]): AuthorityScaffoldJournal;
|
|
21
|
+
export declare function reconcileAuthorityScaffoldJournal(root: string, journal: AuthorityScaffoldJournal): Promise<{
|
|
22
|
+
readonly journal: AuthorityScaffoldJournal;
|
|
23
|
+
readonly conflictIds: ReadonlySet<string>;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=filesystem-journal-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-journal-state.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-journal-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iCAAiC,EACjC,wBAAwB,EACxB,iCAAiC,EACjC,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AAKjC,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,oBAAoB,CAStB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpD,GAAG,wBAAwB,CA6C3B;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE;IACrD,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,iCAAiC,EAAE,CAAC;CACpE,GAAG,wBAAwB,CAsB3B;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,qBAAqB,GAAG,wBAAwB,CAenG;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,wBAAwB,EACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,iCAAiC,CAAC,OAAO,CAAC,GAChD,wBAAwB,CAW1B;AAED,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IACT,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC3C,CAAC,CAwCD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createAuthorityScaffoldReceipt } from "../../kernel/authority-receipt.js";
|
|
2
|
+
import { assertSafeExistingAncestors } from "./filesystem-path-guard.js";
|
|
3
|
+
import { classifyFilesystemOperation } from "./filesystem-operation-state.js";
|
|
4
|
+
export function createAuthorityDiagnostic(ruleId, phase, subject, message, remediation) {
|
|
5
|
+
return Object.freeze({
|
|
6
|
+
ruleId,
|
|
7
|
+
severity: "error",
|
|
8
|
+
phase,
|
|
9
|
+
subject,
|
|
10
|
+
message,
|
|
11
|
+
remediation
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function receiptFromJournalStates(options) {
|
|
15
|
+
return createAuthorityScaffoldReceipt({
|
|
16
|
+
plan: options.plan,
|
|
17
|
+
outcome: options.outcome,
|
|
18
|
+
commitState: options.outcome === "recovery-required" ? "recovery-required" : "rejected",
|
|
19
|
+
operations: options.plan.operations.map((operation) => {
|
|
20
|
+
const journalOperation = options.journal.operations.find((candidate) => candidate.operationId === operation.id);
|
|
21
|
+
if (options.conflictOperationIds.has(operation.id)) {
|
|
22
|
+
return { operationId: operation.id, path: operation.path, outcome: "conflict" };
|
|
23
|
+
}
|
|
24
|
+
if (journalOperation?.state === "preexisting" ||
|
|
25
|
+
journalOperation?.state === "published") {
|
|
26
|
+
return {
|
|
27
|
+
operationId: operation.id,
|
|
28
|
+
path: operation.path,
|
|
29
|
+
outcome: "already-satisfied",
|
|
30
|
+
resultDigest: operation.after.digest
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
operationId: operation.id,
|
|
35
|
+
path: operation.path,
|
|
36
|
+
outcome: journalOperation?.state === "publishing" ? "unobserved" : "not-applied"
|
|
37
|
+
};
|
|
38
|
+
}),
|
|
39
|
+
diagnostics: [
|
|
40
|
+
createAuthorityDiagnostic(options.phase === "recovery"
|
|
41
|
+
? "scaffolding.recovery.third-state"
|
|
42
|
+
: "scaffolding.apply.precondition-conflict", options.phase, options.plan.target.path, "Scaffolding output cannot be proven safe for the requested transaction state.", options.phase === "recovery"
|
|
43
|
+
? "Resolve the output manually, then retry recovery."
|
|
44
|
+
: "Compile a new Plan from the current workspace state.")
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function createRecoveryRequiredReceipt(options) {
|
|
49
|
+
return createAuthorityScaffoldReceipt({
|
|
50
|
+
plan: options.plan,
|
|
51
|
+
outcome: "recovery-required",
|
|
52
|
+
commitState: "recovery-required",
|
|
53
|
+
operations: options.operations ??
|
|
54
|
+
options.plan.operations.map((operation) => ({
|
|
55
|
+
operationId: operation.id,
|
|
56
|
+
path: operation.path,
|
|
57
|
+
outcome: "unobserved"
|
|
58
|
+
})),
|
|
59
|
+
diagnostics: [
|
|
60
|
+
createAuthorityDiagnostic(options.ruleId, options.phase, options.subject, options.message, options.remediation)
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export function freshAuthorityScaffoldJournal(plan) {
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
schemaVersion: 1,
|
|
67
|
+
state: "PREPARED",
|
|
68
|
+
plan,
|
|
69
|
+
operations: Object.freeze(plan.operations.map((operation) => Object.freeze({
|
|
70
|
+
operationId: operation.id,
|
|
71
|
+
path: operation.path,
|
|
72
|
+
state: "pending"
|
|
73
|
+
})))
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export function replaceScaffoldJournalOperation(journal, operationId, state) {
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
...journal,
|
|
79
|
+
operations: Object.freeze(journal.operations.map((operation) => operation.operationId === operationId
|
|
80
|
+
? Object.freeze({ ...operation, state })
|
|
81
|
+
: operation))
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export async function reconcileAuthorityScaffoldJournal(root, journal) {
|
|
85
|
+
let next = journal;
|
|
86
|
+
const conflictIds = new Set();
|
|
87
|
+
for (const operation of journal.plan.operations) {
|
|
88
|
+
const recorded = next.operations.find((candidate) => candidate.operationId === operation.id);
|
|
89
|
+
if (recorded === undefined) {
|
|
90
|
+
conflictIds.add(operation.id);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
await assertSafeExistingAncestors(root, operation.path);
|
|
94
|
+
const state = await classifyFilesystemOperation(root, operation);
|
|
95
|
+
if (state === "conflict") {
|
|
96
|
+
conflictIds.add(operation.id);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (recorded.state === "preexisting") {
|
|
100
|
+
if (state === "absent") {
|
|
101
|
+
next = replaceScaffoldJournalOperation(next, operation.id, "pending");
|
|
102
|
+
}
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (recorded.state === "pending" && state === "after") {
|
|
106
|
+
next = replaceScaffoldJournalOperation(next, operation.id, "preexisting");
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (recorded.state === "publishing") {
|
|
110
|
+
next = replaceScaffoldJournalOperation(next, operation.id, state === "after" ? "published" : "pending");
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (recorded.state === "published" && state === "absent") {
|
|
114
|
+
conflictIds.add(operation.id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { journal: next, conflictIds };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=filesystem-journal-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-journal-state.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-journal-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AuthorityScaffoldJournal } from "../../contract/types.js";
|
|
2
|
+
import { type PortableFileIdentity } from "./filesystem-file-identity.js";
|
|
2
3
|
export declare const SCAFFOLD_JOURNAL_FILE = "scaffolding-transaction.json";
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
4
|
+
export declare function writeAuthorityScaffoldJournal(path: string, journal: AuthorityScaffoldJournal, faultInjector?: () => Promise<void> | void): Promise<PortableFileIdentity>;
|
|
5
|
+
export declare function readScaffoldJournalEnvelope(path: string): Promise<AuthorityScaffoldJournal | undefined>;
|
|
6
|
+
export declare function captureExpectedAuthorityScaffoldJournal(path: string, expected: AuthorityScaffoldJournal): Promise<PortableFileIdentity>;
|
|
7
|
+
export declare function assertAuthorityScaffoldJournalTemporaryAbsent(path: string): Promise<void>;
|
|
8
|
+
export declare function removeExpectedAuthorityScaffoldJournal(path: string, expectedIdentity: PortableFileIdentity, faultInjector?: () => Promise<void> | void): Promise<void>;
|
|
6
9
|
//# sourceMappingURL=filesystem-journal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-journal.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"filesystem-journal.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAMxE,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAGvC,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAsEpE,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,wBAAwB,EACjC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACzC,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA4GD,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAE/C;AAED,wBAAsB,uCAAuC,CAC3D,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,wBAAwB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAY/B;AAED,wBAAsB,6CAA6C,CACjE,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,sCAAsC,CAC1D,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,oBAAoB,EACtC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACzC,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -1,53 +1,76 @@
|
|
|
1
|
-
import { lstat, mkdir, open,
|
|
1
|
+
import { lstat, mkdir, open, rename, rm } from "node:fs/promises";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { assertAuthorityScaffoldPlanDigest } from "../../kernel/plan-validation.js";
|
|
4
4
|
import { ScaffoldError } from "../../scaffold-error.js";
|
|
5
5
|
import { assertSchema } from "../../../schema-catalog.js";
|
|
6
6
|
import { parseStrictYamlSource } from "../../../strict-yaml.js";
|
|
7
7
|
import { syncDirectory } from "./filesystem-path-guard.js";
|
|
8
|
-
import {
|
|
8
|
+
import { captureFileHandleIdentity, pathMatchesFileIdentity, readBoundedRegularFile } from "./filesystem-file-identity.js";
|
|
9
|
+
import { MAX_SCAFFOLD_PLAN_BYTES } from "./node-scaffold-limits.js";
|
|
9
10
|
export const SCAFFOLD_JOURNAL_FILE = "scaffolding-transaction.json";
|
|
10
11
|
function isMissing(error) {
|
|
11
12
|
return (error instanceof Error &&
|
|
12
13
|
"code" in error &&
|
|
13
14
|
error.code === "ENOENT");
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
async function writeAuthorityJournalFile(path, journal, faultInjector) {
|
|
16
17
|
const parent = dirname(path);
|
|
17
18
|
await mkdir(parent, { recursive: true });
|
|
18
19
|
const temporary = `${path}.tmp`;
|
|
19
|
-
await rm(temporary, { force: true });
|
|
20
20
|
let renamed = false;
|
|
21
|
+
let temporaryIdentity;
|
|
21
22
|
try {
|
|
22
|
-
const handle = await open(temporary, "wx", 0o600)
|
|
23
|
+
const handle = await open(temporary, "wx", 0o600).catch((error) => {
|
|
24
|
+
if (error instanceof Error &&
|
|
25
|
+
"code" in error &&
|
|
26
|
+
error.code === "EEXIST") {
|
|
27
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding journal temporary path already exists.", [], { cause: error });
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
});
|
|
23
31
|
try {
|
|
24
|
-
const journal = { schemaVersion: 1, state: "PREPARED", plan };
|
|
25
32
|
await handle.writeFile(`${JSON.stringify(journal, null, 2)}\n`, "utf8");
|
|
26
33
|
await handle.sync();
|
|
34
|
+
temporaryIdentity = await captureFileHandleIdentity(handle);
|
|
27
35
|
}
|
|
28
36
|
finally {
|
|
29
37
|
await handle.close();
|
|
30
38
|
}
|
|
39
|
+
await faultInjector?.();
|
|
40
|
+
if ((await pathMatchesFileIdentity(temporary, temporaryIdentity)) !== "match") {
|
|
41
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding journal temporary path was replaced concurrently.");
|
|
42
|
+
}
|
|
31
43
|
await rename(temporary, path);
|
|
32
44
|
renamed = true;
|
|
33
45
|
await syncDirectory(parent);
|
|
46
|
+
return temporaryIdentity;
|
|
34
47
|
}
|
|
35
48
|
finally {
|
|
36
|
-
if (!renamed) {
|
|
37
|
-
await
|
|
49
|
+
if (!renamed && temporaryIdentity !== undefined) {
|
|
50
|
+
const ownership = await pathMatchesFileIdentity(temporary, temporaryIdentity);
|
|
51
|
+
if (ownership === "match") {
|
|
52
|
+
await rm(temporary);
|
|
53
|
+
await syncDirectory(parent);
|
|
54
|
+
}
|
|
38
55
|
}
|
|
39
56
|
}
|
|
40
57
|
}
|
|
41
|
-
export async function
|
|
42
|
-
|
|
58
|
+
export async function writeAuthorityScaffoldJournal(path, journal, faultInjector) {
|
|
59
|
+
return writeAuthorityJournalFile(path, journal, faultInjector);
|
|
60
|
+
}
|
|
61
|
+
async function readJournalSource(path) {
|
|
43
62
|
try {
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
!metadata.isFile() ||
|
|
47
|
-
metadata.size > MAX_SCAFFOLD_PLAN_BYTES) {
|
|
63
|
+
const result = await readBoundedRegularFile(path, MAX_SCAFFOLD_PLAN_BYTES);
|
|
64
|
+
if (result.outcome === "invalid") {
|
|
48
65
|
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding recovery journal is not a bounded regular file.");
|
|
49
66
|
}
|
|
50
|
-
|
|
67
|
+
if (result.outcome === "changed") {
|
|
68
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding recovery journal changed while it was being read.");
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
identity: result.identity,
|
|
72
|
+
source: result.bytes.toString("utf8")
|
|
73
|
+
};
|
|
51
74
|
}
|
|
52
75
|
catch (error) {
|
|
53
76
|
if (isMissing(error)) {
|
|
@@ -55,25 +78,77 @@ export async function readScaffoldJournal(path) {
|
|
|
55
78
|
}
|
|
56
79
|
throw error;
|
|
57
80
|
}
|
|
58
|
-
|
|
81
|
+
}
|
|
82
|
+
function assertAuthorityJournalOperationBindings(journal) {
|
|
83
|
+
if (journal.operations.length !== journal.plan.operations.length) {
|
|
84
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding recovery journal operation evidence does not match its Plan.");
|
|
85
|
+
}
|
|
86
|
+
const planOperations = new Map(journal.plan.operations.map((operation) => [operation.id, operation]));
|
|
87
|
+
const seen = new Set();
|
|
88
|
+
for (const operation of journal.operations) {
|
|
89
|
+
const planned = planOperations.get(operation.operationId);
|
|
90
|
+
if (planned === undefined ||
|
|
91
|
+
planned.path !== operation.path ||
|
|
92
|
+
seen.has(operation.operationId)) {
|
|
93
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding recovery journal operation evidence is invalid.");
|
|
94
|
+
}
|
|
95
|
+
seen.add(operation.operationId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function readScaffoldJournalRecord(path) {
|
|
99
|
+
const record = await readJournalSource(path);
|
|
100
|
+
if (record === undefined) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
const value = parseStrictYamlSource(record.source, "scaffold-recovery-journal");
|
|
59
104
|
if (typeof value !== "object" ||
|
|
60
105
|
value === null ||
|
|
61
106
|
Array.isArray(value) ||
|
|
62
|
-
|
|
63
|
-
!("schemaVersion" in value) ||
|
|
64
|
-
value.schemaVersion !== 1 ||
|
|
65
|
-
!("state" in value) ||
|
|
66
|
-
value.state !== "PREPARED" ||
|
|
67
|
-
!("plan" in value)) {
|
|
107
|
+
!("schemaVersion" in value)) {
|
|
68
108
|
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding recovery journal is invalid.");
|
|
69
109
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
110
|
+
if (value.schemaVersion !== 1) {
|
|
111
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "A released 0.5 scaffolding journal must be recovered before upgrading.");
|
|
112
|
+
}
|
|
113
|
+
await assertSchema("scaffold-recovery-journal/v1", value, "scaffold-recovery-journal");
|
|
114
|
+
const journal = value;
|
|
115
|
+
await assertSchema("scaffold-plan/v1", journal.plan, "scaffold-recovery-journal");
|
|
116
|
+
assertAuthorityScaffoldPlanDigest(journal.plan);
|
|
117
|
+
assertAuthorityJournalOperationBindings(journal);
|
|
118
|
+
return { identity: record.identity, journal };
|
|
119
|
+
}
|
|
120
|
+
export async function readScaffoldJournalEnvelope(path) {
|
|
121
|
+
return (await readScaffoldJournalRecord(path))?.journal;
|
|
74
122
|
}
|
|
75
|
-
export async function
|
|
76
|
-
await
|
|
123
|
+
export async function captureExpectedAuthorityScaffoldJournal(path, expected) {
|
|
124
|
+
const record = await readScaffoldJournalRecord(path);
|
|
125
|
+
if (record === undefined ||
|
|
126
|
+
JSON.stringify(record.journal) !== JSON.stringify(expected)) {
|
|
127
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding recovery journal changed before finalization.");
|
|
128
|
+
}
|
|
129
|
+
return record.identity;
|
|
130
|
+
}
|
|
131
|
+
export async function assertAuthorityScaffoldJournalTemporaryAbsent(path) {
|
|
132
|
+
const temporary = `${path}.tmp`;
|
|
133
|
+
try {
|
|
134
|
+
await lstat(temporary);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (isMissing(error)) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
// Creator-handle identity does not survive a crash, so restart recovery has
|
|
143
|
+
// no evidence that authorizes promotion or deletion of this path.
|
|
144
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding journal temporary cannot be proven transaction-owned; it was preserved and requires manual recovery.");
|
|
145
|
+
}
|
|
146
|
+
export async function removeExpectedAuthorityScaffoldJournal(path, expectedIdentity, faultInjector) {
|
|
147
|
+
if ((await pathMatchesFileIdentity(path, expectedIdentity)) !== "match") {
|
|
148
|
+
throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "Scaffolding journal changed before it could be removed.");
|
|
149
|
+
}
|
|
150
|
+
await rm(path);
|
|
151
|
+
await faultInjector?.();
|
|
77
152
|
await syncDirectory(dirname(path));
|
|
78
153
|
}
|
|
79
154
|
//# sourceMappingURL=filesystem-journal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-journal.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"filesystem-journal.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-journal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MaterializeFileOperation } from "../../contract/scaffold-contract.js";
|
|
2
|
+
export type FilesystemOperationState = "absent" | "after" | "conflict";
|
|
3
|
+
interface FilesystemPublicationFaultPoint {
|
|
4
|
+
readonly phase: "after-hard-link" | "after-temporary-synced" | "after-temporary-written";
|
|
5
|
+
readonly operationIndex: number;
|
|
6
|
+
readonly operationPath: string;
|
|
7
|
+
}
|
|
8
|
+
export type FilesystemPublicationFaultInjector = (point: FilesystemPublicationFaultPoint) => Promise<void> | void;
|
|
9
|
+
export declare function classifyFilesystemOperation(root: string, operation: MaterializeFileOperation): Promise<FilesystemOperationState>;
|
|
10
|
+
export declare function assertTransactionTemporariesAbsent(root: string, plan: {
|
|
11
|
+
readonly planDigest: string;
|
|
12
|
+
readonly operations: readonly MaterializeFileOperation[];
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function publishFilesystemOperation(root: string, operation: MaterializeFileOperation, planDigest: string, operationIndex: number, faultInjector?: FilesystemPublicationFaultInjector): Promise<"already-satisfied" | "applied">;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=filesystem-operation-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-operation-state.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-operation-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAgBpF,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvE,UAAU,+BAA+B;IACvC,QAAQ,CAAC,KAAK,EACV,iBAAiB,GACjB,wBAAwB,GACxB,yBAAyB,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,kCAAkC,GAAG,CAC/C,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAkB1B,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAwBnC;AAYD,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,GAC9F,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,EACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,kCAAkC,GACjD,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAuH1C"}
|