@supersoniks/concorde 5.1.1 → 5.1.3-immutable.1

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 (459) hide show
  1. package/.agents/skills/concorde-docs/SKILL.md +153 -0
  2. package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
  3. package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
  4. package/.agents/skills/concorde-docs/templates/guide.md +25 -0
  5. package/.claude/skills +1 -0
  6. package/.github/workflows/ci.yml +21 -0
  7. package/.github-export-ignore +30 -0
  8. package/CONTRIBUTING.md +59 -0
  9. package/DEV.md +54 -0
  10. package/LICENSE +21 -0
  11. package/OPEN_SOURCE_CHECKPOINT.md +133 -0
  12. package/README.md +4 -4
  13. package/ai/README.md +29 -41
  14. package/ai/skills/concorde/SKILL.md +54 -324
  15. package/ai/skills/concorde/rules/composition.md +32 -0
  16. package/ai/skills/concorde/rules/data.md +47 -0
  17. package/ai/skills/concorde/rules/http.md +25 -0
  18. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  19. package/ai/skills/concorde/rules/styling.md +46 -0
  20. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  21. package/build-infos.json +1 -1
  22. package/concorde-core.bundle.js +177 -177
  23. package/concorde-core.es.js +4993 -4833
  24. package/custom-elements-manifest.public.config.mjs +8 -0
  25. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11758 -8904
  26. package/dist/concorde-core.bundle.js +177 -177
  27. package/dist/concorde-core.es.js +4993 -4833
  28. package/dist/docs-mock-api-sw.js +58 -223
  29. package/dist/docs-mock-api-sw.js.map +4 -4
  30. package/dist/img/concorde/plane_01.jpg +0 -0
  31. package/dist/img/concorde/plane_02.jpg +0 -0
  32. package/dist/img/concorde/plane_03.jpg +0 -0
  33. package/dist/img/concorde/plane_04.jpg +0 -0
  34. package/dist/img/concorde/plane_05.jpg +0 -0
  35. package/dist/img/concorde/plane_06.jpg +0 -0
  36. package/dist/img/concorde/plane_07.jpg +0 -0
  37. package/dist/img/concorde/plane_08.jpg +0 -0
  38. package/dist/img/concorde/plane_09.jpg +0 -0
  39. package/dist/img/concorde/plane_10.jpg +0 -0
  40. package/dist/img/concorde/plane_11.jpg +0 -0
  41. package/dist/img/concorde/plane_12.jpg +0 -0
  42. package/dist/img/concorde/plane_13.jpg +0 -0
  43. package/dist/img/og-concorde.jpg +0 -0
  44. package/dist/robots.txt +11 -10
  45. package/docs/assets/index-D_alEsng.js +12122 -0
  46. package/docs/crawl/core/components/functional/date/date.html +190 -0
  47. package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
  48. package/docs/crawl/core/components/functional/if/if.html +27 -0
  49. package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
  50. package/docs/crawl/core/components/functional/list/list.html +70 -0
  51. package/docs/crawl/core/components/functional/mix/mix.html +45 -0
  52. package/docs/crawl/core/components/functional/queue/queue.html +96 -0
  53. package/docs/crawl/core/components/functional/router/router.html +106 -0
  54. package/docs/crawl/core/components/functional/sdui/sdui-extension-points.html +126 -0
  55. package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
  56. package/docs/crawl/core/components/functional/states/states.html +66 -0
  57. package/docs/crawl/core/components/functional/submit/submit.html +160 -0
  58. package/docs/crawl/core/components/functional/subscriber/subscriber.html +67 -0
  59. package/docs/crawl/core/components/functional/value/value.html +51 -0
  60. package/docs/crawl/core/components/ui/alert/alert.html +211 -0
  61. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +131 -0
  62. package/docs/crawl/core/components/ui/badge/badge.html +197 -0
  63. package/docs/crawl/core/components/ui/button/button.html +150 -0
  64. package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
  65. package/docs/crawl/core/components/ui/card/card.html +253 -0
  66. package/docs/crawl/core/components/ui/divider/divider.html +144 -0
  67. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
  68. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
  69. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +122 -0
  70. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
  71. package/docs/crawl/core/components/ui/form/input/input.html +109 -0
  72. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
  73. package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
  74. package/docs/crawl/core/components/ui/form/select/select.html +73 -0
  75. package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
  76. package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
  77. package/docs/crawl/core/components/ui/group/group.html +104 -0
  78. package/docs/crawl/core/components/ui/icon/icon.html +222 -0
  79. package/docs/crawl/core/components/ui/image/image.html +298 -0
  80. package/docs/crawl/core/components/ui/link/link.html +100 -0
  81. package/docs/crawl/core/components/ui/loader/loader.html +124 -0
  82. package/docs/crawl/core/components/ui/menu/menu.html +394 -0
  83. package/docs/crawl/core/components/ui/modal/modal.html +342 -0
  84. package/docs/crawl/core/components/ui/pop/pop.html +296 -0
  85. package/docs/crawl/core/components/ui/progress/progress.html +131 -0
  86. package/docs/crawl/core/components/ui/table/table.html +545 -0
  87. package/docs/crawl/core/components/ui/theme/theme.html +131 -0
  88. package/docs/crawl/core/components/ui/toast/toast.html +233 -0
  89. package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
  90. package/docs/crawl/docs/_core-concept/dataFlow.html +177 -0
  91. package/docs/crawl/docs/_core-concept/overview.html +66 -0
  92. package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
  93. package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
  94. package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
  95. package/docs/crawl/docs/_decorators/bind.html +141 -0
  96. package/docs/crawl/docs/_decorators/get.html +149 -0
  97. package/docs/crawl/docs/_decorators/handle.html +165 -0
  98. package/docs/crawl/docs/_decorators/on-assign.html +355 -0
  99. package/docs/crawl/docs/_decorators/patch.html +78 -0
  100. package/docs/crawl/docs/_decorators/post.html +139 -0
  101. package/docs/crawl/docs/_decorators/publish.html +61 -0
  102. package/docs/crawl/docs/_decorators/put.html +78 -0
  103. package/docs/crawl/docs/_decorators/subscribe.html +109 -0
  104. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
  105. package/docs/crawl/docs/_directives/sub.html +93 -0
  106. package/docs/crawl/docs/_getting-started/ai-agents.html +173 -0
  107. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
  108. package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
  109. package/docs/crawl/docs/_getting-started/create-a-component.html +111 -0
  110. package/docs/crawl/docs/_getting-started/my-first-component.html +189 -0
  111. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
  112. package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
  113. package/docs/crawl/docs/_getting-started/start.html +76 -0
  114. package/docs/crawl/docs/_getting-started/theming.html +333 -0
  115. package/docs/crawl/docs/_misc/api-configuration.html +149 -0
  116. package/docs/crawl/docs/_misc/dataProviderKey.html +135 -0
  117. package/docs/crawl/docs/_misc/docs-mock-api.html +158 -0
  118. package/docs/crawl/docs/_misc/dynamic-path.html +180 -0
  119. package/docs/crawl/docs/_misc/endpoint.html +50 -0
  120. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
  121. package/docs/crawl/docs/_misc/html-integration.html +48 -0
  122. package/docs/crawl/hubs/decorators.html +547 -0
  123. package/docs/crawl/hubs/form-components.html +381 -0
  124. package/docs/crawl/hubs/remote-data.html +452 -0
  125. package/docs/crawl/index.html +103 -0
  126. package/docs/index.html +1 -1
  127. package/docs/llms-full.txt +7174 -0
  128. package/docs/llms.txt +98 -0
  129. package/docs/sitemap.xml +243 -0
  130. package/docs/src/core/components/functional/date/date.md +290 -0
  131. package/docs/src/core/components/functional/fetch/fetch.md +125 -0
  132. package/docs/src/core/components/functional/if/if.md +9 -0
  133. package/docs/src/core/components/functional/jsonata/jsonata.md +56 -0
  134. package/docs/src/core/components/functional/list/list.md +65 -0
  135. package/docs/src/core/components/functional/mix/mix.md +41 -0
  136. package/docs/src/core/components/functional/queue/queue.md +72 -0
  137. package/docs/src/core/components/functional/router/router.md +94 -0
  138. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  139. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  140. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  141. package/docs/src/core/components/functional/sdui/example.json +99 -0
  142. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  143. package/docs/src/core/components/functional/sdui/sdui.md +478 -0
  144. package/docs/src/core/components/functional/states/states.md +87 -0
  145. package/docs/src/core/components/functional/submit/submit.md +114 -0
  146. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  147. package/docs/src/core/components/functional/value/value.md +35 -0
  148. package/docs/src/core/components/ui/alert/alert.md +196 -0
  149. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  150. package/docs/src/core/components/ui/badge/badge.md +188 -0
  151. package/docs/src/core/components/ui/button/button.md +183 -0
  152. package/docs/src/core/components/ui/captcha/captcha.md +71 -0
  153. package/docs/src/core/components/ui/card/card.md +215 -0
  154. package/docs/src/core/components/ui/divider/divider.md +129 -0
  155. package/docs/src/core/components/ui/form/checkbox/checkbox.md +77 -0
  156. package/docs/src/core/components/ui/form/fieldset/fieldset.md +205 -0
  157. package/docs/src/core/components/ui/form/form-actions/form-actions.md +100 -0
  158. package/docs/src/core/components/ui/form/form-layout/form-layout.md +119 -0
  159. package/docs/src/core/components/ui/form/input/input.md +142 -0
  160. package/docs/src/core/components/ui/form/radio/radio.md +57 -0
  161. package/docs/src/core/components/ui/form/select/select.md +71 -0
  162. package/docs/src/core/components/ui/form/switch/switch.md +57 -0
  163. package/docs/src/core/components/ui/form/textarea/textarea.md +65 -0
  164. package/docs/src/core/components/ui/group/group.md +75 -0
  165. package/docs/src/core/components/ui/icon/icon.md +214 -0
  166. package/docs/src/core/components/ui/icon/icons.json +1 -0
  167. package/docs/src/core/components/ui/image/image.md +233 -0
  168. package/docs/src/core/components/ui/link/link.md +81 -0
  169. package/docs/src/core/components/ui/loader/loader.md +112 -0
  170. package/docs/src/core/components/ui/menu/menu.md +370 -0
  171. package/docs/src/core/components/ui/modal/modal.md +235 -0
  172. package/docs/src/core/components/ui/pop/pop.md +294 -0
  173. package/docs/src/core/components/ui/progress/progress.md +109 -0
  174. package/docs/src/core/components/ui/table/table.md +431 -0
  175. package/docs/src/core/components/ui/theme/theme.md +122 -0
  176. package/docs/src/core/components/ui/toast/toast.md +216 -0
  177. package/docs/src/core/components/ui/tooltip/tooltip.md +124 -0
  178. package/{src → docs/src}/docs/_core-concept/subscriber.md +0 -0
  179. package/{src → docs/src}/docs/_getting-started/my-first-subscriber.md +0 -0
  180. package/{src → docs/src}/docs/_getting-started/pubsub.md +0 -0
  181. package/docs/src/docs/_getting-started/theming.md +253 -0
  182. package/docs/src/docs/search/docs-search.json +12242 -0
  183. package/docs/src/tag-list.json +1 -0
  184. package/docs/src/tsconfig-model.json +23 -0
  185. package/docs/src/tsconfig.declarations.json +22 -0
  186. package/docs/src/tsconfig.emit.json +23 -0
  187. package/docs/src/tsconfig.json +1332 -0
  188. package/gitlab/job_github_mirror.sh +39 -0
  189. package/index.html +157 -5
  190. package/package.json +22 -4
  191. package/public/docs-mock-api-sw.js +58 -223
  192. package/public/docs-mock-api-sw.js.map +4 -4
  193. package/public/img/concorde/plane_01.jpg +0 -0
  194. package/public/img/concorde/plane_02.jpg +0 -0
  195. package/public/img/concorde/plane_03.jpg +0 -0
  196. package/public/img/concorde/plane_04.jpg +0 -0
  197. package/public/img/concorde/plane_05.jpg +0 -0
  198. package/public/img/concorde/plane_06.jpg +0 -0
  199. package/public/img/concorde/plane_07.jpg +0 -0
  200. package/public/img/concorde/plane_08.jpg +0 -0
  201. package/public/img/concorde/plane_09.jpg +0 -0
  202. package/public/img/concorde/plane_10.jpg +0 -0
  203. package/public/img/concorde/plane_11.jpg +0 -0
  204. package/public/img/concorde/plane_12.jpg +0 -0
  205. package/public/img/concorde/plane_13.jpg +0 -0
  206. package/public/img/og-concorde.jpg +0 -0
  207. package/public/robots.txt +11 -10
  208. package/scripts/ai-init.mjs +104 -379
  209. package/scripts/ai-init.test.mjs +81 -239
  210. package/scripts/docs-markdown-vite-plugin.ts +43 -0
  211. package/scripts/docs-public-url.mjs +56 -0
  212. package/scripts/docs.htaccess +82 -0
  213. package/scripts/generate-cem.mjs +244 -0
  214. package/scripts/generate-cem.test.mjs +122 -0
  215. package/scripts/generate-crawl-docs.mjs +233 -118
  216. package/scripts/generate-crawl-docs.test.mjs +124 -0
  217. package/scripts/generate-sdui-catalog.mjs +11 -10
  218. package/scripts/github-export.mjs +150 -0
  219. package/scripts/post-build-docs.js +37 -50
  220. package/scripts/post-build.mjs +0 -0
  221. package/scripts/pre-publish.mjs +2 -1
  222. package/scripts/site-pages.mjs +212 -0
  223. package/scripts/site-pages.test.mjs +116 -0
  224. package/site-pages/about.md +22 -0
  225. package/site-pages/privacy.md +32 -0
  226. package/src/core/components/functional/date/date.md +91 -231
  227. package/src/core/components/functional/example/example.ts +3 -1
  228. package/src/core/components/functional/fetch/fetch.md +66 -83
  229. package/src/core/components/functional/if/if.md +28 -3
  230. package/src/core/components/functional/if/if.ts +0 -0
  231. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  232. package/src/core/components/functional/list/list.demo.ts +0 -0
  233. package/src/core/components/functional/list/list.md +103 -43
  234. package/src/core/components/functional/list/list.ts +17 -4
  235. package/src/core/components/functional/mix/mix.md +31 -26
  236. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  237. package/src/core/components/functional/queue/queue.md +40 -61
  238. package/src/core/components/functional/router/router.demo.ts +16 -16
  239. package/src/core/components/functional/router/router.md +64 -65
  240. package/src/core/components/functional/router/router.ts +0 -0
  241. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  242. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  243. package/src/core/components/functional/sdui/component-catalog.json +2 -2
  244. package/src/core/components/functional/sdui/example.json +19 -86
  245. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  246. package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
  247. package/src/core/components/functional/sdui/sdui.md +187 -358
  248. package/src/core/components/functional/sdui/sdui.ts +33 -8
  249. package/src/core/components/functional/sdui/types.ts +0 -0
  250. package/src/core/components/functional/states/states.demo.ts +21 -22
  251. package/src/core/components/functional/states/states.md +86 -61
  252. package/src/core/components/functional/states/states.ts +1 -1
  253. package/src/core/components/functional/submit/submit.md +64 -72
  254. package/src/core/components/functional/submit/submit.spec.ts +60 -0
  255. package/src/core/components/functional/submit/submit.ts +6 -3
  256. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  257. package/src/core/components/functional/translation/translation.md +38 -0
  258. package/src/core/components/functional/value/value.md +34 -22
  259. package/src/core/components/functional/value/value.ts +0 -0
  260. package/src/core/components/ui/_css/size.ts +0 -0
  261. package/src/core/components/ui/alert/alert.md +48 -58
  262. package/src/core/components/ui/badge/badge.md +27 -34
  263. package/src/core/components/ui/button/button.md +139 -106
  264. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  265. package/src/core/components/ui/captcha/captcha.md +17 -32
  266. package/src/core/components/ui/card/card.md +6 -6
  267. package/src/core/components/ui/divider/divider.md +8 -11
  268. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  269. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  270. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  271. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  272. package/src/core/components/ui/form/input/input.md +108 -90
  273. package/src/core/components/ui/form/input/input.ts +8 -2
  274. package/src/core/components/ui/form/radio/radio.md +65 -30
  275. package/src/core/components/ui/form/select/select.md +60 -45
  276. package/src/core/components/ui/form/switch/switch.md +57 -34
  277. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  278. package/src/core/components/ui/group/group.md +35 -33
  279. package/src/core/components/ui/icon/icon.md +4 -4
  280. package/src/core/components/ui/image/image.md +41 -107
  281. package/src/core/components/ui/link/link.md +6 -6
  282. package/src/core/components/ui/loader/loader.md +30 -55
  283. package/src/core/components/ui/menu/menu.md +27 -27
  284. package/src/core/components/ui/modal/modal.md +72 -96
  285. package/src/core/components/ui/pop/pop.md +80 -158
  286. package/src/core/components/ui/progress/progress.md +2 -2
  287. package/src/core/components/ui/table/table.md +91 -255
  288. package/src/core/components/ui/theme/theme.md +11 -36
  289. package/src/core/components/ui/toast/toast.md +48 -117
  290. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  291. package/src/core/decorators/subscriber/bind.ts +9 -14
  292. package/src/core/decorators/subscriber/subscribe.ts +15 -9
  293. package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
  294. package/src/core/mixins/Subscriber.ts +0 -0
  295. package/src/core/utils/DataBindObserver.ts +0 -0
  296. package/src/core/utils/LocationHandler.spec.ts +80 -0
  297. package/src/core/utils/LocationHandler.ts +5 -9
  298. package/src/core/utils/Objects.ts +0 -0
  299. package/src/core/utils/PublisherProxy.ts +166 -125
  300. package/src/core/utils/deepReadonly.spec.ts +66 -0
  301. package/src/core/utils/deepReadonly.ts +71 -0
  302. package/src/core/utils/immutableValue.spec.ts +54 -0
  303. package/src/core/utils/immutableValue.ts +102 -0
  304. package/src/core/utils/nestedDotForm.spec.ts +88 -0
  305. package/src/core/utils/publisherImmutable.spec.ts +76 -0
  306. package/src/core/utils/route.ts +0 -0
  307. package/src/core/utils/strictGet.spec.ts +61 -0
  308. package/src/core/utils/strictGet.ts +102 -0
  309. package/src/css.d.ts +19 -0
  310. package/src/docs/components/docs-demo-sources.ts +55 -140
  311. package/src/docs/components/docs-lit-demo.ts +1 -3
  312. package/src/docs/components/docs-source-link.ts +0 -82
  313. package/src/docs/decorators/ancestor-attribute.md +59 -0
  314. package/src/docs/decorators/auto-subscribe.md +40 -0
  315. package/src/docs/decorators/bind.md +76 -0
  316. package/src/docs/decorators/get.md +160 -0
  317. package/src/docs/decorators/handle.md +119 -0
  318. package/src/docs/decorators/on-assign.md +63 -0
  319. package/src/docs/decorators/patch.md +44 -0
  320. package/src/docs/decorators/post.md +134 -0
  321. package/src/docs/decorators/publish.md +56 -0
  322. package/src/docs/decorators/put.md +51 -0
  323. package/src/docs/decorators/subscribe.md +87 -0
  324. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  325. package/src/docs/directives/sub.md +75 -0
  326. package/src/docs/directives/t.md +73 -0
  327. package/src/docs/docs-location.spec.ts +56 -0
  328. package/src/docs/docs-location.ts +133 -32
  329. package/src/docs/docs.ts +1 -2
  330. package/src/docs/example/decorators-demo-bind-demos.ts +83 -135
  331. package/src/docs/example/decorators-demo-geo.ts +30 -19
  332. package/src/docs/example/decorators-demo-post.ts +88 -186
  333. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  334. package/src/docs/example/decorators-demo.ts +85 -98
  335. package/src/docs/example/docs-api-config-demos.ts +19 -20
  336. package/src/docs/example/docs-flight-demos.ts +147 -0
  337. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  338. package/src/docs/example/docs-list-demos.ts +43 -123
  339. package/src/docs/example/docs-provider-keys.ts +21 -28
  340. package/src/docs/example/docs-queue-demos.ts +37 -77
  341. package/src/docs/example/docs-router-demos.ts +20 -25
  342. package/src/docs/example/docs-submit-demos.ts +48 -48
  343. package/src/docs/example/docs-toggle-demos.ts +4 -3
  344. package/src/docs/example/users.ts +0 -0
  345. package/src/docs/getting-started/ai-agents.md +50 -0
  346. package/src/docs/getting-started/create-a-component.md +136 -0
  347. package/src/docs/getting-started/dataFlow.md +87 -0
  348. package/src/docs/getting-started/installation.md +36 -0
  349. package/src/docs/getting-started/my-first-component.md +227 -0
  350. package/src/docs/getting-started/start.md +35 -0
  351. package/src/docs/header/header.ts +11 -6
  352. package/src/docs/home/catalog.ts +1 -1
  353. package/src/docs/home/home.ts +20 -11
  354. package/src/docs/layout.ts +12 -13
  355. package/src/docs/misc/api-configuration.md +79 -0
  356. package/src/docs/misc/dataProviderKey.md +168 -0
  357. package/src/docs/misc/docs-mock-api.md +62 -0
  358. package/src/docs/misc/dynamic-path.md +71 -0
  359. package/src/docs/misc/endpoint.md +45 -0
  360. package/src/docs/misc/html-integration.md +14 -0
  361. package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
  362. package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
  363. package/src/docs/misc/publisher-get-immutability-study.md +229 -0
  364. package/src/docs/mock-api/api-config-mock.ts +5 -0
  365. package/src/docs/mock-api/fixtures.ts +0 -278
  366. package/src/docs/mock-api/flights.ts +89 -0
  367. package/src/docs/mock-api/router.ts +3 -4
  368. package/src/docs/mock-api/urls.ts +1 -2
  369. package/src/docs/navigation/navigation.ts +84 -101
  370. package/src/docs/navigation/toc.ts +7 -4
  371. package/src/docs/search/docs-search.json +3188 -5153
  372. package/src/docs/search/markdown-renderer.ts +31 -8
  373. package/src/docs/search/page.ts +9 -6
  374. package/src/docs/search/search.ts +154 -122
  375. package/src/docs/tailwind/css/docs/content.css +4 -5
  376. package/src/tsconfig.declarations.json +22 -0
  377. package/src/tsconfig.emit.json +23 -0
  378. package/src/tsconfig.json +53 -5
  379. package/src/tsconfig.tsbuildinfo +1 -1
  380. package/vite.config.mts +11 -2
  381. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  382. package/.taste-skill/after/desktop-fold.jpg +0 -0
  383. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  384. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  385. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  386. package/.taste-skill/after/mobile-fold.jpg +0 -0
  387. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  388. package/.taste-skill/after/report.json +0 -4103
  389. package/.taste-skill/after/tablet-fold.jpg +0 -0
  390. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  391. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  392. package/.taste-skill/before/desktop-fold.jpg +0 -0
  393. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  394. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  395. package/.taste-skill/before/mobile-fold.jpg +0 -0
  396. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  397. package/.taste-skill/before/report.json +0 -2556
  398. package/.taste-skill/before/tablet-fold.jpg +0 -0
  399. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  400. package/.taste-skill/direction.json +0 -510
  401. package/.taste-skill/notes.md +0 -84
  402. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  403. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  404. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  405. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  406. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  407. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  408. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  409. package/.taste-skill/prod/report.json +0 -1973
  410. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  411. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  412. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  413. package/AUDIT.md +0 -228
  414. package/PLAN-AMELIORATION.md +0 -220
  415. package/ai/AGENTS.md +0 -56
  416. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  417. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  418. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  419. package/ai/cursor/rules/concorde.mdc +0 -66
  420. package/ai/jetbrains/rules/concorde.md +0 -53
  421. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  422. package/ai/skills/concorde-imports/SKILL.md +0 -78
  423. package/ai/skills/concorde-menu/SKILL.md +0 -74
  424. package/ai/skills/concorde-scope/SKILL.md +0 -70
  425. package/ai/skills/concorde-theme/SKILL.md +0 -57
  426. package/docs/assets/index-Bb-_LRyY.js +0 -12280
  427. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  428. package/src/docs/example/docs-joke-demos.ts +0 -297
  429. /package/{src → docs/src}/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -0
  430. /package/{src → docs/src}/docs/_core-concept/dataFlow.md +0 -0
  431. /package/{src → docs/src}/docs/_core-concept/overview.md +0 -0
  432. /package/{src → docs/src}/docs/_decorators/ancestor-attribute.md +0 -0
  433. /package/{src → docs/src}/docs/_decorators/auto-subscribe.md +0 -0
  434. /package/{src → docs/src}/docs/_decorators/bind.md +0 -0
  435. /package/{src → docs/src}/docs/_decorators/get.md +0 -0
  436. /package/{src → docs/src}/docs/_decorators/handle.md +0 -0
  437. /package/{src → docs/src}/docs/_decorators/on-assign.md +0 -0
  438. /package/{src → docs/src}/docs/_decorators/patch.md +0 -0
  439. /package/{src → docs/src}/docs/_decorators/post.md +0 -0
  440. /package/{src → docs/src}/docs/_decorators/publish.md +0 -0
  441. /package/{src → docs/src}/docs/_decorators/put.md +0 -0
  442. /package/{src → docs/src}/docs/_decorators/subscribe.md +0 -0
  443. /package/{src → docs/src}/docs/_decorators/wait-for-ancestors.md +0 -0
  444. /package/{src → docs/src}/docs/_directives/sub.md +0 -0
  445. /package/{src → docs/src}/docs/_getting-started/ai-agents.md +0 -0
  446. /package/{src → docs/src}/docs/_getting-started/concorde-manual-install.md +0 -0
  447. /package/{src → docs/src}/docs/_getting-started/concorde-outside.md +0 -0
  448. /package/{src → docs/src}/docs/_getting-started/create-a-component.md +0 -0
  449. /package/{src → docs/src}/docs/_getting-started/my-first-component.md +0 -0
  450. /package/{src → docs/src}/docs/_getting-started/start.md +0 -0
  451. /package/{src → docs/src}/docs/_misc/api-configuration.md +0 -0
  452. /package/{src → docs/src}/docs/_misc/dataProviderKey.md +0 -0
  453. /package/{src → docs/src}/docs/_misc/docs-mock-api.md +0 -0
  454. /package/{src → docs/src}/docs/_misc/dynamic-path.md +0 -0
  455. /package/{src → docs/src}/docs/_misc/endpoint.md +0 -0
  456. /package/{src → docs/src}/docs/_misc/formelement-subscriber-removal.md +0 -0
  457. /package/{src → docs/src}/docs/_misc/html-integration.md +0 -0
  458. /package/src/docs/{_getting-started → getting-started}/components.md +0 -0
  459. /package/src/docs/{_getting-started → getting-started}/theming.md +0 -0
