@lesliechan721/aw 0.1.0-beta.7 → 0.1.0-beta.9

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 (341) hide show
  1. package/dist/authoring/scripts/add-skill.mjs +4 -4
  2. package/dist/authoring/scripts/add-skill.mjs.map +1 -1
  3. package/dist/authoring/scripts/init-plugin.mjs +8 -37
  4. package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
  5. package/dist/authoring/scripts/lib/plugin-version-check.mjs +1 -1
  6. package/dist/authoring/scripts/lib/skill-scaffold.d.mts +77 -90
  7. package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -120
  8. package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
  9. package/dist/authoring/scripts/plugin-status.mjs +8 -11
  10. package/dist/authoring/scripts/plugin-status.mjs.map +1 -1
  11. package/dist/authoring/scripts/remove-plugin.mjs +2 -1
  12. package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
  13. package/dist/authoring/scripts/validate-plugin.mjs +64 -758
  14. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
  15. package/dist/scripts/aw-skill-eval-materializer.d.ts +24 -0
  16. package/dist/scripts/{plugin-eval-materializer.js → aw-skill-eval-materializer.js} +34 -145
  17. package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
  18. package/dist/scripts/bundle-plugins.d.ts +1 -0
  19. package/dist/scripts/bundle-plugins.js +2 -1
  20. package/dist/scripts/bundle-plugins.js.map +1 -1
  21. package/dist/scripts/plugin-staging.d.ts +6 -8
  22. package/dist/scripts/plugin-staging.js +15 -28
  23. package/dist/scripts/plugin-staging.js.map +1 -1
  24. package/dist/scripts/test-plugin-scripts.js +2 -33
  25. package/dist/scripts/test-plugin-scripts.js.map +1 -1
  26. package/dist/src/adapters/helpers.js +2 -2
  27. package/dist/src/adapters/helpers.js.map +1 -1
  28. package/dist/src/authoring/workspace-commands.d.ts +17 -1
  29. package/dist/src/authoring/workspace-commands.js +21 -4
  30. package/dist/src/authoring/workspace-commands.js.map +1 -1
  31. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  32. package/dist/src/commands/aw-capabilities.js +254 -0
  33. package/dist/src/commands/aw-capabilities.js.map +1 -0
  34. package/dist/src/commands/catalog-dev-source.d.ts +118 -0
  35. package/dist/src/commands/catalog-dev-source.js +417 -0
  36. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  37. package/dist/src/commands/catalog-generation.d.ts +13 -0
  38. package/dist/src/commands/catalog-generation.js +13 -0
  39. package/dist/src/commands/catalog-generation.js.map +1 -0
  40. package/dist/src/commands/catalog-publication-inspection.d.ts +29 -28
  41. package/dist/src/commands/catalog-publication-inspection.js +138 -50
  42. package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
  43. package/dist/src/commands/catalog-publication-journal.d.ts +49 -0
  44. package/dist/src/commands/catalog-publication-journal.js +147 -0
  45. package/dist/src/commands/catalog-publication-journal.js.map +1 -0
  46. package/dist/src/commands/catalog-publication-target.d.ts +18 -0
  47. package/dist/src/commands/catalog-publication-target.js +95 -0
  48. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  49. package/dist/src/commands/catalog-publish.d.ts +58 -15
  50. package/dist/src/commands/catalog-publish.js +590 -210
  51. package/dist/src/commands/catalog-publish.js.map +1 -1
  52. package/dist/src/commands/catalog-source.d.ts +12 -15
  53. package/dist/src/commands/catalog-source.js +61 -86
  54. package/dist/src/commands/catalog-source.js.map +1 -1
  55. package/dist/src/commands/catalog-status.d.ts +18 -22
  56. package/dist/src/commands/catalog-status.js +81 -115
  57. package/dist/src/commands/catalog-status.js.map +1 -1
  58. package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
  59. package/dist/src/commands/catalog-workspace-resolution.js +42 -0
  60. package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
  61. package/dist/src/commands/dependency-operation-plan.d.ts +88 -9
  62. package/dist/src/commands/dependency-operation-plan.js +331 -6
  63. package/dist/src/commands/dependency-operation-plan.js.map +1 -1
  64. package/dist/src/commands/init.d.ts +5 -11
  65. package/dist/src/commands/init.js +30 -51
  66. package/dist/src/commands/init.js.map +1 -1
  67. package/dist/src/commands/offline-cleanup-evidence.d.ts +43 -0
  68. package/dist/src/commands/offline-cleanup-evidence.js +116 -0
  69. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  70. package/dist/src/commands/options.d.ts +7 -1
  71. package/dist/src/commands/options.js +65 -6
  72. package/dist/src/commands/options.js.map +1 -1
  73. package/dist/src/commands/plugin-capabilities.js +5 -1
  74. package/dist/src/commands/plugin-capabilities.js.map +1 -1
  75. package/dist/src/commands/rebuild-command.d.ts +27 -13
  76. package/dist/src/commands/rebuild-command.js +1472 -471
  77. package/dist/src/commands/rebuild-command.js.map +1 -1
  78. package/dist/src/commands/rebuild-integration.d.ts +63 -8
  79. package/dist/src/commands/rebuild-integration.js +761 -439
  80. package/dist/src/commands/rebuild-integration.js.map +1 -1
  81. package/dist/src/commands/rebuild-operations.d.ts +2 -8
  82. package/dist/src/commands/rebuild-operations.js +48 -132
  83. package/dist/src/commands/rebuild-operations.js.map +1 -1
  84. package/dist/src/commands/runtime.js +21 -34
  85. package/dist/src/commands/runtime.js.map +1 -1
  86. package/dist/src/commands/skill-eval.d.ts +33 -0
  87. package/dist/src/commands/skill-eval.js +363 -0
  88. package/dist/src/commands/skill-eval.js.map +1 -0
  89. package/dist/src/commands/status-v6.d.ts +202 -0
  90. package/dist/src/commands/status-v6.js +1938 -0
  91. package/dist/src/commands/status-v6.js.map +1 -0
  92. package/dist/src/commands/sync-command.d.ts +21 -0
  93. package/dist/src/commands/sync-command.js +206 -0
  94. package/dist/src/commands/sync-command.js.map +1 -0
  95. package/dist/src/commands/wizard.d.ts +2 -2
  96. package/dist/src/commands/wizard.js +2 -2
  97. package/dist/src/commands/wizard.js.map +1 -1
  98. package/dist/src/commands/write-commands.js +33 -19
  99. package/dist/src/commands/write-commands.js.map +1 -1
  100. package/dist/src/constants.d.ts +7 -1
  101. package/dist/src/constants.js +7 -1
  102. package/dist/src/constants.js.map +1 -1
  103. package/dist/src/eval/manifest-v1.d.ts +66 -0
  104. package/dist/src/eval/manifest-v1.js +326 -0
  105. package/dist/src/eval/manifest-v1.js.map +1 -0
  106. package/dist/src/generators/local-plugin.d.ts +3 -0
  107. package/dist/src/generators/local-plugin.js +167 -45
  108. package/dist/src/generators/local-plugin.js.map +1 -1
  109. package/dist/src/index.d.ts +6 -1
  110. package/dist/src/index.js +863 -126
  111. package/dist/src/index.js.map +1 -1
  112. package/dist/src/output/command-receipt.d.ts +58 -8
  113. package/dist/src/output/command-receipt.js +141 -11
  114. package/dist/src/output/command-receipt.js.map +1 -1
  115. package/dist/src/output/model.d.ts +3 -44
  116. package/dist/src/output/model.js +1 -144
  117. package/dist/src/output/model.js.map +1 -1
  118. package/dist/src/output/rebuild-progress.js +0 -3
  119. package/dist/src/output/rebuild-progress.js.map +1 -1
  120. package/dist/src/portable/commands.d.ts +6 -2
  121. package/dist/src/portable/commands.js +57 -6
  122. package/dist/src/portable/commands.js.map +1 -1
  123. package/dist/src/portable/materializer.d.ts +4 -4
  124. package/dist/src/portable/materializer.js +61 -12
  125. package/dist/src/portable/materializer.js.map +1 -1
  126. package/dist/src/tui/catalog-generation.d.ts +35 -0
  127. package/dist/src/tui/catalog-generation.js +85 -0
  128. package/dist/src/tui/catalog-generation.js.map +1 -0
  129. package/dist/src/tui/components.js +1 -2
  130. package/dist/src/tui/components.js.map +1 -1
  131. package/dist/src/tui/console-app-v4.d.ts +1 -1
  132. package/dist/src/tui/console-app-v4.js +647 -196
  133. package/dist/src/tui/console-app-v4.js.map +1 -1
  134. package/dist/src/tui/controller-runtime.d.ts +6 -2
  135. package/dist/src/tui/controller-runtime.js +646 -137
  136. package/dist/src/tui/controller-runtime.js.map +1 -1
  137. package/dist/src/tui/controller.d.ts +77 -15
  138. package/dist/src/tui/controller.js +647 -306
  139. package/dist/src/tui/controller.js.map +1 -1
  140. package/dist/src/tui/diagnostics.d.ts +1 -2
  141. package/dist/src/tui/diagnostics.js.map +1 -1
  142. package/dist/src/tui/index.d.ts +1 -0
  143. package/dist/src/tui/index.js +1 -0
  144. package/dist/src/tui/index.js.map +1 -1
  145. package/dist/src/tui/input-display.d.ts +8 -0
  146. package/dist/src/tui/input-display.js +36 -0
  147. package/dist/src/tui/input-display.js.map +1 -0
  148. package/dist/src/tui/model.d.ts +102 -14
  149. package/dist/src/tui/model.js +630 -139
  150. package/dist/src/tui/model.js.map +1 -1
  151. package/dist/src/tui/router.d.ts +35 -0
  152. package/dist/src/tui/router.js.map +1 -1
  153. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  154. package/dist/src/tui/source-ref-presets.js +11 -0
  155. package/dist/src/tui/source-ref-presets.js.map +1 -0
  156. package/dist/src/tui/views.js +31 -3
  157. package/dist/src/tui/views.js.map +1 -1
  158. package/dist/src/types.d.ts +104 -13
  159. package/dist/src/types.js.map +1 -1
  160. package/dist/src/utils/agent-version.d.ts +7 -1
  161. package/dist/src/utils/agent-version.js +41 -8
  162. package/dist/src/utils/agent-version.js.map +1 -1
  163. package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
  164. package/dist/src/utils/aw-home-mutation-lock.js +32 -4
  165. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
  166. package/dist/src/utils/bundle-integrity.d.ts +0 -1
  167. package/dist/src/utils/bundle-integrity.js +0 -25
  168. package/dist/src/utils/bundle-integrity.js.map +1 -1
  169. package/dist/src/utils/bundle-layout.js +8 -6
  170. package/dist/src/utils/bundle-layout.js.map +1 -1
  171. package/dist/src/utils/catalog-digests.d.ts +7 -0
  172. package/dist/src/utils/catalog-digests.js +40 -2
  173. package/dist/src/utils/catalog-digests.js.map +1 -1
  174. package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
  175. package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
  176. package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
  177. package/dist/src/utils/catalog-generation-error.d.ts +13 -0
  178. package/dist/src/utils/catalog-generation-error.js +28 -0
  179. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  180. package/dist/src/utils/catalog-generation-resolver.d.ts +20 -0
  181. package/dist/src/utils/catalog-generation-resolver.js +143 -0
  182. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  183. package/dist/src/utils/catalog-generation-service.d.ts +43 -0
  184. package/dist/src/utils/catalog-generation-service.js +306 -0
  185. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  186. package/dist/src/utils/catalog-generation-state.d.ts +17 -0
  187. package/dist/src/utils/catalog-generation-state.js +168 -0
  188. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  189. package/dist/src/utils/catalog-generation-store.d.ts +34 -0
  190. package/dist/src/utils/catalog-generation-store.js +251 -0
  191. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  192. package/dist/src/utils/catalog-manifest-v6.d.ts +5 -0
  193. package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v6.js} +35 -43
  194. package/dist/src/utils/catalog-manifest-v6.js.map +1 -0
  195. package/dist/src/utils/catalog-operation-context.d.ts +20 -0
  196. package/dist/src/utils/catalog-operation-context.js +141 -0
  197. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  198. package/dist/src/utils/catalog-public-error.d.ts +7 -3
  199. package/dist/src/utils/catalog-public-error.js +21 -8
  200. package/dist/src/utils/catalog-public-error.js.map +1 -1
  201. package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
  202. package/dist/src/utils/catalog-runtime-projection.js +5 -40
  203. package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
  204. package/dist/src/utils/catalog-snapshot.d.ts +5 -3
  205. package/dist/src/utils/catalog-snapshot.js +11 -3
  206. package/dist/src/utils/catalog-snapshot.js.map +1 -1
  207. package/dist/src/utils/catalog-source-identity.d.ts +1 -0
  208. package/dist/src/utils/catalog-source-identity.js +21 -2
  209. package/dist/src/utils/catalog-source-identity.js.map +1 -1
  210. package/dist/src/utils/catalog-source-references.d.ts +7 -0
  211. package/dist/src/utils/catalog-source-references.js +44 -55
  212. package/dist/src/utils/catalog-source-references.js.map +1 -1
  213. package/dist/src/utils/catalog-sources.d.ts +1 -0
  214. package/dist/src/utils/catalog-sources.js +55 -20
  215. package/dist/src/utils/catalog-sources.js.map +1 -1
  216. package/dist/src/utils/codex-config.d.ts +2 -0
  217. package/dist/src/utils/codex-config.js +26 -5
  218. package/dist/src/utils/codex-config.js.map +1 -1
  219. package/dist/src/utils/codex-manager.d.ts +81 -0
  220. package/dist/src/utils/codex-manager.js +810 -0
  221. package/dist/src/utils/codex-manager.js.map +1 -0
  222. package/dist/src/utils/codex-reconciler.d.ts +131 -0
  223. package/dist/src/utils/codex-reconciler.js +327 -0
  224. package/dist/src/utils/codex-reconciler.js.map +1 -0
  225. package/dist/src/utils/codex-shared-native.d.ts +56 -0
  226. package/dist/src/utils/codex-shared-native.js +87 -0
  227. package/dist/src/utils/codex-shared-native.js.map +1 -0
  228. package/dist/src/utils/codex-skill-staging.d.ts +2 -0
  229. package/dist/src/utils/codex-skill-staging.js.map +1 -1
  230. package/dist/src/utils/codex-surface-analysis.d.ts +44 -0
  231. package/dist/src/utils/codex-surface-analysis.js +247 -0
  232. package/dist/src/utils/codex-surface-analysis.js.map +1 -0
  233. package/dist/src/utils/dynamic-skill-tree.d.ts +4 -0
  234. package/dist/src/utils/dynamic-skill-tree.js +35 -5
  235. package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
  236. package/dist/src/utils/git-catalog-provider.js +66 -140
  237. package/dist/src/utils/git-catalog-provider.js.map +1 -1
  238. package/dist/src/utils/lifecycle-active-store.d.ts +0 -28
  239. package/dist/src/utils/lifecycle-active-store.js +35 -247
  240. package/dist/src/utils/lifecycle-active-store.js.map +1 -1
  241. package/dist/src/utils/manifest.d.ts +1 -3
  242. package/dist/src/utils/manifest.js +1 -3
  243. package/dist/src/utils/manifest.js.map +1 -1
  244. package/dist/src/utils/multi-source-catalog.d.ts +3 -9
  245. package/dist/src/utils/multi-source-catalog.js +53 -110
  246. package/dist/src/utils/multi-source-catalog.js.map +1 -1
  247. package/dist/src/utils/native-cli.d.ts +49 -6
  248. package/dist/src/utils/native-cli.js +116 -33
  249. package/dist/src/utils/native-cli.js.map +1 -1
  250. package/dist/src/utils/orphan-marketplace-cleanup.js +1 -3
  251. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
  252. package/dist/src/utils/ownership.d.ts +10 -11
  253. package/dist/src/utils/ownership.js +55 -112
  254. package/dist/src/utils/ownership.js.map +1 -1
  255. package/dist/src/utils/path-catalog-provider.d.ts +1 -1
  256. package/dist/src/utils/path-catalog-provider.js +52 -65
  257. package/dist/src/utils/path-catalog-provider.js.map +1 -1
  258. package/dist/src/utils/paths.d.ts +0 -1
  259. package/dist/src/utils/paths.js +0 -1
  260. package/dist/src/utils/paths.js.map +1 -1
  261. package/dist/src/utils/plugin-config-write.js +18 -40
  262. package/dist/src/utils/plugin-config-write.js.map +1 -1
  263. package/dist/src/utils/plugin-config.d.ts +1 -12
  264. package/dist/src/utils/plugin-config.js +107 -226
  265. package/dist/src/utils/plugin-config.js.map +1 -1
  266. package/dist/src/utils/plugin-intent-state.d.ts +39 -0
  267. package/dist/src/utils/plugin-intent-state.js +325 -0
  268. package/dist/src/utils/plugin-intent-state.js.map +1 -0
  269. package/dist/src/utils/plugin-scripts.d.ts +1 -1
  270. package/dist/src/utils/plugin-scripts.js +1 -1
  271. package/dist/src/utils/plugin-scripts.js.map +1 -1
  272. package/dist/src/utils/state-paths.js +7 -2
  273. package/dist/src/utils/state-paths.js.map +1 -1
  274. package/dist/src/utils/target-eligibility.d.ts +8 -2
  275. package/dist/src/utils/target-eligibility.js +9 -5
  276. package/dist/src/utils/target-eligibility.js.map +1 -1
  277. package/package.json +6 -4
  278. package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
  279. package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
  280. package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
  281. package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
  282. package/dist/scripts/aw-skill-eval-engine.js +0 -31
  283. package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
  284. package/dist/scripts/codex-eval-app-server.d.ts +0 -89
  285. package/dist/scripts/codex-eval-app-server.js +0 -1228
  286. package/dist/scripts/codex-eval-app-server.js.map +0 -1
  287. package/dist/scripts/codex-eval-isolation.d.ts +0 -61
  288. package/dist/scripts/codex-eval-isolation.js +0 -318
  289. package/dist/scripts/codex-eval-isolation.js.map +0 -1
  290. package/dist/scripts/codex-eval-process-management.d.ts +0 -8
  291. package/dist/scripts/codex-eval-process-management.js +0 -69
  292. package/dist/scripts/codex-eval-process-management.js.map +0 -1
  293. package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
  294. package/dist/scripts/codex-eval-process-tree.js +0 -803
  295. package/dist/scripts/codex-eval-process-tree.js.map +0 -1
  296. package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
  297. package/dist/scripts/codex-eval-runtime-config.js +0 -843
  298. package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
  299. package/dist/scripts/codex-trigger-eval.d.ts +0 -84
  300. package/dist/scripts/codex-trigger-eval.js +0 -968
  301. package/dist/scripts/codex-trigger-eval.js.map +0 -1
  302. package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
  303. package/dist/scripts/eval-plugin-skills-audited.js +0 -261
  304. package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
  305. package/dist/scripts/eval-plugin-skills.d.ts +0 -45
  306. package/dist/scripts/eval-plugin-skills.js +0 -1586
  307. package/dist/scripts/eval-plugin-skills.js.map +0 -1
  308. package/dist/scripts/eval-run-layout.d.ts +0 -17
  309. package/dist/scripts/eval-run-layout.js +0 -26
  310. package/dist/scripts/eval-run-layout.js.map +0 -1
  311. package/dist/scripts/plugin-eval-contract.d.ts +0 -185
  312. package/dist/scripts/plugin-eval-contract.js +0 -695
  313. package/dist/scripts/plugin-eval-contract.js.map +0 -1
  314. package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
  315. package/dist/scripts/plugin-eval-materializer.js.map +0 -1
  316. package/dist/scripts/skill-reporting.d.ts +0 -212
  317. package/dist/scripts/skill-reporting.js +0 -922
  318. package/dist/scripts/skill-reporting.js.map +0 -1
  319. package/dist/src/commands/status-v4.d.ts +0 -123
  320. package/dist/src/commands/status-v4.js +0 -905
  321. package/dist/src/commands/status-v4.js.map +0 -1
  322. package/dist/src/commands/status.d.ts +0 -93
  323. package/dist/src/commands/status.js +0 -442
  324. package/dist/src/commands/status.js.map +0 -1
  325. package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
  326. package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
  327. package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
  328. package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
  329. package/dist/src/utils/catalog-manifest-v3.js +0 -3
  330. package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
  331. package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
  332. package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
  333. package/dist/src/utils/catalog-source-cache.d.ts +0 -62
  334. package/dist/src/utils/catalog-source-cache.js +0 -296
  335. package/dist/src/utils/catalog-source-cache.js.map +0 -1
  336. package/dist/src/utils/codex-project-surface.d.ts +0 -3
  337. package/dist/src/utils/codex-project-surface.js +0 -49
  338. package/dist/src/utils/codex-project-surface.js.map +0 -1
  339. package/dist/src/utils/plugin-release.d.ts +0 -2
  340. package/dist/src/utils/plugin-release.js +0 -2
  341. package/dist/src/utils/plugin-release.js.map +0 -1
