@porsche-design-system/components-angular 4.5.0-rc.1 → 4.6.0-rc.0

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 (283) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/bin/pds-skill.js +259 -0
  3. package/fesm2022/porsche-design-system-components-angular.mjs.map +1 -1
  4. package/package.json +5 -2
  5. package/skill/SKILL.md +124 -0
  6. package/skill/references/components/p-accordion/examples/Default.ts +26 -0
  7. package/skill/references/components/p-accordion/examples/InteractiveElementsInSummary.ts +30 -0
  8. package/skill/references/components/p-accordion/examples/StickySummary.ts +26 -0
  9. package/skill/references/components/p-accordion/p-accordion.md +95 -0
  10. package/skill/references/components/p-ai-tag/examples/Default.ts +13 -0
  11. package/skill/references/components/p-ai-tag/examples/WithinCheckbox.ts +33 -0
  12. package/skill/references/components/p-ai-tag/examples/WithinFormLabel.ts +40 -0
  13. package/skill/references/components/p-ai-tag/examples/WithinImage.ts +16 -0
  14. package/skill/references/components/p-ai-tag/examples/WithinInputSearch.ts +15 -0
  15. package/skill/references/components/p-ai-tag/examples/WithinRadioGroup.ts +32 -0
  16. package/skill/references/components/p-ai-tag/examples/WithinTable.ts +94 -0
  17. package/skill/references/components/p-ai-tag/examples/WithinText.ts +17 -0
  18. package/skill/references/components/p-ai-tag/p-ai-tag.md +47 -0
  19. package/skill/references/components/p-banner/examples/Customization.ts +37 -0
  20. package/skill/references/components/p-banner/examples/Default.ts +26 -0
  21. package/skill/references/components/p-banner/p-banner.md +92 -0
  22. package/skill/references/components/p-button/examples/Default.ts +15 -0
  23. package/skill/references/components/p-button/examples/Form.ts +26 -0
  24. package/skill/references/components/p-button/examples/FormAttribute.ts +30 -0
  25. package/skill/references/components/p-button/p-button.md +118 -0
  26. package/skill/references/components/p-button-pure/examples/CustomClickableArea.ts +15 -0
  27. package/skill/references/components/p-button-pure/examples/Default.ts +15 -0
  28. package/skill/references/components/p-button-pure/examples/Form.ts +26 -0
  29. package/skill/references/components/p-button-pure/examples/FormAttribute.ts +30 -0
  30. package/skill/references/components/p-button-pure/p-button-pure.md +118 -0
  31. package/skill/references/components/p-button-tile/examples/ColorScheme.ts +18 -0
  32. package/skill/references/components/p-button-tile/examples/Default.ts +21 -0
  33. package/skill/references/components/p-button-tile/examples/FooterSlot.ts +32 -0
  34. package/skill/references/components/p-button-tile/examples/Hyphens.ts +38 -0
  35. package/skill/references/components/p-button-tile/examples/UiBehaviour.ts +44 -0
  36. package/skill/references/components/p-button-tile/p-button-tile.md +115 -0
  37. package/skill/references/components/p-canvas/examples/Default.ts +13 -0
  38. package/skill/references/components/p-canvas/p-canvas.md +91 -0
  39. package/skill/references/components/p-carousel/examples/Default.ts +26 -0
  40. package/skill/references/components/p-carousel/examples/DynamicSlides.ts +37 -0
  41. package/skill/references/components/p-carousel/examples/FlexibleWidths.ts +32 -0
  42. package/skill/references/components/p-carousel/examples/FocusOnCenterSlide.ts +65 -0
  43. package/skill/references/components/p-carousel/examples/Intl.ts +23 -0
  44. package/skill/references/components/p-carousel/examples/JumpToSlide.ts +50 -0
  45. package/skill/references/components/p-carousel/p-carousel.md +142 -0
  46. package/skill/references/components/p-checkbox/examples/Default.ts +13 -0
  47. package/skill/references/components/p-checkbox/examples/Form.ts +31 -0
  48. package/skill/references/components/p-checkbox/examples/Indeterminate.ts +16 -0
  49. package/skill/references/components/p-checkbox/examples/Slots.ts +57 -0
  50. package/skill/references/components/p-checkbox/examples/WrappedLabel.ts +27 -0
  51. package/skill/references/components/p-checkbox/p-checkbox.md +122 -0
  52. package/skill/references/components/p-crest/examples/CustomClickableArea.ts +13 -0
  53. package/skill/references/components/p-crest/examples/Default.ts +13 -0
  54. package/skill/references/components/p-crest/examples/Link.ts +13 -0
  55. package/skill/references/components/p-crest/p-crest.md +65 -0
  56. package/skill/references/components/p-display/examples/Color.ts +15 -0
  57. package/skill/references/components/p-display/examples/Default.ts +15 -0
  58. package/skill/references/components/p-display/examples/Semantics.ts +21 -0
  59. package/skill/references/components/p-display/examples/Size.ts +15 -0
  60. package/skill/references/components/p-display/examples/SizeResponsive.ts +15 -0
  61. package/skill/references/components/p-display/p-display.md +78 -0
  62. package/skill/references/components/p-divider/examples/Default.ts +13 -0
  63. package/skill/references/components/p-divider/examples/Responsive.ts +15 -0
  64. package/skill/references/components/p-divider/examples/Vertical.ts +15 -0
  65. package/skill/references/components/p-divider/p-divider.md +49 -0
  66. package/skill/references/components/p-drilldown/examples/CustomContent.ts +166 -0
  67. package/skill/references/components/p-drilldown/examples/Default.ts +119 -0
  68. package/skill/references/components/p-drilldown/p-drilldown.md +168 -0
  69. package/skill/references/components/p-fieldset/examples/Default.ts +15 -0
  70. package/skill/references/components/p-fieldset/examples/Required.ts +16 -0
  71. package/skill/references/components/p-fieldset/examples/SlottedLabel.ts +18 -0
  72. package/skill/references/components/p-fieldset/examples/SlottedMessage.ts +18 -0
  73. package/skill/references/components/p-fieldset/p-fieldset.md +88 -0
  74. package/skill/references/components/p-flag/examples/Default.ts +13 -0
  75. package/skill/references/components/p-flag/examples/ResponsiveSize.ts +13 -0
  76. package/skill/references/components/p-flag/examples/Size.ts +16 -0
  77. package/skill/references/components/p-flag/examples/SizeCssVar.ts +13 -0
  78. package/skill/references/components/p-flag/p-flag.md +68 -0
  79. package/skill/references/components/p-flyout/examples/CustomStyling.ts +47 -0
  80. package/skill/references/components/p-flyout/examples/Default.ts +44 -0
  81. package/skill/references/components/p-flyout/examples/Form.ts +47 -0
  82. package/skill/references/components/p-flyout/examples/StickyTop.ts +44 -0
  83. package/skill/references/components/p-flyout/p-flyout.md +128 -0
  84. package/skill/references/components/p-heading/examples/Color.ts +15 -0
  85. package/skill/references/components/p-heading/examples/Default.ts +15 -0
  86. package/skill/references/components/p-heading/examples/Semantics.ts +21 -0
  87. package/skill/references/components/p-heading/p-heading.md +78 -0
  88. package/skill/references/components/p-icon/examples/Color.ts +16 -0
  89. package/skill/references/components/p-icon/examples/ColorCssVar.ts +13 -0
  90. package/skill/references/components/p-icon/examples/Custom.ts +13 -0
  91. package/skill/references/components/p-icon/examples/Default.ts +13 -0
  92. package/skill/references/components/p-icon/examples/Overview.ts +591 -0
  93. package/skill/references/components/p-icon/examples/ResponsiveSize.ts +13 -0
  94. package/skill/references/components/p-icon/examples/Size.ts +16 -0
  95. package/skill/references/components/p-icon/examples/SizeCssVar.ts +13 -0
  96. package/skill/references/components/p-icon/p-icon.md +88 -0
  97. package/skill/references/components/p-inline-notification/examples/ActionButton.ts +29 -0
  98. package/skill/references/components/p-inline-notification/examples/Default.ts +13 -0
  99. package/skill/references/components/p-inline-notification/examples/EventHandling.ts +31 -0
  100. package/skill/references/components/p-inline-notification/p-inline-notification.md +74 -0
  101. package/skill/references/components/p-input-date/examples/Default.ts +13 -0
  102. package/skill/references/components/p-input-date/examples/Form.ts +31 -0
  103. package/skill/references/components/p-input-date/examples/Slots.ts +44 -0
  104. package/skill/references/components/p-input-date/p-input-date.md +138 -0
  105. package/skill/references/components/p-input-email/examples/Default.ts +13 -0
  106. package/skill/references/components/p-input-email/examples/Form.ts +31 -0
  107. package/skill/references/components/p-input-email/examples/Slots.ts +44 -0
  108. package/skill/references/components/p-input-email/p-input-email.md +142 -0
  109. package/skill/references/components/p-input-month/examples/Default.ts +13 -0
  110. package/skill/references/components/p-input-month/examples/Form.ts +31 -0
  111. package/skill/references/components/p-input-month/examples/Slots.ts +44 -0
  112. package/skill/references/components/p-input-month/p-input-month.md +138 -0
  113. package/skill/references/components/p-input-number/examples/Default.ts +13 -0
  114. package/skill/references/components/p-input-number/examples/Form.ts +31 -0
  115. package/skill/references/components/p-input-number/examples/Slots.ts +44 -0
  116. package/skill/references/components/p-input-number/p-input-number.md +146 -0
  117. package/skill/references/components/p-input-password/examples/Default.ts +13 -0
  118. package/skill/references/components/p-input-password/examples/Form.ts +31 -0
  119. package/skill/references/components/p-input-password/examples/Slots.ts +42 -0
  120. package/skill/references/components/p-input-password/examples/Toggle.ts +13 -0
  121. package/skill/references/components/p-input-password/p-input-password.md +141 -0
  122. package/skill/references/components/p-input-search/examples/AriaCombobox.ts +38 -0
  123. package/skill/references/components/p-input-search/examples/Default.ts +13 -0
  124. package/skill/references/components/p-input-search/examples/Form.ts +31 -0
  125. package/skill/references/components/p-input-search/examples/Slots.ts +44 -0
  126. package/skill/references/components/p-input-search/p-input-search.md +178 -0
  127. package/skill/references/components/p-input-tel/examples/Default.ts +13 -0
  128. package/skill/references/components/p-input-tel/examples/Form.ts +31 -0
  129. package/skill/references/components/p-input-tel/examples/Slots.ts +44 -0
  130. package/skill/references/components/p-input-tel/p-input-tel.md +141 -0
  131. package/skill/references/components/p-input-text/examples/Controlled.ts +36 -0
  132. package/skill/references/components/p-input-text/examples/Default.ts +13 -0
  133. package/skill/references/components/p-input-text/examples/Form.ts +31 -0
  134. package/skill/references/components/p-input-text/examples/Slots.ts +44 -0
  135. package/skill/references/components/p-input-text/p-input-text.md +146 -0
  136. package/skill/references/components/p-input-time/examples/Default.ts +13 -0
  137. package/skill/references/components/p-input-time/examples/Form.ts +31 -0
  138. package/skill/references/components/p-input-time/examples/Slots.ts +44 -0
  139. package/skill/references/components/p-input-time/p-input-time.md +140 -0
  140. package/skill/references/components/p-input-url/examples/Default.ts +13 -0
  141. package/skill/references/components/p-input-url/examples/Form.ts +31 -0
  142. package/skill/references/components/p-input-url/examples/Slots.ts +44 -0
  143. package/skill/references/components/p-input-url/p-input-url.md +141 -0
  144. package/skill/references/components/p-input-week/examples/Default.ts +13 -0
  145. package/skill/references/components/p-input-week/examples/Form.ts +31 -0
  146. package/skill/references/components/p-input-week/examples/Slots.ts +44 -0
  147. package/skill/references/components/p-input-week/p-input-week.md +138 -0
  148. package/skill/references/components/p-link/examples/Default.ts +15 -0
  149. package/skill/references/components/p-link/examples/FrameworkRouting.ts +17 -0
  150. package/skill/references/components/p-link/examples/Icon.ts +20 -0
  151. package/skill/references/components/p-link/p-link.md +101 -0
  152. package/skill/references/components/p-link-pure/examples/CustomClickableArea.ts +15 -0
  153. package/skill/references/components/p-link-pure/examples/Default.ts +15 -0
  154. package/skill/references/components/p-link-pure/examples/FrameworkRouting.ts +17 -0
  155. package/skill/references/components/p-link-pure/examples/Icon.ts +20 -0
  156. package/skill/references/components/p-link-pure/p-link-pure.md +110 -0
  157. package/skill/references/components/p-link-tile/examples/ColorScheme.ts +18 -0
  158. package/skill/references/components/p-link-tile/examples/Default.ts +21 -0
  159. package/skill/references/components/p-link-tile/examples/FooterSlot.ts +32 -0
  160. package/skill/references/components/p-link-tile/examples/Hyphens.ts +39 -0
  161. package/skill/references/components/p-link-tile/examples/UiBehaviour.ts +44 -0
  162. package/skill/references/components/p-link-tile/examples/WithVideo.ts +18 -0
  163. package/skill/references/components/p-link-tile/p-link-tile.md +105 -0
  164. package/skill/references/components/p-link-tile-product/examples/Default.ts +24 -0
  165. package/skill/references/components/p-link-tile-product/examples/FrameworkRouting.ts +27 -0
  166. package/skill/references/components/p-link-tile-product/p-link-tile-product.md +93 -0
  167. package/skill/references/components/p-modal/examples/AlertDialog.ts +41 -0
  168. package/skill/references/components/p-modal/examples/CustomStyling.ts +28 -0
  169. package/skill/references/components/p-modal/examples/Default.ts +41 -0
  170. package/skill/references/components/p-modal/examples/Scrollable.ts +45 -0
  171. package/skill/references/components/p-modal/p-modal.md +135 -0
  172. package/skill/references/components/p-model-signature/examples/CustomStyling.ts +17 -0
  173. package/skill/references/components/p-model-signature/examples/Default.ts +13 -0
  174. package/skill/references/components/p-model-signature/examples/MaskBlendMode.ts +35 -0
  175. package/skill/references/components/p-model-signature/examples/MaskImage.ts +15 -0
  176. package/skill/references/components/p-model-signature/examples/MaskVideo.ts +15 -0
  177. package/skill/references/components/p-model-signature/examples/SafeZone.ts +63 -0
  178. package/skill/references/components/p-model-signature/p-model-signature.md +62 -0
  179. package/skill/references/components/p-multi-select/examples/AsyncFilter.ts +149 -0
  180. package/skill/references/components/p-multi-select/examples/Default.ts +32 -0
  181. package/skill/references/components/p-multi-select/examples/Form.ts +38 -0
  182. package/skill/references/components/p-multi-select/examples/Optgroups.ts +45 -0
  183. package/skill/references/components/p-multi-select/examples/SelectedSlot.ts +103 -0
  184. package/skill/references/components/p-multi-select/examples/SetValue.ts +76 -0
  185. package/skill/references/components/p-multi-select/examples/Slots.ts +51 -0
  186. package/skill/references/components/p-multi-select/p-multi-select.md +197 -0
  187. package/skill/references/components/p-pagination/examples/Default.ts +13 -0
  188. package/skill/references/components/p-pagination/p-pagination.md +83 -0
  189. package/skill/references/components/p-pin-code/examples/CopyPaste.ts +13 -0
  190. package/skill/references/components/p-pin-code/examples/Default.ts +13 -0
  191. package/skill/references/components/p-pin-code/examples/Form.ts +31 -0
  192. package/skill/references/components/p-pin-code/examples/Slots.ts +42 -0
  193. package/skill/references/components/p-pin-code/p-pin-code.md +109 -0
  194. package/skill/references/components/p-popover/examples/Default.ts +17 -0
  195. package/skill/references/components/p-popover/examples/SlottedButton.ts +18 -0
  196. package/skill/references/components/p-popover/p-popover.md +116 -0
  197. package/skill/references/components/p-radio-group/examples/Default.ts +20 -0
  198. package/skill/references/components/p-radio-group/examples/Form.ts +38 -0
  199. package/skill/references/components/p-radio-group/examples/Slots.ts +72 -0
  200. package/skill/references/components/p-radio-group/p-radio-group.md +157 -0
  201. package/skill/references/components/p-scroller/examples/Default.ts +54 -0
  202. package/skill/references/components/p-scroller/examples/Height.ts +29 -0
  203. package/skill/references/components/p-scroller/examples/ScrollToPosition.ts +43 -0
  204. package/skill/references/components/p-scroller/p-scroller.md +93 -0
  205. package/skill/references/components/p-segmented-control/examples/Default.ts +29 -0
  206. package/skill/references/components/p-segmented-control/examples/Form.ts +37 -0
  207. package/skill/references/components/p-segmented-control/examples/Slots.ts +57 -0
  208. package/skill/references/components/p-segmented-control/examples/WithLabels.ts +29 -0
  209. package/skill/references/components/p-segmented-control/p-segmented-control.md +162 -0
  210. package/skill/references/components/p-select/examples/AsyncFilter.ts +149 -0
  211. package/skill/references/components/p-select/examples/Default.ts +32 -0
  212. package/skill/references/components/p-select/examples/Form.ts +38 -0
  213. package/skill/references/components/p-select/examples/Optgroups.ts +45 -0
  214. package/skill/references/components/p-select/examples/Required.ts +48 -0
  215. package/skill/references/components/p-select/examples/SelectedSlot.ts +130 -0
  216. package/skill/references/components/p-select/examples/SetValue.ts +71 -0
  217. package/skill/references/components/p-select/examples/Slots.ts +51 -0
  218. package/skill/references/components/p-select/examples/SlottedImages.ts +38 -0
  219. package/skill/references/components/p-select/p-select.md +194 -0
  220. package/skill/references/components/p-sheet/examples/Default.ts +33 -0
  221. package/skill/references/components/p-sheet/p-sheet.md +121 -0
  222. package/skill/references/components/p-spinner/examples/Color.ts +16 -0
  223. package/skill/references/components/p-spinner/examples/ColorCssVar.ts +13 -0
  224. package/skill/references/components/p-spinner/examples/Default.ts +13 -0
  225. package/skill/references/components/p-spinner/examples/ResponsiveSize.ts +13 -0
  226. package/skill/references/components/p-spinner/examples/Size.ts +16 -0
  227. package/skill/references/components/p-spinner/examples/SizeCssVar.ts +13 -0
  228. package/skill/references/components/p-spinner/p-spinner.md +96 -0
  229. package/skill/references/components/p-stepper-horizontal/examples/Default.ts +26 -0
  230. package/skill/references/components/p-stepper-horizontal/examples/FrameworkImplementation.ts +107 -0
  231. package/skill/references/components/p-stepper-horizontal/p-stepper-horizontal.md +109 -0
  232. package/skill/references/components/p-switch/examples/Default.ts +21 -0
  233. package/skill/references/components/p-switch/p-switch.md +103 -0
  234. package/skill/references/components/p-table/examples/Advanced.ts +162 -0
  235. package/skill/references/components/p-table/examples/CaptionProperty.ts +40 -0
  236. package/skill/references/components/p-table/examples/CaptionSlot.ts +43 -0
  237. package/skill/references/components/p-table/examples/Default.ts +120 -0
  238. package/skill/references/components/p-table/examples/HideLabel.ts +40 -0
  239. package/skill/references/components/p-table/examples/LayoutFixed.ts +53 -0
  240. package/skill/references/components/p-table/examples/Sorting.ts +79 -0
  241. package/skill/references/components/p-table/p-table.md +189 -0
  242. package/skill/references/components/p-tabs/examples/ActiveTab.ts +29 -0
  243. package/skill/references/components/p-tabs/examples/Default.ts +29 -0
  244. package/skill/references/components/p-tabs/examples/Gradient.ts +114 -0
  245. package/skill/references/components/p-tabs/examples/Labelling.ts +29 -0
  246. package/skill/references/components/p-tabs/p-tabs.md +136 -0
  247. package/skill/references/components/p-tabs-bar/examples/Default.ts +29 -0
  248. package/skill/references/components/p-tabs-bar/examples/Gradient.ts +80 -0
  249. package/skill/references/components/p-tabs-bar/examples/Labelling.ts +29 -0
  250. package/skill/references/components/p-tabs-bar/examples/Links.ts +23 -0
  251. package/skill/references/components/p-tabs-bar/p-tabs-bar.md +181 -0
  252. package/skill/references/components/p-tag/examples/Default.ts +15 -0
  253. package/skill/references/components/p-tag/examples/Multiline.ts +17 -0
  254. package/skill/references/components/p-tag/examples/SlottedButton.ts +44 -0
  255. package/skill/references/components/p-tag/examples/SlottedLink.ts +44 -0
  256. package/skill/references/components/p-tag/p-tag.md +66 -0
  257. package/skill/references/components/p-tag-dismissible/examples/Default.ts +15 -0
  258. package/skill/references/components/p-tag-dismissible/p-tag-dismissible.md +75 -0
  259. package/skill/references/components/p-text/examples/Default.ts +15 -0
  260. package/skill/references/components/p-text/examples/Semantics.ts +21 -0
  261. package/skill/references/components/p-text/examples/Size.ts +15 -0
  262. package/skill/references/components/p-text/examples/SizeResponsive.ts +15 -0
  263. package/skill/references/components/p-text/p-text.md +68 -0
  264. package/skill/references/components/p-text-list/examples/Default.ts +31 -0
  265. package/skill/references/components/p-text-list/p-text-list.md +68 -0
  266. package/skill/references/components/p-textarea/examples/Default.ts +13 -0
  267. package/skill/references/components/p-textarea/examples/Form.ts +31 -0
  268. package/skill/references/components/p-textarea/examples/Slots.ts +42 -0
  269. package/skill/references/components/p-textarea/p-textarea.md +122 -0
  270. package/skill/references/components/p-toast/examples/Default.ts +23 -0
  271. package/skill/references/components/p-toast/p-toast.md +61 -0
  272. package/skill/references/components/p-wordmark/examples/CustomClickableArea.ts +13 -0
  273. package/skill/references/components/p-wordmark/examples/Default.ts +13 -0
  274. package/skill/references/components/p-wordmark/examples/Size.ts +13 -0
  275. package/skill/references/components/p-wordmark/p-wordmark.md +66 -0
  276. package/skill/references/icons.md +5 -0
  277. package/skill/references/styles/emotion.md +439 -0
  278. package/skill/references/styles/scss.md +402 -0
  279. package/skill/references/styles/tailwindcss.md +356 -0
  280. package/skill/references/styles/vanilla-extract.md +444 -0
  281. package/skill/references/stylesheets.md +331 -0
  282. package/skill/references/tokens.md +323 -0
  283. package/types/porsche-design-system-components-angular.d.ts +2 -2
