@supersoniks/concorde 5.1.1 → 5.1.3

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 (494) 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/PLAN-DOCS-AGENTS.md +80 -0
  6. package/README.md +4 -4
  7. package/ai/README.md +29 -41
  8. package/ai/skills/concorde/SKILL.md +54 -324
  9. package/ai/skills/concorde/rules/composition.md +32 -0
  10. package/ai/skills/concorde/rules/data.md +47 -0
  11. package/ai/skills/concorde/rules/http.md +25 -0
  12. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  13. package/ai/skills/concorde/rules/styling.md +46 -0
  14. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  15. package/build-infos.json +1 -1
  16. package/concorde-core.bundle.js +21 -21
  17. package/concorde-core.es.js +977 -980
  18. package/custom-elements-manifest.public.config.mjs +8 -0
  19. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11758 -8904
  20. package/dist/concorde-core.bundle.js +21 -21
  21. package/dist/concorde-core.es.js +977 -980
  22. package/dist/docs-mock-api-sw.js +58 -223
  23. package/dist/docs-mock-api-sw.js.map +4 -4
  24. package/dist/img/concorde/plane_01.jpg +0 -0
  25. package/dist/img/concorde/plane_02.jpg +0 -0
  26. package/dist/img/concorde/plane_03.jpg +0 -0
  27. package/dist/img/concorde/plane_04.jpg +0 -0
  28. package/dist/img/concorde/plane_05.jpg +0 -0
  29. package/dist/img/concorde/plane_06.jpg +0 -0
  30. package/dist/img/concorde/plane_07.jpg +0 -0
  31. package/dist/img/concorde/plane_08.jpg +0 -0
  32. package/dist/img/concorde/plane_09.jpg +0 -0
  33. package/dist/img/concorde/plane_10.jpg +0 -0
  34. package/dist/img/concorde/plane_11.jpg +0 -0
  35. package/dist/img/concorde/plane_12.jpg +0 -0
  36. package/dist/img/concorde/plane_13.jpg +0 -0
  37. package/dist/img/og-concorde.jpg +0 -0
  38. package/dist/robots.txt +11 -10
  39. package/docs/.htaccess +82 -0
  40. package/docs/404.html +15 -0
  41. package/docs/404.md +5 -0
  42. package/docs/about.html +111 -0
  43. package/docs/about.md +22 -0
  44. package/docs/assets/{index-Bb-_LRyY.js → index-6sS76xWj.js} +2625 -3158
  45. package/docs/assets/index-DkdPbH0F.css +1 -0
  46. package/docs/core/components/functional/date/date.html +211 -0
  47. package/docs/core/components/functional/date/date.md +150 -0
  48. package/docs/core/components/functional/fetch/fetch.html +180 -0
  49. package/docs/core/components/functional/fetch/fetch.md +108 -0
  50. package/docs/core/components/functional/if/if.html +65 -0
  51. package/docs/core/components/functional/if/if.md +34 -0
  52. package/docs/core/components/functional/jsonata/jsonata.html +110 -0
  53. package/docs/core/components/functional/jsonata/jsonata.md +61 -0
  54. package/docs/core/components/functional/list/list.html +200 -0
  55. package/docs/core/components/functional/list/list.md +125 -0
  56. package/docs/core/components/functional/mix/mix.html +78 -0
  57. package/docs/core/components/functional/mix/mix.md +46 -0
  58. package/docs/core/components/functional/queue/queue.html +155 -0
  59. package/docs/core/components/functional/queue/queue.md +51 -0
  60. package/docs/core/components/functional/router/router.html +154 -0
  61. package/docs/core/components/functional/router/router.md +93 -0
  62. package/docs/core/components/functional/sdui/sdui-extension-points.html +127 -0
  63. package/docs/core/components/functional/sdui/sdui-extension-points.md +94 -0
  64. package/docs/core/components/functional/sdui/sdui.html +397 -0
  65. package/docs/core/components/functional/sdui/sdui.md +307 -0
  66. package/docs/core/components/functional/states/states.html +141 -0
  67. package/docs/core/components/functional/states/states.md +112 -0
  68. package/docs/core/components/functional/submit/submit.html +178 -0
  69. package/docs/core/components/functional/submit/submit.md +106 -0
  70. package/docs/core/components/functional/subscriber/subscriber.html +68 -0
  71. package/docs/core/components/functional/subscriber/subscriber.md +91 -0
  72. package/docs/core/components/functional/translation/translation.html +60 -0
  73. package/docs/core/components/functional/translation/translation.md +38 -0
  74. package/docs/core/components/functional/value/value.html +81 -0
  75. package/docs/core/components/functional/value/value.md +47 -0
  76. package/docs/core/components/ui/alert/alert.html +201 -0
  77. package/docs/core/components/ui/alert/alert.md +186 -0
  78. package/docs/core/components/ui/alert-messages/alert-messages.html +132 -0
  79. package/docs/core/components/ui/alert-messages/alert-messages.md +85 -0
  80. package/docs/core/components/ui/badge/badge.html +197 -0
  81. package/docs/core/components/ui/badge/badge.md +181 -0
  82. package/docs/core/components/ui/button/button.html +309 -0
  83. package/docs/core/components/ui/button/button.md +216 -0
  84. package/docs/core/components/ui/captcha/captcha.html +80 -0
  85. package/docs/core/components/ui/captcha/captcha.md +56 -0
  86. package/docs/core/components/ui/card/card.html +254 -0
  87. package/docs/core/components/ui/card/card.md +215 -0
  88. package/docs/core/components/ui/divider/divider.html +144 -0
  89. package/docs/core/components/ui/divider/divider.md +126 -0
  90. package/docs/core/components/ui/form/checkbox/checkbox.html +200 -0
  91. package/docs/core/components/ui/form/checkbox/checkbox.md +125 -0
  92. package/docs/core/components/ui/form/fieldset/fieldset.html +238 -0
  93. package/docs/core/components/ui/form/fieldset/fieldset.md +161 -0
  94. package/docs/core/components/ui/form/form-actions/form-actions.html +122 -0
  95. package/docs/core/components/ui/form/form-actions/form-actions.md +98 -0
  96. package/docs/core/components/ui/form/form-layout/form-layout.html +115 -0
  97. package/docs/core/components/ui/form/form-layout/form-layout.md +109 -0
  98. package/docs/core/components/ui/form/input/input.html +235 -0
  99. package/docs/core/components/ui/form/input/input.md +142 -0
  100. package/docs/core/components/ui/form/radio/radio.html +144 -0
  101. package/docs/core/components/ui/form/radio/radio.md +78 -0
  102. package/docs/core/components/ui/form/select/select.html +178 -0
  103. package/docs/core/components/ui/form/select/select.md +86 -0
  104. package/docs/core/components/ui/form/switch/switch.html +146 -0
  105. package/docs/core/components/ui/form/switch/switch.md +80 -0
  106. package/docs/core/components/ui/form/textarea/textarea.html +162 -0
  107. package/docs/core/components/ui/form/textarea/textarea.md +82 -0
  108. package/docs/core/components/ui/group/group.html +113 -0
  109. package/docs/core/components/ui/group/group.md +77 -0
  110. package/docs/core/components/ui/icon/icon.html +223 -0
  111. package/docs/core/components/ui/icon/icon.md +214 -0
  112. package/docs/core/components/ui/image/image.html +194 -0
  113. package/docs/core/components/ui/image/image.md +167 -0
  114. package/docs/core/components/ui/link/link.html +101 -0
  115. package/docs/core/components/ui/link/link.md +81 -0
  116. package/docs/core/components/ui/loader/loader.html +114 -0
  117. package/docs/core/components/ui/loader/loader.md +87 -0
  118. package/docs/core/components/ui/menu/menu.html +395 -0
  119. package/docs/core/components/ui/menu/menu.md +370 -0
  120. package/docs/core/components/ui/modal/modal.html +324 -0
  121. package/docs/core/components/ui/modal/modal.md +211 -0
  122. package/docs/core/components/ui/pop/pop.html +250 -0
  123. package/docs/core/components/ui/pop/pop.md +216 -0
  124. package/docs/core/components/ui/progress/progress.html +132 -0
  125. package/docs/core/components/ui/progress/progress.md +109 -0
  126. package/docs/core/components/ui/table/table.html +333 -0
  127. package/docs/core/components/ui/table/table.md +267 -0
  128. package/docs/core/components/ui/theme/theme.html +116 -0
  129. package/docs/core/components/ui/theme/theme.md +97 -0
  130. package/docs/core/components/ui/toast/toast.html +185 -0
  131. package/docs/core/components/ui/toast/toast.md +147 -0
  132. package/docs/core/components/ui/tooltip/tooltip.html +112 -0
  133. package/docs/core/components/ui/tooltip/tooltip.md +89 -0
  134. package/docs/custom-elements.json +16559 -0
  135. package/docs/docs/decorators/ancestor-attribute.html +71 -0
  136. package/docs/docs/decorators/ancestor-attribute.md +59 -0
  137. package/docs/docs/decorators/auto-subscribe.html +61 -0
  138. package/docs/docs/decorators/auto-subscribe.md +40 -0
  139. package/docs/docs/decorators/bind.html +87 -0
  140. package/docs/docs/decorators/bind.md +76 -0
  141. package/docs/docs/decorators/get.html +166 -0
  142. package/docs/docs/decorators/get.md +160 -0
  143. package/docs/docs/decorators/handle.html +139 -0
  144. package/docs/docs/decorators/handle.md +119 -0
  145. package/docs/docs/decorators/on-assign.html +72 -0
  146. package/docs/docs/decorators/on-assign.md +63 -0
  147. package/docs/docs/decorators/patch.html +76 -0
  148. package/docs/docs/decorators/patch.md +44 -0
  149. package/docs/docs/decorators/post.html +150 -0
  150. package/docs/docs/decorators/post.md +134 -0
  151. package/docs/docs/decorators/publish.html +74 -0
  152. package/docs/docs/decorators/publish.md +56 -0
  153. package/docs/docs/decorators/put.html +83 -0
  154. package/docs/docs/decorators/put.md +51 -0
  155. package/docs/docs/decorators/subscribe.html +91 -0
  156. package/docs/docs/decorators/subscribe.md +87 -0
  157. package/docs/docs/decorators/wait-for-ancestors.html +82 -0
  158. package/docs/docs/decorators/wait-for-ancestors.md +76 -0
  159. package/docs/docs/directives/sub.html +79 -0
  160. package/docs/docs/directives/sub.md +75 -0
  161. package/docs/docs/directives/t.html +91 -0
  162. package/docs/docs/directives/t.md +73 -0
  163. package/docs/docs/getting-started/ai-agents.html +130 -0
  164. package/docs/docs/getting-started/ai-agents.md +50 -0
  165. package/docs/docs/getting-started/components.html +27 -0
  166. package/docs/docs/getting-started/create-a-component.html +108 -0
  167. package/{src/docs/_getting-started → docs/docs/getting-started}/create-a-component.md +3 -6
  168. package/docs/docs/getting-started/dataFlow.html +174 -0
  169. package/{src/docs/_core-concept → docs/docs/getting-started}/dataFlow.md +18 -19
  170. package/docs/docs/getting-started/installation.html +69 -0
  171. package/docs/docs/getting-started/installation.md +36 -0
  172. package/docs/docs/getting-started/my-first-component.html +180 -0
  173. package/{src/docs/_getting-started → docs/docs/getting-started}/my-first-component.md +5 -14
  174. package/docs/docs/getting-started/start.html +47 -0
  175. package/{src/docs/_getting-started → docs/docs/getting-started}/start.md +1 -13
  176. package/docs/docs/getting-started/theming.html +334 -0
  177. package/docs/docs/index.html +99 -0
  178. package/docs/docs/misc/api-configuration.html +149 -0
  179. package/{src/docs/_misc → docs/docs/misc}/api-configuration.md +10 -12
  180. package/docs/docs/misc/dataProviderKey.html +136 -0
  181. package/{src/docs/_misc → docs/docs/misc}/dataProviderKey.md +4 -4
  182. package/docs/docs/misc/docs-mock-api.html +155 -0
  183. package/{src/docs/_misc → docs/docs/misc}/docs-mock-api.md +12 -13
  184. package/docs/docs/misc/dynamic-path.html +181 -0
  185. package/{src/docs/_misc → docs/docs/misc}/dynamic-path.md +8 -8
  186. package/docs/docs/misc/endpoint.html +51 -0
  187. package/{src/docs/_misc → docs/docs/misc}/endpoint.md +8 -8
  188. package/docs/docs/misc/html-integration.html +45 -0
  189. package/{src/docs/_misc → docs/docs/misc}/html-integration.md +4 -5
  190. package/docs/docs-mock-api-sw.js +58 -223
  191. package/docs/docs-mock-api-sw.js.map +4 -4
  192. package/docs/hubs/decorators.html +438 -0
  193. package/docs/hubs/form-components.html +404 -0
  194. package/docs/hubs/remote-data.html +367 -0
  195. package/docs/img/archive/concorde-001-2cv.webp +0 -0
  196. package/docs/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  197. package/docs/img/archive/concorde-red-arrows-2002.webm +0 -0
  198. package/docs/img/archive/credits.json +28 -0
  199. package/docs/img/concorde/plane_01.jpg +0 -0
  200. package/docs/img/concorde/plane_02.jpg +0 -0
  201. package/docs/img/concorde/plane_03.jpg +0 -0
  202. package/docs/img/concorde/plane_04.jpg +0 -0
  203. package/docs/img/concorde/plane_05.jpg +0 -0
  204. package/docs/img/concorde/plane_06.jpg +0 -0
  205. package/docs/img/concorde/plane_07.jpg +0 -0
  206. package/docs/img/concorde/plane_08.jpg +0 -0
  207. package/docs/img/concorde/plane_09.jpg +0 -0
  208. package/docs/img/concorde/plane_10.jpg +0 -0
  209. package/docs/img/concorde/plane_11.jpg +0 -0
  210. package/docs/img/concorde/plane_12.jpg +0 -0
  211. package/docs/img/concorde/plane_13.jpg +0 -0
  212. package/docs/img/og-concorde.jpg +0 -0
  213. package/docs/index.html +184 -68
  214. package/docs/index.md +22 -0
  215. package/docs/llms-full.txt +5779 -0
  216. package/docs/llms.txt +108 -0
  217. package/docs/privacy.html +122 -0
  218. package/docs/privacy.md +32 -0
  219. package/docs/robots.txt +11 -10
  220. package/docs/sitemap.xml +243 -0
  221. package/docs/src/core/components/functional/date/date.md +150 -0
  222. package/docs/src/core/components/functional/fetch/fetch.md +108 -0
  223. package/docs/src/core/components/functional/if/if.md +34 -0
  224. package/docs/src/core/components/functional/jsonata/jsonata.md +61 -0
  225. package/docs/src/core/components/functional/list/list.md +125 -0
  226. package/docs/src/core/components/functional/mix/mix.md +46 -0
  227. package/docs/src/core/components/functional/queue/queue.md +51 -0
  228. package/docs/src/core/components/functional/router/router.md +93 -0
  229. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  230. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  231. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  232. package/docs/src/core/components/functional/sdui/example.json +32 -0
  233. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  234. package/docs/src/core/components/functional/sdui/sdui.md +307 -0
  235. package/docs/src/core/components/functional/states/states.md +112 -0
  236. package/docs/src/core/components/functional/submit/submit.md +106 -0
  237. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  238. package/docs/src/core/components/functional/translation/translation.md +38 -0
  239. package/docs/src/core/components/functional/value/value.md +47 -0
  240. package/docs/src/core/components/ui/alert/alert.md +186 -0
  241. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  242. package/docs/src/core/components/ui/badge/badge.md +181 -0
  243. package/docs/src/core/components/ui/button/button.md +216 -0
  244. package/docs/src/core/components/ui/captcha/captcha.md +56 -0
  245. package/docs/src/core/components/ui/card/card.md +215 -0
  246. package/docs/src/core/components/ui/divider/divider.md +126 -0
  247. package/docs/src/core/components/ui/form/checkbox/checkbox.md +125 -0
  248. package/docs/src/core/components/ui/form/fieldset/fieldset.md +161 -0
  249. package/docs/src/core/components/ui/form/form-actions/form-actions.md +98 -0
  250. package/docs/src/core/components/ui/form/form-layout/form-layout.md +109 -0
  251. package/docs/src/core/components/ui/form/input/input.md +142 -0
  252. package/docs/src/core/components/ui/form/radio/radio.md +78 -0
  253. package/docs/src/core/components/ui/form/select/select.md +86 -0
  254. package/docs/src/core/components/ui/form/switch/switch.md +80 -0
  255. package/docs/src/core/components/ui/form/textarea/textarea.md +82 -0
  256. package/docs/src/core/components/ui/group/group.md +77 -0
  257. package/docs/src/core/components/ui/icon/icon.md +214 -0
  258. package/docs/src/core/components/ui/icon/icons.json +1 -0
  259. package/docs/src/core/components/ui/image/image.md +167 -0
  260. package/docs/src/core/components/ui/link/link.md +81 -0
  261. package/docs/src/core/components/ui/loader/loader.md +87 -0
  262. package/docs/src/core/components/ui/menu/menu.md +370 -0
  263. package/docs/src/core/components/ui/modal/modal.md +211 -0
  264. package/docs/src/core/components/ui/pop/pop.md +216 -0
  265. package/docs/src/core/components/ui/progress/progress.md +109 -0
  266. package/docs/src/core/components/ui/table/table.md +267 -0
  267. package/docs/src/core/components/ui/theme/theme.md +97 -0
  268. package/docs/src/core/components/ui/toast/toast.md +147 -0
  269. package/docs/src/core/components/ui/tooltip/tooltip.md +89 -0
  270. package/docs/src/docs/decorators/ancestor-attribute.md +59 -0
  271. package/docs/src/docs/decorators/auto-subscribe.md +40 -0
  272. package/docs/src/docs/decorators/bind.md +76 -0
  273. package/docs/src/docs/decorators/get.md +160 -0
  274. package/docs/src/docs/decorators/handle.md +119 -0
  275. package/docs/src/docs/decorators/on-assign.md +63 -0
  276. package/docs/src/docs/decorators/patch.md +44 -0
  277. package/docs/src/docs/decorators/post.md +134 -0
  278. package/docs/src/docs/decorators/publish.md +56 -0
  279. package/docs/src/docs/decorators/put.md +51 -0
  280. package/docs/src/docs/decorators/subscribe.md +87 -0
  281. package/docs/src/docs/decorators/wait-for-ancestors.md +76 -0
  282. package/docs/src/docs/directives/sub.md +75 -0
  283. package/docs/src/docs/directives/t.md +73 -0
  284. package/docs/src/docs/getting-started/ai-agents.md +50 -0
  285. package/docs/src/docs/getting-started/components.md +5 -0
  286. package/docs/src/docs/getting-started/create-a-component.md +136 -0
  287. package/docs/src/docs/getting-started/dataFlow.md +87 -0
  288. package/docs/src/docs/getting-started/installation.md +36 -0
  289. package/docs/src/docs/getting-started/my-first-component.md +227 -0
  290. package/docs/src/docs/getting-started/start.md +35 -0
  291. package/docs/src/docs/getting-started/theming.md +253 -0
  292. package/docs/src/docs/misc/api-configuration.md +79 -0
  293. package/docs/src/docs/misc/dataProviderKey.md +168 -0
  294. package/docs/src/docs/misc/docs-mock-api.md +62 -0
  295. package/docs/src/docs/misc/dynamic-path.md +71 -0
  296. package/docs/src/docs/misc/endpoint.md +45 -0
  297. package/docs/src/docs/misc/html-integration.md +14 -0
  298. package/docs/src/docs/search/docs-search.json +10332 -0
  299. package/docs/src/tag-list.json +1 -0
  300. package/docs/src/tsconfig-model.json +23 -0
  301. package/docs/src/tsconfig.json +1359 -0
  302. package/index.html +157 -5
  303. package/package.json +8 -4
  304. package/public/docs-mock-api-sw.js +58 -223
  305. package/public/docs-mock-api-sw.js.map +4 -4
  306. package/public/img/concorde/plane_01.jpg +0 -0
  307. package/public/img/concorde/plane_02.jpg +0 -0
  308. package/public/img/concorde/plane_03.jpg +0 -0
  309. package/public/img/concorde/plane_04.jpg +0 -0
  310. package/public/img/concorde/plane_05.jpg +0 -0
  311. package/public/img/concorde/plane_06.jpg +0 -0
  312. package/public/img/concorde/plane_07.jpg +0 -0
  313. package/public/img/concorde/plane_08.jpg +0 -0
  314. package/public/img/concorde/plane_09.jpg +0 -0
  315. package/public/img/concorde/plane_10.jpg +0 -0
  316. package/public/img/concorde/plane_11.jpg +0 -0
  317. package/public/img/concorde/plane_12.jpg +0 -0
  318. package/public/img/concorde/plane_13.jpg +0 -0
  319. package/public/img/og-concorde.jpg +0 -0
  320. package/public/robots.txt +11 -10
  321. package/scripts/ai-init.mjs +104 -379
  322. package/scripts/ai-init.test.mjs +81 -239
  323. package/scripts/docs-markdown-vite-plugin.ts +43 -0
  324. package/scripts/docs-public-url.mjs +56 -0
  325. package/scripts/docs.htaccess +82 -0
  326. package/scripts/generate-cem.mjs +244 -0
  327. package/scripts/generate-cem.test.mjs +122 -0
  328. package/scripts/generate-crawl-docs.mjs +233 -118
  329. package/scripts/generate-crawl-docs.test.mjs +124 -0
  330. package/scripts/generate-sdui-catalog.mjs +11 -10
  331. package/scripts/post-build-docs.js +37 -50
  332. package/scripts/pre-publish.mjs +2 -1
  333. package/scripts/site-pages.mjs +212 -0
  334. package/scripts/site-pages.test.mjs +116 -0
  335. package/site-pages/about.md +22 -0
  336. package/site-pages/privacy.md +32 -0
  337. package/src/core/components/functional/date/date.md +91 -231
  338. package/src/core/components/functional/fetch/fetch.md +66 -83
  339. package/src/core/components/functional/if/if.md +28 -3
  340. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  341. package/src/core/components/functional/list/list.md +103 -43
  342. package/src/core/components/functional/mix/mix.md +31 -26
  343. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  344. package/src/core/components/functional/queue/queue.md +40 -61
  345. package/src/core/components/functional/router/router.demo.ts +16 -16
  346. package/src/core/components/functional/router/router.md +64 -65
  347. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  348. package/src/core/components/functional/sdui/component-catalog.json +1 -1
  349. package/src/core/components/functional/sdui/example.json +19 -86
  350. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  351. package/src/core/components/functional/sdui/sdui.md +187 -358
  352. package/src/core/components/functional/states/states.demo.ts +21 -22
  353. package/src/core/components/functional/states/states.md +86 -61
  354. package/src/core/components/functional/states/states.ts +1 -1
  355. package/src/core/components/functional/submit/submit.md +64 -72
  356. package/src/core/components/functional/translation/translation.md +38 -0
  357. package/src/core/components/functional/value/value.md +34 -22
  358. package/src/core/components/ui/alert/alert.md +48 -58
  359. package/src/core/components/ui/badge/badge.md +27 -34
  360. package/src/core/components/ui/button/button.md +139 -106
  361. package/src/core/components/ui/captcha/captcha.md +17 -32
  362. package/src/core/components/ui/card/card.md +6 -6
  363. package/src/core/components/ui/divider/divider.md +8 -11
  364. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  365. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  366. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  367. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  368. package/src/core/components/ui/form/input/input.md +95 -95
  369. package/src/core/components/ui/form/radio/radio.md +55 -34
  370. package/src/core/components/ui/form/select/select.md +60 -45
  371. package/src/core/components/ui/form/switch/switch.md +57 -34
  372. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  373. package/src/core/components/ui/group/group.md +35 -33
  374. package/src/core/components/ui/icon/icon.md +4 -4
  375. package/src/core/components/ui/image/image.md +41 -107
  376. package/src/core/components/ui/link/link.md +6 -6
  377. package/src/core/components/ui/loader/loader.md +30 -55
  378. package/src/core/components/ui/menu/menu.md +27 -27
  379. package/src/core/components/ui/modal/modal.md +72 -96
  380. package/src/core/components/ui/pop/pop.md +80 -158
  381. package/src/core/components/ui/progress/progress.md +2 -2
  382. package/src/core/components/ui/table/table.md +91 -255
  383. package/src/core/components/ui/theme/theme.md +11 -36
  384. package/src/core/components/ui/toast/toast.md +48 -117
  385. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  386. package/src/core/decorators/subscriber/bind.ts +9 -14
  387. package/src/core/utils/LocationHandler.spec.ts +80 -0
  388. package/src/core/utils/LocationHandler.ts +5 -9
  389. package/src/docs/components/docs-demo-sources.ts +55 -140
  390. package/src/docs/components/docs-lit-demo.ts +1 -3
  391. package/src/docs/components/docs-source-link.ts +0 -82
  392. package/src/docs/decorators/ancestor-attribute.md +59 -0
  393. package/src/docs/decorators/auto-subscribe.md +40 -0
  394. package/src/docs/decorators/bind.md +76 -0
  395. package/src/docs/decorators/get.md +160 -0
  396. package/src/docs/decorators/handle.md +119 -0
  397. package/src/docs/decorators/on-assign.md +63 -0
  398. package/src/docs/decorators/patch.md +44 -0
  399. package/src/docs/decorators/post.md +134 -0
  400. package/src/docs/decorators/publish.md +56 -0
  401. package/src/docs/decorators/put.md +51 -0
  402. package/src/docs/decorators/subscribe.md +87 -0
  403. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  404. package/src/docs/directives/sub.md +75 -0
  405. package/src/docs/directives/t.md +73 -0
  406. package/src/docs/docs-location.spec.ts +56 -0
  407. package/src/docs/docs-location.ts +133 -32
  408. package/src/docs/docs.ts +1 -2
  409. package/src/docs/example/decorators-demo-bind-demos.ts +83 -135
  410. package/src/docs/example/decorators-demo-geo.ts +30 -19
  411. package/src/docs/example/decorators-demo-post.ts +88 -186
  412. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  413. package/src/docs/example/decorators-demo.ts +85 -98
  414. package/src/docs/example/docs-api-config-demos.ts +19 -20
  415. package/src/docs/example/docs-flight-demos.ts +147 -0
  416. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  417. package/src/docs/example/docs-list-demos.ts +43 -123
  418. package/src/docs/example/docs-provider-keys.ts +21 -28
  419. package/src/docs/example/docs-queue-demos.ts +37 -77
  420. package/src/docs/example/docs-router-demos.ts +20 -25
  421. package/src/docs/example/docs-submit-demos.ts +48 -48
  422. package/src/docs/example/docs-toggle-demos.ts +4 -3
  423. package/src/docs/getting-started/ai-agents.md +50 -0
  424. package/src/docs/getting-started/components.md +5 -0
  425. package/src/docs/getting-started/create-a-component.md +136 -0
  426. package/src/docs/getting-started/dataFlow.md +87 -0
  427. package/src/docs/getting-started/installation.md +36 -0
  428. package/src/docs/getting-started/my-first-component.md +227 -0
  429. package/src/docs/getting-started/start.md +35 -0
  430. package/src/docs/getting-started/theming.md +253 -0
  431. package/src/docs/header/header.ts +11 -6
  432. package/src/docs/home/catalog.ts +1 -1
  433. package/src/docs/home/home.ts +20 -11
  434. package/src/docs/layout.ts +12 -13
  435. package/src/docs/misc/api-configuration.md +79 -0
  436. package/src/docs/misc/dataProviderKey.md +168 -0
  437. package/src/docs/misc/docs-mock-api.md +62 -0
  438. package/src/docs/misc/dynamic-path.md +71 -0
  439. package/src/docs/misc/endpoint.md +45 -0
  440. package/src/docs/misc/html-integration.md +14 -0
  441. package/src/docs/mock-api/api-config-mock.ts +5 -0
  442. package/src/docs/mock-api/fixtures.ts +0 -278
  443. package/src/docs/mock-api/flights.ts +89 -0
  444. package/src/docs/mock-api/router.ts +3 -4
  445. package/src/docs/mock-api/urls.ts +1 -2
  446. package/src/docs/navigation/navigation.ts +82 -103
  447. package/src/docs/navigation/toc.ts +7 -4
  448. package/src/docs/search/docs-search.json +2804 -5024
  449. package/src/docs/search/markdown-renderer.ts +31 -8
  450. package/src/docs/search/page.ts +9 -6
  451. package/src/docs/search/search.ts +154 -122
  452. package/src/docs/tailwind/css/docs/content.css +4 -5
  453. package/src/tsconfig.json +11 -5
  454. package/src/tsconfig.tsbuildinfo +1 -1
  455. package/vite.config.mts +11 -2
  456. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  457. package/ai/AGENTS.md +0 -56
  458. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  459. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  460. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  461. package/ai/cursor/rules/concorde.mdc +0 -66
  462. package/ai/jetbrains/rules/concorde.md +0 -53
  463. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  464. package/ai/skills/concorde-imports/SKILL.md +0 -78
  465. package/ai/skills/concorde-menu/SKILL.md +0 -74
  466. package/ai/skills/concorde-scope/SKILL.md +0 -70
  467. package/ai/skills/concorde-theme/SKILL.md +0 -57
  468. package/docs/assets/index-CD4WyL6o.css +0 -1
  469. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  470. package/src/docs/_core-concept/overview.md +0 -57
  471. package/src/docs/_core-concept/subscriber.md +0 -75
  472. package/src/docs/_decorators/ancestor-attribute.md +0 -128
  473. package/src/docs/_decorators/auto-subscribe.md +0 -202
  474. package/src/docs/_decorators/bind.md +0 -167
  475. package/src/docs/_decorators/get.md +0 -162
  476. package/src/docs/_decorators/handle.md +0 -175
  477. package/src/docs/_decorators/on-assign.md +0 -390
  478. package/src/docs/_decorators/patch.md +0 -70
  479. package/src/docs/_decorators/post.md +0 -146
  480. package/src/docs/_decorators/publish.md +0 -55
  481. package/src/docs/_decorators/put.md +0 -70
  482. package/src/docs/_decorators/subscribe.md +0 -100
  483. package/src/docs/_decorators/wait-for-ancestors.md +0 -163
  484. package/src/docs/_directives/sub.md +0 -91
  485. package/src/docs/_getting-started/ai-agents.md +0 -76
  486. package/src/docs/_getting-started/concorde-manual-install.md +0 -133
  487. package/src/docs/_getting-started/concorde-outside.md +0 -33
  488. package/src/docs/_getting-started/my-first-subscriber.md +0 -120
  489. package/src/docs/_getting-started/pubsub.md +0 -37
  490. package/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  491. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  492. package/src/docs/example/docs-joke-demos.ts +0 -297
  493. /package/{src/docs/_getting-started → docs/docs/getting-started}/components.md +0 -0
  494. /package/{src/docs/_getting-started → docs/docs/getting-started}/theming.md +0 -0
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Install Concorde AI agent files into a project.
3
+ * Install the Concorde agent skill into a project.
4
4
  *