@@ -0,0 +1,124 @@
1
+ import assert from "node:assert/strict";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "path";
5
+ import test from "node:test";
6
+ import {
7
+ generateHomepageMarkdown,
8
+ generateHtaccess,
9
+ generateNotFoundHtml,
10
+ generateNotFoundMarkdown,
11
+ pagePath,
12
+ writeAgentSiteArtifacts,
13
+ } from "./generate-crawl-docs.mjs";
14
+
15
+ function stripTags(html) {
16
+ return html
17
+ .replace(/<script[\s\S]*?<\/script>/gi, " ")
18
+ .replace(/<style[\s\S]*?<\/style>/gi, " ")
19
+ .replace(/<[^>]+>/g, " ")
20
+ .replace(/\s+/g, " ")
21
+ .trim();
22
+ }
23
+
24
+ test("pagePath builds pretty public pathnames", () => {
25
+ assert.equal(
26
+ pagePath("docs/getting-started/start.md"),
27
+ "/docs/getting-started/start",
28
+ );
29
+ assert.equal(
30
+ pagePath("core/components/ui/button/button.md"),
31
+ "/core/components/ui/button",
32
+ );
33
+ assert.equal(
34
+ pagePath("core/components/functional/sdui/sdui-extension-points.md"),
35
+ "/core/components/functional/sdui/sdui-extension-points",
36
+ );
37
+ });
38
+
39
+ test("homepage Markdown meets Accept negotiation body requirements", () => {
40
+ const md = generateHomepageMarkdown();
41
+ assert.match(md, /^# Concorde by Supersoniks/m);
42
+ assert.match(md, /@supersoniks\/concorde/);
43
+ assert.match(md, /llms\.txt/);
44
+ assert.match(md, /Accept: text\/markdown/);
45
+ assert.match(md, /docs\/getting-started\/start/);
46
+ assert.doesNotMatch(md, /\/crawl\//);
47
+ assert.doesNotMatch(md, /\/docs\/_getting-started\//);
48
+ assert.ok(md.length >= 500, `expected ≥500 chars, got ${md.length}`);
49
+ });
50
+
51
+ test("404 Markdown explains the error and links agent entry points", () => {
52
+ const md = generateNotFoundMarkdown();
53
+ assert.ok(md.length >= 20);
54
+ assert.match(md, /not found/i);
55
+ assert.match(md, /llms\.txt|sitemap\.xml|docs\/index/);
56
+ assert.doesNotMatch(md, /\/crawl\//);
57
+ assert.match(md, /https:\/\/concorde\.supersoniks\.org/);
58
+ });
59
+
60
+ test("404 HTML keeps a human-readable fallback", () => {
61
+ const html = generateNotFoundHtml();
62
+ assert.match(html, /<h1>Page not found<\/h1>/);
63
+ assert.match(html, /llms\.txt/);
64
+ assert.doesNotMatch(html, /\/crawl\//);
65
+ });
66
+
67
+ test("htaccess maps components and negotiates Markdown/HTML", () => {
68
+ const conf = generateHtaccess();
69
+ assert.match(conf, /RewriteEngine On/);
70
+ assert.match(conf, /text\/markdown/);
71
+ assert.match(conf, /index\.md/);
72
+ assert.match(conf, /ErrorDocument 404 \/404\.md/);
73
+ assert.match(conf, /\$1\/\$2\/\$2\.md/);
74
+ assert.match(conf, /Googlebot/);
75
+ assert.match(conf, /index\.html \[END\]/);
76
+ assert.match(conf, /DirectorySlash Off/);
77
+ assert.doesNotMatch(conf, /docs\/_/);
78
+ assert.doesNotMatch(conf, /THE_REQUEST/);
79
+ assert.doesNotMatch(conf, /\^crawl\//);
80
+ });
81
+
82
+ test("writeAgentSiteArtifacts emits negotiation files", () => {
83
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "concorde-agent-"));
84
+ try {
85
+ writeAgentSiteArtifacts(dir);
86
+ for (const name of ["index.md", "404.md", "404.html", ".htaccess"]) {
87
+ const filePath = path.join(dir, name);
88
+ assert.ok(fs.existsSync(filePath), `missing ${name}`);
89
+ assert.ok(fs.statSync(filePath).size > 20, `${name} too small`);
90
+ }
91
+ } finally {
92
+ fs.rmSync(dir, { recursive: true, force: true });
93
+ }
94
+ });
95
+
96
+ test("source index.html ships ≥500 chars of meaningful agent content with H1", () => {
97
+ const indexPath = path.resolve("index.html");
98
+ const html = fs.readFileSync(indexPath, "utf8");
99
+ assert.match(html, /id="docs-agent-content"/);
100
+ assert.match(html, /<h1>Concorde by Supersoniks<\/h1>/);
101
+ assert.match(html, /href="\/docs\/getting-started\/start"/);
102
+ assert.doesNotMatch(html, /\/docs\/_getting-started\//);
103
+ assert.doesNotMatch(html, /\/crawl\//);
104
+
105
+ const section = html.match(
106
+ /<section id="docs-agent-content"[^>]*>([\s\S]*?)<\/section>/,
107
+ );
108
+ assert.ok(section, "docs-agent-content section missing");
109
+ const text = stripTags(section[1]);
110
+ assert.ok(
111
+ text.length >= 500,
112
+ `agent section text expected ≥500 chars, got ${text.length}`,
113
+ );
114
+ });
115
+
116
+ test("public robots.txt allows pathnames and drops /crawl/", () => {
117
+ const robots = fs.readFileSync(path.resolve("public/robots.txt"), "utf8");
118
+ assert.match(robots, /Allow: \//);
119
+ assert.match(robots, /Allow: \/docs\//);
120
+ assert.match(robots, /Allow: \/core\//);
121
+ assert.match(robots, /Allow: \/llms\.txt/);
122
+ assert.doesNotMatch(robots, /Allow: \/crawl\//);
123
+ assert.doesNotMatch(robots, /Googlebot[\s\S]*Disallow: \//);
124
+ });
@@ -14,7 +14,7 @@ import { fileURLToPath } from "url";
14
14
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
15
  const ROOT = path.resolve(__dirname, "..");
16
16
  const CEM_DIR = path.join(ROOT, ".tmp-cem");
17
- const CEM_PATH = path.join(CEM_DIR, "custom-elements.json");
17
+ export const CEM_PATH = path.join(CEM_DIR, "custom-elements.json");
18
18
  const OUT_CATALOG = path.join(
19
19
  ROOT,
20
20
  "src/core/components/functional/sdui/component-catalog.json"
@@ -24,7 +24,7 @@ const OUT_GAPS = path.join(
24
24
  "src/core/components/functional/sdui/component-catalog.gaps.json"
25
25
  );
26
26
 
27
- function extractTagNameFromSource(filePath) {
27
+ export function extractTagNameFromSource(filePath) {
28
28
  if (!fs.existsSync(filePath)) return undefined;
29
29
  const src = fs.readFileSync(filePath, "utf8");
30
30
  const literal = src.match(/@customElement\(\s*["'`]([^"'`]+)["'`]\s*\)/);
@@ -176,8 +176,12 @@ export function cemToCatalog(cem, { resolveTagName } = {}) {
176
176
  };
177
177
  }
178
178
 
179
- function runCem() {
179
+ export function runCem(
180
+ configPath = path.join(ROOT, "custom-elements-manifest.config.mjs"),
181
+ ) {
180
182
  fs.mkdirSync(CEM_DIR, { recursive: true });
183
+ const pkgPath = path.join(ROOT, "package.json");
184
+ const pkgBefore = fs.readFileSync(pkgPath, "utf8");
181
185
  const cemBin = path.join(
182
186
  ROOT,
183
187
  "node_modules/@custom-elements-manifest/analyzer/cem.js"
@@ -188,16 +192,13 @@ function runCem() {
188
192
  cemBin,
189
193
  "analyze",
190
194
  "--config",
191
- path.join(ROOT, "custom-elements-manifest.config.mjs"),
195
+ configPath,
192
196
  ],
193
197
  { cwd: ROOT, stdio: ["ignore", "pipe", "pipe"] }
194
198
  );
195
- // Ne pas laisser cem écrire customElements dans package.json
196
- const pkgPath = path.join(ROOT, "package.json");
197
- const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
198
- if (pkg.customElements) {
199
- delete pkg.customElements;
200
- fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
199
+ // cem may rewrite package.json (customElements): keep it as it was
200
+ if (fs.readFileSync(pkgPath, "utf8") !== pkgBefore) {
201
+ fs.writeFileSync(pkgPath, pkgBefore);
201
202
  }
202
203
  }
203
204
 
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Prépare une arborescence « lib publique » pour GitHub :
4
+ * - sans site doc (src/docs, index.html, …)
5
+ * - sans sonic-captcha (altcha.supersoniks.org)
6
+ * - sans scripts / jobs GitLab internes
7
+ *
8
+ * Usage :
9
+ * node scripts/github-export.mjs [répertoire_cible]
10
+ *
11
+ * Par défaut : ../concorde-github-export
12
+ */
13
+ import fs from "fs";
14
+ import path from "path";
15
+ import { fileURLToPath } from "url";
16
+
17
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
18
+ const ROOT = path.resolve(__dirname, "..");
19
+ const IGNORE_FILE = path.join(ROOT, ".github-export-ignore");
20
+ const DEFAULT_OUT = path.resolve(ROOT, "../concorde-github-export");
21
+
22
+ const EXPORT_FILTER_KEY =
23
+ /(?:^|\/)(?:docs|mock-api|undefined)(?:\/|$)|captcha|\.demo\.|\.stories\.|TestUtils|\/prism\/|\/search\/|\/tailwind\/|\/header\/|\/navigation\/|\/layout\.ts$|\/code\.ts$|^code$|^docs$|^layout$/;
24
+
25
+ function readIgnorePatterns() {
26
+ if (!fs.existsSync(IGNORE_FILE)) return [];
27
+ return fs
28
+ .readFileSync(IGNORE_FILE, "utf8")
29
+ .split("\n")
30
+ .map((l) => l.trim())
31
+ .filter((l) => l && !l.startsWith("#"));
32
+ }
33
+
34
+ function globToRegExp(pattern) {
35
+ const escaped = pattern
36
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
37
+ .replace(/\*\*/g, "{{GLOBSTAR}}")
38
+ .replace(/\*/g, "[^/]*")
39
+ .replace(/\{\{GLOBSTAR\}\}/g, ".*");
40
+ return new RegExp(`^${escaped}$`);
41
+ }
42
+
43
+ function shouldExclude(relativePath, patterns) {
44
+ const normalized = relativePath.replace(/\\/g, "/");
45
+ for (const pattern of patterns) {
46
+ const re = globToRegExp(pattern);
47
+ if (re.test(normalized)) return true;
48
+ if (normalized.startsWith(pattern.endsWith("/") ? pattern : `${pattern}/`))
49
+ return true;
50
+ if (normalized === pattern) return true;
51
+ }
52
+ return false;
53
+ }
54
+
55
+ function listAllFiles(dir, base = dir) {
56
+ const out = [];
57
+ for (const name of fs.readdirSync(dir, { withFileTypes: true })) {
58
+ if (name.name === ".git" || name.name === "node_modules") continue;
59
+ const full = path.join(dir, name.name);
60
+ const rel = path.relative(base, full).replace(/\\/g, "/");
61
+ if (name.isDirectory()) {
62
+ if (shouldExclude(rel, ignorePatterns)) continue;
63
+ out.push(...listAllFiles(full, base));
64
+ } else {
65
+ if (!shouldExclude(rel, ignorePatterns)) out.push(rel);
66
+ }
67
+ }
68
+ return out;
69
+ }
70
+
71
+ function copyFile(rel, destRoot) {
72
+ const src = path.join(ROOT, rel);
73
+ const dest = path.join(destRoot, rel);
74
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
75
+ fs.copyFileSync(src, dest);
76
+ }
77
+
78
+ function patchUiTs(destRoot) {
79
+ const uiPath = path.join(
80
+ destRoot,
81
+ "src/core/components/ui/ui.ts",
82
+ );
83
+ if (!fs.existsSync(uiPath)) return;
84
+ const content = fs.readFileSync(uiPath, "utf8");
85
+ const patched = content.replace(
86
+ /import "\.\/captcha\/captcha";\n?/,
87
+ "",
88
+ );
89
+ fs.writeFileSync(uiPath, patched);
90
+ }
91
+
92
+ function exportHaystack(value) {
93
+ if (typeof value === "string") return value;
94
+ if (value && typeof value === "object") {
95
+ return `${value.types ?? ""}${value.default ?? ""}`;
96
+ }
97
+ return String(value);
98
+ }
99
+
100
+ function filterPackageJson(destRoot) {
101
+ const pkgPath = path.join(destRoot, "package.json");
102
+ if (!fs.existsSync(pkgPath)) return;
103
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
104
+ if (pkg.exports && typeof pkg.exports === "object") {
105
+ const next = {};
106
+ for (const [key, value] of Object.entries(pkg.exports)) {
107
+ const hay = `${key}:${exportHaystack(value)}`;
108
+ if (EXPORT_FILTER_KEY.test(hay)) continue;
109
+ if (exportHaystack(value).includes("/captcha/")) continue;
110
+ if (exportHaystack(value).includes("/docs/")) continue;
111
+ if (exportHaystack(value).includes(".demo.")) continue;
112
+ if (exportHaystack(value).includes(".stories.")) continue;
113
+ next[key] = value;
114
+ }
115
+ pkg.exports = next;
116
+ }
117
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
118
+ }
119
+
120
+ function patchReadme(destRoot) {
121
+ const readmePath = path.join(destRoot, "README.md");
122
+ if (!fs.existsSync(readmePath)) return;
123
+ let text = fs.readFileSync(readmePath, "utf8");
124
+ text = text.replace(
125
+ /Le dépôt GitHub est un \*\*miroir\*\* synchronisé depuis GitLab \(voir \[OPEN_SOURCE_CHECKPOINT\.md\]\(OPEN_SOURCE_CHECKPOINT\.md\)\)\./,
126
+ "Le dépôt GitHub est un **export filtré** depuis GitLab (librairie uniquement, sans site doc ni composant captcha — voir [OPEN_SOURCE_CHECKPOINT.md](OPEN_SOURCE_CHECKPOINT.md)).",
127
+ );
128
+ fs.writeFileSync(readmePath, text);
129
+ }
130
+
131
+ const ignorePatterns = readIgnorePatterns();
132
+ const outDir = path.resolve(process.argv[2] || DEFAULT_OUT);
133
+
134
+ if (fs.existsSync(outDir)) {
135
+ fs.rmSync(outDir, { recursive: true, force: true });
136
+ }
137
+ fs.mkdirSync(outDir, { recursive: true });
138
+
139
+ const files = listAllFiles(ROOT);
140
+ for (const rel of files) {
141
+ copyFile(rel, outDir);
142
+ }
143
+
144
+ patchUiTs(outDir);
145
+ filterPackageJson(outDir);
146
+ patchReadme(outDir);
147
+
148
+ console.log(`✅ Export GitHub : ${files.length} fichiers → ${outDir}`);
149
+ console.log(" Exclusions : .github-export-ignore");
150
+ console.log(" Patches : ui.ts (sans captcha), package.json exports");
@@ -1,57 +1,62 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
3
  import { generateCrawlDocs } from "./generate-crawl-docs.mjs";
4
+ import { generateCem } from "./generate-cem.mjs";
4
5
 
5
6
  const src = path.resolve("src");
6
7
  const docs = path.resolve("docs");
7
- /**
8
- * lister les fichiers d'un répertoire de manière récursive
9
- */
8
+
10
9
  function listFiles(dir) {
11
10
  let files = [];
12
11
  let list = fs.readdirSync(dir);
13
12
  list.forEach((file) => {
14
- const path = dir + "/" + file;
15
- let stat = fs.statSync(path);
13
+ const filePath = dir + "/" + file;
14
+ let stat = fs.statSync(filePath);
16
15
  if (stat && stat.isDirectory()) {
17
- files = files.concat(listFiles(path));
16
+ files = files.concat(listFiles(filePath));
18
17
  } else {
19
- files.push(path);
18
+ files.push(filePath);
20
19
  }
21
20
  });
22
21
  return files;
23
22
  }
24
23
 
24
+ function ensureCopy(absSrc, absDest) {
25
+ fs.mkdirSync(path.dirname(absDest), { recursive: true });
26
+ fs.copyFileSync(absSrc, absDest);
27
+ }
28
+
25
29
  /**
26
- * copier toues les fichiers .md présents dans le répertpoire src et ses sous dossiers de manière récurcive vers dossier docs en respectant l'arborescence qu'il y avait dans le dossier src
27
- * il faut creer le chemin si il n'existe pas avant de copier le fichier
30
+ * Publish markdown at the public pathname (`/docs/…/page.md`, `/core/…/page.md`)
31
+ * and keep a `/src/…` copy for non-md assets (and legacy MD until 301).
28
32
  */
29
33
  function copyDocs() {
30
- let files = listFiles(src);
34
+ const files = listFiles(src);
31
35
  for (const file of files) {
32
- if (file.indexOf(".md") != -1 || file.indexOf(".json") != -1) {
33
- let idx = file.indexOf("src/");
34
- let dest = file.substring(idx);
35
- let split = dest.split("/");
36
- let dir = path.resolve(docs);
37
- for (let i = 0; i < split.length - 1; i++) {
38
- dir += "/" + split[i];
39
- if (!fs.existsSync(dir)) {
40
- fs.mkdirSync(dir);
41
- }
42
- }
43
- dir += "/" + split[split.length - 1];
44
- fs.copyFileSync(file, dir);
36
+ const isMd = /\.mdx?$/i.test(file);
37
+ const isJson = file.endsWith(".json");
38
+ if (!isMd && !isJson) continue;
39
+
40
+ const idx = file.indexOf("src/");
41
+ if (idx === -1) continue;
42
+ const underSrc = file.substring(idx); // src/docs/…/x.md
43
+ const withoutSrc = underSrc.replace(/^src\//, ""); // docs/…/x.md
44
+
45
+ // Always keep under docs/src/… (json + legacy md paths)
46
+ ensureCopy(file, path.join(docs, underSrc));
47
+
48
+ // Public MD URLs: /docs/… and /core/… (+ .md)
49
+ if (isMd && /^(docs|core)\//.test(withoutSrc)) {
50
+ ensureCopy(file, path.join(docs, withoutSrc));
45
51
  }
46
52
  }
47
53
  }
54
+
48
55
  copyDocs();
56
+ // Custom Elements Manifest, served at /custom-elements.json
57
+ fs.copyFileSync(generateCem(), path.join(docs, "custom-elements.json"));
49
58
  generateCrawlDocs();
50
59
 
51
- /**
52
- * Par rapport au projet, regarder si ../concorde_doc existe et si oui, remplacer le contenu de /concorde_doc par celui de contenu dans docs/ en dehors des fichiers spécifiques à git .git .gitignore .gitattributes)
53
- */
54
-
55
60
  function copyToConcordeDoc() {
56
61
  let concordeDoc = path.resolve("../concorde_doc");
57
62
 
@@ -60,15 +65,17 @@ function copyToConcordeDoc() {
60
65
  }
61
66
 
62
67
  try {
63
- /* first remove all files/foilders in concorde_doc except .git folder and .gitignore file */
64
68
  let files = listFiles(concordeDoc);
65
69
  for (const file of files) {
66
70
  if (file.indexOf(".git") == -1) {
67
71
  fs.unlinkSync(file);
68
72
  }
69
73
  }
74
+ const legacyCrawl = path.join(concordeDoc, "crawl");
75
+ if (fs.existsSync(legacyCrawl)) {
76
+ fs.rmSync(legacyCrawl, { recursive: true, force: true });
77
+ }
70
78
 
71
- /*then copy the new files*/
72
79
  files = listFiles(docs);
73
80
  for (const file of files) {
74
81
  let idx = file.indexOf("docs/") + 5;
@@ -95,29 +102,9 @@ function copyToConcordeDoc() {
95
102
  console.warn(
96
103
  "copyToConcordeDoc: skipped (",
97
104
  err.code || err.message,
98
- ") — docs/ and docs/crawl/ were still generated.",
105
+ ") — docs/ pathnames (HTML + MD + hubs) were still generated.",
99
106
  );
100
107
  }
101
108
  }
102
109
 
103
110
  copyToConcordeDoc();
104
-
105
- /**
106
- * dans ../concorde_doc, faire un git add, commit et push
107
- */
108
- /*
109
- function gitConcordeDoc() {
110
- let concordeDoc = path.resolve("../concorde_doc");
111
- if (fs.existsSync(concordeDoc)) {
112
- exec("cd " + concordeDoc + " && git add . && git commit -m 'update doc' && git push", (error, stdout, stderr) => {
113
- if (error) {
114
- console.error(`exec error: ${error}`);
115
- return;
116
- }
117
- console.log(`stdout: ${stdout}`);
118
- console.error(`stderr: ${stderr}`);
119
- });
120
- }
121
- }
122
-
123
- gitConcordeDoc(); */
File without changes
@@ -4,8 +4,9 @@ import fs from "fs";
4
4
  const requiredFiles = [
5
5
  'concorde-core.bundle.js',
6
6
  'concorde-core.es.js',
7
- 'ai/AGENTS.md',
7
+ 'ai/skills/concorde/SKILL.md',
8
8
  'scripts/ai-init.mjs',
9
+ 'custom-elements.json',
9
10
  ];
10
11
 
11
12
  let allFilesExist = true;