package/CHANGELOG.md CHANGED
@@ -14,6 +14,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
14
14
 
15
15
  ## [Unreleased]
16
16
 
17
+ ## [4.6.0-rc.0] - 2026-07-21
18
+
19
+ ### Added
20
+
21
+ - `Knowledge Skill`: providing version-exact guidance for PDS components, stylesheets, design tokens, and styling
22
+ integrations
23
+ ([#4555](https://github.com/porsche-design-system/porsche-design-system/pull/4555))
24
+
25
+ ## [4.5.0] - 2026-07-21
26
+
17
27
  ## [4.5.0-rc.1] - 2026-07-20
18
28
 
19
29
  ### Fixed
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Links a locally installed Porsche Design System wrapper skill into the consumer project. Every
4
+ // wrapper exposes this same bin through the local node_modules/.bin directory; --package selects
5
+ // which installed wrapper supplies the skill, independently of which wrapper supplies the bin.
6
+ //
7
+ // --location is the destination parent directory for the link (e.g. `.claude/skills`, `.agents`,
8
+ // `.github/skills`). Relative locations resolve from the cwd.
9
+ //
10
+ // pds-skill --package <package> --location <dir>
11
+ //
12
+ // This is the canonical source copied into all four wrapper package distributions by their
13
+ // `build:subPackages:skill:bin` steps.
14
+
15
+ const fs = require('node:fs');
16
+ const path = require('node:path');
17
+ const { parseArgs } = require('node:util');
18
+
19
+ const SUPPORTED_PACKAGES = [
20
+ '@porsche-design-system/components-js',
21
+ '@porsche-design-system/components-angular',
22
+ '@porsche-design-system/components-react',
23
+ '@porsche-design-system/components-vue',
24
+ ];
25
+ const USAGE = [
26
+ 'Usage: pds-skill --package <package> --location <dir>',
27
+ '',
28
+ 'Required options:',
29
+ ' -p, --package <package> locally installed Porsche Design System wrapper',
30
+ ' -l, --location <dir> destination parent directory for the skill link',
31
+ '',
32
+ 'Options:',
33
+ ' -h, --help print this usage',
34
+ '',
35
+ `Supported packages: ${SUPPORTED_PACKAGES.join(', ')}`,
36
+ ].join('\n');
37
+
38
+ const fail = (message) => {
39
+ console.error(message);
40
+ process.exit(1);
41
+ };
42
+
43
+ const isMissingPathError = (error) => error.code === 'ENOENT' || error.code === 'ENOTDIR';
44
+ const isPermissionError = (error) => error.code === 'EACCES' || error.code === 'EPERM';
45
+
46
+ const parseOptions = (args) => {
47
+ try {
48
+ return parseArgs({
49
+ args,
50
+ options: {
51
+ package: { type: 'string', short: 'p' },
52
+ location: { type: 'string', short: 'l' },
53
+ help: { type: 'boolean', short: 'h' },
54
+ },
55
+ strict: true,
56
+ allowPositionals: false,
57
+ }).values;
58
+ } catch (error) {
59
+ fail(`${error.message}\n${USAGE}`);
60
+ }
61
+ };
62
+
63
+ const linkNameFromPackage = (packageName) => packageName.slice(1).replace('/', '-');
64
+
65
+ const readPackageManifest = (packageJsonPath) => {
66
+ let content;
67
+ try {
68
+ content = fs.readFileSync(packageJsonPath, 'utf8');
69
+ } catch (error) {
70
+ if (isMissingPathError(error)) {
71
+ return undefined;
72
+ }
73
+ if (isPermissionError(error)) {
74
+ fail(`Cannot read ${packageJsonPath}: permission denied. Check the package permissions and re-run.`);
75
+ }
76
+ throw error;
77
+ }
78
+
79
+ try {
80
+ return JSON.parse(content);
81
+ } catch (error) {
82
+ if (error instanceof SyntaxError) {
83
+ fail(`Cannot read ${packageJsonPath}: invalid JSON. Reinstall the package and re-run.`);
84
+ }
85
+ throw error;
86
+ }
87
+ };
88
+
89
+ const validateSkillEntry = (skillMdPath) => {
90
+ let stats;
91
+ try {
92
+ stats = fs.statSync(skillMdPath);
93
+ } catch (error) {
94
+ if (isMissingPathError(error)) {
95
+ fail(`The installed package does not ship a skill at ${skillMdPath}. Upgrade the package and re-run.`);
96
+ }
97
+ if (isPermissionError(error)) {
98
+ fail(`Cannot read ${skillMdPath}: permission denied. Check the package permissions and re-run.`);
99
+ }
100
+ throw error;
101
+ }
102
+
103
+ if (!stats.isFile()) {
104
+ fail(`${skillMdPath} is not a file. Reinstall the package and re-run.`);
105
+ }
106
+
107
+ try {
108
+ const descriptor = fs.openSync(skillMdPath, 'r');
109
+ fs.closeSync(descriptor);
110
+ } catch (error) {
111
+ if (isPermissionError(error)) {
112
+ fail(`Cannot read ${skillMdPath}: permission denied. Check the package permissions and re-run.`);
113
+ }
114
+ throw error;
115
+ }
116
+ };
117
+
118
+ const skillDirFromPackage = (packageName, cwd) => {
119
+ if (!SUPPORTED_PACKAGES.includes(packageName)) {
120
+ fail(`Unsupported package: ${packageName}\n${USAGE}`);
121
+ }
122
+
123
+ let dir = cwd;
124
+ for (;;) {
125
+ const packageDir = path.join(dir, 'node_modules', ...packageName.split('/'));
126
+ const packageJsonPath = path.join(packageDir, 'package.json');
127
+ const pkg = readPackageManifest(packageJsonPath);
128
+ if (pkg !== undefined) {
129
+ const installedName = pkg && typeof pkg === 'object' ? pkg.name : undefined;
130
+ if (installedName !== packageName) {
131
+ fail(`Expected ${packageName} at ${packageDir}, but found ${installedName || 'a package without a name'}.`);
132
+ }
133
+ const skillDir = path.join(packageDir, 'skill');
134
+ validateSkillEntry(path.join(skillDir, 'SKILL.md'));
135
+ return skillDir;
136
+ }
137
+
138
+ const parent = path.dirname(dir);
139
+ if (parent === dir) {
140
+ fail(`Cannot find ${packageName} from ${cwd}. Install it in this project or workspace and re-run.`);
141
+ }
142
+ dir = parent;
143
+ }
144
+ };
145
+
146
+ const main = () => {
147
+ const options = parseOptions(process.argv.slice(2));
148
+ if (options.help) {
149
+ console.log(USAGE);
150
+ return;
151
+ }
152
+ const missingOptions = [
153
+ !options.package && '--package',
154
+ !options.location && '--location',
155
+ ].filter(Boolean);
156
+ if (missingOptions.length > 0) {
157
+ fail(
158
+ `Missing required option${missingOptions.length > 1 ? 's' : ''}: ${missingOptions.join(' and ')}\n${USAGE}`
159
+ );
160
+ }
161
+
162
+ if (process.versions.pnp) {
163
+ fail(
164
+ "Yarn Plug'n'Play is not supported because an operating-system symlink cannot target Yarn's virtual filesystem. Use `nodeLinker: node-modules`."
165
+ );
166
+ }
167
+
168
+ const cwd = process.cwd();
169
+ const packageName = options.package;
170
+ const destArg = options.location;
171
+ const skillDir = skillDirFromPackage(packageName, cwd);
172
+ const linkName = linkNameFromPackage(packageName);
173
+
174
+ const skillsDir = path.isAbsolute(destArg) ? destArg : path.resolve(cwd, destArg);
175
+ const linkPath = path.join(skillsDir, linkName);
176
+
177
+ // Prefer a cwd-relative path in messages; use the absolute path when the link lives outside it.
178
+ const show = (target) => {
179
+ const rel = path.relative(cwd, target);
180
+ return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel : target;
181
+ };
182
+
183
+ try {
184
+ fs.mkdirSync(skillsDir, { recursive: true });
185
+ } catch (error) {
186
+ if (error.code === 'ENOTDIR' || error.code === 'EEXIST') {
187
+ fail(`Cannot create ${show(skillsDir)}: a parent path exists as a file, not a directory. Remove it and re-run.`);
188
+ }
189
+ if (isPermissionError(error)) {
190
+ fail(`Cannot create ${show(skillsDir)}: permission denied. Check the destination permissions and re-run.`);
191
+ }
192
+ throw error;
193
+ }
194
+
195
+ // Idempotent, but only for the symlink we own: repoint an existing symlink (including a
196
+ // dangling one), and refuse to touch a real directory a user may have hand-maintained here —
197
+ // never recursively delete it.
198
+ let existing = null;
199
+ try {
200
+ existing = fs.lstatSync(linkPath);
201
+ } catch (error) {
202
+ if (error.code === 'ENOENT') {
203
+ existing = null;
204
+ } else if (isPermissionError(error)) {
205
+ fail(`Cannot inspect ${show(linkPath)}: permission denied. Check the destination permissions and re-run.`);
206
+ } else {
207
+ throw error;
208
+ }
209
+ }
210
+ if (existing) {
211
+ if (!existing.isSymbolicLink()) {
212
+ fail(`Refusing to replace ${show(linkPath)}: it exists and is not a symlink. Remove it manually and re-run.`);
213
+ }
214
+
215
+ try {
216
+ if (fs.realpathSync(linkPath) === fs.realpathSync(skillDir)) {
217
+ console.log(`Porsche Design System skill already linked: ${show(linkPath)} -> ${skillDir}`);
218
+ return;
219
+ }
220
+ } catch (error) {
221
+ if (error.code === 'ENOENT') {
222
+ // The existing link is dangling and can be replaced.
223
+ } else if (isPermissionError(error)) {
224
+ fail(`Cannot inspect ${show(linkPath)}: permission denied. Check the destination permissions and re-run.`);
225
+ } else {
226
+ throw error;
227
+ }
228
+ }
229
+ try {
230
+ fs.rmSync(linkPath, { force: true });
231
+ } catch (error) {
232
+ if (isPermissionError(error)) {
233
+ fail(`Cannot replace ${show(linkPath)}: permission denied. Check the destination permissions and re-run.`);
234
+ }
235
+ throw error;
236
+ }
237
+ }
238
+
239
+ // Windows has no unprivileged directory symlink; a junction needs no elevation and works with
240
+ // the absolute target we already hold. macOS/Linux use a normal directory symlink.
241
+ const linkType = process.platform === 'win32' ? 'junction' : 'dir';
242
+ try {
243
+ fs.symlinkSync(skillDir, linkPath, linkType);
244
+ } catch (error) {
245
+ if (process.platform === 'win32' && error.code === 'EPERM') {
246
+ fail(
247
+ `Could not create the skill junction on Windows (EPERM). Check the destination permissions or create it manually:\n mklink /J "${linkPath}" "${skillDir}"`
248
+ );
249
+ }
250
+ if (isPermissionError(error)) {
251
+ fail(`Cannot create ${show(linkPath)}: permission denied. Check the destination permissions and re-run.`);
252
+ }
253
+ throw error;
254
+ }
255
+
256
+ console.log(`Linked Porsche Design System skill: ${show(linkPath)} -> ${skillDir}`);
257
+ };
258
+
259
+ main();