@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25

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 (728) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +152 -107
  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 +22 -10
  7. package/api/build/build.test.mjs +219 -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 +208 -53
  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 +31 -12
  18. package/api/component/_adapter.mjs +79 -15
  19. package/api/component/component.d.mts +6 -3
  20. package/api/component/component.doc.mjs +49 -19
  21. package/api/component/component.mjs +339 -22
  22. package/api/component/component.test.mjs +38 -0
  23. package/api/component/component.type.d.mts +47 -11
  24. package/api/component/component.type.mjs +76 -24
  25. package/api/component/detail/blocks/blocks.d.mts +2 -1
  26. package/api/component/detail/blocks/blocks.mjs +4 -3
  27. package/api/component/list/list.d.mts +0 -5
  28. package/api/component/list/list.mjs +40 -11
  29. package/api/discover/_adapter.d.mts +114 -6
  30. package/api/discover/_adapter.mjs +372 -17
  31. package/api/discover/_adapter.test.mjs +215 -0
  32. package/api/discover/_catalog-view.d.mts +115 -0
  33. package/api/discover/_catalog-view.mjs +203 -0
  34. package/api/discover/_catalog-view.test.mjs +128 -0
  35. package/api/discover/detail/detail.d.mts +18 -6
  36. package/api/discover/detail/detail.mjs +67 -13
  37. package/api/discover/detail/detail.test.mjs +85 -0
  38. package/api/discover/detail/item/item.d.mts +26 -0
  39. package/api/discover/detail/item/item.mjs +78 -0
  40. package/api/discover/detail/item/item.test.mjs +73 -0
  41. package/api/discover/discover.d.mts +3 -9
  42. package/api/discover/discover.doc.mjs +62 -18
  43. package/api/discover/discover.mjs +220 -36
  44. package/api/discover/discover.test.mjs +11 -2
  45. package/api/discover/discover.type.d.mts +150 -11
  46. package/api/discover/discover.type.mjs +107 -17
  47. package/api/discover/list/list.d.mts +20 -6
  48. package/api/discover/list/list.mjs +45 -12
  49. package/api/discover/list/list.test.mjs +46 -0
  50. package/api/discover/search/search.d.mts +18 -16
  51. package/api/discover/search/search.mjs +102 -56
  52. package/api/discover/search/search.test.mjs +144 -10
  53. package/api/docs/_adapter.d.mts +277 -41
  54. package/api/docs/_adapter.mjs +993 -108
  55. package/api/docs/compiled-topics.test.mjs +78 -0
  56. package/api/docs/detail/detail.mjs +22 -63
  57. package/api/docs/detail/section/section.d.mts +1 -1
  58. package/api/docs/detail/section/section.mjs +54 -19
  59. package/api/docs/detail/section/section.test.mjs +50 -0
  60. package/api/docs/docOverlays.test.mjs +27 -1
  61. package/api/docs/docs.d.mts +10 -3
  62. package/api/docs/docs.doc.mjs +55 -16
  63. package/api/docs/docs.mjs +53 -10
  64. package/api/docs/docs.type.d.mts +221 -5
  65. package/api/docs/docs.type.mjs +153 -11
  66. package/api/docs/index/index.d.mts +18 -0
  67. package/api/docs/index/index.mjs +40 -0
  68. package/api/docs/index/index.test.mjs +62 -0
  69. package/api/docs/list/list.mjs +28 -12
  70. package/api/docs/node/node.d.mts +43 -0
  71. package/api/docs/node/node.mjs +192 -0
  72. package/api/docs/reference-blocks.test.mjs +406 -0
  73. package/api/doctor/doctor.d.mts +104 -1
  74. package/api/doctor/doctor.doc.mjs +18 -8
  75. package/api/doctor/doctor.mjs +635 -7
  76. package/api/doctor/doctor.test.mjs +732 -11
  77. package/api/doctor/doctor.type.d.mts +1 -1
  78. package/api/doctor/doctor.type.mjs +1 -1
  79. package/api/gap-report/gap-report.doc.mjs +27 -14
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +7 -3
  82. package/api/hook/hook.type.d.mts +3 -3
  83. package/api/hook/hook.type.mjs +11 -11
  84. package/api/hook/list/list.d.mts +2 -2
  85. package/api/hook/list/list.mjs +69 -17
  86. package/api/index.d.mts +2 -1
  87. package/api/index.mjs +6 -3
  88. package/api/init/init.doc.mjs +22 -12
  89. package/api/init/init.test.mjs +41 -1
  90. package/api/init/remove/remove.mjs +1 -1
  91. package/api/init/run/run.mjs +20 -10
  92. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  93. package/api/integration/add-contribution.d.mts +2 -1
  94. package/api/integration/add-contribution.mjs +130 -15
  95. package/api/integration/add-contribution.test.mjs +258 -7
  96. package/api/integration/add-helpers.d.mts +5 -2
  97. package/api/integration/add-helpers.mjs +36 -9
  98. package/api/integration/add-theme.mjs +56 -65
  99. package/api/integration/add-theme.test.mjs +139 -21
  100. package/api/integration/authoring-checks.mjs +138 -28
  101. package/api/integration/authoring-checks.test.mjs +179 -7
  102. package/api/integration/authoring-checks.type.mjs +6 -1
  103. package/api/integration/integration-authoring.type.d.mts +3 -1
  104. package/api/integration/integration-authoring.type.mjs +2 -0
  105. package/api/integration/integration-block-exports.test.mjs +10 -6
  106. package/api/integration/integrationAdd.doc.mjs +14 -4
  107. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  108. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  109. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  110. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  111. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  112. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  113. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  114. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  115. package/api/integration/integrationPackCheck.doc.mjs +5 -4
  116. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  117. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  118. package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
  119. package/api/integration/pack-check.mjs +160 -11
  120. package/api/integration/pack-check.test.mjs +477 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +15 -2
  123. package/api/integration/summarizeIssues.doc.mjs +1 -0
  124. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  126. package/api/integration/validate-integration.mjs +52 -102
  127. package/api/integration/validate-integration.test.mjs +179 -26
  128. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  129. package/api/integration/validateIntegration.doc.mjs +3 -2
  130. package/api/json/assertResponse.doc.mjs +2 -1
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -0
  133. package/api/json/isError.doc.mjs +2 -1
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/layout/_adapter.mjs +20 -5
  136. package/api/layout/expand/expand.mjs +7 -5
  137. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  138. package/api/layout/grammar/grammar.mjs +2 -1
  139. package/api/layout/layoutCheck.doc.mjs +1 -0
  140. package/api/layout/layoutExpand.doc.mjs +2 -1
  141. package/api/layout/layoutGrammar.doc.mjs +1 -0
  142. package/api/search/search-return-type.test.mjs +54 -0
  143. package/api/search/search.d.mts +89 -12
  144. package/api/search/search.doc.mjs +8 -2
  145. package/api/search/search.mjs +697 -97
  146. package/api/search/search.type.d.mts +15 -3
  147. package/api/search/search.type.mjs +5 -2
  148. package/api/swizzle/copy/copy.mjs +28 -11
  149. package/api/swizzle/swizzle.doc.mjs +8 -5
  150. package/api/swizzle/swizzle.type.d.mts +2 -2
  151. package/api/swizzle/swizzle.type.mjs +2 -2
  152. package/api/template/copy/copy.mjs +18 -24
  153. package/api/template/copy/copy.test.mjs +26 -0
  154. package/api/template/list/list.mjs +1 -0
  155. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  156. package/api/template/template-integration.test.mjs +1072 -3
  157. package/api/template/template-suffix.test.mjs +41 -21
  158. package/api/template/template.d.mts +1 -1
  159. package/api/template/template.doc.mjs +32 -9
  160. package/api/template/template.mjs +45 -8
  161. package/api/template/template.type.d.mts +12 -14
  162. package/api/template/template.type.mjs +15 -14
  163. package/api/theme/_adapter.d.mts +2 -3
  164. package/api/theme/_adapter.mjs +4 -5
  165. package/api/theme/add/add.binary.test.mjs +84 -0
  166. package/api/theme/add/add.mjs +31 -22
  167. package/api/theme/add/add.rollback.test.mjs +158 -0
  168. package/api/theme/add/add.staging.test.mjs +83 -0
  169. package/api/theme/add/add.test.mjs +14 -1
  170. package/api/theme/build/build.family.test.mjs +7 -12
  171. package/api/theme/build/build.mjs +140 -59
  172. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  173. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  174. package/api/theme/build/build.rollback.test.mjs +148 -0
  175. package/api/theme/build/build.test.mjs +127 -0
  176. package/api/theme/build/font-warning.mjs +3 -3
  177. package/api/theme/build/font-warning.test.mjs +5 -2
  178. package/api/theme/generateTonalPalette.doc.mjs +2 -2
  179. package/api/theme/integration-themes.test.mjs +39 -28
  180. package/api/theme/list/list.test.mjs +19 -20
  181. package/api/theme/listThemes.doc.mjs +6 -5
  182. package/api/theme/palette/generate/generate.mjs +8 -3
  183. package/api/theme/palette/generate/generate.test.mjs +96 -0
  184. package/api/theme/palette/generate/generator.d.mts +10 -13
  185. package/api/theme/palette/generate/generator.mjs +15 -4
  186. package/api/theme/palette/generate/generator.test.mjs +10 -0
  187. package/api/theme/template/template.mjs +11 -2
  188. package/api/theme/template/template.test.mjs +20 -0
  189. package/api/theme/theme.type.d.mts +170 -11
  190. package/api/theme/theme.type.mjs +94 -27
  191. package/api/theme/themeAdd.doc.mjs +12 -12
  192. package/api/theme/themeBuild.doc.mjs +21 -17
  193. package/api/theme/themeList.doc.mjs +6 -3
  194. package/api/theme/themeListAvailable.doc.mjs +6 -3
  195. package/api/theme/themePaletteGenerate.doc.mjs +16 -8
  196. package/api/theme/themeTargets.doc.mjs +4 -2
  197. package/api/theme/themeTemplate.doc.mjs +8 -3
  198. package/api/upgrade/_adapter.d.mts +32 -5
  199. package/api/upgrade/_adapter.mjs +139 -22
  200. package/api/upgrade/list/list.mjs +2 -1
  201. package/api/upgrade/list/list.test.mjs +73 -0
  202. package/api/upgrade/project-context.test.mjs +272 -0
  203. package/api/upgrade/provider-agreement.test.mjs +152 -0
  204. package/api/upgrade/run/files-changed.test.mjs +111 -0
  205. package/api/upgrade/run/run.mjs +358 -59
  206. package/api/upgrade/status/status.mjs +2 -2
  207. package/api/upgrade/upgrade.doc.mjs +32 -23
  208. package/api/upgrade/upgrade.type.d.mts +43 -5
  209. package/api/upgrade/upgrade.type.mjs +29 -13
  210. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  211. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  212. package/assets/codemods/file-count.test.mjs +163 -0
  213. package/assets/codemods/integration-discovery.mjs +48 -4
  214. package/assets/codemods/integration-discovery.test.mjs +73 -0
  215. package/assets/codemods/integration-runner.mjs +59 -7
  216. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  217. package/assets/codemods/registry.mjs +1 -0
  218. package/assets/codemods/run-codemod.mjs +177 -34
  219. package/assets/codemods/runner.mjs +353 -104
  220. package/assets/codemods/term-log.mjs +32 -8
  221. package/assets/codemods/term-log.test.mjs +19 -1
  222. package/assets/codemods/transform-prop.mjs +109 -0
  223. package/assets/codemods/transform-prop.test.mjs +95 -0
  224. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  225. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  226. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  227. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  228. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  229. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  230. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  231. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  232. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  233. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  234. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  235. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  236. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  237. package/assets/docs/README.md +12 -1
  238. package/assets/docs/authoring.doc.mjs +14 -0
  239. package/assets/docs/browser-support.doc.mjs +11 -11
  240. package/assets/docs/color.doc.mjs +8 -2
  241. package/assets/docs/elevation.doc.mjs +6 -4
  242. package/assets/docs/getting-started.doc.mjs +6 -17
  243. package/assets/docs/icons.doc.mjs +2 -21
  244. package/assets/docs/illustrations.doc.mjs +7 -15
  245. package/assets/docs/internationalization.doc.mjs +7 -5
  246. package/assets/docs/layout.doc.dense.mjs +132 -84
  247. package/assets/docs/layout.doc.mjs +134 -78
  248. package/assets/docs/migration.doc.mjs +19 -21
  249. package/assets/docs/motion.doc.mjs +16 -3
  250. package/assets/docs/principles.doc.dense.mjs +5 -5
  251. package/assets/docs/principles.doc.mjs +14 -6
  252. package/assets/docs/principles.doc.zh.mjs +6 -6
  253. package/assets/docs/shape.doc.mjs +8 -3
  254. package/assets/docs/spacing.doc.mjs +7 -2
  255. package/assets/docs/styling-libraries.doc.mjs +10 -6
  256. package/assets/docs/styling.doc.mjs +22 -26
  257. package/assets/docs/theme.doc.dense.mjs +58 -18
  258. package/assets/docs/theme.doc.mjs +60 -50
  259. package/assets/docs/theme.doc.zh.mjs +9 -8
  260. package/assets/docs/tokens.doc.dense.mjs +2 -2
  261. package/assets/docs/tokens.doc.mjs +390 -9
  262. package/assets/docs/tokens.doc.zh.mjs +2 -2
  263. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  264. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  265. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  266. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  267. package/assets/docs/tree/api.doc.mjs +30 -0
  268. package/assets/docs/tree/block-template.doc.mjs +130 -0
  269. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  270. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  271. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  272. package/assets/docs/tree/checks.doc.mjs +119 -0
  273. package/assets/docs/tree/cli.doc.mjs +23 -0
  274. package/assets/docs/tree/codemods.doc.mjs +147 -0
  275. package/assets/docs/tree/commands.doc.mjs +25 -0
  276. package/assets/docs/tree/component-family.doc.mjs +113 -0
  277. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  278. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  279. package/assets/docs/tree/components.doc.mjs +23 -0
  280. package/assets/docs/tree/configuration.doc.mjs +23 -0
  281. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  282. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  283. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  284. package/assets/docs/tree/docs.doc.mjs +21 -0
  285. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  286. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  287. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  288. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  289. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  290. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  291. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  292. package/assets/docs/tree/help.doc.mjs +16 -0
  293. package/assets/docs/tree/integrations.doc.mjs +40 -0
  294. package/assets/docs/tree/links.doc.mjs +98 -0
  295. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  296. package/assets/docs/tree/page-template.doc.mjs +71 -0
  297. package/assets/docs/tree/publishing.doc.mjs +111 -0
  298. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  299. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  300. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  301. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  302. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  303. package/assets/docs/tree/ship.doc.mjs +16 -0
  304. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  305. package/assets/docs/tree/single-component.doc.mjs +165 -0
  306. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  307. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  308. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  309. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  310. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  311. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  312. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  313. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  314. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  315. package/assets/docs/tree/templates.doc.mjs +34 -0
  316. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  317. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  318. package/assets/docs/tree/themes.doc.mjs +39 -0
  319. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  320. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  321. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  322. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  323. package/assets/docs/tree/versioning.doc.mjs +161 -0
  324. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  325. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  326. package/assets/docs/typography.doc.mjs +24 -4
  327. package/assets/docs/working-with-ai.doc.mjs +34 -26
  328. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  329. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  330. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  331. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  332. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  333. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  334. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  335. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  336. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  337. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  338. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  339. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  340. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  341. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  342. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  343. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  344. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  345. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  346. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  347. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  348. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  349. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  350. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  351. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  352. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  353. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  354. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  355. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  356. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  357. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  358. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  359. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  360. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  361. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  362. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  363. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  364. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  365. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  366. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  367. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  368. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  369. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  370. package/authoring/_shared/contract.ts +22 -0
  371. package/authoring/codemod/codemod.doc.mjs +7 -2
  372. package/authoring/codemod/parse.d.mts +8 -8
  373. package/authoring/codemod/parse.mjs +8 -6
  374. package/authoring/codemod/type.ts +12 -0
  375. package/authoring/config/config.doc.mjs +11 -3
  376. package/authoring/config/debug-composition.test.mjs +92 -0
  377. package/authoring/config/parse.d.mts +15 -13
  378. package/authoring/config/parse.mjs +27 -8
  379. package/authoring/config/parse.test.mjs +8 -0
  380. package/authoring/config/type.ts +29 -6
  381. package/authoring/debug/debug.doc.d.mts +11 -0
  382. package/authoring/debug/debug.doc.mjs +182 -0
  383. package/authoring/debug/parse.d.mts +8 -8
  384. package/authoring/debug/parse.mjs +3 -3
  385. package/authoring/discover/discover.doc.d.mts +13 -0
  386. package/authoring/discover/discover.doc.mjs +138 -0
  387. package/authoring/discover/parse.d.mts +24 -0
  388. package/authoring/discover/parse.mjs +128 -0
  389. package/authoring/discover/parse.test.mjs +124 -0
  390. package/authoring/discover/type.ts +87 -0
  391. package/authoring/doctypes/_schema.d.mts +792 -24
  392. package/authoring/doctypes/_schema.mjs +549 -39
  393. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  394. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  395. package/authoring/doctypes/base/type.ts +43 -0
  396. package/authoring/doctypes/command/command.doc.mjs +4 -3
  397. package/authoring/doctypes/command/parse.d.mts +2 -2
  398. package/authoring/doctypes/command/parse.mjs +1 -1
  399. package/authoring/doctypes/command/type.ts +5 -4
  400. package/authoring/doctypes/component/component.doc.mjs +12 -3
  401. package/authoring/doctypes/component/parse.d.mts +2 -2
  402. package/authoring/doctypes/component/parse.mjs +1 -1
  403. package/authoring/doctypes/component/type.ts +14 -5
  404. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  405. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  406. package/authoring/doctypes/enum/parse.d.mts +2 -2
  407. package/authoring/doctypes/enum/parse.mjs +1 -1
  408. package/authoring/doctypes/enum/type.ts +4 -2
  409. package/authoring/doctypes/function/function.doc.mjs +7 -2
  410. package/authoring/doctypes/function/parse.d.mts +2 -2
  411. package/authoring/doctypes/function/parse.mjs +1 -1
  412. package/authoring/doctypes/function/type.ts +9 -4
  413. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  414. package/authoring/doctypes/hook/parse.d.mts +2 -2
  415. package/authoring/doctypes/hook/parse.mjs +1 -1
  416. package/authoring/doctypes/hook/type.ts +5 -4
  417. package/authoring/doctypes/legacy.d.mts +8 -6
  418. package/authoring/doctypes/legacy.mjs +5 -4
  419. package/authoring/doctypes/load-contract.test.mjs +233 -0
  420. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  421. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  422. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  423. package/authoring/doctypes/namespace/parse.mjs +25 -0
  424. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  425. package/authoring/doctypes/namespace/type.ts +74 -0
  426. package/authoring/doctypes/parse.d.mts +22 -18
  427. package/authoring/doctypes/parse.mjs +22 -11
  428. package/authoring/doctypes/parse.test.mjs +77 -3
  429. package/authoring/doctypes/reference/parse.d.mts +2 -2
  430. package/authoring/doctypes/reference/parse.mjs +8 -5
  431. package/authoring/doctypes/reference/reference.doc.mjs +55 -6
  432. package/authoring/doctypes/reference/type.ts +75 -7
  433. package/authoring/doctypes/schema/parse.d.mts +2 -2
  434. package/authoring/doctypes/schema/parse.mjs +1 -1
  435. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  436. package/authoring/doctypes/schema/type.ts +4 -4
  437. package/authoring/doctypes/template/parse.d.mts +94 -1
  438. package/authoring/doctypes/template/parse.mjs +40 -2
  439. package/authoring/doctypes/template/parse.test.mjs +26 -2
  440. package/authoring/doctypes/template/template.doc.mjs +13 -3
  441. package/authoring/doctypes/template/type.ts +13 -2
  442. package/authoring/doctypes/theme/parse.d.mts +35 -0
  443. package/authoring/doctypes/theme/parse.mjs +76 -0
  444. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  445. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  446. package/authoring/doctypes/theme/type.ts +42 -0
  447. package/authoring/doctypes/types.ts +12 -10
  448. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  449. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  450. package/authoring/gap-report/parse.d.mts +10 -10
  451. package/authoring/gap-report/parse.mjs +6 -6
  452. package/authoring/gap-report/type.ts +1 -1
  453. package/authoring/identity/identity.doc.d.mts +9 -0
  454. package/authoring/identity/identity.doc.mjs +61 -0
  455. package/authoring/identity/type.ts +132 -0
  456. package/authoring/index.d.mts +3 -0
  457. package/authoring/index.d.ts +62 -17
  458. package/authoring/index.mjs +4 -1
  459. package/authoring/integration/integration.doc.mjs +22 -13
  460. package/authoring/integration/parse.d.mts +2 -2
  461. package/authoring/integration/parse.mjs +1 -1
  462. package/authoring/integration/parse.test.mjs +10 -1
  463. package/authoring/integration/schema.d.mts +6 -4
  464. package/authoring/integration/schema.mjs +9 -3
  465. package/authoring/integration/type.ts +19 -8
  466. package/authoring/shadcn/receipt.d.mts +6 -6
  467. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  468. package/clients/cli/command-load-failure.test.mjs +83 -0
  469. package/clients/cli/commands/blog.doc.mjs +1 -1
  470. package/clients/cli/commands/blog.mjs +23 -8
  471. package/clients/cli/commands/blog.test.mjs +42 -1
  472. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  473. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  474. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  475. package/clients/cli/commands/build-theme.mjs +16 -50
  476. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  477. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  478. package/clients/cli/commands/build.doc.mjs +16 -8
  479. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  480. package/clients/cli/commands/build.mjs +137 -114
  481. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  482. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  483. package/clients/cli/commands/component/index.mjs +153 -61
  484. package/clients/cli/commands/component-batch.test.mjs +341 -0
  485. package/clients/cli/commands/component-ownership.test.mjs +92 -3
  486. package/clients/cli/commands/component-package.test.mjs +46 -0
  487. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  488. package/clients/cli/commands/component.doc.mjs +28 -10
  489. package/clients/cli/commands/component.test.mjs +19 -0
  490. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  491. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  492. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  493. package/clients/cli/commands/discover.doc.mjs +55 -9
  494. package/clients/cli/commands/discover.mjs +393 -118
  495. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  496. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  497. package/clients/cli/commands/docs.doc.mjs +28 -6
  498. package/clients/cli/commands/docs.mjs +295 -38
  499. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  500. package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
  501. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  502. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  503. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  504. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  505. package/clients/cli/commands/doctor-integration.test.mjs +143 -8
  506. package/clients/cli/commands/doctor.doc.mjs +4 -2
  507. package/clients/cli/commands/doctor.mjs +108 -37
  508. package/clients/cli/commands/doctor.test.mjs +42 -0
  509. package/clients/cli/commands/gap-report.doc.mjs +27 -15
  510. package/clients/cli/commands/gap-report.test.mjs +72 -0
  511. package/clients/cli/commands/hook/index.mjs +7 -17
  512. package/clients/cli/commands/hook.doc.mjs +1 -1
  513. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  514. package/clients/cli/commands/init.doc.mjs +24 -10
  515. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  516. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  517. package/clients/cli/commands/integration-add.doc.mjs +39 -13
  518. package/clients/cli/commands/integration-authoring.test.mjs +74 -19
  519. package/clients/cli/commands/integration-pack.doc.mjs +6 -10
  520. package/clients/cli/commands/integration-real-world.test.mjs +4 -10
  521. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  522. package/clients/cli/commands/integration.doc.mjs +5 -5
  523. package/clients/cli/commands/integration.mjs +75 -43
  524. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  525. package/clients/cli/commands/json-contract.test.mjs +33 -0
  526. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  527. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  528. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  529. package/clients/cli/commands/layout.doc.mjs +3 -3
  530. package/clients/cli/commands/layout.mjs +21 -9
  531. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  532. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  533. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  534. package/clients/cli/commands/manifest.doc.mjs +2 -2
  535. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  536. package/clients/cli/commands/search.doc.mjs +16 -6
  537. package/clients/cli/commands/search.mjs +49 -11
  538. package/clients/cli/commands/search.test.mjs +92 -0
  539. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  540. package/clients/cli/commands/swizzle.doc.mjs +4 -3
  541. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  542. package/clients/cli/commands/template.doc.mjs +53 -14
  543. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  544. package/clients/cli/commands/template.mjs +4 -91
  545. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  546. package/clients/cli/commands/text-json-parity.test.mjs +725 -0
  547. package/clients/cli/commands/theme-add.doc.mjs +5 -4
  548. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  549. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  550. package/clients/cli/commands/theme-palette-generate.doc.mjs +12 -7
  551. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  552. package/clients/cli/commands/theme-palette.doc.mjs +2 -3
  553. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  554. package/clients/cli/commands/theme-targets.doc.mjs +3 -3
  555. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  556. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  557. package/clients/cli/commands/theme.doc.mjs +3 -2
  558. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  559. package/clients/cli/commands/upgrade.doc.mjs +83 -12
  560. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  561. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  562. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  563. package/clients/cli/commands/upgrade.mjs +29 -7
  564. package/clients/cli/formatters/index.mjs +164 -1
  565. package/clients/cli/formatters/index.test.mjs +97 -0
  566. package/clients/cli/index.mjs +47 -34
  567. package/clients/cli/latest-version-env.test.mjs +50 -0
  568. package/clients/cli/lib/cli-error.test.mjs +7 -0
  569. package/clients/cli/lib/component-format.mjs +9 -9
  570. package/clients/cli/lib/component-format.test.mjs +1 -1
  571. package/clients/cli/lib/define-command.mjs +56 -6
  572. package/clients/cli/lib/define-command.test.mjs +54 -0
  573. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  574. package/clients/cli/lib/exit-codes.test.mjs +113 -0
  575. package/clients/cli/lib/hook-format.mjs +19 -10
  576. package/clients/cli/lib/json-shim.mjs +62 -16
  577. package/clients/cli/lib/json-shim.test.mjs +83 -0
  578. package/clients/cli/lib/manifest.d.ts +2 -0
  579. package/clients/cli/lib/manifest.mjs +53 -6
  580. package/clients/cli/lib/manifest.test.mjs +22 -2
  581. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  582. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  583. package/foundation/agent-docs/agent-docs.mjs +83 -13
  584. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  585. package/foundation/config/integration-debug.test.mjs +28 -3
  586. package/foundation/config/project-themes.test.mjs +11 -19
  587. package/foundation/config/project.d.mts +20 -11
  588. package/foundation/config/project.mjs +263 -91
  589. package/foundation/config/project.test.mjs +270 -21
  590. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  591. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  592. package/foundation/discovery/authoring-self-docs.test.mjs +174 -0
  593. package/foundation/discovery/authoring-surface.d.mts +74 -0
  594. package/foundation/discovery/authoring-surface.mjs +525 -0
  595. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  596. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  597. package/foundation/discovery/cli-self-docs.mjs +504 -0
  598. package/foundation/discovery/cli-self-docs.test.mjs +395 -0
  599. package/foundation/discovery/component-discovery.d.mts +39 -1
  600. package/foundation/discovery/component-discovery.mjs +50 -1
  601. package/foundation/discovery/component-loader.d.mts +35 -38
  602. package/foundation/discovery/component-loader.mjs +53 -222
  603. package/foundation/discovery/docs-discovery.d.mts +119 -11
  604. package/foundation/discovery/docs-discovery.mjs +427 -108
  605. package/foundation/discovery/docs-discovery.test.mjs +386 -20
  606. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  607. package/foundation/discovery/docs-output-budget.mjs +50 -0
  608. package/foundation/discovery/docs-section-key.d.mts +116 -0
  609. package/foundation/discovery/docs-section-key.mjs +322 -0
  610. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  611. package/foundation/discovery/template-adapter.d.mts +113 -11
  612. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  613. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  614. package/foundation/discovery/template-adapter.mjs +774 -83
  615. package/foundation/discovery/template-adapter.test.mjs +57 -0
  616. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  617. package/foundation/discovery/template-conflict-release.mjs +40 -0
  618. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  619. package/foundation/discovery/theme-discovery.d.mts +67 -7
  620. package/foundation/discovery/theme-discovery.mjs +916 -186
  621. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  622. package/foundation/discovery/theming-targets.test.mjs +4 -0
  623. package/foundation/doc-compiler/bundle.d.mts +47 -0
  624. package/foundation/doc-compiler/bundle.mjs +278 -0
  625. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  626. package/foundation/doc-compiler/compile.d.mts +343 -0
  627. package/foundation/doc-compiler/compile.mjs +558 -0
  628. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  629. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  630. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  631. package/foundation/doc-compiler/doc-loads.test.mjs +1643 -0
  632. package/foundation/doc-compiler/import.d.mts +24 -0
  633. package/foundation/doc-compiler/import.mjs +59 -0
  634. package/foundation/doc-compiler/inputs.d.mts +102 -0
  635. package/foundation/doc-compiler/inputs.mjs +291 -0
  636. package/foundation/doc-compiler/inputs.test.mjs +298 -0
  637. package/foundation/doc-compiler/ir.d.mts +22 -0
  638. package/foundation/doc-compiler/ir.mjs +471 -0
  639. package/foundation/doc-compiler/lenses.d.mts +36 -0
  640. package/foundation/doc-compiler/lenses.mjs +173 -0
  641. package/foundation/doc-compiler/links.d.mts +162 -0
  642. package/foundation/doc-compiler/links.mjs +294 -0
  643. package/foundation/doc-compiler/links.test.mjs +192 -0
  644. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  645. package/foundation/doc-compiler/overlays.d.mts +37 -0
  646. package/foundation/doc-compiler/overlays.mjs +206 -0
  647. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  648. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  649. package/foundation/doc-compiler/read.d.mts +127 -0
  650. package/foundation/doc-compiler/read.mjs +325 -0
  651. package/foundation/doc-compiler/read.test.mjs +313 -0
  652. package/foundation/doc-compiler/source.d.mts +33 -0
  653. package/foundation/doc-compiler/source.mjs +128 -0
  654. package/foundation/doc-compiler/tree.d.mts +292 -0
  655. package/foundation/doc-compiler/tree.mjs +881 -0
  656. package/foundation/fs/file-protection.d.mts +33 -0
  657. package/foundation/fs/file-protection.mjs +825 -0
  658. package/foundation/fs/file-protection.test.mjs +250 -0
  659. package/foundation/fs/module-loader.d.mts +1 -0
  660. package/foundation/fs/module-loader.mjs +50 -1
  661. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  662. package/foundation/fs/path-safety.d.mts +3 -2
  663. package/foundation/fs/path-safety.mjs +49 -19
  664. package/foundation/fs/path-safety.test.mjs +50 -0
  665. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  666. package/foundation/identity/provider-identity.d.mts +90 -0
  667. package/foundation/identity/provider-identity.mjs +320 -0
  668. package/foundation/identity/provider-identity.test.mjs +254 -0
  669. package/foundation/identity/providers.d.mts +7 -0
  670. package/foundation/identity/providers.mjs +16 -0
  671. package/foundation/integrations/autolink.d.mts +58 -1
  672. package/foundation/integrations/autolink.mjs +143 -45
  673. package/foundation/integrations/autolink.test.mjs +1 -1
  674. package/foundation/integrations/cli-requirement.d.mts +65 -0
  675. package/foundation/integrations/cli-requirement.mjs +189 -0
  676. package/foundation/integrations/cli-requirement.test.mjs +89 -0
  677. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  678. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  679. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  680. package/foundation/integrations/contribution-inventory.mjs +28 -25
  681. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  682. package/foundation/integrations/integration-warnings.d.mts +9 -2
  683. package/foundation/integrations/integration-warnings.mjs +52 -21
  684. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  685. package/foundation/integrations/integrations.d.mts +63 -3
  686. package/foundation/integrations/integrations.mjs +122 -9
  687. package/foundation/integrations/integrations.test.mjs +415 -1
  688. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  689. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  690. package/foundation/integrations/provider-resolution.d.mts +152 -0
  691. package/foundation/integrations/provider-resolution.mjs +576 -0
  692. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  693. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  694. package/foundation/integrations/theme-descriptor.mjs +44 -0
  695. package/foundation/integrations/validate-contributions.d.mts +2 -0
  696. package/foundation/integrations/validate-contributions.mjs +131 -29
  697. package/foundation/response/base.d.ts +8 -4
  698. package/foundation/response/batch.type.d.mts +33 -0
  699. package/foundation/response/batch.type.mjs +34 -0
  700. package/foundation/response/error-codes.d.mts +3 -1
  701. package/foundation/response/error-codes.d.ts +2 -0
  702. package/foundation/response/error-codes.doc.mjs +19 -12
  703. package/foundation/response/error-codes.mjs +8 -2
  704. package/foundation/response/error-codes.test.mjs +166 -14
  705. package/foundation/response/json-contract.test.mjs +57 -17
  706. package/foundation/response/json.d.mts +4 -2
  707. package/foundation/response/json.mjs +8 -10
  708. package/foundation/response/response-types.doc.d.mts +7 -2
  709. package/foundation/response/response-types.doc.mjs +69 -25
  710. package/foundation/response/response-types.doc.test.mjs +181 -0
  711. package/foundation/response/response.doc.mjs +12 -11
  712. package/foundation/text/string-utils.d.mts +8 -0
  713. package/foundation/text/string-utils.mjs +40 -10
  714. package/foundation/xle/expand.d.mts +2 -0
  715. package/foundation/xle/expand.mjs +4 -3
  716. package/foundation/xle/expand.test.mjs +54 -0
  717. package/foundation/xle/xle.test.mjs +13 -0
  718. package/package.json +10 -11
  719. package/api/docs/docs.test.mjs +0 -83
  720. package/api/docs/integrationDocs.test.mjs +0 -208
  721. package/api/search/search.test.mjs +0 -389
  722. package/assets/docs/cli-integrations.doc.mjs +0 -367
  723. package/assets/templates/themes/manifest.json +0 -95
  724. package/clients/cli/commands/docs.test.mjs +0 -102
  725. package/clients/cli/lib/update-check.mjs +0 -83
  726. package/clients/cli/lib/update-check.test.mjs +0 -137
  727. package/clients/cli/update-hint-commands.test.mjs +0 -54
  728. package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