5
5
  * Usage:
6
6
  * node node_modules/@supersoniks/concorde/scripts/ai-init.mjs [options]
@@ -9,31 +9,17 @@
9
9
  * Options:
10
10
  * --project-root <dir> Project root (default: cwd)
11
11
  * --concorde-ai <dir> Concorde ai/ folder (default: auto-detect)
12
- * --overlay <dir> Extra layer (project kit) — uses AGENTS.concorde.md
13
- * --cursor-only Install only Cursor (.cursor/)
14
- * --jetbrains-only Install only JetBrains (.aiassistant/rules/)
15
- * --skip-agents Never write AGENTS.md (skills/rules only)
16
- * --merge-agents Opt-in: keep project preamble, append/refresh Concorde block
17
- * --force-agents Opt-in: replace AGENTS.md entirely (destructive)
12
+ * --overlay <dir> Extra skills from a project kit (<dir>/skills/<name>/)
13
+ * --no-links Do not link skills into .claude/ and .junie/
18
14
  *
19
- * AGENTS.md policy (non-invasive by default):
20
- * - Missing file → create Concorde guide
21
- * - Existing with <!-- concorde-ai --> → refresh managed zone only
22
- * - Existing without marker → leave untouched (project-owned, e.g. billetterie)
23
- * unless --merge-agents or --force-agents
15
+ * Skills:
16
+ * - Copied to .agents/skills/<name>/ (read natively by Cursor and other
17
+ * agents following the Agent Skills convention)
18
+ * - Linked per skill from .claude/skills/ (Claude Code) and .junie/skills/
19
+ * (JetBrains Junie); copied instead where symlinks are not allowed
20
+ * - Project skills with the same folder name are never overwritten
24
21
  *
