@agent-teams/engineering-foundation 0.4.1 → 0.5.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 (225) hide show
  1. package/README.md +22 -0
  2. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts.map +1 -1
  3. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js +12 -2
  4. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js.map +1 -1
  5. package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.d.ts +3 -0
  6. package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.d.ts.map +1 -0
  7. package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.js +26 -0
  8. package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.js.map +1 -0
  9. package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.d.ts +6 -0
  10. package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.d.ts.map +1 -0
  11. package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.js +81 -0
  12. package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.js.map +1 -0
  13. package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.d.ts +15 -0
  14. package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.d.ts.map +1 -0
  15. package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.js +153 -0
  16. package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.js.map +1 -0
  17. package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.d.ts +17 -0
  18. package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.d.ts.map +1 -0
  19. package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.js +70 -0
  20. package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.js.map +1 -0
  21. package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.d.ts +10 -0
  22. package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.d.ts.map +1 -0
  23. package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.js +30 -0
  24. package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.js.map +1 -0
  25. package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.d.ts +36 -0
  26. package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.d.ts.map +1 -0
  27. package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.js +2 -0
  28. package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.js.map +1 -0
  29. package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.d.ts +34 -0
  30. package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.d.ts.map +1 -0
  31. package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.js +2 -0
  32. package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.js.map +1 -0
  33. package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.d.ts +4 -0
  34. package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.d.ts.map +1 -0
  35. package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.js +131 -0
  36. package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.js.map +1 -0
  37. package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.d.ts +17 -0
  38. package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.d.ts.map +1 -0
  39. package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.js +2 -0
  40. package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.js.map +1 -0
  41. package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.d.ts +5 -0
  42. package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.d.ts.map +1 -0
  43. package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.js +2 -0
  44. package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.js.map +1 -0
  45. package/dist/capabilities/repository-agent-workflow/application/rules.d.ts +8 -0
  46. package/dist/capabilities/repository-agent-workflow/application/rules.d.ts.map +1 -0
  47. package/dist/capabilities/repository-agent-workflow/application/rules.js +35 -0
  48. package/dist/capabilities/repository-agent-workflow/application/rules.js.map +1 -0
  49. package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.d.ts +9 -0
  50. package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.d.ts.map +1 -0
  51. package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.js +7 -0
  52. package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.js.map +1 -0
  53. package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.d.ts +4 -0
  54. package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.d.ts.map +1 -0
  55. package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.js +79 -0
  56. package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.js.map +1 -0
  57. package/dist/capabilities/repository-agent-workflow/changed-command.d.ts +9 -0
  58. package/dist/capabilities/repository-agent-workflow/changed-command.d.ts.map +1 -0
  59. package/dist/capabilities/repository-agent-workflow/changed-command.js +28 -0
  60. package/dist/capabilities/repository-agent-workflow/changed-command.js.map +1 -0
  61. package/dist/capabilities/repository-agent-workflow/contract/config.d.ts +5 -0
  62. package/dist/capabilities/repository-agent-workflow/contract/config.d.ts.map +1 -0
  63. package/dist/capabilities/repository-agent-workflow/contract/config.js +121 -0
  64. package/dist/capabilities/repository-agent-workflow/contract/config.js.map +1 -0
  65. package/dist/capabilities/repository-agent-workflow/module.d.ts +5 -0
  66. package/dist/capabilities/repository-agent-workflow/module.d.ts.map +1 -0
  67. package/dist/capabilities/repository-agent-workflow/module.js +49 -0
  68. package/dist/capabilities/repository-agent-workflow/module.js.map +1 -0
  69. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.d.ts.map +1 -1
  70. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js +150 -125
  71. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js.map +1 -1
  72. package/dist/capabilities/workspace-dependency-declarations/application/policies/evaluate-workspace-dependencies.d.ts.map +1 -1
  73. package/dist/capabilities/workspace-dependency-declarations/application/policies/evaluate-workspace-dependencies.js +9 -1
  74. package/dist/capabilities/workspace-dependency-declarations/application/policies/evaluate-workspace-dependencies.js.map +1 -1
  75. package/dist/cli-arguments.d.ts +12 -0
  76. package/dist/cli-arguments.d.ts.map +1 -0
  77. package/dist/cli-arguments.js +114 -0
  78. package/dist/cli-arguments.js.map +1 -0
  79. package/dist/cli.js +131 -125
  80. package/dist/cli.js.map +1 -1
  81. package/dist/composition/capability-registry.d.ts.map +1 -1
  82. package/dist/composition/capability-registry.js +2 -0
  83. package/dist/composition/capability-registry.js.map +1 -1
  84. package/dist/composition/rule-registry.d.ts.map +1 -1
  85. package/dist/composition/rule-registry.js +2 -0
  86. package/dist/composition/rule-registry.js.map +1 -1
  87. package/dist/foundation-config.d.ts +1 -1
  88. package/dist/foundation-config.d.ts.map +1 -1
  89. package/dist/foundation-config.js +2 -0
  90. package/dist/foundation-config.js.map +1 -1
  91. package/dist/local-mode/attach-transaction.d.ts +11 -0
  92. package/dist/local-mode/attach-transaction.d.ts.map +1 -0
  93. package/dist/local-mode/attach-transaction.js +176 -0
  94. package/dist/local-mode/attach-transaction.js.map +1 -0
  95. package/dist/local-mode/consumer-policy.d.ts +2 -3
  96. package/dist/local-mode/consumer-policy.d.ts.map +1 -1
  97. package/dist/local-mode/consumer-policy.js +102 -94
  98. package/dist/local-mode/consumer-policy.js.map +1 -1
  99. package/dist/local-mode/index.d.ts +1 -0
  100. package/dist/local-mode/index.d.ts.map +1 -1
  101. package/dist/local-mode/index.js.map +1 -1
  102. package/dist/local-mode/inspection.d.ts.map +1 -1
  103. package/dist/local-mode/inspection.js +126 -118
  104. package/dist/local-mode/inspection.js.map +1 -1
  105. package/dist/local-mode/local-state-store.d.ts +6 -0
  106. package/dist/local-mode/local-state-store.d.ts.map +1 -0
  107. package/dist/local-mode/local-state-store.js +138 -0
  108. package/dist/local-mode/local-state-store.js.map +1 -0
  109. package/dist/local-mode/registry-recovery.d.ts +5 -0
  110. package/dist/local-mode/registry-recovery.d.ts.map +1 -0
  111. package/dist/local-mode/registry-recovery.js +112 -0
  112. package/dist/local-mode/registry-recovery.js.map +1 -0
  113. package/dist/local-mode/service.d.ts +1 -1
  114. package/dist/local-mode/service.d.ts.map +1 -1
  115. package/dist/local-mode/service.js +14 -398
  116. package/dist/local-mode/service.js.map +1 -1
  117. package/dist/package-self-check.d.ts +1 -1
  118. package/dist/package-self-check.d.ts.map +1 -1
  119. package/dist/package-self-check.js +13 -1
  120. package/dist/package-self-check.js.map +1 -1
  121. package/dist/public-api-surface.d.ts +4 -0
  122. package/dist/public-api-surface.d.ts.map +1 -0
  123. package/dist/public-api-surface.js +4 -0
  124. package/dist/public-api-surface.js.map +1 -0
  125. package/dist/scaffolding/adapters/memory/memory-workspace.d.ts +9 -0
  126. package/dist/scaffolding/adapters/memory/memory-workspace.d.ts.map +1 -0
  127. package/dist/scaffolding/adapters/memory/memory-workspace.js +93 -0
  128. package/dist/scaffolding/adapters/memory/memory-workspace.js.map +1 -0
  129. package/dist/scaffolding/adapters/node/filesystem-journal.d.ts +6 -0
  130. package/dist/scaffolding/adapters/node/filesystem-journal.d.ts.map +1 -0
  131. package/dist/scaffolding/adapters/node/filesystem-journal.js +79 -0
  132. package/dist/scaffolding/adapters/node/filesystem-journal.js.map +1 -0
  133. package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts +7 -0
  134. package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts.map +1 -0
  135. package/dist/scaffolding/adapters/node/filesystem-path-guard.js +144 -0
  136. package/dist/scaffolding/adapters/node/filesystem-path-guard.js.map +1 -0
  137. package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts +13 -0
  138. package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts.map +1 -0
  139. package/dist/scaffolding/adapters/node/filesystem-workspace.js +336 -0
  140. package/dist/scaffolding/adapters/node/filesystem-workspace.js.map +1 -0
  141. package/dist/scaffolding/adapters/node/installed-foundation-version.d.ts +2 -0
  142. package/dist/scaffolding/adapters/node/installed-foundation-version.d.ts.map +1 -0
  143. package/dist/scaffolding/adapters/node/installed-foundation-version.js +10 -0
  144. package/dist/scaffolding/adapters/node/installed-foundation-version.js.map +1 -0
  145. package/dist/scaffolding/adapters/node/node-input-loader.d.ts +17 -0
  146. package/dist/scaffolding/adapters/node/node-input-loader.d.ts.map +1 -0
  147. package/dist/scaffolding/adapters/node/node-input-loader.js +157 -0
  148. package/dist/scaffolding/adapters/node/node-input-loader.js.map +1 -0
  149. package/dist/scaffolding/adapters/node/node-plan-authority.d.ts +3 -0
  150. package/dist/scaffolding/adapters/node/node-plan-authority.d.ts.map +1 -0
  151. package/dist/scaffolding/adapters/node/node-plan-authority.js +18 -0
  152. package/dist/scaffolding/adapters/node/node-plan-authority.js.map +1 -0
  153. package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts +4 -0
  154. package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts.map +1 -0
  155. package/dist/scaffolding/adapters/node/node-receipt-validator.js +10 -0
  156. package/dist/scaffolding/adapters/node/node-receipt-validator.js.map +1 -0
  157. package/dist/scaffolding/cli-command.d.ts +8 -0
  158. package/dist/scaffolding/cli-command.d.ts.map +1 -0
  159. package/dist/scaffolding/cli-command.js +60 -0
  160. package/dist/scaffolding/cli-command.js.map +1 -0
  161. package/dist/scaffolding/contract/types.d.ts +296 -0
  162. package/dist/scaffolding/contract/types.d.ts.map +1 -0
  163. package/dist/scaffolding/contract/types.js +2 -0
  164. package/dist/scaffolding/contract/types.js.map +1 -0
  165. package/dist/scaffolding/definitions/conformance-fixture.d.ts +3 -0
  166. package/dist/scaffolding/definitions/conformance-fixture.d.ts.map +1 -0
  167. package/dist/scaffolding/definitions/conformance-fixture.js +217 -0
  168. package/dist/scaffolding/definitions/conformance-fixture.js.map +1 -0
  169. package/dist/scaffolding/definitions/registry.d.ts +3 -0
  170. package/dist/scaffolding/definitions/registry.d.ts.map +1 -0
  171. package/dist/scaffolding/definitions/registry.js +6 -0
  172. package/dist/scaffolding/definitions/registry.js.map +1 -0
  173. package/dist/scaffolding/index.d.ts +11 -0
  174. package/dist/scaffolding/index.d.ts.map +1 -0
  175. package/dist/scaffolding/index.js +9 -0
  176. package/dist/scaffolding/index.js.map +1 -0
  177. package/dist/scaffolding/kernel/canonical-json.d.ts +6 -0
  178. package/dist/scaffolding/kernel/canonical-json.d.ts.map +1 -0
  179. package/dist/scaffolding/kernel/canonical-json.js +55 -0
  180. package/dist/scaffolding/kernel/canonical-json.js.map +1 -0
  181. package/dist/scaffolding/kernel/compiler.d.ts +4 -0
  182. package/dist/scaffolding/kernel/compiler.d.ts.map +1 -0
  183. package/dist/scaffolding/kernel/compiler.js +297 -0
  184. package/dist/scaffolding/kernel/compiler.js.map +1 -0
  185. package/dist/scaffolding/kernel/definition-registry.d.ts +50 -0
  186. package/dist/scaffolding/kernel/definition-registry.d.ts.map +1 -0
  187. package/dist/scaffolding/kernel/definition-registry.js +92 -0
  188. package/dist/scaffolding/kernel/definition-registry.js.map +1 -0
  189. package/dist/scaffolding/kernel/limits.d.ts +5 -0
  190. package/dist/scaffolding/kernel/limits.d.ts.map +1 -0
  191. package/dist/scaffolding/kernel/limits.js +5 -0
  192. package/dist/scaffolding/kernel/limits.js.map +1 -0
  193. package/dist/scaffolding/kernel/plan-validation.d.ts +3 -0
  194. package/dist/scaffolding/kernel/plan-validation.d.ts.map +1 -0
  195. package/dist/scaffolding/kernel/plan-validation.js +44 -0
  196. package/dist/scaffolding/kernel/plan-validation.js.map +1 -0
  197. package/dist/scaffolding/kernel/receipt.d.ts +35 -0
  198. package/dist/scaffolding/kernel/receipt.d.ts.map +1 -0
  199. package/dist/scaffolding/kernel/receipt.js +206 -0
  200. package/dist/scaffolding/kernel/receipt.js.map +1 -0
  201. package/dist/scaffolding/scaffold-error.d.ts +8 -0
  202. package/dist/scaffolding/scaffold-error.d.ts.map +1 -0
  203. package/dist/scaffolding/scaffold-error.js +11 -0
  204. package/dist/scaffolding/scaffold-error.js.map +1 -0
  205. package/dist/scaffolding/service.d.ts +8 -0
  206. package/dist/scaffolding/service.d.ts.map +1 -0
  207. package/dist/scaffolding/service.js +15 -0
  208. package/dist/scaffolding/service.js.map +1 -0
  209. package/dist/schema-ids.d.ts +1 -1
  210. package/dist/schema-ids.d.ts.map +1 -1
  211. package/dist/schema-ids.js +6 -0
  212. package/dist/schema-ids.js.map +1 -1
  213. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts.map +1 -1
  214. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.js +17 -12
  215. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.js.map +1 -1
  216. package/package.json +5 -1
  217. package/presets/oxlint/maintainability-tests.json +23 -0
  218. package/presets/oxlint/maintainability.json +23 -0
  219. package/schemas/foundation-config/v1.schema.json +10 -0
  220. package/schemas/repository-agent-workflow/v1.schema.json +92 -0
  221. package/schemas/scaffold-intent/v1.schema.json +60 -0
  222. package/schemas/scaffold-plan/v1.schema.json +250 -0
  223. package/schemas/scaffold-receipt/v1.schema.json +299 -0
  224. package/schemas/scaffold-target-catalog/v1.schema.json +52 -0
  225. package/schemas/scaffolding-config/v1.schema.json +99 -0
