@msn-control/liftoff 0.10.4 → 0.11.2

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 (700) hide show
  1. package/DEVELOPER.md +238 -77
  2. package/README.md +38 -33
  3. package/assets/supported-stack.json +3 -136
  4. package/dist/adapters/azure/governance-assessment.d.ts +2 -0
  5. package/dist/adapters/azure/governance-assessment.js +21 -0
  6. package/dist/adapters/azure/governance-assessment.js.map +1 -0
  7. package/dist/adapters/filesystem/atomic-write.d.ts +2 -0
  8. package/dist/adapters/filesystem/atomic-write.js +74 -0
  9. package/dist/adapters/filesystem/atomic-write.js.map +1 -0
  10. package/dist/adapters/filesystem/errors.d.ts +2 -0
  11. package/dist/adapters/filesystem/errors.js +8 -0
  12. package/dist/adapters/filesystem/errors.js.map +1 -0
  13. package/dist/adapters/filesystem/manifest-file.d.ts +1 -0
  14. package/dist/adapters/filesystem/manifest-file.js +21 -0
  15. package/dist/adapters/filesystem/manifest-file.js.map +1 -0
  16. package/dist/adapters/filesystem/project-config.d.ts +4 -0
  17. package/dist/adapters/filesystem/project-config.js +157 -0
  18. package/dist/adapters/filesystem/project-config.js.map +1 -0
  19. package/dist/adapters/filesystem/project-discovery.d.ts +2 -0
  20. package/dist/adapters/filesystem/project-discovery.js +30 -0
  21. package/dist/adapters/filesystem/project-discovery.js.map +1 -0
  22. package/dist/adapters/filesystem/project-files.d.ts +6 -0
  23. package/dist/adapters/filesystem/project-files.js +68 -0
  24. package/dist/adapters/filesystem/project-files.js.map +1 -0
  25. package/dist/adapters/filesystem/project-lock.d.ts +8 -0
  26. package/dist/adapters/filesystem/project-lock.js +164 -0
  27. package/dist/adapters/filesystem/project-lock.js.map +1 -0
  28. package/dist/adapters/filesystem/project-paths.d.ts +2 -0
  29. package/dist/adapters/filesystem/project-paths.js +60 -0
  30. package/dist/adapters/filesystem/project-paths.js.map +1 -0
  31. package/dist/adapters/filesystem/project-transaction.d.ts +24 -0
  32. package/dist/adapters/filesystem/project-transaction.js +177 -0
  33. package/dist/adapters/filesystem/project-transaction.js.map +1 -0
  34. package/dist/adapters/filesystem/reviewed-update-transaction.d.ts +53 -0
  35. package/dist/adapters/filesystem/reviewed-update-transaction.js +864 -0
  36. package/dist/adapters/filesystem/reviewed-update-transaction.js.map +1 -0
  37. package/dist/adapters/filesystem/update-previews.d.ts +50 -0
  38. package/dist/adapters/filesystem/update-previews.js +613 -0
  39. package/dist/adapters/filesystem/update-previews.js.map +1 -0
  40. package/dist/adapters/git/governance-assessment.d.ts +22 -0
  41. package/dist/adapters/git/governance-assessment.js +161 -0
  42. package/dist/adapters/git/governance-assessment.js.map +1 -0
  43. package/dist/adapters/github/governance-assessment.d.ts +2 -0
  44. package/dist/adapters/github/governance-assessment.js +18 -0
  45. package/dist/adapters/github/governance-assessment.js.map +1 -0
  46. package/dist/adapters/packaged-assets/package-root.d.ts +3 -0
  47. package/dist/adapters/packaged-assets/package-root.js +21 -0
  48. package/dist/adapters/packaged-assets/package-root.js.map +1 -0
  49. package/dist/adapters/packaged-assets/supported-stack.d.ts +4 -0
  50. package/dist/adapters/packaged-assets/supported-stack.js +18 -0
  51. package/dist/adapters/packaged-assets/supported-stack.js.map +1 -0
  52. package/dist/adapters/packaged-assets/template-assets.d.ts +23 -0
  53. package/dist/adapters/packaged-assets/template-assets.js +36 -0
  54. package/dist/adapters/packaged-assets/template-assets.js.map +1 -0
  55. package/dist/adapters/process/shell-command.d.ts +6 -0
  56. package/dist/adapters/process/shell-command.js +27 -0
  57. package/dist/adapters/process/shell-command.js.map +1 -0
  58. package/dist/application/context.d.ts +25 -0
  59. package/dist/application/context.js +2 -0
  60. package/dist/application/context.js.map +1 -0
  61. package/dist/application/diagnose/doctor.d.ts +21 -0
  62. package/dist/application/diagnose/doctor.js +580 -0
  63. package/dist/application/diagnose/doctor.js.map +1 -0
  64. package/dist/application/diagnose/generated-project.d.ts +1 -0
  65. package/dist/application/diagnose/generated-project.js +105 -0
  66. package/dist/application/diagnose/generated-project.js.map +1 -0
  67. package/dist/application/diagnose/validate.d.ts +6 -0
  68. package/dist/application/diagnose/validate.js +27 -0
  69. package/dist/application/diagnose/validate.js.map +1 -0
  70. package/dist/application/initialize/fixture.d.ts +2 -0
  71. package/dist/application/initialize/fixture.js +39 -0
  72. package/dist/application/initialize/fixture.js.map +1 -0
  73. package/dist/application/initialize/inputs.d.ts +3 -0
  74. package/dist/application/initialize/inputs.js +35 -0
  75. package/dist/application/initialize/inputs.js.map +1 -0
  76. package/dist/application/initialize/use-case.d.ts +23 -0
  77. package/dist/application/initialize/use-case.js +360 -0
  78. package/dist/application/initialize/use-case.js.map +1 -0
  79. package/dist/application/migrate/use-case.d.ts +7 -0
  80. package/dist/application/migrate/use-case.js +378 -0
  81. package/dist/application/migrate/use-case.js.map +1 -0
  82. package/dist/application/project/catalog.d.ts +46 -0
  83. package/dist/application/project/catalog.js +12 -0
  84. package/dist/application/project/catalog.js.map +1 -0
  85. package/dist/application/project/manifest.d.ts +2 -0
  86. package/dist/application/project/manifest.js +29 -0
  87. package/dist/application/project/manifest.js.map +1 -0
  88. package/dist/application/project/planning.d.ts +6 -0
  89. package/dist/application/project/planning.js +12 -0
  90. package/dist/application/project/planning.js.map +1 -0
  91. package/dist/application/update/approval.d.ts +39 -0
  92. package/dist/application/update/approval.js +54 -0
  93. package/dist/application/update/approval.js.map +1 -0
  94. package/dist/application/update/command-guidance.d.ts +2 -0
  95. package/dist/application/update/command-guidance.js +14 -0
  96. package/dist/application/update/command-guidance.js.map +1 -0
  97. package/dist/application/update/inspection.d.ts +37 -0
  98. package/dist/application/update/inspection.js +235 -0
  99. package/dist/application/update/inspection.js.map +1 -0
  100. package/dist/application/update/migration-runtime.d.ts +14 -0
  101. package/dist/application/update/migration-runtime.js +178 -0
  102. package/dist/application/update/migration-runtime.js.map +1 -0
  103. package/dist/application/update/output.d.ts +134 -0
  104. package/dist/application/update/output.js +182 -0
  105. package/dist/application/update/output.js.map +1 -0
  106. package/dist/application/update/planning.d.ts +40 -0
  107. package/dist/application/update/planning.js +293 -0
  108. package/dist/application/update/planning.js.map +1 -0
  109. package/dist/application/update/preview.d.ts +49 -0
  110. package/dist/application/update/preview.js +220 -0
  111. package/dist/application/update/preview.js.map +1 -0
  112. package/dist/application/update/protected-source.d.ts +25 -0
  113. package/dist/application/update/protected-source.js +81 -0
  114. package/dist/application/update/protected-source.js.map +1 -0
  115. package/dist/application/update/reporting.d.ts +42 -0
  116. package/dist/application/update/reporting.js +326 -0
  117. package/dist/application/update/reporting.js.map +1 -0
  118. package/dist/application/update/revalidation-plan.d.ts +22 -0
  119. package/dist/application/update/revalidation-plan.js +108 -0
  120. package/dist/application/update/revalidation-plan.js.map +1 -0
  121. package/dist/application/update/revalidation.d.ts +70 -0
  122. package/dist/application/update/revalidation.js +337 -0
  123. package/dist/application/update/revalidation.js.map +1 -0
  124. package/dist/application/update/review-plan.d.ts +25 -0
  125. package/dist/application/update/review-plan.js +89 -0
  126. package/dist/application/update/review-plan.js.map +1 -0
  127. package/dist/application/update/transaction-approval.d.ts +29 -0
  128. package/dist/application/update/transaction-approval.js +82 -0
  129. package/dist/application/update/transaction-approval.js.map +1 -0
  130. package/dist/application/update/use-case.d.ts +9 -0
  131. package/dist/application/update/use-case.js +271 -0
  132. package/dist/application/update/use-case.js.map +1 -0
  133. package/dist/application/update/write-plan.d.ts +15 -0
  134. package/dist/application/update/write-plan.js +115 -0
  135. package/dist/application/update/write-plan.js.map +1 -0
  136. package/dist/application/upgrade/use-case.d.ts +6 -0
  137. package/dist/application/upgrade/use-case.js +82 -0
  138. package/dist/application/upgrade/use-case.js.map +1 -0
  139. package/dist/args.d.ts +5 -65
  140. package/dist/args.js +4 -472
  141. package/dist/args.js.map +1 -1
  142. package/dist/artifact-lifecycle.d.ts +1 -21
  143. package/dist/artifact-lifecycle.js +1 -75
  144. package/dist/artifact-lifecycle.js.map +1 -1
  145. package/dist/catalogs.d.ts +1 -50
  146. package/dist/catalogs.js +1 -472
  147. package/dist/catalogs.js.map +1 -1
  148. package/dist/cli/args/contracts.d.ts +51 -0
  149. package/dist/cli/args/contracts.js +2 -0
  150. package/dist/cli/args/contracts.js.map +1 -0
  151. package/dist/cli/args/definitions.d.ts +6 -0
  152. package/dist/cli/args/definitions.js +188 -0
  153. package/dist/cli/args/definitions.js.map +1 -0
  154. package/dist/cli/args/help.d.ts +5 -0
  155. package/dist/cli/args/help.js +142 -0
  156. package/dist/cli/args/help.js.map +1 -0
  157. package/dist/cli/args/parser.d.ts +5 -0
  158. package/dist/cli/args/parser.js +160 -0
  159. package/dist/cli/args/parser.js.map +1 -0
  160. package/dist/cli/args/readers.d.ts +4 -0
  161. package/dist/cli/args/readers.js +19 -0
  162. package/dist/cli/args/readers.js.map +1 -0
  163. package/dist/cli/commands/diagnose.d.ts +4 -0
  164. package/dist/cli/commands/diagnose.js +12 -0
  165. package/dist/cli/commands/diagnose.js.map +1 -0
  166. package/dist/cli/commands/dispatch.d.ts +3 -0
  167. package/dist/cli/commands/dispatch.js +94 -0
  168. package/dist/cli/commands/dispatch.js.map +1 -0
  169. package/dist/cli/commands/help.d.ts +3 -0
  170. package/dist/cli/commands/help.js +32 -0
  171. package/dist/cli/commands/help.js.map +1 -0
  172. package/dist/cli/commands/helpers.d.ts +8 -0
  173. package/dist/cli/commands/helpers.js +97 -0
  174. package/dist/cli/commands/helpers.js.map +1 -0
  175. package/dist/cli/commands/initialize.d.ts +3 -0
  176. package/dist/cli/commands/initialize.js +7 -0
  177. package/dist/cli/commands/initialize.js.map +1 -0
  178. package/dist/cli/commands/migrate.d.ts +3 -0
  179. package/dist/cli/commands/migrate.js +8 -0
  180. package/dist/cli/commands/migrate.js.map +1 -0
  181. package/dist/cli/commands/plan.d.ts +3 -0
  182. package/dist/cli/commands/plan.js +34 -0
  183. package/dist/cli/commands/plan.js.map +1 -0
  184. package/dist/cli/commands/reference.d.ts +5 -0
  185. package/dist/cli/commands/reference.js +43 -0
  186. package/dist/cli/commands/reference.js.map +1 -0
  187. package/dist/cli/commands/update.d.ts +3 -0
  188. package/dist/cli/commands/update.js +10 -0
  189. package/dist/cli/commands/update.js.map +1 -0
  190. package/dist/cli/commands/upgrade.d.ts +3 -0
  191. package/dist/cli/commands/upgrade.js +7 -0
  192. package/dist/cli/commands/upgrade.js.map +1 -0
  193. package/dist/cli/context.d.ts +1 -0
  194. package/dist/cli/context.js +2 -0
  195. package/dist/cli/context.js.map +1 -0
  196. package/dist/cli/project-options.d.ts +3 -0
  197. package/dist/cli/project-options.js +41 -0
  198. package/dist/cli/project-options.js.map +1 -0
  199. package/dist/cli.d.ts +3 -3
  200. package/dist/cli.js +2 -2
  201. package/dist/cli.js.map +1 -1
  202. package/dist/commands.d.ts +4 -35
  203. package/dist/commands.js +3 -2969
  204. package/dist/commands.js.map +1 -1
  205. package/dist/container-validation.d.ts +1 -1
  206. package/dist/domain/governance/activation/approvals.d.ts +351 -0
  207. package/dist/domain/governance/activation/approvals.js +528 -0
  208. package/dist/domain/governance/activation/approvals.js.map +1 -0
  209. package/dist/domain/governance/activation/canonical-json.d.ts +4 -0
  210. package/dist/domain/governance/activation/canonical-json.js +39 -0
  211. package/dist/domain/governance/activation/canonical-json.js.map +1 -0
  212. package/dist/domain/governance/activation/capabilities.d.ts +7 -0
  213. package/dist/domain/governance/activation/capabilities.js +33 -0
  214. package/dist/domain/governance/activation/capabilities.js.map +1 -0
  215. package/dist/domain/governance/activation/evidence.d.ts +63 -0
  216. package/dist/domain/governance/activation/evidence.js +444 -0
  217. package/dist/domain/governance/activation/evidence.js.map +1 -0
  218. package/dist/domain/governance/activation/graph.d.ts +397 -0
  219. package/dist/domain/governance/activation/graph.js +441 -0
  220. package/dist/domain/governance/activation/graph.js.map +1 -0
  221. package/dist/domain/governance/activation/inputs.d.ts +25 -0
  222. package/dist/domain/governance/activation/inputs.js +63 -0
  223. package/dist/domain/governance/activation/inputs.js.map +1 -0
  224. package/dist/domain/governance/activation/operations.d.ts +19 -0
  225. package/dist/domain/governance/activation/operations.js +181 -0
  226. package/dist/domain/governance/activation/operations.js.map +1 -0
  227. package/dist/domain/governance/activation/readiness.d.ts +27 -0
  228. package/dist/domain/governance/activation/readiness.js +269 -0
  229. package/dist/domain/governance/activation/readiness.js.map +1 -0
  230. package/dist/domain/governance/activation/types.d.ts +399 -0
  231. package/dist/domain/governance/activation/types.js +109 -0
  232. package/dist/domain/governance/activation/types.js.map +1 -0
  233. package/dist/domain/governance/activation/validators.d.ts +22 -0
  234. package/dist/domain/governance/activation/validators.js +1347 -0
  235. package/dist/domain/governance/activation/validators.js.map +1 -0
  236. package/dist/domain/governance/assessment/catalog.d.ts +14 -0
  237. package/dist/domain/governance/assessment/catalog.js +105 -0
  238. package/dist/domain/governance/assessment/catalog.js.map +1 -0
  239. package/dist/domain/governance/assessment/errors.d.ts +10 -0
  240. package/dist/domain/governance/assessment/errors.js +22 -0
  241. package/dist/domain/governance/assessment/errors.js.map +1 -0
  242. package/dist/domain/governance/assessment/index.d.ts +8 -0
  243. package/dist/domain/governance/assessment/index.js +9 -0
  244. package/dist/domain/governance/assessment/index.js.map +1 -0
  245. package/dist/domain/governance/assessment/live-normalize.d.ts +19 -0
  246. package/dist/domain/governance/assessment/live-normalize.js +403 -0
  247. package/dist/domain/governance/assessment/live-normalize.js.map +1 -0
  248. package/dist/domain/governance/assessment/predicates.d.ts +36 -0
  249. package/dist/domain/governance/assessment/predicates.js +545 -0
  250. package/dist/domain/governance/assessment/predicates.js.map +1 -0
  251. package/dist/domain/governance/assessment/report.d.ts +23 -0
  252. package/dist/domain/governance/assessment/report.js +266 -0
  253. package/dist/domain/governance/assessment/report.js.map +1 -0
  254. package/dist/domain/governance/assessment/sanitize.d.ts +8 -0
  255. package/dist/domain/governance/assessment/sanitize.js +60 -0
  256. package/dist/domain/governance/assessment/sanitize.js.map +1 -0
  257. package/dist/domain/governance/assessment/types.d.ts +174 -0
  258. package/dist/domain/governance/assessment/types.js +13 -0
  259. package/dist/domain/governance/assessment/types.js.map +1 -0
  260. package/dist/domain/governance/assessment/yaml.d.ts +6 -0
  261. package/dist/domain/governance/assessment/yaml.js +30 -0
  262. package/dist/domain/governance/assessment/yaml.js.map +1 -0
  263. package/dist/domain/governance/policy/identity.d.ts +64 -0
  264. package/dist/domain/governance/policy/identity.js +112 -0
  265. package/dist/domain/governance/policy/identity.js.map +1 -0
  266. package/dist/domain/migration/dependencies.d.ts +7 -0
  267. package/dist/domain/migration/dependencies.js +221 -0
  268. package/dist/domain/migration/dependencies.js.map +1 -0
  269. package/dist/domain/migration/inventory.d.ts +3 -0
  270. package/dist/domain/migration/inventory.js +15 -0
  271. package/dist/domain/migration/inventory.js.map +1 -0
  272. package/dist/domain/project/artifact-lifecycle.d.ts +69 -0
  273. package/dist/domain/project/artifact-lifecycle.js +137 -0
  274. package/dist/domain/project/artifact-lifecycle.js.map +1 -0
  275. package/dist/domain/project/catalog.d.ts +48 -0
  276. package/dist/domain/project/catalog.js +507 -0
  277. package/dist/domain/project/catalog.js.map +1 -0
  278. package/dist/domain/project/contracts.d.ts +247 -0
  279. package/dist/domain/project/contracts.js +2 -0
  280. package/dist/domain/project/contracts.js.map +1 -0
  281. package/dist/domain/project/errors.d.ts +3 -0
  282. package/dist/domain/project/errors.js +7 -0
  283. package/dist/domain/project/errors.js.map +1 -0
  284. package/dist/domain/project/infrastructure-layout.d.ts +26 -0
  285. package/dist/domain/project/infrastructure-layout.js +125 -0
  286. package/dist/domain/project/infrastructure-layout.js.map +1 -0
  287. package/dist/domain/project/inputs.d.ts +21 -0
  288. package/dist/domain/project/inputs.js +41 -0
  289. package/dist/domain/project/inputs.js.map +1 -0
  290. package/dist/domain/project/manifest/artifacts.d.ts +8 -0
  291. package/dist/domain/project/manifest/artifacts.js +150 -0
  292. package/dist/domain/project/manifest/artifacts.js.map +1 -0
  293. package/dist/domain/project/manifest/context.d.ts +13 -0
  294. package/dist/domain/project/manifest/context.js +2 -0
  295. package/dist/domain/project/manifest/context.js.map +1 -0
  296. package/dist/domain/project/manifest/fields.d.ts +6 -0
  297. package/dist/domain/project/manifest/fields.js +36 -0
  298. package/dist/domain/project/manifest/fields.js.map +1 -0
  299. package/dist/domain/project/manifest/governance.d.ts +8 -0
  300. package/dist/domain/project/manifest/governance.js +161 -0
  301. package/dist/domain/project/manifest/governance.js.map +1 -0
  302. package/dist/domain/project/manifest/project-identity.d.ts +6 -0
  303. package/dist/domain/project/manifest/project-identity.js +273 -0
  304. package/dist/domain/project/manifest/project-identity.js.map +1 -0
  305. package/dist/domain/project/manifest/reader.d.ts +9 -0
  306. package/dist/domain/project/manifest/reader.js +141 -0
  307. package/dist/domain/project/manifest/reader.js.map +1 -0
  308. package/dist/domain/project/paths.d.ts +2 -0
  309. package/dist/domain/project/paths.js +29 -0
  310. package/dist/domain/project/paths.js.map +1 -0
  311. package/dist/domain/project/planning.d.ts +19 -0
  312. package/dist/domain/project/planning.js +329 -0
  313. package/dist/domain/project/planning.js.map +1 -0
  314. package/dist/domain/project/retired-workload.d.ts +4 -0
  315. package/dist/domain/project/retired-workload.js +18 -0
  316. package/dist/domain/project/retired-workload.js.map +1 -0
  317. package/dist/domain/project/reviewed-update-artifacts.d.ts +2 -0
  318. package/dist/domain/project/reviewed-update-artifacts.js +3 -0
  319. package/dist/domain/project/reviewed-update-artifacts.js.map +1 -0
  320. package/dist/domain/project/supported-stack.d.ts +113 -0
  321. package/dist/domain/project/supported-stack.js +426 -0
  322. package/dist/domain/project/supported-stack.js.map +1 -0
  323. package/dist/domain/workstation/constraints.d.ts +6 -0
  324. package/dist/domain/workstation/constraints.js +8 -0
  325. package/dist/domain/workstation/constraints.js.map +1 -0
  326. package/dist/file-system.d.ts +10 -44
  327. package/dist/file-system.js +9 -1245
  328. package/dist/file-system.js.map +1 -1
  329. package/dist/framework-adapters.d.ts +1 -1
  330. package/dist/framework-validation.d.ts +1 -1
  331. package/dist/framework-validation.js +1 -1
  332. package/dist/framework-validation.js.map +1 -1
  333. package/dist/genai-templates.d.ts +2 -9
  334. package/dist/genai-templates.js +4 -5
  335. package/dist/genai-templates.js.map +1 -1
  336. package/dist/generators/common/artifacts.d.ts +6 -0
  337. package/dist/generators/common/artifacts.js +30 -0
  338. package/dist/generators/common/artifacts.js.map +1 -0
  339. package/dist/generators/common/base.d.ts +17 -0
  340. package/dist/generators/common/base.js +425 -0
  341. package/dist/generators/common/base.js.map +1 -0
  342. package/dist/generators/common/dotenv-validation.d.ts +2 -0
  343. package/dist/generators/common/dotenv-validation.js +80 -0
  344. package/dist/generators/common/dotenv-validation.js.map +1 -0
  345. package/dist/generators/common/environments.d.ts +3 -0
  346. package/dist/generators/common/environments.js +15 -0
  347. package/dist/generators/common/environments.js.map +1 -0
  348. package/dist/generators/common/frontend.d.ts +15 -0
  349. package/dist/generators/common/frontend.js +166 -0
  350. package/dist/generators/common/frontend.js.map +1 -0
  351. package/dist/generators/common/python-settings.d.ts +2 -0
  352. package/dist/generators/common/python-settings.js +70 -0
  353. package/dist/generators/common/python-settings.js.map +1 -0
  354. package/dist/generators/common/spec-workflow.d.ts +28 -0
  355. package/dist/generators/common/spec-workflow.js +567 -0
  356. package/dist/generators/common/spec-workflow.js.map +1 -0
  357. package/dist/generators/common/values.d.ts +13 -0
  358. package/dist/generators/common/values.js +16 -0
  359. package/dist/generators/common/values.js.map +1 -0
  360. package/dist/generators/containers/compose.d.ts +7 -0
  361. package/dist/generators/containers/compose.js +196 -0
  362. package/dist/generators/containers/compose.js.map +1 -0
  363. package/dist/generators/containers/context.d.ts +1 -0
  364. package/dist/generators/containers/context.js +43 -0
  365. package/dist/generators/containers/context.js.map +1 -0
  366. package/dist/generators/containers/images.d.ts +7 -0
  367. package/dist/generators/containers/images.js +119 -0
  368. package/dist/generators/containers/images.js.map +1 -0
  369. package/dist/generators/context.d.ts +42 -0
  370. package/dist/generators/context.js +38 -0
  371. package/dist/generators/context.js.map +1 -0
  372. package/dist/generators/genai/backend.d.ts +20 -0
  373. package/dist/generators/genai/backend.js +667 -0
  374. package/dist/generators/genai/backend.js.map +1 -0
  375. package/dist/generators/genai/configuration.d.ts +3 -0
  376. package/dist/generators/genai/configuration.js +43 -0
  377. package/dist/generators/genai/configuration.js.map +1 -0
  378. package/dist/generators/genai/database.d.ts +7 -0
  379. package/dist/generators/genai/database.js +71 -0
  380. package/dist/generators/genai/database.js.map +1 -0
  381. package/dist/generators/genai/functions.d.ts +15 -0
  382. package/dist/generators/genai/functions.js +156 -0
  383. package/dist/generators/genai/functions.js.map +1 -0
  384. package/dist/generators/genai/index.d.ts +8 -0
  385. package/dist/generators/genai/index.js +11 -0
  386. package/dist/generators/genai/index.js.map +1 -0
  387. package/dist/generators/genai/patterns.d.ts +9 -0
  388. package/dist/generators/genai/patterns.js +309 -0
  389. package/dist/generators/genai/patterns.js.map +1 -0
  390. package/dist/generators/infrastructure/azure.d.ts +18 -0
  391. package/dist/generators/infrastructure/azure.js +655 -0
  392. package/dist/generators/infrastructure/azure.js.map +1 -0
  393. package/dist/generators/infrastructure/names.d.ts +23 -0
  394. package/dist/generators/infrastructure/names.js +51 -0
  395. package/dist/generators/infrastructure/names.js.map +1 -0
  396. package/dist/generators/standard/configuration.d.ts +3 -0
  397. package/dist/generators/standard/configuration.js +26 -0
  398. package/dist/generators/standard/configuration.js.map +1 -0
  399. package/dist/generators/standard/go.d.ts +17 -0
  400. package/dist/generators/standard/go.js +338 -0
  401. package/dist/generators/standard/go.js.map +1 -0
  402. package/dist/generators/standard/index.d.ts +12 -0
  403. package/dist/generators/standard/index.js +12 -0
  404. package/dist/generators/standard/index.js.map +1 -0
  405. package/dist/generators/standard/node.d.ts +20 -0
  406. package/dist/generators/standard/node.js +314 -0
  407. package/dist/generators/standard/node.js.map +1 -0
  408. package/dist/generators/standard/python.d.ts +18 -0
  409. package/dist/generators/standard/python.js +191 -0
  410. package/dist/generators/standard/python.js.map +1 -0
  411. package/dist/go-template-assets.js +3 -3
  412. package/dist/go-template-assets.js.map +1 -1
  413. package/dist/governance-activation/activation-state.d.ts +1 -1
  414. package/dist/governance-activation/activation-state.js +49 -9
  415. package/dist/governance-activation/activation-state.js.map +1 -1
  416. package/dist/governance-activation/approvals.d.ts +1 -188
  417. package/dist/governance-activation/approvals.js +1 -507
  418. package/dist/governance-activation/approvals.js.map +1 -1
  419. package/dist/governance-activation/canonical-json.d.ts +1 -3
  420. package/dist/governance-activation/canonical-json.js +1 -35
  421. package/dist/governance-activation/canonical-json.js.map +1 -1
  422. package/dist/governance-activation/commands.d.ts +6 -1
  423. package/dist/governance-activation/commands.js +135 -107
  424. package/dist/governance-activation/commands.js.map +1 -1
  425. package/dist/governance-activation/compatibility.d.ts +30 -5
  426. package/dist/governance-activation/compatibility.js +74 -8
  427. package/dist/governance-activation/compatibility.js.map +1 -1
  428. package/dist/governance-activation/credentials.d.ts +3 -3
  429. package/dist/governance-activation/credentials.js +5 -5
  430. package/dist/governance-activation/credentials.js.map +1 -1
  431. package/dist/governance-activation/doctor.d.ts +1 -1
  432. package/dist/governance-activation/doctor.js +59 -100
  433. package/dist/governance-activation/doctor.js.map +1 -1
  434. package/dist/governance-activation/evidence.d.ts +1 -49
  435. package/dist/governance-activation/evidence.js +1 -245
  436. package/dist/governance-activation/evidence.js.map +1 -1
  437. package/dist/governance-activation/git-ignore.d.ts +9 -0
  438. package/dist/governance-activation/git-ignore.js +76 -0
  439. package/dist/governance-activation/git-ignore.js.map +1 -0
  440. package/dist/governance-activation/graph.d.ts +1 -397
  441. package/dist/governance-activation/graph.js +1 -440
  442. package/dist/governance-activation/graph.js.map +1 -1
  443. package/dist/governance-activation/historical-state.d.ts +81 -0
  444. package/dist/governance-activation/historical-state.js +817 -0
  445. package/dist/governance-activation/historical-state.js.map +1 -0
  446. package/dist/governance-activation/history-contracts.d.ts +109 -0
  447. package/dist/governance-activation/history-contracts.js +303 -0
  448. package/dist/governance-activation/history-contracts.js.map +1 -0
  449. package/dist/governance-activation/identity.d.ts +1 -35
  450. package/dist/governance-activation/identity.js +1 -88
  451. package/dist/governance-activation/identity.js.map +1 -1
  452. package/dist/governance-activation/index.d.ts +3 -0
  453. package/dist/governance-activation/index.js +3 -0
  454. package/dist/governance-activation/index.js.map +1 -1
  455. package/dist/governance-activation/inputs.d.ts +10 -0
  456. package/dist/governance-activation/inputs.js +158 -0
  457. package/dist/governance-activation/inputs.js.map +1 -0
  458. package/dist/governance-activation/migration-history.d.ts +97 -0
  459. package/dist/governance-activation/migration-history.js +388 -0
  460. package/dist/governance-activation/migration-history.js.map +1 -0
  461. package/dist/governance-activation/migration.d.ts +4 -3
  462. package/dist/governance-activation/migration.js +14 -6
  463. package/dist/governance-activation/migration.js.map +1 -1
  464. package/dist/governance-activation/phase-bootstrap-state.d.ts +3 -0
  465. package/dist/governance-activation/phase-bootstrap-state.js +128 -0
  466. package/dist/governance-activation/phase-bootstrap-state.js.map +1 -0
  467. package/dist/governance-activation/phase-discovery.d.ts +2 -0
  468. package/dist/governance-activation/phase-discovery.js +88 -0
  469. package/dist/governance-activation/phase-discovery.js.map +1 -0
  470. package/dist/governance-activation/phase-governance.d.ts +4 -0
  471. package/dist/governance-activation/phase-governance.js +141 -0
  472. package/dist/governance-activation/phase-governance.js.map +1 -0
  473. package/dist/governance-activation/phase-publication.d.ts +8 -0
  474. package/dist/governance-activation/phase-publication.js +318 -0
  475. package/dist/governance-activation/phase-publication.js.map +1 -0
  476. package/dist/governance-activation/proof-records.d.ts +3 -0
  477. package/dist/governance-activation/proof-records.js +78 -0
  478. package/dist/governance-activation/proof-records.js.map +1 -0
  479. package/dist/governance-activation/read-only.d.ts +30 -0
  480. package/dist/governance-activation/read-only.js +33 -0
  481. package/dist/governance-activation/read-only.js.map +1 -0
  482. package/dist/governance-activation/readiness.d.ts +1 -25
  483. package/dist/governance-activation/readiness.js +1 -222
  484. package/dist/governance-activation/readiness.js.map +1 -1
  485. package/dist/governance-activation/reconciliation.d.ts +1 -1
  486. package/dist/governance-activation/reconciliation.js +3 -3
  487. package/dist/governance-activation/reconciliation.js.map +1 -1
  488. package/dist/governance-activation/release-integrity.d.ts +1 -1
  489. package/dist/governance-activation/release-integrity.js +2 -2
  490. package/dist/governance-activation/release-integrity.js.map +1 -1
  491. package/dist/governance-activation/seed-lifecycle.d.ts +36 -6
  492. package/dist/governance-activation/seed-lifecycle.js +444 -77
  493. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  494. package/dist/governance-activation/source-of-truth.d.ts +5 -3
  495. package/dist/governance-activation/source-of-truth.js +32 -52
  496. package/dist/governance-activation/source-of-truth.js.map +1 -1
  497. package/dist/governance-activation/spec-kit-seed.d.ts +9 -0
  498. package/dist/governance-activation/spec-kit-seed.js +43 -0
  499. package/dist/governance-activation/spec-kit-seed.js.map +1 -0
  500. package/dist/governance-activation/task-projection.d.ts +1 -1
  501. package/dist/governance-activation/transition-planning.d.ts +17 -0
  502. package/dist/governance-activation/transition-planning.js +259 -0
  503. package/dist/governance-activation/transition-planning.js.map +1 -0
  504. package/dist/governance-activation/transition-ports.d.ts +150 -0
  505. package/dist/governance-activation/transition-ports.js +2 -0
  506. package/dist/governance-activation/transition-ports.js.map +1 -0
  507. package/dist/governance-activation/transition-process.d.ts +7 -0
  508. package/dist/governance-activation/transition-process.js +21 -0
  509. package/dist/governance-activation/transition-process.js.map +1 -0
  510. package/dist/governance-activation/transition-records.d.ts +56 -0
  511. package/dist/governance-activation/transition-records.js +208 -0
  512. package/dist/governance-activation/transition-records.js.map +1 -0
  513. package/dist/governance-activation/transitions.d.ts +14 -167
  514. package/dist/governance-activation/transitions.js +173 -2061
  515. package/dist/governance-activation/transitions.js.map +1 -1
  516. package/dist/governance-activation/types.d.ts +1 -390
  517. package/dist/governance-activation/types.js +1 -107
  518. package/dist/governance-activation/types.js.map +1 -1
  519. package/dist/governance-activation/validators.d.ts +1 -17
  520. package/dist/governance-activation/validators.js +1 -1304
  521. package/dist/governance-activation/validators.js.map +1 -1
  522. package/dist/governance-assessment/catalog.d.ts +1 -2
  523. package/dist/governance-assessment/catalog.js +18 -85
  524. package/dist/governance-assessment/catalog.js.map +1 -1
  525. package/dist/governance-assessment/command.d.ts +1 -1
  526. package/dist/governance-assessment/command.js +8 -12
  527. package/dist/governance-assessment/command.js.map +1 -1
  528. package/dist/governance-assessment/engine.d.ts +6 -11
  529. package/dist/governance-assessment/engine.js +490 -114
  530. package/dist/governance-assessment/engine.js.map +1 -1
  531. package/dist/governance-assessment/live-normalize.d.ts +1 -19
  532. package/dist/governance-assessment/live-normalize.js +1 -402
  533. package/dist/governance-assessment/live-normalize.js.map +1 -1
  534. package/dist/governance-assessment/live-transport.d.ts +2 -6
  535. package/dist/governance-assessment/live-transport.js +10 -22
  536. package/dist/governance-assessment/live-transport.js.map +1 -1
  537. package/dist/governance-assessment/live.js +55 -5
  538. package/dist/governance-assessment/live.js.map +1 -1
  539. package/dist/governance-assessment/predicates.d.ts +1 -27
  540. package/dist/governance-assessment/predicates.js +1 -329
  541. package/dist/governance-assessment/predicates.js.map +1 -1
  542. package/dist/governance-assessment/project.d.ts +20 -17
  543. package/dist/governance-assessment/project.js +101 -151
  544. package/dist/governance-assessment/project.js.map +1 -1
  545. package/dist/governance-assessment/readers.d.ts +1 -5
  546. package/dist/governance-assessment/readers.js +5 -13
  547. package/dist/governance-assessment/readers.js.map +1 -1
  548. package/dist/governance-assessment/report.d.ts +1 -23
  549. package/dist/governance-assessment/report.js +1 -265
  550. package/dist/governance-assessment/report.js.map +1 -1
  551. package/dist/governance-assessment/sanitize.d.ts +1 -8
  552. package/dist/governance-assessment/sanitize.js +1 -56
  553. package/dist/governance-assessment/sanitize.js.map +1 -1
  554. package/dist/governance-assessment/types.d.ts +1 -173
  555. package/dist/governance-assessment/types.js +1 -12
  556. package/dist/governance-assessment/types.js.map +1 -1
  557. package/dist/governance-assessment/yaml.d.ts +1 -6
  558. package/dist/governance-assessment/yaml.js +1 -29
  559. package/dist/governance-assessment/yaml.js.map +1 -1
  560. package/dist/init-filesystem.d.ts +1 -1
  561. package/dist/init-filesystem.js +126 -174
  562. package/dist/init-filesystem.js.map +1 -1
  563. package/dist/interactive.d.ts +2 -2
  564. package/dist/interactive.js +42 -41
  565. package/dist/interactive.js.map +1 -1
  566. package/dist/migrate-plan.d.ts +1 -1
  567. package/dist/migrate-plan.js +14 -8
  568. package/dist/migrate-plan.js.map +1 -1
  569. package/dist/npm-template-assets.js +5 -4
  570. package/dist/npm-template-assets.js.map +1 -1
  571. package/dist/openspec-profile.d.ts +1 -1
  572. package/dist/opentofu-template-assets.js +3 -3
  573. package/dist/opentofu-template-assets.js.map +1 -1
  574. package/dist/package-identity.d.ts +3 -0
  575. package/dist/package-identity.js +13 -2
  576. package/dist/package-identity.js.map +1 -1
  577. package/dist/planner.d.ts +1 -19
  578. package/dist/planner.js +1 -565
  579. package/dist/planner.js.map +1 -1
  580. package/dist/process-runner.d.ts +1 -1
  581. package/dist/project-dependencies.d.ts +5 -3
  582. package/dist/project-dependencies.js +74 -63
  583. package/dist/project-dependencies.js.map +1 -1
  584. package/dist/published-verifier.js +61 -30
  585. package/dist/published-verifier.js.map +1 -1
  586. package/dist/python-template-assets.js +6 -9
  587. package/dist/python-template-assets.js.map +1 -1
  588. package/dist/reconcile.d.ts +1 -1
  589. package/dist/reconcile.js +2 -2
  590. package/dist/reconcile.js.map +1 -1
  591. package/dist/repository-governance.d.ts +5 -2
  592. package/dist/repository-governance.js +140 -113
  593. package/dist/repository-governance.js.map +1 -1
  594. package/dist/runtime.js +1 -1
  595. package/dist/runtime.js.map +1 -1
  596. package/dist/scan.d.ts +6 -2
  597. package/dist/scan.js +78 -30
  598. package/dist/scan.js.map +1 -1
  599. package/dist/self-upgrade.d.ts +1 -1
  600. package/dist/self-upgrade.js +20 -7
  601. package/dist/self-upgrade.js.map +1 -1
  602. package/dist/stable-release.js +7 -1
  603. package/dist/stable-release.js.map +1 -1
  604. package/dist/standard-templates.d.ts +2 -2
  605. package/dist/standard-templates.js +6 -841
  606. package/dist/standard-templates.js.map +1 -1
  607. package/dist/supported-stack.d.ts +3 -115
  608. package/dist/supported-stack.js +4 -438
  609. package/dist/supported-stack.js.map +1 -1
  610. package/dist/telemetry/index.d.ts +1 -1
  611. package/dist/templates.d.ts +10 -20
  612. package/dist/templates.js +52 -3261
  613. package/dist/templates.js.map +1 -1
  614. package/dist/types.d.ts +1 -263
  615. package/dist/types.js +1 -1
  616. package/dist/types.js.map +1 -1
  617. package/dist/version.js +2 -6
  618. package/dist/version.js.map +1 -1
  619. package/dist/workstation-catalog.d.ts +5 -2
  620. package/dist/workstation-catalog.js +33 -2
  621. package/dist/workstation-catalog.js.map +1 -1
  622. package/dist/workstation.d.ts +4 -3
  623. package/dist/workstation.js +86 -32
  624. package/dist/workstation.js.map +1 -1
  625. package/docs/assets/liftoff-terminal.svg +3 -3
  626. package/docs/azure-deployment.md +107 -10
  627. package/docs/cli-reference.md +144 -35
  628. package/docs/configuration-and-manifests.md +152 -35
  629. package/docs/existing-repositories.md +48 -12
  630. package/docs/getting-started.md +44 -31
  631. package/docs/prerequisites.md +34 -35
  632. package/docs/project-structure.md +39 -46
  633. package/docs/repository-governance.md +96 -26
  634. package/docs/safety-and-consent.md +90 -28
  635. package/docs/spec-workflows-and-agents.md +31 -28
  636. package/docs/supported-stack.md +11 -9
  637. package/docs/troubleshooting.md +114 -54
  638. package/docs/workloads.md +52 -67
  639. package/package.json +4 -7
  640. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/UPSTREAM_LICENSE.txt +0 -21
  641. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +0 -520
  642. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/packaged/gitignore +0 -27
  643. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/README.md +0 -25
  644. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/components.json +0 -22
  645. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/eslint.config.js +0 -23
  646. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/index.html +0 -13
  647. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +0 -6156
  648. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package.json +0 -60
  649. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/public/power-apps.svg +0 -55
  650. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/App.tsx +0 -17
  651. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/assets/react.svg +0 -1
  652. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/mode-toggle.tsx +0 -37
  653. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/badge.tsx +0 -46
  654. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/button.tsx +0 -60
  655. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/calendar.tsx +0 -211
  656. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/card.tsx +0 -92
  657. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/chart.tsx +0 -355
  658. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/checkbox.tsx +0 -32
  659. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/command.tsx +0 -184
  660. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dialog.tsx +0 -141
  661. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dropdown-menu.tsx +0 -257
  662. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/input.tsx +0 -21
  663. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/label.tsx +0 -22
  664. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/popover.tsx +0 -46
  665. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/progress.tsx +0 -29
  666. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/select.tsx +0 -185
  667. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/separator.tsx +0 -26
  668. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/skeleton.tsx +0 -13
  669. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/table.tsx +0 -114
  670. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tabs.tsx +0 -66
  671. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/textarea.tsx +0 -18
  672. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tooltip.tsx +0 -61
  673. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/hooks/use-theme.ts +0 -11
  674. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/index.css +0 -131
  675. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/lib/utils.ts +0 -6
  676. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/main.tsx +0 -10
  677. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/_layout.tsx +0 -31
  678. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/home.tsx +0 -59
  679. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/not-found.tsx +0 -14
  680. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/query-provider.tsx +0 -26
  681. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/sonner-provider.tsx +0 -23
  682. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/theme-provider.tsx +0 -64
  683. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/router.tsx +0 -24
  684. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.app.json +0 -34
  685. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.json +0 -13
  686. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.node.json +0 -26
  687. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/vite.config.ts +0 -19
  688. package/assets/power-apps-code-app/README.md +0 -27
  689. package/dist/code-apps-plugin.d.ts +0 -13
  690. package/dist/code-apps-plugin.js +0 -69
  691. package/dist/code-apps-plugin.js.map +0 -1
  692. package/dist/power-apps-assets.d.ts +0 -30
  693. package/dist/power-apps-assets.js +0 -131
  694. package/dist/power-apps-assets.js.map +0 -1
  695. package/dist/power-apps-templates.d.ts +0 -3
  696. package/dist/power-apps-templates.js +0 -177
  697. package/dist/power-apps-templates.js.map +0 -1
  698. package/dist/power-apps-validation.d.ts +0 -1
  699. package/dist/power-apps-validation.js +0 -79
  700. package/dist/power-apps-validation.js.map +0 -1
