@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
@@ -12,15 +12,17 @@ import {
12
12
 
13
13
  /** @typedef {import('../../theme.type.mjs').TonalPaletteAnchor} TonalPaletteAnchor */
14
14
  /** @typedef {import('../../theme.type.mjs').TonalPaletteGenerationInput} TonalPaletteGenerationInput */
15
+ /** @typedef {import('../../theme.type.mjs').TonalPaletteRampDiagnostics} TonalPaletteRampDiagnostics */
16
+ /** @typedef {import('../../theme.type.mjs').TonalPaletteCoordinationDiagnostics} TonalPaletteCoordinationDiagnostics */
17
+ /** @typedef {import('../../theme.type.mjs').TonalPaletteNormalizedRequest} NormalizedRequest */
15
18
  /** @typedef {[number, number, number]} ColorTriple */
16
19
  /** @typedef {'light' | 'dark'} PaletteMode */
17
20
  /** @typedef {{lightness: number, chroma: number, hue: number}} PolarColor */
18
21
  /** @typedef {TonalPaletteAnchor & {color: string, generatedColor: string, deltaE: number}} AnchorResult */
19
- /** @typedef {{colors: Record<number, string>, diagnostics: Record<string, unknown>}} GeneratedRamp */
22
+ /** @typedef {{colors: Record<number, string>, diagnostics: TonalPaletteRampDiagnostics}} GeneratedRamp */
20
23
  /** @typedef {{id: string, name: string, seed: string, kind: 'chromatic' | 'neutral', anchors: TonalPaletteAnchor[]}} NormalizedFamily */
21
- /** @typedef {{recipe: typeof PALETTE_RECIPE, vibrancy: number, neutralProfile: string, modeStrategy: string, stops: number[], families: NormalizedFamily[]}} NormalizedRequest */
22
24
  /** @typedef {{id: string, name: string, seed: string, light?: GeneratedRamp, dark?: GeneratedRamp}} GeneratedFamily */
23
- /** @typedef {{recipe: typeof PALETTE_RECIPE, status: 'candidate', request: NormalizedRequest, families: GeneratedFamily[], coordination: Record<string, unknown>[], errors: {familyId: string, message: string}[]}} PaletteGenerationResult */
25
+ /** @typedef {{recipe: typeof PALETTE_RECIPE, status: 'candidate', request: NormalizedRequest, families: GeneratedFamily[], coordination: TonalPaletteCoordinationDiagnostics[], errors: {familyId: string, message: string}[]}} PaletteGenerationResult */
24
26
 
25
27
  export const PALETTE_RECIPE = 'astryx-oklch-v1';
26
28
  export const PALETTE_BLACK = '#000000';
@@ -35,6 +37,7 @@ export const COMPACT_11_STOPS = Object.freeze([
35
37
 
36
38
  const DARK_CHROMA_FACTOR = 0.85;
37
39
  const RESERVED_FAMILY_IDS = new Set(['black', 'white']);
40
+ const NEUTRAL_PROFILES = ['neutral-v1', 'warm-v1', 'cool-v1', 'custom'];
38
41
 
39
42
  /** @param {number} value @param {number} minimum @param {number} maximum */
40
43
  function clamp(value, minimum, maximum) {
@@ -411,6 +414,7 @@ function buildDiagnostics(colors, stops, sourceHue, gamutMappedStops, anchors) {
411
414
  let minimumAdjacentDeltaE = Number.POSITIVE_INFINITY;
412
415
  let maximumAdjacentDeltaE = 0;
413
416
  let maximumHueDrift = 0;
417
+ /** @type {TonalPaletteRampDiagnostics['hueIdentityRisk']} */
414
418
  let hueIdentityRisk = null;
415
419
  for (let index = 0; index < stops.length; index++) {
416
420
  const stop = stops[index];
@@ -526,6 +530,7 @@ function buildCoordinationDiagnostics(request, families) {
526
530
  chroma: hexToOklch(color).C,
527
531
  };
528
532
  });
533
+ /** @type {[string, string] | null} */
529
534
  let closestFamilies = null;
530
535
  let minimumFamilyDeltaE = Number.POSITIVE_INFINITY;
531
536
  for (let index = 0; index < samples.length; index++) {
@@ -661,11 +666,17 @@ export function normalizeGenerationRequest(input) {
661
666
  anchors,
662
667
  };
663
668
  });
669
+ const neutralProfile = input.neutralProfile ?? 'neutral-v1';
670
+ // The receipt records this request, so an unknown profile fails even when no
671
+ // neutral family reads it.
672
+ if (!NEUTRAL_PROFILES.includes(neutralProfile)) {
673
+ throw new Error(`Unknown neutral profile: ${String(neutralProfile)}`);
674
+ }
664
675
  /** @type {NormalizedRequest} */
665
676
  const request = {
666
677
  recipe: PALETTE_RECIPE,
667
678
  vibrancy: input.vibrancy ?? 50,
668
- neutralProfile: input.neutralProfile ?? 'neutral-v1',
679
+ neutralProfile,
669
680
  modeStrategy,
670
681
  stops,
671
682
  families: normalizedFamilies,
@@ -293,6 +293,16 @@ describe('astryx-oklch-v1 palette generator', () => {
293
293
  ).toThrow('Anchor mode dark is not generated by mode strategy light-only');
294
294
  });
295
295
 
296
+ it('rejects an unknown neutral profile even without a neutral family', () => {
297
+ expect(() =>
298
+ generatePaletteSet({neutralProfile: 'warm-v2', families: [families[1]]}),
299
+ ).toThrow('Unknown neutral profile: warm-v2');
300
+ expect(
301
+ generatePaletteSet({neutralProfile: 'warm-v1', families: [families[1]]})
302
+ .request.neutralProfile,
303
+ ).toBe('warm-v1');
304
+ });
305
+
296
306
  it('normalizes anchor colors in the generation receipt', () => {
297
307
  const result = generatePaletteSet({
298
308
  modeStrategy: 'light-only',
@@ -62,8 +62,17 @@ export function themeTemplate(options = {}) {
62
62
 
63
63
  // Our repo header has no business in someone else's source tree.
64
64
  const contents = stripCopyrightHeader(fs.readFileSync(THEME_TEMPLATE_SRC, 'utf-8'));
65
- fs.mkdirSync(path.dirname(resolved), {recursive: true});
66
- fs.writeFileSync(resolved, contents);
65
+ try {
66
+ fs.mkdirSync(path.dirname(resolved), {recursive: true});
67
+ fs.writeFileSync(resolved, contents);
68
+ } catch (err) {
69
+ const message = err instanceof Error ? err.message : String(err);
70
+ throw new AstryxError(
71
+ `Failed to write the theme template to ${relative}: ${message}`,
72
+ undefined,
73
+ ERROR_CODES.ERR_WRITE_FAILED,
74
+ );
75
+ }
67
76
 
68
77
  return {type: 'theme.template', data: {path: relative, written: true, reason: null}};
69
78
  }
@@ -13,7 +13,9 @@ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
13
13
  import * as fs from 'node:fs';
14
14
  import * as path from 'node:path';
15
15
  import * as os from 'node:os';
16
+ import {themeTemplate as publicThemeTemplate} from '../../index.mjs';
16
17
  import {themeTemplate, THEME_TEMPLATE_DEFAULT_PATH} from './template.mjs';
18
+ import {isErrorCode} from '../../../foundation/response/error-codes.mjs';
17
19
 
18
20
  let tmpDir;
19
21
  beforeEach(() => {
@@ -24,6 +26,10 @@ afterEach(() => {
24
26
  });
25
27
 
26
28
  describe('themeTemplate()', () => {
29
+ it('is available through the public API entry point', () => {
30
+ expect(publicThemeTemplate).toBe(themeTemplate);
31
+ });
32
+
27
33
  it('writes the template and returns a theme.template receipt', () => {
28
34
  const res = themeTemplate({cwd: tmpDir});
29
35
 
@@ -79,4 +85,18 @@ describe('themeTemplate()', () => {
79
85
  );
80
86
  expect(fs.existsSync(path.join(path.dirname(tmpDir), 'escaped.ts'))).toBe(false);
81
87
  });
88
+
89
+ it('reports a failed write with a registered error code', () => {
90
+ fs.writeFileSync(path.join(tmpDir, 'blocker'), '');
91
+
92
+ let error;
93
+ try {
94
+ themeTemplate({cwd: tmpDir, targetPath: 'blocker/theme.ts'});
95
+ } catch (caught) {
96
+ error = caught;
97
+ }
98
+
99
+ expect(error).toMatchObject({code: 'ERR_WRITE_FAILED'});
100
+ expect(isErrorCode(error.code)).toBe(true);
101
+ });
82
102
  });
@@ -2,7 +2,7 @@
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
4
  /**
5
- * xds --json theme build <file>
5
+ * astryx --json theme build <file>
6
6
  */
7
7
  export type ThemeBuildResponse = {
8
8
  /**
@@ -27,7 +27,7 @@ export type ThemeBuildResponse = {
27
27
  };
28
28
  };
29
29
  /**
30
- * xds --json theme build <file> --check
30
+ * astryx --json theme build <file> --check
31
31
  */
32
32
  export type ThemeBuildCheckResponse = {
33
33
  type: "theme.build.check";
@@ -42,7 +42,7 @@ export type ThemeBuildCheckResponse = {
42
42
  };
43
43
  };
44
44
  /**
45
- * xds --json theme build <a> <b> … — several themes in one invocation. Each
45
+ * astryx --json theme build <a> <b> … — several themes in one invocation. Each
46
46
  * result carries the file as it was passed and the receipt a single-file build
47
47
  * would have returned (null when that theme produced no CSS). One file still
48
48
  * returns the bare theme.build / theme.build.check envelope.
@@ -71,14 +71,14 @@ export type ThemeListEntry = {
71
71
  package?: string | undefined;
72
72
  };
73
73
  /**
74
- * xds --json theme list
74
+ * astryx --json theme list
75
75
  */
76
76
  export type ThemeListResponse = {
77
77
  type: "theme.list";
78
78
  data: ThemeListEntry[];
79
79
  };
80
80
  /**
81
- * xds --json theme add <slug>
81
+ * astryx --json theme add <slug>
82
82
  */
83
83
  export type ThemeAddResponse = {
84
84
  type: "theme.add";
@@ -94,7 +94,7 @@ export type ThemeAddResponse = {
94
94
  };
95
95
  };
96
96
  /**
97
- * xds --json theme template
97
+ * astryx --json theme template
98
98
  * `written: false` with `reason: 'exists'` is a success: the command is safe to
99
99
  * re-run, and an edited template is the consumer's file to keep.
100
100
  */
@@ -123,7 +123,7 @@ export type ThemeTargetEntry = {
123
123
  deprecatedFor?: string | undefined;
124
124
  };
125
125
  /**
126
- * xds --json theme targets [filter]
126
+ * astryx --json theme targets [filter]
127
127
  */
128
128
  export type ThemeTargetsResponse = {
129
129
  type: "theme.targets";
@@ -134,8 +134,7 @@ export type ThemeTargetsResponse = {
134
134
  };
135
135
  };
136
136
  /**
137
- * A generated palette candidate. The palette is still subject to author review
138
- * and is not connected to runtime theme values.
137
+ * A color an author pins at one stop of one mode, constraining generation.
139
138
  */
140
139
  export type TonalPaletteAnchor = {
141
140
  /**
@@ -146,6 +145,10 @@ export type TonalPaletteAnchor = {
146
145
  * Existing requested stop where the anchor applies.
147
146
  */
148
147
  stop: number;
148
+ /**
149
+ * sRGB hex the stop is pulled toward: three or six
150
+ * digits, with or without `#`; the generator normalizes it.
151
+ */
149
152
  color: string;
150
153
  /**
151
154
  * `exact` preserves the
@@ -159,11 +162,32 @@ export type TonalPaletteAnchor = {
159
162
  */
160
163
  maxDeltaE?: number | undefined;
161
164
  };
165
+ /**
166
+ * One requested family: a seed color and the constraints applied to its ramp.
167
+ */
162
168
  export type TonalPaletteFamilyInput = {
169
+ /**
170
+ * Lower-kebab-case key for the family in the generated
171
+ * palette. `black` and `white` are reserved for the standalone values.
172
+ */
163
173
  id: string;
174
+ /**
175
+ * sRGB hex the ramp is generated from: three or six
176
+ * digits, with or without `#`; the generator normalizes it.
177
+ */
164
178
  seed: string;
179
+ /**
180
+ * Display name for review artifacts; defaults to `id`.
181
+ */
165
182
  name?: string | undefined;
183
+ /**
184
+ * `neutral` derives the ramp from
185
+ * `neutralProfile` instead of the seed hue; defaults to `chromatic`.
186
+ */
166
187
  kind?: "neutral" | "chromatic" | undefined;
188
+ /**
189
+ * Colors pinned at specific stops.
190
+ */
167
191
  anchors?: TonalPaletteAnchor[] | undefined;
168
192
  };
169
193
  export type TonalPaletteGenerationInput = {
@@ -173,6 +197,11 @@ export type TonalPaletteGenerationInput = {
173
197
  * (default) to 100 (most vivid).
174
198
  */
175
199
  vibrancy?: number | undefined;
200
+ /**
201
+ * Hue treatment for `neutral` families: `neutral-v1` is fully achromatic,
202
+ * `warm-v1` and `cool-v1` add a slight tint, and `custom` derives the hue from
203
+ * the family's own seed. Defaults to `neutral-v1`.
204
+ */
176
205
  neutralProfile?: "custom" | "neutral-v1" | "warm-v1" | "cool-v1" | undefined;
177
206
  modeStrategy?: "light-only" | "dark-only" | "light-and-dark" | undefined;
178
207
  /**
@@ -182,6 +211,10 @@ export type TonalPaletteGenerationInput = {
182
211
  */
183
212
  stops?: number[] | undefined;
184
213
  };
214
+ /**
215
+ * A generated palette candidate. The palette is still subject to author review
216
+ * and is not connected to runtime theme values.
217
+ */
185
218
  export type TonalPaletteCandidate = {
186
219
  schemaVersion: 1;
187
220
  status: "candidate";
@@ -205,7 +238,133 @@ export type TonalPaletteCandidate = {
205
238
  }>;
206
239
  };
207
240
  /**
208
- * xds --json theme palette generate <config>
241
+ * Per-ramp evidence recorded for one family in one mode.
242
+ */
243
+ export type TonalPaletteRampDiagnostics = {
244
+ /**
245
+ * Whether luminance rises across every stop.
246
+ */
247
+ monotonic: boolean;
248
+ /**
249
+ * Smallest perceptual gap between
250
+ * neighboring stops; a small value means two stops read as one color.
251
+ */
252
+ minimumAdjacentDeltaE: number;
253
+ /**
254
+ * Largest gap between neighboring stops.
255
+ */
256
+ maximumAdjacentDeltaE: number;
257
+ /**
258
+ * Largest hue distance, in degrees, between
259
+ * a stop and the family's reference hue.
260
+ */
261
+ maximumHueDrift: number;
262
+ /**
263
+ * Named
264
+ * drift the ramp is at risk of, or `null`.
265
+ */
266
+ hueIdentityRisk: "blue-to-purple" | "yellow-to-brown" | null;
267
+ /**
268
+ * Stops whose ideal color fell outside
269
+ * sRGB and was mapped back into it.
270
+ */
271
+ gamutMappedStops: number[];
272
+ /**
273
+ * Each anchor with the color the stop received after its policy was applied
274
+ * and the perceptual distance that color still has from the requested target.
275
+ */
276
+ anchors: Array<TonalPaletteAnchor & {
277
+ generatedColor: string;
278
+ deltaE: number;
279
+ }>;
280
+ };
281
+ /**
282
+ * Cross-family evidence for one mode, sampled at the stop nearest 50.
283
+ */
284
+ export type TonalPaletteCoordinationDiagnostics = {
285
+ /**
286
+ * Mode these samples come from.
287
+ */
288
+ mode: "light" | "dark";
289
+ /**
290
+ * Sampled stop.
291
+ */
292
+ stop: number;
293
+ /**
294
+ * The two chromatic
295
+ * families hardest to tell apart, or `null` with fewer than two.
296
+ */
297
+ closestFamilies: [string, string] | null;
298
+ /**
299
+ * Perceptual distance between them.
300
+ */
301
+ minimumFamilyDeltaE: number | null;
302
+ /**
303
+ * Most saturated family at this stop.
304
+ */
305
+ strongestFamily: string | null;
306
+ /**
307
+ * Least saturated family at this stop.
308
+ */
309
+ weakestFamily: string | null;
310
+ /**
311
+ * Strongest chroma over weakest; a large
312
+ * ratio means the families are unbalanced.
313
+ */
314
+ chromaRatio: number | null;
315
+ };
316
+ /**
317
+ * The request as the generator resolved it, with every default filled in.
318
+ */
319
+ export type TonalPaletteNormalizedRequest = {
320
+ recipe: "astryx-oklch-v1";
321
+ vibrancy: number;
322
+ neutralProfile: "neutral-v1" | "warm-v1" | "cool-v1" | "custom";
323
+ modeStrategy: "light-only" | "dark-only" | "light-and-dark";
324
+ stops: number[];
325
+ families: Array<{
326
+ id: string;
327
+ name: string;
328
+ seed: string;
329
+ kind: "chromatic" | "neutral";
330
+ anchors: TonalPaletteAnchor[];
331
+ }>;
332
+ };
333
+ /**
334
+ * The detached receipt written beside a candidate. It records what was asked
335
+ * for and what the generator observed, so a candidate can be traced back to
336
+ * its request without rerunning generation.
337
+ */
338
+ export type TonalPaletteGenerationReceipt = {
339
+ schemaVersion: 1;
340
+ /**
341
+ * Recipe that produced the candidate.
342
+ */
343
+ recipe: "astryx-oklch-v1";
344
+ /**
345
+ * SHA-256 over the candidate bytes as written.
346
+ */
347
+ candidateSha256: string;
348
+ /**
349
+ * Present when preview
350
+ * content was generated for the request, even if no file was written because
351
+ * the target already exists.
352
+ */
353
+ preview?: {
354
+ version: string;
355
+ sha256: string;
356
+ } | undefined;
357
+ request: TonalPaletteNormalizedRequest;
358
+ diagnostics: {
359
+ families: Record<string, {
360
+ light?: TonalPaletteRampDiagnostics;
361
+ dark?: TonalPaletteRampDiagnostics;
362
+ }>;
363
+ coordination: TonalPaletteCoordinationDiagnostics[];
364
+ };
365
+ };
366
+ /**
367
+ * astryx --json theme palette generate <config>
209
368
  */
210
369
  export type ThemePaletteGenerateResponse = {
211
370
  type: "theme.palette.generate";
@@ -221,6 +380,6 @@ export type ThemePaletteGenerateResponse = {
221
380
  written: boolean;
222
381
  reason: "exists" | null;
223
382
  candidate: TonalPaletteCandidate;
224
- generationReceipt: Record<string, unknown>;
383
+ generationReceipt: TonalPaletteGenerationReceipt;
225
384
  };
226
385
  };
@@ -6,23 +6,23 @@
6
6
  * directly (functions own their types); the public `@astryxdesign/cli/api`
7
7
  * surface re-exports them via types/theme.d.ts, so consumers see the same names.
8
8
  *
9
- * Invocation -> type discriminator
9
+ * Invocation -> type discriminator
10
10
  * ------------------------------------------------------------------
11
- * xds --json theme build <file> -> theme.build
12
- * xds --json theme build <file> --check -> theme.build.check
13
- * xds --json theme build <a> <b> … -> theme.build.batch
14
- * xds --json theme list -> theme.list
15
- * xds --json theme add <slug> -> theme.add
16
- * xds --json theme template -> theme.template
17
- * xds --json theme targets [filter] -> theme.targets
18
- * xds --json theme palette generate <file> -> theme.palette.generate
19
- * (file not found / parse error) -> CLIError
11
+ * astryx --json theme build <file> -> theme.build
12
+ * astryx --json theme build <file> --check -> theme.build.check
13
+ * astryx --json theme build <a> <b> … -> theme.build.batch
14
+ * astryx --json theme list -> theme.list
15
+ * astryx --json theme add <slug> -> theme.add
16
+ * astryx --json theme template -> theme.template
17
+ * astryx --json theme targets [filter] -> theme.targets
18
+ * astryx --json theme palette generate <file> -> theme.palette.generate
19
+ * (file not found / parse error) -> CLIError
20
20
  *
21
21
  * @position api — colocated typedefs for api/theme/{theme,build,add,list,template,targets,_adapter}
22
22
  */
23
23
 
24
24
  /**
25
- * xds --json theme build <file>
25
+ * astryx --json theme build <file>
26
26
  * @typedef {object} ThemeBuildResponse
27
27
  * @property {'theme.build'} type
28
28
  * `warnings` are defects the theme author should fix. `notices` are advisories
@@ -32,14 +32,14 @@
32
32
  */
33
33
 
34
34
  /**
35
- * xds --json theme build <file> --check
35
+ * astryx --json theme build <file> --check
36
36
  * @typedef {object} ThemeBuildCheckResponse
37
37
  * @property {'theme.build.check'} type
38
38
  * @property {{name: string, upToDate: boolean, stale: Array<{path: string, reason: 'missing' | 'outdated'}>, checked: string[]}} data
39
39
  */
40
40
 
41
41
  /**
42
- * xds --json theme build <a> <b> … — several themes in one invocation. Each
42
+ * astryx --json theme build <a> <b> … — several themes in one invocation. Each
43
43
  * result carries the file as it was passed and the receipt a single-file build
44
44
  * would have returned (null when that theme produced no CSS). One file still
45
45
  * returns the bare theme.build / theme.build.check envelope.
@@ -59,21 +59,21 @@
59
59
  */
60
60
 
61
61
  /**
62
- * xds --json theme list
62
+ * astryx --json theme list
63
63
  * @typedef {object} ThemeListResponse
64
64
  * @property {'theme.list'} type
65
65
  * @property {ThemeListEntry[]} data
66
66
  */
67
67
 
68
68
  /**
69
- * xds --json theme add <slug>
69
+ * astryx --json theme add <slug>
70
70
  * @typedef {object} ThemeAddResponse
71
71
  * @property {'theme.add'} type
72
72
  * @property {{slug: string, displayName: string, maintained: boolean, package: string, outputDir: string, entry: string, exportName: string, files: string[]}} data
73
73
  */
74
74
 
75
75
  /**
76
- * xds --json theme template
76
+ * astryx --json theme template
77
77
  * `written: false` with `reason: 'exists'` is a success: the command is safe to
78
78
  * re-run, and an edited template is the consumer's file to keep.
79
79
  * @typedef {object} ThemeTemplateResponse
@@ -95,19 +95,19 @@
95
95
  */
96
96
 
97
97
  /**
98
- * xds --json theme targets [filter]
98
+ * astryx --json theme targets [filter]
99
99
  * @typedef {object} ThemeTargetsResponse
100
100
  * @property {'theme.targets'} type
101
101
  * @property {{filter: string | null, componentCount: number, targets: ThemeTargetEntry[]}} data
102
102
  */
103
103
 
104
104
  /**
105
- * A generated palette candidate. The palette is still subject to author review
106
- * and is not connected to runtime theme values.
105
+ * A color an author pins at one stop of one mode, constraining generation.
107
106
  * @typedef {object} TonalPaletteAnchor
108
107
  * @property {'light' | 'dark'} mode Mode containing the anchored stop.
109
108
  * @property {number} stop Existing requested stop where the anchor applies.
110
- * @property {string} color
109
+ * @property {string} color sRGB hex the stop is pulled toward: three or six
110
+ * digits, with or without `#`; the generator normalizes it.
111
111
  * @property {'exact' | 'bounded' | 'flexible'} policy `exact` preserves the
112
112
  * chosen color at that stop; `bounded` permits adjustment within `maxDeltaE`;
113
113
  * `flexible` treats the color as guidance and blends toward it.
@@ -116,12 +116,16 @@
116
116
  */
117
117
 
118
118
  /**
119
+ * One requested family: a seed color and the constraints applied to its ramp.
119
120
  * @typedef {object} TonalPaletteFamilyInput
120
- * @property {string} id
121
- * @property {string} seed
122
- * @property {string} [name]
123
- * @property {'chromatic' | 'neutral'} [kind]
124
- * @property {TonalPaletteAnchor[]} [anchors]
121
+ * @property {string} id Lower-kebab-case key for the family in the generated
122
+ * palette. `black` and `white` are reserved for the standalone values.
123
+ * @property {string} seed sRGB hex the ramp is generated from: three or six
124
+ * digits, with or without `#`; the generator normalizes it.
125
+ * @property {string} [name] Display name for review artifacts; defaults to `id`.
126
+ * @property {'chromatic' | 'neutral'} [kind] `neutral` derives the ramp from
127
+ * `neutralProfile` instead of the seed hue; defaults to `chromatic`.
128
+ * @property {TonalPaletteAnchor[]} [anchors] Colors pinned at specific stops.
125
129
  */
126
130
 
127
131
  /**
@@ -130,6 +134,9 @@
130
134
  * @property {number} [vibrancy] Chroma control from 0 (most muted) through 50
131
135
  * (default) to 100 (most vivid).
132
136
  * @property {'neutral-v1' | 'warm-v1' | 'cool-v1' | 'custom'} [neutralProfile]
137
+ * Hue treatment for `neutral` families: `neutral-v1` is fully achromatic,
138
+ * `warm-v1` and `cool-v1` add a slight tint, and `custom` derives the hue from
139
+ * the family's own seed. Defaults to `neutral-v1`.
133
140
  * @property {'light-only' | 'dark-only' | 'light-and-dark'} [modeStrategy]
134
141
  * @property {number[]} [stops] Ordered stops shared by every requested family;
135
142
  * defaults to 0 through 100 in increments of 5. Decimal stops are supported,
@@ -137,6 +144,8 @@
137
144
  */
138
145
 
139
146
  /**
147
+ * A generated palette candidate. The palette is still subject to author review
148
+ * and is not connected to runtime theme values.
140
149
  * @typedef {object} TonalPaletteCandidate
141
150
  * @property {1} schemaVersion
142
151
  * @property {'candidate'} status
@@ -148,10 +157,68 @@
148
157
  */
149
158
 
150
159
  /**
151
- * xds --json theme palette generate <config>
160
+ * Per-ramp evidence recorded for one family in one mode.
161
+ * @typedef {object} TonalPaletteRampDiagnostics
162
+ * @property {boolean} monotonic Whether luminance rises across every stop.
163
+ * @property {number} minimumAdjacentDeltaE Smallest perceptual gap between
164
+ * neighboring stops; a small value means two stops read as one color.
165
+ * @property {number} maximumAdjacentDeltaE Largest gap between neighboring stops.
166
+ * @property {number} maximumHueDrift Largest hue distance, in degrees, between
167
+ * a stop and the family's reference hue.
168
+ * @property {'blue-to-purple' | 'yellow-to-brown' | null} hueIdentityRisk Named
169
+ * drift the ramp is at risk of, or `null`.
170
+ * @property {number[]} gamutMappedStops Stops whose ideal color fell outside
171
+ * sRGB and was mapped back into it.
172
+ * @property {Array<TonalPaletteAnchor & {generatedColor: string, deltaE: number}>} anchors
173
+ * Each anchor with the color the stop received after its policy was applied
174
+ * and the perceptual distance that color still has from the requested target.
175
+ */
176
+
177
+ /**
178
+ * Cross-family evidence for one mode, sampled at the stop nearest 50.
179
+ * @typedef {object} TonalPaletteCoordinationDiagnostics
180
+ * @property {'light' | 'dark'} mode Mode these samples come from.
181
+ * @property {number} stop Sampled stop.
182
+ * @property {[string, string] | null} closestFamilies The two chromatic
183
+ * families hardest to tell apart, or `null` with fewer than two.
184
+ * @property {number | null} minimumFamilyDeltaE Perceptual distance between them.
185
+ * @property {string | null} strongestFamily Most saturated family at this stop.
186
+ * @property {string | null} weakestFamily Least saturated family at this stop.
187
+ * @property {number | null} chromaRatio Strongest chroma over weakest; a large
188
+ * ratio means the families are unbalanced.
189
+ */
190
+
191
+ /**
192
+ * The request as the generator resolved it, with every default filled in.
193
+ * @typedef {object} TonalPaletteNormalizedRequest
194
+ * @property {'astryx-oklch-v1'} recipe
195
+ * @property {number} vibrancy
196
+ * @property {'neutral-v1' | 'warm-v1' | 'cool-v1' | 'custom'} neutralProfile
197
+ * @property {'light-only' | 'dark-only' | 'light-and-dark'} modeStrategy
198
+ * @property {number[]} stops
199
+ * @property {Array<{id: string, name: string, seed: string, kind: 'chromatic' | 'neutral', anchors: TonalPaletteAnchor[]}>} families
200
+ */
201
+
202
+ /**
203
+ * The detached receipt written beside a candidate. It records what was asked
204
+ * for and what the generator observed, so a candidate can be traced back to
205
+ * its request without rerunning generation.
206
+ * @typedef {object} TonalPaletteGenerationReceipt
207
+ * @property {1} schemaVersion
208
+ * @property {'astryx-oklch-v1'} recipe Recipe that produced the candidate.
209
+ * @property {string} candidateSha256 SHA-256 over the candidate bytes as written.
210
+ * @property {{version: string, sha256: string}} [preview] Present when preview
211
+ * content was generated for the request, even if no file was written because
212
+ * the target already exists.
213
+ * @property {TonalPaletteNormalizedRequest} request
214
+ * @property {{families: Record<string, {light?: TonalPaletteRampDiagnostics, dark?: TonalPaletteRampDiagnostics}>, coordination: TonalPaletteCoordinationDiagnostics[]}} diagnostics
215
+ */
216
+
217
+ /**
218
+ * astryx --json theme palette generate <config>
152
219
  * @typedef {object} ThemePaletteGenerateResponse
153
220
  * @property {'theme.palette.generate'} type
154
- * @property {{recipe: 'astryx-oklch-v1', status: 'candidate', familyCount: number, stopCount: number, modes: string[], output: string | null, receipt: string | null, preview: string | null, written: boolean, reason: 'exists' | null, candidate: TonalPaletteCandidate, generationReceipt: Record<string, unknown>}} data
221
+ * @property {{recipe: 'astryx-oklch-v1', status: 'candidate', familyCount: number, stopCount: number, modes: string[], output: string | null, receipt: string | null, preview: string | null, written: boolean, reason: 'exists' | null, candidate: TonalPaletteCandidate, generationReceipt: TonalPaletteGenerationReceipt}} data
155
222
  */
156
223
 
157
224
  // Make this a module so the @typedefs above are importable as types via