@@ -0,0 +1,336 @@
1
+ import { link, lstat, open, readFile, realpath, rm } from "node:fs/promises";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
+ import { sha256Bytes, sha256Text } from "../../kernel/canonical-json.js";
4
+ import { assertScaffoldPlanDigest } from "../../kernel/plan-validation.js";
5
+ import { createScaffoldReceipt } from "../../kernel/receipt.js";
6
+ import { ScaffoldError } from "../../scaffold-error.js";
7
+ import { assertSchema } from "../../../schema-catalog.js";
8
+ import { acquireFoundationOperationLock } from "../../../local-mode/service.js";
9
+ import { LOCAL_STATE_DIRECTORY } from "../../../local-mode/types.js";
10
+ import { inspectAuthorityReadSet } from "./node-input-loader.js";
11
+ import { assertPlanMatchesConsumerAuthority } from "./node-plan-authority.js";
12
+ import { assertSafeExistingAncestors, assertSafeOperationPaths, ensureSafeParent, isContainedPath, syncDirectory } from "./filesystem-path-guard.js";
13
+ import { readScaffoldJournal, removeScaffoldJournal, SCAFFOLD_JOURNAL_FILE, writeScaffoldJournal } from "./filesystem-journal.js";
14
+ function diagnostic(ruleId, phase, subject, message, remediation) {
15
+ return Object.freeze({
16
+ ruleId,
17
+ severity: "error",
18
+ phase,
19
+ subject,
20
+ message,
21
+ remediation
22
+ });
23
+ }
24
+ function isMissing(error) {
25
+ return (error instanceof Error &&
26
+ "code" in error &&
27
+ error.code === "ENOENT");
28
+ }
29
+ function hasErrorCode(error, code) {
30
+ return (error instanceof Error &&
31
+ "code" in error &&
32
+ error.code === code);
33
+ }
34
+ async function classifyFile(root, operation) {
35
+ const destination = resolve(root, operation.path);
36
+ if (!isContainedPath(root, destination)) {
37
+ return "conflict";
38
+ }
39
+ try {
40
+ const metadata = await lstat(destination);
41
+ if (metadata.isSymbolicLink() || !metadata.isFile()) {
42
+ return "conflict";
43
+ }
44
+ const bytes = await readFile(destination);
45
+ const modeMatches = process.platform === "win32" || (metadata.mode & 0o777) === 0o644;
46
+ return sha256Bytes(bytes) === operation.after.digest && modeMatches
47
+ ? "after"
48
+ : "conflict";
49
+ }
50
+ catch (error) {
51
+ if (isMissing(error)) {
52
+ return "absent";
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ function transactionTemporaryName(planDigest, operation) {
58
+ const identity = sha256Text(`${planDigest}:${operation.id}`).slice("sha256:".length);
59
+ return `.foundation-${identity}.tmp`;
60
+ }
61
+ async function removeTransactionTemporary(root, planDigest, operation) {
62
+ const parent = dirname(resolve(root, operation.path));
63
+ const temporary = join(parent, transactionTemporaryName(planDigest, operation));
64
+ try {
65
+ const metadata = await lstat(temporary);
66
+ if (metadata.isDirectory() && !metadata.isSymbolicLink()) {
67
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding temporary path is not a file: ${operation.path}.`);
68
+ }
69
+ await rm(temporary, { force: true });
70
+ await syncDirectory(parent);
71
+ }
72
+ catch (error) {
73
+ if (!isMissing(error)) {
74
+ throw error;
75
+ }
76
+ }
77
+ }
78
+ async function assertTransactionTemporariesAbsent(root, plan) {
79
+ for (const operation of plan.operations) {
80
+ const parent = dirname(resolve(root, operation.path));
81
+ const temporary = join(parent, transactionTemporaryName(plan.planDigest, operation));
82
+ const metadata = await lstat(temporary).catch((error) => {
83
+ if (isMissing(error)) {
84
+ return null;
85
+ }
86
+ throw error;
87
+ });
88
+ if (metadata !== null) {
89
+ throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding transaction temporary path already exists: ${operation.path}.`);
90
+ }
91
+ }
92
+ }
93
+ async function publishOperation(root, operation, planDigest, operationIndex, faultInjector) {
94
+ const state = await classifyFile(root, operation);
95
+ if (state === "after") {
96
+ return "already-satisfied";
97
+ }
98
+ if (state === "conflict") {
99
+ throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding output changed concurrently: ${operation.path}.`);
100
+ }
101
+ const parent = await ensureSafeParent(root, operation.path);
102
+ const destination = join(parent, basename(operation.path));
103
+ const temporary = join(parent, transactionTemporaryName(planDigest, operation));
104
+ const bytes = Buffer.from(operation.after.contentBase64, "base64");
105
+ await rm(temporary, { force: true });
106
+ try {
107
+ const handle = await open(temporary, "wx", 0o600);
108
+ try {
109
+ await handle.writeFile(bytes);
110
+ await faultInjector?.({
111
+ phase: "after-temporary-written",
112
+ operationIndex,
113
+ operationPath: operation.path
114
+ });
115
+ await handle.chmod(0o644);
116
+ await handle.sync();
117
+ }
118
+ finally {
119
+ await handle.close();
120
+ }
121
+ await faultInjector?.({
122
+ phase: "after-temporary-synced",
123
+ operationIndex,
124
+ operationPath: operation.path
125
+ });
126
+ try {
127
+ await link(temporary, destination);
128
+ }
129
+ catch (error) {
130
+ if (hasErrorCode(error, "EEXIST")) {
131
+ const concurrentState = await classifyFile(root, operation);
132
+ if (concurrentState === "after") {
133
+ return "already-satisfied";
134
+ }
135
+ throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding output changed concurrently: ${operation.path}.`, [], { cause: error });
136
+ }
137
+ throw error;
138
+ }
139
+ await faultInjector?.({
140
+ phase: "after-hard-link",
141
+ operationIndex,
142
+ operationPath: operation.path
143
+ });
144
+ await syncDirectory(parent);
145
+ }
146
+ finally {
147
+ await rm(temporary, { force: true });
148
+ }
149
+ if ((await classifyFile(root, operation)) !== "after") {
150
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Published scaffolding output failed digest verification: ${operation.path}.`);
151
+ }
152
+ return "applied";
153
+ }
154
+ async function classifyPlan(root, plan) {
155
+ return Promise.all(plan.operations.map(async (operation) => ({
156
+ operation,
157
+ state: await classifyFile(root, operation)
158
+ })));
159
+ }
160
+ function conflictReceipt(plan, classifications, phase) {
161
+ const conflicting = classifications.filter(({ state }) => state === "conflict");
162
+ return createScaffoldReceipt({
163
+ plan,
164
+ adapterId: "foundation.filesystem/v1",
165
+ outcome: phase === "recovery" ? "recovery-required" : "rejected",
166
+ commitState: phase === "recovery" ? "recovery-required" : "rejected",
167
+ atomicity: "journaled-recoverable",
168
+ operations: classifications.map(({ operation, state }) => ({
169
+ operationId: operation.id,
170
+ path: operation.path,
171
+ outcome: state === "conflict"
172
+ ? "conflict"
173
+ : state === "after"
174
+ ? "already-satisfied"
175
+ : "not-applied",
176
+ ...(state === "after" ? { resultDigest: operation.after.digest } : {})
177
+ })),
178
+ diagnostics: conflicting.map(({ operation }) => diagnostic(phase === "recovery"
179
+ ? "scaffolding.recovery.third-state"
180
+ : "scaffolding.apply.precondition-conflict", phase, operation.path, "File matches neither the Plan precondition nor its desired result.", phase === "recovery"
181
+ ? "Resolve the file manually, then retry recovery."
182
+ : "Create a new Intent and Plan from the current workspace state."))
183
+ });
184
+ }
185
+ async function finishPlan(root, plan, recovered, faultInjector) {
186
+ await assertPlanMatchesConsumerAuthority(root, plan);
187
+ for (const operation of plan.operations) {
188
+ await removeTransactionTemporary(root, plan.planDigest, operation);
189
+ }
190
+ const initial = await classifyPlan(root, plan);
191
+ if (initial.some(({ state }) => state === "conflict")) {
192
+ return conflictReceipt(plan, initial, recovered ? "recovery" : "apply");
193
+ }
194
+ const operationReceipts = [];
195
+ for (const [operationIndex, { operation, state }] of initial.entries()) {
196
+ if (recovered && state === "after") {
197
+ await syncDirectory(dirname(resolve(root, operation.path)));
198
+ }
199
+ const outcome = state === "after"
200
+ ? "already-satisfied"
201
+ : await publishOperation(root, operation, plan.planDigest, operationIndex, faultInjector);
202
+ operationReceipts.push({
203
+ operationId: operation.id,
204
+ path: operation.path,
205
+ outcome: recovered && outcome === "applied" ? "recovered" : outcome,
206
+ resultDigest: operation.after.digest
207
+ });
208
+ await faultInjector?.({
209
+ phase: "after-operation-published",
210
+ operationIndex,
211
+ operationPath: operation.path
212
+ });
213
+ }
214
+ const finalState = await classifyPlan(root, plan);
215
+ if (finalState.some(({ state }) => state !== "after")) {
216
+ return conflictReceipt(plan, finalState, "recovery");
217
+ }
218
+ return createScaffoldReceipt({
219
+ plan,
220
+ adapterId: "foundation.filesystem/v1",
221
+ outcome: recovered ? "failed-recovered" : "applied",
222
+ commitState: recovered ? "recovered" : "committed",
223
+ atomicity: "journaled-recoverable",
224
+ operations: operationReceipts
225
+ });
226
+ }
227
+ export async function recoverFilesystemScaffold(consumerRoot) {
228
+ const canonicalRoot = await realpath(resolve(consumerRoot));
229
+ const release = await acquireFoundationOperationLock(canonicalRoot);
230
+ try {
231
+ const journalPath = join(canonicalRoot, LOCAL_STATE_DIRECTORY, SCAFFOLD_JOURNAL_FILE);
232
+ const journalPlan = await readScaffoldJournal(journalPath);
233
+ if (journalPlan === undefined) {
234
+ return undefined;
235
+ }
236
+ assertSafeOperationPaths(journalPlan);
237
+ for (const operation of journalPlan.operations) {
238
+ await assertSafeExistingAncestors(canonicalRoot, operation.path);
239
+ }
240
+ const receipt = await finishPlan(canonicalRoot, journalPlan, true);
241
+ if (receipt.outcome !== "recovery-required") {
242
+ await removeScaffoldJournal(journalPath);
243
+ }
244
+ return receipt;
245
+ }
246
+ finally {
247
+ await release();
248
+ }
249
+ }
250
+ export async function applyFilesystemScaffold(consumerRoot, plan) {
251
+ return applyFilesystemScaffoldWithFaultInjection(consumerRoot, plan);
252
+ }
253
+ /** Internal conformance seam. It is intentionally absent from package exports. */
254
+ export async function applyFilesystemScaffoldWithFaultInjection(consumerRoot, plan, faultInjector) {
255
+ await assertSchema("scaffold-plan/v1", plan, "scaffold-apply-plan");
256
+ assertScaffoldPlanDigest(plan);
257
+ assertSafeOperationPaths(plan);
258
+ const canonicalRoot = await realpath(resolve(consumerRoot));
259
+ const release = await acquireFoundationOperationLock(canonicalRoot);
260
+ try {
261
+ const journalPath = join(canonicalRoot, LOCAL_STATE_DIRECTORY, SCAFFOLD_JOURNAL_FILE);
262
+ const existingPlan = await readScaffoldJournal(journalPath);
263
+ if (existingPlan !== undefined &&
264
+ existingPlan.planDigest !== plan.planDigest) {
265
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", "A different scaffolding Plan requires recovery before this Plan can apply.");
266
+ }
267
+ if (existingPlan !== undefined) {
268
+ for (const operation of existingPlan.operations) {
269
+ await assertSafeExistingAncestors(canonicalRoot, operation.path);
270
+ }
271
+ const recovered = await finishPlan(canonicalRoot, existingPlan, true);
272
+ if (recovered.outcome !== "recovery-required") {
273
+ await removeScaffoldJournal(journalPath);
274
+ }
275
+ return recovered;
276
+ }
277
+ if (!(await inspectAuthorityReadSet(canonicalRoot, plan.readSet))) {
278
+ return createScaffoldReceipt({
279
+ plan,
280
+ adapterId: "foundation.filesystem/v1",
281
+ outcome: "rejected",
282
+ commitState: "rejected",
283
+ atomicity: "journaled-recoverable",
284
+ operations: [],
285
+ diagnostics: [
286
+ diagnostic("scaffolding.apply.stale-authority-snapshot", "apply", plan.projectId, "Consumer configuration or target authority changed after planning.", "Compile a new Plan from the current consumer state.")
287
+ ]
288
+ });
289
+ }
290
+ await assertPlanMatchesConsumerAuthority(canonicalRoot, plan);
291
+ const classifications = await classifyPlan(canonicalRoot, plan);
292
+ if (classifications.some(({ state }) => state === "conflict")) {
293
+ return conflictReceipt(plan, classifications, "apply");
294
+ }
295
+ if (classifications.every(({ state }) => state === "after")) {
296
+ return createScaffoldReceipt({
297
+ plan,
298
+ adapterId: "foundation.filesystem/v1",
299
+ outcome: "already-applied",
300
+ commitState: "committed",
301
+ atomicity: "journaled-recoverable",
302
+ operations: classifications.map(({ operation }) => ({
303
+ operationId: operation.id,
304
+ path: operation.path,
305
+ outcome: "already-satisfied",
306
+ resultDigest: operation.after.digest
307
+ }))
308
+ });
309
+ }
310
+ for (const operation of plan.operations) {
311
+ await assertSafeExistingAncestors(canonicalRoot, operation.path);
312
+ }
313
+ await assertTransactionTemporariesAbsent(canonicalRoot, plan);
314
+ await writeScaffoldJournal(journalPath, plan);
315
+ await faultInjector?.({ phase: "after-journal-prepared" });
316
+ try {
317
+ const receipt = await finishPlan(canonicalRoot, plan, false, faultInjector);
318
+ if (receipt.outcome !== "recovery-required") {
319
+ await faultInjector?.({ phase: "before-journal-removed" });
320
+ await removeScaffoldJournal(journalPath);
321
+ }
322
+ return receipt;
323
+ }
324
+ catch {
325
+ const recovered = await finishPlan(canonicalRoot, plan, true);
326
+ if (recovered.outcome !== "recovery-required") {
327
+ await removeScaffoldJournal(journalPath);
328
+ }
329
+ return recovered;
330
+ }
331
+ }
332
+ finally {
333
+ await release();
334
+ }
335
+ }
336
+ //# sourceMappingURL=filesystem-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-workspace.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,EAAE,EACH,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAS7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,8BAA8B,EAC/B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAIjC,SAAS,UAAU,CACjB,MAAc,EACd,KAAoC,EACpC,OAAe,EACf,OAAe,EACf,WAAmB;IAEnB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM;QACN,QAAQ,EAAE,OAAgB;QAC1B,KAAK;QACL,OAAO;QACP,OAAO;QACP,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY;IAChD,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,IAAI,CAC/C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,SAAqC;IAErC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,WAAW,GACf,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC;QACpE,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,WAAW;YACjE,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,UAAU,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,UAAkB,EAClB,SAAqC;IAErC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,UAAU,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAChE,SAAS,CAAC,MAAM,CACjB,CAAC;IACF,OAAO,eAAe,QAAQ,MAAM,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAY,EACZ,UAAkB,EAClB,SAAqC;IAErC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,aAAa,CACrB,4BAA4B,EAC5B,6CAA6C,SAAS,CAAC,IAAI,GAAG,CAC/D,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kCAAkC,CAC/C,IAAY,EACZ,IAAoB;IAEpB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CACpB,MAAM,EACN,wBAAwB,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CACrD,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC/D,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,0DAA0D,SAAS,CAAC,IAAI,GAAG,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAY,EACZ,SAAqC,EACrC,UAAkB,EAClB,cAAsB,EACtB,aAA+C;IAE/C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,4CAA4C,SAAS,CAAC,IAAI,GAAG,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,aAAa,EAAE,CAAC;gBACpB,KAAK,EAAE,yBAAyB;gBAChC,cAAc;gBACd,aAAa,EAAE,SAAS,CAAC,IAAI;aAC9B,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,aAAa,EAAE,CAAC;YACpB,KAAK,EAAE,wBAAwB;YAC/B,cAAc;YACd,aAAa,EAAE,SAAS,CAAC,IAAI;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC5D,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;oBAChC,OAAO,mBAAmB,CAAC;gBAC7B,CAAC;gBACD,MAAM,IAAI,aAAa,CACrB,yBAAyB,EACzB,4CAA4C,SAAS,CAAC,IAAI,GAAG,EAC7D,EAAE,EACF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,aAAa,EAAE,CAAC;YACpB,KAAK,EAAE,iBAAiB;YACxB,cAAc;YACd,aAAa,EAAE,SAAS,CAAC,IAAI;SAC9B,CAAC,CAAC;QACH,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,aAAa,CACrB,4BAA4B,EAC5B,4DAA4D,SAAS,CAAC,IAAI,GAAG,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,IAAoB;IAKpB,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACxC,SAAS;QACT,KAAK,EAAE,MAAM,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC;KAC3C,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,IAAoB,EACpB,eAGG,EACH,KAA2B;IAE3B,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;IAChF,OAAO,qBAAqB,CAAC;QAC3B,IAAI;QACJ,SAAS,EAAE,0BAA0B;QACrC,OAAO,EAAE,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU;QAChE,WAAW,EAAE,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU;QACpE,SAAS,EAAE,uBAAuB;QAClC,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACzD,WAAW,EAAE,SAAS,CAAC,EAAE;YACzB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EACL,KAAK,KAAK,UAAU;gBAClB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,KAAK,KAAK,OAAO;oBACjB,CAAC,CAAC,mBAAmB;oBACrB,CAAC,CAAC,aAAa;YACrB,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAC7C,UAAU,CACR,KAAK,KAAK,UAAU;YAClB,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,yCAAyC,EAC7C,KAAK,EACL,SAAS,CAAC,IAAI,EACd,oEAAoE,EACpE,KAAK,KAAK,UAAU;YAClB,CAAC,CAAC,iDAAiD;YACnD,CAAC,CAAC,gEAAgE,CACrE,CACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,IAAY,EACZ,IAAoB,EACpB,SAAkB,EAClB,aAA+C;IAE/C,MAAM,kCAAkC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,iBAAiB,GAAiC,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACvE,IAAI,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACnC,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,OAAO,GACX,KAAK,KAAK,OAAO;YACf,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,MAAM,gBAAgB,CACpB,IAAI,EACJ,SAAS,EACT,IAAI,CAAC,UAAU,EACf,cAAc,EACd,aAAa,CACd,CAAC;QACR,iBAAiB,CAAC,IAAI,CAAC;YACrB,WAAW,EAAE,SAAS,CAAC,EAAE;YACzB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;YACnE,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;SACrC,CAAC,CAAC;QACH,MAAM,aAAa,EAAE,CAAC;YACpB,KAAK,EAAE,2BAA2B;YAClC,cAAc;YACd,aAAa,EAAE,SAAS,CAAC,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,qBAAqB,CAAC;QAC3B,IAAI;QACJ,SAAS,EAAE,0BAA0B;QACrC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QACnD,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;QAClD,SAAS,EAAE,uBAAuB;QAClC,UAAU,EAAE,iBAAiB;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,YAAoB;IAEpB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC,aAAa,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CACtB,aAAa,EACb,qBAAqB,EACrB,qBAAqB,CACtB,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACtC,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,2BAA2B,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QACnE,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;YAC5C,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,YAAoB,EACpB,IAAoB;IAEpB,OAAO,yCAAyC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAkBD,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAC7D,YAAoB,EACpB,IAAoB,EACpB,aAA+C;IAE/C,MAAM,YAAY,CAAC,kBAAkB,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACpE,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC/B,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC,aAAa,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CACtB,aAAa,EACb,qBAAqB,EACrB,qBAAqB,CACtB,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC5D,IACE,YAAY,KAAK,SAAS;YAC1B,YAAY,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAC3C,CAAC;YACD,MAAM,IAAI,aAAa,CACrB,4BAA4B,EAC5B,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;gBAChD,MAAM,2BAA2B,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YACtE,IAAI,SAAS,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;gBAC9C,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,qBAAqB,CAAC;gBAC3B,IAAI;gBACJ,SAAS,EAAE,0BAA0B;gBACrC,OAAO,EAAE,UAAU;gBACnB,WAAW,EAAE,UAAU;gBACvB,SAAS,EAAE,uBAAuB;gBAClC,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE;oBACX,UAAU,CACR,4CAA4C,EAC5C,OAAO,EACP,IAAI,CAAC,SAAS,EACd,oEAAoE,EACpE,qDAAqD,CACtD;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,kCAAkC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAChE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC,EAAE,CAAC;YAC9D,OAAO,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;YAC5D,OAAO,qBAAqB,CAAC;gBAC3B,IAAI;gBACJ,SAAS,EAAE,0BAA0B;gBACrC,OAAO,EAAE,iBAAiB;gBAC1B,WAAW,EAAE,WAAW;gBACxB,SAAS,EAAE,uBAAuB;gBAClC,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;oBAClD,WAAW,EAAE,SAAS,CAAC,EAAE;oBACzB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,OAAO,EAAE,mBAAmB;oBAC5B,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;iBACrC,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,2BAA2B,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,kCAAkC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAE9D,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;YAC5E,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;gBAC5C,MAAM,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;gBAC3D,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9D,IAAI,SAAS,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;gBAC9C,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function installedFoundationVersion(): Promise<string>;
2
+ //# sourceMappingURL=installed-foundation-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-foundation-version.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/installed-foundation-version.ts"],"names":[],"mappings":"AAGA,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAWlE"}
@@ -0,0 +1,10 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { fileURLToPath } from "node:url";
3
+ export async function installedFoundationVersion() {
4
+ const manifest = JSON.parse(await readFile(fileURLToPath(new URL("../../../../package.json", import.meta.url)), "utf8"));
5
+ if (typeof manifest.version !== "string") {
6
+ throw new Error("Installed Foundation package version is unavailable.");
7
+ }
8
+ return manifest.version;
9
+ }
10
+ //# sourceMappingURL=installed-foundation-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-foundation-version.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/installed-foundation-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CACZ,aAAa,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EACnE,MAAM,CACP,CACuB,CAAC;IAC3B,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ScaffoldCompilationInput, ScaffoldPlanV1, ScaffoldReadAssertionV1 } from "../../contract/types.js";
2
+ export declare const MAX_SCAFFOLD_PLAN_BYTES: number;
3
+ export declare function loadScaffoldCompilationInput(options: {
4
+ readonly consumerRoot: string;
5
+ readonly configPath: string;
6
+ readonly intentPath: string;
7
+ readonly foundationVersion: string;
8
+ }): Promise<ScaffoldCompilationInput>;
9
+ export declare function loadScaffoldCompilationInputFromIntent(options: {
10
+ readonly consumerRoot: string;
11
+ readonly configPath: string;
12
+ readonly foundationVersion: string;
13
+ readonly intent: unknown;
14
+ }): Promise<ScaffoldCompilationInput>;
15
+ export declare function readScaffoldPlanFile(consumerRoot: string, planPath: string): Promise<ScaffoldPlanV1>;
16
+ export declare function inspectAuthorityReadSet(consumerRoot: string, readSet: readonly ScaffoldReadAssertionV1[]): Promise<boolean>;
17
+ //# sourceMappingURL=node-input-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-input-loader.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/node-input-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,wBAAwB,EAExB,cAAc,EACd,uBAAuB,EAGxB,MAAM,yBAAyB,CAAC;AAYjC,eAAO,MAAM,uBAAuB,QAAmB,CAAC;AA+HxD,wBAAsB,4BAA4B,CAAC,OAAO,EAAE;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA0BpC;AAoDD,wBAAsB,sCAAsC,CAAC,OAAO,EAAE;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAEpC;AAED,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAYzB;AAED,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,SAAS,uBAAuB,EAAE,GAC1C,OAAO,CAAC,OAAO,CAAC,CAwBlB"}
@@ -0,0 +1,157 @@
1
+ import { lstat, readFile, realpath } from "node:fs/promises";
2
+ import { isAbsolute, relative, resolve, sep } from "node:path";
3
+ import { sha256Bytes } from "../../kernel/canonical-json.js";
4
+ import { assertScaffoldPlanDigest } from "../../kernel/plan-validation.js";
5
+ import { ScaffoldError } from "../../scaffold-error.js";
6
+ import { pathTraversesSymbolicLink } from "../../../filesystem-path-safety.js";
7
+ import { assertSchema } from "../../../schema-catalog.js";
8
+ import { assertRepositoryRelativePath, parseStrictYamlSource } from "../../../strict-yaml.js";
9
+ const MAX_INPUT_BYTES = 1024 * 1024;
10
+ export const MAX_SCAFFOLD_PLAN_BYTES = 32 * 1024 * 1024;
11
+ function hasErrorCode(error, code) {
12
+ const visited = new Set();
13
+ let candidate = error;
14
+ while (candidate instanceof Error && !visited.has(candidate)) {
15
+ visited.add(candidate);
16
+ if ("code" in candidate &&
17
+ candidate.code === code) {
18
+ return true;
19
+ }
20
+ candidate = candidate.cause;
21
+ }
22
+ return false;
23
+ }
24
+ function isContained(root, candidate) {
25
+ const relation = relative(root, candidate);
26
+ return (relation === "" ||
27
+ (!relation.startsWith(`..${sep}`) && relation !== ".." && !isAbsolute(relation)));
28
+ }
29
+ async function readContainedRepositoryFile(consumerRoot, repositoryPath, phase, maxBytes = MAX_INPUT_BYTES) {
30
+ try {
31
+ assertRepositoryRelativePath(repositoryPath, phase);
32
+ const canonicalRoot = await realpath(consumerRoot);
33
+ const candidate = resolve(canonicalRoot, repositoryPath);
34
+ if (await pathTraversesSymbolicLink(canonicalRoot, candidate)) {
35
+ throw new ScaffoldError("SCAFFOLD_INPUT_INVALID", `Scaffolding input cannot traverse a symbolic link: ${repositoryPath}.`);
36
+ }
37
+ const canonicalCandidate = await realpath(candidate);
38
+ if (!isContained(canonicalRoot, canonicalCandidate)) {
39
+ throw new ScaffoldError("SCAFFOLD_INPUT_INVALID", `Scaffolding input escapes the consumer repository: ${repositoryPath}.`);
40
+ }
41
+ const metadata = await lstat(canonicalCandidate);
42
+ if (metadata.isSymbolicLink() ||
43
+ !metadata.isFile() ||
44
+ metadata.size > maxBytes) {
45
+ throw new ScaffoldError("SCAFFOLD_INPUT_INVALID", `Scaffolding input must be a regular file no larger than ${maxBytes} bytes: ${repositoryPath}.`);
46
+ }
47
+ const bytes = await readFile(canonicalCandidate);
48
+ return {
49
+ path: repositoryPath,
50
+ bytes,
51
+ source: bytes.toString("utf8")
52
+ };
53
+ }
54
+ catch (error) {
55
+ if (error instanceof ScaffoldError) {
56
+ throw error;
57
+ }
58
+ throw new ScaffoldError("SCAFFOLD_INPUT_INVALID", `Cannot read scaffolding input: ${repositoryPath}.`, [], { cause: error });
59
+ }
60
+ }
61
+ function assertion(file) {
62
+ const canonicalBytes = Buffer.from(file.source.replace(/\r\n?/gu, "\n"), "utf8");
63
+ return Object.freeze({
64
+ path: file.path,
65
+ state: "file",
66
+ digest: sha256Bytes(canonicalBytes),
67
+ size: canonicalBytes.byteLength
68
+ });
69
+ }
70
+ function mapCatalog(value) {
71
+ const raw = value;
72
+ return Object.freeze({
73
+ version: 1,
74
+ packages: Object.freeze(raw.packages.map((entry) => Object.freeze({
75
+ id: entry.id,
76
+ role: entry.role,
77
+ path: entry.path,
78
+ packageName: entry.package_name,
79
+ ...(entry.owner_document === undefined
80
+ ? {}
81
+ : { ownerDocument: entry.owner_document })
82
+ })))
83
+ });
84
+ }
85
+ export async function loadScaffoldCompilationInput(options) {
86
+ const [configFile, intentFile] = await Promise.all([
87
+ readContainedRepositoryFile(options.consumerRoot, options.configPath, "scaffolding-config"),
88
+ readContainedRepositoryFile(options.consumerRoot, options.intentPath, "scaffold-intent")
89
+ ]);
90
+ const configValue = parseStrictYamlSource(configFile.source, "scaffolding-config");
91
+ const intentValue = parseStrictYamlSource(intentFile.source, "scaffold-intent");
92
+ return loadScaffoldCompilationInputFromIntentInternal({
93
+ consumerRoot: options.consumerRoot,
94
+ configPath: options.configPath,
95
+ foundationVersion: options.foundationVersion,
96
+ intent: intentValue,
97
+ configFile,
98
+ configValue
99
+ });
100
+ }
101
+ async function loadScaffoldCompilationInputFromIntentInternal(options) {
102
+ const configFile = options.configFile ??
103
+ (await readContainedRepositoryFile(options.consumerRoot, options.configPath, "scaffolding-config"));
104
+ const configValue = options.configValue ??
105
+ parseStrictYamlSource(configFile.source, "scaffolding-config");
106
+ await Promise.all([
107
+ assertSchema("scaffolding-config/v1", configValue, "scaffolding-config"),
108
+ assertSchema("scaffold-intent/v1", options.intent, "scaffold-intent")
109
+ ]);
110
+ const config = configValue;
111
+ const catalogFile = await readContainedRepositoryFile(options.consumerRoot, config.targetCatalogPath, "scaffold-target-catalog");
112
+ const catalogValue = parseStrictYamlSource(catalogFile.source, "scaffold-target-catalog");
113
+ await assertSchema("scaffold-target-catalog/v1", catalogValue, "scaffold-target-catalog");
114
+ return Object.freeze({
115
+ foundationVersion: options.foundationVersion,
116
+ configPath: options.configPath,
117
+ config,
118
+ intent: options.intent,
119
+ catalog: mapCatalog(catalogValue),
120
+ authorityReadSet: Object.freeze([
121
+ assertion(configFile),
122
+ assertion(catalogFile)
123
+ ])
124
+ });
125
+ }
126
+ export async function loadScaffoldCompilationInputFromIntent(options) {
127
+ return loadScaffoldCompilationInputFromIntentInternal(options);
128
+ }
129
+ export async function readScaffoldPlanFile(consumerRoot, planPath) {
130
+ const planFile = await readContainedRepositoryFile(consumerRoot, planPath, "scaffold-plan", MAX_SCAFFOLD_PLAN_BYTES);
131
+ const value = parseStrictYamlSource(planFile.source, "scaffold-plan");
132
+ await assertSchema("scaffold-plan/v1", value, "scaffold-plan");
133
+ const plan = value;
134
+ assertScaffoldPlanDigest(plan);
135
+ return plan;
136
+ }
137
+ export async function inspectAuthorityReadSet(consumerRoot, readSet) {
138
+ for (const expected of readSet) {
139
+ let current;
140
+ try {
141
+ current = await readContainedRepositoryFile(consumerRoot, expected.path, "scaffold-apply-read-set");
142
+ }
143
+ catch (error) {
144
+ if (hasErrorCode(error, "ENOENT")) {
145
+ return false;
146
+ }
147
+ throw error;
148
+ }
149
+ const observed = assertion(current);
150
+ if (observed.size !== expected.size ||
151
+ observed.digest !== expected.digest) {
152
+ return false;
153
+ }
154
+ }
155
+ return true;
156
+ }
157
+ //# sourceMappingURL=node-input-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-input-loader.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/node-input-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ScaffoldPlanV1 } from "../../contract/types.js";
2
+ export declare function assertPlanMatchesConsumerAuthority(consumerRoot: string, plan: ScaffoldPlanV1): Promise<void>;
3
+ //# sourceMappingURL=node-plan-authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-plan-authority.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/node-plan-authority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAO9D,wBAAsB,kCAAkC,CACtD,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,18 @@
1
+ import { createDefaultScaffoldRegistry } from "../../definitions/registry.js";
2
+ import { compileScaffoldPlan } from "../../kernel/compiler.js";
3
+ import { ScaffoldError } from "../../scaffold-error.js";
4
+ import { installedFoundationVersion } from "./installed-foundation-version.js";
5
+ import { loadScaffoldCompilationInputFromIntent } from "./node-input-loader.js";
6
+ export async function assertPlanMatchesConsumerAuthority(consumerRoot, plan) {
7
+ const input = await loadScaffoldCompilationInputFromIntent({
8
+ consumerRoot,
9
+ configPath: plan.authority.configPath,
10
+ foundationVersion: await installedFoundationVersion(),
11
+ intent: plan.intent
12
+ });
13
+ const expected = compileScaffoldPlan(input, createDefaultScaffoldRegistry());
14
+ if (expected.planDigest !== plan.planDigest) {
15
+ throw new ScaffoldError("SCAFFOLD_PLAN_INVALID", "Scaffolding Plan was not produced by the closed compiler from current consumer authority.");
16
+ }
17
+ }
18
+ //# sourceMappingURL=node-plan-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-plan-authority.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/node-plan-authority.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,sCAAsC,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,YAAoB,EACpB,IAAoB;IAEpB,MAAM,KAAK,GAAG,MAAM,sCAAsC,CAAC;QACzD,YAAY;QACZ,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;QACrC,iBAAiB,EAAE,MAAM,0BAA0B,EAAE;QACrD,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAC7E,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,2FAA2F,CAC5F,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScaffoldPlanV1, ScaffoldReceiptV1 } from "../../contract/types.js";
2
+ /** Validates an untrusted Receipt against its schema, digest, and optional Plan. */
3
+ export declare function validateScaffoldReceipt(receipt: unknown, plan?: ScaffoldPlanV1): Promise<ScaffoldReceiptV1>;
4
+ //# sourceMappingURL=node-receipt-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-receipt-validator.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/node-receipt-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAIjC,oFAAoF;AACpF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAK5B"}
@@ -0,0 +1,10 @@
1
+ import { assertScaffoldReceiptDigest } from "../../kernel/receipt.js";
2
+ import { assertSchema } from "../../../schema-catalog.js";
3
+ /** Validates an untrusted Receipt against its schema, digest, and optional Plan. */
4
+ export async function validateScaffoldReceipt(receipt, plan) {
5
+ await assertSchema("scaffold-receipt/v1", receipt, "scaffold-receipt");
6
+ const validated = receipt;
7
+ assertScaffoldReceiptDigest(validated, plan);
8
+ return validated;
9
+ }
10
+ //# sourceMappingURL=node-receipt-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-receipt-validator.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/node-receipt-validator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAgB,EAChB,IAAqB;IAErB,MAAM,YAAY,CAAC,qBAAqB,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,OAA4B,CAAC;IAC/C,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ScaffoldCliArguments {
2
+ readonly command: string;
3
+ readonly positional: readonly string[];
4
+ readonly consumerRoot: string;
5
+ readonly configPath: string;
6
+ }
7
+ export declare function runScaffoldingCliCommand(parsed: ScaffoldCliArguments, json: boolean): Promise<boolean>;
8
+ //# sourceMappingURL=cli-command.d.ts.map