@@ -0,0 +1,613 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { lstat, mkdir, open, realpath, rename, unlink } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { createUpdatePreviewReceipt, normalizeUpdatePreviewProjectRoot, updatePreviewDirectoryParts, updatePreviewProjectKey, UpdatePreviewError, validateUpdatePreviewReceipt } from '../../application/update/preview.js';
7
+ import { formatUpdateCommand } from '../../application/update/command-guidance.js';
8
+ import { createUpdateTransactionApprovalSeal, updateTransactionApprovalKey, UpdateTransactionApprovalError, validateUpdateTransactionApprovalDigests, validateUpdateTransactionApprovalSeal } from '../../application/update/transaction-approval.js';
9
+ import { canonicalJson } from '../../domain/governance/activation/canonical-json.js';
10
+ import { errorCode, errorMessage } from './errors.js';
11
+ export const nodeUpdatePreviewFileSystem = {
12
+ lstat,
13
+ realpath,
14
+ makeDirectory: async (directoryPath, mode) => { await mkdir(directoryPath, { mode }); },
15
+ openFile: async (filePath, access, mode) => {
16
+ const noFollow = constants.O_NOFOLLOW ?? 0;
17
+ const flags = access === 'read'
18
+ ? constants.O_RDONLY | noFollow
19
+ : constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | noFollow;
20
+ const handle = await open(filePath, flags, mode);
21
+ return {
22
+ stat: () => handle.stat(),
23
+ readText: async (maximumBytes) => {
24
+ const bytes = Buffer.alloc(maximumBytes + 1);
25
+ let length = 0;
26
+ while (length < bytes.length) {
27
+ const result = await handle.read(bytes, length, bytes.length - length, length);
28
+ if (!result.bytesRead)
29
+ break;
30
+ length += result.bytesRead;
31
+ }
32
+ if (length > maximumBytes)
33
+ throw new Error('Preview receipt exceeds its size limit.');
34
+ return bytes.subarray(0, length).toString('utf8');
35
+ },
36
+ writeText: (content) => handle.writeFile(content, 'utf8'),
37
+ chmod: (mode) => handle.chmod(mode),
38
+ sync: () => handle.sync(),
39
+ close: () => handle.close()
40
+ };
41
+ },
42
+ replaceFile: rename,
43
+ removeFile: unlink,
44
+ syncDirectory: async (directoryPath) => {
45
+ try {
46
+ const handle = await open(directoryPath, constants.O_RDONLY | (constants.O_DIRECTORY ?? 0) | (constants.O_NOFOLLOW ?? 0));
47
+ await withCleanup(async () => {
48
+ if (!(await handle.stat()).isDirectory())
49
+ throw new Error('Only a regular directory can be flushed.');
50
+ await handle.sync();
51
+ }, () => handle.close());
52
+ }
53
+ catch (error) {
54
+ // Node does not support flushing directory handles on every Windows filesystem.
55
+ if (process.platform !== 'win32' ||
56
+ !['EACCES', 'EPERM', 'EINVAL', 'ENOTSUP', 'EISDIR'].includes(errorCode(error) ?? ''))
57
+ throw error;
58
+ }
59
+ }
60
+ };
61
+ const maximumReceiptBytes = 64 * 1024;
62
+ function storageError(message, cause) {
63
+ return new UpdatePreviewError('preview-storage', message, { cause });
64
+ }
65
+ async function io(operation, filePath, action) {
66
+ try {
67
+ return await action();
68
+ }
69
+ catch (error) {
70
+ if (error instanceof UpdatePreviewError)
71
+ throw error;
72
+ throw storageError(`Unable to ${operation} preview storage at ${filePath}: ${errorMessage(error)}`, error);
73
+ }
74
+ }
75
+ function nativePaths(platform) {
76
+ return platform === 'win32' ? path.win32 : path.posix;
77
+ }
78
+ function absoluteNativePath(value, paths, label, fromRealpath = false) {
79
+ let candidate = value;
80
+ if (fromRealpath && paths === path.win32) {
81
+ if (candidate.startsWith('\\\\?\\UNC\\'))
82
+ candidate = `\\\\${candidate.slice(8)}`;
83
+ else if (/^\\\\\?\\[a-z]:\\/iu.test(candidate))
84
+ candidate = candidate.slice(4);
85
+ }
86
+ if (!candidate || /[\u0000-\u001f]/u.test(candidate) || !paths.isAbsolute(candidate)) {
87
+ throw storageError(`${label} must be an absolute native path.`);
88
+ }
89
+ const normalized = paths.normalize(candidate);
90
+ const root = paths.parse(normalized).root;
91
+ if (paths === path.win32) {
92
+ if (!/^[a-z]:\\$/iu.test(root) && !/^\\\\[^\\]+\\[^\\]+\\$/u.test(root)) {
93
+ throw storageError(`${label} must include an absolute Windows drive or UNC share.`);
94
+ }
95
+ const parts = normalized.slice(/^[a-z]:\\/iu.test(normalized) ? 3 : 2).split('\\').filter(Boolean);
96
+ if (parts.some((part) => /[<>:"|?*]/u.test(part) || /[. ]$/u.test(part) ||
97
+ /^(?:con|prn|aux|nul|com[1-9¹²³]|lpt[1-9¹²³])(?:\.|$)/iu.test(part))) {
98
+ throw storageError(`${label} contains an unsafe Windows path component.`);
99
+ }
100
+ }
101
+ return normalized === root ? root : normalized.endsWith(paths.sep) ? normalized.slice(0, -1) : normalized;
102
+ }
103
+ function stateBase(options) {
104
+ const env = options.env ?? process.env;
105
+ const platform = options.platform ?? process.platform;
106
+ const paths = nativePaths(platform);
107
+ if (platform === 'linux' && env.XDG_STATE_HOME !== undefined) {
108
+ return absoluteNativePath(env.XDG_STATE_HOME, paths, 'XDG_STATE_HOME');
109
+ }
110
+ if (platform === 'win32' && env.LOCALAPPDATA !== undefined) {
111
+ return absoluteNativePath(env.LOCALAPPDATA, paths, 'LOCALAPPDATA');
112
+ }
113
+ const home = absoluteNativePath(options.homedir ?? os.homedir(), paths, 'Home directory');
114
+ if (platform === 'darwin')
115
+ return paths.join(home, 'Library', 'Application Support');
116
+ if (platform === 'win32')
117
+ return paths.join(home, 'AppData', 'Local');
118
+ if (platform === 'linux')
119
+ return paths.join(home, '.local', 'state');
120
+ throw storageError(`Update preview storage does not support platform ${platform}.`);
121
+ }
122
+ export function getUpdatePreviewDirectory(options = {}) {
123
+ return nativePaths(options.platform ?? process.platform).join(stateBase(options), ...updatePreviewDirectoryParts);
124
+ }
125
+ function comparable(value, platform) {
126
+ return platform === 'win32' || platform === 'darwin' ? value.normalize('NFC').toLowerCase() : value;
127
+ }
128
+ function within(root, candidate, paths, platform) {
129
+ const relative = paths.relative(comparable(root, platform), comparable(candidate, platform));
130
+ return relative === '' || relative !== '..' && !relative.startsWith(`..${paths.sep}`) && !paths.isAbsolute(relative);
131
+ }
132
+ function rejectContainedStore(directory, boundaries, paths, platform) {
133
+ if (boundaries.some((boundary) => within(boundary, directory, paths, platform))) {
134
+ throw storageError(`Preview storage must be outside both the project and its containing repository: ${directory}`);
135
+ }
136
+ }
137
+ async function inspect(fs, filePath) {
138
+ try {
139
+ return await fs.lstat(filePath);
140
+ }
141
+ catch (error) {
142
+ if (errorCode(error) === 'ENOENT')
143
+ return undefined;
144
+ throw storageError(`Unable to inspect preview storage path ${filePath}: ${errorMessage(error)}`, error);
145
+ }
146
+ }
147
+ function regularDirectory(details, filePath) {
148
+ if (details.isSymbolicLink() || !details.isDirectory()) {
149
+ throw storageError(`Preview path must be a regular directory, not a symlink, junction, or other path type: ${filePath}`);
150
+ }
151
+ }
152
+ async function canonicalDirectory(fs, paths, directory) {
153
+ const details = await inspect(fs, directory);
154
+ if (!details)
155
+ throw storageError(`Project or repository directory is missing: ${directory}`);
156
+ regularDirectory(details, directory);
157
+ const resolved = absoluteNativePath(await io('resolve', directory, () => fs.realpath(directory)), paths, 'Canonical directory', true);
158
+ const current = await inspect(fs, directory);
159
+ const canonical = await inspect(fs, resolved);
160
+ if (!current || !canonical || !sameFile(details, current) || !sameFile(details, canonical)) {
161
+ throw storageError(`Project or repository directory changed while resolving: ${directory}`);
162
+ }
163
+ regularDirectory(current, directory);
164
+ regularDirectory(canonical, resolved);
165
+ return resolved;
166
+ }
167
+ async function discoverRepository(fs, paths, root) {
168
+ let candidate = root;
169
+ while (true) {
170
+ const marker = paths.join(candidate, '.git');
171
+ const details = await inspect(fs, marker);
172
+ if (details) {
173
+ if (details.isSymbolicLink() || !details.isDirectory() && !details.isFile()) {
174
+ throw storageError(`Repository marker has an unsafe path type: ${marker}`);
175
+ }
176
+ return candidate;
177
+ }
178
+ const parent = paths.dirname(candidate);
179
+ if (parent === candidate)
180
+ return undefined;
181
+ candidate = parent;
182
+ }
183
+ }
184
+ async function canonicalStateBase(fs, paths, base) {
185
+ let existing = base;
186
+ const missing = [];
187
+ while (true) {
188
+ const details = await inspect(fs, existing);
189
+ if (details) {
190
+ if (existing === base || !details.isSymbolicLink())
191
+ regularDirectory(details, existing);
192
+ // Native ancestor aliases (for example macOS /var) are resolved before using the private subtree.
193
+ const real = absoluteNativePath(await io('resolve', existing, () => fs.realpath(existing)), paths, 'Canonical state base', true);
194
+ const realDetails = await inspect(fs, real);
195
+ if (!realDetails)
196
+ throw storageError(`Canonical state ancestor disappeared: ${real}`);
197
+ regularDirectory(realDetails, real);
198
+ return paths.join(real, ...missing);
199
+ }
200
+ const parent = paths.dirname(existing);
201
+ if (parent === existing)
202
+ throw storageError(`No existing native ancestor for preview state base: ${base}`);
203
+ missing.unshift(paths.basename(existing));
204
+ existing = parent;
205
+ }
206
+ }
207
+ async function storageFor(projectRoot, options) {
208
+ const fs = options.fileSystem ?? nodeUpdatePreviewFileSystem;
209
+ const platform = options.platform ?? process.platform;
210
+ if (platform !== process.platform && fs === nodeUpdatePreviewFileSystem) {
211
+ throw storageError('A non-native preview platform requires an injected filesystem.');
212
+ }
213
+ const paths = nativePaths(platform);
214
+ const requestedRoot = absoluteNativePath(projectRoot, paths, 'Project root');
215
+ const root = normalizeUpdatePreviewProjectRoot(await canonicalDirectory(fs, paths, requestedRoot));
216
+ const requestedRepository = options.repositoryRoot === undefined
217
+ ? undefined : absoluteNativePath(options.repositoryRoot, paths, 'Repository root');
218
+ const repositoryRoot = requestedRepository === undefined
219
+ ? await discoverRepository(fs, paths, root)
220
+ : await canonicalDirectory(fs, paths, requestedRepository);
221
+ if (repositoryRoot !== undefined && !within(repositoryRoot, root, paths, platform)) {
222
+ throw storageError(`The supplied repository does not contain the project: ${repositoryRoot}`);
223
+ }
224
+ const boundaries = [requestedRoot, root, ...repositoryRoot ? [repositoryRoot] : [],
225
+ ...requestedRepository ? [requestedRepository] : []];
226
+ const base = stateBase(options);
227
+ rejectContainedStore(paths.join(base, ...updatePreviewDirectoryParts), boundaries, paths, platform);
228
+ const directory = paths.join(await canonicalStateBase(fs, paths, base), ...updatePreviewDirectoryParts);
229
+ rejectContainedStore(directory, boundaries, paths, platform);
230
+ const projectKey = updatePreviewProjectKey(root);
231
+ return {
232
+ location: Object.freeze({
233
+ projectRoot: root,
234
+ projectKey,
235
+ ...repositoryRoot === undefined ? {} : { repositoryRoot },
236
+ directory,
237
+ receiptPath: paths.join(directory, `${projectKey}.json`)
238
+ }),
239
+ fs,
240
+ paths,
241
+ platform,
242
+ now: options.clock ?? (() => new Date())
243
+ };
244
+ }
245
+ function sameFile(left, right) {
246
+ return left.dev === right.dev && left.ino === right.ino;
247
+ }
248
+ async function assertDirectories(storage, snapshot) {
249
+ const privateRoot = storage.paths.dirname(storage.location.directory);
250
+ for (const [directory, before] of snapshot) {
251
+ const current = await inspect(storage.fs, directory);
252
+ if (!current || current.isSymbolicLink() || !current.isDirectory() || !sameFile(before, current)) {
253
+ throw storageError(`Preview storage directory changed during the operation: ${directory}`);
254
+ }
255
+ if (storage.platform !== 'win32' && within(privateRoot, directory, storage.paths, storage.platform) &&
256
+ (current.mode & 0o077) !== 0) {
257
+ throw storageError(`Preview directory permissions changed during the operation: ${directory}`);
258
+ }
259
+ }
260
+ }
261
+ async function directories(storage, create) {
262
+ const chain = [];
263
+ let candidate = storage.location.directory;
264
+ while (true) {
265
+ chain.unshift(candidate);
266
+ const parent = storage.paths.dirname(candidate);
267
+ if (parent === candidate)
268
+ break;
269
+ candidate = parent;
270
+ }
271
+ const snapshot = new Map();
272
+ const privateRoot = storage.paths.dirname(storage.location.directory);
273
+ for (const directory of chain) {
274
+ let details = await inspect(storage.fs, directory);
275
+ if (!details) {
276
+ if (!create)
277
+ return undefined;
278
+ await assertDirectories(storage, snapshot);
279
+ try {
280
+ await storage.fs.makeDirectory(directory, 0o700);
281
+ }
282
+ catch (error) {
283
+ if (errorCode(error) !== 'EEXIST') {
284
+ throw storageError(`Unable to create preview directory ${directory}: ${errorMessage(error)}`, error);
285
+ }
286
+ }
287
+ details = await inspect(storage.fs, directory);
288
+ if (!details)
289
+ throw storageError(`Created preview directory is missing: ${directory}`);
290
+ await assertDirectories(storage, snapshot);
291
+ const parent = storage.paths.dirname(directory);
292
+ await io('flush created state directory parent', parent, () => storage.fs.syncDirectory(parent));
293
+ }
294
+ regularDirectory(details, directory);
295
+ if (storage.platform !== 'win32' && within(privateRoot, directory, storage.paths, storage.platform) &&
296
+ (details.mode & 0o077) !== 0) {
297
+ throw storageError(`Preview directories require private permissions (0700): ${directory}`);
298
+ }
299
+ const real = absoluteNativePath(await io('resolve', directory, () => storage.fs.realpath(directory)), storage.paths, 'Preview directory', true);
300
+ if (comparable(real, storage.platform) !== comparable(directory, storage.platform)) {
301
+ throw storageError(`Preview directory resolves through an unsafe alias: ${directory}`);
302
+ }
303
+ snapshot.set(directory, details);
304
+ }
305
+ return snapshot;
306
+ }
307
+ export async function resolveUpdatePreviewLocation(projectRoot, options = {}) {
308
+ const storage = await storageFor(projectRoot, options);
309
+ await directories(storage, false);
310
+ return storage.location;
311
+ }
312
+ function privateFile(storage, details, filePath) {
313
+ if (details.isSymbolicLink() || !details.isFile() || details.nlink !== 1) {
314
+ throw storageError(`Preview storage requires a singly linked regular file, not a symlink, junction, or hard link: ${filePath}`);
315
+ }
316
+ if (storage.platform !== 'win32' && (details.mode & 0o077) !== 0) {
317
+ throw storageError(`Preview files require private permissions (0600): ${filePath}`);
318
+ }
319
+ }
320
+ async function withCleanup(action, cleanup) {
321
+ let result;
322
+ try {
323
+ result = await action();
324
+ }
325
+ catch (error) {
326
+ try {
327
+ await cleanup();
328
+ }
329
+ catch (cleanupError) {
330
+ throw storageError(`${errorMessage(error)} Cleanup also failed: ${errorMessage(cleanupError)}`, error);
331
+ }
332
+ throw error;
333
+ }
334
+ await cleanup();
335
+ return result;
336
+ }
337
+ async function readText(storage, filePath, snapshot) {
338
+ await assertDirectories(storage, snapshot);
339
+ const before = await inspect(storage.fs, filePath);
340
+ if (!before)
341
+ return undefined;
342
+ privateFile(storage, before, filePath);
343
+ if (before.size > maximumReceiptBytes)
344
+ throw storageError(`Preview receipt exceeds its size limit: ${filePath}`);
345
+ const handle = await io('open for reading', filePath, () => storage.fs.openFile(filePath, 'read', 0o600));
346
+ return withCleanup(async () => {
347
+ const opened = await io('inspect opened file', filePath, () => handle.stat());
348
+ privateFile(storage, opened, filePath);
349
+ if (!sameFile(before, opened))
350
+ throw storageError(`Preview file changed while opening: ${filePath}`);
351
+ const content = await io('read', filePath, () => handle.readText(maximumReceiptBytes));
352
+ const after = await inspect(storage.fs, filePath);
353
+ if (!after || !sameFile(before, after) || before.size !== after.size ||
354
+ before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs) {
355
+ throw storageError(`Preview file changed while reading: ${filePath}`);
356
+ }
357
+ privateFile(storage, after, filePath);
358
+ await assertDirectories(storage, snapshot);
359
+ return content;
360
+ }, () => io('close', filePath, () => handle.close()));
361
+ }
362
+ function parseReceipt(content, storage) {
363
+ let value;
364
+ try {
365
+ value = JSON.parse(content);
366
+ }
367
+ catch (error) {
368
+ throw new UpdatePreviewError('preview-invalid', `Malformed preview receipt JSON: ${storage.location.receiptPath}`, { cause: error });
369
+ }
370
+ return validateUpdatePreviewReceipt(value, { projectRoot: storage.location.projectRoot, now: storage.now() });
371
+ }
372
+ function missing(storage) {
373
+ const { location } = storage;
374
+ throw new UpdatePreviewError('preview-missing', `No preview receipt exists for this project at ${location.receiptPath}. Run ${formatUpdateCommand(location.projectRoot, 'check', storage.platform)}.`);
375
+ }
376
+ export async function loadUpdatePreviewReceipt(projectRoot, options = {}) {
377
+ const storage = await storageFor(projectRoot, options);
378
+ const snapshot = await directories(storage, false);
379
+ if (!snapshot)
380
+ missing(storage);
381
+ const content = await readText(storage, storage.location.receiptPath, snapshot);
382
+ if (content === undefined)
383
+ missing(storage);
384
+ return { location: storage.location, receipt: parseReceipt(content, storage) };
385
+ }
386
+ async function assertOwnedFile(storage, filePath, owned) {
387
+ const current = await inspect(storage.fs, filePath);
388
+ if (!current || !sameFile(owned, current))
389
+ throw storageError(`Preview storage file was replaced; replacement preserved: ${filePath}`);
390
+ privateFile(storage, current, filePath);
391
+ }
392
+ async function exclusiveFile(storage, filePath, snapshot, action, isLock = false) {
393
+ await assertDirectories(storage, snapshot);
394
+ let handle;
395
+ try {
396
+ handle = await io('create exclusive file', filePath, () => storage.fs.openFile(filePath, 'create-exclusive', 0o600));
397
+ }
398
+ catch (error) {
399
+ if (isLock && error instanceof UpdatePreviewError && errorCode(error.cause) === 'EEXIST') {
400
+ throw new UpdatePreviewError('preview-busy', `Another preview write or cleanup is in progress: ${filePath}`, { cause: error });
401
+ }
402
+ throw error;
403
+ }
404
+ let owned;
405
+ let closed = false;
406
+ const close = async () => {
407
+ if (!closed) {
408
+ await io('close', filePath, () => handle.close());
409
+ closed = true;
410
+ }
411
+ };
412
+ return withCleanup(async () => {
413
+ owned = await io('establish file ownership', filePath, () => handle.stat());
414
+ await io('set private permissions', filePath, () => handle.chmod(0o600));
415
+ return action(handle, owned, close);
416
+ }, async () => {
417
+ const failures = [];
418
+ try {
419
+ await close();
420
+ }
421
+ catch (error) {
422
+ failures.push(errorMessage(error));
423
+ }
424
+ try {
425
+ await assertDirectories(storage, snapshot);
426
+ const current = await inspect(storage.fs, filePath);
427
+ if (current) {
428
+ if (!owned)
429
+ throw storageError(`Unable to establish ownership; preview storage file was preserved: ${filePath}`);
430
+ await assertOwnedFile(storage, filePath, owned);
431
+ await io('remove owned file', filePath, () => storage.fs.removeFile(filePath));
432
+ }
433
+ if (isLock) {
434
+ await assertDirectories(storage, snapshot);
435
+ await io('flush metadata lock cleanup', storage.location.directory, () => storage.fs.syncDirectory(storage.location.directory));
436
+ }
437
+ }
438
+ catch (error) {
439
+ failures.push(errorMessage(error));
440
+ }
441
+ if (failures.length)
442
+ throw storageError(failures.join('; '));
443
+ });
444
+ }
445
+ async function withStoreLock(storage, snapshot, operation) {
446
+ const lockPath = storage.paths.join(storage.location.directory, `${storage.location.projectKey}.lock`);
447
+ const existing = await inspect(storage.fs, lockPath);
448
+ if (existing) {
449
+ privateFile(storage, existing, lockPath);
450
+ throw new UpdatePreviewError('preview-busy', `Another preview write or cleanup is in progress: ${lockPath}`);
451
+ }
452
+ return exclusiveFile(storage, lockPath, snapshot, async (_handle, owned) => {
453
+ await assertOwnedFile(storage, lockPath, owned);
454
+ const result = await operation();
455
+ await assertOwnedFile(storage, lockPath, owned);
456
+ return result;
457
+ }, true);
458
+ }
459
+ async function writeAtomicMetadata(storage, snapshot, filePath, content, before, durable = false) {
460
+ if (Buffer.byteLength(content) > maximumReceiptBytes)
461
+ throw storageError('User-local update metadata exceeds its size limit.');
462
+ const temporaryPath = storage.paths.join(storage.location.directory, `.${storage.paths.basename(filePath)}.${randomUUID()}.tmp`);
463
+ await exclusiveFile(storage, temporaryPath, snapshot, async (handle, owned, close) => {
464
+ await io('write', temporaryPath, () => handle.writeText(content));
465
+ await io('flush', temporaryPath, () => handle.sync());
466
+ await close();
467
+ await assertOwnedFile(storage, temporaryPath, owned);
468
+ if (await readText(storage, temporaryPath, snapshot) !== content) {
469
+ throw storageError(`User-local update temporary contents changed before replacement: ${temporaryPath}`);
470
+ }
471
+ if (await readText(storage, filePath, snapshot) !== before) {
472
+ throw storageError(`User-local update metadata changed before replacement: ${filePath}`);
473
+ }
474
+ await assertDirectories(storage, snapshot);
475
+ await io('atomically replace receipt or seal', filePath, () => storage.fs.replaceFile(temporaryPath, filePath));
476
+ if (durable) {
477
+ await assertDirectories(storage, snapshot);
478
+ await io('flush approval seal directory', storage.location.directory, () => storage.fs.syncDirectory(storage.location.directory));
479
+ }
480
+ });
481
+ }
482
+ export async function issueUpdatePreviewReceipt(projectRoot, descriptors, options = {}) {
483
+ const storage = await storageFor(projectRoot, options);
484
+ const now = storage.now();
485
+ if (!Number.isFinite(now.getTime()))
486
+ throw new UpdatePreviewError('preview-invalid', 'The preview clock is invalid.');
487
+ const receipt = validateUpdatePreviewReceipt(createUpdatePreviewReceipt(descriptors, {
488
+ receiptId: randomUUID(),
489
+ issuedAt: now.toISOString()
490
+ }), { projectRoot: storage.location.projectRoot, now });
491
+ const snapshot = await directories(storage, true);
492
+ if (!snapshot)
493
+ throw storageError(`Unable to create preview storage: ${storage.location.directory}`);
494
+ return withStoreLock(storage, snapshot, async () => {
495
+ const before = await readText(storage, storage.location.receiptPath, snapshot);
496
+ if (before !== undefined)
497
+ parseReceipt(before, storage);
498
+ await writeAtomicMetadata(storage, snapshot, storage.location.receiptPath, canonicalJson(receipt), before);
499
+ return { location: storage.location, receipt };
500
+ });
501
+ }
502
+ function approvalPath(storage, binding) {
503
+ return storage.paths.join(storage.location.directory, `approval-${updateTransactionApprovalKey(binding)}.json`);
504
+ }
505
+ function parseApproval(content, storage, binding, filePath) {
506
+ let value;
507
+ try {
508
+ value = JSON.parse(content);
509
+ }
510
+ catch (error) {
511
+ throw new UpdateTransactionApprovalError(`Malformed transaction approval seal JSON: ${filePath}`, { cause: error });
512
+ }
513
+ return validateUpdateTransactionApprovalSeal(value, binding, storage.now());
514
+ }
515
+ export function createUpdateTransactionApprovalStore(projectRoot, options = {}) {
516
+ const env = options.env ?? process.env;
517
+ const capturedOptions = {
518
+ ...options,
519
+ env: { XDG_STATE_HOME: env.XDG_STATE_HOME, LOCALAPPDATA: env.LOCALAPPDATA },
520
+ platform: options.platform ?? process.platform,
521
+ homedir: options.homedir ?? os.homedir()
522
+ };
523
+ let boundLocation;
524
+ const resolveBinding = async (planFingerprint, transactionDigest) => {
525
+ validateUpdateTransactionApprovalDigests(planFingerprint, transactionDigest);
526
+ const storage = await storageFor(projectRoot, capturedOptions);
527
+ if (boundLocation && canonicalJson(boundLocation) !== canonicalJson(storage.location)) {
528
+ throw new UpdateTransactionApprovalError('The transaction approval project or user-local storage boundary changed.');
529
+ }
530
+ boundLocation = storage.location;
531
+ const binding = { projectRoot: storage.location.projectRoot, planFingerprint, transactionDigest };
532
+ return { storage, binding, filePath: approvalPath(storage, binding) };
533
+ };
534
+ return {
535
+ write: async (planFingerprint, transactionDigest) => {
536
+ const { storage, binding, filePath } = await resolveBinding(planFingerprint, transactionDigest);
537
+ const now = storage.now();
538
+ if (!Number.isFinite(now.getTime()))
539
+ throw new UpdateTransactionApprovalError('The transaction approval clock is invalid.');
540
+ const seal = createUpdateTransactionApprovalSeal(binding, { approvalId: randomUUID(), approvedAt: now.toISOString() });
541
+ const snapshot = await directories(storage, true);
542
+ if (!snapshot)
543
+ throw storageError(`Unable to create transaction approval storage: ${storage.location.directory}`);
544
+ await withStoreLock(storage, snapshot, async () => {
545
+ const before = await readText(storage, filePath, snapshot);
546
+ if (before !== undefined) {
547
+ parseApproval(before, storage, binding, filePath);
548
+ await io('flush existing approval seal directory', storage.location.directory, () => storage.fs.syncDirectory(storage.location.directory));
549
+ return;
550
+ }
551
+ await writeAtomicMetadata(storage, snapshot, filePath, canonicalJson(seal), undefined, true);
552
+ });
553
+ },
554
+ verify: async (planFingerprint, transactionDigest) => {
555
+ const { storage, binding, filePath } = await resolveBinding(planFingerprint, transactionDigest);
556
+ const snapshot = await directories(storage, false);
557
+ if (!snapshot)
558
+ return false;
559
+ const content = await readText(storage, filePath, snapshot);
560
+ if (content === undefined)
561
+ return false;
562
+ parseApproval(content, storage, binding, filePath);
563
+ return true;
564
+ },
565
+ remove: async (planFingerprint, transactionDigest) => {
566
+ const { storage, binding, filePath } = await resolveBinding(planFingerprint, transactionDigest);
567
+ const snapshot = await directories(storage, false);
568
+ if (!snapshot)
569
+ return;
570
+ await withStoreLock(storage, snapshot, async () => {
571
+ const content = await readText(storage, filePath, snapshot);
572
+ if (content !== undefined) {
573
+ parseApproval(content, storage, binding, filePath);
574
+ const owned = await inspect(storage.fs, filePath);
575
+ if (!owned || await readText(storage, filePath, snapshot) !== content) {
576
+ throw storageError(`Transaction approval seal changed during removal: ${filePath}`);
577
+ }
578
+ await assertDirectories(storage, snapshot);
579
+ await assertOwnedFile(storage, filePath, owned);
580
+ await io('remove transaction approval seal', filePath, () => storage.fs.removeFile(filePath));
581
+ }
582
+ await assertDirectories(storage, snapshot);
583
+ await io('flush removed approval seal directory', storage.location.directory, () => storage.fs.syncDirectory(storage.location.directory));
584
+ });
585
+ }
586
+ };
587
+ }
588
+ export async function consumeUpdatePreviewReceipt(projectRoot, expectedReceipt, options = {}) {
589
+ const storage = await storageFor(projectRoot, options);
590
+ const expected = validateUpdatePreviewReceipt(expectedReceipt, { projectRoot: storage.location.projectRoot, now: storage.now() });
591
+ const snapshot = await directories(storage, false);
592
+ if (!snapshot)
593
+ missing(storage);
594
+ await withStoreLock(storage, snapshot, async () => {
595
+ const content = await readText(storage, storage.location.receiptPath, snapshot);
596
+ if (content === undefined)
597
+ missing(storage);
598
+ const current = parseReceipt(content, storage);
599
+ if (canonicalJson(current) !== canonicalJson(expected)) {
600
+ throw new UpdatePreviewError('preview-mismatch', 'A newer or different preview receipt was found; it was preserved.');
601
+ }
602
+ const owned = await inspect(storage.fs, storage.location.receiptPath);
603
+ if (!owned)
604
+ missing(storage);
605
+ if (await readText(storage, storage.location.receiptPath, snapshot) !== content) {
606
+ throw storageError(`Preview receipt changed during cleanup: ${storage.location.receiptPath}`);
607
+ }
608
+ await assertDirectories(storage, snapshot);
609
+ await assertOwnedFile(storage, storage.location.receiptPath, owned);
610
+ await io('consume receipt', storage.location.receiptPath, () => storage.fs.removeFile(storage.location.receiptPath));
611
+ });
612
+ }
613
+ //# sourceMappingURL=update-previews.js.map