@lesliechan721/aw 0.1.0-beta.6 → 0.1.0-beta.60

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 (621) hide show
  1. package/dist/authoring/assets/aw-config.mjs +100 -501
  2. package/dist/authoring/assets/aw-config.mjs.map +1 -1
  3. package/dist/authoring/assets/aw-runtime-config.d.mts +13 -0
  4. package/dist/authoring/assets/aw-runtime-config.mjs +199 -0
  5. package/dist/authoring/assets/aw-runtime-config.mjs.map +1 -0
  6. package/dist/authoring/scripts/add-skill.mjs +4 -4
  7. package/dist/authoring/scripts/add-skill.mjs.map +1 -1
  8. package/dist/authoring/scripts/init-plugin.mjs +67 -97
  9. package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
  10. package/dist/authoring/scripts/lib/plugin-root.mjs +4 -4
  11. package/dist/authoring/scripts/lib/plugin-root.mjs.map +1 -1
  12. package/dist/authoring/scripts/lib/plugin-version-check.d.mts +1 -0
  13. package/dist/authoring/scripts/lib/plugin-version-check.mjs +229 -8
  14. package/dist/authoring/scripts/lib/plugin-version-check.mjs.map +1 -1
  15. package/dist/authoring/scripts/lib/skill-scaffold.d.mts +77 -92
  16. package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -124
  17. package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
  18. package/dist/authoring/scripts/plugin-status.mjs +8 -11
  19. package/dist/authoring/scripts/plugin-status.mjs.map +1 -1
  20. package/dist/authoring/scripts/remove-plugin.mjs +3 -2
  21. package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
  22. package/dist/authoring/scripts/validate-plugin.mjs +552 -1142
  23. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
  24. package/dist/native-runtime/reader-runtime.mjs +34 -0
  25. package/dist/native-runtime/reader.d.mts +6 -0
  26. package/dist/native-runtime/reader.mjs +11 -0
  27. package/dist/scripts/aw-skill-eval-materializer.d.ts +26 -0
  28. package/dist/scripts/aw-skill-eval-materializer.js +306 -0
  29. package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
  30. package/dist/scripts/bundle-plugins.d.ts +1 -0
  31. package/dist/scripts/bundle-plugins.js +19 -8
  32. package/dist/scripts/bundle-plugins.js.map +1 -1
  33. package/dist/scripts/plugin-staging.d.ts +7 -9
  34. package/dist/scripts/plugin-staging.js +18 -29
  35. package/dist/scripts/plugin-staging.js.map +1 -1
  36. package/dist/scripts/plugin-test-reporter.d.mts +2 -0
  37. package/dist/scripts/plugin-test-reporter.mjs +21 -0
  38. package/dist/scripts/plugin-test-reporter.mjs.map +1 -0
  39. package/dist/scripts/test-plugin-scripts.d.ts +5 -0
  40. package/dist/scripts/test-plugin-scripts.js +208 -89
  41. package/dist/scripts/test-plugin-scripts.js.map +1 -1
  42. package/dist/scripts/test-workers.d.mts +24 -0
  43. package/dist/scripts/test-workers.mjs +59 -0
  44. package/dist/scripts/test-workers.mjs.map +1 -0
  45. package/dist/src/adapters/helpers.d.ts +7 -0
  46. package/dist/src/adapters/helpers.js +2 -2
  47. package/dist/src/adapters/helpers.js.map +1 -1
  48. package/dist/src/authoring/workspace-commands.d.ts +19 -1
  49. package/dist/src/authoring/workspace-commands.js +24 -5
  50. package/dist/src/authoring/workspace-commands.js.map +1 -1
  51. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  52. package/dist/src/commands/aw-capabilities.js +266 -0
  53. package/dist/src/commands/aw-capabilities.js.map +1 -0
  54. package/dist/src/commands/catalog-dev-source.d.ts +154 -0
  55. package/dist/src/commands/catalog-dev-source.js +655 -0
  56. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  57. package/dist/src/commands/catalog-generation.d.ts +21 -0
  58. package/dist/src/commands/catalog-generation.js +9 -0
  59. package/dist/src/commands/catalog-generation.js.map +1 -0
  60. package/dist/src/commands/catalog-publication-inspection.d.ts +71 -30
  61. package/dist/src/commands/catalog-publication-inspection.js +475 -63
  62. package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
  63. package/dist/src/commands/catalog-publication-journal.d.ts +68 -0
  64. package/dist/src/commands/catalog-publication-journal.js +292 -0
  65. package/dist/src/commands/catalog-publication-journal.js.map +1 -0
  66. package/dist/src/commands/catalog-publication-target.d.ts +18 -0
  67. package/dist/src/commands/catalog-publication-target.js +95 -0
  68. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  69. package/dist/src/commands/catalog-publish.d.ts +73 -15
  70. package/dist/src/commands/catalog-publish.js +701 -212
  71. package/dist/src/commands/catalog-publish.js.map +1 -1
  72. package/dist/src/commands/catalog-source.d.ts +60 -22
  73. package/dist/src/commands/catalog-source.js +311 -91
  74. package/dist/src/commands/catalog-source.js.map +1 -1
  75. package/dist/src/commands/catalog-status.d.ts +18 -22
  76. package/dist/src/commands/catalog-status.js +81 -115
  77. package/dist/src/commands/catalog-status.js.map +1 -1
  78. package/dist/src/commands/catalog-store.d.ts +104 -0
  79. package/dist/src/commands/catalog-store.js +685 -0
  80. package/dist/src/commands/catalog-store.js.map +1 -0
  81. package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
  82. package/dist/src/commands/catalog-workspace-resolution.js +42 -0
  83. package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
  84. package/dist/src/commands/console.js +28 -17
  85. package/dist/src/commands/console.js.map +1 -1
  86. package/dist/src/commands/dependency-operation-plan.d.ts +52 -15
  87. package/dist/src/commands/dependency-operation-plan.js +289 -7
  88. package/dist/src/commands/dependency-operation-plan.js.map +1 -1
  89. package/dist/src/commands/init.d.ts +5 -11
  90. package/dist/src/commands/init.js +30 -51
  91. package/dist/src/commands/init.js.map +1 -1
  92. package/dist/src/commands/managed-commands.d.ts +28 -0
  93. package/dist/src/commands/managed-commands.js +315 -0
  94. package/dist/src/commands/managed-commands.js.map +1 -0
  95. package/dist/src/commands/offline-cleanup-evidence.d.ts +67 -0
  96. package/dist/src/commands/offline-cleanup-evidence.js +181 -0
  97. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  98. package/dist/src/commands/operation-plan.d.ts +182 -0
  99. package/dist/src/commands/operation-plan.js +71 -0
  100. package/dist/src/commands/operation-plan.js.map +1 -0
  101. package/dist/src/commands/operation-planner.d.ts +47 -0
  102. package/dist/src/commands/operation-planner.js +142 -0
  103. package/dist/src/commands/operation-planner.js.map +1 -0
  104. package/dist/src/commands/options.d.ts +9 -7
  105. package/dist/src/commands/options.js +83 -21
  106. package/dist/src/commands/options.js.map +1 -1
  107. package/dist/src/commands/plugin-capabilities.js +65 -4
  108. package/dist/src/commands/plugin-capabilities.js.map +1 -1
  109. package/dist/src/commands/rebuild-command.d.ts +78 -31
  110. package/dist/src/commands/rebuild-command.js +5229 -942
  111. package/dist/src/commands/rebuild-command.js.map +1 -1
  112. package/dist/src/commands/rebuild-integration.d.ts +143 -21
  113. package/dist/src/commands/rebuild-integration.js +3384 -1342
  114. package/dist/src/commands/rebuild-integration.js.map +1 -1
  115. package/dist/src/commands/rebuild-operations.d.ts +60 -30
  116. package/dist/src/commands/rebuild-operations.js +267 -320
  117. package/dist/src/commands/rebuild-operations.js.map +1 -1
  118. package/dist/src/commands/reconcile-operation-plan.d.ts +28 -0
  119. package/dist/src/commands/reconcile-operation-plan.js +47 -0
  120. package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
  121. package/dist/src/commands/review-inspection.d.ts +60 -0
  122. package/dist/src/commands/review-inspection.js +422 -0
  123. package/dist/src/commands/review-inspection.js.map +1 -0
  124. package/dist/src/commands/review-preparation.d.ts +49 -0
  125. package/dist/src/commands/review-preparation.js +427 -0
  126. package/dist/src/commands/review-preparation.js.map +1 -0
  127. package/dist/src/commands/runtime.d.ts +1 -5
  128. package/dist/src/commands/runtime.js +27 -53
  129. package/dist/src/commands/runtime.js.map +1 -1
  130. package/dist/src/commands/skill-eval.d.ts +39 -0
  131. package/dist/src/commands/skill-eval.js +400 -0
  132. package/dist/src/commands/skill-eval.js.map +1 -0
  133. package/dist/src/commands/status-v6.d.ts +279 -0
  134. package/dist/src/commands/status-v6.js +2785 -0
  135. package/dist/src/commands/status-v6.js.map +1 -0
  136. package/dist/src/commands/sync-command.d.ts +40 -0
  137. package/dist/src/commands/sync-command.js +254 -0
  138. package/dist/src/commands/sync-command.js.map +1 -0
  139. package/dist/src/commands/wizard.d.ts +8 -5
  140. package/dist/src/commands/wizard.js +6 -4
  141. package/dist/src/commands/wizard.js.map +1 -1
  142. package/dist/src/commands/write-commands.d.ts +9 -3
  143. package/dist/src/commands/write-commands.js +136 -31
  144. package/dist/src/commands/write-commands.js.map +1 -1
  145. package/dist/src/constants.d.ts +7 -2
  146. package/dist/src/constants.js +7 -2
  147. package/dist/src/constants.js.map +1 -1
  148. package/dist/src/eval/manifest-v1.d.ts +68 -0
  149. package/dist/src/eval/manifest-v1.js +353 -0
  150. package/dist/src/eval/manifest-v1.js.map +1 -0
  151. package/dist/src/generators/local-plugin.d.ts +5 -1
  152. package/dist/src/generators/local-plugin.js +261 -109
  153. package/dist/src/generators/local-plugin.js.map +1 -1
  154. package/dist/src/generators/permissions.d.ts +5 -2
  155. package/dist/src/generators/permissions.js +28 -15
  156. package/dist/src/generators/permissions.js.map +1 -1
  157. package/dist/src/index.d.ts +10 -4
  158. package/dist/src/index.js +1774 -609
  159. package/dist/src/index.js.map +1 -1
  160. package/dist/src/output/command-receipt.d.ts +47 -46
  161. package/dist/src/output/command-receipt.js +277 -79
  162. package/dist/src/output/command-receipt.js.map +1 -1
  163. package/dist/src/output/model.d.ts +3 -44
  164. package/dist/src/output/model.js +1 -144
  165. package/dist/src/output/model.js.map +1 -1
  166. package/dist/src/output/rebuild-progress.js +15 -13
  167. package/dist/src/output/rebuild-progress.js.map +1 -1
  168. package/dist/src/portable/commands.d.ts +46 -7
  169. package/dist/src/portable/commands.js +349 -37
  170. package/dist/src/portable/commands.js.map +1 -1
  171. package/dist/src/portable/materializer.d.ts +17 -4
  172. package/dist/src/portable/materializer.js +186 -41
  173. package/dist/src/portable/materializer.js.map +1 -1
  174. package/dist/src/portable/skills-cli.d.ts +15 -7
  175. package/dist/src/portable/skills-cli.js +74 -20
  176. package/dist/src/portable/skills-cli.js.map +1 -1
  177. package/dist/src/review/eval-source-input.d.ts +43 -0
  178. package/dist/src/review/eval-source-input.js +207 -0
  179. package/dist/src/review/eval-source-input.js.map +1 -0
  180. package/dist/src/review/review-profile.d.ts +17 -0
  181. package/dist/src/review/review-profile.js +234 -0
  182. package/dist/src/review/review-profile.js.map +1 -0
  183. package/dist/src/review/review-selection.d.ts +30 -0
  184. package/dist/src/review/review-selection.js +527 -0
  185. package/dist/src/review/review-selection.js.map +1 -0
  186. package/dist/src/review/review-types.d.ts +68 -0
  187. package/dist/src/review/review-types.js +16 -0
  188. package/dist/src/review/review-types.js.map +1 -0
  189. package/dist/src/review/skill-materialization.d.ts +26 -0
  190. package/dist/src/review/skill-materialization.js +217 -0
  191. package/dist/src/review/skill-materialization.js.map +1 -0
  192. package/dist/src/review/source-binding.d.ts +183 -0
  193. package/dist/src/review/source-binding.js +708 -0
  194. package/dist/src/review/source-binding.js.map +1 -0
  195. package/dist/src/tui/catalog-freshness.d.ts +1 -0
  196. package/dist/src/tui/catalog-freshness.js +2 -0
  197. package/dist/src/tui/catalog-freshness.js.map +1 -0
  198. package/dist/src/tui/catalog-generation.d.ts +21 -0
  199. package/dist/src/tui/catalog-generation.js +156 -0
  200. package/dist/src/tui/catalog-generation.js.map +1 -0
  201. package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
  202. package/dist/src/tui/catalog-sources/projection.js +17 -0
  203. package/dist/src/tui/catalog-sources/projection.js.map +1 -0
  204. package/dist/src/tui/catalog-sources/review.d.ts +3 -0
  205. package/dist/src/tui/catalog-sources/review.js +13 -0
  206. package/dist/src/tui/catalog-sources/review.js.map +1 -0
  207. package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
  208. package/dist/src/tui/catalog-sources/screens.js +40 -0
  209. package/dist/src/tui/catalog-sources/screens.js.map +1 -0
  210. package/dist/src/tui/catalog-sources/session.d.ts +32 -0
  211. package/dist/src/tui/catalog-sources/session.js +300 -0
  212. package/dist/src/tui/catalog-sources/session.js.map +1 -0
  213. package/dist/src/tui/catalog-sources/types.d.ts +54 -0
  214. package/dist/src/tui/catalog-sources/types.js +2 -0
  215. package/dist/src/tui/catalog-sources/types.js.map +1 -0
  216. package/dist/src/tui/catalog-store-task.d.ts +16 -0
  217. package/dist/src/tui/catalog-store-task.js +19 -0
  218. package/dist/src/tui/catalog-store-task.js.map +1 -0
  219. package/dist/src/tui/clipboard.d.ts +13 -0
  220. package/dist/src/tui/clipboard.js +95 -0
  221. package/dist/src/tui/clipboard.js.map +1 -0
  222. package/dist/src/tui/components.d.ts +110 -3
  223. package/dist/src/tui/components.js +183 -36
  224. package/dist/src/tui/components.js.map +1 -1
  225. package/dist/src/tui/config-array-draft.d.ts +29 -0
  226. package/dist/src/tui/config-array-draft.js +48 -0
  227. package/dist/src/tui/config-array-draft.js.map +1 -0
  228. package/dist/src/tui/config-leaf-editor.d.ts +19 -0
  229. package/dist/src/tui/config-leaf-editor.js +212 -0
  230. package/dist/src/tui/config-leaf-editor.js.map +1 -0
  231. package/dist/src/tui/config-references.d.ts +34 -0
  232. package/dist/src/tui/config-references.js +70 -0
  233. package/dist/src/tui/config-references.js.map +1 -0
  234. package/dist/src/tui/config-value-presentation.d.ts +20 -0
  235. package/dist/src/tui/config-value-presentation.js +104 -0
  236. package/dist/src/tui/config-value-presentation.js.map +1 -0
  237. package/dist/src/tui/console-app-v4.d.ts +14 -4
  238. package/dist/src/tui/console-app-v4.js +9205 -1951
  239. package/dist/src/tui/console-app-v4.js.map +1 -1
  240. package/dist/src/tui/content-item-card.d.ts +13 -0
  241. package/dist/src/tui/content-item-card.js +51 -0
  242. package/dist/src/tui/content-item-card.js.map +1 -0
  243. package/dist/src/tui/controller-runtime.d.ts +10 -2
  244. package/dist/src/tui/controller-runtime.js +3289 -388
  245. package/dist/src/tui/controller-runtime.js.map +1 -1
  246. package/dist/src/tui/controller.d.ts +622 -45
  247. package/dist/src/tui/controller.js +3589 -768
  248. package/dist/src/tui/controller.js.map +1 -1
  249. package/dist/src/tui/dependency-graph-view.d.ts +39 -0
  250. package/dist/src/tui/dependency-graph-view.js +121 -0
  251. package/dist/src/tui/dependency-graph-view.js.map +1 -0
  252. package/dist/src/tui/dependency-graph.d.ts +81 -0
  253. package/dist/src/tui/dependency-graph.js +452 -0
  254. package/dist/src/tui/dependency-graph.js.map +1 -0
  255. package/dist/src/tui/diagnostic-projection.d.ts +23 -0
  256. package/dist/src/tui/diagnostic-projection.js +595 -0
  257. package/dist/src/tui/diagnostic-projection.js.map +1 -0
  258. package/dist/src/tui/diagnostics.d.ts +3 -3
  259. package/dist/src/tui/diagnostics.js +14 -2
  260. package/dist/src/tui/diagnostics.js.map +1 -1
  261. package/dist/src/tui/entity-cards.d.ts +55 -0
  262. package/dist/src/tui/entity-cards.js +220 -0
  263. package/dist/src/tui/entity-cards.js.map +1 -0
  264. package/dist/src/tui/glossary.d.ts +23 -0
  265. package/dist/src/tui/glossary.js +42 -0
  266. package/dist/src/tui/glossary.js.map +1 -0
  267. package/dist/src/tui/index.d.ts +6 -1
  268. package/dist/src/tui/index.js +5 -1
  269. package/dist/src/tui/index.js.map +1 -1
  270. package/dist/src/tui/input-display.d.ts +9 -0
  271. package/dist/src/tui/input-display.js +58 -0
  272. package/dist/src/tui/input-display.js.map +1 -0
  273. package/dist/src/tui/keys.d.ts +44 -0
  274. package/dist/src/tui/keys.js +43 -15
  275. package/dist/src/tui/keys.js.map +1 -1
  276. package/dist/src/tui/lifecycle-action-view.d.ts +6 -0
  277. package/dist/src/tui/lifecycle-action-view.js +36 -0
  278. package/dist/src/tui/lifecycle-action-view.js.map +1 -0
  279. package/dist/src/tui/model.d.ts +224 -31
  280. package/dist/src/tui/model.js +1510 -397
  281. package/dist/src/tui/model.js.map +1 -1
  282. package/dist/src/tui/operation-diagnostic-screens.d.ts +8 -0
  283. package/dist/src/tui/operation-diagnostic-screens.js +71 -0
  284. package/dist/src/tui/operation-diagnostic-screens.js.map +1 -0
  285. package/dist/src/tui/operation-history.d.ts +81 -0
  286. package/dist/src/tui/operation-history.js +136 -0
  287. package/dist/src/tui/operation-history.js.map +1 -0
  288. package/dist/src/tui/operation-review-planner.d.ts +21 -0
  289. package/dist/src/tui/operation-review-planner.js +1392 -0
  290. package/dist/src/tui/operation-review-planner.js.map +1 -0
  291. package/dist/src/tui/plugin-content.d.ts +31 -0
  292. package/dist/src/tui/plugin-content.js +680 -0
  293. package/dist/src/tui/plugin-content.js.map +1 -0
  294. package/dist/src/tui/plugin-detail.d.ts +52 -0
  295. package/dist/src/tui/plugin-detail.js +165 -0
  296. package/dist/src/tui/plugin-detail.js.map +1 -0
  297. package/dist/src/tui/plugin-write-task.d.ts +69 -0
  298. package/dist/src/tui/plugin-write-task.js +286 -0
  299. package/dist/src/tui/plugin-write-task.js.map +1 -0
  300. package/dist/src/tui/project-inventory.d.ts +68 -0
  301. package/dist/src/tui/project-inventory.js +203 -0
  302. package/dist/src/tui/project-inventory.js.map +1 -0
  303. package/dist/src/tui/prompt.js +4 -15
  304. package/dist/src/tui/prompt.js.map +1 -1
  305. package/dist/src/tui/query-header.d.ts +30 -0
  306. package/dist/src/tui/query-header.js +40 -0
  307. package/dist/src/tui/query-header.js.map +1 -0
  308. package/dist/src/tui/reader.d.ts +37 -0
  309. package/dist/src/tui/reader.js +47 -0
  310. package/dist/src/tui/reader.js.map +1 -0
  311. package/dist/src/tui/router.d.ts +197 -10
  312. package/dist/src/tui/router.js +338 -50
  313. package/dist/src/tui/router.js.map +1 -1
  314. package/dist/src/tui/screen-registry.d.ts +701 -0
  315. package/dist/src/tui/screen-registry.js +230 -0
  316. package/dist/src/tui/screen-registry.js.map +1 -0
  317. package/dist/src/tui/session-console-app.d.ts +6 -0
  318. package/dist/src/tui/session-console-app.js +13 -0
  319. package/dist/src/tui/session-console-app.js.map +1 -0
  320. package/dist/src/tui/session-host.d.ts +45 -0
  321. package/dist/src/tui/session-host.js +209 -0
  322. package/dist/src/tui/session-host.js.map +1 -0
  323. package/dist/src/tui/source-detail-card.d.ts +29 -0
  324. package/dist/src/tui/source-detail-card.js +45 -0
  325. package/dist/src/tui/source-detail-card.js.map +1 -0
  326. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  327. package/dist/src/tui/source-ref-presets.js +11 -0
  328. package/dist/src/tui/source-ref-presets.js.map +1 -0
  329. package/dist/src/tui/theme.d.ts +12 -0
  330. package/dist/src/tui/theme.js +12 -0
  331. package/dist/src/tui/theme.js.map +1 -1
  332. package/dist/src/tui/viewport.d.ts +1 -0
  333. package/dist/src/tui/viewport.js +23 -0
  334. package/dist/src/tui/viewport.js.map +1 -1
  335. package/dist/src/tui/views.js +31 -3
  336. package/dist/src/tui/views.js.map +1 -1
  337. package/dist/src/tui/wizard.js +37 -13
  338. package/dist/src/tui/wizard.js.map +1 -1
  339. package/dist/src/types.d.ts +264 -21
  340. package/dist/src/types.js +1 -0
  341. package/dist/src/types.js.map +1 -1
  342. package/dist/src/utils/agent-version.d.ts +7 -1
  343. package/dist/src/utils/agent-version.js +36 -7
  344. package/dist/src/utils/agent-version.js.map +1 -1
  345. package/dist/src/utils/artifact-plan.d.ts +8 -6
  346. package/dist/src/utils/artifact-plan.js +67 -13
  347. package/dist/src/utils/artifact-plan.js.map +1 -1
  348. package/dist/src/utils/artifact-renderer.d.ts +24 -10
  349. package/dist/src/utils/artifact-renderer.js +230 -220
  350. package/dist/src/utils/artifact-renderer.js.map +1 -1
  351. package/dist/src/utils/artifact-request.d.ts +32 -0
  352. package/dist/src/utils/artifact-request.js +90 -0
  353. package/dist/src/utils/artifact-request.js.map +1 -0
  354. package/dist/src/utils/artifact-sources.d.ts +4 -0
  355. package/dist/src/utils/artifact-sources.js +17 -0
  356. package/dist/src/utils/artifact-sources.js.map +1 -1
  357. package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
  358. package/dist/src/utils/aw-home-mutation-lock.js +32 -4
  359. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
  360. package/dist/src/utils/bundle-integrity.d.ts +0 -1
  361. package/dist/src/utils/bundle-integrity.js +0 -25
  362. package/dist/src/utils/bundle-integrity.js.map +1 -1
  363. package/dist/src/utils/bundle-layout.js +29 -29
  364. package/dist/src/utils/bundle-layout.js.map +1 -1
  365. package/dist/src/utils/catalog-capability-projection.d.ts +8 -0
  366. package/dist/src/utils/catalog-capability-projection.js +14 -0
  367. package/dist/src/utils/catalog-capability-projection.js.map +1 -0
  368. package/dist/src/utils/catalog-digests.d.ts +10 -0
  369. package/dist/src/utils/catalog-digests.js +57 -20
  370. package/dist/src/utils/catalog-digests.js.map +1 -1
  371. package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
  372. package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
  373. package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
  374. package/dist/src/utils/catalog-generation-error.d.ts +16 -0
  375. package/dist/src/utils/catalog-generation-error.js +30 -0
  376. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  377. package/dist/src/utils/catalog-generation-resolver.d.ts +44 -0
  378. package/dist/src/utils/catalog-generation-resolver.js +273 -0
  379. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  380. package/dist/src/utils/catalog-generation-service.d.ts +172 -0
  381. package/dist/src/utils/catalog-generation-service.js +1271 -0
  382. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  383. package/dist/src/utils/catalog-generation-state.d.ts +22 -0
  384. package/dist/src/utils/catalog-generation-state.js +192 -0
  385. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  386. package/dist/src/utils/catalog-generation-store.d.ts +58 -0
  387. package/dist/src/utils/catalog-generation-store.js +452 -0
  388. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  389. package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
  390. package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v7.js} +35 -43
  391. package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
  392. package/dist/src/utils/catalog-operation-context.d.ts +20 -0
  393. package/dist/src/utils/catalog-operation-context.js +142 -0
  394. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  395. package/dist/src/utils/catalog-public-error.d.ts +7 -3
  396. package/dist/src/utils/catalog-public-error.js +28 -8
  397. package/dist/src/utils/catalog-public-error.js.map +1 -1
  398. package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
  399. package/dist/src/utils/catalog-runtime-projection.js +5 -40
  400. package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
  401. package/dist/src/utils/catalog-snapshot.d.ts +5 -3
  402. package/dist/src/utils/catalog-snapshot.js +11 -3
  403. package/dist/src/utils/catalog-snapshot.js.map +1 -1
  404. package/dist/src/utils/catalog-source-identity.d.ts +1 -0
  405. package/dist/src/utils/catalog-source-identity.js +21 -2
  406. package/dist/src/utils/catalog-source-identity.js.map +1 -1
  407. package/dist/src/utils/catalog-source-impact.d.ts +21 -0
  408. package/dist/src/utils/catalog-source-impact.js +344 -0
  409. package/dist/src/utils/catalog-source-impact.js.map +1 -0
  410. package/dist/src/utils/catalog-source-references.d.ts +3 -2
  411. package/dist/src/utils/catalog-source-references.js +195 -347
  412. package/dist/src/utils/catalog-source-references.js.map +1 -1
  413. package/dist/src/utils/catalog-sources.d.ts +15 -1
  414. package/dist/src/utils/catalog-sources.js +206 -27
  415. package/dist/src/utils/catalog-sources.js.map +1 -1
  416. package/dist/src/utils/claude-skills-root.d.ts +8 -0
  417. package/dist/src/utils/claude-skills-root.js +76 -0
  418. package/dist/src/utils/claude-skills-root.js.map +1 -0
  419. package/dist/src/utils/codex-config.d.ts +2 -0
  420. package/dist/src/utils/codex-config.js +26 -5
  421. package/dist/src/utils/codex-config.js.map +1 -1
  422. package/dist/src/utils/codex-manager.d.ts +79 -0
  423. package/dist/src/utils/codex-manager.js +735 -0
  424. package/dist/src/utils/codex-manager.js.map +1 -0
  425. package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
  426. package/dist/src/utils/codex-marketplace-path.js +45 -0
  427. package/dist/src/utils/codex-marketplace-path.js.map +1 -0
  428. package/dist/src/utils/codex-native-observation.d.ts +49 -0
  429. package/dist/src/utils/codex-native-observation.js +154 -0
  430. package/dist/src/utils/codex-native-observation.js.map +1 -0
  431. package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
  432. package/dist/src/utils/codex-native-render-receipt.js +205 -0
  433. package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
  434. package/dist/src/utils/codex-reconciler.d.ts +126 -0
  435. package/dist/src/utils/codex-reconciler.js +298 -0
  436. package/dist/src/utils/codex-reconciler.js.map +1 -0
  437. package/dist/src/utils/codex-shared-native.d.ts +43 -0
  438. package/dist/src/utils/codex-shared-native.js +81 -0
  439. package/dist/src/utils/codex-shared-native.js.map +1 -0
  440. package/dist/src/utils/codex-skill-staging.d.ts +2 -0
  441. package/dist/src/utils/codex-skill-staging.js.map +1 -1
  442. package/dist/src/utils/codex-skills-root.d.ts +4 -0
  443. package/dist/src/utils/codex-skills-root.js +25 -0
  444. package/dist/src/utils/codex-skills-root.js.map +1 -0
  445. package/dist/src/utils/codex-surface-analysis.d.ts +46 -0
  446. package/dist/src/utils/codex-surface-analysis.js +247 -0
  447. package/dist/src/utils/codex-surface-analysis.js.map +1 -0
  448. package/dist/src/utils/dynamic-skill-tree.d.ts +5 -0
  449. package/dist/src/utils/dynamic-skill-tree.js +56 -7
  450. package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
  451. package/dist/src/utils/git-catalog-provider.d.ts +16 -0
  452. package/dist/src/utils/git-catalog-provider.js +177 -145
  453. package/dist/src/utils/git-catalog-provider.js.map +1 -1
  454. package/dist/src/utils/local-marketplace.d.ts +27 -1
  455. package/dist/src/utils/local-marketplace.js +434 -84
  456. package/dist/src/utils/local-marketplace.js.map +1 -1
  457. package/dist/src/utils/managed-command-closure.d.ts +3 -0
  458. package/dist/src/utils/managed-command-closure.js +35 -0
  459. package/dist/src/utils/managed-command-closure.js.map +1 -0
  460. package/dist/src/utils/managed-command-evidence.d.ts +7 -0
  461. package/dist/src/utils/managed-command-evidence.js +86 -0
  462. package/dist/src/utils/managed-command-evidence.js.map +1 -0
  463. package/dist/src/utils/managed-command-materialization.d.ts +115 -0
  464. package/dist/src/utils/managed-command-materialization.js +359 -0
  465. package/dist/src/utils/managed-command-materialization.js.map +1 -0
  466. package/dist/src/utils/managed-command-runtime.d.ts +33 -0
  467. package/dist/src/utils/managed-command-runtime.js +121 -0
  468. package/dist/src/utils/managed-command-runtime.js.map +1 -0
  469. package/dist/src/utils/managed-command-store.d.ts +128 -0
  470. package/dist/src/utils/managed-command-store.js +589 -0
  471. package/dist/src/utils/managed-command-store.js.map +1 -0
  472. package/dist/src/utils/manifest.d.ts +1 -3
  473. package/dist/src/utils/manifest.js +1 -3
  474. package/dist/src/utils/manifest.js.map +1 -1
  475. package/dist/src/utils/multi-source-catalog.d.ts +3 -9
  476. package/dist/src/utils/multi-source-catalog.js +54 -110
  477. package/dist/src/utils/multi-source-catalog.js.map +1 -1
  478. package/dist/src/utils/native-cli.d.ts +61 -7
  479. package/dist/src/utils/native-cli.js +426 -58
  480. package/dist/src/utils/native-cli.js.map +1 -1
  481. package/dist/src/utils/native-tool-context.d.ts +14 -0
  482. package/dist/src/utils/native-tool-context.js +38 -0
  483. package/dist/src/utils/native-tool-context.js.map +1 -0
  484. package/dist/src/utils/native-tool-review.d.ts +21 -0
  485. package/dist/src/utils/native-tool-review.js +102 -0
  486. package/dist/src/utils/native-tool-review.js.map +1 -0
  487. package/dist/src/utils/orphan-marketplace-cleanup.js +0 -4
  488. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
  489. package/dist/src/utils/ownership.d.ts +88 -20
  490. package/dist/src/utils/ownership.js +185 -223
  491. package/dist/src/utils/ownership.js.map +1 -1
  492. package/dist/src/utils/path-catalog-provider.d.ts +1 -1
  493. package/dist/src/utils/path-catalog-provider.js +54 -65
  494. package/dist/src/utils/path-catalog-provider.js.map +1 -1
  495. package/dist/src/utils/paths.d.ts +0 -1
  496. package/dist/src/utils/paths.js +0 -1
  497. package/dist/src/utils/paths.js.map +1 -1
  498. package/dist/src/utils/plugin-config-impact.d.ts +40 -0
  499. package/dist/src/utils/plugin-config-impact.js +373 -0
  500. package/dist/src/utils/plugin-config-impact.js.map +1 -0
  501. package/dist/src/utils/plugin-config-write.d.ts +52 -27
  502. package/dist/src/utils/plugin-config-write.js +1112 -298
  503. package/dist/src/utils/plugin-config-write.js.map +1 -1
  504. package/dist/src/utils/plugin-config.d.ts +153 -93
  505. package/dist/src/utils/plugin-config.js +1116 -968
  506. package/dist/src/utils/plugin-config.js.map +1 -1
  507. package/dist/src/utils/plugin-intent-state.d.ts +49 -0
  508. package/dist/src/utils/plugin-intent-state.js +320 -0
  509. package/dist/src/utils/plugin-intent-state.js.map +1 -0
  510. package/dist/src/utils/plugin-scripts.d.ts +66 -125
  511. package/dist/src/utils/plugin-scripts.js +518 -526
  512. package/dist/src/utils/plugin-scripts.js.map +1 -1
  513. package/dist/src/utils/process-lock.js +14 -5
  514. package/dist/src/utils/process-lock.js.map +1 -1
  515. package/dist/src/utils/process-tree.d.ts +2 -2
  516. package/dist/src/utils/process-tree.js +1 -1
  517. package/dist/src/utils/process-tree.js.map +1 -1
  518. package/dist/src/utils/project-boundary.d.ts +11 -13
  519. package/dist/src/utils/project-boundary.js +28 -34
  520. package/dist/src/utils/project-boundary.js.map +1 -1
  521. package/dist/src/utils/rendered-contract.js +18 -1
  522. package/dist/src/utils/rendered-contract.js.map +1 -1
  523. package/dist/src/utils/runtime-config.d.ts +20 -0
  524. package/dist/src/utils/runtime-config.js +75 -0
  525. package/dist/src/utils/runtime-config.js.map +1 -0
  526. package/dist/src/utils/runtime-skill-closure.js +47 -6
  527. package/dist/src/utils/runtime-skill-closure.js.map +1 -1
  528. package/dist/src/utils/safe-fs.d.ts +21 -0
  529. package/dist/src/utils/safe-fs.js +111 -0
  530. package/dist/src/utils/safe-fs.js.map +1 -0
  531. package/dist/src/utils/safe-operation-diagnostic.d.ts +15 -0
  532. package/dist/src/utils/safe-operation-diagnostic.js +33 -0
  533. package/dist/src/utils/safe-operation-diagnostic.js.map +1 -0
  534. package/dist/src/utils/sensitive-content.d.ts +4 -0
  535. package/dist/src/utils/sensitive-content.js +36 -0
  536. package/dist/src/utils/sensitive-content.js.map +1 -0
  537. package/dist/src/utils/state-paths.js +7 -2
  538. package/dist/src/utils/state-paths.js.map +1 -1
  539. package/dist/src/utils/target-eligibility.d.ts +8 -2
  540. package/dist/src/utils/target-eligibility.js +17 -8
  541. package/dist/src/utils/target-eligibility.js.map +1 -1
  542. package/dist/src/utils/windows-claude-shim.d.ts +7 -0
  543. package/dist/src/utils/windows-claude-shim.js +10 -0
  544. package/dist/src/utils/windows-claude-shim.js.map +1 -0
  545. package/dist/src/utils/windows-npm-shim.d.ts +14 -0
  546. package/dist/src/utils/windows-npm-shim.js +140 -0
  547. package/dist/src/utils/windows-npm-shim.js.map +1 -0
  548. package/dist/vitest.config.js +100 -9
  549. package/dist/vitest.config.js.map +1 -1
  550. package/package.json +31 -21
  551. package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
  552. package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
  553. package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
  554. package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
  555. package/dist/scripts/aw-skill-eval-engine.js +0 -31
  556. package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
  557. package/dist/scripts/codex-eval-app-server.d.ts +0 -89
  558. package/dist/scripts/codex-eval-app-server.js +0 -1228
  559. package/dist/scripts/codex-eval-app-server.js.map +0 -1
  560. package/dist/scripts/codex-eval-isolation.d.ts +0 -61
  561. package/dist/scripts/codex-eval-isolation.js +0 -318
  562. package/dist/scripts/codex-eval-isolation.js.map +0 -1
  563. package/dist/scripts/codex-eval-process-management.d.ts +0 -8
  564. package/dist/scripts/codex-eval-process-management.js +0 -69
  565. package/dist/scripts/codex-eval-process-management.js.map +0 -1
  566. package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
  567. package/dist/scripts/codex-eval-process-tree.js +0 -803
  568. package/dist/scripts/codex-eval-process-tree.js.map +0 -1
  569. package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
  570. package/dist/scripts/codex-eval-runtime-config.js +0 -843
  571. package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
  572. package/dist/scripts/codex-trigger-eval.d.ts +0 -84
  573. package/dist/scripts/codex-trigger-eval.js +0 -968
  574. package/dist/scripts/codex-trigger-eval.js.map +0 -1
  575. package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
  576. package/dist/scripts/eval-plugin-skills-audited.js +0 -261
  577. package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
  578. package/dist/scripts/eval-plugin-skills.d.ts +0 -45
  579. package/dist/scripts/eval-plugin-skills.js +0 -1586
  580. package/dist/scripts/eval-plugin-skills.js.map +0 -1
  581. package/dist/scripts/eval-run-layout.d.ts +0 -17
  582. package/dist/scripts/eval-run-layout.js +0 -26
  583. package/dist/scripts/eval-run-layout.js.map +0 -1
  584. package/dist/scripts/plugin-eval-contract.d.ts +0 -185
  585. package/dist/scripts/plugin-eval-contract.js +0 -695
  586. package/dist/scripts/plugin-eval-contract.js.map +0 -1
  587. package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
  588. package/dist/scripts/plugin-eval-materializer.js +0 -421
  589. package/dist/scripts/plugin-eval-materializer.js.map +0 -1
  590. package/dist/scripts/skill-reporting.d.ts +0 -212
  591. package/dist/scripts/skill-reporting.js +0 -922
  592. package/dist/scripts/skill-reporting.js.map +0 -1
  593. package/dist/src/commands/review-publication.d.ts +0 -99
  594. package/dist/src/commands/review-publication.js +0 -904
  595. package/dist/src/commands/review-publication.js.map +0 -1
  596. package/dist/src/commands/status-v4.d.ts +0 -123
  597. package/dist/src/commands/status-v4.js +0 -905
  598. package/dist/src/commands/status-v4.js.map +0 -1
  599. package/dist/src/commands/status.d.ts +0 -93
  600. package/dist/src/commands/status.js +0 -442
  601. package/dist/src/commands/status.js.map +0 -1
  602. package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
  603. package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
  604. package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
  605. package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
  606. package/dist/src/utils/catalog-manifest-v3.js +0 -3
  607. package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
  608. package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
  609. package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
  610. package/dist/src/utils/catalog-source-cache.d.ts +0 -62
  611. package/dist/src/utils/catalog-source-cache.js +0 -296
  612. package/dist/src/utils/catalog-source-cache.js.map +0 -1
  613. package/dist/src/utils/codex-project-surface.d.ts +0 -3
  614. package/dist/src/utils/codex-project-surface.js +0 -49
  615. package/dist/src/utils/codex-project-surface.js.map +0 -1
  616. package/dist/src/utils/lifecycle-active-store.d.ts +0 -175
  617. package/dist/src/utils/lifecycle-active-store.js +0 -1276
  618. package/dist/src/utils/lifecycle-active-store.js.map +0 -1
  619. package/dist/src/utils/plugin-release.d.ts +0 -2
  620. package/dist/src/utils/plugin-release.js +0 -2
  621. package/dist/src/utils/plugin-release.js.map +0 -1
