@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.
- package/.agents/skills/concorde-docs/SKILL.md +153 -0
- package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
- package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
- package/.agents/skills/concorde-docs/templates/guide.md +25 -0
- package/.claude/skills +1 -0
- package/.github/workflows/ci.yml +21 -0
- package/.github-export-ignore +30 -0
- package/CONTRIBUTING.md +59 -0
- package/DEV.md +54 -0
- package/LICENSE +21 -0
- package/OPEN_SOURCE_CHECKPOINT.md +133 -0
- package/README.md +4 -4
- package/ai/README.md +29 -41
- package/ai/skills/concorde/SKILL.md +54 -324
- package/ai/skills/concorde/rules/composition.md +32 -0
- package/ai/skills/concorde/rules/data.md +47 -0
- package/ai/skills/concorde/rules/http.md +25 -0
- package/ai/skills/concorde/rules/lists-forms.md +35 -0
- package/ai/skills/concorde/rules/styling.md +46 -0
- package/ai/skills/concorde/rules/troubleshooting.md +45 -0
- package/build-infos.json +1 -1
- package/concorde-core.bundle.js +177 -177
- package/concorde-core.es.js +4993 -4833
- package/custom-elements-manifest.public.config.mjs +8 -0
- package/{.tmp-cem/custom-elements.json → custom-elements.json} +11758 -8904
- package/dist/concorde-core.bundle.js +177 -177
- package/dist/concorde-core.es.js +4993 -4833
- package/dist/docs-mock-api-sw.js +58 -223
- package/dist/docs-mock-api-sw.js.map +4 -4
- package/dist/img/concorde/plane_01.jpg +0 -0
- package/dist/img/concorde/plane_02.jpg +0 -0
- package/dist/img/concorde/plane_03.jpg +0 -0
- package/dist/img/concorde/plane_04.jpg +0 -0
- package/dist/img/concorde/plane_05.jpg +0 -0
- package/dist/img/concorde/plane_06.jpg +0 -0
- package/dist/img/concorde/plane_07.jpg +0 -0
- package/dist/img/concorde/plane_08.jpg +0 -0
- package/dist/img/concorde/plane_09.jpg +0 -0
- package/dist/img/concorde/plane_10.jpg +0 -0
- package/dist/img/concorde/plane_11.jpg +0 -0
- package/dist/img/concorde/plane_12.jpg +0 -0
- package/dist/img/concorde/plane_13.jpg +0 -0
- package/dist/img/og-concorde.jpg +0 -0
- package/dist/robots.txt +11 -10
- package/docs/assets/index-D_alEsng.js +12122 -0
- package/docs/crawl/core/components/functional/date/date.html +190 -0
- package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
- package/docs/crawl/core/components/functional/if/if.html +27 -0
- package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
- package/docs/crawl/core/components/functional/list/list.html +70 -0
- package/docs/crawl/core/components/functional/mix/mix.html +45 -0
- package/docs/crawl/core/components/functional/queue/queue.html +96 -0
- package/docs/crawl/core/components/functional/router/router.html +106 -0
- package/docs/crawl/core/components/functional/sdui/sdui-extension-points.html +126 -0
- package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
- package/docs/crawl/core/components/functional/states/states.html +66 -0
- package/docs/crawl/core/components/functional/submit/submit.html +160 -0
- package/docs/crawl/core/components/functional/subscriber/subscriber.html +67 -0
- package/docs/crawl/core/components/functional/value/value.html +51 -0
- package/docs/crawl/core/components/ui/alert/alert.html +211 -0
- package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +131 -0
- package/docs/crawl/core/components/ui/badge/badge.html +197 -0
- package/docs/crawl/core/components/ui/button/button.html +150 -0
- package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
- package/docs/crawl/core/components/ui/card/card.html +253 -0
- package/docs/crawl/core/components/ui/divider/divider.html +144 -0
- package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
- package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
- package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +122 -0
- package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
- package/docs/crawl/core/components/ui/form/input/input.html +109 -0
- package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
- package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
- package/docs/crawl/core/components/ui/form/select/select.html +73 -0
- package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
- package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
- package/docs/crawl/core/components/ui/group/group.html +104 -0
- package/docs/crawl/core/components/ui/icon/icon.html +222 -0
- package/docs/crawl/core/components/ui/image/image.html +298 -0
- package/docs/crawl/core/components/ui/link/link.html +100 -0
- package/docs/crawl/core/components/ui/loader/loader.html +124 -0
- package/docs/crawl/core/components/ui/menu/menu.html +394 -0
- package/docs/crawl/core/components/ui/modal/modal.html +342 -0
- package/docs/crawl/core/components/ui/pop/pop.html +296 -0
- package/docs/crawl/core/components/ui/progress/progress.html +131 -0
- package/docs/crawl/core/components/ui/table/table.html +545 -0
- package/docs/crawl/core/components/ui/theme/theme.html +131 -0
- package/docs/crawl/core/components/ui/toast/toast.html +233 -0
- package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
- package/docs/crawl/docs/_core-concept/dataFlow.html +177 -0
- package/docs/crawl/docs/_core-concept/overview.html +66 -0
- package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
- package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
- package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
- package/docs/crawl/docs/_decorators/bind.html +141 -0
- package/docs/crawl/docs/_decorators/get.html +149 -0
- package/docs/crawl/docs/_decorators/handle.html +165 -0
- package/docs/crawl/docs/_decorators/on-assign.html +355 -0
- package/docs/crawl/docs/_decorators/patch.html +78 -0
- package/docs/crawl/docs/_decorators/post.html +139 -0
- package/docs/crawl/docs/_decorators/publish.html +61 -0
- package/docs/crawl/docs/_decorators/put.html +78 -0
- package/docs/crawl/docs/_decorators/subscribe.html +109 -0
- package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
- package/docs/crawl/docs/_directives/sub.html +93 -0
- package/docs/crawl/docs/_getting-started/ai-agents.html +173 -0
- package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
- package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
- package/docs/crawl/docs/_getting-started/create-a-component.html +111 -0
- package/docs/crawl/docs/_getting-started/my-first-component.html +189 -0
- package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
- package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
- package/docs/crawl/docs/_getting-started/start.html +76 -0
- package/docs/crawl/docs/_getting-started/theming.html +333 -0
- package/docs/crawl/docs/_misc/api-configuration.html +149 -0
- package/docs/crawl/docs/_misc/dataProviderKey.html +135 -0
- package/docs/crawl/docs/_misc/docs-mock-api.html +158 -0
- package/docs/crawl/docs/_misc/dynamic-path.html +180 -0
- package/docs/crawl/docs/_misc/endpoint.html +50 -0
- package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
- package/docs/crawl/docs/_misc/html-integration.html +48 -0
- package/docs/crawl/hubs/decorators.html +547 -0
- package/docs/crawl/hubs/form-components.html +381 -0
- package/docs/crawl/hubs/remote-data.html +452 -0
- package/docs/crawl/index.html +103 -0
- package/docs/index.html +1 -1
- package/docs/llms-full.txt +7174 -0
- package/docs/llms.txt +98 -0
- package/docs/sitemap.xml +243 -0
- package/docs/src/core/components/functional/date/date.md +290 -0
- package/docs/src/core/components/functional/fetch/fetch.md +125 -0
- package/docs/src/core/components/functional/if/if.md +9 -0
- package/docs/src/core/components/functional/jsonata/jsonata.md +56 -0
- package/docs/src/core/components/functional/list/list.md +65 -0
- package/docs/src/core/components/functional/mix/mix.md +41 -0
- package/docs/src/core/components/functional/queue/queue.md +72 -0
- package/docs/src/core/components/functional/router/router.md +94 -0
- package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
- package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
- package/docs/src/core/components/functional/sdui/default-library.json +108 -0
- package/docs/src/core/components/functional/sdui/example.json +99 -0
- package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
- package/docs/src/core/components/functional/sdui/sdui.md +478 -0
- package/docs/src/core/components/functional/states/states.md +87 -0
- package/docs/src/core/components/functional/submit/submit.md +114 -0
- package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
- package/docs/src/core/components/functional/value/value.md +35 -0
- package/docs/src/core/components/ui/alert/alert.md +196 -0
- package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
- package/docs/src/core/components/ui/badge/badge.md +188 -0
- package/docs/src/core/components/ui/button/button.md +183 -0
- package/docs/src/core/components/ui/captcha/captcha.md +71 -0
- package/docs/src/core/components/ui/card/card.md +215 -0
- package/docs/src/core/components/ui/divider/divider.md +129 -0
- package/docs/src/core/components/ui/form/checkbox/checkbox.md +77 -0
- package/docs/src/core/components/ui/form/fieldset/fieldset.md +205 -0
- package/docs/src/core/components/ui/form/form-actions/form-actions.md +100 -0
- package/docs/src/core/components/ui/form/form-layout/form-layout.md +119 -0
- package/docs/src/core/components/ui/form/input/input.md +142 -0
- package/docs/src/core/components/ui/form/radio/radio.md +57 -0
- package/docs/src/core/components/ui/form/select/select.md +71 -0
- package/docs/src/core/components/ui/form/switch/switch.md +57 -0
- package/docs/src/core/components/ui/form/textarea/textarea.md +65 -0
- package/docs/src/core/components/ui/group/group.md +75 -0
- package/docs/src/core/components/ui/icon/icon.md +214 -0
- package/docs/src/core/components/ui/icon/icons.json +1 -0
- package/docs/src/core/components/ui/image/image.md +233 -0
- package/docs/src/core/components/ui/link/link.md +81 -0
- package/docs/src/core/components/ui/loader/loader.md +112 -0
- package/docs/src/core/components/ui/menu/menu.md +370 -0
- package/docs/src/core/components/ui/modal/modal.md +235 -0
- package/docs/src/core/components/ui/pop/pop.md +294 -0
- package/docs/src/core/components/ui/progress/progress.md +109 -0
- package/docs/src/core/components/ui/table/table.md +431 -0
- package/docs/src/core/components/ui/theme/theme.md +122 -0
- package/docs/src/core/components/ui/toast/toast.md +216 -0
- package/docs/src/core/components/ui/tooltip/tooltip.md +124 -0
- package/{src → docs/src}/docs/_core-concept/subscriber.md +0 -0
- package/{src → docs/src}/docs/_getting-started/my-first-subscriber.md +0 -0
- package/{src → docs/src}/docs/_getting-started/pubsub.md +0 -0
- package/docs/src/docs/_getting-started/theming.md +253 -0
- package/docs/src/docs/search/docs-search.json +12242 -0
- package/docs/src/tag-list.json +1 -0
- package/docs/src/tsconfig-model.json +23 -0
- package/docs/src/tsconfig.declarations.json +22 -0
- package/docs/src/tsconfig.emit.json +23 -0
- package/docs/src/tsconfig.json +1332 -0
- package/gitlab/job_github_mirror.sh +39 -0
- package/index.html +157 -5
- package/package.json +22 -4
- package/public/docs-mock-api-sw.js +58 -223
- package/public/docs-mock-api-sw.js.map +4 -4
- package/public/img/concorde/plane_01.jpg +0 -0
- package/public/img/concorde/plane_02.jpg +0 -0
- package/public/img/concorde/plane_03.jpg +0 -0
- package/public/img/concorde/plane_04.jpg +0 -0
- package/public/img/concorde/plane_05.jpg +0 -0
- package/public/img/concorde/plane_06.jpg +0 -0
- package/public/img/concorde/plane_07.jpg +0 -0
- package/public/img/concorde/plane_08.jpg +0 -0
- package/public/img/concorde/plane_09.jpg +0 -0
- package/public/img/concorde/plane_10.jpg +0 -0
- package/public/img/concorde/plane_11.jpg +0 -0
- package/public/img/concorde/plane_12.jpg +0 -0
- package/public/img/concorde/plane_13.jpg +0 -0
- package/public/img/og-concorde.jpg +0 -0
- package/public/robots.txt +11 -10
- package/scripts/ai-init.mjs +104 -379
- package/scripts/ai-init.test.mjs +81 -239
- package/scripts/docs-markdown-vite-plugin.ts +43 -0
- package/scripts/docs-public-url.mjs +56 -0
- package/scripts/docs.htaccess +82 -0
- package/scripts/generate-cem.mjs +244 -0
- package/scripts/generate-cem.test.mjs +122 -0
- package/scripts/generate-crawl-docs.mjs +233 -118
- package/scripts/generate-crawl-docs.test.mjs +124 -0
- package/scripts/generate-sdui-catalog.mjs +11 -10
- package/scripts/github-export.mjs +150 -0
- package/scripts/post-build-docs.js +37 -50
- package/scripts/post-build.mjs +0 -0
- package/scripts/pre-publish.mjs +2 -1
- package/scripts/site-pages.mjs +212 -0
- package/scripts/site-pages.test.mjs +116 -0
- package/site-pages/about.md +22 -0
- package/site-pages/privacy.md +32 -0
- package/src/core/components/functional/date/date.md +91 -231
- package/src/core/components/functional/example/example.ts +3 -1
- package/src/core/components/functional/fetch/fetch.md +66 -83
- package/src/core/components/functional/if/if.md +28 -3
- package/src/core/components/functional/if/if.ts +0 -0
- package/src/core/components/functional/jsonata/jsonata.md +42 -37
- package/src/core/components/functional/list/list.demo.ts +0 -0
- package/src/core/components/functional/list/list.md +103 -43
- package/src/core/components/functional/list/list.ts +17 -4
- package/src/core/components/functional/mix/mix.md +31 -26
- package/src/core/components/functional/queue/queue.demo.ts +10 -7
- package/src/core/components/functional/queue/queue.md +40 -61
- package/src/core/components/functional/router/router.demo.ts +16 -16
- package/src/core/components/functional/router/router.md +64 -65
- package/src/core/components/functional/router/router.ts +0 -0
- package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
- package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
- package/src/core/components/functional/sdui/component-catalog.json +2 -2
- package/src/core/components/functional/sdui/example.json +19 -86
- package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
- package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
- package/src/core/components/functional/sdui/sdui.md +187 -358
- package/src/core/components/functional/sdui/sdui.ts +33 -8
- package/src/core/components/functional/sdui/types.ts +0 -0
- package/src/core/components/functional/states/states.demo.ts +21 -22
- package/src/core/components/functional/states/states.md +86 -61
- package/src/core/components/functional/states/states.ts +1 -1
- package/src/core/components/functional/submit/submit.md +64 -72
- package/src/core/components/functional/submit/submit.spec.ts +60 -0
- package/src/core/components/functional/submit/submit.ts +6 -3
- package/src/core/components/functional/subscriber/subscriber.ts +0 -0
- package/src/core/components/functional/translation/translation.md +38 -0
- package/src/core/components/functional/value/value.md +34 -22
- package/src/core/components/functional/value/value.ts +0 -0
- package/src/core/components/ui/_css/size.ts +0 -0
- package/src/core/components/ui/alert/alert.md +48 -58
- package/src/core/components/ui/badge/badge.md +27 -34
- package/src/core/components/ui/button/button.md +139 -106
- package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
- package/src/core/components/ui/captcha/captcha.md +17 -32
- package/src/core/components/ui/card/card.md +6 -6
- package/src/core/components/ui/divider/divider.md +8 -11
- package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
- package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
- package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
- package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
- package/src/core/components/ui/form/input/input.md +108 -90
- package/src/core/components/ui/form/input/input.ts +8 -2
- package/src/core/components/ui/form/radio/radio.md +65 -30
- package/src/core/components/ui/form/select/select.md +60 -45
- package/src/core/components/ui/form/switch/switch.md +57 -34
- package/src/core/components/ui/form/textarea/textarea.md +55 -38
- package/src/core/components/ui/group/group.md +35 -33
- package/src/core/components/ui/icon/icon.md +4 -4
- package/src/core/components/ui/image/image.md +41 -107
- package/src/core/components/ui/link/link.md +6 -6
- package/src/core/components/ui/loader/loader.md +30 -55
- package/src/core/components/ui/menu/menu.md +27 -27
- package/src/core/components/ui/modal/modal.md +72 -96
- package/src/core/components/ui/pop/pop.md +80 -158
- package/src/core/components/ui/progress/progress.md +2 -2
- package/src/core/components/ui/table/table.md +91 -255
- package/src/core/components/ui/theme/theme.md +11 -36
- package/src/core/components/ui/toast/toast.md +48 -117
- package/src/core/components/ui/tooltip/tooltip.md +27 -62
- package/src/core/decorators/subscriber/bind.ts +9 -14
- package/src/core/decorators/subscriber/subscribe.ts +15 -9
- package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
- package/src/core/mixins/Subscriber.ts +0 -0
- package/src/core/utils/DataBindObserver.ts +0 -0
- package/src/core/utils/LocationHandler.spec.ts +80 -0
- package/src/core/utils/LocationHandler.ts +5 -9
- package/src/core/utils/Objects.ts +0 -0
- package/src/core/utils/PublisherProxy.ts +166 -125
- package/src/core/utils/deepReadonly.spec.ts +66 -0
- package/src/core/utils/deepReadonly.ts +71 -0
- package/src/core/utils/immutableValue.spec.ts +54 -0
- package/src/core/utils/immutableValue.ts +102 -0
- package/src/core/utils/nestedDotForm.spec.ts +88 -0
- package/src/core/utils/publisherImmutable.spec.ts +76 -0
- package/src/core/utils/route.ts +0 -0
- package/src/core/utils/strictGet.spec.ts +61 -0
- package/src/core/utils/strictGet.ts +102 -0
- package/src/css.d.ts +19 -0
- package/src/docs/components/docs-demo-sources.ts +55 -140
- package/src/docs/components/docs-lit-demo.ts +1 -3
- package/src/docs/components/docs-source-link.ts +0 -82
- package/src/docs/decorators/ancestor-attribute.md +59 -0
- package/src/docs/decorators/auto-subscribe.md +40 -0
- package/src/docs/decorators/bind.md +76 -0
- package/src/docs/decorators/get.md +160 -0
- package/src/docs/decorators/handle.md +119 -0
- package/src/docs/decorators/on-assign.md +63 -0
- package/src/docs/decorators/patch.md +44 -0
- package/src/docs/decorators/post.md +134 -0
- package/src/docs/decorators/publish.md +56 -0
- package/src/docs/decorators/put.md +51 -0
- package/src/docs/decorators/subscribe.md +87 -0
- package/src/docs/decorators/wait-for-ancestors.md +76 -0
- package/src/docs/directives/sub.md +75 -0
- package/src/docs/directives/t.md +73 -0
- package/src/docs/docs-location.spec.ts +56 -0
- package/src/docs/docs-location.ts +133 -32
- package/src/docs/docs.ts +1 -2
- package/src/docs/example/decorators-demo-bind-demos.ts +83 -135
- package/src/docs/example/decorators-demo-geo.ts +30 -19
- package/src/docs/example/decorators-demo-post.ts +88 -186
- package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
- package/src/docs/example/decorators-demo.ts +85 -98
- package/src/docs/example/docs-api-config-demos.ts +19 -20
- package/src/docs/example/docs-flight-demos.ts +147 -0
- package/src/docs/example/docs-jsonata-demos.ts +52 -52
- package/src/docs/example/docs-list-demos.ts +43 -123
- package/src/docs/example/docs-provider-keys.ts +21 -28
- package/src/docs/example/docs-queue-demos.ts +37 -77
- package/src/docs/example/docs-router-demos.ts +20 -25
- package/src/docs/example/docs-submit-demos.ts +48 -48
- package/src/docs/example/docs-toggle-demos.ts +4 -3
- package/src/docs/example/users.ts +0 -0
- package/src/docs/getting-started/ai-agents.md +50 -0
- package/src/docs/getting-started/create-a-component.md +136 -0
- package/src/docs/getting-started/dataFlow.md +87 -0
- package/src/docs/getting-started/installation.md +36 -0
- package/src/docs/getting-started/my-first-component.md +227 -0
- package/src/docs/getting-started/start.md +35 -0
- package/src/docs/header/header.ts +11 -6
- package/src/docs/home/catalog.ts +1 -1
- package/src/docs/home/home.ts +20 -11
- package/src/docs/layout.ts +12 -13
- package/src/docs/misc/api-configuration.md +79 -0
- package/src/docs/misc/dataProviderKey.md +168 -0
- package/src/docs/misc/docs-mock-api.md +62 -0
- package/src/docs/misc/dynamic-path.md +71 -0
- package/src/docs/misc/endpoint.md +45 -0
- package/src/docs/misc/html-integration.md +14 -0
- package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
- package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
- package/src/docs/misc/publisher-get-immutability-study.md +229 -0
- package/src/docs/mock-api/api-config-mock.ts +5 -0
- package/src/docs/mock-api/fixtures.ts +0 -278
- package/src/docs/mock-api/flights.ts +89 -0
- package/src/docs/mock-api/router.ts +3 -4
- package/src/docs/mock-api/urls.ts +1 -2
- package/src/docs/navigation/navigation.ts +84 -101
- package/src/docs/navigation/toc.ts +7 -4
- package/src/docs/search/docs-search.json +3188 -5153
- package/src/docs/search/markdown-renderer.ts +31 -8
- package/src/docs/search/page.ts +9 -6
- package/src/docs/search/search.ts +154 -122
- package/src/docs/tailwind/css/docs/content.css +4 -5
- package/src/tsconfig.declarations.json +22 -0
- package/src/tsconfig.emit.json +23 -0
- package/src/tsconfig.json +53 -5
- package/src/tsconfig.tsbuildinfo +1 -1
- package/vite.config.mts +11 -2
- package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
- package/.taste-skill/after/desktop-fold.jpg +0 -0
- package/.taste-skill/after/desktop-page-01.jpg +0 -0
- package/.taste-skill/after/desktop-page-02.jpg +0 -0
- package/.taste-skill/after/desktop-page-03.jpg +0 -0
- package/.taste-skill/after/mobile-fold.jpg +0 -0
- package/.taste-skill/after/mobile-page-01.jpg +0 -0
- package/.taste-skill/after/report.json +0 -4103
- package/.taste-skill/after/tablet-fold.jpg +0 -0
- package/.taste-skill/after/tablet-page-01.jpg +0 -0
- package/.taste-skill/after/tablet-page-02.jpg +0 -0
- package/.taste-skill/before/desktop-fold.jpg +0 -0
- package/.taste-skill/before/desktop-page-01.jpg +0 -0
- package/.taste-skill/before/desktop-page-02.jpg +0 -0
- package/.taste-skill/before/mobile-fold.jpg +0 -0
- package/.taste-skill/before/mobile-page-01.jpg +0 -0
- package/.taste-skill/before/report.json +0 -2556
- package/.taste-skill/before/tablet-fold.jpg +0 -0
- package/.taste-skill/before/tablet-page-01.jpg +0 -0
- package/.taste-skill/direction.json +0 -510
- package/.taste-skill/notes.md +0 -84
- package/.taste-skill/prod/desktop-fold.jpg +0 -0
- package/.taste-skill/prod/desktop-page-01.jpg +0 -0
- package/.taste-skill/prod/desktop-page-02.jpg +0 -0
- package/.taste-skill/prod/desktop-page-03.jpg +0 -0
- package/.taste-skill/prod/mobile-fold.jpg +0 -0
- package/.taste-skill/prod/mobile-page-01.jpg +0 -0
- package/.taste-skill/prod/mobile-page-02.jpg +0 -0
- package/.taste-skill/prod/report.json +0 -1973
- package/.taste-skill/prod/tablet-fold.jpg +0 -0
- package/.taste-skill/prod/tablet-page-01.jpg +0 -0
- package/.taste-skill/prod/tablet-page-02.jpg +0 -0
- package/AUDIT.md +0 -228
- package/PLAN-AMELIORATION.md +0 -220
- package/ai/AGENTS.md +0 -56
- package/ai/cursor/rules/concorde-menu.mdc +0 -15
- package/ai/cursor/rules/concorde-scope.mdc +0 -14
- package/ai/cursor/rules/concorde-theme.mdc +0 -13
- package/ai/cursor/rules/concorde.mdc +0 -66
- package/ai/jetbrains/rules/concorde.md +0 -53
- package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
- package/ai/skills/concorde-imports/SKILL.md +0 -78
- package/ai/skills/concorde-menu/SKILL.md +0 -74
- package/ai/skills/concorde-scope/SKILL.md +0 -70
- package/ai/skills/concorde-theme/SKILL.md +0 -57
- package/docs/assets/index-Bb-_LRyY.js +0 -12280
- package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
- package/src/docs/example/docs-joke-demos.ts +0 -297
- /package/{src → docs/src}/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -0
- /package/{src → docs/src}/docs/_core-concept/dataFlow.md +0 -0
- /package/{src → docs/src}/docs/_core-concept/overview.md +0 -0
- /package/{src → docs/src}/docs/_decorators/ancestor-attribute.md +0 -0
- /package/{src → docs/src}/docs/_decorators/auto-subscribe.md +0 -0
- /package/{src → docs/src}/docs/_decorators/bind.md +0 -0
- /package/{src → docs/src}/docs/_decorators/get.md +0 -0
- /package/{src → docs/src}/docs/_decorators/handle.md +0 -0
- /package/{src → docs/src}/docs/_decorators/on-assign.md +0 -0
- /package/{src → docs/src}/docs/_decorators/patch.md +0 -0
- /package/{src → docs/src}/docs/_decorators/post.md +0 -0
- /package/{src → docs/src}/docs/_decorators/publish.md +0 -0
- /package/{src → docs/src}/docs/_decorators/put.md +0 -0
- /package/{src → docs/src}/docs/_decorators/subscribe.md +0 -0
- /package/{src → docs/src}/docs/_decorators/wait-for-ancestors.md +0 -0
- /package/{src → docs/src}/docs/_directives/sub.md +0 -0
- /package/{src → docs/src}/docs/_getting-started/ai-agents.md +0 -0
- /package/{src → docs/src}/docs/_getting-started/concorde-manual-install.md +0 -0
- /package/{src → docs/src}/docs/_getting-started/concorde-outside.md +0 -0
- /package/{src → docs/src}/docs/_getting-started/create-a-component.md +0 -0
- /package/{src → docs/src}/docs/_getting-started/my-first-component.md +0 -0
- /package/{src → docs/src}/docs/_getting-started/start.md +0 -0
- /package/{src → docs/src}/docs/_misc/api-configuration.md +0 -0
- /package/{src → docs/src}/docs/_misc/dataProviderKey.md +0 -0
- /package/{src → docs/src}/docs/_misc/docs-mock-api.md +0 -0
- /package/{src → docs/src}/docs/_misc/dynamic-path.md +0 -0
- /package/{src → docs/src}/docs/_misc/endpoint.md +0 -0
- /package/{src → docs/src}/docs/_misc/formelement-subscriber-removal.md +0 -0
- /package/{src → docs/src}/docs/_misc/html-integration.md +0 -0
- /package/src/docs/{_getting-started → getting-started}/components.md +0 -0
- /package/src/docs/{_getting-started → getting-started}/theming.md +0 -0
package/scripts/ai-init.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Install Concorde
|
|
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
|
|
13
|
-
* --
|
|
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
|
-
*
|
|
20
|
-
* -
|
|
21
|
-
*
|
|
22
|
-
* -
|
|
23
|
-
*
|
|
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
|
-
*
|
|
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
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
const
|
|
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
|
|
157
|
-
return
|
|
158
|
-
|
|
159
|
-
.
|
|
160
|
-
.
|
|
161
|
-
.
|
|
162
|
-
.
|
|
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
|
|
166
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
*
|
|
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
|
|
229
|
-
const
|
|
230
|
-
const
|
|
231
|
-
|
|
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
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
*
|
|
306
|
-
*
|
|
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
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
|