@lesliechan721/aw 0.1.0-beta.5 → 0.1.0-beta.50

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 (566) 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 -90
  16. package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -120
  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 +346 -1131
  23. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
  24. package/dist/scripts/aw-skill-eval-materializer.d.ts +26 -0
  25. package/dist/scripts/aw-skill-eval-materializer.js +306 -0
  26. package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
  27. package/dist/scripts/bundle-plugins.d.ts +1 -0
  28. package/dist/scripts/bundle-plugins.js +20 -5
  29. package/dist/scripts/bundle-plugins.js.map +1 -1
  30. package/dist/scripts/plugin-staging.d.ts +7 -9
  31. package/dist/scripts/plugin-staging.js +18 -29
  32. package/dist/scripts/plugin-staging.js.map +1 -1
  33. package/dist/scripts/test-plugin-scripts.d.ts +2 -0
  34. package/dist/scripts/test-plugin-scripts.js +47 -76
  35. package/dist/scripts/test-plugin-scripts.js.map +1 -1
  36. package/dist/scripts/test-workers.d.mts +24 -0
  37. package/dist/scripts/test-workers.mjs +59 -0
  38. package/dist/scripts/test-workers.mjs.map +1 -0
  39. package/dist/src/adapters/helpers.js +2 -2
  40. package/dist/src/adapters/helpers.js.map +1 -1
  41. package/dist/src/authoring/workspace-commands.d.ts +17 -1
  42. package/dist/src/authoring/workspace-commands.js +21 -4
  43. package/dist/src/authoring/workspace-commands.js.map +1 -1
  44. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  45. package/dist/src/commands/aw-capabilities.js +264 -0
  46. package/dist/src/commands/aw-capabilities.js.map +1 -0
  47. package/dist/src/commands/catalog-dev-source.d.ts +154 -0
  48. package/dist/src/commands/catalog-dev-source.js +655 -0
  49. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  50. package/dist/src/commands/catalog-generation.d.ts +21 -0
  51. package/dist/src/commands/catalog-generation.js +9 -0
  52. package/dist/src/commands/catalog-generation.js.map +1 -0
  53. package/dist/src/commands/catalog-publication-inspection.d.ts +71 -30
  54. package/dist/src/commands/catalog-publication-inspection.js +475 -63
  55. package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
  56. package/dist/src/commands/catalog-publication-journal.d.ts +68 -0
  57. package/dist/src/commands/catalog-publication-journal.js +292 -0
  58. package/dist/src/commands/catalog-publication-journal.js.map +1 -0
  59. package/dist/src/commands/catalog-publication-target.d.ts +18 -0
  60. package/dist/src/commands/catalog-publication-target.js +95 -0
  61. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  62. package/dist/src/commands/catalog-publish.d.ts +73 -15
  63. package/dist/src/commands/catalog-publish.js +701 -212
  64. package/dist/src/commands/catalog-publish.js.map +1 -1
  65. package/dist/src/commands/catalog-source.d.ts +60 -22
  66. package/dist/src/commands/catalog-source.js +311 -91
  67. package/dist/src/commands/catalog-source.js.map +1 -1
  68. package/dist/src/commands/catalog-status.d.ts +18 -22
  69. package/dist/src/commands/catalog-status.js +81 -115
  70. package/dist/src/commands/catalog-status.js.map +1 -1
  71. package/dist/src/commands/catalog-store.d.ts +104 -0
  72. package/dist/src/commands/catalog-store.js +685 -0
  73. package/dist/src/commands/catalog-store.js.map +1 -0
  74. package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
  75. package/dist/src/commands/catalog-workspace-resolution.js +42 -0
  76. package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
  77. package/dist/src/commands/console.js +28 -17
  78. package/dist/src/commands/console.js.map +1 -1
  79. package/dist/src/commands/dependency-operation-plan.d.ts +52 -15
  80. package/dist/src/commands/dependency-operation-plan.js +289 -7
  81. package/dist/src/commands/dependency-operation-plan.js.map +1 -1
  82. package/dist/src/commands/init.d.ts +5 -11
  83. package/dist/src/commands/init.js +30 -51
  84. package/dist/src/commands/init.js.map +1 -1
  85. package/dist/src/commands/offline-cleanup-evidence.d.ts +67 -0
  86. package/dist/src/commands/offline-cleanup-evidence.js +181 -0
  87. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  88. package/dist/src/commands/operation-plan.d.ts +146 -0
  89. package/dist/src/commands/operation-plan.js +71 -0
  90. package/dist/src/commands/operation-plan.js.map +1 -0
  91. package/dist/src/commands/operation-planner.d.ts +46 -0
  92. package/dist/src/commands/operation-planner.js +141 -0
  93. package/dist/src/commands/operation-planner.js.map +1 -0
  94. package/dist/src/commands/options.d.ts +9 -7
  95. package/dist/src/commands/options.js +83 -21
  96. package/dist/src/commands/options.js.map +1 -1
  97. package/dist/src/commands/plugin-capabilities.js +23 -3
  98. package/dist/src/commands/plugin-capabilities.js.map +1 -1
  99. package/dist/src/commands/rebuild-command.d.ts +77 -31
  100. package/dist/src/commands/rebuild-command.js +4862 -729
  101. package/dist/src/commands/rebuild-command.js.map +1 -1
  102. package/dist/src/commands/rebuild-integration.d.ts +131 -21
  103. package/dist/src/commands/rebuild-integration.js +2866 -1339
  104. package/dist/src/commands/rebuild-integration.js.map +1 -1
  105. package/dist/src/commands/rebuild-operations.d.ts +58 -30
  106. package/dist/src/commands/rebuild-operations.js +260 -319
  107. package/dist/src/commands/rebuild-operations.js.map +1 -1
  108. package/dist/src/commands/reconcile-operation-plan.d.ts +28 -0
  109. package/dist/src/commands/reconcile-operation-plan.js +47 -0
  110. package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
  111. package/dist/src/commands/review-inspection.d.ts +228 -0
  112. package/dist/src/commands/review-inspection.js +1341 -0
  113. package/dist/src/commands/review-inspection.js.map +1 -0
  114. package/dist/src/commands/review-preparation.d.ts +49 -0
  115. package/dist/src/commands/review-preparation.js +427 -0
  116. package/dist/src/commands/review-preparation.js.map +1 -0
  117. package/dist/src/commands/runtime.d.ts +1 -5
  118. package/dist/src/commands/runtime.js +24 -50
  119. package/dist/src/commands/runtime.js.map +1 -1
  120. package/dist/src/commands/skill-eval.d.ts +39 -0
  121. package/dist/src/commands/skill-eval.js +400 -0
  122. package/dist/src/commands/skill-eval.js.map +1 -0
  123. package/dist/src/commands/status-v6.d.ts +279 -0
  124. package/dist/src/commands/status-v6.js +2787 -0
  125. package/dist/src/commands/status-v6.js.map +1 -0
  126. package/dist/src/commands/sync-command.d.ts +40 -0
  127. package/dist/src/commands/sync-command.js +250 -0
  128. package/dist/src/commands/sync-command.js.map +1 -0
  129. package/dist/src/commands/wizard.d.ts +8 -5
  130. package/dist/src/commands/wizard.js +6 -4
  131. package/dist/src/commands/wizard.js.map +1 -1
  132. package/dist/src/commands/write-commands.d.ts +9 -3
  133. package/dist/src/commands/write-commands.js +127 -31
  134. package/dist/src/commands/write-commands.js.map +1 -1
  135. package/dist/src/constants.d.ts +7 -1
  136. package/dist/src/constants.js +7 -1
  137. package/dist/src/constants.js.map +1 -1
  138. package/dist/src/eval/manifest-v1.d.ts +71 -0
  139. package/dist/src/eval/manifest-v1.js +370 -0
  140. package/dist/src/eval/manifest-v1.js.map +1 -0
  141. package/dist/src/generators/local-plugin.d.ts +5 -1
  142. package/dist/src/generators/local-plugin.js +236 -109
  143. package/dist/src/generators/local-plugin.js.map +1 -1
  144. package/dist/src/index.d.ts +10 -4
  145. package/dist/src/index.js +1793 -486
  146. package/dist/src/index.js.map +1 -1
  147. package/dist/src/output/command-receipt.d.ts +43 -46
  148. package/dist/src/output/command-receipt.js +256 -80
  149. package/dist/src/output/command-receipt.js.map +1 -1
  150. package/dist/src/output/model.d.ts +3 -44
  151. package/dist/src/output/model.js +1 -144
  152. package/dist/src/output/model.js.map +1 -1
  153. package/dist/src/output/rebuild-progress.js +1 -13
  154. package/dist/src/output/rebuild-progress.js.map +1 -1
  155. package/dist/src/portable/commands.d.ts +46 -7
  156. package/dist/src/portable/commands.js +349 -37
  157. package/dist/src/portable/commands.js.map +1 -1
  158. package/dist/src/portable/materializer.d.ts +17 -4
  159. package/dist/src/portable/materializer.js +179 -41
  160. package/dist/src/portable/materializer.js.map +1 -1
  161. package/dist/src/portable/skills-cli.d.ts +15 -7
  162. package/dist/src/portable/skills-cli.js +74 -20
  163. package/dist/src/portable/skills-cli.js.map +1 -1
  164. package/dist/src/review/eval-source-input.d.ts +43 -0
  165. package/dist/src/review/eval-source-input.js +207 -0
  166. package/dist/src/review/eval-source-input.js.map +1 -0
  167. package/dist/src/review/review-profile.d.ts +17 -0
  168. package/dist/src/review/review-profile.js +234 -0
  169. package/dist/src/review/review-profile.js.map +1 -0
  170. package/dist/src/review/review-selection.d.ts +30 -0
  171. package/dist/src/review/review-selection.js +527 -0
  172. package/dist/src/review/review-selection.js.map +1 -0
  173. package/dist/src/review/review-types.d.ts +68 -0
  174. package/dist/src/review/review-types.js +16 -0
  175. package/dist/src/review/review-types.js.map +1 -0
  176. package/dist/src/review/skill-materialization.d.ts +13 -0
  177. package/dist/src/review/skill-materialization.js +75 -0
  178. package/dist/src/review/skill-materialization.js.map +1 -0
  179. package/dist/src/review/source-binding.d.ts +183 -0
  180. package/dist/src/review/source-binding.js +708 -0
  181. package/dist/src/review/source-binding.js.map +1 -0
  182. package/dist/src/tui/catalog-freshness.d.ts +1 -0
  183. package/dist/src/tui/catalog-freshness.js +2 -0
  184. package/dist/src/tui/catalog-freshness.js.map +1 -0
  185. package/dist/src/tui/catalog-generation.d.ts +21 -0
  186. package/dist/src/tui/catalog-generation.js +156 -0
  187. package/dist/src/tui/catalog-generation.js.map +1 -0
  188. package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
  189. package/dist/src/tui/catalog-sources/projection.js +17 -0
  190. package/dist/src/tui/catalog-sources/projection.js.map +1 -0
  191. package/dist/src/tui/catalog-sources/review.d.ts +3 -0
  192. package/dist/src/tui/catalog-sources/review.js +13 -0
  193. package/dist/src/tui/catalog-sources/review.js.map +1 -0
  194. package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
  195. package/dist/src/tui/catalog-sources/screens.js +40 -0
  196. package/dist/src/tui/catalog-sources/screens.js.map +1 -0
  197. package/dist/src/tui/catalog-sources/session.d.ts +32 -0
  198. package/dist/src/tui/catalog-sources/session.js +300 -0
  199. package/dist/src/tui/catalog-sources/session.js.map +1 -0
  200. package/dist/src/tui/catalog-sources/types.d.ts +54 -0
  201. package/dist/src/tui/catalog-sources/types.js +2 -0
  202. package/dist/src/tui/catalog-sources/types.js.map +1 -0
  203. package/dist/src/tui/catalog-store-task.d.ts +16 -0
  204. package/dist/src/tui/catalog-store-task.js +19 -0
  205. package/dist/src/tui/catalog-store-task.js.map +1 -0
  206. package/dist/src/tui/clipboard.d.ts +13 -0
  207. package/dist/src/tui/clipboard.js +95 -0
  208. package/dist/src/tui/clipboard.js.map +1 -0
  209. package/dist/src/tui/components.d.ts +110 -3
  210. package/dist/src/tui/components.js +183 -36
  211. package/dist/src/tui/components.js.map +1 -1
  212. package/dist/src/tui/config-array-draft.d.ts +29 -0
  213. package/dist/src/tui/config-array-draft.js +48 -0
  214. package/dist/src/tui/config-array-draft.js.map +1 -0
  215. package/dist/src/tui/config-leaf-editor.d.ts +16 -0
  216. package/dist/src/tui/config-leaf-editor.js +206 -0
  217. package/dist/src/tui/config-leaf-editor.js.map +1 -0
  218. package/dist/src/tui/config-value-presentation.d.ts +20 -0
  219. package/dist/src/tui/config-value-presentation.js +104 -0
  220. package/dist/src/tui/config-value-presentation.js.map +1 -0
  221. package/dist/src/tui/console-app-v4.d.ts +14 -4
  222. package/dist/src/tui/console-app-v4.js +8941 -1872
  223. package/dist/src/tui/console-app-v4.js.map +1 -1
  224. package/dist/src/tui/content-item-card.d.ts +13 -0
  225. package/dist/src/tui/content-item-card.js +51 -0
  226. package/dist/src/tui/content-item-card.js.map +1 -0
  227. package/dist/src/tui/controller-runtime.d.ts +10 -2
  228. package/dist/src/tui/controller-runtime.js +3211 -388
  229. package/dist/src/tui/controller-runtime.js.map +1 -1
  230. package/dist/src/tui/controller.d.ts +615 -45
  231. package/dist/src/tui/controller.js +3558 -768
  232. package/dist/src/tui/controller.js.map +1 -1
  233. package/dist/src/tui/dependency-graph-view.d.ts +39 -0
  234. package/dist/src/tui/dependency-graph-view.js +121 -0
  235. package/dist/src/tui/dependency-graph-view.js.map +1 -0
  236. package/dist/src/tui/dependency-graph.d.ts +81 -0
  237. package/dist/src/tui/dependency-graph.js +452 -0
  238. package/dist/src/tui/dependency-graph.js.map +1 -0
  239. package/dist/src/tui/diagnostic-projection.d.ts +23 -0
  240. package/dist/src/tui/diagnostic-projection.js +567 -0
  241. package/dist/src/tui/diagnostic-projection.js.map +1 -0
  242. package/dist/src/tui/diagnostics.d.ts +3 -3
  243. package/dist/src/tui/diagnostics.js +14 -2
  244. package/dist/src/tui/diagnostics.js.map +1 -1
  245. package/dist/src/tui/entity-cards.d.ts +55 -0
  246. package/dist/src/tui/entity-cards.js +220 -0
  247. package/dist/src/tui/entity-cards.js.map +1 -0
  248. package/dist/src/tui/glossary.d.ts +23 -0
  249. package/dist/src/tui/glossary.js +42 -0
  250. package/dist/src/tui/glossary.js.map +1 -0
  251. package/dist/src/tui/index.d.ts +6 -1
  252. package/dist/src/tui/index.js +5 -1
  253. package/dist/src/tui/index.js.map +1 -1
  254. package/dist/src/tui/input-display.d.ts +9 -0
  255. package/dist/src/tui/input-display.js +58 -0
  256. package/dist/src/tui/input-display.js.map +1 -0
  257. package/dist/src/tui/keys.d.ts +44 -0
  258. package/dist/src/tui/keys.js +43 -15
  259. package/dist/src/tui/keys.js.map +1 -1
  260. package/dist/src/tui/lifecycle-action-view.d.ts +6 -0
  261. package/dist/src/tui/lifecycle-action-view.js +36 -0
  262. package/dist/src/tui/lifecycle-action-view.js.map +1 -0
  263. package/dist/src/tui/model.d.ts +223 -31
  264. package/dist/src/tui/model.js +1510 -397
  265. package/dist/src/tui/model.js.map +1 -1
  266. package/dist/src/tui/operation-diagnostic-screens.d.ts +8 -0
  267. package/dist/src/tui/operation-diagnostic-screens.js +71 -0
  268. package/dist/src/tui/operation-diagnostic-screens.js.map +1 -0
  269. package/dist/src/tui/operation-history.d.ts +81 -0
  270. package/dist/src/tui/operation-history.js +136 -0
  271. package/dist/src/tui/operation-history.js.map +1 -0
  272. package/dist/src/tui/operation-review-planner.d.ts +21 -0
  273. package/dist/src/tui/operation-review-planner.js +1295 -0
  274. package/dist/src/tui/operation-review-planner.js.map +1 -0
  275. package/dist/src/tui/plugin-content.d.ts +31 -0
  276. package/dist/src/tui/plugin-content.js +680 -0
  277. package/dist/src/tui/plugin-content.js.map +1 -0
  278. package/dist/src/tui/plugin-detail.d.ts +52 -0
  279. package/dist/src/tui/plugin-detail.js +165 -0
  280. package/dist/src/tui/plugin-detail.js.map +1 -0
  281. package/dist/src/tui/plugin-write-task.d.ts +69 -0
  282. package/dist/src/tui/plugin-write-task.js +286 -0
  283. package/dist/src/tui/plugin-write-task.js.map +1 -0
  284. package/dist/src/tui/project-inventory.d.ts +68 -0
  285. package/dist/src/tui/project-inventory.js +203 -0
  286. package/dist/src/tui/project-inventory.js.map +1 -0
  287. package/dist/src/tui/prompt.js +4 -15
  288. package/dist/src/tui/prompt.js.map +1 -1
  289. package/dist/src/tui/query-header.d.ts +30 -0
  290. package/dist/src/tui/query-header.js +40 -0
  291. package/dist/src/tui/query-header.js.map +1 -0
  292. package/dist/src/tui/reader.d.ts +37 -0
  293. package/dist/src/tui/reader.js +47 -0
  294. package/dist/src/tui/reader.js.map +1 -0
  295. package/dist/src/tui/router.d.ts +197 -10
  296. package/dist/src/tui/router.js +338 -50
  297. package/dist/src/tui/router.js.map +1 -1
  298. package/dist/src/tui/screen-registry.d.ts +701 -0
  299. package/dist/src/tui/screen-registry.js +230 -0
  300. package/dist/src/tui/screen-registry.js.map +1 -0
  301. package/dist/src/tui/session-console-app.d.ts +6 -0
  302. package/dist/src/tui/session-console-app.js +13 -0
  303. package/dist/src/tui/session-console-app.js.map +1 -0
  304. package/dist/src/tui/session-host.d.ts +45 -0
  305. package/dist/src/tui/session-host.js +209 -0
  306. package/dist/src/tui/session-host.js.map +1 -0
  307. package/dist/src/tui/source-detail-card.d.ts +29 -0
  308. package/dist/src/tui/source-detail-card.js +45 -0
  309. package/dist/src/tui/source-detail-card.js.map +1 -0
  310. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  311. package/dist/src/tui/source-ref-presets.js +11 -0
  312. package/dist/src/tui/source-ref-presets.js.map +1 -0
  313. package/dist/src/tui/theme.d.ts +12 -0
  314. package/dist/src/tui/theme.js +12 -0
  315. package/dist/src/tui/theme.js.map +1 -1
  316. package/dist/src/tui/viewport.d.ts +1 -0
  317. package/dist/src/tui/viewport.js +23 -0
  318. package/dist/src/tui/viewport.js.map +1 -1
  319. package/dist/src/tui/views.js +31 -3
  320. package/dist/src/tui/views.js.map +1 -1
  321. package/dist/src/tui/wizard.js +37 -13
  322. package/dist/src/tui/wizard.js.map +1 -1
  323. package/dist/src/types.d.ts +244 -20
  324. package/dist/src/types.js +1 -0
  325. package/dist/src/types.js.map +1 -1
  326. package/dist/src/utils/agent-version.d.ts +7 -1
  327. package/dist/src/utils/agent-version.js +41 -8
  328. package/dist/src/utils/agent-version.js.map +1 -1
  329. package/dist/src/utils/artifact-plan.d.ts +5 -4
  330. package/dist/src/utils/artifact-plan.js +18 -7
  331. package/dist/src/utils/artifact-plan.js.map +1 -1
  332. package/dist/src/utils/artifact-renderer.d.ts +17 -7
  333. package/dist/src/utils/artifact-renderer.js +214 -216
  334. package/dist/src/utils/artifact-renderer.js.map +1 -1
  335. package/dist/src/utils/artifact-request.d.ts +21 -0
  336. package/dist/src/utils/artifact-request.js +78 -0
  337. package/dist/src/utils/artifact-request.js.map +1 -0
  338. package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
  339. package/dist/src/utils/aw-home-mutation-lock.js +32 -4
  340. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
  341. package/dist/src/utils/bundle-integrity.d.ts +0 -1
  342. package/dist/src/utils/bundle-integrity.js +0 -25
  343. package/dist/src/utils/bundle-integrity.js.map +1 -1
  344. package/dist/src/utils/bundle-layout.js +22 -29
  345. package/dist/src/utils/bundle-layout.js.map +1 -1
  346. package/dist/src/utils/catalog-capability-projection.d.ts +8 -0
  347. package/dist/src/utils/catalog-capability-projection.js +14 -0
  348. package/dist/src/utils/catalog-capability-projection.js.map +1 -0
  349. package/dist/src/utils/catalog-digests.d.ts +10 -0
  350. package/dist/src/utils/catalog-digests.js +57 -20
  351. package/dist/src/utils/catalog-digests.js.map +1 -1
  352. package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
  353. package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
  354. package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
  355. package/dist/src/utils/catalog-generation-error.d.ts +16 -0
  356. package/dist/src/utils/catalog-generation-error.js +30 -0
  357. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  358. package/dist/src/utils/catalog-generation-resolver.d.ts +44 -0
  359. package/dist/src/utils/catalog-generation-resolver.js +273 -0
  360. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  361. package/dist/src/utils/catalog-generation-service.d.ts +172 -0
  362. package/dist/src/utils/catalog-generation-service.js +1271 -0
  363. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  364. package/dist/src/utils/catalog-generation-state.d.ts +22 -0
  365. package/dist/src/utils/catalog-generation-state.js +192 -0
  366. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  367. package/dist/src/utils/catalog-generation-store.d.ts +58 -0
  368. package/dist/src/utils/catalog-generation-store.js +452 -0
  369. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  370. package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
  371. package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v7.js} +35 -43
  372. package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
  373. package/dist/src/utils/catalog-operation-context.d.ts +20 -0
  374. package/dist/src/utils/catalog-operation-context.js +142 -0
  375. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  376. package/dist/src/utils/catalog-public-error.d.ts +7 -3
  377. package/dist/src/utils/catalog-public-error.js +28 -8
  378. package/dist/src/utils/catalog-public-error.js.map +1 -1
  379. package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
  380. package/dist/src/utils/catalog-runtime-projection.js +5 -40
  381. package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
  382. package/dist/src/utils/catalog-snapshot.d.ts +5 -3
  383. package/dist/src/utils/catalog-snapshot.js +11 -3
  384. package/dist/src/utils/catalog-snapshot.js.map +1 -1
  385. package/dist/src/utils/catalog-source-identity.d.ts +1 -0
  386. package/dist/src/utils/catalog-source-identity.js +21 -2
  387. package/dist/src/utils/catalog-source-identity.js.map +1 -1
  388. package/dist/src/utils/catalog-source-impact.d.ts +21 -0
  389. package/dist/src/utils/catalog-source-impact.js +344 -0
  390. package/dist/src/utils/catalog-source-impact.js.map +1 -0
  391. package/dist/src/utils/catalog-source-references.d.ts +3 -2
  392. package/dist/src/utils/catalog-source-references.js +195 -347
  393. package/dist/src/utils/catalog-source-references.js.map +1 -1
  394. package/dist/src/utils/catalog-sources.d.ts +15 -1
  395. package/dist/src/utils/catalog-sources.js +206 -27
  396. package/dist/src/utils/catalog-sources.js.map +1 -1
  397. package/dist/src/utils/codex-config.d.ts +2 -0
  398. package/dist/src/utils/codex-config.js +26 -5
  399. package/dist/src/utils/codex-config.js.map +1 -1
  400. package/dist/src/utils/codex-manager.d.ts +79 -0
  401. package/dist/src/utils/codex-manager.js +747 -0
  402. package/dist/src/utils/codex-manager.js.map +1 -0
  403. package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
  404. package/dist/src/utils/codex-marketplace-path.js +45 -0
  405. package/dist/src/utils/codex-marketplace-path.js.map +1 -0
  406. package/dist/src/utils/codex-native-observation.d.ts +49 -0
  407. package/dist/src/utils/codex-native-observation.js +154 -0
  408. package/dist/src/utils/codex-native-observation.js.map +1 -0
  409. package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
  410. package/dist/src/utils/codex-native-render-receipt.js +205 -0
  411. package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
  412. package/dist/src/utils/codex-reconciler.d.ts +126 -0
  413. package/dist/src/utils/codex-reconciler.js +298 -0
  414. package/dist/src/utils/codex-reconciler.js.map +1 -0
  415. package/dist/src/utils/codex-shared-native.d.ts +43 -0
  416. package/dist/src/utils/codex-shared-native.js +81 -0
  417. package/dist/src/utils/codex-shared-native.js.map +1 -0
  418. package/dist/src/utils/codex-skill-staging.d.ts +2 -0
  419. package/dist/src/utils/codex-skill-staging.js.map +1 -1
  420. package/dist/src/utils/codex-surface-analysis.d.ts +46 -0
  421. package/dist/src/utils/codex-surface-analysis.js +247 -0
  422. package/dist/src/utils/codex-surface-analysis.js.map +1 -0
  423. package/dist/src/utils/dynamic-skill-tree.d.ts +4 -0
  424. package/dist/src/utils/dynamic-skill-tree.js +35 -5
  425. package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
  426. package/dist/src/utils/git-catalog-provider.d.ts +16 -0
  427. package/dist/src/utils/git-catalog-provider.js +177 -145
  428. package/dist/src/utils/git-catalog-provider.js.map +1 -1
  429. package/dist/src/utils/local-marketplace.d.ts +18 -1
  430. package/dist/src/utils/local-marketplace.js +354 -84
  431. package/dist/src/utils/local-marketplace.js.map +1 -1
  432. package/dist/src/utils/manifest.d.ts +1 -3
  433. package/dist/src/utils/manifest.js +1 -3
  434. package/dist/src/utils/manifest.js.map +1 -1
  435. package/dist/src/utils/multi-source-catalog.d.ts +3 -9
  436. package/dist/src/utils/multi-source-catalog.js +54 -110
  437. package/dist/src/utils/multi-source-catalog.js.map +1 -1
  438. package/dist/src/utils/native-cli.d.ts +55 -7
  439. package/dist/src/utils/native-cli.js +400 -58
  440. package/dist/src/utils/native-cli.js.map +1 -1
  441. package/dist/src/utils/orphan-marketplace-cleanup.js +0 -4
  442. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
  443. package/dist/src/utils/ownership.d.ts +84 -20
  444. package/dist/src/utils/ownership.js +179 -222
  445. package/dist/src/utils/ownership.js.map +1 -1
  446. package/dist/src/utils/path-catalog-provider.d.ts +1 -1
  447. package/dist/src/utils/path-catalog-provider.js +54 -65
  448. package/dist/src/utils/path-catalog-provider.js.map +1 -1
  449. package/dist/src/utils/paths.d.ts +0 -1
  450. package/dist/src/utils/paths.js +0 -1
  451. package/dist/src/utils/paths.js.map +1 -1
  452. package/dist/src/utils/plugin-config-impact.d.ts +33 -0
  453. package/dist/src/utils/plugin-config-impact.js +298 -0
  454. package/dist/src/utils/plugin-config-impact.js.map +1 -0
  455. package/dist/src/utils/plugin-config-write.d.ts +52 -27
  456. package/dist/src/utils/plugin-config-write.js +1000 -296
  457. package/dist/src/utils/plugin-config-write.js.map +1 -1
  458. package/dist/src/utils/plugin-config.d.ts +153 -93
  459. package/dist/src/utils/plugin-config.js +1116 -968
  460. package/dist/src/utils/plugin-config.js.map +1 -1
  461. package/dist/src/utils/plugin-intent-state.d.ts +49 -0
  462. package/dist/src/utils/plugin-intent-state.js +320 -0
  463. package/dist/src/utils/plugin-intent-state.js.map +1 -0
  464. package/dist/src/utils/plugin-scripts.d.ts +65 -125
  465. package/dist/src/utils/plugin-scripts.js +484 -524
  466. package/dist/src/utils/plugin-scripts.js.map +1 -1
  467. package/dist/src/utils/process-tree.d.ts +2 -2
  468. package/dist/src/utils/process-tree.js +1 -1
  469. package/dist/src/utils/process-tree.js.map +1 -1
  470. package/dist/src/utils/project-boundary.d.ts +11 -13
  471. package/dist/src/utils/project-boundary.js +28 -34
  472. package/dist/src/utils/project-boundary.js.map +1 -1
  473. package/dist/src/utils/runtime-config.d.ts +20 -0
  474. package/dist/src/utils/runtime-config.js +75 -0
  475. package/dist/src/utils/runtime-config.js.map +1 -0
  476. package/dist/src/utils/safe-fs.d.ts +21 -0
  477. package/dist/src/utils/safe-fs.js +111 -0
  478. package/dist/src/utils/safe-fs.js.map +1 -0
  479. package/dist/src/utils/safe-operation-diagnostic.d.ts +15 -0
  480. package/dist/src/utils/safe-operation-diagnostic.js +33 -0
  481. package/dist/src/utils/safe-operation-diagnostic.js.map +1 -0
  482. package/dist/src/utils/sensitive-content.d.ts +4 -0
  483. package/dist/src/utils/sensitive-content.js +36 -0
  484. package/dist/src/utils/sensitive-content.js.map +1 -0
  485. package/dist/src/utils/state-paths.js +7 -2
  486. package/dist/src/utils/state-paths.js.map +1 -1
  487. package/dist/src/utils/target-eligibility.d.ts +8 -2
  488. package/dist/src/utils/target-eligibility.js +17 -8
  489. package/dist/src/utils/target-eligibility.js.map +1 -1
  490. package/dist/src/utils/windows-claude-shim.d.ts +7 -0
  491. package/dist/src/utils/windows-claude-shim.js +10 -0
  492. package/dist/src/utils/windows-claude-shim.js.map +1 -0
  493. package/dist/src/utils/windows-npm-shim.d.ts +14 -0
  494. package/dist/src/utils/windows-npm-shim.js +140 -0
  495. package/dist/src/utils/windows-npm-shim.js.map +1 -0
  496. package/dist/vitest.config.js +92 -10
  497. package/dist/vitest.config.js.map +1 -1
  498. package/package.json +27 -18
  499. package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
  500. package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
  501. package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
  502. package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
  503. package/dist/scripts/aw-skill-eval-engine.js +0 -31
  504. package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
  505. package/dist/scripts/codex-eval-app-server.d.ts +0 -89
  506. package/dist/scripts/codex-eval-app-server.js +0 -1228
  507. package/dist/scripts/codex-eval-app-server.js.map +0 -1
  508. package/dist/scripts/codex-eval-isolation.d.ts +0 -61
  509. package/dist/scripts/codex-eval-isolation.js +0 -318
  510. package/dist/scripts/codex-eval-isolation.js.map +0 -1
  511. package/dist/scripts/codex-eval-process-management.d.ts +0 -8
  512. package/dist/scripts/codex-eval-process-management.js +0 -69
  513. package/dist/scripts/codex-eval-process-management.js.map +0 -1
  514. package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
  515. package/dist/scripts/codex-eval-process-tree.js +0 -803
  516. package/dist/scripts/codex-eval-process-tree.js.map +0 -1
  517. package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
  518. package/dist/scripts/codex-eval-runtime-config.js +0 -843
  519. package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
  520. package/dist/scripts/codex-trigger-eval.d.ts +0 -84
  521. package/dist/scripts/codex-trigger-eval.js +0 -968
  522. package/dist/scripts/codex-trigger-eval.js.map +0 -1
  523. package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
  524. package/dist/scripts/eval-plugin-skills-audited.js +0 -261
  525. package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
  526. package/dist/scripts/eval-plugin-skills.d.ts +0 -45
  527. package/dist/scripts/eval-plugin-skills.js +0 -1586
  528. package/dist/scripts/eval-plugin-skills.js.map +0 -1
  529. package/dist/scripts/eval-run-layout.d.ts +0 -17
  530. package/dist/scripts/eval-run-layout.js +0 -26
  531. package/dist/scripts/eval-run-layout.js.map +0 -1
  532. package/dist/scripts/plugin-eval-contract.d.ts +0 -185
  533. package/dist/scripts/plugin-eval-contract.js +0 -695
  534. package/dist/scripts/plugin-eval-contract.js.map +0 -1
  535. package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
  536. package/dist/scripts/plugin-eval-materializer.js +0 -421
  537. package/dist/scripts/plugin-eval-materializer.js.map +0 -1
  538. package/dist/scripts/skill-reporting.d.ts +0 -212
  539. package/dist/scripts/skill-reporting.js +0 -922
  540. package/dist/scripts/skill-reporting.js.map +0 -1
  541. package/dist/src/commands/status-v4.d.ts +0 -123
  542. package/dist/src/commands/status-v4.js +0 -905
  543. package/dist/src/commands/status-v4.js.map +0 -1
  544. package/dist/src/commands/status.d.ts +0 -93
  545. package/dist/src/commands/status.js +0 -442
  546. package/dist/src/commands/status.js.map +0 -1
  547. package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
  548. package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
  549. package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
  550. package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
  551. package/dist/src/utils/catalog-manifest-v3.js +0 -3
  552. package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
  553. package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
  554. package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
  555. package/dist/src/utils/catalog-source-cache.d.ts +0 -62
  556. package/dist/src/utils/catalog-source-cache.js +0 -296
  557. package/dist/src/utils/catalog-source-cache.js.map +0 -1
  558. package/dist/src/utils/codex-project-surface.d.ts +0 -3
  559. package/dist/src/utils/codex-project-surface.js +0 -49
  560. package/dist/src/utils/codex-project-surface.js.map +0 -1
  561. package/dist/src/utils/lifecycle-active-store.d.ts +0 -175
  562. package/dist/src/utils/lifecycle-active-store.js +0 -1276
  563. package/dist/src/utils/lifecycle-active-store.js.map +0 -1
  564. package/dist/src/utils/plugin-release.d.ts +0 -2
  565. package/dist/src/utils/plugin-release.js +0 -2
  566. package/dist/src/utils/plugin-release.js.map +0 -1