@@ -1,41 +1,46 @@
1
1
  import crypto from 'node:crypto';
2
2
  import path from 'node:path';
3
3
  import fs from 'fs-extra';
4
- import { validatePublishedCatalogSnapshot } from '@lesliechan721/aw-plugin-core';
5
- import { disposeCatalogPublicationInspection, parseRemoteRefs, prepareCatalogPublicationInspection, publicationGit, publicationGitExit, } from './catalog-publication-inspection.js';
4
+ import { GENERATED_OUTPUT_MARKER_FILENAME, validatePublishedCatalogSnapshot, } from '@lesliechan721/aw-plugin-core';
5
+ import { disposeCatalogPublicationInspection, inspectCatalogPublicationApplyContext, inspectCatalogPublicationLiveContext, parseRemoteRefs, prepareCatalogPublicationInspection, publicationGit, publicationGitExit, readCatalogPublicationBranchState, } from './catalog-publication-inspection.js';
6
+ import { catalogPublicationDirectoryPath, catalogPublicationJournalPath, catalogPublicationPlanDigest, catalogPublicationRepositoryName, catalogPublicationRepositoryPath, findCatalogPublicationJournalByPlanDigest, readCatalogPublicationJournal, writeCatalogPublicationJournalAtomic, } from './catalog-publication-journal.js';
7
+ import { resolveCatalogPublicationTarget, } from './catalog-publication-target.js';
8
+ import { resolveCatalogWorkspaceRoot, } from './catalog-workspace-resolution.js';
9
+ export { catalogPublicationPlanDigest, parseCatalogPublicationJournal, } from './catalog-publication-journal.js';
6
10
  export { safeRemoteIdentity, sanitizedGitEnvironment } from './catalog-publication-inspection.js';
