@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683

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 (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -29,6 +29,8 @@ export interface Suggestion {
29
29
  * human-readable `error` string, which changes freely.
30
30
  */
31
31
  export interface CLIError {
32
+ /** Version of the JSON envelope contract, as on the success envelope. */
33
+ apiVersion: number;
32
34
  error: string;
33
35
  code: ErrorCode;
34
36
  suggestions?: Suggestion[];
@@ -36,13 +38,15 @@ export interface CLIError {
36
38
 
37
39
  /** Returned by the fallback hook for commands without --json support. */
38
40
  export interface CLIUnsupportedError {
41
+ apiVersion: number;
39
42
  error: `JSON output is not supported for the '${string}' command`;
40
43
  code: ErrorCode;
41
44
  }
42
45
 
43
46
  /**
44
- * A success response envelope: a `type` discriminator, its `data` payload, and
45
- * an optional `meta` sidecar (emitted as a sibling of `data`, never merged in).
47
+ * A success response: a `type` discriminator, its `data` payload, and an
48
+ * optional `meta` sidecar (emitted as a sibling of `data`, never merged in).
49
+ * `--json` prints it with `apiVersion` added (see `parseResponse`).
46
50
  *
47
51
  * Structural by design — there is no central union of every response `type`.
48
52
  * A specific command narrows `data` via its own return type.
@@ -75,7 +79,7 @@ export function jsonError(
75
79
  /** Parse raw CLI output (string or object) into a typed result. */
76
80
  export function parseResponse(
77
81
  raw: unknown,
78
- ): CLIResponse | CLIError | CLIUnsupportedError;
82
+ ): (CLIResponse & {apiVersion: number}) | CLIError | CLIUnsupportedError;
79
83
 
80
84
  /** Type guard: returns true if result is an error. */
81
85
  export function isError(
@@ -90,7 +94,7 @@ export function isError(
90
94
  export function assertResponse<T extends string>(
91
95
  raw: unknown,
92
96
  type: T,
93
- ): CLIResponse & {type: T};
97
+ ): CLIResponse & {apiVersion: number; type: T};
94
98
 
95
99
  declare global {
96
100
  namespace NodeJS {
@@ -75,6 +75,8 @@ export function allErrorCodes(): string[];
75
75
  * | 'ERR_UNKNOWN_FEATURE'
76
76
  * | 'ERR_UNKNOWN_CODEMOD'
77
77
  * | 'ERR_CODEMOD_FAILED'
78
+ * | 'ERR_CODEMOD_PROTECTED'
79
+ * | 'ERR_CODEMOD_PROTECTION_SOURCE'
78
80
  * | 'ERR_NOT_FOUND'
79
81
  * | 'ERR_NO_DOC'
80
82
  * | 'ERR_NO_SHOWCASE'
@@ -107,4 +109,4 @@ export const ERROR_CODES: Readonly<Record<ErrorCode, ErrorCode>>;
107
109
  /**
108
110
  * Stable error-code string union. Append-only.
109
111
  */
110
- export type ErrorCode = ("ERR_UNKNOWN" | "ERR_UNKNOWN_COMMAND" | "ERR_UNKNOWN_SUBCOMMAND" | "ERR_INVALID_OPTION" | "ERR_INVALID_ARGUMENT" | "ERR_MISSING_ARGUMENT" | "ERR_INVALID_LANG" | "ERR_INVALID_DETAIL" | "ERR_NODE_VERSION" | "ERR_CORE_NOT_FOUND" | "ERR_CORE_INCOMPATIBLE" | "ERR_UNKNOWN_COMPONENT" | "ERR_UNKNOWN_HOOK" | "ERR_UNKNOWN_TOPIC" | "ERR_UNKNOWN_SECTION" | "ERR_UNKNOWN_CATEGORY" | "ERR_UNKNOWN_TEMPLATE" | "ERR_AMBIGUOUS_TEMPLATE" | "ERR_AMBIGUOUS_COMPONENT" | "ERR_AMBIGUOUS_THEME" | "ERR_UNKNOWN_THEME" | "ERR_INTEGRATION_ROOT_CONFLICT" | "ERR_INTEGRATION_EXPORT_CONFLICT" | "ERR_UNKNOWN_PACKAGE" | "ERR_UNKNOWN_AGENT" | "ERR_UNKNOWN_FEATURE" | "ERR_UNKNOWN_CODEMOD" | "ERR_CODEMOD_FAILED" | "ERR_NOT_FOUND" | "ERR_NO_DOC" | "ERR_NO_SHOWCASE" | "ERR_NO_SOURCE" | "ERR_INVALID_DOC" | "ERR_FILE_NOT_FOUND" | "ERR_FILE_EXISTS" | "ERR_PATH_TRAVERSAL" | "ERR_WRITE_FAILED" | "ERR_THEME_INVALID" | "ERR_THEME_LOAD" | "ERR_PALETTE_GENERATION" | "ERR_VERSION_DETECT" | "ERR_INVALID_VERSION" | "ERR_DEP_MISSING" | "ERR_GH_CLI" | "ERR_UNKNOWN_POST" | "ERR_FETCH_FAILED" | "ERR_LAYOUT_PARSE" | "ERR_LAYOUT_INVALID" | "ERR_UNCLASSIFIED_EXIT" | "ERR_SIGNAL_TERMINATED");
112
+ export type ErrorCode = ("ERR_UNKNOWN" | "ERR_UNKNOWN_COMMAND" | "ERR_UNKNOWN_SUBCOMMAND" | "ERR_INVALID_OPTION" | "ERR_INVALID_ARGUMENT" | "ERR_MISSING_ARGUMENT" | "ERR_INVALID_LANG" | "ERR_INVALID_DETAIL" | "ERR_NODE_VERSION" | "ERR_CORE_NOT_FOUND" | "ERR_CORE_INCOMPATIBLE" | "ERR_UNKNOWN_COMPONENT" | "ERR_UNKNOWN_HOOK" | "ERR_UNKNOWN_TOPIC" | "ERR_UNKNOWN_SECTION" | "ERR_UNKNOWN_CATEGORY" | "ERR_UNKNOWN_TEMPLATE" | "ERR_AMBIGUOUS_TEMPLATE" | "ERR_AMBIGUOUS_COMPONENT" | "ERR_AMBIGUOUS_THEME" | "ERR_UNKNOWN_THEME" | "ERR_INTEGRATION_ROOT_CONFLICT" | "ERR_INTEGRATION_EXPORT_CONFLICT" | "ERR_UNKNOWN_PACKAGE" | "ERR_UNKNOWN_AGENT" | "ERR_UNKNOWN_FEATURE" | "ERR_UNKNOWN_CODEMOD" | "ERR_CODEMOD_FAILED" | "ERR_CODEMOD_PROTECTED" | "ERR_CODEMOD_PROTECTION_SOURCE" | "ERR_NOT_FOUND" | "ERR_NO_DOC" | "ERR_NO_SHOWCASE" | "ERR_NO_SOURCE" | "ERR_INVALID_DOC" | "ERR_FILE_NOT_FOUND" | "ERR_FILE_EXISTS" | "ERR_PATH_TRAVERSAL" | "ERR_WRITE_FAILED" | "ERR_THEME_INVALID" | "ERR_THEME_LOAD" | "ERR_PALETTE_GENERATION" | "ERR_VERSION_DETECT" | "ERR_INVALID_VERSION" | "ERR_DEP_MISSING" | "ERR_GH_CLI" | "ERR_UNKNOWN_POST" | "ERR_FETCH_FAILED" | "ERR_LAYOUT_PARSE" | "ERR_LAYOUT_INVALID" | "ERR_UNCLASSIFIED_EXIT" | "ERR_SIGNAL_TERMINATED");
@@ -34,6 +34,8 @@ export type ErrorCode =
34
34
  | 'ERR_UNKNOWN_FEATURE'
35
35
  | 'ERR_UNKNOWN_CODEMOD'
36
36
  | 'ERR_CODEMOD_FAILED'
37
+ | 'ERR_CODEMOD_PROTECTED'
38
+ | 'ERR_CODEMOD_PROTECTION_SOURCE'
37
39
  | 'ERR_NOT_FOUND'
38
40
  | 'ERR_NO_DOC'
39
41
  | 'ERR_NO_SHOWCASE'
@@ -12,7 +12,7 @@ export const doc = {
12
12
  type: 'enum',
13
13
  name: 'error-codes',
14
14
  displayName: 'Error Codes',
15
- namespace: 'cli',
15
+ namespace: 'cli/api',
16
16
  description:
17
17
  'Stable, append-only machine-readable error codes on the --json error envelope (envelope.code). Codes never change or get removed; branch on these, not on prose.',
18
18
  members: [
@@ -154,6 +154,16 @@ export const doc = {
154
154
  value: 'ERR_CODEMOD_FAILED',
155
155
  description: 'One or more codemods failed during an upgrade run.',
156
156
  },
157
+ {
158
+ value: 'ERR_CODEMOD_PROTECTED',
159
+ description:
160
+ 'A required codemod change remains blocked by a protected consumer file.',
161
+ },
162
+ {
163
+ value: 'ERR_CODEMOD_PROTECTION_SOURCE',
164
+ description:
165
+ 'A working-tree protection declaration could not be read or parsed.',
166
+ },
157
167
  {
158
168
  value: 'ERR_NOT_FOUND',
159
169
  description:
@@ -187,8 +197,7 @@ export const doc = {
187
197
  },
188
198
  {
189
199
  value: 'ERR_FILE_EXISTS',
190
- description:
191
- 'Refused to overwrite an existing file in non-interactive mode.',
200
+ description: 'Refused to overwrite an existing file.',
192
201
  },
193
202
  {
194
203
  value: 'ERR_PATH_TRAVERSAL',
@@ -204,7 +213,7 @@ export const doc = {
204
213
  {
205
214
  value: 'ERR_THEME_INVALID',
206
215
  description:
207
- 'A theme definition or contributed theme catalog is invalid.',
216
+ 'A theme definition or contributed theme descriptor is invalid.',
208
217
  },
209
218
  {
210
219
  value: 'ERR_THEME_LOAD',
@@ -64,6 +64,8 @@
64
64
  * | 'ERR_UNKNOWN_FEATURE'
65
65
  * | 'ERR_UNKNOWN_CODEMOD'
66
66
  * | 'ERR_CODEMOD_FAILED'
67
+ * | 'ERR_CODEMOD_PROTECTED'
68
+ * | 'ERR_CODEMOD_PROTECTION_SOURCE'
67
69
  * | 'ERR_NOT_FOUND'
68
70
  * | 'ERR_NO_DOC'
69
71
  * | 'ERR_NO_SHOWCASE'
@@ -161,6 +163,10 @@ export const ERROR_CODES = Object.freeze({
161
163
  ERR_UNKNOWN_CODEMOD: 'ERR_UNKNOWN_CODEMOD',
162
164
  /** One or more codemods failed during an upgrade run. */
163
165
  ERR_CODEMOD_FAILED: 'ERR_CODEMOD_FAILED',
166
+ /** A required codemod change remains blocked by a protected consumer file. */
167
+ ERR_CODEMOD_PROTECTED: 'ERR_CODEMOD_PROTECTED',
168
+ /** A working-tree protection declaration could not be read or parsed. */
169
+ ERR_CODEMOD_PROTECTION_SOURCE: 'ERR_CODEMOD_PROTECTION_SOURCE',
164
170
  /** A generic discover/lookup query matched nothing in any package. */
165
171
  ERR_NOT_FOUND: 'ERR_NOT_FOUND',
166
172
 
@@ -177,7 +183,7 @@ export const ERROR_CODES = Object.freeze({
177
183
  // ── Filesystem ───────────────────────────────────────────────────
178
184
  /** A required input file did not exist. */
179
185
  ERR_FILE_NOT_FOUND: 'ERR_FILE_NOT_FOUND',
180
- /** Refused to overwrite an existing file in non-interactive mode. */
186
+ /** Refused to overwrite an existing file. */
181
187
  ERR_FILE_EXISTS: 'ERR_FILE_EXISTS',
182
188
  /** A path escaped its allowed root, or a name contained traversal markers. */
183
189
  ERR_PATH_TRAVERSAL: 'ERR_PATH_TRAVERSAL',
@@ -185,7 +191,7 @@ export const ERROR_CODES = Object.freeze({
185
191
  ERR_WRITE_FAILED: 'ERR_WRITE_FAILED',
186
192
 
187
193
  // ── Theme build ──────────────────────────────────────────────────
188
- /** A theme definition or contributed theme catalog is invalid. */
194
+ /** A theme definition or contributed theme descriptor is invalid. */
189
195
  ERR_THEME_INVALID: 'ERR_THEME_INVALID',
190
196
  /** A theme file could not be loaded / parsed into a defineTheme result. */
191
197
  ERR_THEME_LOAD: 'ERR_THEME_LOAD',
@@ -15,6 +15,9 @@
15
15
  */
16
16
 
17
17
  import {describe, it, expect} from 'vitest';
18
+ import * as fs from 'node:fs';
19
+ import * as os from 'node:os';
20
+ import * as path from 'node:path';
18
21
  import {ERROR_CODES, isErrorCode, allErrorCodes} from './error-codes.mjs';
19
22
  import {runCli} from '../../test-utils/run-cli.mjs';
20
23
 
@@ -75,20 +78,126 @@ describe('error-codes taxonomy', () => {
75
78
  });
76
79
  });
77
80
 
81
+ describe('error codes: shipped set', () => {
82
+ // Every code a release has published. INV3: a shipped code is never removed
83
+ // or respelled. Add a code here once it ships; never delete an entry.
84
+ const SHIPPED = [
85
+ 'ERR_AMBIGUOUS_COMPONENT',
86
+ 'ERR_AMBIGUOUS_TEMPLATE',
87
+ 'ERR_AMBIGUOUS_THEME',
88
+ 'ERR_CODEMOD_FAILED',
89
+ 'ERR_CODEMOD_PROTECTED',
90
+ 'ERR_CODEMOD_PROTECTION_SOURCE',
91
+ 'ERR_CORE_INCOMPATIBLE',
92
+ 'ERR_CORE_NOT_FOUND',
93
+ 'ERR_DEP_MISSING',
94
+ 'ERR_FETCH_FAILED',
95
+ 'ERR_FILE_EXISTS',
96
+ 'ERR_FILE_NOT_FOUND',
97
+ 'ERR_GH_CLI',
98
+ 'ERR_INTEGRATION_EXPORT_CONFLICT',
99
+ 'ERR_INTEGRATION_ROOT_CONFLICT',
100
+ 'ERR_INVALID_ARGUMENT',
101
+ 'ERR_INVALID_DETAIL',
102
+ 'ERR_INVALID_DOC',
103
+ 'ERR_INVALID_LANG',
104
+ 'ERR_INVALID_OPTION',
105
+ 'ERR_INVALID_VERSION',
106
+ 'ERR_LAYOUT_INVALID',
107
+ 'ERR_LAYOUT_PARSE',
108
+ 'ERR_MISSING_ARGUMENT',
109
+ 'ERR_NODE_VERSION',
110
+ 'ERR_NOT_FOUND',
111
+ 'ERR_NO_DOC',
112
+ 'ERR_NO_SHOWCASE',
113
+ 'ERR_NO_SOURCE',
114
+ 'ERR_PALETTE_GENERATION',
115
+ 'ERR_PATH_TRAVERSAL',
116
+ 'ERR_SIGNAL_TERMINATED',
117
+ 'ERR_THEME_INVALID',
118
+ 'ERR_THEME_LOAD',
119
+ 'ERR_UNCLASSIFIED_EXIT',
120
+ 'ERR_UNKNOWN',
121
+ 'ERR_UNKNOWN_AGENT',
122
+ 'ERR_UNKNOWN_CATEGORY',
123
+ 'ERR_UNKNOWN_CODEMOD',
124
+ 'ERR_UNKNOWN_COMMAND',
125
+ 'ERR_UNKNOWN_COMPONENT',
126
+ 'ERR_UNKNOWN_FEATURE',
127
+ 'ERR_UNKNOWN_HOOK',
128
+ 'ERR_UNKNOWN_PACKAGE',
129
+ 'ERR_UNKNOWN_POST',
130
+ 'ERR_UNKNOWN_SECTION',
131
+ 'ERR_UNKNOWN_SUBCOMMAND',
132
+ 'ERR_UNKNOWN_TEMPLATE',
133
+ 'ERR_UNKNOWN_THEME',
134
+ 'ERR_UNKNOWN_TOPIC',
135
+ 'ERR_VERSION_DETECT',
136
+ 'ERR_WRITE_FAILED',
137
+ ];
138
+
139
+ it('still carries every shipped code, spelled the same', () => {
140
+ const missing = SHIPPED.filter(
141
+ code => !isErrorCode(code) || ERROR_CODES[code] !== code,
142
+ );
143
+ expect(missing, 'shipped codes removed or respelled').toEqual([]);
144
+ });
145
+ });
146
+
78
147
  describe('error codes: end-to-end JSON envelopes', () => {
79
148
  const cases = [
80
- {name: 'unknown component', args: ['component', 'Bogus', '--json'], code: 'ERR_UNKNOWN_COMPONENT'},
81
- {name: 'unknown hook', args: ['hook', 'bogusHook', '--json'], code: 'ERR_UNKNOWN_HOOK'},
82
- {name: 'unknown topic', args: ['docs', 'bogusTopic', '--json'], code: 'ERR_UNKNOWN_TOPIC'},
83
- {name: 'unknown template', args: ['template', 'bogusTemplate', '--json'], code: 'ERR_UNKNOWN_TEMPLATE'},
84
- {name: 'unknown command', args: ['bogus-cmd', '--json'], code: 'ERR_UNKNOWN_COMMAND'},
85
- {name: 'invalid --lang', args: ['docs', 'color', '--lang', 'fr', '--json'], code: 'ERR_INVALID_LANG'},
86
- {name: 'invalid --detail', args: ['docs', 'color', '--detail', 'bogus', '--json'], code: 'ERR_INVALID_DETAIL'},
87
- {name: 'unknown option', args: ['component', 'Button', '--bogus-flag', '--json'], code: 'ERR_INVALID_OPTION'},
88
- {name: 'missing argument', args: ['theme', 'build', '--json'], code: 'ERR_MISSING_ARGUMENT'},
149
+ {
150
+ name: 'unknown component',
151
+ args: ['component', 'Bogus', '--json'],
152
+ code: 'ERR_UNKNOWN_COMPONENT',
153
+ },
154
+ {
155
+ name: 'unknown hook',
156
+ args: ['hook', 'bogusHook', '--json'],
157
+ code: 'ERR_UNKNOWN_HOOK',
158
+ },
159
+ {
160
+ name: 'unknown topic',
161
+ args: ['docs', 'bogusTopic', '--json'],
162
+ code: 'ERR_UNKNOWN_TOPIC',
163
+ },
164
+ {
165
+ name: 'unknown template',
166
+ args: ['template', 'bogusTemplate', '--json'],
167
+ code: 'ERR_UNKNOWN_TEMPLATE',
168
+ },
169
+ {
170
+ name: 'unknown command',
171
+ args: ['bogus-cmd', '--json'],
172
+ code: 'ERR_UNKNOWN_COMMAND',
173
+ },
174
+ {
175
+ name: 'invalid --lang',
176
+ args: ['docs', 'color', '--lang', 'fr', '--json'],
177
+ code: 'ERR_INVALID_LANG',
178
+ },
179
+ {
180
+ name: 'invalid --detail',
181
+ args: ['docs', 'color', '--detail', 'bogus', '--json'],
182
+ code: 'ERR_INVALID_DETAIL',
183
+ },
184
+ {
185
+ name: 'unknown option',
186
+ args: ['component', 'Button', '--bogus-flag', '--json'],
187
+ code: 'ERR_INVALID_OPTION',
188
+ },
189
+ {
190
+ name: 'missing argument',
191
+ args: ['theme', 'build', '--json'],
192
+ code: 'ERR_MISSING_ARGUMENT',
193
+ },
89
194
  // `theme` is not on the --json allowlist, so --json on any theme subcommand
90
195
  // is rejected at the preAction gate with a stable invalid-option code.
91
- {name: 'json not supported', args: ['theme', 'bogus-sub', '--json'], code: 'ERR_INVALID_OPTION'},
196
+ {
197
+ name: 'json not supported',
198
+ args: ['theme', 'bogus-sub', '--json'],
199
+ code: 'ERR_INVALID_OPTION',
200
+ },
92
201
  ];
93
202
 
94
203
  for (const {name, args, code} of cases) {
@@ -104,6 +213,24 @@ describe('error codes: end-to-end JSON envelopes', () => {
104
213
  });
105
214
  }
106
215
 
216
+ it('a filesystem failure carries a registered code, never the Node errno', async () => {
217
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-errno-'));
218
+ try {
219
+ // A file where the target directory should be: mkdir fails with ENOTDIR.
220
+ fs.writeFileSync(path.join(dir, 'blocker'), 'x');
221
+ const {status, stdout} = await runCli(
222
+ ['template', 'dashboard', 'blocker/out', '--json'],
223
+ {cwd: dir},
224
+ );
225
+ expect(status).toBe(1);
226
+ const env = envelope(stdout);
227
+ expect(env.error).toMatch(/ENOTDIR/);
228
+ expect(isErrorCode(env.code)).toBe(true);
229
+ } finally {
230
+ fs.rmSync(dir, {recursive: true, force: true});
231
+ }
232
+ });
233
+
107
234
  it('every error envelope carries a code (even unmatched paths fall back to ERR_UNKNOWN)', async () => {
108
235
  const {stdout} = await runCli(['component', 'Bogus', '--json']);
109
236
  const env = envelope(stdout);
@@ -13,6 +13,8 @@
13
13
 
14
14
  import {describe, it, expect, beforeEach, afterEach, vi} from 'vitest';
15
15
  import {spawnSync} from 'node:child_process';
16
+ import * as fs from 'node:fs';
17
+ import * as os from 'node:os';
16
18
  import * as path from 'node:path';
17
19
  import {fileURLToPath} from 'node:url';
18
20
  import {
@@ -27,10 +29,20 @@ import {
27
29
  } from './json.mjs';
28
30
 
29
31
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
30
- const CLI = path.resolve(__dirname, '..', '..', 'clients', 'cli', 'bin', 'astryx.mjs');
31
-
32
- function runCli(args) {
32
+ const CLI = path.resolve(
33
+ __dirname,
34
+ '..',
35
+ '..',
36
+ 'clients',
37
+ 'cli',
38
+ 'bin',
39
+ 'astryx.mjs',
40
+ );
41
+
42
+ /** @param {string[]} args @param {{cwd?: string}} [options] */
43
+ function runCli(args, {cwd = process.cwd()} = {}) {
33
44
  return spawnSync(process.execPath, [CLI, ...args], {
45
+ cwd,
34
46
  encoding: 'utf8',
35
47
  timeout: 20_000,
36
48
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -42,7 +54,9 @@ describe('json envelope shape', () => {
42
54
  let logs;
43
55
  beforeEach(() => {
44
56
  logs = [];
45
- vi.spyOn(console, 'log').mockImplementation((...a) => logs.push(a.join(' ')));
57
+ vi.spyOn(console, 'log').mockImplementation((...a) =>
58
+ logs.push(a.join(' ')),
59
+ );
46
60
  setJsonMode(false);
47
61
  });
48
62
  afterEach(() => {
@@ -80,11 +94,13 @@ describe('json envelope shape', () => {
80
94
  });
81
95
 
82
96
  it('toErrorEnvelope honors an explicit code argument', () => {
83
- expect(toErrorEnvelope('boom', undefined, 'ERR_UNKNOWN_COMPONENT')).toEqual({
84
- apiVersion: API_VERSION,
85
- error: 'boom',
86
- code: 'ERR_UNKNOWN_COMPONENT',
87
- });
97
+ expect(toErrorEnvelope('boom', undefined, 'ERR_UNKNOWN_COMPONENT')).toEqual(
98
+ {
99
+ apiVersion: API_VERSION,
100
+ error: 'boom',
101
+ code: 'ERR_UNKNOWN_COMPONENT',
102
+ },
103
+ );
88
104
  });
89
105
 
90
106
  it('toErrorEnvelope reads a code carried on a thrown Error', () => {
@@ -96,6 +112,17 @@ describe('json envelope shape', () => {
96
112
  });
97
113
  });
98
114
 
115
+ it('toErrorEnvelope never emits an unregistered code', () => {
116
+ // A Node system error carries `code: 'EACCES'`; that is not an Astryx code.
117
+ const sysErr = Object.assign(new Error('EACCES: permission denied'), {
118
+ code: 'EACCES',
119
+ });
120
+ expect(toErrorEnvelope(sysErr).code).toBe('ERR_UNKNOWN');
121
+ expect(toErrorEnvelope('boom', undefined, 'ENOENT').code).toBe('ERR_UNKNOWN');
122
+ const docErr = Object.assign(new Error('no doc'), {code: 'ERR_NO_DOC'});
123
+ expect(toErrorEnvelope(docErr, undefined, 'ENOENT').code).toBe('ERR_NO_DOC');
124
+ });
125
+
99
126
  it('toErrorEnvelope includes suggestions when present', () => {
100
127
  const env = toErrorEnvelope('x', [{name: 'Button', reason: 'close match'}]);
101
128
  expect(env.suggestions).toEqual([{name: 'Button', reason: 'close match'}]);
@@ -109,8 +136,12 @@ describe('json envelope shape', () => {
109
136
  // The guard is `Array.isArray(...) && .length`, not a bare `?.length` — a
110
137
  // string ("hello".length === 5) or a `{length: n}` object must NOT slip
111
138
  // through as `suggestions`, which is contractually a Suggestion[].
112
- expect('suggestions' in toErrorEnvelope('x', /** @type {any} */ ('hello'))).toBe(false);
113
- expect('suggestions' in toErrorEnvelope('x', /** @type {any} */ ({length: 3}))).toBe(false);
139
+ expect(
140
+ 'suggestions' in toErrorEnvelope('x', /** @type {any} */ ('hello')),
141
+ ).toBe(false);
142
+ expect(
143
+ 'suggestions' in toErrorEnvelope('x', /** @type {any} */ ({length: 3})),
144
+ ).toBe(false);
114
145
  });
115
146
  });
116
147
 
@@ -119,8 +150,12 @@ describe('stdout discipline (humanLog / humanWarn)', () => {
119
150
  beforeEach(() => {
120
151
  logs = [];
121
152
  errs = [];
122
- vi.spyOn(console, 'log').mockImplementation((...a) => logs.push(a.join(' ')));
123
- vi.spyOn(console, 'error').mockImplementation((...a) => errs.push(a.join(' ')));
153
+ vi.spyOn(console, 'log').mockImplementation((...a) =>
154
+ logs.push(a.join(' ')),
155
+ );
156
+ vi.spyOn(console, 'error').mockImplementation((...a) =>
157
+ errs.push(a.join(' ')),
158
+ );
124
159
  });
125
160
  afterEach(() => {
126
161
  vi.restoreAllMocks();
@@ -174,10 +209,15 @@ describe('contract: every --json emission is valid JSON with apiVersion', () =>
174
209
  });
175
210
 
176
211
  it('init emits its install receipt', () => {
177
- const r = runCli(['init', '--json']);
178
- const env = JSON.parse(r.stdout);
179
- expect(env.apiVersion).toBe(API_VERSION);
180
- expect(env.type).toBe('init.run');
212
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-json-contract-'));
213
+ try {
214
+ const r = runCli(['init', '--json'], {cwd});
215
+ const env = JSON.parse(r.stdout);
216
+ expect(env.apiVersion).toBe(API_VERSION);
217
+ expect(env.type).toBe('init.run');
218
+ } finally {
219
+ fs.rmSync(cwd, {recursive: true, force: true});
220
+ }
181
221
  });
182
222
 
183
223
  it('supported command (discover) emits clean JSON, no human chatter leak', () => {
@@ -50,8 +50,10 @@ export function jsonOut(response: {
50
50
  *
51
51
  * The `code` is resolved in priority order: an explicit `code` argument,
52
52
  * then a `code` property carried on a thrown Error/AstryxError, then the
53
- * generic `ERR_UNKNOWN` fallback. It always appears on the envelope so
54
- * consumers can branch on it unconditionally.
53
+ * generic `ERR_UNKNOWN` fallback. Only a registered code (error-codes.mjs) is
54
+ * taken from either source, so a Node system error's `ENOENT` never reaches
55
+ * the envelope. It always appears on the envelope so consumers can branch on
56
+ * it unconditionally.
55
57
  *
56
58
  * @param {unknown} err
57
59
  * @param {import('./base').Suggestion[]} [suggestions]
@@ -28,7 +28,7 @@
28
28
  * Version of the JSON envelope contract. Bump on breaking shape changes so
29
29
  * consumers can negotiate. Exposed on every envelope as `apiVersion`.
30
30
  */
31
- import {ERROR_CODES} from './error-codes.mjs';
31
+ import {ERROR_CODES, isErrorCode} from './error-codes.mjs';
32
32
  import {recordEnvelope, setOutcome} from '../debug/index.mjs';
33
33
 
34
34
  export const API_VERSION = 1;
@@ -118,8 +118,10 @@ export function jsonOut(response) {
118
118
  *
119
119
  * The `code` is resolved in priority order: an explicit `code` argument,
120
120
  * then a `code` property carried on a thrown Error/AstryxError, then the
121
- * generic `ERR_UNKNOWN` fallback. It always appears on the envelope so
122
- * consumers can branch on it unconditionally.
121
+ * generic `ERR_UNKNOWN` fallback. Only a registered code (error-codes.mjs) is
122
+ * taken from either source, so a Node system error's `ENOENT` never reaches
123
+ * the envelope. It always appears on the envelope so consumers can branch on
124
+ * it unconditionally.
123
125
  *
124
126
  * @param {unknown} err
125
127
  * @param {import('./base').Suggestion[]} [suggestions]
@@ -130,13 +132,9 @@ export function jsonOut(response) {
130
132
  export function toErrorEnvelope(err, suggestions, code) {
131
133
  const message =
132
134
  err instanceof Error ? err.message : typeof err === 'string' ? err : String(err);
133
- const resolvedCode =
134
- code ||
135
- (err && typeof err === 'object' &&
136
- typeof (/** @type {any} */ (err).code) === 'string'
137
- ? /** @type {any} */ (err).code
138
- : undefined) ||
139
- ERROR_CODES.ERR_UNKNOWN;
135
+ const carried =
136
+ err && typeof err === 'object' ? /** @type {any} */ (err).code : undefined;
137
+ const resolvedCode = [code, carried].find(isErrorCode) ?? ERROR_CODES.ERR_UNKNOWN;
140
138
  /** @type {any} */
141
139
  const env = {apiVersion: API_VERSION, error: message, code: resolvedCode};
142
140
  if (Array.isArray(suggestions) && suggestions.length) env.suggestions = suggestions;
@@ -5,7 +5,11 @@
5
5
  * @file EnumDoc for the `type` discriminant carried on every --json success
6
6
  * envelope. The vocabulary mirrors the RESPONSE_TYPES map (each command's
7
7
  * `jsonOut(...)` call sites) in `clients/cli/lib/manifest.mjs`; a consumer
8
- * switches on `type` to narrow the `data` payload.
8
+ * switches on `type` to narrow the `data` payload. Descriptions follow the
9
+ * currently published response projection, not a future package-version boundary.
10
+ *
11
+ * @input Public response discriminants and their currently released payloads.
12
+ * @output Generated consumer reference for every typed JSON success response.
9
13
  * @position packages/cli/foundation/response — enum documentation
10
14
  */
11
15
  /** @type {import('@astryxdesign/cli/authoring').EnumDoc} */