@@ -1,11 +1,16 @@
1
1
  import path from 'node:path';
2
2
  import fs from 'fs-extra';
3
- import { SKILL_OWNER_MARKER, readSkillOwnerMarker } from './ownership.js';
3
+ import { readSkillOwnerMarker } from './ownership.js';
4
4
  import { readJsonFile } from './json.js';
5
5
  import { assertStrictSemVer } from './manifest.js';
6
6
  import { resolveCliPackageRoot } from './paths.js';
7
+ import { canonicalizePathThroughExistingAncestor } from './state-paths.js';
7
8
  import { sanitizeCatalogSourceErrorMessage } from './catalog-public-error.js';
8
9
  import { normalizeMarketplaceProductToken } from './platform-support.js';
10
+ import { CODEX_NATIVE_RENDER_RECEIPT_PATH, parseCodexNativeRenderReceipt, } from './codex-native-render-receipt.js';
11
+ import { calculateCodexNativeRenderPayloadDigest } from './catalog-digests.js';
12
+ import { createCodexSkillStagingTreeContentDigest } from './codex-skill-staging.js';
13
+ import { readDynamicSkillTree } from './dynamic-skill-tree.js';
9
14
  const SOURCE_IDENTITY_PATTERN = /^sha256:[0-9a-f]{64}$/;