7
- function digest(value) {
8
- return `sha256:${crypto.createHash('sha256').update(value).digest('hex')}`;
9
- }
10
- function canonicalJson(value) {
11
- if (Array.isArray(value))
12
- return `[${value.map(canonicalJson).join(',')}]`;
13
- if (value !== null && typeof value === 'object') {
14
- const record = value;
15
- return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(',')}}`;
16
- }
17
- return JSON.stringify(value);
18
- }
19
- export function catalogPublicationDescriptorDigest(descriptor) {
20
- return digest(canonicalJson(descriptor));
11
+ export const CATALOG_PUBLICATION_CLEANUP_WARNING = 'Catalog publication succeeded, but local repository cleanup did not complete. Retry apply with the same plan digest.';
12
+ async function assertPublicationStatePathSafe(workspaceRoot) {
13
+ for (const candidate of [
14
+ path.join(workspaceRoot, '.aw'),
15
+ path.join(workspaceRoot, '.aw', 'publish'),
16
+ ]) {
17
+ if (!(await fs.pathExists(candidate)))
18
+ continue;
19
+ const stats = await fs.lstat(candidate);
20
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
21
+ throw new Error('Catalog publication state path must contain only regular local directories.');
22
+ }
23
+ }
21
24
  }
22
- async function writeJsonAtomic(filePath, value, exclusive) {
23
- await fs.ensureDir(path.dirname(filePath));
24
- const temporary = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);
25
- await fs.writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
25
+ async function assertPublicationDirectorySafe(directoryPath, catalogVersion) {
26
+ let stats;
26
27
  try {
27
- if (exclusive) {
28
- await fs.link(temporary, filePath);
29
- await fs.remove(temporary);
30
- }
31
- else {
32
- await fs.rename(temporary, filePath);
33
- }
28
+ stats = await fs.lstat(directoryPath);
34
29
  }
35
30
  catch (error) {
36
- await fs.remove(temporary);
31
+ if (error.code === 'ENOENT')
32
+ return false;
37
33
  throw error;
38
34
  }
35
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
36
+ throw new Error(`Catalog ${catalogVersion} publication state directory is damaged. Increase the Catalog version.`);
37
+ }
38
+ return true;
39
+ }
40
+ function sameDescriptor(left, right) {
41
+ const comparisonCommit = '0'.repeat(40);
42
+ return catalogPublicationPlanDigest(left, comparisonCommit)
43
+ === catalogPublicationPlanDigest(right, comparisonCommit);
39
44
  }
40
45
  async function clearWorktree(repositoryRoot) {
41
46
  for (const name of await fs.readdir(repositoryRoot)) {
@@ -53,63 +58,83 @@ async function assertNoGitAttributes(root, relative = '') {
53
58
  await assertNoGitAttributes(root, child);
54
59
  }
55
60
  }
56
- async function assertSnapshotBinding(snapshotRoot, descriptor) {
57
- const [stats, validation, ledgerBytes] = await Promise.all([
61
+ async function assertSnapshotBinding(snapshotRoot, descriptor, display) {
62
+ const markerPath = path.join(snapshotRoot, GENERATED_OUTPUT_MARKER_FILENAME);
63
+ const [stats, markerStats] = await Promise.all([
58
64
  fs.lstat(snapshotRoot),
59
- validatePublishedCatalogSnapshot(snapshotRoot),
60
- fs.readFile(path.join(snapshotRoot, 'plugin-release-ledger.json')),
65
+ fs.lstat(markerPath),
61
66
  ]);
62
67
  if (!stats.isDirectory() || stats.isSymbolicLink()) {
63
68
  throw new Error('Prepared Catalog snapshot must be a regular local directory.');
64
69
  }
70
+ if (!markerStats.isFile() || markerStats.isSymbolicLink()) {
71
+ throw new Error('Prepared Catalog snapshot marker must be a regular local file.');
72
+ }
73
+ const [marker, validation] = await Promise.all([
74
+ fs.readJson(markerPath),
75
+ validatePublishedCatalogSnapshot(snapshotRoot),
76
+ ]);
65
77
  const release = validation.manifest.release;
66
- if (validation.manifest.catalogVersion !== descriptor.catalogVersion
67
- || validation.manifest.channel !== descriptor.channel
78
+ if (marker.workspaceIdentity !== descriptor.workspaceIdentity
79
+ || validation.manifest.catalogVersion !== display.catalogVersion
80
+ || validation.manifest.channel !== display.channel
81
+ || validation.manifest.entries.length !== display.pluginCount
68
82
  || validation.snapshotDigest !== descriptor.snapshotDigest
69
83
  || release.state !== 'published'
70
- || release.sourceHead !== descriptor.sourceHead
71
- || release.contentDigest !== descriptor.contentDigest
72
- || release.planId !== descriptor.planId
73
- || digest(ledgerBytes) !== descriptor.ledgerDigest) {
74
- throw new Error('Prepared Catalog descriptor, snapshot, ledger, or plan identity changed.');
84
+ || release.sourceHead !== descriptor.sourceHead) {
85
+ throw new Error('Prepared Catalog descriptor, snapshot, or plan identity changed.');
75
86
  }
76
87
  await assertNoGitAttributes(snapshotRoot);
77
88
  }
78
- async function publishCatalogPublicationPreparation(options) {
79
- const { preparation: inspection, descriptor, snapshotRoot } = options;
80
- const { temporaryRoot, repositoryRoot, repoRoot, sourceHead, remote, branch, branchRef, tag, tagRef, fetchUrl, pushUrl, safeFetchUrl, safePushUrl, remoteIdentityDigest, parent, attemptPath, env, } = inspection;
81
- if (catalogPublicationDescriptorDigest(inspection.descriptor)
82
- !== catalogPublicationDescriptorDigest(descriptor)) {
83
- throw new Error('Catalog publication descriptor changed after preparation.');
84
- }
85
- if (!inspection.tagAvailable) {
86
- throw new Error(`Remote Catalog tag ${tag} already exists. Increase the Catalog version.`);
87
- }
88
- if (!inspection.attemptAvailable || await fs.pathExists(attemptPath)) {
89
- throw new Error(`Catalog ${descriptor.catalogVersion} already has an attempted publication record. `
90
- + 'Run aw catalog version <higher> before publishing again.');
89
+ function displayFromPreparation(preparation) {
90
+ return {
91
+ catalogVersion: preparation.prepared.catalogVersion,
92
+ channel: preparation.prepared.channel,
93
+ pluginCount: preparation.prepared.pluginNames.length,
94
+ };
95
+ }
96
+ function assertLiveContextMatchesDescriptor(context, descriptor) {
97
+ if (context.workspaceIdentity !== descriptor.workspaceIdentity
98
+ || context.sourceHead !== descriptor.sourceHead
99
+ || context.remoteName !== descriptor.remote.name
100
+ || context.remoteIdentityDigest !== descriptor.remote.identityDigest
101
+ || context.branch !== descriptor.branch
102
+ || context.tag !== descriptor.tag) {
103
+ throw new Error('Catalog publication identity changed. Increase the Catalog version and create a new plan.');
91
104
  }
92
- if (!(await publicationGitExit(repoRoot, ['check-ignore', '-q', attemptPath], env))) {
93
- throw new Error('Catalog publish state under .aw/publish must be ignored by Git. Add .aw/ to .gitignore.');
105
+ }
106
+ function assertApplyContextMatchesDescriptor(context, descriptor) {
107
+ if (context.workspaceIdentity !== descriptor.workspaceIdentity
108
+ || context.remoteIdentityDigest !== descriptor.remote.identityDigest
109
+ || context.branch !== descriptor.branch) {
110
+ throw new Error('Catalog publication identity changed. Increase the Catalog version and create a new plan.');
94
111
  }
95
- await assertSnapshotBinding(snapshotRoot, descriptor);
112
+ }
113
+ async function createPublicationCommit(preparation, descriptor, snapshotRoot, display) {
114
+ const { repositoryRoot, parent, tag, env } = preparation;
115
+ await assertSnapshotBinding(snapshotRoot, descriptor, display);
96
116
  if (parent) {
97
117
  await publicationGit(repositoryRoot, [
118
+ '-c', 'core.autocrlf=false', '-c', 'core.eol=lf',
98
119
  'checkout', '--quiet', '--detach', 'refs/aw/catalog-parent',
99
120
  ], env, 'publicationCommitFailed', 'Could not select the publication parent.');
100
121
  }
101
122
  else {
102
123
  await publicationGit(repositoryRoot, [
124
+ '-c', 'core.autocrlf=false', '-c', 'core.eol=lf',
103
125
  'checkout', '--quiet', '--orphan', 'catalog-publication',
104
126
  ], env, 'publicationCommitFailed', 'Could not create the initial Catalog publication.');
105
127
  }
106
128
  await clearWorktree(repositoryRoot);
107
129
  await fs.copy(snapshotRoot, repositoryRoot, { dereference: false });
108
- await publicationGit(repositoryRoot, ['add', '--force', '--all'], env, 'publicationCommitFailed', 'Could not stage the Catalog publication tree.');
130
+ await publicationGit(repositoryRoot, [
131
+ '-c', 'core.autocrlf=false', '-c', 'core.eol=lf',
132
+ 'add', '--force', '--all',
133
+ ], env, 'publicationCommitFailed', 'Could not stage the Catalog publication tree.');
109
134
  await publicationGit(repositoryRoot, [
110
135
  '-c', 'user.name=AW Catalog Publisher',
111
136
  '-c', 'user.email=catalog-publisher@agent-workflows.invalid',
112
- 'commit', '--quiet', '-m', `Catalog ${descriptor.catalogVersion}`,
137
+ 'commit', '--quiet', '-m', `Catalog ${display.catalogVersion}`,
113
138
  ], env, 'publicationCommitFailed', 'Could not create the Catalog publication commit.');
114
139
  const commit = await publicationGit(repositoryRoot, [
115
140
  'rev-parse', 'HEAD',
@@ -122,198 +147,662 @@ async function publishCatalogPublicationPreparation(options) {
122
147
  if ((parent && (parents.length !== 1 || parents[0] !== parent)) || (!parent && parents.length !== 0)) {
123
148
  throw new Error('Catalog publication commit has an invalid parent.');
124
149
  }
125
- const verificationRoot = path.join(temporaryRoot, 'verification');
150
+ const verificationRoot = path.join(preparation.temporaryRoot, 'verification');
126
151
  await fs.ensureDir(verificationRoot);
127
152
  await publicationGit(repositoryRoot, [
153
+ '-c', 'core.autocrlf=false', '-c', 'core.eol=lf',
128
154
  '--work-tree', verificationRoot, 'checkout', '--quiet', commit, '--', '.',
129
155
  ], env, 'publicationCommitFailed', 'Could not verify the Catalog publication commit tree.');
130
- await assertSnapshotBinding(verificationRoot, descriptor);
156
+ await assertSnapshotBinding(verificationRoot, descriptor, display);
131
157
  await publicationGit(repositoryRoot, [
132
158
  '-c', 'user.name=AW Catalog Publisher',
133
159
  '-c', 'user.email=catalog-publisher@agent-workflows.invalid',
134
- 'tag', '--annotate', tag, '--message', `Catalog ${descriptor.catalogVersion}`,
160
+ 'tag', '--annotate', tag, '--message', `Catalog ${display.catalogVersion}`,
135
161
  ], env, 'publicationCommitFailed', 'Could not create the annotated Catalog tag.');
136
- const liveHead = await publicationGit(repoRoot, [
137
- 'rev-parse', '--verify', 'HEAD',
138
- ], env, 'sourceDrift', 'Could not recheck the source Git HEAD.');
139
- const liveStatus = await publicationGit(repoRoot, [
140
- 'status', '--porcelain=v1', '--untracked-files=all', '--ignore-submodules=none',
141
- ], env, 'sourceDrift', 'Could not recheck the source worktree.');
142
- if (liveHead !== sourceHead || liveStatus !== '') {
143
- throw new Error('Source HEAD or worktree changed before Catalog publication.');
144
- }
145
- let liveFetchUrl;
146
- let livePushUrl;
147
- if (descriptor.remote.name === null) {
148
- liveFetchUrl = fetchUrl;
149
- livePushUrl = pushUrl;
162
+ return commit;
163
+ }
164
+ async function remoteRefState(cwd, remote, branchRef, tagRef, env) {
165
+ const refs = parseRemoteRefs(await publicationGit(cwd, [
166
+ 'ls-remote', remote, branchRef, tagRef, `${tagRef}^{}`,
167
+ ], env, 'remoteReadFailed', 'Could not inspect the Catalog publication remote.'));
168
+ const tagPresent = refs.has(tagRef) || refs.has(`${tagRef}^{}`);
169
+ return {
170
+ branchCommit: refs.get(branchRef) ?? null,
171
+ tagCommit: refs.get(`${tagRef}^{}`) ?? null,
172
+ tagPresent,
173
+ tagAnnotated: refs.has(tagRef) && refs.has(`${tagRef}^{}`),
174
+ };
175
+ }
176
+ function assertReconciliableRemoteState(state, journal) {
177
+ const branchAtExpected = state.branchCommit === journal.expectedCommit;
178
+ const branchAtParent = state.branchCommit === journal.descriptor.parent;
179
+ const tagAtExpected = state.tagAnnotated && state.tagCommit === journal.expectedCommit;
180
+ const tagAbsent = !state.tagPresent;
181
+ if ((branchAtExpected && tagAtExpected)
182
+ || (branchAtParent && tagAbsent)
183
+ || (branchAtExpected && tagAbsent)
184
+ || (branchAtParent && tagAtExpected))
185
+ return;
186
+ throw new Error(`Catalog ${journal.display.catalogVersion} remote refs conflict with the prepared plan. Increase the Catalog version.`);
187
+ }
188
+ const PERSISTED_REPOSITORY_CONFIG = new Map([
189
+ ['core.repositoryformatversion', new Set(['0'])],
190
+ ['core.filemode', new Set(['true', 'false'])],
191
+ ['core.bare', new Set(['false'])],
192
+ ['core.logallrefupdates', new Set(['true'])],
193
+ ['core.ignorecase', new Set(['true'])],
194
+ ['core.precomposeunicode', new Set(['true'])],
195
+ ['core.hookspath', new Set(['/dev/null'])],
196
+ ['core.symlinks', new Set(['true'])],
197
+ ]);
198
+ const REQUIRED_PERSISTED_REPOSITORY_CONFIG = [
199
+ 'core.repositoryformatversion',
200
+ 'core.filemode',
201
+ 'core.bare',
202
+ 'core.logallrefupdates',
203
+ 'core.hookspath',
204
+ 'core.symlinks',
205
+ ];
206
+ async function assertRegularGitDirectory(root) {
207
+ const stats = await fs.lstat(root);
208
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
209
+ throw new Error('Pending Catalog publication Git directory is unsafe.');
150
210
  }
151
- else {
152
- [liveFetchUrl, livePushUrl] = await Promise.all([
153
- publicationGit(repoRoot, ['remote', 'get-url', descriptor.remote.name], env, 'remoteDrift', 'Could not recheck the Catalog publication remote configuration.'),
154
- publicationGit(repoRoot, ['remote', 'get-url', '--push', descriptor.remote.name], env, 'remoteDrift', 'Could not recheck the Catalog publication remote configuration.'),
155
- ]);
211
+ }
212
+ async function assertRegularGitFile(filePath) {
213
+ const stats = await fs.lstat(filePath);
214
+ if (!stats.isFile() || stats.isSymbolicLink()) {
215
+ throw new Error('Pending Catalog publication Git control file is unsafe.');
156
216
  }
157
- if (digest(JSON.stringify({ fetchUrl: liveFetchUrl, pushUrl: livePushUrl })) !== remoteIdentityDigest) {
158
- throw new Error('Catalog remote configuration changed during preparation.');
159
- }
160
- const liveRefs = parseRemoteRefs(await publicationGit(repositoryRoot, [
161
- 'ls-remote', 'publish', branchRef, tagRef, `${tagRef}^{}`,
162
- ], env, 'remoteDrift', 'Could not recheck the Catalog publication remote.'));
163
- if ((liveRefs.get(branchRef) ?? null) !== parent || liveRefs.has(tagRef) || liveRefs.has(`${tagRef}^{}`)) {
164
- throw new Error('Catalog remote changed during preparation. Increase the Catalog version before publishing again.');
165
- }
166
- if (await fs.pathExists(attemptPath)) {
167
- throw new Error(`Catalog ${descriptor.catalogVersion} already has an attempted publication record. `
168
- + 'Run aw catalog version <higher> before publishing again.');
169
- }
170
- await options.beforeRemoteWrite?.();
171
- const attempted = {
172
- schemaVersion: 1,
173
- state: 'attempted',
174
- workspaceIdentity: descriptor.workspaceIdentity,
175
- catalogVersion: descriptor.catalogVersion,
176
- sourceHead,
177
- remote: { name: descriptor.remote.name, identityDigest: remoteIdentityDigest },
178
- branch,
179
- parent,
180
- tag,
181
- snapshotDigest: descriptor.snapshotDigest,
182
- contentDigest: descriptor.contentDigest,
183
- planId: descriptor.planId,
184
- descriptorDigest: catalogPublicationDescriptorDigest(descriptor),
185
- attemptedAt: new Date().toISOString(),
186
- };
217
+ }
218
+ async function assertGitTreeContainsOnlyLocalFiles(root) {
219
+ for (const entry of await fs.readdir(root, { withFileTypes: true })) {
220
+ const child = path.join(root, entry.name);
221
+ const stats = await fs.lstat(child);
222
+ if (stats.isSymbolicLink()) {
223
+ throw new Error('Pending Catalog publication Git data must not contain symbolic links.');
224
+ }
225
+ if (stats.isDirectory()) {
226
+ await assertGitTreeContainsOnlyLocalFiles(child);
227
+ }
228
+ else if (!stats.isFile()) {
229
+ throw new Error('Pending Catalog publication Git data must contain only regular local files.');
230
+ }
231
+ }
232
+ }
233
+ async function assertPathMissing(filePath) {
187
234
  try {
188
- await writeJsonAtomic(attemptPath, attempted, true);
235
+ await fs.lstat(filePath);
189
236
  }
190
237
  catch (error) {
191
- if (error.code === 'EEXIST') {
192
- throw new Error(`Catalog ${descriptor.catalogVersion} already has an attempted publication record. `
193
- + 'Run aw catalog version <higher> before publishing again.');
194
- }
238
+ if (error.code === 'ENOENT')
239
+ return;
195
240
  throw error;
196
241
  }
242
+ throw new Error('Pending Catalog publication repository must not use alternate object stores.');
243
+ }
244
+ async function validatePersistentRepositoryControlState(repositoryRoot, env) {
245
+ const gitRoot = path.join(repositoryRoot, '.git');
246
+ const configPath = path.join(gitRoot, 'config');
247
+ await assertRegularGitDirectory(gitRoot);
248
+ await assertRegularGitFile(configPath);
249
+ await assertRegularGitFile(path.join(gitRoot, 'HEAD'));
250
+ await assertRegularGitFile(path.join(gitRoot, 'index'));
251
+ await assertRegularGitDirectory(path.join(gitRoot, 'objects'));
252
+ await assertRegularGitDirectory(path.join(gitRoot, 'refs'));
253
+ await assertPathMissing(path.join(gitRoot, 'objects', 'info', 'alternates'));
254
+ await assertPathMissing(path.join(gitRoot, 'objects', 'info', 'http-alternates'));
255
+ await assertGitTreeContainsOnlyLocalFiles(gitRoot);
256
+ const entries = (await publicationGit(repositoryRoot, [
257
+ 'config', '--file', configPath, '--no-includes', '--null', '--list',
258
+ ], env, 'pendingRepositoryInvalid', 'Pending Catalog publication config is damaged.'))
259
+ .split('\0')
260
+ .filter(Boolean);
261
+ const seen = new Set();
262
+ for (const entry of entries) {
263
+ const separator = entry.indexOf('\n');
264
+ if (separator <= 0)
265
+ throw new Error('Pending Catalog publication config is damaged.');
266
+ const key = entry.slice(0, separator).toLowerCase();
267
+ const value = entry.slice(separator + 1);
268
+ if (seen.has(key) || !PERSISTED_REPOSITORY_CONFIG.get(key)?.has(value)) {
269
+ throw new Error('Pending Catalog publication config contains unsafe local settings.');
270
+ }
271
+ seen.add(key);
272
+ }
273
+ if (REQUIRED_PERSISTED_REPOSITORY_CONFIG.some((key) => !seen.has(key))) {
274
+ throw new Error('Pending Catalog publication config is incomplete.');
275
+ }
276
+ }
277
+ async function validatePersistentRepository(repositoryRoot, journal, env) {
278
+ const version = journal.display.catalogVersion;
279
+ let stats;
197
280
  try {
198
- await publicationGit(repositoryRoot, [
199
- 'push', '--atomic', `--force-with-lease=${branchRef}:${parent ?? ''}`,
200
- 'publish', `${commit}:${branchRef}`, `${tagRef}:${tagRef}`,
201
- ], env, 'publicationUncertain', `Catalog atomic push failed or its result is uncertain. Do not retry ${descriptor.catalogVersion}; increase the Catalog version.`);
281
+ stats = await fs.lstat(repositoryRoot);
202
282
  }
203
- catch {
204
- throw new Error(`Catalog atomic push failed or its result is uncertain. Do not retry ${descriptor.catalogVersion}; run aw catalog version <higher>.`);
283
+ catch (error) {
284
+ throw new Error(`Catalog ${version} pending publication repository is missing or damaged. Increase the Catalog version.`, { cause: error });
205
285
  }
206
- const publishedRefs = parseRemoteRefs(await publicationGit(repositoryRoot, [
207
- 'ls-remote', 'publish', branchRef, tagRef, `${tagRef}^{}`,
208
- ], env, 'publicationUncertain', `Catalog publication result is uncertain. Do not retry ${descriptor.catalogVersion}; increase the Catalog version.`));
209
- if (publishedRefs.get(branchRef) !== commit || publishedRefs.get(`${tagRef}^{}`) !== commit) {
210
- throw new Error(`Catalog publication result is uncertain. Do not retry ${descriptor.catalogVersion}; run aw catalog version <higher>.`);
286
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
287
+ throw new Error(`Catalog ${version} pending publication repository is missing or damaged. Increase the Catalog version.`);
211
288
  }
212
- await writeJsonAtomic(attemptPath, {
213
- ...attempted,
214
- state: 'published',
215
- commit,
216
- publishedAt: new Date().toISOString(),
217
- }, false);
289
+ try {
290
+ await validatePersistentRepositoryControlState(repositoryRoot, env);
291
+ const [head, tagCommit, tagType, remotes, parents] = await Promise.all([
292
+ publicationGit(repositoryRoot, ['rev-parse', '--verify', 'HEAD'], env, 'pendingRepositoryInvalid', 'Pending Catalog publication repository is damaged.'),
293
+ publicationGit(repositoryRoot, ['rev-parse', `${journal.descriptor.tag}^{commit}`], env, 'pendingRepositoryInvalid', 'Pending Catalog publication tag is damaged.'),
294
+ publicationGit(repositoryRoot, ['cat-file', '-t', `refs/tags/${journal.descriptor.tag}`], env, 'pendingRepositoryInvalid', 'Pending Catalog publication tag is damaged.'),
295
+ publicationGit(repositoryRoot, ['remote'], env, 'pendingRepositoryInvalid', 'Pending Catalog publication repository is damaged.'),
296
+ publicationGit(repositoryRoot, ['show', '-s', '--format=%P', journal.expectedCommit], env, 'pendingRepositoryInvalid', 'Pending Catalog publication commit is damaged.'),
297
+ ]);
298
+ const parentList = parents.split(/\s+/u).filter(Boolean);
299
+ if (head !== journal.expectedCommit
300
+ || tagCommit !== journal.expectedCommit
301
+ || tagType !== 'tag'
302
+ || remotes !== ''
303
+ || (journal.descriptor.parent === null
304
+ ? parentList.length !== 0
305
+ : parentList.length !== 1 || parentList[0] !== journal.descriptor.parent))
306
+ throw new Error('Pending Catalog publication repository identity changed.');
307
+ const verificationRoot = path.join(path.dirname(repositoryRoot), `.${path.basename(repositoryRoot)}.${crypto.randomUUID()}.verify`);
308
+ try {
309
+ await fs.ensureDir(verificationRoot);
310
+ await publicationGit(repositoryRoot, [
311
+ '-c', 'core.autocrlf=false', '-c', 'core.eol=lf',
312
+ '--work-tree', verificationRoot, 'checkout', '--quiet', journal.expectedCommit, '--', '.',
313
+ ], env, 'pendingRepositoryInvalid', 'Pending Catalog publication commit tree is damaged.');
314
+ await assertSnapshotBinding(verificationRoot, journal.descriptor, journal.display);
315
+ }
316
+ finally {
317
+ await fs.remove(verificationRoot);
318
+ }
319
+ }
320
+ catch (error) {
321
+ throw new Error(`Catalog ${version} pending publication repository is missing or damaged. Increase the Catalog version.`, { cause: error });
322
+ }
323
+ }
324
+ async function persistPublicationState(preparation, finalStateRoot, journal, hooks) {
325
+ const parent = path.dirname(finalStateRoot);
326
+ await fs.ensureDir(parent);
327
+ const staging = path.join(parent, `.${path.basename(finalStateRoot)}.${crypto.randomUUID()}.tmp`);
328
+ const repositoryPath = path.join(staging, catalogPublicationRepositoryName());
329
+ const journalPath = path.join(staging, 'journal.json');
330
+ try {
331
+ await publicationGit(preparation.repositoryRoot, [
332
+ 'remote', 'remove', 'publish',
333
+ ], preparation.env, 'temporaryRepositoryFailed', 'Could not seal the publication repository.');
334
+ await fs.ensureDir(staging);
335
+ await fs.copy(preparation.repositoryRoot, repositoryPath, { dereference: false, errorOnExist: true });
336
+ await writeCatalogPublicationJournalAtomic(journalPath, journal);
337
+ const persisted = await readCatalogPublicationJournal(journalPath, journal.display.catalogVersion);
338
+ if (!persisted || persisted.planDigest !== journal.planDigest) {
339
+ throw new Error(`Catalog ${journal.display.catalogVersion} publication state could not be verified.`);
340
+ }
341
+ await validatePersistentRepository(repositoryPath, persisted, preparation.env);
342
+ await hooks.beforeFinalRename?.({
343
+ temporaryStateRoot: staging,
344
+ finalStateRoot,
345
+ });
346
+ try {
347
+ await fs.rename(staging, finalStateRoot);
348
+ return persisted;
349
+ }
350
+ catch (error) {
351
+ if (!(await fs.pathExists(finalStateRoot)))
352
+ throw error;
353
+ if (!(await assertPublicationDirectorySafe(finalStateRoot, journal.display.catalogVersion)))
354
+ throw error;
355
+ const existing = await readCatalogPublicationJournal(path.join(finalStateRoot, 'journal.json'), journal.display.catalogVersion);
356
+ if (!existing) {
357
+ throw new Error(`Catalog ${journal.display.catalogVersion} publication state is incomplete. Increase the Catalog version.`);
358
+ }
359
+ if (existing.planDigest !== journal.planDigest) {
360
+ throw new Error(`Catalog ${journal.display.catalogVersion} already has a different publication plan. Increase the Catalog version.`);
361
+ }
362
+ if (existing.state !== 'published') {
363
+ await validatePersistentRepository(path.join(finalStateRoot, catalogPublicationRepositoryName()), existing, preparation.env);
364
+ }
365
+ return existing;
366
+ }
367
+ }
368
+ finally {
369
+ await fs.remove(staging);
370
+ }
371
+ }
372
+ function receiptBase(context, journal, resolution) {
373
+ const repositoryPath = journal.repository === null
374
+ ? null
375
+ : catalogPublicationRepositoryPath(context.catalogWorkspaceRoot, journal.display.catalogVersion);
218
376
  return {
219
- command: 'catalog:publish',
220
377
  ok: true,
221
- workspaceIdentity: descriptor.workspaceIdentity,
222
- catalogVersion: descriptor.catalogVersion,
223
- channel: descriptor.channel,
224
- remote,
225
- remoteUrl: safeFetchUrl,
226
- fetchUrl: safeFetchUrl,
227
- pushUrl: safePushUrl,
228
- branch,
229
- parent,
230
- tag,
231
- commit,
232
- sourceHead,
233
- pluginCount: descriptor.pluginNames.length,
234
- snapshotDigest: descriptor.snapshotDigest,
235
- planId: descriptor.planId,
236
- descriptorDigest: catalogPublicationDescriptorDigest(descriptor),
378
+ workspaceRoot: context.catalogWorkspaceRoot,
379
+ workspaceRootResolvedFrom: resolution.workspaceRootResolvedFrom ?? 'explicit',
380
+ workspaceIdentity: journal.descriptor.workspaceIdentity,
381
+ catalogVersion: journal.display.catalogVersion,
382
+ channel: journal.display.channel,
383
+ remote: context.remote,
384
+ remoteResolvedFrom: resolution.remoteResolvedFrom ?? 'explicit',
385
+ remoteUrl: context.safeFetchUrl,
386
+ fetchUrl: context.safeFetchUrl,
387
+ pushUrl: context.safePushUrl,
388
+ branch: journal.descriptor.branch,
389
+ branchResolvedFrom: resolution.branchResolvedFrom ?? 'explicit',
390
+ parent: journal.descriptor.parent,
391
+ tag: journal.descriptor.tag,
392
+ expectedCommit: journal.expectedCommit,
393
+ sourceHead: journal.descriptor.sourceHead,
394
+ pluginCount: journal.display.pluginCount,
395
+ snapshotDigest: journal.descriptor.snapshotDigest,
396
+ planDigest: journal.planDigest,
397
+ descriptor: journal.descriptor,
398
+ journalPath: catalogPublicationJournalPath(context.catalogWorkspaceRoot, journal.display.catalogVersion),
399
+ repositoryPath,
237
400
  };
238
401
  }
239
- export async function publishPreparedCatalogPublication(options) {
240
- const inspection = await prepareCatalogPublicationInspection({
241
- workspaceRoot: options.workspaceRoot,
242
- remote: options.remote,
243
- remoteUrl: options.remoteUrl,
244
- branch: options.branch,
245
- env: options.env,
246
- failOnUnavailable: true,
402
+ async function readExistingPlan(context, resolution) {
403
+ await assertPublicationStatePathSafe(context.catalogWorkspaceRoot);
404
+ const stateRoot = catalogPublicationDirectoryPath(context.catalogWorkspaceRoot, context.catalogVersion);
405
+ const journalPath = catalogPublicationJournalPath(context.catalogWorkspaceRoot, context.catalogVersion);
406
+ const repositoryPath = catalogPublicationRepositoryPath(context.catalogWorkspaceRoot, context.catalogVersion);
407
+ const stateRootExists = await assertPublicationDirectorySafe(stateRoot, context.catalogVersion);
408
+ const journal = await readCatalogPublicationJournal(journalPath, context.catalogVersion);
409
+ if (!journal) {
410
+ if (stateRootExists) {
411
+ throw new Error(`Catalog ${context.catalogVersion} pending publication journal is missing. Increase the Catalog version.`);
412
+ }
413
+ return null;
414
+ }
415
+ assertLiveContextMatchesDescriptor(context, journal.descriptor);
416
+ if (journal.state !== 'published') {
417
+ await validatePersistentRepository(repositoryPath, journal, context.env);
418
+ }
419
+ const state = await remoteRefState(context.repoRoot, context.pushUrl, context.branchRef, context.tagRef, context.env);
420
+ if (journal.state === 'published'
421
+ && (state.branchCommit !== journal.expectedCommit
422
+ || !state.tagAnnotated
423
+ || state.tagCommit !== journal.expectedCommit)) {
424
+ throw new Error(`Catalog ${journal.display.catalogVersion} published journal conflicts with remote refs. Increase the Catalog version.`);
425
+ }
426
+ assertReconciliableRemoteState(state, journal);
427
+ return {
428
+ command: 'catalog:publish:plan',
429
+ state: journal.state,
430
+ ...receiptBase(context, journal, resolution),
431
+ };
432
+ }
433
+ async function persistNewPlan(options) {
434
+ const { preparation, descriptor, snapshotRoot, resolution } = options;
435
+ await assertPublicationStatePathSafe(preparation.catalogWorkspaceRoot);
436
+ if (!sameDescriptor(preparation.descriptor, descriptor)) {
437
+ throw new Error('Catalog publication descriptor changed during preparation.');
438
+ }
439
+ const display = displayFromPreparation(preparation);
440
+ const stateRoot = catalogPublicationDirectoryPath(preparation.catalogWorkspaceRoot, display.catalogVersion);
441
+ const journalPath = catalogPublicationJournalPath(preparation.catalogWorkspaceRoot, display.catalogVersion);
442
+ if (!(await publicationGitExit(preparation.repoRoot, ['check-ignore', '-q', journalPath], preparation.env))) {
443
+ throw new Error('Catalog publish state under .aw/publish must be ignored by Git. Add .aw/ to .gitignore.');
444
+ }
445
+ if (await fs.pathExists(stateRoot)) {
446
+ throw new Error(`Catalog ${display.catalogVersion} already has publication state. Use its existing plan or increase the Catalog version.`);
447
+ }
448
+ if (!preparation.tagAvailable) {
449
+ throw new Error(`Remote Catalog tag ${descriptor.tag} already exists. Increase the Catalog version.`);
450
+ }
451
+ const expectedCommit = await createPublicationCommit(preparation, descriptor, snapshotRoot, display);
452
+ let context = await inspectCatalogPublicationLiveContext({
453
+ workspaceRoot: preparation.catalogWorkspaceRoot,
454
+ ...(descriptor.remote.name === null ? { remoteUrl: preparation.pushUrl } : { remote: descriptor.remote.name }),
455
+ branch: descriptor.branch,
456
+ env: preparation.env,
457
+ });
458
+ assertLiveContextMatchesDescriptor(context, descriptor);
459
+ const liveRefs = await remoteRefState(preparation.repositoryRoot, 'publish', preparation.branchRef, preparation.tagRef, preparation.env);
460
+ if (liveRefs.branchCommit !== descriptor.parent || liveRefs.tagPresent) {
461
+ throw new Error(`Catalog ${display.catalogVersion} remote changed during plan creation. Increase the Catalog version.`);
462
+ }
463
+ const journal = {
464
+ schemaVersion: 2,
465
+ state: 'prepared',
466
+ planDigest: catalogPublicationPlanDigest(descriptor, expectedCommit),
467
+ descriptor,
468
+ expectedCommit,
469
+ repository: catalogPublicationRepositoryName(),
470
+ display,
471
+ preparedAt: new Date().toISOString(),
472
+ };
473
+ const persisted = await persistPublicationState(preparation, stateRoot, journal, {
474
+ beforeFinalRename: async (paths) => {
475
+ await options.beforeFinalRename?.(paths);
476
+ context = await inspectCatalogPublicationLiveContext({
477
+ workspaceRoot: preparation.catalogWorkspaceRoot,
478
+ ...(descriptor.remote.name === null
479
+ ? { remoteUrl: preparation.pushUrl }
480
+ : { remote: descriptor.remote.name }),
481
+ branch: descriptor.branch,
482
+ env: preparation.env,
483
+ });
484
+ assertLiveContextMatchesDescriptor(context, descriptor);
485
+ const finalRefs = await remoteRefState(context.repoRoot, context.pushUrl, context.branchRef, context.tagRef, context.env);
486
+ if (finalRefs.branchCommit !== descriptor.parent || finalRefs.tagPresent) {
487
+ throw new Error(`Catalog ${display.catalogVersion} remote changed during plan creation. Increase the Catalog version.`);
488
+ }
489
+ },
490
+ });
491
+ return {
492
+ command: 'catalog:publish:plan',
493
+ state: persisted.state,
494
+ ...receiptBase(context, persisted, resolution),
495
+ };
496
+ }
497
+ export async function persistCatalogPublicationPlan(options) {
498
+ return persistNewPlan({
499
+ preparation: options.preparation,
500
+ descriptor: options.descriptor ?? options.preparation.descriptor,
501
+ snapshotRoot: options.snapshotRoot ?? options.preparation.prepared.outputRoot,
502
+ resolution: options,
503
+ beforeFinalRename: options.beforeFinalRename,
247
504
  });
505
+ }
506
+ export async function prepareCatalogPublicationPlan(options) {
507
+ const context = await inspectCatalogPublicationLiveContext(options);
508
+ const existing = await readExistingPlan(context, options);
509
+ if (existing)
510
+ return existing;
511
+ const initialState = await remoteRefState(context.repoRoot, context.pushUrl, context.branchRef, context.tagRef, context.env);
512
+ if (initialState.tagPresent) {
513
+ throw new Error(`Remote Catalog tag ${context.tag} already exists. Increase the Catalog version.`);
514
+ }
515
+ if (initialState.branchCommit !== null) {
516
+ const branchState = await readCatalogPublicationBranchState({
517
+ workspaceRoot: context.catalogWorkspaceRoot,
518
+ ...(options.remoteUrl === undefined ? { remote: options.remote } : { remoteUrl: options.remoteUrl }),
519
+ branch: context.branch,
520
+ env: options.env,
521
+ });
522
+ if (branchState?.version === context.catalogVersion) {
523
+ throw new Error(`Remote Catalog branch already contains version ${context.catalogVersion} without its journal. Increase the Catalog version.`);
524
+ }
525
+ }
526
+ const preparation = await prepareCatalogPublicationInspection(options);
248
527
  try {
249
- return await publishCatalogPublicationPreparation({
250
- preparation: inspection,
251
- descriptor: options.descriptor,
252
- snapshotRoot: options.snapshotRoot,
253
- beforeRemoteWrite: options.beforeRemoteWrite,
528
+ return await persistNewPlan({
529
+ preparation,
530
+ descriptor: preparation.descriptor,
531
+ snapshotRoot: preparation.prepared.outputRoot,
532
+ resolution: options,
533
+ beforeFinalRename: options.beforeFinalRename,
254
534
  });
255
535
  }
256
536
  finally {
257
- await disposeCatalogPublicationInspection(inspection);
537
+ await disposeCatalogPublicationInspection(preparation);
258
538
  }
259
539
  }
260
- export async function runCatalogPublishCommand(options) {
261
- if (options.json && !options.yes)
262
- throw new Error('Catalog publish with --json requires --yes.');
263
- if (!options.interactive && !options.yes)
264
- throw new Error('Non-interactive Catalog publish requires --yes.');
265
- if (!/^sha256:[0-9a-f]{64}$/u.test(options.expectedDescriptorDigest ?? '')) {
266
- throw new Error('Catalog publish requires --expected-descriptor-digest from a successful publication preflight.');
540
+ async function markUncertain(journalPath, journal) {
541
+ const uncertain = {
542
+ schemaVersion: 2,
543
+ state: 'uncertain',
544
+ planDigest: journal.planDigest,
545
+ descriptor: journal.descriptor,
546
+ expectedCommit: journal.expectedCommit,
547
+ repository: journal.repository,
548
+ display: journal.display,
549
+ preparedAt: journal.preparedAt,
550
+ uncertainAt: new Date().toISOString(),
551
+ };
552
+ await writeCatalogPublicationJournalAtomic(journalPath, uncertain);
553
+ return uncertain;
554
+ }
555
+ async function readAuthorizedPublicationPlan(options) {
556
+ await assertPublicationStatePathSafe(options.workspaceRoot);
557
+ const located = await findCatalogPublicationJournalByPlanDigest(options.workspaceRoot, options.expectedPlanDigest);
558
+ const context = await inspectCatalogPublicationApplyContext(options);
559
+ assertApplyContextMatchesDescriptor(context, located.journal.descriptor);
560
+ return {
561
+ context,
562
+ journalPath: located.journalPath,
563
+ repositoryPath: catalogPublicationRepositoryPath(context.catalogWorkspaceRoot, located.catalogVersion),
564
+ tagRef: `refs/tags/${located.journal.descriptor.tag}`,
565
+ journal: located.journal,
566
+ };
567
+ }
568
+ async function cleanupPublishedRepository(repositoryPath, journal, env, removeRepository) {
569
+ try {
570
+ await fs.lstat(repositoryPath);
267
571
  }
268
- const inspection = await prepareCatalogPublicationInspection({
269
- ...options,
270
- failOnUnavailable: true,
271
- });
572
+ catch (error) {
573
+ if (error.code === 'ENOENT')
574
+ return [];
575
+ return [CATALOG_PUBLICATION_CLEANUP_WARNING];
576
+ }
577
+ const pendingJournal = {
578
+ schemaVersion: 2,
579
+ state: 'prepared',
580
+ planDigest: journal.planDigest,
581
+ descriptor: journal.descriptor,
582
+ expectedCommit: journal.expectedCommit,
583
+ repository: catalogPublicationRepositoryName(),
584
+ display: journal.display,
585
+ preparedAt: journal.preparedAt,
586
+ };
272
587
  try {
273
- const preparedDescriptorDigest = catalogPublicationDescriptorDigest(inspection.descriptor);
274
- if (options.expectedDescriptorDigest !== preparedDescriptorDigest) {
275
- throw new Error('Catalog publication descriptor does not match the authorized preflight. Run preflight and authorize the current exact identity.');
276
- }
277
- if (!(await publicationGitExit(inspection.repoRoot, ['check-ignore', '-q', inspection.attemptPath], inspection.env))) {
278
- throw new Error('Catalog publish state under .aw/publish must be ignored by Git. Add .aw/ to .gitignore.');
588
+ await validatePersistentRepository(repositoryPath, pendingJournal, env);
589
+ await removeRepository(repositoryPath);
590
+ return [];
591
+ }
592
+ catch {
593
+ return [CATALOG_PUBLICATION_CLEANUP_WARNING];
594
+ }
595
+ }
596
+ async function inspectCatalogPublicationPlanForApply(options) {
597
+ const authorized = await readAuthorizedPublicationPlan(options);
598
+ const { context, journal, repositoryPath, tagRef } = authorized;
599
+ if (journal.state !== 'published') {
600
+ await validatePersistentRepository(repositoryPath, journal, context.env);
601
+ }
602
+ const state = await remoteRefState(journal.state === 'published' ? context.repoRoot : repositoryPath, context.pushUrl, context.branchRef, tagRef, context.env);
603
+ if (journal.state === 'published'
604
+ && (state.branchCommit !== journal.expectedCommit
605
+ || !state.tagAnnotated
606
+ || state.tagCommit !== journal.expectedCommit)) {
607
+ throw new Error(`Catalog ${journal.display.catalogVersion} published journal conflicts with remote refs. Increase the Catalog version.`);
608
+ }
609
+ assertReconciliableRemoteState(state, journal);
610
+ return {
611
+ command: 'catalog:publish:plan',
612
+ state: journal.state,
613
+ ...receiptBase(context, journal, options),
614
+ };
615
+ }
616
+ export async function applyCatalogPublicationPlan(options) {
617
+ if (!/^sha256:[0-9a-f]{64}$/u.test(options.expectedPlanDigest)) {
618
+ throw new Error('Catalog publish apply requires --expected-plan-digest from catalog publish plan.');
619
+ }
620
+ const authorized = await readAuthorizedPublicationPlan(options);
621
+ const { context, journalPath, repositoryPath, tagRef } = authorized;
622
+ let { journal } = authorized;
623
+ if (journal.state === 'published') {
624
+ const state = await remoteRefState(context.repoRoot, context.pushUrl, context.branchRef, tagRef, context.env);
625
+ if (state.branchCommit !== journal.expectedCommit || !state.tagAnnotated || state.tagCommit !== journal.expectedCommit) {
626
+ throw new Error(`Catalog ${journal.display.catalogVersion} published journal conflicts with remote refs. Increase the Catalog version.`);
279
627
  }
280
- if (!options.yes) {
281
- options.io.stderr([
282
- `Workspace identity: ${inspection.descriptor.workspaceIdentity}`,
283
- `Source HEAD: ${inspection.sourceHead}`,
284
- `Catalog: ${inspection.descriptor.catalogVersion} (${inspection.descriptor.channel})`,
285
- `Remote: ${inspection.remote}`,
286
- `Fetch URL: ${inspection.safeFetchUrl}`,
287
- `Push URL: ${inspection.safePushUrl}`,
288
- `Branch: ${inspection.branchRef}`,
289
- `Parent: ${inspection.parent ?? '<root>'}`,
290
- `Tag: ${inspection.tagRef}`,
291
- `Snapshot digest: ${inspection.descriptor.snapshotDigest}`,
292
- `Plan ID: ${inspection.descriptor.planId}`,
293
- `Descriptor digest: ${preparedDescriptorDigest}`,
294
- `Plugins: ${inspection.descriptor.pluginNames.length}`,
295
- 'One atomic push will publish the branch and annotated tag.',
296
- ].join('\n') + '\n');
297
- if (!options.confirm || !(await options.confirm('Publish this Catalog snapshot?'))) {
298
- options.io.stderr('Catalog publication cancelled.\n');
299
- return null;
628
+ const warnings = await cleanupPublishedRepository(repositoryPath, journal, context.env, options.removeRepository ?? fs.remove);
629
+ return {
630
+ command: 'catalog:publish:apply',
631
+ state: 'published',
632
+ commit: journal.expectedCommit,
633
+ reconciliation: 'already-published',
634
+ warnings,
635
+ ...receiptBase(context, journal, options),
636
+ };
637
+ }
638
+ await validatePersistentRepository(repositoryPath, journal, context.env);
639
+ let state = await remoteRefState(repositoryPath, context.pushUrl, context.branchRef, tagRef, context.env);
640
+ assertReconciliableRemoteState(state, journal);
641
+ let reconciliation;
642
+ const branchAtExpected = state.branchCommit === journal.expectedCommit;
643
+ const tagAtExpected = state.tagAnnotated && state.tagCommit === journal.expectedCommit;
644
+ if (branchAtExpected && tagAtExpected) {
645
+ reconciliation = 'already-remote';
646
+ }
647
+ else {
648
+ await options.beforeRemoteWrite?.();
649
+ const writeContext = await inspectCatalogPublicationApplyContext(options);
650
+ assertApplyContextMatchesDescriptor(writeContext, journal.descriptor);
651
+ await validatePersistentRepository(repositoryPath, journal, writeContext.env);
652
+ state = await remoteRefState(repositoryPath, writeContext.pushUrl, writeContext.branchRef, tagRef, writeContext.env);
653
+ assertReconciliableRemoteState(state, journal);
654
+ try {
655
+ if (state.branchCommit === journal.expectedCommit
656
+ && state.tagAnnotated
657
+ && state.tagCommit === journal.expectedCommit) {
658
+ reconciliation = 'already-remote';
659
+ }
660
+ else if (state.branchCommit === journal.descriptor.parent && !state.tagPresent) {
661
+ reconciliation = 'atomic';
662
+ await publicationGit(repositoryPath, [
663
+ 'push', '--atomic',
664
+ `--force-with-lease=${writeContext.branchRef}:${journal.descriptor.parent ?? ''}`,
665
+ writeContext.pushUrl,
666
+ `${journal.expectedCommit}:${writeContext.branchRef}`,
667
+ `${tagRef}:${tagRef}`,
668
+ ], writeContext.env, 'publicationUncertain', 'Catalog atomic push failed or its result is uncertain.');
669
+ }
670
+ else if (state.branchCommit === journal.expectedCommit && !state.tagPresent) {
671
+ reconciliation = 'tag';
672
+ await publicationGit(repositoryPath, [
673
+ 'push', writeContext.pushUrl, `${tagRef}:${tagRef}`,
674
+ ], writeContext.env, 'publicationUncertain', 'Catalog tag push failed or its result is uncertain.');
675
+ }
676
+ else {
677
+ reconciliation = 'branch';
678
+ await publicationGit(repositoryPath, [
679
+ 'push', `--force-with-lease=${writeContext.branchRef}:${journal.descriptor.parent ?? ''}`,
680
+ writeContext.pushUrl, `${journal.expectedCommit}:${writeContext.branchRef}`,
681
+ ], writeContext.env, 'publicationUncertain', 'Catalog branch push failed or its result is uncertain.');
300
682
  }
301
683
  }
302
- return await publishCatalogPublicationPreparation({
303
- preparation: inspection,
304
- descriptor: inspection.descriptor,
305
- snapshotRoot: inspection.prepared.outputRoot,
306
- });
684
+ catch (error) {
685
+ journal = await markUncertain(journalPath, journal);
686
+ throw new Error(`Catalog ${journal.display.catalogVersion} publication result is uncertain. Retry apply with the same plan digest.`, { cause: error });
687
+ }
688
+ try {
689
+ state = await remoteRefState(repositoryPath, writeContext.pushUrl, writeContext.branchRef, tagRef, writeContext.env);
690
+ }
691
+ catch (error) {
692
+ journal = await markUncertain(journalPath, journal);
693
+ throw new Error(`Catalog ${journal.display.catalogVersion} publication result is uncertain. Retry apply with the same plan digest.`, { cause: error });
694
+ }
695
+ if (state.branchCommit !== journal.expectedCommit || !state.tagAnnotated || state.tagCommit !== journal.expectedCommit) {
696
+ journal = await markUncertain(journalPath, journal);
697
+ throw new Error(`Catalog ${journal.display.catalogVersion} publication result is uncertain. Retry apply with the same plan digest.`);
698
+ }
307
699
  }
308
- catch (error) {
309
- const message = (error instanceof Error ? error.message : String(error))
310
- .replaceAll(inspection.temporaryRoot, '<temporary Catalog state>')
311
- .replaceAll(inspection.fetchUrl, inspection.safeFetchUrl)
312
- .replaceAll(inspection.pushUrl, inspection.safePushUrl);
313
- throw new Error(message);
700
+ const published = {
701
+ schemaVersion: 2,
702
+ state: 'published',
703
+ planDigest: journal.planDigest,
704
+ descriptor: journal.descriptor,
705
+ expectedCommit: journal.expectedCommit,
706
+ repository: null,
707
+ display: journal.display,
708
+ preparedAt: journal.preparedAt,
709
+ publishedAt: new Date().toISOString(),
710
+ };
711
+ await writeCatalogPublicationJournalAtomic(journalPath, published);
712
+ const warnings = await cleanupPublishedRepository(repositoryPath, published, context.env, options.removeRepository ?? fs.remove);
713
+ return {
714
+ command: 'catalog:publish:apply',
715
+ state: 'published',
716
+ commit: published.expectedCommit,
717
+ reconciliation,
718
+ warnings,
719
+ ...receiptBase(context, published, options),
720
+ };
721
+ }
722
+ export async function runCatalogPublishPlanCommand(options) {
723
+ const workspace = await resolveCatalogWorkspaceRoot({
724
+ cwd: options.cwd,
725
+ ...(options.workspaceRoot === undefined ? {} : { explicitRoot: options.workspaceRoot }),
726
+ mode: 'existing',
727
+ });
728
+ const target = await resolveCatalogPublicationTarget({
729
+ workspaceRoot: workspace.workspaceRoot,
730
+ remote: options.remote,
731
+ branch: options.branch,
732
+ env: options.env,
733
+ requireRemote: true,
734
+ });
735
+ return prepareCatalogPublicationPlan({
736
+ workspaceRoot: workspace.workspaceRoot,
737
+ remote: target.remote,
738
+ branch: target.branch,
739
+ env: options.env,
740
+ workspaceRootResolvedFrom: workspace.workspaceRootResolvedFrom,
741
+ remoteResolvedFrom: target.remoteResolvedFrom,
742
+ branchResolvedFrom: target.branchResolvedFrom,
743
+ });
744
+ }
745
+ export async function runCatalogPublishApplyCommand(options) {
746
+ if (options.json && !options.yes)
747
+ throw new Error('Catalog publish apply with --json requires --yes.');
748
+ if (!options.interactive && !options.yes)
749
+ throw new Error('Non-interactive Catalog publish apply requires --yes.');
750
+ if (!/^sha256:[0-9a-f]{64}$/u.test(options.expectedPlanDigest ?? '')) {
751
+ throw new Error('Catalog publish apply requires --expected-plan-digest from catalog publish plan.');
314
752
  }
315
- finally {
316
- await disposeCatalogPublicationInspection(inspection);
753
+ const workspace = await resolveCatalogWorkspaceRoot({
754
+ cwd: options.cwd,
755
+ ...(options.workspaceRoot === undefined ? {} : { explicitRoot: options.workspaceRoot }),
756
+ mode: 'existing',
757
+ });
758
+ const target = await resolveCatalogPublicationTarget({
759
+ workspaceRoot: workspace.workspaceRoot,
760
+ remote: options.remote,
761
+ branch: options.branch,
762
+ env: options.env,
763
+ requireRemote: true,
764
+ });
765
+ if (!options.yes) {
766
+ const plan = await inspectCatalogPublicationPlanForApply({
767
+ workspaceRoot: workspace.workspaceRoot,
768
+ remote: target.remote,
769
+ branch: target.branch,
770
+ expectedPlanDigest: options.expectedPlanDigest,
771
+ env: options.env,
772
+ workspaceRootResolvedFrom: workspace.workspaceRootResolvedFrom,
773
+ remoteResolvedFrom: target.remoteResolvedFrom,
774
+ branchResolvedFrom: target.branchResolvedFrom,
775
+ });
776
+ options.io.stderr([
777
+ `Workspace identity: ${plan.workspaceIdentity}`,
778
+ `Source HEAD: ${plan.sourceHead}`,
779
+ `Remote: ${plan.remote}`,
780
+ `Fetch URL: ${plan.fetchUrl}`,
781
+ `Push URL: ${plan.pushUrl}`,
782
+ `Branch: refs/heads/${plan.branch}`,
783
+ `Parent: ${plan.parent ?? '<root>'}`,
784
+ `Tag: refs/tags/${plan.tag}`,
785
+ `Snapshot digest: ${plan.snapshotDigest}`,
786
+ `Expected commit: ${plan.expectedCommit}`,
787
+ `Plan digest: ${plan.planDigest}`,
788
+ ].join('\n') + '\n');
789
+ if (!options.confirm || !(await options.confirm('Apply this Catalog publication plan?'))) {
790
+ options.io.stderr('Catalog publication cancelled.\n');
791
+ return null;
792
+ }
317
793
  }
794
+ const result = await applyCatalogPublicationPlan({
795
+ workspaceRoot: workspace.workspaceRoot,
796
+ remote: target.remote,
797
+ branch: target.branch,
798
+ expectedPlanDigest: options.expectedPlanDigest,
799
+ env: options.env,
800
+ workspaceRootResolvedFrom: workspace.workspaceRootResolvedFrom,
801
+ remoteResolvedFrom: target.remoteResolvedFrom,
802
+ branchResolvedFrom: target.branchResolvedFrom,
803
+ });
804
+ for (const warning of result.warnings)
805
+ options.io.stderr(`${warning}\n`);
806
+ return result;
318
807
  }
319
808
  //# sourceMappingURL=catalog-publish.js.map