25
- * Layout when writing:
26
- *
27
- * [optional project preamble — short, project-only]
28
- * <!-- concorde-ai -->
29
- * <package ai/AGENTS.md>
30
- * [--- + overlay AGENTS.concorde.md]
31
- *
32
- * Everything AFTER the marker is owned by Concorde and replaced on every run.
33
- * Do not copy the full Concorde guide into the preamble — use overlay/AGENTS.concorde.md
34
- * for project-specific agent notes (endpoints, dpKeys, …).
35
- *
36
- * Legacy: AGENTS.starter.md / AGENTS.overlay.md still read if AGENTS.concorde.md is missing.
22
+ * AGENTS.md belongs to the project: ai-init never reads nor writes it.
37
23
  */
38
24
 
39
25
  import fs from "node:fs";
@@ -42,15 +28,6 @@ import {fileURLToPath, pathToFileURL} from "node:url";
42
28
 
43
29
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
44
30
 
45
- const AGENTS_MARKER = "<!-- concorde-ai -->";
46
- /** Project Concorde notes for `--overlay` (preferred). */
47
- const OVERLAY_AGENTS_FILE = "AGENTS.concorde.md";
48
- /** @deprecated Prefer AGENTS.concorde.md */
49
- const OVERLAY_AGENTS_FILE_LEGACY = [
50
- "AGENTS.overlay.md",
51
- "AGENTS.starter.md",
52
- ];
53
-
54
31
  const args = process.argv.slice(2);
