@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
@@ -3,19 +3,38 @@
3
3
  /**
4
4
  * @file docs command — Print Astryx reference docs
5
5
  *
6
- * Auto-discovers .doc.mjs files from the docs/ directory.
7
- * Supports --detail (full|compact|brief) and --lang (en|zh|dense).
6
+ * In text, every read is one level: a topic lists its sections, so a reader can
7
+ * open one section by its key, and `--full` prints the whole topic. `--json`
8
+ * keeps the docs() contract: a topic returns its whole doc, and `--index` its
9
+ * sections.
10
+ * Supports --detail (full|compact|brief) and --lang (en|zh|dense). A code
11
+ * block's label prints above its fence, and table cells escape their pipes.
8
12
  *
9
13
  * Usage:
10
14
  * astryx docs List available topics
11
- * astryx docs <topic> Print full doc
15
+ * astryx docs <topic> List the topic's sections (a topic
16
+ * with one section prints whole)
12
17
  * astryx docs <topic> <section> Print one section
18
+ * astryx docs <topic> --full Print the whole topic
19
+ * astryx docs <route> Open a node of the docs tree, such as
20
+ * cli, cli/api, or cli/api/functions/search
13
21
  */
14
22
 
15
- import {getCliInvocation} from '../../../foundation/env/package-manager.mjs';
23
+ import {
24
+ formatCliCommand,
25
+ getCliInvocation,
26
+ } from '../../../foundation/env/package-manager.mjs';
16
27
  import {jsonOut} from '../../../foundation/response/json.mjs';
17
- import {emit, section, records, text, code} from '../formatters/index.mjs';
28
+ import {
29
+ emit,
30
+ section,
31
+ records,
32
+ text,
33
+ code,
34
+ wrapText,
35
+ } from '../formatters/index.mjs';
18
36
  import {cliError} from '../lib/cli-error.mjs';
37
+ import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
19
38
  import {defineCommand} from '../lib/define-command.mjs';
20
39
  import {resultSet} from '../../../foundation/debug/index.mjs';
21
40
  import {docs as docsApi} from '../../../api/docs/docs.mjs';
@@ -24,21 +43,35 @@ import {doc as docsFn} from '../../../api/docs/docs.doc.mjs';
24
43
 
25
44
  // ─── Formatting ──────────────────────────────────────────────────────────────
26
45
 
46
+ /**
47
+ * A table cell with its pipes escaped. Columns are separated by ` | `, and a
48
+ * union type such as `'light' | 'dark'` is spelled with the same character,
49
+ * so an unescaped cell reads as extra columns. `astryx component` escapes its
50
+ * prop tables the same way.
51
+ * @param {string | undefined} cell
52
+ * @returns {string}
53
+ */
54
+ function tableCell(cell) {
55
+ return (cell || '').replaceAll('|', '\\|');
56
+ }
57
+
27
58
  /**
28
59
  * @param {string[]} headers
29
60
  * @param {string[][]} rows
30
61
  * @returns {string}
31
62
  */