10
15
  export function getNamespacedMarketplaceName(sourceId) {
11
16
  return `aw-${sourceId}`;
@@ -32,6 +37,28 @@ export function projectMarketplaceManifestForPlatform(manifest, platform) {
32
37
  export function getLocalMarketplacePluginRoot(rootDir, pluginName) {
33
38
  return path.join(rootDir, 'plugins', pluginName);
34
39
  }
40
+ export async function assertSafeNamespacedMarketplacePluginRoot(rootDir, pluginName) {
41
+ const pluginsRoot = path.join(rootDir, 'plugins');
42
+ const pluginRoot = getLocalMarketplacePluginRoot(rootDir, pluginName);
43
+ const pluginsStats = await lstatMarketplacePath(pluginsRoot);
44
+ if (pluginsStats && (!pluginsStats.isDirectory() || pluginsStats.isSymbolicLink())) {
45
+ throw new MarketplaceRootValidationError(pluginsRoot, 'marketplace plugins ancestor must be a regular directory.', 'unsafe');
46
+ }
47
+ const pluginStats = pluginsStats ? await lstatMarketplacePath(pluginRoot) : null;
48
+ if (pluginStats && (!pluginStats.isDirectory() || pluginStats.isSymbolicLink())) {
49
+ throw new MarketplaceRootValidationError(pluginRoot, 'marketplace plugin projection must be a regular directory.', 'unsafe');
50
+ }
51
+ const physicalRoot = await fs.realpath(rootDir);
52
+ for (const candidate of [pluginsStats ? pluginsRoot : null, pluginStats ? pluginRoot : null]) {
53
+ if (!candidate)
54
+ continue;
55
+ const relative = path.relative(physicalRoot, await fs.realpath(candidate));
56
+ if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
57
+ throw new MarketplaceRootValidationError(candidate, 'marketplace plugin path escapes its physical root.', 'unsafe');
58
+ }
59
+ }
60
+ return pluginRoot;
61
+ }
35
62
  export function getLocalMarketplaceCodexSkillsRoot(rootDir, pluginName) {
36
63
  return path.join(getLocalMarketplacePluginRoot(rootDir, pluginName), 'codex', 'skills');
37
64
  }
@@ -47,10 +74,12 @@ export async function readCliPackageInfo() {
47
74
  }
48
75
  export class MarketplaceRootValidationError extends Error {
49
76
  location;
77
+ reason;
50
78
  code = 'marketplaceRootInvalid';
51
- constructor(location, message, cause) {
79
+ constructor(location, message, reason, cause) {
52
80
  super(`marketplaceRootInvalid: ${message}`, cause === undefined ? undefined : { cause });
53
81
  this.location = location;
82
+ this.reason = reason;
54
83
  this.name = 'MarketplaceRootValidationError';
55
84
  }
56
85
  }
@@ -59,7 +88,7 @@ function assertMarketplacePathBoundary(trustedRoot, candidatePath) {
59
88
  const candidate = path.resolve(candidatePath);
60
89
  const relative = path.relative(root, candidate);
61
90
  if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
62
- throw new MarketplaceRootValidationError(candidate, 'marketplace path escapes its trusted root.');
91
+ throw new MarketplaceRootValidationError(candidate, 'marketplace path escapes its trusted root.', 'unsafe');
63
92
  }
64
93
  return { root, candidate };
65
94
  }
@@ -76,34 +105,48 @@ async function lstatMarketplacePath(filePath) {
76
105
  }
77
106
  async function inspectMarketplacePath(trustedRoot, candidatePath, finalKind) {
78
107
  const { root, candidate } = assertMarketplacePathBoundary(trustedRoot, candidatePath);
79
- const paths = [root];
80
- let current = root;
81
- for (const segment of path.relative(root, candidate).split(path.sep).filter(Boolean)) {
82
- current = path.join(current, segment);
83
- paths.push(current);
84
- }
85
- let candidateStats = null;
86
- for (const currentPath of paths) {
87
- let stats;
88
- try {
89
- stats = await lstatMarketplacePath(currentPath);
90
- }
91
- catch (error) {
92
- throw new MarketplaceRootValidationError(currentPath, 'marketplace path cannot be inspected.', error);
93
- }
94
- if (!stats)
95
- return null;
96
- const isFinal = currentPath === candidate;
97
- const valid = isFinal && finalKind === 'file'
98
- ? stats.isFile() && !stats.isSymbolicLink()
99
- : stats.isDirectory() && !stats.isSymbolicLink();
100
- if (!valid) {
101
- throw new MarketplaceRootValidationError(currentPath, isFinal && finalKind === 'file'
102
- ? 'marketplace JSON target must be a regular file.'
103
- : 'marketplace path must be a regular directory.');
104
- }
105
- if (isFinal)
106
- candidateStats = stats;
108
+ let rootStats;
109
+ let candidateStats;
110
+ try {
111
+ [rootStats, candidateStats] = await Promise.all([
112
+ lstatMarketplacePath(root),
113
+ lstatMarketplacePath(candidate),
114
+ ]);
115
+ }
116
+ catch (error) {
117
+ throw new MarketplaceRootValidationError(candidate, 'marketplace path cannot be inspected.', 'unreadable', error);
118
+ }
119
+ if (!rootStats)
120
+ return null;
121
+ if (!rootStats.isDirectory() || rootStats.isSymbolicLink()) {
122
+ throw new MarketplaceRootValidationError(root, 'marketplace root must be a regular directory.', 'unsafe');
123
+ }
124
+ let physicalRoot;
125
+ let physicalCandidate;
126
+ try {
127
+ [physicalRoot, physicalCandidate] = await Promise.all([
128
+ canonicalizePathThroughExistingAncestor(root),
129
+ canonicalizePathThroughExistingAncestor(candidate),
130
+ ]);
131
+ }
132
+ catch (error) {
133
+ throw new MarketplaceRootValidationError(candidate, 'marketplace path cannot be resolved.', 'unreadable', error);
134
+ }
135
+ try {
136
+ assertMarketplacePathBoundary(physicalRoot, physicalCandidate);
137
+ }
138
+ catch {
139
+ throw new MarketplaceRootValidationError(candidate, 'marketplace physical path escapes its trusted root.', 'unsafe');
140
+ }
141
+ if (!candidateStats)
142
+ return null;
143
+ const valid = finalKind === 'file'
144
+ ? candidateStats.isFile() && !candidateStats.isSymbolicLink()
145
+ : candidateStats.isDirectory() && !candidateStats.isSymbolicLink();
146
+ if (!valid) {
147
+ throw new MarketplaceRootValidationError(candidate, finalKind === 'file'
148
+ ? 'marketplace JSON target must be a regular file.'
149
+ : 'marketplace path must be a regular directory.', 'unsafe');
107
150
  }
108
151
  return candidateStats;
109
152
  }
@@ -113,28 +156,14 @@ async function readStrictOptionalJsonObject(trustedRoot, filePath) {
113
156
  try {
114
157
  const value = await fs.readJson(filePath);
115
158
  if (!isRecord(value)) {
116
- throw new MarketplaceRootValidationError(filePath, 'marketplace JSON must contain an object.');
159
+ throw new MarketplaceRootValidationError(filePath, 'marketplace JSON must contain an object.', 'invalid');
117
160
  }
118
161
  return value;
119
162
  }
120
163
  catch (error) {
121
164
  if (error instanceof MarketplaceRootValidationError)
122
165
  throw error;
123
- throw new MarketplaceRootValidationError(filePath, 'marketplace JSON cannot be read.', error);
124
- }
125
- }
126
- async function readOptionalJsonObject(filePath) {
127
- try {
128
- const value = await fs.readJson(filePath);
129
- if (!isRecord(value))
130
- throw new Error(`Expected a JSON object at ${filePath}.`);
131
- return value;
132
- }
133
- catch (error) {
134
- const code = error.code;
135
- if (code === 'ENOENT' || code === 'ENOTDIR')
136
- return null;
137
- throw error;
166
+ throw new MarketplaceRootValidationError(filePath, 'marketplace JSON cannot be read.', error instanceof SyntaxError ? 'invalid' : 'unreadable', error);
138
167
  }
139
168
  }
140
169
  export async function readStrictNamespacedMarketplaceRoot(options) {
@@ -149,10 +178,12 @@ export async function readStrictNamespacedMarketplaceRoot(options) {
149
178
  || config.sourceId.length === 0
150
179
  || typeof config.sourceIdentity !== 'string'
151
180
  || !SOURCE_IDENTITY_PATTERN.test(config.sourceIdentity)
181
+ || (config.logicalIdentity !== undefined
182
+ && (typeof config.logicalIdentity !== 'string' || config.logicalIdentity.trim() === ''))
152
183
  || typeof config.marketplaceName !== 'string'
153
184
  || config.marketplaceName.length === 0
154
185
  || config.sourceId !== path.basename(options.rootDir)) {
155
- throw new MarketplaceRootValidationError(configPath, 'marketplace config must contain a canonical schema 2 identity.');
186
+ throw new MarketplaceRootValidationError(configPath, 'marketplace config must contain a canonical schema 2 identity.', 'invalid');
156
187
  }
157
188
  if ((options.sourceId !== undefined && config.sourceId !== options.sourceId)
158
189
  || (options.sourceIdentity !== undefined && config.sourceIdentity !== options.sourceIdentity)
@@ -161,11 +192,11 @@ export async function readStrictNamespacedMarketplaceRoot(options) {
161
192
  }
162
193
  const agentsManifest = await readStrictOptionalJsonObject(trustedMarketplaceRoot, path.join(options.rootDir, '.agents', 'plugins', 'marketplace.json'));
163
194
  if (!agentsManifest || agentsManifest.name !== config.marketplaceName) {
164
- throw new MarketplaceRootValidationError(path.join(options.rootDir, '.agents', 'plugins', 'marketplace.json'), 'Codex marketplace manifest name does not match config.');
195
+ throw new MarketplaceRootValidationError(path.join(options.rootDir, '.agents', 'plugins', 'marketplace.json'), 'Codex marketplace manifest name does not match config.', 'invalid');
165
196
  }
166
197
  const claudeManifest = await readStrictOptionalJsonObject(trustedMarketplaceRoot, path.join(options.rootDir, '.claude-plugin', 'marketplace.json'));
167
198
  if (claudeManifest && claudeManifest.name !== config.marketplaceName) {
168
- throw new MarketplaceRootValidationError(path.join(options.rootDir, '.claude-plugin', 'marketplace.json'), 'Claude marketplace manifest name does not match config.');
199
+ throw new MarketplaceRootValidationError(path.join(options.rootDir, '.claude-plugin', 'marketplace.json'), 'Claude marketplace manifest name does not match config.', 'invalid');
169
200
  }
170
201
  return {
171
202
  rootDir: options.rootDir,
@@ -176,8 +207,14 @@ export async function readStrictNamespacedMarketplaceRoot(options) {
176
207
  }
177
208
  function normalizePluginRelativeDirectory(value, fallback) {
178
209
  const raw = typeof value === 'string' ? value : fallback;
179
- const normalized = path.posix.normalize(raw.replace(/^\.\//, ''));
180
- if (!normalized || normalized === '.' || normalized === '..' || normalized.startsWith('../')) {
210
+ const normalizedSeparators = raw.replace(/\\/gu, '/');
211
+ const normalized = path.posix.normalize(normalizedSeparators.replace(/^\.\//, ''));
212
+ if (!normalized
213
+ || normalized === '.'
214
+ || normalized === '..'
215
+ || normalized.startsWith('../')
216
+ || path.posix.isAbsolute(normalizedSeparators)
217
+ || path.win32.isAbsolute(raw)) {
181
218
  return null;
182
219
  }
183
220
  return normalized;
@@ -190,19 +227,258 @@ async function assertTreeHasNoSymlinks(root) {
190
227
  await assertTreeHasNoSymlinks(path.join(root, entry.name));
191
228
  }
192
229
  }
193
- async function pathExists(filePath) {
230
+ class CodexNativeProjectionNotReusableError extends Error {
231
+ }
232
+ function nativeCodexTargets(manifest) {
233
+ const targets = manifest.artifacts?.targets ?? [];
234
+ if (!Array.isArray(targets))
235
+ return [];
236
+ return targets.flatMap((target) => {
237
+ if (!isRecord(target)
238
+ || target.platform !== 'codex'
239
+ || target.target !== 'codex.skill'
240
+ || !isRecord(target.delivery)
241
+ || target.delivery.mode !== 'codex-native'
242
+ || typeof target.id !== 'string'
243
+ || typeof target.skillKey !== 'string')
244
+ return [];
245
+ return [{ id: target.id, skillKey: target.skillKey }];
246
+ }).sort((left, right) => left.id < right.id ? -1 : left.id > right.id ? 1 : 0);
247
+ }
248
+ async function assertRegularProjectionTree(root, rejectOwnerMarker = false) {
249
+ for (const entry of await fs.readdir(root, { withFileTypes: true })) {
250
+ if (entry.isSymbolicLink() || (!entry.isDirectory() && !entry.isFile())) {
251
+ throw new Error(`codexNativeProjectionUnsafe: projection contains an unsafe node: ${entry.name}`);
252
+ }
253
+ if (rejectOwnerMarker && entry.name === '.agent-workflows-owner.json') {
254
+ throw new Error('codexNativeProjectionUnsafe: native Skill cannot contain an AW owner marker.');
255
+ }
256
+ if (entry.isDirectory()) {
257
+ await assertRegularProjectionTree(path.join(root, entry.name), rejectOwnerMarker);
258
+ }
259
+ }
260
+ }
261
+ async function readProjectionJson(trustedRoot, filePath) {
262
+ const stats = await inspectMarketplacePath(trustedRoot, filePath, 'file');
263
+ if (!stats)
264
+ throw new CodexNativeProjectionNotReusableError();
194
265
  try {
195
- await fs.lstat(filePath);
196
- return true;
266
+ const value = await fs.readJson(filePath);
267
+ if (!isRecord(value))
268
+ throw new CodexNativeProjectionNotReusableError();
269
+ return value;
197
270
  }
198
271
  catch (error) {
199
- const code = error.code;
200
- if (code === 'ENOENT' || code === 'ENOTDIR')
201
- return false;
202
- throw error;
272
+ if (error instanceof CodexNativeProjectionNotReusableError)
273
+ throw error;
274
+ if (error.code)
275
+ throw error;
276
+ throw new CodexNativeProjectionNotReusableError();
203
277
  }
204
278
  }
205
- async function readOverlayDirectory(directoryPath, redactedRoots) {
279
+ async function preserveMarketplacePluginProjection(options) {
280
+ const sourcePluginRoot = path.join(options.sourceRoot, 'plugins', options.pluginName);
281
+ const stagingPluginRoot = path.join(options.stagingRoot, 'plugins', options.pluginName);
282
+ const sourceManifest = await readProjectionJson(options.sourceRoot, path.join(sourcePluginRoot, '.agents-plugin', 'plugin.json'));
283
+ const sourceTargets = nativeCodexTargets(sourceManifest);
284
+ if (sourceTargets.length === 0) {
285
+ await assertRegularProjectionTree(sourcePluginRoot);
286
+ if (sourceManifest.name !== options.pluginName) {
287
+ throw new Error('marketplaceProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
288
+ }
289
+ if (!await inspectMarketplacePath(options.stagingRoot, stagingPluginRoot, 'directory')) {
290
+ throw new CodexNativeProjectionNotReusableError();
291
+ }
292
+ const stagingManifest = await readProjectionJson(options.stagingRoot, path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
293
+ if (stagingManifest.name !== options.pluginName) {
294
+ throw new Error('marketplaceProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
295
+ }
296
+ for (const platform of ['codex', 'claude']) {
297
+ const manifestPath = path.join(sourcePluginRoot, `.${platform}-plugin`, 'plugin.json');
298
+ if (!await inspectMarketplacePath(options.sourceRoot, manifestPath, 'file'))
299
+ continue;
300
+ const manifest = await readProjectionJson(options.sourceRoot, manifestPath);
301
+ if (manifest.name !== options.pluginName) {
302
+ throw new Error('marketplaceProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
303
+ }
304
+ if (manifest.version !== sourceManifest.version)
305
+ throw new CodexNativeProjectionNotReusableError();
306
+ }
307
+ await assertRegularProjectionTree(stagingPluginRoot);
308
+ await fs.remove(stagingPluginRoot);
309
+ await fs.copy(sourcePluginRoot, stagingPluginRoot, { dereference: false });
310
+ return;
311
+ }
312
+ await assertRegularProjectionTree(sourcePluginRoot);
313
+ const sourceCodexManifest = await readProjectionJson(options.sourceRoot, path.join(sourcePluginRoot, '.codex-plugin', 'plugin.json'));
314
+ if (sourceManifest.name !== options.pluginName || sourceCodexManifest.name !== options.pluginName) {
315
+ throw new Error('codexNativeProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
316
+ }
317
+ const sourceSkillsRelative = normalizePluginRelativeDirectory(sourceCodexManifest.skills, 'codex/skills');
318
+ if (!sourceSkillsRelative) {
319
+ throw new Error('codexNativeProjectionUnsafe: Codex Skills root is unsafe.');
320
+ }
321
+ const receiptPath = path.join(sourcePluginRoot, CODEX_NATIVE_RENDER_RECEIPT_PATH);
322
+ const receiptStats = await inspectMarketplacePath(options.sourceRoot, receiptPath, 'file');
323
+ if (!receiptStats)
324
+ throw new CodexNativeProjectionNotReusableError();
325
+ let receipt;
326
+ try {
327
+ const receiptContent = await fs.readFile(receiptPath, 'utf8');
328
+ receipt = parseCodexNativeRenderReceipt(receiptContent);
329
+ }
330
+ catch (error) {
331
+ if (error.code)
332
+ throw error;
333
+ throw new CodexNativeProjectionNotReusableError();
334
+ }
335
+ const logicalPluginId = `${options.sourceId}/${options.pluginName}`;
336
+ if (receipt.logicalPluginId !== logicalPluginId || receipt.sourceIdentity !== options.sourceIdentity) {
337
+ throw new Error('codexNativeProjectionIdentityMismatch: receipt identity does not match its marketplace.');
338
+ }
339
+ if (!await inspectMarketplacePath(options.stagingRoot, stagingPluginRoot, 'directory')) {
340
+ throw new CodexNativeProjectionNotReusableError();
341
+ }
342
+ await assertRegularProjectionTree(stagingPluginRoot);
343
+ const stagingManifest = await readProjectionJson(options.stagingRoot, path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
344
+ if (stagingManifest.name !== options.pluginName) {
345
+ throw new Error('codexNativeProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
346
+ }
347
+ if (sourceManifest.version !== receipt.pluginVersion
348
+ || sourceCodexManifest.version !== receipt.pluginVersion) {
349
+ throw new CodexNativeProjectionNotReusableError();
350
+ }
351
+ const receiptTargetIdentity = receipt.targets.map(({ id, skillKey }) => ({ id, skillKey }));
352
+ if (JSON.stringify(sourceTargets) !== JSON.stringify(receiptTargetIdentity)) {
353
+ throw new CodexNativeProjectionNotReusableError();
354
+ }
355
+ const sourceSkillsRoot = path.join(sourcePluginRoot, ...sourceSkillsRelative.split('/'));
356
+ const emptyArtifactDigest = createCodexSkillStagingTreeContentDigest({ skillKey: 'empty', files: {} });
357
+ for (const target of receipt.targets) {
358
+ const skillRoot = path.join(sourceSkillsRoot, target.skillKey);
359
+ const stats = await inspectMarketplacePath(options.sourceRoot, skillRoot, 'directory');
360
+ if (stats)
361
+ await assertRegularProjectionTree(skillRoot, true);
362
+ let tree;
363
+ try {
364
+ tree = stats ? await readDynamicSkillTree(skillRoot, 'codex.skill') : null;
365
+ }
366
+ catch (error) {
367
+ if (error.code)
368
+ throw error;
369
+ throw new CodexNativeProjectionNotReusableError();
370
+ }
371
+ if ((stats && !tree)
372
+ || (tree ? createCodexSkillStagingTreeContentDigest(tree) : emptyArtifactDigest) !== target.artifactDigest) {
373
+ throw new CodexNativeProjectionNotReusableError();
374
+ }
375
+ }
376
+ if (await calculateCodexNativeRenderPayloadDigest(sourcePluginRoot) !== receipt.payloadDigest) {
377
+ throw new CodexNativeProjectionNotReusableError();
378
+ }
379
+ const temporaryRoot = await fs.mkdtemp(path.join(options.stagingRoot, '.native-projection-'));
380
+ const candidateRoot = path.join(temporaryRoot, options.pluginName);
381
+ try {
382
+ // An unrelated operation must retain the installed version and its render inputs together.
383
+ await fs.copy(sourcePluginRoot, candidateRoot, { dereference: false });
384
+ if (await calculateCodexNativeRenderPayloadDigest(candidateRoot) !== receipt.payloadDigest) {
385
+ throw new CodexNativeProjectionNotReusableError();
386
+ }
387
+ await fs.remove(stagingPluginRoot);
388
+ await fs.move(candidateRoot, stagingPluginRoot);
389
+ }
390
+ finally {
391
+ await fs.remove(temporaryRoot).catch(() => undefined);
392
+ }
393
+ }
394
+ /**
395
+ * Replays unselected plugin copies into a fresh Catalog generation.
396
+ * Retains their payload and marketplace entries even when the Catalog changes.
397
+ * Codex native dynamic projections must also retain their original validated receipt.
398
+ * Damaged weak projections are skipped so their owning plugin can recover by sync.
399
+ */
400
+ export async function replayNamespacedMarketplacePluginProjections(options) {
401
+ let existing;
402
+ try {
403
+ existing = await readStrictNamespacedMarketplaceRoot({
404
+ trustedMarketplaceRoot: path.dirname(options.sourceRoot),
405
+ rootDir: options.sourceRoot,
406
+ sourceId: options.sourceId,
407
+ sourceIdentity: options.sourceIdentity,
408
+ marketplaceName: options.marketplaceName,
409
+ });
410
+ }
411
+ catch (error) {
412
+ if (error instanceof Error && error.message.startsWith('sourceChanged:'))
413
+ throw error;
414
+ throw new Error(`marketplaceProjectionReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, [options.sourceRoot, options.stagingRoot])}`);
415
+ }
416
+ if (!existing)
417
+ return;
418
+ const retainedPluginNames = new Set();
419
+ const pluginsRoot = path.join(options.sourceRoot, 'plugins');
420
+ let entries;
421
+ try {
422
+ entries = await readOverlayDirectory(options.sourceRoot, pluginsRoot, [options.sourceRoot, options.stagingRoot]);
423
+ }
424
+ catch (error) {
425
+ throw new Error(`marketplaceProjectionReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, [options.sourceRoot, options.stagingRoot])}`);
426
+ }
427
+ for (const entry of entries) {
428
+ if (entry.isSymbolicLink()) {
429
+ throw new Error('codexNativeProjectionUnsafe: plugin root cannot be a symlink.');
430
+ }
431
+ if (!entry.isDirectory())
432
+ continue;
433
+ const logicalPluginId = `${options.sourceId}/${entry.name}`;
434
+ if (options.rematerializedPluginIds?.has(logicalPluginId))
435
+ continue;
436
+ try {
437
+ await preserveMarketplacePluginProjection({ ...options, pluginName: entry.name });
438
+ retainedPluginNames.add(entry.name);
439
+ }
440
+ catch (error) {
441
+ if (error instanceof CodexNativeProjectionNotReusableError)
442
+ continue;
443
+ throw new Error(`marketplaceProjectionReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, [options.sourceRoot, options.stagingRoot])}`);
444
+ }
445
+ }
446
+ for (const [sourceManifest, relativePath] of [
447
+ [existing.agentsManifest, '.agents/plugins/marketplace.json'],
448
+ [existing.claudeManifest, '.claude-plugin/marketplace.json'],
449
+ ]) {
450
+ const manifestPath = path.join(options.stagingRoot, relativePath);
451
+ const stagingManifest = await readStrictOptionalJsonObject(options.stagingRoot, manifestPath);
452
+ if (!stagingManifest || retainedPluginNames.size === 0)
453
+ continue;
454
+ if (!Array.isArray(stagingManifest.plugins) || (sourceManifest && !Array.isArray(sourceManifest.plugins))) {
455
+ throw new Error('marketplaceProjectionInvalid: marketplace plugins must be an array.');
456
+ }
457
+ const retainedEntries = (sourceManifest?.plugins ?? []).filter((entry) => isRecord(entry)
458
+ && typeof entry.name === 'string' && retainedPluginNames.has(entry.name));
459
+ await fs.writeJson(manifestPath, {
460
+ ...stagingManifest,
461
+ plugins: [
462
+ ...stagingManifest.plugins.filter((entry) => !isRecord(entry) || !retainedPluginNames.has(String(entry.name))),
463
+ ...retainedEntries.map((entry) => ({
464
+ ...entry,
465
+ source: `./plugins/${entry.name}`,
466
+ })),
467
+ ],
468
+ }, { spaces: 2 });
469
+ }
470
+ }
471
+ async function inspectOverlayPath(trustedRoot, targetPath, finalKind, redactedRoots) {
472
+ try {
473
+ return await inspectMarketplacePath(trustedRoot, targetPath, finalKind);
474
+ }
475
+ catch (error) {
476
+ throw new Error(`marketplaceOverlayReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, redactedRoots)}`);
477
+ }
478
+ }
479
+ async function readOverlayDirectory(trustedRoot, directoryPath, redactedRoots) {
480
+ if (!await inspectOverlayPath(trustedRoot, directoryPath, 'directory', redactedRoots))
481
+ return [];
206
482
  try {
207
483
  return await fs.readdir(directoryPath, { withFileTypes: true });
208
484
  }
@@ -233,7 +509,7 @@ export async function replayNamespacedCodexSkillOverlays(options) {
233
509
  return;
234
510
  const pluginsRoot = path.join(options.sourceRoot, 'plugins');
235
511
  const redactedRoots = [options.sourceRoot, options.stagingRoot];
236
- for (const pluginEntry of await readOverlayDirectory(pluginsRoot, redactedRoots)) {
512
+ for (const pluginEntry of await readOverlayDirectory(options.sourceRoot, pluginsRoot, redactedRoots)) {
237
513
  if (pluginEntry.isSymbolicLink()) {
238
514
  throw new Error(`Codex Skill overlay plugin root cannot be a symlink: ${pluginEntry.name}`);
239
515
  }
@@ -241,28 +517,25 @@ export async function replayNamespacedCodexSkillOverlays(options) {
241
517
  continue;
242
518
  const pluginName = pluginEntry.name;
243
519
  const sourcePluginRoot = path.join(pluginsRoot, pluginName);
244
- const sourcePlatformManifest = await readOptionalJsonObject(path.join(sourcePluginRoot, '.codex-plugin', 'plugin.json'));
520
+ const sourcePlatformManifest = await readStrictOptionalJsonObject(options.sourceRoot, path.join(sourcePluginRoot, '.codex-plugin', 'plugin.json'));
245
521
  const sourceSkillsRelative = normalizePluginRelativeDirectory(sourcePlatformManifest?.skills, 'codex/skills');
246
522
  if (!sourceSkillsRelative)
247
523
  continue;
248
524
  const sourceSkillsRoot = path.join(sourcePluginRoot, ...sourceSkillsRelative.split('/'));
249
525
  const overlays = [];
250
- for (const entry of await readOverlayDirectory(sourceSkillsRoot, redactedRoots)) {
526
+ for (const entry of await readOverlayDirectory(options.sourceRoot, sourceSkillsRoot, redactedRoots)) {
251
527
  if (entry.isSymbolicLink()) {
252
528
  throw new Error(`Codex Skill overlay cannot be a symlink: ${path.join(sourceSkillsRoot, entry.name)}`);
253
529
  }
254
530
  if (!entry.isDirectory())
255
531
  continue;
256
532
  const skillRoot = path.join(sourceSkillsRoot, entry.name);
257
- if (!await pathExists(path.join(skillRoot, SKILL_OWNER_MARKER)))
258
- continue;
259
- await readSkillOwnerMarker({
533
+ const owner = await readSkillOwnerMarker({
260
534
  skillRoot,
261
535
  allowedRoot: sourceSkillsRoot,
262
536
  expectedIdentity: {
263
537
  owner: 'agent-workflows',
264
538
  sourceId: options.sourceId,
265
- sourceIdentity: options.sourceIdentity,
266
539
  pluginId: `${options.sourceId}/${pluginName}`,
267
540
  plugin: pluginName,
268
541
  artifactKey: entry.name,
@@ -270,47 +543,44 @@ export async function replayNamespacedCodexSkillOverlays(options) {
270
543
  scope: 'user',
271
544
  },
272
545
  });
546
+ if (!owner)
547
+ continue;
273
548
  overlays.push({ key: entry.name, root: skillRoot });
274
549
  }
275
550
  if (overlays.length === 0)
276
551
  continue;
277
552
  const stagingPluginRoot = path.join(options.stagingRoot, 'plugins', pluginName);
278
- if (!await pathExists(stagingPluginRoot)) {
279
- await assertTreeHasNoSymlinks(sourcePluginRoot);
280
- await fs.copy(sourcePluginRoot, stagingPluginRoot, {
281
- overwrite: false, errorOnExist: true, dereference: false,
282
- });
553
+ if (!await inspectOverlayPath(options.stagingRoot, stagingPluginRoot, 'directory', redactedRoots))
283
554
  continue;
284
- }
285
- const stagingManifest = await readOptionalJsonObject(path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
555
+ const stagingManifest = await readStrictOptionalJsonObject(options.stagingRoot, path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
286
556
  const targets = stagingManifest?.artifacts?.targets ?? [];
287
557
  const dynamicKeys = new Set(targets.flatMap((target) => {
288
558
  if (!isRecord(target))
289
559
  return [];
290
560
  return target.platform === 'codex'
291
561
  && target.target === 'codex.skill'
562
+ && isRecord(target.delivery)
563
+ && target.delivery.mode === 'codex-native'
292
564
  && Array.isArray(target.scopes)
293
565
  && target.scopes.includes('user')
294
566
  && typeof target.skillKey === 'string'
295
567
  ? [target.skillKey]
296
568
  : [];
297
569
  }));
298
- const stagingPlatformManifest = await readOptionalJsonObject(path.join(stagingPluginRoot, '.codex-plugin', 'plugin.json'));
570
+ const stagingPlatformManifest = await readStrictOptionalJsonObject(options.stagingRoot, path.join(stagingPluginRoot, '.codex-plugin', 'plugin.json'));
299
571
  const stagingSkillsRelative = normalizePluginRelativeDirectory(stagingPlatformManifest?.skills, 'codex/skills');
300
572
  if (!stagingSkillsRelative)
301
573
  continue;
302
574
  const stagingSkillsRoot = path.join(stagingPluginRoot, ...stagingSkillsRelative.split('/'));
575
+ await inspectOverlayPath(options.stagingRoot, stagingSkillsRoot, 'directory', redactedRoots);
303
576
  for (const overlay of overlays) {
577
+ if (!dynamicKeys.has(overlay.key))
578
+ continue;
304
579
  const destination = path.join(stagingSkillsRoot, overlay.key);
305
- if (dynamicKeys.has(overlay.key) || !await pathExists(destination)) {
306
- await assertTreeHasNoSymlinks(overlay.root);
307
- await fs.copy(overlay.root, destination, {
308
- overwrite: true, errorOnExist: false, dereference: false,
309
- });
310
- }
311
- else {
312
- await fs.copyFile(path.join(overlay.root, SKILL_OWNER_MARKER), path.join(destination, SKILL_OWNER_MARKER));
313
- }
580
+ await assertTreeHasNoSymlinks(overlay.root);
581
+ await fs.copy(overlay.root, destination, {
582
+ overwrite: true, errorOnExist: false, dereference: false,
583
+ });
314
584
  }
315
585
  }
316
586
  }