@agent-teams/engineering-foundation 0.7.0 → 0.8.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.
Files changed (259) hide show
  1. package/README.md +6 -2
  2. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.d.ts +6 -0
  3. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.d.ts.map +1 -0
  4. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.js +7 -0
  5. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/crypto/node-sha256-digest.js.map +1 -0
  6. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.d.ts +8 -0
  7. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.d.ts.map +1 -0
  8. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.js +131 -0
  9. package/dist/capabilities/contract-protobuf-evolution/adapters/outbound/qualification/filesystem-buf-breaking-qualification-evidence.js.map +1 -0
  10. package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.d.ts +37 -0
  11. package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.d.ts.map +1 -0
  12. package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.js +258 -0
  13. package/dist/capabilities/contract-protobuf-evolution/application/model/buf-breaking-qualification.js.map +1 -0
  14. package/dist/capabilities/contract-protobuf-evolution/application/model/protobuf-release-evidence.d.ts +52 -2
  15. package/dist/capabilities/contract-protobuf-evolution/application/model/protobuf-release-evidence.d.ts.map +1 -1
  16. package/dist/capabilities/contract-protobuf-evolution/application/policies/evaluate-protobuf-evolution.d.ts.map +1 -1
  17. package/dist/capabilities/contract-protobuf-evolution/application/policies/evaluate-protobuf-evolution.js +0 -3
  18. package/dist/capabilities/contract-protobuf-evolution/application/policies/evaluate-protobuf-evolution.js.map +1 -1
  19. package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.d.ts +14 -0
  20. package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.d.ts.map +1 -0
  21. package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.js +2 -0
  22. package/dist/capabilities/contract-protobuf-evolution/application/ports/buf-breaking-qualification-evidence.js.map +1 -0
  23. package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.d.ts +5 -0
  24. package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.d.ts.map +1 -0
  25. package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.js +2 -0
  26. package/dist/capabilities/contract-protobuf-evolution/application/ports/sha256-digest.js.map +1 -0
  27. package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.d.ts +2 -0
  28. package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.d.ts.map +1 -1
  29. package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.js +10 -1
  30. package/dist/capabilities/contract-protobuf-evolution/application/use-cases/resolve-protobuf-evolution-policy.js.map +1 -1
  31. package/dist/capabilities/contract-protobuf-evolution/contract/config.d.ts +1 -1
  32. package/dist/capabilities/contract-protobuf-evolution/contract/config.d.ts.map +1 -1
  33. package/dist/capabilities/contract-protobuf-evolution/contract/config.js +33 -18
  34. package/dist/capabilities/contract-protobuf-evolution/contract/config.js.map +1 -1
  35. package/dist/capabilities/contract-protobuf-evolution/module.d.ts +3 -1
  36. package/dist/capabilities/contract-protobuf-evolution/module.d.ts.map +1 -1
  37. package/dist/capabilities/contract-protobuf-evolution/module.js +4 -1
  38. package/dist/capabilities/contract-protobuf-evolution/module.js.map +1 -1
  39. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.d.ts +21 -0
  40. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.d.ts.map +1 -0
  41. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.js +301 -0
  42. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/filesystem/filesystem-buf-qualification-artifacts.js.map +1 -0
  43. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.d.ts +2 -0
  44. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.d.ts.map +1 -1
  45. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.js +28 -41
  46. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-executable.js.map +1 -1
  47. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.d.ts +8 -0
  48. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.d.ts.map +1 -0
  49. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.js +102 -0
  50. package/dist/capabilities/contract-protobuf-evolution/qualification/adapters/outbound/process/process-buf-qualification-runner.js.map +1 -0
  51. package/dist/capabilities/contract-protobuf-evolution/qualification/module.d.ts +14 -0
  52. package/dist/capabilities/contract-protobuf-evolution/qualification/module.d.ts.map +1 -1
  53. package/dist/capabilities/contract-protobuf-evolution/qualification/module.js +22 -0
  54. package/dist/capabilities/contract-protobuf-evolution/qualification/module.js.map +1 -1
  55. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.d.ts +21 -0
  56. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.d.ts.map +1 -0
  57. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.js +2 -0
  58. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-artifacts.js.map +1 -0
  59. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.d.ts +18 -0
  60. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.d.ts.map +1 -0
  61. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.js +2 -0
  62. package/dist/capabilities/contract-protobuf-evolution/qualification/ports/buf-qualification-runner.js.map +1 -0
  63. package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.d.ts +22 -0
  64. package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.d.ts.map +1 -0
  65. package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.js +221 -0
  66. package/dist/capabilities/contract-protobuf-evolution/qualification/use-cases/qualify-buf-breaking-evidence.js.map +1 -0
  67. package/dist/cli-arguments.d.ts +2 -0
  68. package/dist/cli-arguments.d.ts.map +1 -1
  69. package/dist/cli-arguments.js +34 -2
  70. package/dist/cli-arguments.js.map +1 -1
  71. package/dist/cli.js +40 -1
  72. package/dist/cli.js.map +1 -1
  73. package/dist/scaffolding/adapters/memory/memory-workspace.js +1 -1
  74. package/dist/scaffolding/adapters/memory/memory-workspace.js.map +1 -1
  75. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.d.ts +13 -0
  76. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.d.ts.map +1 -0
  77. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.js +257 -0
  78. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.js.map +1 -0
  79. package/dist/scaffolding/adapters/node/filesystem-authority.d.ts +20 -0
  80. package/dist/scaffolding/adapters/node/filesystem-authority.d.ts.map +1 -0
  81. package/dist/scaffolding/adapters/node/filesystem-authority.js +55 -0
  82. package/dist/scaffolding/adapters/node/filesystem-authority.js.map +1 -0
  83. package/dist/scaffolding/adapters/node/filesystem-file-identity.d.ts +20 -0
  84. package/dist/scaffolding/adapters/node/filesystem-file-identity.d.ts.map +1 -0
  85. package/dist/scaffolding/adapters/node/filesystem-file-identity.js +122 -0
  86. package/dist/scaffolding/adapters/node/filesystem-file-identity.js.map +1 -0
  87. package/dist/scaffolding/adapters/node/filesystem-finalization.d.ts +22 -0
  88. package/dist/scaffolding/adapters/node/filesystem-finalization.d.ts.map +1 -0
  89. package/dist/scaffolding/adapters/node/filesystem-finalization.js +169 -0
  90. package/dist/scaffolding/adapters/node/filesystem-finalization.js.map +1 -0
  91. package/dist/scaffolding/adapters/node/filesystem-journal-state.d.ts +25 -0
  92. package/dist/scaffolding/adapters/node/filesystem-journal-state.d.ts.map +1 -0
  93. package/dist/scaffolding/adapters/node/filesystem-journal-state.js +119 -0
  94. package/dist/scaffolding/adapters/node/filesystem-journal-state.js.map +1 -0
  95. package/dist/scaffolding/adapters/node/filesystem-journal.d.ts +7 -4
  96. package/dist/scaffolding/adapters/node/filesystem-journal.d.ts.map +1 -1
  97. package/dist/scaffolding/adapters/node/filesystem-journal.js +104 -29
  98. package/dist/scaffolding/adapters/node/filesystem-journal.js.map +1 -1
  99. package/dist/scaffolding/adapters/node/filesystem-operation-state.d.ts +23 -0
  100. package/dist/scaffolding/adapters/node/filesystem-operation-state.d.ts.map +1 -0
  101. package/dist/scaffolding/adapters/node/filesystem-operation-state.js +182 -0
  102. package/dist/scaffolding/adapters/node/filesystem-operation-state.js.map +1 -0
  103. package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts +2 -2
  104. package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts.map +1 -1
  105. package/dist/scaffolding/adapters/node/filesystem-path-guard.js.map +1 -1
  106. package/dist/scaffolding/adapters/node/filesystem-rendering-journal.d.ts +6 -0
  107. package/dist/scaffolding/adapters/node/filesystem-rendering-journal.d.ts.map +1 -0
  108. package/dist/scaffolding/adapters/node/filesystem-rendering-journal.js +80 -0
  109. package/dist/scaffolding/adapters/node/filesystem-rendering-journal.js.map +1 -0
  110. package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts +1 -0
  111. package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts.map +1 -1
  112. package/dist/scaffolding/adapters/node/filesystem-workspace.js +22 -151
  113. package/dist/scaffolding/adapters/node/filesystem-workspace.js.map +1 -1
  114. package/dist/scaffolding/adapters/node/node-authority-error.d.ts +4 -0
  115. package/dist/scaffolding/adapters/node/node-authority-error.d.ts.map +1 -0
  116. package/dist/scaffolding/adapters/node/node-authority-error.js +7 -0
  117. package/dist/scaffolding/adapters/node/node-authority-error.js.map +1 -0
  118. package/dist/scaffolding/adapters/node/node-authority-input-loader.d.ts +20 -0
  119. package/dist/scaffolding/adapters/node/node-authority-input-loader.d.ts.map +1 -0
  120. package/dist/scaffolding/adapters/node/node-authority-input-loader.js +180 -0
  121. package/dist/scaffolding/adapters/node/node-authority-input-loader.js.map +1 -0
  122. package/dist/scaffolding/adapters/node/node-authority-receipt-validator.d.ts +4 -0
  123. package/dist/scaffolding/adapters/node/node-authority-receipt-validator.d.ts.map +1 -0
  124. package/dist/scaffolding/adapters/node/node-authority-receipt-validator.js +10 -0
  125. package/dist/scaffolding/adapters/node/node-authority-receipt-validator.js.map +1 -0
  126. package/dist/scaffolding/adapters/node/node-input-loader.d.ts +1 -1
  127. package/dist/scaffolding/adapters/node/node-input-loader.d.ts.map +1 -1
  128. package/dist/scaffolding/adapters/node/node-input-loader.js +6 -56
  129. package/dist/scaffolding/adapters/node/node-input-loader.js.map +1 -1
  130. package/dist/scaffolding/adapters/node/node-owner-document-resolver.d.ts +17 -0
  131. package/dist/scaffolding/adapters/node/node-owner-document-resolver.d.ts.map +1 -0
  132. package/dist/scaffolding/adapters/node/node-owner-document-resolver.js +161 -0
  133. package/dist/scaffolding/adapters/node/node-owner-document-resolver.js.map +1 -0
  134. package/dist/scaffolding/adapters/node/node-plan-authority.d.ts +14 -2
  135. package/dist/scaffolding/adapters/node/node-plan-authority.d.ts.map +1 -1
  136. package/dist/scaffolding/adapters/node/node-plan-authority.js +28 -9
  137. package/dist/scaffolding/adapters/node/node-plan-authority.js.map +1 -1
  138. package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts +1 -1
  139. package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts.map +1 -1
  140. package/dist/scaffolding/adapters/node/node-receipt-validator.js +2 -2
  141. package/dist/scaffolding/adapters/node/node-receipt-validator.js.map +1 -1
  142. package/dist/scaffolding/adapters/node/node-rendering-plan-authority.d.ts +3 -0
  143. package/dist/scaffolding/adapters/node/node-rendering-plan-authority.d.ts.map +1 -0
  144. package/dist/scaffolding/adapters/node/node-rendering-plan-authority.js +18 -0
  145. package/dist/scaffolding/adapters/node/node-rendering-plan-authority.js.map +1 -0
  146. package/dist/scaffolding/adapters/node/node-repository-file.d.ts +9 -0
  147. package/dist/scaffolding/adapters/node/node-repository-file.d.ts.map +1 -0
  148. package/dist/scaffolding/adapters/node/node-repository-file.js +65 -0
  149. package/dist/scaffolding/adapters/node/node-repository-file.js.map +1 -0
  150. package/dist/scaffolding/adapters/node/node-scaffold-limits.d.ts +2 -0
  151. package/dist/scaffolding/adapters/node/node-scaffold-limits.d.ts.map +1 -0
  152. package/dist/scaffolding/adapters/node/node-scaffold-limits.js +2 -0
  153. package/dist/scaffolding/adapters/node/node-scaffold-limits.js.map +1 -0
  154. package/dist/scaffolding/authority-service.d.ts +7 -0
  155. package/dist/scaffolding/authority-service.d.ts.map +1 -0
  156. package/dist/scaffolding/authority-service.js +15 -0
  157. package/dist/scaffolding/authority-service.js.map +1 -0
  158. package/dist/scaffolding/canonical-api.d.ts +14 -0
  159. package/dist/scaffolding/canonical-api.d.ts.map +1 -0
  160. package/dist/scaffolding/canonical-api.js +32 -0
  161. package/dist/scaffolding/canonical-api.js.map +1 -0
  162. package/dist/scaffolding/cli-command.d.ts.map +1 -1
  163. package/dist/scaffolding/cli-command.js +1 -2
  164. package/dist/scaffolding/cli-command.js.map +1 -1
  165. package/dist/scaffolding/contract/receipt-authority-types.d.ts +125 -0
  166. package/dist/scaffolding/contract/receipt-authority-types.d.ts.map +1 -0
  167. package/dist/scaffolding/contract/receipt-authority-types.js +2 -0
  168. package/dist/scaffolding/contract/receipt-authority-types.js.map +1 -0
  169. package/dist/scaffolding/contract/scaffold-contract.d.ts +329 -0
  170. package/dist/scaffolding/contract/scaffold-contract.d.ts.map +1 -0
  171. package/dist/scaffolding/contract/scaffold-contract.js +2 -0
  172. package/dist/scaffolding/contract/scaffold-contract.js.map +1 -0
  173. package/dist/scaffolding/contract/types.d.ts +177 -35
  174. package/dist/scaffolding/contract/types.d.ts.map +1 -1
  175. package/dist/scaffolding/definitions/node-typescript-library.d.ts +3 -0
  176. package/dist/scaffolding/definitions/node-typescript-library.d.ts.map +1 -0
  177. package/dist/scaffolding/definitions/node-typescript-library.js +134 -0
  178. package/dist/scaffolding/definitions/node-typescript-library.js.map +1 -0
  179. package/dist/scaffolding/definitions/registry.d.ts +2 -1
  180. package/dist/scaffolding/definitions/registry.d.ts.map +1 -1
  181. package/dist/scaffolding/definitions/registry.js +8 -1
  182. package/dist/scaffolding/definitions/registry.js.map +1 -1
  183. package/dist/scaffolding/index.d.ts +4 -8
  184. package/dist/scaffolding/index.d.ts.map +1 -1
  185. package/dist/scaffolding/index.js +2 -7
  186. package/dist/scaffolding/index.js.map +1 -1
  187. package/dist/scaffolding/internal-rendering-regression-api.d.ts +8 -0
  188. package/dist/scaffolding/internal-rendering-regression-api.d.ts.map +1 -0
  189. package/dist/scaffolding/internal-rendering-regression-api.js +8 -0
  190. package/dist/scaffolding/internal-rendering-regression-api.js.map +1 -0
  191. package/dist/scaffolding/kernel/authority-compiler.d.ts +4 -0
  192. package/dist/scaffolding/kernel/authority-compiler.d.ts.map +1 -0
  193. package/dist/scaffolding/kernel/authority-compiler.js +78 -0
  194. package/dist/scaffolding/kernel/authority-compiler.js.map +1 -0
  195. package/dist/scaffolding/kernel/authority-evidence.d.ts +13 -0
  196. package/dist/scaffolding/kernel/authority-evidence.d.ts.map +1 -0
  197. package/dist/scaffolding/kernel/authority-evidence.js +79 -0
  198. package/dist/scaffolding/kernel/authority-evidence.js.map +1 -0
  199. package/dist/scaffolding/kernel/authority-receipt.d.ts +11 -0
  200. package/dist/scaffolding/kernel/authority-receipt.d.ts.map +1 -0
  201. package/dist/scaffolding/kernel/authority-receipt.js +189 -0
  202. package/dist/scaffolding/kernel/authority-receipt.js.map +1 -0
  203. package/dist/scaffolding/kernel/compiler.d.ts +28 -2
  204. package/dist/scaffolding/kernel/compiler.d.ts.map +1 -1
  205. package/dist/scaffolding/kernel/compiler.js +22 -36
  206. package/dist/scaffolding/kernel/compiler.js.map +1 -1
  207. package/dist/scaffolding/kernel/definition-registry.d.ts +6 -3
  208. package/dist/scaffolding/kernel/definition-registry.d.ts.map +1 -1
  209. package/dist/scaffolding/kernel/definition-registry.js +17 -1
  210. package/dist/scaffolding/kernel/definition-registry.js.map +1 -1
  211. package/dist/scaffolding/kernel/plan-content-validation.d.ts +3 -0
  212. package/dist/scaffolding/kernel/plan-content-validation.d.ts.map +1 -0
  213. package/dist/scaffolding/kernel/plan-content-validation.js +44 -0
  214. package/dist/scaffolding/kernel/plan-content-validation.js.map +1 -0
  215. package/dist/scaffolding/kernel/plan-validation.d.ts +2 -2
  216. package/dist/scaffolding/kernel/plan-validation.d.ts.map +1 -1
  217. package/dist/scaffolding/kernel/plan-validation.js +16 -40
  218. package/dist/scaffolding/kernel/plan-validation.js.map +1 -1
  219. package/dist/scaffolding/kernel/receipt.js +1 -1
  220. package/dist/scaffolding/kernel/receipt.js.map +1 -1
  221. package/dist/scaffolding/kernel/rendering-plan-compiler.d.ts +4 -0
  222. package/dist/scaffolding/kernel/rendering-plan-compiler.d.ts.map +1 -0
  223. package/dist/scaffolding/kernel/rendering-plan-compiler.js +43 -0
  224. package/dist/scaffolding/kernel/rendering-plan-compiler.js.map +1 -0
  225. package/dist/scaffolding/kernel/rendering-plan-validation.d.ts +3 -0
  226. package/dist/scaffolding/kernel/rendering-plan-validation.d.ts.map +1 -0
  227. package/dist/scaffolding/kernel/rendering-plan-validation.js +10 -0
  228. package/dist/scaffolding/kernel/rendering-plan-validation.js.map +1 -0
  229. package/dist/scaffolding/scaffold-defaults.d.ts +2 -0
  230. package/dist/scaffolding/scaffold-defaults.d.ts.map +1 -0
  231. package/dist/scaffolding/scaffold-defaults.js +2 -0
  232. package/dist/scaffolding/scaffold-defaults.js.map +1 -0
  233. package/dist/scaffolding/scaffold-error.d.ts +3 -3
  234. package/dist/scaffolding/scaffold-error.d.ts.map +1 -1
  235. package/dist/scaffolding/scaffold-error.js.map +1 -1
  236. package/dist/scaffolding/service.d.ts +1 -1
  237. package/dist/scaffolding/service.d.ts.map +1 -1
  238. package/dist/scaffolding/service.js +5 -4
  239. package/dist/scaffolding/service.js.map +1 -1
  240. package/dist/schema-catalog.d.ts +2 -2
  241. package/dist/schema-catalog.d.ts.map +1 -1
  242. package/dist/schema-catalog.js +41 -8
  243. package/dist/schema-catalog.js.map +1 -1
  244. package/dist/schema-ids.d.ts +5 -1
  245. package/dist/schema-ids.d.ts.map +1 -1
  246. package/dist/schema-ids.js +14 -2
  247. package/dist/schema-ids.js.map +1 -1
  248. package/package.json +30 -2
  249. package/schemas/contract-protobuf-breaking-qualification/v1.schema.json +89 -0
  250. package/schemas/contract-protobuf-breaking-qualification/v2.schema.json +93 -0
  251. package/schemas/contract-protobuf-evolution/v2.schema.json +147 -0
  252. package/schemas/scaffold-authority-evidence.schema.json +103 -0
  253. package/schemas/{scaffold-intent/v1.schema.json → scaffold-intent.schema.json} +2 -2
  254. package/schemas/{scaffold-plan/v1.schema.json → scaffold-plan.schema.json} +89 -11
  255. package/schemas/scaffold-receipt.schema.json +180 -0
  256. package/schemas/scaffold-recovery-journal.schema.json +31 -0
  257. package/schemas/{scaffold-target-catalog/v1.schema.json → scaffold-target-catalog.schema.json} +11 -10
  258. package/schemas/{scaffolding-config/v1.schema.json → scaffolding-config.schema.json} +40 -4
  259. package/schemas/scaffold-receipt/v1.schema.json +0 -299