32
63
  function formatTable(headers, rows) {
33
- const widths = headers.map((h, i) =>
34
- Math.max(h.length, ...rows.map(r => (r[i] || '').length)),
64
+ const head = headers.map(tableCell);
65
+ const cells = rows.map(r => r.map(tableCell));
66
+ const widths = head.map((h, i) =>
67
+ Math.max(h.length, ...cells.map(r => (r[i] || '').length)),
35
68
  );
36
69
  const sep = widths.map(w => '-'.repeat(w)).join(' | ');
37
- const head = headers.map((h, i) => h.padEnd(widths[i])).join(' | ');
38
- const body = rows
39
- .map(r => r.map((c, i) => (c || '').padEnd(widths[i])).join(' | '))
70
+ const top = head.map((h, i) => h.padEnd(widths[i])).join(' | ');
71
+ const body = cells
72
+ .map(r => r.map((c, i) => c.padEnd(widths[i])).join(' | '))
40
73
  .join('\n');
41
- return `${head}\n${sep}\n${body}`;
74
+ return `${top}\n${sep}\n${body}`;
42
75
  }
43
76
 
44
77
  /**
@@ -47,15 +80,19 @@ function formatTable(headers, rows) {
47
80
  * @returns {string}
48
81
  */
49
82
  function formatTableCompact(headers, rows) {
50
- return rows.map(r => r.join(' = ')).join('\n');
83
+ // An empty cell, such as a Default with none, adds nothing to the line.
84
+ return rows
85
+ .map(r => r.filter(cell => String(cell ?? '').trim() !== '').join(' = '))
86
+ .join('\n');
51
87
  }
52
88
 
53
89
  /**
90
+ * One content block as text. Exported for its tests.
54
91
  * @param {import('@astryxdesign/cli/authoring').ReferenceContentBlock} block
55
92
  * @param {'full' | 'compact' | 'brief'} detail
56
93
  * @returns {string | null}
57
94
  */
58
- function formatBlock(block, detail) {
95
+ export function formatBlock(block, detail) {
59
96
  switch (block.type) {
60
97
  case 'prose':
61
98
  return block.text;
@@ -66,13 +103,20 @@ function formatBlock(block, detail) {
66
103
  case 'code':
67
104
  if (detail === 'compact' || detail === 'brief') return null;
68
105
  {
69
- const label = block.label ? `// ${block.label}\n` : '';
70
- return `\`\`\`${block.lang}\n${label}${block.code}\n\`\`\``;
106
+ // The label names the block, so it prints above the fence, not
107
+ // inside it: `// label` is not a comment in bash, CSS, JSON, or
108
+ // HTML, and a reader who copies the block would copy it too.
109
+ const label = block.label
110
+ ? `${block.label.replace(/:\s*$/, '')}:\n`
111
+ : '';
112
+ return `${label}\`\`\`${block.lang}\n${block.code}\n\`\`\``;
71
113
  }
72
114
 
73
115
  case 'table':
74
116
  if (detail === 'brief') {
75
- return block.rows.map(r => r.slice(0, 2).join('=')).join(' | ');
117
+ return block.rows
118
+ .map(r => r.slice(0, 2).map(tableCell).join('='))
119
+ .join(' | ');
76
120
  }
77
121
  if (detail === 'compact') {
78
122
  return formatTableCompact(block.headers, block.rows);
@@ -80,10 +124,14 @@ function formatBlock(block, detail) {
80
124
  return formatTable(block.headers, block.rows);
81
125
 
82
126
  case 'list': {
83
- const prefix = block.style === 'ordered' ? (/** @type {number} */ i) => `${i + 1}. `
84
- : block.style === 'dont' ? () => 'x '
85
- : block.style === 'do' ? () => '+ '
86
- : () => '- ';
127
+ const prefix =
128
+ block.style === 'ordered'
129
+ ? (/** @type {number} */ i) => `${i + 1}. `
130
+ : block.style === 'dont'
131
+ ? () => 'x '
132
+ : block.style === 'do'
133
+ ? () => '+ '
134
+ : () => '- ';
87
135
  return block.items.map((item, i) => `${prefix(i)}${item}`).join('\n');
88
136
  }
89
137
 
@@ -93,7 +141,7 @@ function formatBlock(block, detail) {
93
141
  }
94
142
 
95
143
  /**
96
- * @param {import('@astryxdesign/cli/authoring').ReferenceSection} section
144
+ * @param {import('../../../api/docs/docs.type.mjs').DocsReadSection} section
97
145
  * @param {'full' | 'compact' | 'brief'} detail
98
146
  * @returns {string}
99
147
  */
@@ -107,12 +155,13 @@ function formatSection(section, detail) {
107
155
  return `${section.title}: ${first.split('\n')[0]}`;
108
156
  }
109
157
 
110
- const heading = detail === 'compact' ? `[${section.title}]` : `## ${section.title}`;
158
+ const heading =
159
+ detail === 'compact' ? `[${section.title}]` : `## ${section.title}`;
111
160
  return `${heading}\n\n${blocks.join('\n\n')}`;
112
161
  }
113
162
 
114
163
  /**
115
- * @param {import('@astryxdesign/cli/authoring').ReferenceDoc} docs
164
+ * @param {import('../../../api/docs/docs.type.mjs').DocsReadDoc} docs
116
165
  * @param {'full' | 'compact' | 'brief'} detail
117
166
  * @returns {string}
118
167
  */
@@ -123,22 +172,146 @@ function formatReferenceFull(docs, detail) {
123
172
  return `${header}\n${sections.join('\n')}`;
124
173
  }
125
174
 
126
- const header = detail === 'compact'
127
- ? `# ${docs.title}\n${docs.description}`
128
- : `# ${docs.title}\n\n${docs.description}`;
175
+ const header =
176
+ detail === 'compact'
177
+ ? `# ${docs.title}\n${docs.description}`
178
+ : `# ${docs.title}\n\n${docs.description}`;
129
179
  const sections = docs.sections.map(s => formatSection(s, detail));
130
180
  const sep = detail === 'compact' ? '\n\n' : '\n\n';
131
181
  return `${header}\n\n${sections.join(sep)}`;
132
182
  }
133
183
 
184
+ /**
185
+ * The moves a read offers (spec:AST-047), one runnable command per line: up to
186
+ * the level it sits in, the item before and after it, and the docs it names.
187
+ * @param {import('../../../api/docs/docs.type.mjs').DocsLinks | undefined} links
188
+ * @returns {string[]}
189
+ */
190
+ function linkLines(links) {
191
+ if (!links) return [];
192
+ return [
193
+ `Up: ${formatCliCommand(links.up)}`,
194
+ ...(links.previous ? [`Previous: ${formatCliCommand(links.previous)}`] : []),
195
+ ...(links.next ? [`Next: ${formatCliCommand(links.next)}`] : []),
196
+ ...(links.related ?? []).map(
197
+ (command, i) => `${i === 0 ? 'Related: ' : ' '}${formatCliCommand(command)}`,
198
+ ),
199
+ ];
200
+ }
201
+
202
+ /**
203
+ * A topic's section index: what the topic is, one line per section with the
204
+ * key to read it by, and how to read further.
205
+ * @param {import('../../../api/docs/docs.type.mjs').DocsIndex} index
206
+ * @param {string} run
207
+ */
208
+ function emitIndex(index, run) {
209
+ emit(
210
+ section(
211
+ index.title,
212
+ index.description ? wrapText(index.description) : undefined,
213
+ ),
214
+ // Summaries wrap rather than being cut: the summary is how a reader picks
215
+ // the one section to open.
216
+ records(index.sections, {
217
+ fields: ['id', 'title', 'summary'],
218
+ layout: 'inline',
219
+ }),
220
+ text(
221
+ [
222
+ `Read one section: ${run} docs ${index.name} <section>`,
223
+ `Read everything: ${run} docs ${index.name} --full`,
224
+ ...linkLines(index.links),
225
+ ].join('\n'),
226
+ ),
227
+ );
228
+ }
229
+
230
+ /**
231
+ * One child row of a namespace. Namespace and guide route names are already
232
+ * readable, so repeating their titles adds noise (`start-a-template Start a
233
+ * template`). Typed docs keep a distinct title when it carries the real symbol
234
+ * name (`assert-response assertResponse()`).
235
+ * @param {import('../../../api/docs/docs.type.mjs').DocsNodeChild} child
236
+ * @returns {{name: string, summary: string}}
237
+ */
238
+ function childRow(child) {
239
+ const titleAddsIdentity =
240
+ child.kind !== 'namespace' &&
241
+ child.kind !== 'generic' &&
242
+ child.title !== child.name;
243
+ return {
244
+ name: child.name,
245
+ summary: titleAddsIdentity
246
+ ? `${child.title}: ${child.summary}`
247
+ : child.summary,
248
+ };
249
+ }
250
+
251
+ /**
252
+ * One node of the docs tree. A namespace lists each slot's children, one level
253
+ * down, with the command to open one; a typed doc prints its content. Both end
254
+ * with the way back up.
255
+ * @param {import('../../../api/docs/docs.type.mjs').DocsNode} node
256
+ * @param {'full' | 'compact' | 'brief'} detail
257
+ * @param {string} run
258
+ */
259
+ function emitNode(node, detail, run) {
260
+ if (node.kind === 'namespace') {
261
+ emit(
262
+ section(node.title, wrapText(node.summary)),
263
+ // A namespace may author intro `blocks`; they render above its children.
264
+ ...(node.content?.length
265
+ ? [
266
+ text(
267
+ node.content
268
+ .map(b => formatBlock(b, detail))
269
+ .filter(Boolean)
270
+ .join('\n\n'),
271
+ ),
272
+ ]
273
+ : []),
274
+ ...node.slots.flatMap(slot => [
275
+ // A namespace with one slot titled like itself needs no second heading.
276
+ ...(node.slots.length === 1 && slot.title === node.title
277
+ ? []
278
+ : [section(slot.title)]),
279
+ records(slot.children.map(childRow), {
280
+ fields: ['name', 'summary'],
281
+ layout: 'inline',
282
+ }),
283
+ ]),
284
+ text(
285
+ [
286
+ // A child's route is its parent's route and its name, except a flat
287
+ // topic in the Unorganized level, which keeps its own name.
288
+ node.slots.every(slot =>
289
+ slot.children.every(child => child.route.startsWith(`${node.route}/`)),
290
+ )
291
+ ? `Open one: ${run} docs ${node.route}/<name>`
292
+ : `Open one: ${run} docs <name>`,
293
+ ...linkLines(node.links),
294
+ ].join('\n'),
295
+ ),
296
+ );
297
+ return;
298
+ }
299
+ emit(
300
+ code(formatSection({title: node.title, content: node.content}, detail)),
301
+ text(linkLines(node.links).join('\n')),
302
+ );
303
+ }
304
+
134
305
  /**
135
306
  * What the run answered with. A named topic (or one of its sections) resolves
136
307
  * or throws, so it is always a direct match of one doc; the bare form lists
137
308
  * every topic there is.
138
309
  *
139
310
  * @param {import('../../../api/docs/docs.type.mjs').DocsListResponse
311
+ * | import('../../../api/docs/docs.type.mjs').DocsIndexResponse
140
312
  * | import('../../../api/docs/docs.type.mjs').DocsDetailResponse
141
- * | import('../../../api/docs/docs.type.mjs').DocsDetailSectionResponse} result
313
+ * | import('../../../api/docs/docs.type.mjs').DocsDetailSectionResponse
314
+ * | import('../../../api/docs/docs.type.mjs').DocsNodeResponse} result
142
315
  * @returns {import('../../../foundation/debug/command-result.mjs').CommandResult}
143
316
  */
144
317
  function summarize(result) {
@@ -155,7 +328,11 @@ function summarize(result) {
155
328
  export function registerDocs(program) {
156
329
  defineCommand(program, docsCommand, {
157
330
  fn: docsFn,
158
- action: async (/** @type {string | undefined} */ topic, /** @type {string | undefined} */ sectionName) => {
331
+ action: async (
332
+ /** @type {string | undefined} */ topic,
333
+ /** @type {string | undefined} */ sectionName,
334
+ /** @type {{index?: boolean, full?: boolean}} */ options = {},
335
+ ) => {
159
336
  const run = getCliInvocation();
160
337
  const lang = program.opts().lang || null;
161
338
  const zh = program.opts().zh || false;
@@ -163,13 +340,42 @@ export function registerDocs(program) {
163
340
  const detail = program.opts().detail || 'full';
164
341
  const json = program.opts().json || false;
165
342
 
343
+ if (options.index && options.full) {
344
+ return cliError(
345
+ 'Ask for the section list or the whole topic, not both: --index and --full cannot both be set.',
346
+ {code: ERROR_CODES.ERR_INVALID_ARGUMENT},
347
+ );
348
+ }
349
+ // Text reads one level: a topic lists its sections (one with a single
350
+ // section prints whole). JSON keeps docs(): the whole topic unless
351
+ // --index. The dense variant is written to be read whole.
352
+ const listSections =
353
+ Boolean(options.index) ||
354
+ (!json &&
355
+ !options.full &&
356
+ !dense &&
357
+ lang !== 'dense' &&
358
+ sectionName == null);
166
359
  let result;
167
360
  try {
168
- result = await docsApi(topic, sectionName, {lang, zh, dense});
361
+ result = await docsApi(topic, sectionName, {
362
+ lang,
363
+ zh,
364
+ dense,
365
+ index: listSections,
366
+ });
367
+ if (
368
+ !options.index &&
369
+ result.type === 'docs.index' &&
370
+ result.data.sections.length <= 1
371
+ ) {
372
+ result = await docsApi(topic, sectionName, {lang, zh, dense});
373
+ }
169
374
  } catch (e) {
170
375
  // docs API throws structured errors with {name, reason} suggestions —
171
376
  // pass them through untouched so the CLI envelope matches the API.
172
- const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
377
+ const err =
378
+ /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
173
379
  return cliError(err.message, {
174
380
  suggestions: err.suggestions || [],
175
381
  code: err.code,
@@ -184,28 +390,79 @@ export function registerDocs(program) {
184
390
 
185
391
  switch (result.type) {
186
392
  case 'docs.list': {
187
- // The text view mirrors the JSON list: one record per topic (topic +
188
- // description), then the usage footer as plain prose.
393
+ // The text view mirrors the JSON list, with the docs tree's
394
+ // namespaces (`meta.namespaces`) first under their own heading: that
395
+ // is where the CLI's own docs start, and a namespace reads
396
+ // differently from a topic.
397
+ const namespaces = result.meta?.namespaces ?? [];
398
+ const topics = result.data;
189
399
  emit(
190
- section('Available docs'),
191
- records(result.data, {fields: ['topic', 'description']}),
400
+ ...(namespaces.length > 0
401
+ ? [
402
+ section('Docs tree'),
403
+ records(namespaces, {
404
+ fields: ['topic', 'description', 'package'],
405
+ layout: 'inline',
406
+ }),
407
+ ]
408
+ : []),
409
+ section('Topics'),
410
+ records(topics, {
411
+ fields: ['topic', 'description', 'package'],
412
+ layout: 'inline',
413
+ }),
192
414
  text(
193
415
  [
194
- `Usage: ${run} docs <topic>`,
195
- ` ${run} docs <topic> <section>`,
416
+ `Usage: ${run} docs <topic> list a topic's sections`,
417
+ ` ${run} docs <topic> <section> read one section`,
418
+ ` ${run} docs <topic> --full read the whole topic`,
419
+ ` ${run} docs cli/api go down the docs tree one level at a time`,
420
+ `With --json, a topic returns its whole doc; add --index for its section list.`,
196
421
  ].join('\n'),
197
422
  ),
423
+ // A package whose doc files did not load has no topics here; say
424
+ // so, and where to look, instead of leaving them silently missing.
425
+ ...(result.meta?.notLoaded?.length
426
+ ? [
427
+ section('Not loaded'),
428
+ records(result.meta.notLoaded, {
429
+ fields: ['package', 'message'],
430
+ layout: 'inline',
431
+ }),
432
+ text(
433
+ `Run \`${run} doctor integration docs\` in that package to see every problem.`,
434
+ ),
435
+ ]
436
+ : []),
198
437
  );
199
438
  break;
200
439
  }
201
440
 
441
+ case 'docs.index': {
442
+ emitIndex(result.data, run);
443
+ break;
444
+ }
445
+
202
446
  case 'docs.detail': {
203
- emit(code(formatReferenceFull(result.data, detail)));
447
+ emit(
448
+ code(formatReferenceFull(result.data, detail)),
449
+ text(linkLines(result.data.links).join('\n')),
450
+ );
204
451
  break;
205
452
  }
206
453
 
207
454
  case 'docs.detail.section': {
208
- emit(code(formatSection(result.data, detail)));
455
+ // One section ends with its moves: up to its topic's index, and to
456
+ // the sections before and after it.
457
+ emit(
458
+ code(formatSection(result.data, detail)),
459
+ text(linkLines(result.data.links).join('\n')),
460
+ );
461
+ break;
462
+ }
463
+
464
+ case 'docs.node': {
465
+ emitNode(result.data, detail, run);
209
466
  break;
210
467
  }
211
468
  }
@@ -7,7 +7,7 @@ export const doc = {
7
7
  type: 'command',
8
8
  name: 'doctor integration components',
9
9
  displayName: 'astryx doctor integration components',
10
- namespace: 'cli',
10
+ namespace: 'cli/commands',
11
11
  summary: 'Warn when integration component names conflict with Core',
12
12
  description:
13
13
  'Compares one local or installed integration with Core component names. A ' +
@@ -7,12 +7,13 @@ export const doc = {
7
7
  type: 'command',
8
8
  name: 'doctor integration docs',
9
9
  displayName: 'astryx doctor integration docs',
10
- namespace: 'cli',
11
- summary: 'Classify integration doc overlaps with Core topics',
10
+ namespace: 'cli/commands',
11
+ summary: 'Check an integration\'s docs: the docs tree they add, every link, and overlaps with Core topics',
12
12
  description:
13
- 'Reports intentional Core topic replacements and extensions as information. ' +
13
+ 'Checks the docs tree the package adds, every link in its docs, and overlaps with Core topics. ' +
14
+ 'Intentional replacements and extensions are information. ' +
14
15
  'A same-name topic without `replaces` or `extends` is an accidental conflict ' +
15
- 'and fails until the author declares the relationship or renames it.',
16
+ 'and fails until the author declares the relationship or renames it. See {@link generic:check-your-docs}.',
16
17
  fn: 'integrationDocConflicts',
17
18
  args: [
18
19
  {
@@ -32,7 +33,7 @@ export const doc = {
32
33
  ],
33
34
  exitCodes: [
34
35
  {code: 0, when: 'all Core overlaps are explicitly declared or no overlap exists'},
35
- {code: 1, when: 'an overlap is accidental or the integration docs are invalid'},
36
+ {code: 1, when: 'an overlap is accidental, a doc is invalid, a namespace or placement fails, or a reference block cannot include what it names. A link that names no doc is a warning, and does not change the exit code'},
36
37
  ],
37
38
  related: ['doctor integration validate', 'docs'],
38
39
  };
@@ -9,13 +9,14 @@ export const doc = {
9
9
  type: 'command',
10
10
  name: 'doctor integration templates',
11
11
  displayName: 'astryx doctor integration templates',
12
- namespace: 'cli',
13
- summary: 'Warn when integration template ids conflict with Core',
12
+ namespace: 'cli/commands',
13
+ summary: 'Validate integration template replacements and Core id overlaps',
14
14
  description:
15
- 'Compares one local or installed integration with the built-in Core page and ' +
16
- 'block template ids. A conflict is allowed and exits successfully, but the ' +
17
- 'report recommends renaming and gives the exact --package command required ' +
18
- 'to select the integration template when the overlap is intentional.',
15
+ 'Validates one local or installed integration against the built-in Core page ' +
16
+ 'and block template ids. Intentional replacements are informational and name ' +
17
+ 'the command for selecting the Core original. Missing targets, ambiguous ' +
18
+ 'replacements, and invalid declarations are errors; undeclared same-id overlaps ' +
19
+ 'remain warnings that require package selection.',
19
20
  fn: 'integrationTemplateConflicts',
20
21
  args: [
21
22
  {
@@ -37,8 +38,14 @@ export const doc = {
37
38
  },
38
39
  ],
39
40
  exitCodes: [
40
- {code: 0, when: 'the check completed; template conflicts are warnings'},
41
- {code: 1, when: 'the integration or one of its templates is invalid'},
41
+ {
42
+ code: 0,
43
+ when: 'replacement declarations are valid; undeclared id conflicts are warnings',
44
+ },
45
+ {
46
+ code: 1,
47
+ when: 'the integration, a template, or a replacement declaration is invalid',
48
+ },
42
49
  ],
43
50
  related: ['doctor integration validate', 'template'],
44
51
  };
@@ -9,7 +9,7 @@ export const doc = {
9
9
  type: 'command',
10
10
  name: 'doctor integration validate',
11
11
  displayName: 'astryx doctor integration validate',
12
- namespace: 'cli',
12
+ namespace: 'cli/commands',
13
13
  summary: 'Validate an integration manifest and its contributions',
14
14
  description:
15
15
  'Validates one integration at a time: the local package rooted at cwd, or an ' +
@@ -9,7 +9,7 @@ export const doc = {
9
9
  type: 'command',
10
10
  name: 'doctor integration',
11
11
  displayName: 'astryx doctor integration',
12
- namespace: 'cli',
12
+ namespace: 'cli/commands',
13
13
  summary: 'Check an integration package while authoring it',
14
14
  description:
15
15
  'The integration-authoring diagnostics group. Validate a manifest and all ' +
@@ -0,0 +1,53 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest';
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import {runCli} from '../../../test-utils/run-cli.mjs';
7
+ import {validateIntegration} from '../../../api/integration/validate-integration.mjs';
8
+
9
+ const NO_MANIFEST = 'No astryx.integration.* found next to package.json.';
10
+
11
+ let tmpDir;
12
+
13
+ beforeEach(() => {
14
+ tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-doctor-pkgjson-'));
15
+ fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name": "@acme/widgets",}\n');
16
+ fs.writeFileSync(
17
+ path.join(tmpDir, 'astryx.integration.mjs'),
18
+ "export default {\n templates: './templates',\n};\n",
19
+ );
20
+ });
21
+
22
+ afterEach(() => {
23
+ fs.rmSync(tmpDir, {recursive: true, force: true});
24
+ });
25
+
26
+ describe('doctor integration with a malformed package.json', () => {
27
+ it('keeps a null name for the no-manifest case only', async () => {
28
+ const result = await validateIntegration(undefined, {cwd: tmpDir});
29
+
30
+ expect(result.data.name).toBe('(local package)');
31
+ expect(result.data.issues.map(issue => issue.code)).toEqual([
32
+ 'invalid_package_json',
33
+ ]);
34
+ });
35
+
36
+ for (const leaf of ['validate', 'templates', 'components', 'docs']) {
37
+ it(`${leaf} prints the package.json error instead of "no manifest"`, async () => {
38
+ const text = await runCli(['doctor', 'integration', leaf], tmpDir);
39
+ const json = await runCli(
40
+ ['doctor', 'integration', leaf, '--json'],
41
+ tmpDir,
42
+ );
43
+
44
+ expect(text.status).toBe(1);
45
+ expect(json.status).toBe(1);
46
+ expect(text.stdout).not.toContain(NO_MANIFEST);
47
+ expect(text.stdout).toContain('invalid_package_json');
48
+ expect(JSON.parse(json.stdout).data.issues).toContainEqual(
49
+ expect.objectContaining({code: 'invalid_package_json'}),
50
+ );
51
+ });
52
+ }
53
+ });