55
32
 
56
33
  function readArg(name) {
@@ -66,36 +43,11 @@ const overlayDir = readArg("--overlay")
66
43
  ? path.resolve(readArg("--overlay"))
67
44
  : undefined;
68
45
 
69
- const cursorOnly = flags.has("--cursor-only");
70
- const jetbrainsOnly = flags.has("--jetbrains-only");
71
- const skipAgents = flags.has("--skip-agents");
72
- const mergeAgents = flags.has("--merge-agents");
73
- const forceAgents = flags.has("--force-agents");
74
- const installCursor = !jetbrainsOnly;
75
- const installJetbrains = !cursorOnly;
76
-
77
- /**
78
- * Decide whether / how to write AGENTS.md.
79
- * @returns {"skip" | "create" | "refresh" | "merge" | "force"}
80
- */
81
- export function decideAgentsAction({
82
- existingText = "",
83
- skipAgents: skip = false,
84
- mergeAgents: merge = false,
85
- forceAgents: force = false,
86
- } = {}) {
87
- if (skip) return "skip";
88
- const text = existingText.replace(/\r\n/g, "\n");
89
- const exists = text.trim().length > 0;
90
- const hasMarker = text.includes(AGENTS_MARKER);
91
-
92
- if (!exists) return "create";
93
- if (hasMarker) return "refresh";
94
- if (force) return "force";
95
- if (merge) return "merge";
96
- return "skip";
97
- }
98
-
46
+ const noLinks = flags.has("--no-links");
47
+ /** Canonical skills folder, relative to the project root. */
48
+ export const SKILLS_DIR = ".agents/skills";
49
+ /** Agent-specific skills folders that get one symlink per skill. */
50
+ export const SKILL_LINK_DIRS = [".claude/skills", ".junie/skills"];
99
51
  function detectConcordeAi() {
100
52
  const explicit = readArg("--concorde-ai");
101
53
  if (explicit) return path.resolve(explicit);
@@ -111,33 +63,6 @@ function detectConcordeAi() {
111
63
  );
112
64
  }
113
65
 
114
- /**
115
- * Read project Concorde AGENTS notes from `--overlay` dir.
116
- * Prefers AGENTS.concorde.md; falls back to deprecated legacy names.
117
- * @returns {{ content: string, warnings: string[] }}
118
- */
119
- export function readOverlayAgents(overlayDir) {
120
- const warnings = [];
121
- if (!overlayDir) return {content: "", warnings};
122
-
123
- const preferred = path.join(overlayDir, OVERLAY_AGENTS_FILE);
124
- if (fs.existsSync(preferred)) {
125
- return {content: fs.readFileSync(preferred, "utf8"), warnings};
126
- }
127
-
128
- for (const legacyName of OVERLAY_AGENTS_FILE_LEGACY) {
129
- const legacy = path.join(overlayDir, legacyName);
130
- if (fs.existsSync(legacy)) {
131
- warnings.push(
132
- `Overlay uses deprecated ${legacyName} — rename to ${OVERLAY_AGENTS_FILE}.`,
133
- );
134
- return {content: fs.readFileSync(legacy, "utf8"), warnings};
135
- }
136
- }
137
-
138
- return {content: "", warnings};
139
- }
140
-
141
66
  function copyDir(src, dest) {
142
67
  if (!fs.existsSync(src)) return;
143
68
  fs.mkdirSync(dest, {recursive: true});
@@ -153,229 +78,98 @@ function copyDir(src, dest) {
153
78
  }
154
79
  }
155
80
 
156
- function normalizeHeading(title) {
157
- return title
158
- .normalize("NFKD")
159
- .replace(/\p{M}/gu, "")
160
- .toLowerCase()
161
- .replace(/[^a-z0-9]+/g, " ")
162
- .trim();
81
+ function listSkillNames(dir) {
82
+ if (!fs.existsSync(dir)) return [];
83
+ return fs
84
+ .readdirSync(dir, {withFileTypes: true})
85
+ .filter((e) => e.isDirectory() && fs.existsSync(path.join(dir, e.name, "SKILL.md")))
86
+ .map((e) => e.name)
87
+ .sort();
163
88
  }
164
89
 
165
- function isStockConcordeH1(title) {
166
- // "# Agents — Concorde" with optional project suffix in parentheses
167
- return /^agents\s+concorde(\s|$)/i.test(normalizeHeading(title));
90
+ function removePath(p) {
91
+ fs.rmSync(p, {recursive: true, force: true});
168
92
  }
169
93
 
170
- /**
171
- * Split markdown into a leading H1 block + ## sections (## title → body).
172
- * @returns {{ h1: string | null, sections: Array<{ title: string, body: string }> }}
173
- */
174
- function splitAgentsSections(markdown) {
175
- const text = markdown.replace(/\r\n/g, "\n").trim();
176
- if (!text) return {h1: null, sections: []};
177
-
178
- const parts = text.split(/\n(?=##\s+)/);
179
- let h1 = null;
180
- const sections = [];
181
-
182
- for (const part of parts) {
183
- const trimmed = part.trim();
184
- if (!trimmed) continue;
185
- if (trimmed.startsWith("## ")) {
186
- const nl = trimmed.indexOf("\n");
187
- const titleLine = nl === -1 ? trimmed : trimmed.slice(0, nl);
188
- const title = titleLine.replace(/^##\s+/, "").trim();
189
- const body = nl === -1 ? "" : trimmed.slice(nl + 1).trim();
190
- sections.push({title, body});
191
- } else if (h1 === null) {
192
- h1 = trimmed;
193
- } else {
194
- // Orphan content without ## — keep as synthetic section
195
- sections.push({title: "", body: trimmed});
196
- }
94
+ function isSymlink(p) {
95
+ try {
96
+ return fs.lstatSync(p).isSymbolicLink();
97
+ } catch {
98
+ return false;
197
99
  }
198
-
199
- return {h1, sections};
200
100
  }
201
101
 
202
- function baseHeadingSet(baseContent) {
203
- const {sections} = splitAgentsSections(baseContent);
204
- return new Set(sections.map((s) => normalizeHeading(s.title)).filter(Boolean));
205
- }
206
-
207
- /** Match "## Skills / rules" with "## Skills / rules (après installation)". */
208
- function isSameAgentsHeading(a, b) {
209
- if (!a || !b) return false;
210
- if (a === b) return true;
211
- const stripParen = (s) => s.replace(/\s*\(.*\)$/, "").trim();
212
- const aa = stripParen(a);
213
- const bb = stripParen(b);
214
- if (aa === bb) return true;
215
- return aa.startsWith(bb) || bb.startsWith(aa);
216
- }
217
-
218
- function isPackageHeading(titleKey, baseHeads) {
219
- for (const bh of baseHeads) {
220
- if (isSameAgentsHeading(titleKey, bh)) return true;
102
+ function pathExists(p) {
103
+ try {
104
+ fs.lstatSync(p);
105
+ return true;
106
+ } catch {
107
+ return false;
221
108
  }
222
- return false;
223
109
  }
224
110
 
225
111
  /**
226
- * True when preamble looks like a full (or near-full) copy of package AGENTS.md.
112
+ * Copy skills into `<projectRoot>/.agents/skills`, replacing previous copies.
113
+ * @param {string[]} sourceDirs skills folders (package first, then overlay)
114
+ * @returns {string[]} installed skill names
227
115
  */
228
- export function preambleDuplicatesBase(preamble, baseContent) {
229
- const p = preamble.trim();
230
- const b = baseContent.trim();
231
- if (!p || !b) return false;
232
-
233
- const fingerprints = [
234
- "sonic-fetch",
235
- "publishermanager",
236
- "formdataprovider",
237
- "dataprovide",
238
- "concorde-get-set-dp",
239
- ];
240
- const pNorm = p.toLowerCase();
241
- const hits = fingerprints.filter((fp) => pNorm.includes(fp)).length;
242
- const longEnough = p.length >= b.length * 0.45;
243
- const stockTitle = /^#\s*agents\s*[—–-]\s*concorde\b/im.test(p);
244
-
245
- return stockTitle && longEnough && hits >= 3;
246
- }
247
-
248
- /**
249
- * Keep only project-specific preamble bits (unique ## vs package, short custom H1).
250
- * Drops sections that duplicate Concorde ai/AGENTS.md so re-runs heal stacked copies.
251
- */
252
- export function slimPreamble(preamble, baseContent) {
253
- const raw = preamble.trim();
254
- if (!raw) return "";
255
-
256
- const {h1, sections} = splitAgentsSections(raw);
257
- const h1Title = h1?.split("\n")[0]?.replace(/^#\s+/, "").trim() ?? "";
258
- // Full forks OR any preamble titled like Concorde AGENTS → strip package ## sections
259
- const shouldDedup =
260
- preambleDuplicatesBase(raw, baseContent) || isStockConcordeH1(h1Title);
261
-
262
- if (!shouldDedup) {
263
- return raw;
116
+ export function syncSkills(projectRoot, sourceDirs) {
117
+ const dest = path.join(projectRoot, SKILLS_DIR);
118
+ const installed = new Map();
119
+ for (const dir of sourceDirs) {
120
+ for (const name of listSkillNames(dir)) installed.set(name, path.join(dir, name));
264
121
  }
265
122
 
266
- const baseHeads = baseHeadingSet(baseContent);
267
- const kept = [];
268
-
269
- for (const section of sections) {
270
- const key = normalizeHeading(section.title);
271
- if (!key) {
272
- if (!preambleDuplicatesBase(section.body, baseContent)) {
273
- kept.push(section.body);
274
- }
275
- continue;
276
- }
277
- if (!isPackageHeading(key, baseHeads)) {
278
- kept.push(`## ${section.title}\n\n${section.body}`.trim());
279
- }
280
- }
281
-
282
- let intro = "";
283
- if (h1) {
284
- const firstLine = h1.split("\n")[0].trim();
285
- const title = firstLine.replace(/^#\s+/, "");
286
- if (isStockConcordeH1(title) && /[()]/.test(title)) {
287
- intro = firstLine;
288
- } else if (!isStockConcordeH1(title)) {
289
- intro = firstLine;
290
- }
123
+ for (const [name, from] of installed) {
124
+ const to = path.join(dest, name);
125
+ removePath(to);
126
+ copyDir(from, to);
291
127
  }
292
-
293
- return [intro, ...kept].filter(Boolean).join("\n\n").trim();
294
- }
295
-
296
- export function buildManagedAgents(baseContent, overlayContent) {
297
- const parts = [baseContent.trim()];
298
- if (overlayContent?.trim()) {
299
- parts.push(overlayContent.trim());
300
- }
301
- return parts.join("\n\n---\n\n");
128
+ return [...installed.keys()].sort();
302
129
  }
303
130
 
304
131
  /**
305
- * Build final AGENTS.md. Never stacks managed (post-marker) content.
306
- * @returns {{ markdown: string, warnings: string[] }}
132
+ * Link each skill from the agent-specific folders to `.agents/skills/<name>`.
133
+ * Skips a folder that already resolves to `.agents/skills` (whole-dir symlink).
134
+ * Replaces earlier links, and copies of package skills (`packageNames`); never
135
+ * overwrites a project's own skill of the same name. Falls back to a copy when
136
+ * symlinks are not allowed.
137
+ * @returns {Array<{ dir: string, mode: "linked" | "copied" | "shared" }>}
307
138
  */
308
- export function buildAgentsFile({
309
- existing = "",
310
- baseContent,
311
- overlayContent = "",
312
- mergeAgents: merge = false,
313
- forceAgents: force = false,
314
- }) {
315
- const warnings = [];
316
- const combined = buildManagedAgents(baseContent, overlayContent);
317
-
318
- // Destructive replace: ignore any existing project content
319
- if (force && !existing.replace(/\r\n/g, "\n").includes(AGENTS_MARKER)) {
320
- return {markdown: `${combined}\n`, warnings};
321
- }
322
-
323
- let preamble = "";
324
- const existingText = existing.replace(/\r\n/g, "\n");
325
-
326
- if (existingText.includes(AGENTS_MARKER)) {
327
- preamble = existingText.split(AGENTS_MARKER)[0].trimEnd();
328
- } else if (merge && existingText.trim()) {
329
- preamble = existingText.trimEnd();
330
- }
331
-
332
- const hadMarker = existingText.includes(AGENTS_MARKER);
333
-
334
- if (preamble) {
335
- const before = preamble;
336
- preamble = slimPreamble(preamble, baseContent);
337
- if (before.trim() && !preamble) {
338
- warnings.push(
339
- "AGENTS.md preamble duplicated Concorde ai/AGENTS.md — dropped. Put project-only notes in overlay AGENTS.concorde.md (or a short preamble before <!-- concorde-ai -->).",
340
- );
341
- } else if (before.trim() && preamble !== before.trim()) {
342
- warnings.push(
343
- "AGENTS.md preamble slimmed: removed sections that duplicate package AGENTS.md.",
344
- );
139
+ export function linkSkills(
140
+ projectRoot,
141
+ names,
142
+ {packageNames = [], linkDirs = SKILL_LINK_DIRS} = {},
143
+ ) {
144
+ const source = path.join(projectRoot, SKILLS_DIR);
145
+ const sourceReal = fs.realpathSync(source);
146
+ const results = [];
147
+
148
+ for (const linkDir of linkDirs) {
149
+ const dir = path.join(projectRoot, linkDir);
150
+ if (fs.existsSync(dir) && fs.realpathSync(dir) === sourceReal) {
151
+ results.push({dir: linkDir, mode: "shared"});
152
+ continue;
345
153
  }
154
+ fs.mkdirSync(dir, {recursive: true});
155
+ let mode = "linked";
156
+ for (const name of names) {
157
+ const target = path.join(dir, name);
158
+ if (pathExists(target)) {
159
+ const owned = isSymlink(target) || packageNames.includes(name);
160
+ if (!owned) continue;
161
+ removePath(target);
162
+ }
163
+ try {
164
+ fs.symlinkSync(path.relative(dir, path.join(source, name)), target, "dir");
165
+ } catch {
166
+ copyDir(path.join(source, name), target);
167
+ mode = "copied";
168
+ }
169
+ }
170
+ results.push({dir: linkDir, mode});
346
171
  }
347
-
348
- // Always emit the marker when refreshing a marked file or merging a preamble,
349
- // so re-runs stay idempotent even if the preamble was fully dropped.
350
- const emitMarker = hadMarker || Boolean(preamble) || merge;
351
- const markdown = emitMarker
352
- ? preamble
353
- ? `${preamble.trimEnd()}\n\n${AGENTS_MARKER}\n\n${combined}\n`
354
- : `${AGENTS_MARKER}\n\n${combined}\n`
355
- : `${combined}\n`;
356
-
357
- return {markdown, warnings};
358
- }
359
-
360
- export function mergeAgentsFile(targetPath, baseContent, overlayContent, options = {}) {
361
- const merge = options.mergeAgents ?? false;
362
- const force = options.forceAgents ?? false;
363
- let existing = "";
364
- if (fs.existsSync(targetPath)) {
365
- existing = fs.readFileSync(targetPath, "utf8");
366
- }
367
-
368
- const {markdown, warnings} = buildAgentsFile({
369
- existing,
370
- baseContent,
371
- overlayContent,
372
- mergeAgents: merge,
373
- forceAgents: force,
374
- });
375
-
376
- fs.mkdirSync(path.dirname(targetPath), {recursive: true});
377
- fs.writeFileSync(targetPath, markdown);
378
- return warnings;
172
+ return results;
379
173
  }
380
174
 
381
175
  function main() {
@@ -385,96 +179,27 @@ function main() {
385
179
  console.log(` source: ${concordeAi}`);
386
180
  if (overlayDir) console.log(` overlay: ${overlayDir}`);
387
181
 
388
- if (installCursor) {
389
- copyDir(
390
- path.join(concordeAi, "cursor", "rules"),
391
- path.join(projectRoot, ".cursor", "rules"),
392
- );
393
- copyDir(
394
- path.join(concordeAi, "skills"),
395
- path.join(projectRoot, ".cursor", "skills"),
396
- );
397
-
398
- if (overlayDir) {
399
- copyDir(
400
- path.join(overlayDir, "cursor", "rules"),
401
- path.join(projectRoot, ".cursor", "rules"),
402
- );
403
- copyDir(
404
- path.join(overlayDir, "skills"),
405
- path.join(projectRoot, ".cursor", "skills"),
406
- );
407
- }
408
- }
409
-
410
- if (installJetbrains) {
411
- copyDir(
412
- path.join(concordeAi, "jetbrains", "rules"),
413
- path.join(projectRoot, ".aiassistant", "rules"),
414
- );
415
-
416
- if (overlayDir) {
417
- copyDir(
418
- path.join(overlayDir, "jetbrains", "rules"),
419
- path.join(projectRoot, ".aiassistant", "rules"),
420
- );
421
- }
422
- }
423
-
424
- const agentsPath = path.join(projectRoot, "AGENTS.md");
425
- let existingAgents = "";
426
- if (fs.existsSync(agentsPath)) {
427
- existingAgents = fs.readFileSync(agentsPath, "utf8");
428
- }
429
-
430
- const action = decideAgentsAction({
431
- existingText: existingAgents,
432
- skipAgents,
433
- mergeAgents,
434
- forceAgents,
435
- });
436
-
437
- if (action === "skip") {
438
- if (skipAgents) {
439
- console.log(" ⊘ AGENTS.md skipped (--skip-agents)");
440
- } else if (existingAgents.trim()) {
441
- console.log(
442
- " ⊘ AGENTS.md left untouched (project-owned, no <!-- concorde-ai --> marker).",
443
- );
444
- console.log(
445
- " Use --merge-agents to append a Concorde block, or --force-agents to replace.",
446
- );
447
- } else {
448
- console.log(" ⊘ AGENTS.md skipped");
449
- }
450
- } else {
451
- const baseAgents = fs.readFileSync(path.join(concordeAi, "AGENTS.md"), "utf8");
452
- const {content: overlayAgents, warnings: overlayWarnings} =
453
- readOverlayAgents(overlayDir);
454
-
455
- const warnings = [
456
- ...overlayWarnings,
457
- ...mergeAgentsFile(agentsPath, baseAgents, overlayAgents, {
458
- mergeAgents: action === "merge" || action === "refresh",
459
- forceAgents: action === "force",
460
- }),
461
- ];
462
- for (const w of warnings) {
463
- console.warn(` ⚠ ${w}`);
182
+ const packageSkills = path.join(concordeAi, "skills");
183
+ const skillNames = syncSkills(projectRoot, [
184
+ packageSkills,
185
+ ...(overlayDir ? [path.join(overlayDir, "skills")] : []),
186
+ ]);
187
+ console.log(` ✓ ${SKILLS_DIR} (${skillNames.join(", ")})`);
188
+
189
+ if (!noLinks) {
190
+ for (const {dir, mode} of linkSkills(projectRoot, skillNames, {
191
+ packageNames: listSkillNames(packageSkills),
192
+ })) {
193
+ const label =
194
+ mode === "shared"
195
+ ? `already points to ${SKILLS_DIR}`
196
+ : mode === "copied"
197
+ ? "copied (symlinks not allowed here)"
198
+ : "linked";
199
+ console.log(` ✓ ${dir} (${label})`);
464
200
  }
465
- const label =
466
- action === "create"
467
- ? "created"
468
- : action === "merge"
469
- ? "merged"
470
- : action === "force"
471
- ? "replaced (--force-agents)"
472
- : "refreshed";
473
- console.log(` ✓ AGENTS.md (${label})`);
474
201
  }
475
202
 
476
- if (installCursor) console.log(" ✓ .cursor/skills + .cursor/rules");
477
- if (installJetbrains) console.log(" ✓ .aiassistant/rules");
478
203
  console.log("Done.");
479
204
  }
480
205