@@ -2,10 +2,18 @@
2
2
 
3
3
  /**
4
4
  * @file Command-level coverage for `astryx doctor integration` authoring checks.
5
+ * @input Integration fixtures and the post-0.7 conflict projection.
6
+ * @output Assertions for human and typed command responses.
7
+ * @position CLI adapter coverage; 0.6.x API shape is verified separately.
5
8
  */
6
9
 
7
10
  import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
11
+
12
+ vi.mock('../../../foundation/discovery/template-conflict-release.mjs', () => ({
13
+ expandedTemplateConflictSchemaActive: () => true,
14
+ }));
8
15
  import * as fs from 'node:fs';
16
+ import * as os from 'node:os';
9
17
  import * as path from 'node:path';
10
18
  import {Command} from 'commander';
11
19
  import {discoverCoreTemplates} from '../../../foundation/discovery/template-adapter.mjs';
@@ -31,6 +39,8 @@ function writeIntegration({
31
39
  id,
32
40
  name = 'Integration template',
33
41
  missingRoot = false,
42
+ replacements,
43
+ type = 'page',
34
44
  }) {
35
45
  fs.writeFileSync(
36
46
  path.join(tmpDir, 'package.json'),
@@ -44,8 +54,8 @@ function writeIntegration({
44
54
  const stem = path.join(tmpDir, 'templates', id);
45
55
  fs.mkdirSync(path.dirname(stem), {recursive: true});
46
56
  fs.writeFileSync(
47
- `${stem}.template.mjs`,
48
- `export default {type: 'page', name: ${JSON.stringify(name)}, description: 'fixture'};\n`,
57
+ `${stem}.doc.mjs`,
58
+ `export default {type: '${type}', name: ${JSON.stringify(name)}, description: 'fixture'${replacements?.[id] == null ? '' : `, replaces: ${JSON.stringify(replacements[id])}`}};\n`,
49
59
  );
50
60
  fs.writeFileSync(
51
61
  `${stem}.tsx`,
@@ -124,7 +134,12 @@ describe('doctor integration — command', () => {
124
134
  return true;
125
135
  });
126
136
 
127
- await createProgram().parseAsync(['node', 'astryx', 'doctor', 'integration']);
137
+ await createProgram().parseAsync([
138
+ 'node',
139
+ 'astryx',
140
+ 'doctor',
141
+ 'integration',
142
+ ]);
128
143
 
129
144
  const output = writes.join('');
130
145
  expect(output).toContain('validate [package]');
@@ -136,7 +151,9 @@ describe('doctor integration — command', () => {
136
151
 
137
152
  it('explains the optional package argument in every leaf help', () => {
138
153
  const program = createProgram();
139
- const doctor = program.commands.find(command => command.name() === 'doctor');
154
+ const doctor = program.commands.find(
155
+ command => command.name() === 'doctor',
156
+ );
140
157
  const integration = doctor?.commands.find(
141
158
  command => command.name() === 'integration',
142
159
  );
@@ -152,7 +169,10 @@ describe('doctor integration — command', () => {
152
169
  });
153
170
 
154
171
  it('templates explains how to check an installed package when no local manifest exists', async () => {
155
- fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({name: 'plain'}));
172
+ fs.writeFileSync(
173
+ path.join(tmpDir, 'package.json'),
174
+ JSON.stringify({name: 'plain'}),
175
+ );
156
176
  process.chdir(tmpDir);
157
177
 
158
178
  await createProgram().parseAsync([
@@ -239,6 +259,71 @@ describe('doctor integration — command', () => {
239
259
  expect(process.exitCode).toBeUndefined();
240
260
  });
241
261
 
262
+ it('templates reports an intentional replacement and the Core-original command', async () => {
263
+ const core = (await discoverCoreTemplates()).find(
264
+ template => template.type === 'page',
265
+ );
266
+ expect(core).toBeDefined();
267
+ writeIntegration({
268
+ id: 'acme-app-shell',
269
+ type: core.type,
270
+ replacements: {'acme-app-shell': core.dirName},
271
+ });
272
+ process.chdir(tmpDir);
273
+
274
+ await createProgram().parseAsync([
275
+ 'node',
276
+ 'astryx',
277
+ '--json',
278
+ 'doctor',
279
+ 'integration',
280
+ 'templates',
281
+ ]);
282
+
283
+ const parsed = JSON.parse(logCalls.join('\n'));
284
+ expect(parsed.data.issues).toEqual([]);
285
+ expect(parsed.data.conflicts).toEqual([
286
+ expect.objectContaining({
287
+ id: 'acme-app-shell',
288
+ relationship: 'replaces',
289
+ replaces: core.dirName,
290
+ severity: 'info',
291
+ }),
292
+ ]);
293
+ expect(parsed.data.conflicts[0].command).toContain(
294
+ `--package @astryxdesign/core`,
295
+ );
296
+ expect(process.exitCode).toBeUndefined();
297
+ });
298
+
299
+ it('templates exits 1 for a missing replacement target', async () => {
300
+ writeIntegration({
301
+ id: 'acme-app-shell',
302
+ replacements: {'acme-app-shell': 'missing-core-shell'},
303
+ });
304
+ process.chdir(tmpDir);
305
+
306
+ await createProgram().parseAsync([
307
+ 'node',
308
+ 'astryx',
309
+ '--json',
310
+ 'doctor',
311
+ 'integration',
312
+ 'templates',
313
+ ]);
314
+
315
+ const parsed = JSON.parse(logCalls.join('\n'));
316
+ expect(parsed.data.issues).toEqual(
317
+ expect.arrayContaining([
318
+ expect.objectContaining({
319
+ code: 'missing_template_replacement_target',
320
+ severity: 'error',
321
+ }),
322
+ ]),
323
+ );
324
+ expect(process.exitCode).toBe(1);
325
+ });
326
+
242
327
  it('templates exits 1 when structural errors prevent a trustworthy check', async () => {
243
328
  writeIntegration({missingRoot: true});
244
329
  process.chdir(tmpDir);
@@ -260,6 +345,35 @@ describe('doctor integration — command', () => {
260
345
  expect(process.exitCode).toBe(1);
261
346
  });
262
347
 
348
+ it('components exits 1 when Core is missing, with no [ok] after the failure', async () => {
349
+ // Outside the repo, so nothing above the package resolves Core.
350
+ const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-no-core-'));
351
+ const previousTmp = tmpDir;
352
+ tmpDir = outside;
353
+ try {
354
+ writeComponentIntegration('AcmeCarousel');
355
+ expect(findCoreDir(outside)).toBeNull();
356
+ process.chdir(outside);
357
+
358
+ await createProgram().parseAsync([
359
+ 'node',
360
+ 'astryx',
361
+ 'doctor',
362
+ 'integration',
363
+ 'components',
364
+ ]);
365
+
366
+ const printed = logCalls.join('\n');
367
+ expect(printed).toContain('core_not_found');
368
+ expect(printed).not.toContain('[ok]');
369
+ expect(process.exitCode).toBe(1);
370
+ } finally {
371
+ tmpDir = previousTmp;
372
+ process.chdir(previousCwd);
373
+ fs.rmSync(outside, {recursive: true, force: true});
374
+ }
375
+ });
376
+
263
377
  it('components warns with the exact package-qualified command', async () => {
264
378
  const coreDir = findCoreDir(tmpDir);
265
379
  expect(coreDir).not.toBeNull();
@@ -278,9 +392,7 @@ describe('doctor integration — command', () => {
278
392
  const output = logCalls.join('\n');
279
393
  expect(output).toContain('[warn]');
280
394
  expect(output).toContain(core.name);
281
- expect(output).toContain(
282
- `component ${core.name} --package @acme/widgets`,
283
- );
395
+ expect(output).toContain(`component ${core.name} --package @acme/widgets`);
284
396
  expect(process.exitCode).toBeUndefined();
285
397
  });
286
398
 
@@ -351,6 +463,29 @@ describe('doctor integration — command', () => {
351
463
  expect(process.exitCode).toBeUndefined();
352
464
  });
353
465
 
466
+ it('docs exits 1 for a placement that hides a guide, with no [ok] after the failure', async () => {
467
+ writeDocIntegration({name: 'deploying'});
468
+ fs.writeFileSync(
469
+ path.join(tmpDir, 'docs', 'deploying.doc.mjs'),
470
+ "export default {type: 'generic', name: 'deploying', title: 'Deploying', description: 'Deploy.', placement: {parent: 'namespace:nope', slot: 'guides'}, sections: [{title: 'Deploy', content: [{type: 'prose', text: 'Deploy.'}]}]};\n",
471
+ );
472
+ process.chdir(tmpDir);
473
+
474
+ await createProgram().parseAsync([
475
+ 'node',
476
+ 'astryx',
477
+ 'doctor',
478
+ 'integration',
479
+ 'docs',
480
+ ]);
481
+
482
+ const printed = logCalls.join('\n');
483
+ expect(printed).toContain('[fail]');
484
+ expect(printed).toContain('invalid_doc_graph');
485
+ expect(printed).not.toContain('[ok]');
486
+ expect(process.exitCode).toBe(1);
487
+ });
488
+
354
489
  it('docs exits 1 for an accidental same-name Core topic', async () => {
355
490
  const [coreTopic] = Object.keys(discoverBuiltinTopics());
356
491
  writeDocIntegration({name: coreTopic});
@@ -12,11 +12,13 @@ export const doc = {
12
12
  type: 'command',
13
13
  name: 'doctor',
14
14
  displayName: 'astryx doctor',
15
- namespace: 'cli',
15
+ namespace: 'cli/commands',
16
16
  summary: 'Diagnose Astryx projects and integration packages',
17
17
  description:
18
18
  'Runs read-only project health diagnostics by default: Node version, @astryxdesign/core ' +
19
- 'install and version alignment, themes, config, agent docs, and package manager. ' +
19
+ 'install and version alignment, themes, config, integrations (linked without a config entry, ' +
20
+ 'provider identity, contribution issues), agent docs, core peer dependencies, package manager, ' +
21
+ "and the docs the CLI reads. It writes nothing, but loading astryx.config runs that file's code. " +
20
22
  'The `integration` subcommands provide authoring checks for one integration package.',
21
23
  fn: 'doctor',
22
24
  subcommands: ['integration'],
@@ -3,7 +3,12 @@
3
3
  /**
4
4
  * @file `astryx doctor` project health and integration-authoring diagnostics.
5
5
  * Human output uses plain stable tokens; every leaf also has a typed JSON
6
- * response. Exit 1 means a check found an error, while warnings remain exit 0.
6
+ * response. Template-conflict fields follow the package release boundary.
7
+ * Exit 1 means a check found an error, while warnings remain exit 0.
8
+ *
9
+ * @input Typed Doctor and integration-authoring API responses.
10
+ * @output Human-readable records or pass-through typed JSON.
11
+ * @position CLI presentation adapter for project and integration health.
7
12
  */
8
13
 
9
14
  import {runChecks} from '../../../api/doctor/doctor.mjs';
@@ -17,7 +22,7 @@ import {
17
22
  validateIntegration,
18
23
  } from '../../../api/integration/validate-integration.mjs';
19
24
  import {jsonOut} from '../../../foundation/response/json.mjs';
20
- import {emit, section, records, text} from '../formatters/index.mjs';
25
+ import {emit, section, record, records, text} from '../formatters/index.mjs';
21
26
  import {defineCommand} from '../lib/define-command.mjs';
22
27
  import {doc as doctorCommand} from './doctor.doc.mjs';
23
28
  import {doc as doctorIntegrationGroup} from './doctor-integration.doc.mjs';
@@ -31,6 +36,8 @@ import {doc as integrationTemplateConflictsFn} from '../../../api/integration/in
31
36
  import {doc as integrationComponentConflictsFn} from '../../../api/integration/integrationComponentConflicts.doc.mjs';
32
37
  import {doc as integrationDocConflictsFn} from '../../../api/integration/integrationDocConflicts.doc.mjs';
33
38
  import {NO_RESULT_SET} from '../../../foundation/debug/index.mjs';
39
+ import {cliError} from '../lib/cli-error.mjs';
40
+ import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
34
41
 
35
42
  const STATUS = {
36
43
  pass: '[ok]',
@@ -55,7 +62,7 @@ function integrationLabel(data) {
55
62
  * @param {import('../../../api/doctor/doctor.mjs').DoctorReport} report
56
63
  */
57
64
  function printHuman(report) {
58
- const {pass, warn, fail, info} = report.summary;
65
+ const {warn, fail} = report.summary;
59
66
  const closing =
60
67
  fail > 0
61
68
  ? 'Some checks failed. Address the items marked [fail] above.'
@@ -63,18 +70,15 @@ function printHuman(report) {
63
70
  ? 'No failures — but review the [warn] warnings above when you can.'
64
71
  : 'All checks passed. Your Astryx setup looks healthy.';
65
72
 
73
+ // Field names are the JSON keys, so text and --json map one to one.
66
74
  emit(
67
75
  section('astryx doctor — diagnosing your setup'),
68
76
  records(report.checks, {
69
- fields: ['status', 'label', 'message', 'fix'],
70
- labels: {label: 'check'},
77
+ fields: ['id', 'status', 'label', 'message', 'fix'],
71
78
  format: {status: statusToken},
72
79
  }),
73
- text(
74
- `Summary: ${pass} passed, ${warn} warning${warn === 1 ? '' : 's'}, ` +
75
- `${fail} failure${fail === 1 ? '' : 's'}` +
76
- (info ? `, ${info} info` : ''),
77
- ),
80
+ section('summary'),
81
+ record(report.summary, {fields: ['pass', 'warn', 'fail', 'info']}),
78
82
  text(closing),
79
83
  );
80
84
  }
@@ -128,25 +132,41 @@ function printTemplateConflicts(data) {
128
132
  ),
129
133
  ...issueBlocks(data.issues),
130
134
  ];
131
- if (data.conflicts.length === 0) {
135
+ if (data.conflicts.length === 0 && data.issues.length === 0) {
132
136
  output.push(text('[ok] No template ids conflict with Core.'));
133
- } else {
137
+ } else if (data.conflicts.length > 0) {
138
+ const expanded = data.conflicts.some(
139
+ conflict => 'relationship' in conflict,
140
+ );
134
141
  output.push(
135
142
  records(data.conflicts, {
136
- fields: [
137
- 'severity',
138
- 'id',
139
- 'integrationPackage',
140
- 'integrationType',
141
- 'integrationName',
142
- 'message',
143
- 'command',
144
- ],
143
+ fields: expanded
144
+ ? [
145
+ 'severity',
146
+ 'relationship',
147
+ 'id',
148
+ 'replaces',
149
+ 'integrationPackage',
150
+ 'integrationType',
151
+ 'integrationName',
152
+ 'message',
153
+ 'command',
154
+ ]
155
+ : [
156
+ 'severity',
157
+ 'id',
158
+ 'integrationPackage',
159
+ 'integrationType',
160
+ 'integrationName',
161
+ 'message',
162
+ 'command',
163
+ ],
145
164
  format: {severity: statusToken},
146
165
  }),
147
166
  text(
148
- `${data.conflicts.length} Core template conflict(s). ` +
149
- 'Renaming is recommended but optional; keep the package-qualified command if the overlap is intentional.',
167
+ expanded
168
+ ? `${data.conflicts.length} Core template relationship(s).`
169
+ : `${data.conflicts.length} Core template conflict(s). Renaming is recommended but optional; keep the package-qualified command if the overlap is intentional.`,
150
170
  ),
151
171
  );
152
172
  }
@@ -163,12 +183,20 @@ function printComponentConflicts(data) {
163
183
  ),
164
184
  ...issueBlocks(data.issues),
165
185
  ];
186
+ // An [ok] after a failed check reads as a pass: say nothing it could not check.
187
+ const failed = data.issues.some(issue => issue.severity === 'error');
166
188
  if (data.conflicts.length === 0) {
167
- output.push(text('[ok] No component names conflict with Core.'));
189
+ if (!failed) output.push(text('[ok] No component names conflict with Core.'));
168
190
  } else {
169
191
  output.push(
170
192
  records(data.conflicts, {
171
- fields: ['severity', 'name', 'integrationPackage', 'message', 'command'],
193
+ fields: [
194
+ 'severity',
195
+ 'name',
196
+ 'integrationPackage',
197
+ 'message',
198
+ 'command',
199
+ ],
172
200
  format: {severity: statusToken},
173
201
  }),
174
202
  text(
@@ -190,8 +218,19 @@ function printDocConflicts(data) {
190
218
  ),
191
219
  ...issueBlocks(data.issues),
192
220
  ];
221
+ if (
222
+ !data.issues.some(
223
+ issue => issue.severity === 'error' || issue.code === 'invalid_doc_graph',
224
+ )
225
+ ) {
226
+ output.push(
227
+ text('[ok] The docs tree and every link in these docs check out.'),
228
+ );
229
+ }
193
230
  if (data.findings.length === 0) {
194
- output.push(text('[ok] No doc topics overlap with Core.'));
231
+ if (!data.issues.some(issue => issue.severity === 'error')) {
232
+ output.push(text('[ok] No doc topics overlap with Core.'));
233
+ }
195
234
  } else {
196
235
  output.push(
197
236
  records(data.findings, {
@@ -275,32 +314,64 @@ async function runAuthoringCheck(program, pkg, kind) {
275
314
  const structuralErrors = summarizeIssues(result.data.issues).errors;
276
315
  const docErrors =
277
316
  result.type === 'integration.doc-conflicts'
278
- ? result.data.findings.filter(finding => finding.severity === 'error').length
317
+ ? result.data.findings.filter(finding => finding.severity === 'error')
318
+ .length
279
319
  : 0;
280
320
  if (structuralErrors > 0 || docErrors > 0) process.exitCode = 1;
281
321
  return NO_RESULT_SET;
282
322
  }
283
323
 
324
+ /**
325
+ * The first word after a command group, which names a subcommand it does not
326
+ * have, or null.
327
+ * @param {import('commander').Command | undefined} invoked
328
+ * @returns {string | null}
329
+ */
330
+ function unknownWord(invoked) {
331
+ const word = (invoked?.args ?? []).find(arg => !String(arg).startsWith('-'));
332
+ return word == null ? null : String(word);
333
+ }
334
+
335
+ /**
336
+ * Report an unknown subcommand, in text as in JSON, with the ones the group has.
337
+ * @param {import('commander').Command} group
338
+ * @param {string} label the group's full name
339
+ * @param {string} word
340
+ */
341
+ function unknownSubcommand(group, label, word) {
342
+ return cliError(`unknown subcommand '${label} ${word}'`, {
343
+ suggestions: group.commands.map(child => ({
344
+ name: child.name(),
345
+ reason: 'available subcommand',
346
+ })),
347
+ code: ERROR_CODES.ERR_UNKNOWN_SUBCOMMAND,
348
+ });
349
+ }
350
+
284
351
  /**
285
352
  * Register `astryx doctor` and its integration-authoring leaves.
286
353
  * @param {import('commander').Command} program
287
354
  */
288
355
  export function registerDoctor(program) {
289
- const doctorCmd = defineCommand(program, doctorCommand, {
356
+ /** @type {import('commander').Command} */
357
+ let doctorCmd;
358
+ doctorCmd = defineCommand(program, doctorCommand, {
290
359
  fn: doctorFn,
291
- action: async () => runProjectDoctor(program),
360
+ // `doctor integrations` is a mistyped subcommand, not a project check.
361
+ action: async (options, invoked) => {
362
+ const word = unknownWord(invoked);
363
+ if (word != null) return unknownSubcommand(doctorCmd, 'doctor', word);
364
+ return runProjectDoctor(program);
365
+ },
292
366
  });
293
- doctorCmd.addHelpText(
294
- 'after',
295
- '\nExit code:\n' +
296
- ' 0 no failures (warnings are allowed) — safe as a CI gate\n' +
297
- ' 1 one or more checks failed\n',
298
- );
299
-
300
367
  /** @type {import('commander').Command} */
301
368
  let integrationCmd;
302
369
  integrationCmd = defineCommand(doctorCmd, doctorIntegrationGroup, {
303
- action: () => {
370
+ action: (options, invoked) => {
371
+ const word = unknownWord(invoked);
372
+ if (word != null) {
373
+ return unknownSubcommand(integrationCmd, 'doctor integration', word);
374
+ }
304
375
  integrationCmd.outputHelp();
305
376
  return NO_RESULT_SET;
306
377
  },
@@ -354,3 +354,45 @@ describe('doctor — command', () => {
354
354
  }
355
355
  });
356
356
  });
357
+
358
+ describe('doctor — text output mirrors the JSON', () => {
359
+ /** @param {string} line */
360
+ const field = line => /^(\w+):\s+(.*)$/.exec(line)?.slice(1) ?? [line, ''];
361
+
362
+ it('prints every check and summary field under its JSON key', async () => {
363
+ const prevCwd = process.cwd();
364
+ const prevExit = process.exitCode;
365
+ process.chdir(tmpDir);
366
+ try {
367
+ await createProgram().parseAsync(['node', 'astryx', '--json', 'doctor']);
368
+ const {checks, summary} = JSON.parse(logCalls.join('\n')).data;
369
+ logCalls = [];
370
+ await createProgram().parseAsync(['node', 'astryx', 'doctor']);
371
+ const blocks = logCalls
372
+ .join('\n')
373
+ .split(/\n{2,}/)
374
+ .map(block => block.split('\n').map(field));
375
+
376
+ for (const check of checks) {
377
+ const block = blocks.find(fields =>
378
+ fields.some(([key, value]) => key === 'id' && value === check.id),
379
+ );
380
+ expect(block, `no text record for check ${check.id}`).toBeDefined();
381
+ expect(
382
+ /** @type {string[][]} */ (block).map(([key]) => key).sort(),
383
+ ).toEqual(Object.keys(check).sort());
384
+ }
385
+
386
+ const heading = blocks.findIndex(
387
+ fields => fields.length === 1 && fields[0][0] === 'summary',
388
+ );
389
+ expect(heading, 'no summary section').toBeGreaterThan(-1);
390
+ expect(blocks[heading + 1]).toEqual(
391
+ Object.entries(summary).map(([key, count]) => [key, String(count)]),
392
+ );
393
+ } finally {
394
+ process.chdir(prevCwd);
395
+ process.exitCode = prevExit;
396
+ }
397
+ }, 60_000);
398
+ });
@@ -10,54 +10,66 @@ export const doc = {
10
10
  type: 'command',
11
11
  name: 'gap-report',
12
12
  displayName: 'astryx gap-report',
13
- namespace: 'cli',
14
- summary: 'Route a design-system gap to its owning package',
13
+ namespace: 'cli/commands',
14
+ summary: 'Report a missing component or feature to the package that owns it',
15
15
  description:
16
- 'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability. The command selects an explicit package first, then a unique component owner, then Core. The report fans out to every effective handler: project config first, then each loaded integration in config order. Public handlers require --confirm-public per handler; internal handlers always run. A handler failure is isolated and does not prevent later handlers.',
16
+ 'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability to the package that owns it: the --package you name, else the one package that provides the component, else Core. ' +
17
+ 'Every configured handler receives the report: the project config handler first, then each integration handler in config order. Public handlers run only with --confirm-public; internal handlers always run. A failing handler does not stop the others. ' +
18
+ "With no handler it files a GitHub issue for the owning package, only with --confirm-public (without it nothing is sent), or returns the package's issues URL when that is not on GitHub. " +
19
+ 'The report records whether an agent or a person ran it.',
17
20
  fn: 'gapReport',
18
- args: [{name: 'component', param: 'component', required: false}],
21
+ args: [
22
+ {
23
+ name: 'component',
24
+ param: 'component',
25
+ required: false,
26
+ description:
27
+ 'Component or design-system area the gap is about, up to 120 characters. Required unless --list-categories is set.',
28
+ },
29
+ ],
19
30
  options: [
20
31
  {
21
32
  flag: '--category <category>',
22
33
  param: 'options.category',
23
- description: 'Gap category (run --list-categories for values)',
34
+ description:
35
+ 'Gap category (run --list-categories for values). Required unless --list-categories is set.',
24
36
  },
25
37
  {
26
38
  flag: '--reason <reason>',
27
39
  param: 'options.reason',
28
- description: 'What capability was missing or difficult',
40
+ description:
41
+ 'What capability was missing or difficult, up to 2000 characters. Required unless --list-categories is set.',
29
42
  },
30
43
  {
31
44
  flag: '--additional-context <text>',
32
45
  param: 'options.detail',
33
- description: 'Optional additional context',
46
+ description: 'Optional additional context, up to 8000 characters',
34
47
  },
35
48
  {
36
49
  flag: '--package <pkg>',
37
50
  param: 'options.package',
38
- description: 'Route to a specific loaded package',
51
+ description:
52
+ 'Package that owns the gap: @astryxdesign/core or a loaded integration. Overrides automatic routing; needed when more than one package provides the component',
39
53
  },
40
54
  {
41
55
  flag: '--confirm-public',
42
56
  param: 'options.confirmPublic',
43
- description: 'Consent to public handlers or GitHub issue creation',
57
+ description:
58
+ 'Allow public delivery: public handlers run, and with no handler it files a GitHub issue with your gh login',
44
59
  },
45
60
  {
46
61
  flag: '--list-categories',
47
62
  param: 'options.listCategories',
48
- description: 'List valid report categories without filing',
63
+ description:
64
+ 'List valid report categories without filing; the component and the other gap-report options are ignored',
49
65
  },
50
66
  ],
51
67
  examples: [
52
68
  {label: 'List categories', cli: 'astryx gap-report --list-categories'},
53
69
  {
54
- label: 'Route an agent report',
70
+ label: 'Prepare a report (nothing public happens without --confirm-public)',
55
71
  cli: "astryx gap-report Button --category missing_variant --reason 'Need a compact size'",
56
72
  },
57
- {
58
- label: 'Confirm public filing',
59
- cli: "astryx gap-report Button --category docs_gap --reason 'Missing keyboard example' --confirm-public",
60
- },
61
73
  ],
62
74
  exitCodes: [
63
75
  {
@@ -196,3 +196,75 @@ export default {};\n`,
196
196
  });
197
197
  });
198
198
  });
199
+
200
+ describe('gap-report control docs', () => {
201
+ const REQUIRED = 'Required unless --list-categories is set.';
202
+
203
+ it('help and manifest say which inputs are required and how long they may be', async () => {
204
+ const help = await runCli(['gap-report', '--help']);
205
+ expect(help.status).toBe(0);
206
+ const manifest = JSON.parse((await runCli(['manifest', '--json'])).stdout);
207
+ const entry = manifest.data.commands.find(
208
+ (/** @type {{name: string}} */ command) => command.name === 'gap-report',
209
+ );
210
+ /** @param {string} flag @returns {string} */
211
+ const option = flag =>
212
+ entry.options.find(
213
+ (/** @type {{flag: string}} */ item) => item.flag.split(' ')[0] === flag,
214
+ )?.description ?? '';
215
+ const component = entry.arguments[0].description;
216
+
217
+ for (const text of [component, option('--category'), option('--reason')]) {
218
+ expect(text).toContain(REQUIRED);
219
+ expect(help.stdout).toContain(text);
220
+ }
221
+ expect(option('--list-categories')).toContain(
222
+ 'the component and the other gap-report options are ignored',
223
+ );
224
+
225
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-gap-limits-'));
226
+ try {
227
+ fs.writeFileSync(
228
+ path.join(cwd, 'package.json'),
229
+ JSON.stringify({name: 'fixture-app'}),
230
+ );
231
+ const base = {cwd, category: /** @type {const} */ ('docs_gap'), reason: 'x'};
232
+ /** @type {Array<[string, (value: string) => Promise<unknown>]>} */
233
+ const limits = [
234
+ [component, value => gapReport(value, base)],
235
+ [option('--reason'), value => gapReport('Button', {...base, reason: value})],
236
+ [
237
+ option('--additional-context'),
238
+ value => gapReport('Button', {...base, detail: value}),
239
+ ],
240
+ ];
241
+ for (const [text, call] of limits) {
242
+ const limit = Number(/up to (\d+) characters/.exec(text)?.[1]);
243
+ expect(limit, text).toBeGreaterThan(0);
244
+ await expect(call('x'.repeat(limit))).resolves.toMatchObject({
245
+ type: 'gap-report.file',
246
+ });
247
+ await expect(call('x'.repeat(limit + 1))).rejects.toMatchObject({
248
+ code: 'ERR_INVALID_ARGUMENT',
249
+ });
250
+ }
251
+ } finally {
252
+ fs.rmSync(cwd, {recursive: true, force: true});
253
+ }
254
+ });
255
+
256
+ it('enforces the documented requirement', async () => {
257
+ for (const [component, options] of [
258
+ [undefined, {category: 'docs_gap', reason: 'x'}],
259
+ ['Button', {reason: 'x'}],
260
+ ['Button', {category: 'docs_gap'}],
261
+ ]) {
262
+ await expect(gapReport(component, options)).rejects.toMatchObject({
263
+ code: 'ERR_MISSING_ARGUMENT',
264
+ });
265
+ }
266
+ await expect(
267
+ gapReport(undefined, {listCategories: true, category: 'not_real', package: 'nope'}),
268
+ ).resolves.toMatchObject({type: 'gap-report.categories'});
269
+ });
270
+ });