@@ -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: 2,
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 { ScaffoldPlanV1 } from "../../contract/types.js";
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 writeScaffoldJournal(path: string, plan: ScaffoldPlanV1): Promise<void>;
4
- export declare function readScaffoldJournal(path: string): Promise<ScaffoldPlanV1 | undefined>;
5
- export declare function removeScaffoldJournal(path: string): Promise<void>;
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,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQ9D,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAUpE,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CA0CrC;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE"}
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, readFile, rename, rm } from "node:fs/promises";
1
+ import { lstat, mkdir, open, rename, rm } from "node:fs/promises";
2
2
  import { dirname } from "node:path";
3
- import { assertScaffoldPlanDigest } from "../../kernel/plan-validation.js";
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 { MAX_SCAFFOLD_PLAN_BYTES } from "./node-input-loader.js";
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
- export async function writeScaffoldJournal(path, plan) {
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 rm(temporary, { force: true });
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 readScaffoldJournal(path) {
42
- let source;
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 metadata = await lstat(path);
45
- if (metadata.isSymbolicLink() ||
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
- source = await readFile(path, "utf8");
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
- const value = parseStrictYamlSource(source, "scaffold-recovery-journal");
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
- Object.keys(value).length !== 3 ||
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
- await assertSchema("scaffold-plan/v1", value.plan, "scaffold-recovery-journal");
71
- const plan = value.plan;
72
- assertScaffoldPlanDigest(plan);
73
- return plan;
110
+ if (value.schemaVersion !== 2) {
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", value, "scaffold-recovery-journal");
114
+ const journal = value;
115
+ await assertSchema("scaffold-plan", 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 removeScaffoldJournal(path) {
76
- await rm(path, { force: true });
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":"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"}
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,23 @@
1
+ import type { MaterializeFileOperationV1 } from "../../contract/types.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: MaterializeFileOperationV1): Promise<FilesystemOperationState>;
10
+ export declare function removeTransactionTemporary(root: string, planDigest: string, operation: MaterializeFileOperationV1): Promise<void>;
11
+ export declare function assertTransactionTemporariesAbsent(root: string, plan: {
12
+ readonly planDigest: string;
13
+ readonly operations: readonly MaterializeFileOperationV1[];
14
+ }): Promise<void>;
15
+ export declare function publishFilesystemOperation(root: string, operation: MaterializeFileOperationV1, planDigest: string, operationIndex: number, faultInjector?: FilesystemPublicationFaultInjector): Promise<"already-satisfied" | "applied">;
16
+ export declare function classifyFilesystemPlan(root: string, plan: {
17
+ readonly operations: readonly MaterializeFileOperationV1[];
18
+ }): Promise<readonly {
19
+ readonly operation: MaterializeFileOperationV1;
20
+ readonly state: FilesystemOperationState;
21
+ }[]>;
22
+ export {};
23
+ //# 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,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAgB1E,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,0BAA0B,GACpC,OAAO,CAAC,wBAAwB,CAAC,CAwBnC;AAYD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,0BAA0B,GACpC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,0BAA0B,EAAE,CAAA;CAAE,GAChG,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,0BAA0B,EACrC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,kCAAkC,GACjD,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAuH1C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,0BAA0B,EAAE,CAAA;CAAE,GACnE,OAAO,CAAC,SAAS;IAClB,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;CAC1C,EAAE,CAAC,CAOH"}