@@ -1,905 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { hasCodexProjectManagedArtifacts } from '../utils/codex-project-surface.js';
4
- import { catalogSourceErrorCode, sanitizeCatalogSourceError, } from '../utils/catalog-public-error.js';
5
- import { calculateCatalogSourceIdentity } from '../utils/catalog-source-identity.js';
6
- import { canonicalMarketplaceRegistrationNames, inventoryCatalogSourceReferences, inventoryLegacyOwnerReferences, } from '../utils/catalog-source-references.js';
7
- import { readCatalogSourcesConfigSnapshot, resolveCatalogSourceRef } from '../utils/catalog-sources.js';
8
- import { formatPluginId, parsePluginId, planPluginSelectorSourceIds, withResolvedMultiSourceCatalog, } from '../utils/multi-source-catalog.js';
9
- import { assertStrictSemVer, compareStrictSemVer, readPluginManifest, tryParseStrictSemVer, } from '../utils/manifest.js';
10
- import { resolveCliPackageRoot } from '../utils/paths.js';
11
- import { supportsPlatform } from '../utils/platform-support.js';
12
- import { parsePlatformValue, parseScopeValue } from './options.js';
13
- import { inspectRebuildTarget } from './rebuild-integration.js';
14
- import { createNoopReporter } from '../output/reporter.js';
15
- import { createNoopDebugLogger } from '../output/debug-log.js';
16
- import { getDefaultNativeCliRunner } from '../utils/native-cli.js';
17
- import { resolveAwHome } from '../utils/paths.js';
18
- import { codexProjectConfigAliasesUserHome, createProjectLocationKey, getClaudeHome, getCodexHome, resolveCanonicalRepoProjectKey, } from '../utils/state-paths.js';
19
- import { resolveEffectivePluginConfig } from '../utils/plugin-config.js';
20
- let dependencyInspectionHookForTests;
21
- export function setStatusDependencyInspectionHookForTests(hook) {
22
- dependencyInspectionHookForTests = hook;
23
- }
24
- function projectStateInventoryError(error, env, cwd) {
25
- const sanitized = sanitizeCatalogSourceError(error, env, [
26
- getCodexHome(env),
27
- getClaudeHome(env),
28
- path.resolve(cwd),
29
- ]);
30
- const native = /(?:Codex|Claude|config\.toml|settings|installed_plugins)/iu.test(sanitized.message);
31
- const code = native ? 'nativeStateUnreadable' : 'stateInventoryFailed';
32
- return { code, message: `${code}: ${sanitized.message}`, relevance: { global: true } };
33
- }
34
- function inventoryErrorMatchesSelection(options) {
35
- const relevance = options.error.relevance;
36
- if (relevance.global)
37
- return true;
38
- if (relevance.projectLocationKey
39
- && relevance.projectLocationKey !== options.currentProjectLocationKey)
40
- return false;
41
- if (options.platformExplicit && relevance.platform
42
- && !options.platforms.includes(relevance.platform))
43
- return false;
44
- if (options.scopeExplicit && relevance.scope
45
- && !options.scopes.includes(relevance.scope))
46
- return false;
47
- if (options.selectors.length === 0 || (!relevance.sourceId && !relevance.pluginName))
48
- return true;
49
- return options.selectors.some((selector) => (!relevance.pluginName || selector.parsed.pluginName === relevance.pluginName)
50
- && (!relevance.sourceId
51
- || selector.parsed.sourceId === undefined
52
- || selector.parsed.sourceId === relevance.sourceId));
53
- }
54
- function projectTargetError(error, env, cwd) {
55
- const sanitized = sanitizeCatalogSourceError(new Error(error.message), env, [
56
- getCodexHome(env),
57
- getClaudeHome(env),
58
- path.resolve(cwd),
59
- ]);
60
- return { code: error.code, message: sanitized.message };
61
- }
62
- function sourceRequestedRef(source, cliVersion) {
63
- return source.type === 'git' ? resolveCatalogSourceRef(source.refPolicy, cliVersion) : 'path';
64
- }
65
- function selectedPlatforms(value) {
66
- const selection = value === undefined ? 'both' : parsePlatformValue(value);
67
- return selection === 'both' ? ['codex', 'claude'] : [selection];
68
- }
69
- function selectedScopes(value) {
70
- return value === undefined ? ['user', 'project'] : [parseScopeValue(value)];
71
- }
72
- function projectedLiveState(options) {
73
- if (options.inspection.state === 'error'
74
- || options.inspection.components.some((entry) => entry.state === 'error'))
75
- return 'error';
76
- if (options.inspection.components.length === 0
77
- || options.inspection.components.every((entry) => entry.state === 'absent'))
78
- return 'absent';
79
- if (options.inspection.components.some((entry) => entry.state === 'partial'))
80
- return 'partial';
81
- const required = new Set(options.required);
82
- const optional = new Set(options.optional);
83
- if (options.inspection.components.some((entry) => entry.state === 'present' && !required.has(entry.component) && !optional.has(entry.component))) {
84
- return 'partial';
85
- }
86
- if (!options.required.every((component) => options.inspection.components.some((entry) => entry.component === component && entry.state === 'present')))
87
- return 'partial';
88
- if (options.required.length > 0)
89
- return 'present';
90
- return options.optional.some((component) => options.inspection.components.some((entry) => entry.component === component && entry.state === 'present')) ? 'present' : 'absent';
91
- }
92
- export function projectTargetRevision(availableVersion, installedVersion) {
93
- if (!availableVersion || !installedVersion
94
- || !tryParseStrictSemVer(availableVersion)
95
- || !tryParseStrictSemVer(installedVersion)) {
96
- return {
97
- state: 'unknown',
98
- ...(availableVersion ? { availableVersion } : {}),
99
- ...(installedVersion ? { installedVersion } : {}),
100
- };
101
- }
102
- const relation = compareStrictSemVer(installedVersion, availableVersion);
103
- if (relation === 0)
104
- return { state: 'current', availableVersion, installedVersion };
105
- if (relation < 0)
106
- return { state: 'upgradeAvailable', availableVersion, installedVersion };
107
- return { state: 'unknown', availableVersion, installedVersion };
108
- }
109
- function renderStatusV4(payload, verbose) {
110
- const lines = [`Catalog sources: ${payload.catalog.sources.length}`];
111
- for (const source of payload.catalog.sources) {
112
- lines.push(`${source.primary ? '*' : '-'} ${source.id}: ${source.error ?? source.freshness ?? 'unavailable'}`);
113
- }
114
- for (const target of payload.targets) {
115
- const errors = target.errors.length > 0
116
- ? ` [${target.errors.map((error) => `${error.code}: ${error.message}`).join('; ')}]`
117
- : '';
118
- lines.push(`${target.pluginId} ${target.platform}/${target.scope}: ${target.state}${errors}`);
119
- if (verbose) {
120
- for (const component of target.components) {
121
- const error = component.error
122
- ? ` [${component.error.code}: ${component.error.message}]`
123
- : '';
124
- lines.push(` component ${component.key}: ${component.state}${error}`);
125
- }
126
- }
127
- }
128
- for (const error of payload.errors)
129
- lines.push(`Error: ${error.message}`);
130
- return lines.join('\n');
131
- }
132
- export async function statusCommandV4(options) {
133
- const env = options.env ?? process.env;
134
- const dependencyPluginCache = new Map();
135
- const dependencyInspectionCache = new Map();
136
- const cliVersion = options.cliVersion ?? assertStrictSemVer(JSON.parse(fs.readFileSync(path.join(resolveCliPackageRoot(), 'package.json'), 'utf8')).version, 'packages/cli/package.json version');
137
- const snapshot = await readCatalogSourcesConfigSnapshot(env);
138
- const currentProjectKey = await resolveCanonicalRepoProjectKey(options.cwd);
139
- const currentProjectLocationKey = createProjectLocationKey(currentProjectKey);
140
- const codexScopePathsAlias = codexProjectConfigAliasesUserHome(options.cwd, env);
141
- const inventoryErrors = [];
142
- const ownerInventory = await inventoryCatalogSourceReferences({ cwd: options.cwd, env }).catch(async (error) => {
143
- inventoryErrors.push(projectStateInventoryError(error, env, options.cwd));
144
- return inventoryLegacyOwnerReferences({ cwd: options.cwd, env }).catch((fallbackError) => {
145
- inventoryErrors.push(projectStateInventoryError(fallbackError, env, options.cwd));
146
- return { inventorySchemaVersion: 1, references: [], errors: [] };
147
- });
148
- });
149
- for (const error of ownerInventory.errors ?? []) {
150
- const code = error.kind === 'nativeStateRead' ? 'nativeStateUnreadable' : 'stateInventoryFailed';
151
- inventoryErrors.push({
152
- code,
153
- message: `${code}: ${error.kind}@${error.location}: ${error.message}`,
154
- relevance: error.relevance,
155
- });
156
- }
157
- const hasCurrentCodexProjectOwner = (sourceId, pluginName) => ownerInventory.references.some((reference) => reference.kind === 'namespacedOwner'
158
- && reference.sourceId === sourceId
159
- && reference.pluginName === pluginName
160
- && reference.platform === 'codex'
161
- && reference.scope === 'project'
162
- && reference.projectKey === currentProjectKey);
163
- const configured = new Map(snapshot.config.sources.map((source) => [source.id, source]));
164
- const requested = options.plugins ?? [];
165
- const platforms = selectedPlatforms(options.platform);
166
- const scopes = selectedScopes(options.scope);
167
- const selectorErrors = [];
168
- const parsedSelectors = [];
169
- const plannedSelectors = [];
170
- const liveOnlySelectors = [];
171
- for (const selector of requested) {
172
- let parsed;
173
- try {
174
- parsed = parsePluginId(selector);
175
- }
176
- catch (error) {
177
- selectorErrors.push({
178
- code: 'invalidPluginSelector',
179
- message: error instanceof Error ? error.message : String(error),
180
- });
181
- continue;
182
- }
183
- parsedSelectors.push({ raw: selector, parsed });
184
- if (parsed.sourceId !== undefined && !configured.has(parsed.sourceId)) {
185
- const hasLiveReference = ownerInventory.references.some((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
186
- && reference.sourceId === parsed.sourceId
187
- && reference.pluginName === parsed.pluginName
188
- && platforms.includes(reference.platform)
189
- && scopes.includes(reference.scope)
190
- && (reference.scope !== 'project' || reference.projectKey === currentProjectKey));
191
- if (hasLiveReference) {
192
- liveOnlySelectors.push({ raw: selector, parsed });
193
- }
194
- else if (!inventoryErrors.some((error) => inventoryErrorMatchesSelection({
195
- error,
196
- selectors: [{ raw: selector, parsed }],
197
- platformExplicit: options.platform !== undefined,
198
- scopeExplicit: options.scope !== undefined,
199
- platforms,
200
- scopes,
201
- currentProjectLocationKey,
202
- }))) {
203
- selectorErrors.push({
204
- code: 'pluginNotFound',
205
- message: `Plugin "${selector}" was not found because catalog source "${parsed.sourceId}" is not configured.`,
206
- });
207
- }
208
- continue;
209
- }
210
- plannedSelectors.push({ raw: selector, parsed });
211
- }
212
- const selectedInventoryErrors = inventoryErrors.filter((error) => inventoryErrorMatchesSelection({
213
- error,
214
- selectors: parsedSelectors,
215
- platformExplicit: options.platform !== undefined,
216
- scopeExplicit: options.scope !== undefined,
217
- platforms,
218
- scopes,
219
- currentProjectLocationKey,
220
- }));
221
- const plannedSourceIds = requested.length === 0
222
- ? undefined
223
- : planPluginSelectorSourceIds(plannedSelectors.map((selector) => selector.parsed));
224
- const selectedConfiguredSources = plannedSourceIds === undefined
225
- ? snapshot.config.sources
226
- : plannedSourceIds.map((sourceId) => configured.get(sourceId));
227
- const identityEntries = await Promise.all(selectedConfiguredSources.map(async (source) => {
228
- try {
229
- return [source.id, { identity: await calculateCatalogSourceIdentity(source) }];
230
- }
231
- catch (error) {
232
- const sanitized = sanitizeCatalogSourceError(error, env);
233
- return [source.id, {
234
- error: sanitized.message,
235
- }];
236
- }
237
- }));
238
- const identities = new Map(identityEntries);
239
- const catalog = await withResolvedMultiSourceCatalog({
240
- cliVersion,
241
- freshnessPolicy: 'cacheFirst',
242
- configSnapshot: snapshot,
243
- ...(plannedSourceIds === undefined ? {} : { sourceIds: plannedSourceIds }),
244
- env,
245
- consume: async (resolution) => ({
246
- primarySourceId: resolution.primarySourceId,
247
- configDigest: resolution.configDigest,
248
- compositeDigest: resolution.compositeDigest,
249
- sources: await Promise.all(resolution.sources.map(async (item) => {
250
- const source = configured.get(item.sourceId);
251
- const identity = identities.get(item.sourceId);
252
- const base = {
253
- id: item.sourceId,
254
- identity: identity.identity ?? 'unavailable',
255
- type: source.type,
256
- primary: source.primary,
257
- requestedRef: item.resolution?.requestedRef ?? sourceRequestedRef(source, cliVersion),
258
- };
259
- if (identity.error || item.error) {
260
- const error = item.error ?? new Error(identity.error);
261
- return {
262
- ...base,
263
- error: [identity.error, item.error?.message].filter(Boolean).join('; '),
264
- errorCode: catalogSourceErrorCode(error),
265
- };
266
- }
267
- try {
268
- const plugins = await Promise.all(item.resolution.manifest.entries.map(async (entry) => {
269
- const plugin = await readPluginManifest(path.join(item.resolution.rootDir, 'plugins', entry.name), { mode: 'bundle' });
270
- const claude = supportsPlatform(plugin.manifest, 'claude');
271
- const codex = supportsPlatform(plugin.manifest, 'codex');
272
- plugin.sourceId = item.resolution.sourceId;
273
- plugin.sourceIdentity = item.resolution.sourceIdentity;
274
- plugin.pluginId = formatPluginId({ sourceId: item.resolution.sourceId, pluginName: entry.name });
275
- let effectiveConfig;
276
- let configDiagnostic;
277
- if (plugin.manifest.config?.schema) {
278
- try {
279
- effectiveConfig = await resolveEffectivePluginConfig({
280
- sourceId: plugin.sourceId,
281
- sourceIdentity: plugin.sourceIdentity,
282
- pluginName: plugin.manifest.name,
283
- manifest: plugin.manifest,
284
- cwd: options.cwd,
285
- env,
286
- });
287
- }
288
- catch {
289
- configDiagnostic = {
290
- code: 'configReadFailed',
291
- message: '插件设置当前不可读。未读取或显示设置值。',
292
- };
293
- }
294
- }
295
- const states = {};
296
- const defaultMarketplaceName = item.resolution.sourceId === resolution.primarySourceId
297
- ? 'aw'
298
- : `aw-${item.resolution.sourceId}`;
299
- const marketplaceNameFor = (pluginName, platform, scope) => {
300
- const liveName = ownerInventory.references.find((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
301
- && reference.sourceId === item.resolution.sourceId
302
- && reference.sourceIdentity === item.resolution.sourceIdentity
303
- && reference.pluginName === pluginName
304
- && reference.platform === platform
305
- && reference.scope === scope
306
- && (scope === 'user' || reference.projectKey === currentProjectKey)
307
- && reference.marketplaceName)?.marketplaceName;
308
- if (liveName)
309
- return liveName;
310
- const registeredNames = canonicalMarketplaceRegistrationNames(ownerInventory.references, item.resolution.sourceId);
311
- if (registeredNames.length > 1) {
312
- throw new Error('marketplaceIdentityUnavailable: Multiple canonical native marketplace registrations match the source.');
313
- }
314
- return registeredNames[0] ?? defaultMarketplaceName;
315
- };
316
- const marketplaceRoot = path.join(resolveAwHome(env), 'marketplaces', item.resolution.sourceId);
317
- for (const platform of ['codex', 'claude']) {
318
- states[platform] = {};
319
- for (const scope of ['user', 'project']) {
320
- if (platform === 'codex'
321
- && scope === 'project'
322
- && codexScopePathsAlias
323
- && !hasCurrentCodexProjectOwner(item.resolution.sourceId, entry.name))
324
- continue;
325
- const supported = platform === 'claude'
326
- ? claude
327
- : codex && (scope === 'user' || hasCodexProjectManagedArtifacts(plugin));
328
- if (!supported)
329
- continue;
330
- const changedOwner = ownerInventory.references.find((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
331
- && reference.sourceId === item.resolution.sourceId
332
- && reference.pluginName === entry.name
333
- && reference.platform === platform
334
- && reference.scope === scope
335
- && (scope === 'user' || reference.projectKey === currentProjectKey)
336
- && reference.sourceIdentity
337
- && reference.sourceIdentity !== item.resolution.sourceIdentity);
338
- if (changedOwner) {
339
- states[platform][scope] = {
340
- state: 'error',
341
- components: [],
342
- errors: [{
343
- code: 'sourceChanged',
344
- message: `sourceChanged: owner at ${changedOwner.location} has a different source identity.`,
345
- }],
346
- };
347
- continue;
348
- }
349
- try {
350
- const marketplaceName = marketplaceNameFor(entry.name, platform, scope);
351
- const inspected = await inspectRebuildTarget({
352
- sourceId: item.resolution.sourceId,
353
- sourceIdentity: item.resolution.sourceIdentity,
354
- pluginId: plugin.pluginId,
355
- marketplaceName,
356
- marketplaceRoot,
357
- plugin,
358
- platform,
359
- scope,
360
- cwd: options.cwd,
361
- catalog: {
362
- rootDir: item.resolution.rootDir,
363
- source: 'local',
364
- },
365
- context: {
366
- env,
367
- nativeCliRunner: getDefaultNativeCliRunner(),
368
- reporter: createNoopReporter(),
369
- debugLogger: createNoopDebugLogger(),
370
- },
371
- });
372
- const liveState = projectedLiveState({
373
- inspection: inspected.inspection,
374
- required: inspected.target.desiredOwnedComponents ?? inspected.target.ownedComponents,
375
- optional: inspected.target.optionalOwnedComponents ?? [],
376
- });
377
- const dependencyErrors = [];
378
- const directDependencies = plugin.manifest.dependencies ?? [];
379
- if (directDependencies.length > 0
380
- && (liveState === 'present' || liveState === 'partial')) {
381
- for (const dependencyName of directDependencies) {
382
- const dependencyId = formatPluginId({
383
- sourceId: item.resolution.sourceId,
384
- pluginName: dependencyName,
385
- });
386
- if (!item.resolution.manifest.entries.some((candidate) => candidate.name === dependencyName)) {
387
- dependencyErrors.push({
388
- code: 'dependencyMissing',
389
- message: `dependencyMissing: ${dependencyId} is not available in the current source snapshot.`,
390
- });
391
- continue;
392
- }
393
- const pluginCacheKey = [item.resolution.sourceIdentity, dependencyId].join('\0');
394
- let dependencyPluginPromise = dependencyPluginCache.get(pluginCacheKey);
395
- if (!dependencyPluginPromise) {
396
- dependencyPluginPromise = readPluginManifest(path.join(item.resolution.rootDir, 'plugins', dependencyName), { mode: 'bundle' }).then((dependencyPlugin) => {
397
- dependencyPlugin.sourceId = item.resolution.sourceId;
398
- dependencyPlugin.sourceIdentity = item.resolution.sourceIdentity;
399
- dependencyPlugin.pluginId = dependencyId;
400
- return dependencyPlugin;
401
- });
402
- dependencyPluginCache.set(pluginCacheKey, dependencyPluginPromise);
403
- }
404
- const placements = scope === 'project' ? ['project', 'user'] : ['user'];
405
- let dependencyState = 'absent';
406
- for (const dependencyScope of placements) {
407
- const inspectionCacheKey = [
408
- item.resolution.sourceIdentity,
409
- dependencyId,
410
- platform,
411
- dependencyScope,
412
- dependencyScope === 'project' ? currentProjectKey : '',
413
- ].join('\0');
414
- let dependencyInspection = dependencyInspectionCache.get(inspectionCacheKey);
415
- if (!dependencyInspection) {
416
- dependencyInspection = dependencyPluginPromise.then(async (dependencyPlugin) => {
417
- dependencyInspectionHookForTests?.();
418
- const dependencyMarketplaceName = marketplaceNameFor(dependencyName, platform, dependencyScope);
419
- const dependencyInspected = await inspectRebuildTarget({
420
- sourceId: item.resolution.sourceId,
421
- sourceIdentity: item.resolution.sourceIdentity,
422
- pluginId: dependencyId,
423
- marketplaceName: dependencyMarketplaceName,
424
- marketplaceRoot,
425
- plugin: dependencyPlugin,
426
- platform,
427
- scope: dependencyScope,
428
- cwd: options.cwd,
429
- catalog: { rootDir: item.resolution.rootDir, source: 'local' },
430
- context: {
431
- env,
432
- nativeCliRunner: getDefaultNativeCliRunner(),
433
- reporter: createNoopReporter(),
434
- debugLogger: createNoopDebugLogger(),
435
- },
436
- });
437
- return projectedLiveState({
438
- inspection: dependencyInspected.inspection,
439
- required: dependencyInspected.target.desiredOwnedComponents
440
- ?? dependencyInspected.target.ownedComponents,
441
- optional: dependencyInspected.target.optionalOwnedComponents ?? [],
442
- });
443
- });
444
- dependencyInspectionCache.set(inspectionCacheKey, dependencyInspection);
445
- }
446
- const candidateState = await dependencyInspection;
447
- if (candidateState === 'present') {
448
- dependencyState = 'present';
449
- break;
450
- }
451
- if (candidateState !== 'absent')
452
- dependencyState = candidateState;
453
- }
454
- if (dependencyState === 'absent') {
455
- dependencyErrors.push({
456
- code: 'dependencyMissing',
457
- message: `dependencyMissing: ${dependencyId} is absent from its required live placement.`,
458
- });
459
- }
460
- else if (dependencyState !== 'present') {
461
- dependencyErrors.push({
462
- code: 'dependencyNotReady',
463
- message: `dependencyNotReady: ${dependencyId} is not ready at its required live placement.`,
464
- });
465
- }
466
- }
467
- }
468
- states[platform][scope] = {
469
- state: dependencyErrors.length > 0 && liveState === 'present' ? 'partial' : liveState,
470
- errors: [...inspected.inspection.errors.map((error) => ({
471
- code: 'componentInspectionFailed',
472
- message: `${error.label}: ${error.message}`,
473
- })), ...dependencyErrors],
474
- components: options.verbose === true
475
- ? inspected.inspection.components.map((component) => {
476
- const projectedError = component.diagnostic
477
- ? projectTargetError({
478
- code: 'componentInspectionFailed',
479
- message: component.diagnostic,
480
- }, env, options.cwd)
481
- : undefined;
482
- return {
483
- key: component.component.identity.artifactKey,
484
- state: component.state,
485
- ...(projectedError ? { error: projectedError } : {}),
486
- };
487
- })
488
- : [],
489
- ...(inspected.installedVersion
490
- ? { installedVersion: inspected.installedVersion }
491
- : {}),
492
- };
493
- }
494
- catch (error) {
495
- const message = error instanceof Error ? error.message : String(error);
496
- const code = message.split(':', 1)[0] || 'targetInspectionFailed';
497
- states[platform][scope] = {
498
- state: 'error',
499
- components: [],
500
- errors: [{ code, message }],
501
- };
502
- }
503
- }
504
- }
505
- return {
506
- name: entry.name,
507
- version: entry.version,
508
- displayName: plugin.manifest.interface?.displayName ?? entry.name,
509
- shortDescription: plugin.manifest.interface?.shortDescription
510
- ?? plugin.manifest.description,
511
- description: plugin.manifest.description,
512
- ...(plugin.manifest.config?.schema
513
- ? { configSchema: plugin.manifest.config.schema }
514
- : {}),
515
- ...(effectiveConfig?.issues.length
516
- ? {
517
- configIssues: effectiveConfig.issues.map((issue) => ({
518
- type: issue.type,
519
- key: issue.key,
520
- title: plugin.manifest.config.schema[issue.key]?.title ?? issue.key,
521
- source: issue.source ?? 'missing',
522
- })),
523
- }
524
- : {}),
525
- ...(configDiagnostic ? { configDiagnostic } : {}),
526
- targets: {
527
- claude: { user: claude, project: claude },
528
- codex: {
529
- user: codex,
530
- project: codex && hasCodexProjectManagedArtifacts(plugin),
531
- },
532
- },
533
- states,
534
- dependencies: plugin.manifest.dependencies ?? [],
535
- };
536
- }));
537
- return {
538
- ...base,
539
- resolvedCommit: item.resolution.resolvedCommit,
540
- catalogVersion: item.resolution.manifest.catalogVersion,
541
- channel: item.resolution.manifest.channel,
542
- freshness: item.resolution.source,
543
- plugins,
544
- };
545
- }
546
- catch (error) {
547
- const sanitized = sanitizeCatalogSourceError(error, env);
548
- return {
549
- ...base,
550
- error: sanitized.message,
551
- errorCode: catalogSourceErrorCode(sanitized),
552
- };
553
- }
554
- })),
555
- }),
556
- });
557
- const available = catalog.sources.flatMap((source) => 'plugins' in source
558
- ? source.plugins.map((plugin) => ({ ...plugin, source }))
559
- : []);
560
- const failedSourceIds = new Set(catalog.sources.filter((source) => 'error' in source).map((source) => source.id));
561
- const selectedById = new Map();
562
- if (requested.length === 0) {
563
- for (const entry of available) {
564
- selectedById.set(formatPluginId({ sourceId: entry.source.id, pluginName: entry.name }), entry);
565
- }
566
- }
567
- else {
568
- for (const selector of plannedSelectors) {
569
- if (selector.parsed.sourceId === undefined && failedSourceIds.size > 0) {
570
- selectorErrors.push({
571
- code: 'catalogSourceUnavailable',
572
- message: `Cannot resolve bare plugin selector "${selector.raw}" while catalog sources are unavailable: ${[...failedSourceIds].join(', ')}.`,
573
- });
574
- continue;
575
- }
576
- if (selector.parsed.sourceId !== undefined && failedSourceIds.has(selector.parsed.sourceId)) {
577
- selectorErrors.push({
578
- code: 'catalogSourceUnavailable',
579
- message: `Cannot resolve plugin selector "${selector.raw}" because catalog source "${selector.parsed.sourceId}" is unavailable.`,
580
- });
581
- continue;
582
- }
583
- const matches = available.filter((entry) => entry.name === selector.parsed.pluginName
584
- && (selector.parsed.sourceId === undefined || entry.source.id === selector.parsed.sourceId));
585
- if (matches.length === 0) {
586
- const selectorHasInventoryError = selectedInventoryErrors.some((error) => inventoryErrorMatchesSelection({
587
- error,
588
- selectors: [selector],
589
- platformExplicit: options.platform !== undefined,
590
- scopeExplicit: options.scope !== undefined,
591
- platforms,
592
- scopes,
593
- currentProjectLocationKey,
594
- }));
595
- if (!selectorHasInventoryError) {
596
- selectorErrors.push({
597
- code: 'pluginNotFound',
598
- message: `Plugin "${selector.raw}" was not found in the selected catalog source set.`,
599
- });
600
- }
601
- continue;
602
- }
603
- if (selector.parsed.sourceId === undefined && matches.length > 1) {
604
- selectorErrors.push({
605
- code: 'ambiguousPlugin',
606
- message: `Plugin "${selector.raw}" is ambiguous across sources: ${matches.map((entry) => entry.source.id).join(', ')}.`,
607
- });
608
- continue;
609
- }
610
- for (const entry of matches) {
611
- selectedById.set(formatPluginId({ sourceId: entry.source.id, pluginName: entry.name }), entry);
612
- }
613
- }
614
- }
615
- const selected = [...selectedById.values()];
616
- const explicitTargetFilter = requested.length > 0
617
- && (options.platform !== undefined || options.scope !== undefined);
618
- const targets = selected.flatMap((entry) => platforms.flatMap((platform) => scopes.flatMap((scope) => {
619
- const target = {
620
- pluginName: entry.name,
621
- sourceId: entry.source.id,
622
- sourceIdentity: entry.source.identity,
623
- pluginId: formatPluginId({ sourceId: entry.source.id, pluginName: entry.name }),
624
- version: entry.version,
625
- platform,
626
- scope,
627
- cwd: path.resolve(options.cwd),
628
- components: [],
629
- };
630
- if (platform === 'codex'
631
- && scope === 'project'
632
- && codexScopePathsAlias
633
- && !hasCurrentCodexProjectOwner(entry.source.id, entry.name)) {
634
- if (options.scope !== 'project')
635
- return [];
636
- return [{
637
- ...target,
638
- state: 'error',
639
- errors: [{
640
- code: 'codexScopePathAlias',
641
- message: 'codexScopePathAlias: Codex project config resolves to the user config directory. Run this command from an actual project directory.',
642
- }],
643
- }];
644
- }
645
- if (entry.targets[platform][scope]) {
646
- const live = entry.states[platform]?.[scope];
647
- const dependencyIssueCount = (live?.errors ?? []).filter((error) => error.code.startsWith('dependency') || error.code === 'sourceChanged').length;
648
- return [{
649
- ...target,
650
- state: live?.state ?? 'error',
651
- components: live?.components ?? [],
652
- errors: live?.errors ?? [{
653
- code: 'targetInspectionFailed',
654
- message: `No live inspection result exists for ${entry.source.id}/${entry.name}.`,
655
- }],
656
- ...(entry.dependencies.length > 0 || dependencyIssueCount > 0 ? {
657
- dependency: {
658
- directCount: entry.dependencies.length,
659
- issueCount: dependencyIssueCount,
660
- },
661
- } : {}),
662
- }];
663
- }
664
- const unsupportedLiveReference = ownerInventory.references.find((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
665
- && reference.sourceId === entry.source.id
666
- && reference.pluginName === entry.name
667
- && reference.platform === platform
668
- && reference.scope === scope
669
- && (scope === 'user' || reference.projectKey === currentProjectKey));
670
- if (unsupportedLiveReference) {
671
- const sourceChanged = Boolean(unsupportedLiveReference.sourceIdentity
672
- && unsupportedLiveReference.sourceIdentity !== entry.source.identity);
673
- return [{
674
- ...target,
675
- state: 'error',
676
- errors: [{
677
- code: sourceChanged ? 'sourceChanged' : 'noLongerSupported',
678
- message: sourceChanged
679
- ? `sourceChanged: live state for ${target.pluginId} has a different source identity.`
680
- : `noLongerSupported: ${target.pluginId} has live state for ${platform}/${scope}, but the current bundle no longer supports that target.`,
681
- }],
682
- }];
683
- }
684
- if (!explicitTargetFilter)
685
- return [];
686
- return [{
687
- ...target,
688
- state: 'error',
689
- errors: [{
690
- code: 'unsupportedTarget',
691
- message: `${entry.source.id}/${entry.name} does not support ${platform}/${scope}.`,
692
- }],
693
- }];
694
- })));
695
- const referenceSelectors = [...plannedSelectors, ...liveOnlySelectors];
696
- const referenceSelected = (reference) => (reference.pluginName !== undefined
697
- && reference.platform !== undefined
698
- && reference.scope !== undefined
699
- && platforms.includes(reference.platform)
700
- && scopes.includes(reference.scope)
701
- && (reference.scope !== 'project' || reference.projectKey === currentProjectKey)
702
- && (requested.length === 0 || referenceSelectors.some((selector) => selector.parsed.pluginName === reference.pluginName
703
- && (selector.parsed.sourceId === undefined || selector.parsed.sourceId === reference.sourceId))));
704
- const legacyOwners = ownerInventory.references.filter((reference) => (reference.kind === 'legacyOwner' || reference.kind === 'legacyMarketplace')
705
- && reference.pluginName !== undefined
706
- && reference.platform !== undefined
707
- && reference.scope !== undefined
708
- && platforms.includes(reference.platform)
709
- && scopes.includes(reference.scope)
710
- && (requested.length === 0 || plannedSelectors.some((selector) => selector.parsed.pluginName === reference.pluginName)));
711
- const missingSourceOwners = ownerInventory.references.filter((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
712
- && reference.sourceId
713
- && !configured.has(reference.sourceId)
714
- && referenceSelected(reference));
715
- const missingTargets = [...new Map(missingSourceOwners.flatMap((reference) => {
716
- if (!reference.sourceId || !reference.pluginName
717
- || (reference.platform !== 'codex' && reference.platform !== 'claude')
718
- || (reference.scope !== 'user' && reference.scope !== 'project'))
719
- return [];
720
- const pluginId = formatPluginId({ sourceId: reference.sourceId, pluginName: reference.pluginName });
721
- const target = {
722
- pluginName: reference.pluginName,
723
- sourceId: reference.sourceId,
724
- sourceIdentity: reference.sourceIdentity ?? 'unavailable',
725
- pluginId,
726
- platform: reference.platform,
727
- scope: reference.scope,
728
- cwd: path.resolve(options.cwd),
729
- state: 'error',
730
- components: [],
731
- errors: [{
732
- code: 'sourceMissing',
733
- message: `sourceMissing: catalog source "${reference.sourceId}" is not configured for ${pluginId}.`,
734
- }],
735
- };
736
- return [[`${pluginId}\0${reference.platform}\0${reference.scope}`, target]];
737
- })).values()];
738
- targets.push(...missingTargets);
739
- const unavailableSourceReferences = ownerInventory.references.filter((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
740
- && reference.sourceId
741
- && configured.has(reference.sourceId)
742
- && failedSourceIds.has(reference.sourceId)
743
- && referenceSelected(reference));
744
- const unavailableSourceTargets = [...new Map(unavailableSourceReferences.flatMap((reference) => {
745
- if (!reference.sourceId || !reference.pluginName
746
- || (reference.platform !== 'codex' && reference.platform !== 'claude')
747
- || (reference.scope !== 'user' && reference.scope !== 'project'))
748
- return [];
749
- const pluginId = formatPluginId({ sourceId: reference.sourceId, pluginName: reference.pluginName });
750
- const target = {
751
- pluginName: reference.pluginName,
752
- sourceId: reference.sourceId,
753
- sourceIdentity: reference.sourceIdentity ?? 'unavailable',
754
- pluginId,
755
- platform: reference.platform,
756
- scope: reference.scope,
757
- cwd: path.resolve(options.cwd),
758
- state: 'error',
759
- components: [],
760
- errors: [{
761
- code: 'catalogSourceUnavailable',
762
- message: `catalogSourceUnavailable: catalog source "${reference.sourceId}" is unavailable for ${pluginId}.`,
763
- }],
764
- };
765
- return [[`${pluginId}\0${reference.platform}\0${reference.scope}`, target]];
766
- })).values()];
767
- targets.push(...unavailableSourceTargets);
768
- const availablePluginIds = new Set(available.map((entry) => formatPluginId({ sourceId: entry.source.id, pluginName: entry.name })));
769
- const resolvedSourceIds = new Set(catalog.sources.flatMap((source) => 'plugins' in source ? [source.id] : []));
770
- const unavailableBundleReferences = ownerInventory.references.filter((reference) => (reference.kind === 'namespacedOwner' || reference.kind === 'namespacedMarketplace')
771
- && reference.sourceId
772
- && configured.has(reference.sourceId)
773
- && resolvedSourceIds.has(reference.sourceId)
774
- && reference.pluginName
775
- && referenceSelected(reference)
776
- && !availablePluginIds.has(formatPluginId({
777
- sourceId: reference.sourceId,
778
- pluginName: reference.pluginName,
779
- })));
780
- const unavailableBundleTargets = [...new Map(unavailableBundleReferences.flatMap((reference) => {
781
- if (!reference.sourceId || !reference.pluginName
782
- || (reference.platform !== 'codex' && reference.platform !== 'claude')
783
- || (reference.scope !== 'user' && reference.scope !== 'project'))
784
- return [];
785
- const pluginId = formatPluginId({ sourceId: reference.sourceId, pluginName: reference.pluginName });
786
- if (requested.length > 0 && !plannedSelectors.some((selector) => selector.parsed.pluginName === reference.pluginName
787
- && (selector.parsed.sourceId === undefined || selector.parsed.sourceId === reference.sourceId)))
788
- return [];
789
- const target = {
790
- pluginName: reference.pluginName,
791
- sourceId: reference.sourceId,
792
- sourceIdentity: reference.sourceIdentity ?? 'unavailable',
793
- pluginId,
794
- platform: reference.platform,
795
- scope: reference.scope,
796
- cwd: path.resolve(options.cwd),
797
- state: 'error',
798
- components: [],
799
- errors: [{
800
- code: 'bundleUnavailable',
801
- message: `bundleUnavailable: ${pluginId} has live state but is not present in the current source snapshot.`,
802
- }],
803
- };
804
- return [[`${pluginId}\0${reference.platform}\0${reference.scope}`, target]];
805
- })).values()];
806
- targets.push(...unavailableBundleTargets);
807
- const projectedInventoryErrors = [...new Map(selectedInventoryErrors.map((error) => [
808
- `${error.code}\0${error.message}`,
809
- { code: error.code, message: error.message },
810
- ])).values()];
811
- const errors = [
812
- ...projectedInventoryErrors,
813
- ...selectorErrors,
814
- ...legacyOwners.map((reference) => projectTargetError({
815
- code: 'legacyStateUnsupported',
816
- message: `legacyStateUnsupported: legacy live ${reference.kind} at ${reference.location}`,
817
- }, env, options.cwd)),
818
- ];
819
- const projectedTargets = targets.map((target) => ({
820
- ...target,
821
- errors: target.errors.map((error) => projectTargetError(error, env, options.cwd)),
822
- }));
823
- const selectedByPluginId = new Map(selected.map((entry) => [
824
- formatPluginId({ sourceId: entry.source.id, pluginName: entry.name }),
825
- entry,
826
- ]));
827
- const targetRevisions = projectedTargets.map((target) => {
828
- const entry = selectedByPluginId.get(target.pluginId);
829
- return {
830
- pluginId: target.pluginId,
831
- platform: target.platform,
832
- scope: target.scope,
833
- revision: projectTargetRevision(entry?.version, entry?.states[target.platform]?.[target.scope]?.installedVersion),
834
- };
835
- });
836
- const payload = {
837
- schemaVersion: 4,
838
- catalog: {
839
- primarySourceId: catalog.primarySourceId,
840
- configDigest: catalog.configDigest,
841
- compositeDigest: catalog.compositeDigest,
842
- sources: catalog.sources.map((source) => {
843
- if (!('plugins' in source))
844
- return source;
845
- const { plugins: _plugins, ...projected } = source;
846
- return projected;
847
- }),
848
- },
849
- filters: {
850
- plugins: requested,
851
- platform: options.platform === undefined ? 'both' : parsePlatformValue(options.platform),
852
- ...(options.scope === undefined ? {} : { scope: parseScopeValue(options.scope) }),
853
- cwd: path.resolve(options.cwd),
854
- },
855
- targets: projectedTargets,
856
- errors,
857
- };
858
- const hasErrors = payload.catalog.sources.some((source) => source.error !== undefined)
859
- || payload.errors.length > 0
860
- || payload.targets.some((target) => target.state === 'error');
861
- return {
862
- payload,
863
- output: options.json ? JSON.stringify(payload) : renderStatusV4(payload, options.verbose === true),
864
- hasErrors,
865
- targetRevisions,
866
- pluginSummaries: available.map((entry) => {
867
- const sourceEntries = available.filter((candidate) => candidate.source.id === entry.source.id);
868
- const byName = new Map(sourceEntries.map((candidate) => [candidate.name, candidate]));
869
- const transitive = new Set();
870
- const visit = (name) => {
871
- const candidate = byName.get(name);
872
- for (const dependency of candidate?.dependencies ?? []) {
873
- if (transitive.has(dependency))
874
- continue;
875
- transitive.add(dependency);
876
- visit(dependency);
877
- }
878
- };
879
- visit(entry.name);
880
- const dependencyIssueCount = targets.filter((target) => target.pluginId === formatPluginId({
881
- sourceId: entry.source.id,
882
- pluginName: entry.name,
883
- })).reduce((count, target) => count + target.errors.filter((error) => error.code.startsWith('dependency') || error.code === 'sourceChanged').length, 0);
884
- return {
885
- pluginName: entry.name,
886
- pluginId: formatPluginId({ sourceId: entry.source.id, pluginName: entry.name }),
887
- displayName: entry.displayName,
888
- description: entry.shortDescription,
889
- version: entry.version,
890
- supportedTargets: {
891
- codex: ['user', 'project'].filter((scope) => entry.targets.codex[scope]),
892
- claude: ['user', 'project'].filter((scope) => entry.targets.claude[scope]),
893
- },
894
- configFieldCount: Object.keys(entry.configSchema ?? {}).length,
895
- ...(entry.configSchema ? { configSchema: entry.configSchema } : {}),
896
- ...(entry.configIssues ? { configIssues: entry.configIssues } : {}),
897
- ...(entry.configDiagnostic ? { configDiagnostic: entry.configDiagnostic } : {}),
898
- dependencyDirectCount: entry.dependencies.length,
899
- dependencyTotalCount: transitive.size,
900
- dependencyIssueCount,
901
- };
902
- }),
903
- };
904
- }
905
- //# sourceMappingURL=status-v4.js.map