devskill 2.0.5 → 2.0.7

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 (438) hide show
  1. package/landing/app/[locale]/page.tsx +68 -2
  2. package/landing/messages/en.json +12 -2
  3. package/landing/messages/vi.json +13 -3
  4. package/meta.ts +18 -1
  5. package/package.json +5 -1
  6. package/scripts/cli.ts +175 -46
  7. package/skills/algorithmic-art/LICENSE.txt +202 -0
  8. package/skills/algorithmic-art/SKILL.md +405 -0
  9. package/skills/algorithmic-art/SYNC.md +5 -0
  10. package/skills/algorithmic-art/templates/generator_template.js +223 -0
  11. package/skills/algorithmic-art/templates/viewer.html +599 -0
  12. package/skills/brand-guidelines/LICENSE.txt +202 -0
  13. package/skills/brand-guidelines/SKILL.md +73 -0
  14. package/skills/brand-guidelines/SYNC.md +5 -0
  15. package/skills/canvas-design/LICENSE.txt +202 -0
  16. package/skills/canvas-design/SKILL.md +130 -0
  17. package/skills/canvas-design/SYNC.md +5 -0
  18. package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  19. package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  20. package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  21. package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  22. package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  23. package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  24. package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  25. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  26. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  27. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  28. package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  29. package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  30. package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  31. package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  32. package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  33. package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  34. package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  35. package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  36. package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  37. package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  38. package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  39. package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  40. package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  41. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  42. package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  43. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  44. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  45. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  46. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  47. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  48. package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  49. package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  50. package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  51. package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  52. package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  53. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  54. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  55. package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  56. package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  57. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  58. package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  59. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  60. package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  61. package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  62. package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  63. package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  64. package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  65. package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  66. package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  67. package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  68. package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  69. package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  70. package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  71. package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  72. package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  73. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  74. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  75. package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  76. package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  77. package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  78. package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  79. package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  80. package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  81. package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  82. package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  83. package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  84. package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  85. package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  86. package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  87. package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  88. package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  89. package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  90. package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  91. package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  92. package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  93. package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  94. package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  95. package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  96. package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  97. package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  98. package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  99. package/skills/claude-api/LICENSE.txt +202 -0
  100. package/skills/claude-api/SKILL.md +246 -0
  101. package/skills/claude-api/SYNC.md +5 -0
  102. package/skills/claude-api/csharp/claude-api.md +400 -0
  103. package/skills/claude-api/curl/examples.md +193 -0
  104. package/skills/claude-api/go/claude-api.md +404 -0
  105. package/skills/claude-api/java/claude-api.md +430 -0
  106. package/skills/claude-api/php/claude-api.md +241 -0
  107. package/skills/claude-api/python/agent-sdk/README.md +345 -0
  108. package/skills/claude-api/python/agent-sdk/patterns.md +359 -0
  109. package/skills/claude-api/python/claude-api/README.md +410 -0
  110. package/skills/claude-api/python/claude-api/batches.md +185 -0
  111. package/skills/claude-api/python/claude-api/files-api.md +165 -0
  112. package/skills/claude-api/python/claude-api/streaming.md +162 -0
  113. package/skills/claude-api/python/claude-api/tool-use.md +590 -0
  114. package/skills/claude-api/ruby/claude-api.md +92 -0
  115. package/skills/claude-api/shared/error-codes.md +206 -0
  116. package/skills/claude-api/shared/live-sources.md +121 -0
  117. package/skills/claude-api/shared/models.md +119 -0
  118. package/skills/claude-api/shared/tool-use-concepts.md +305 -0
  119. package/skills/claude-api/typescript/agent-sdk/README.md +296 -0
  120. package/skills/claude-api/typescript/agent-sdk/patterns.md +209 -0
  121. package/skills/claude-api/typescript/claude-api/README.md +321 -0
  122. package/skills/claude-api/typescript/claude-api/batches.md +106 -0
  123. package/skills/claude-api/typescript/claude-api/files-api.md +98 -0
  124. package/skills/claude-api/typescript/claude-api/streaming.md +178 -0
  125. package/skills/claude-api/typescript/claude-api/tool-use.md +527 -0
  126. package/skills/doc-coauthoring/SKILL.md +375 -0
  127. package/skills/doc-coauthoring/SYNC.md +5 -0
  128. package/skills/docx/LICENSE.txt +30 -0
  129. package/skills/docx/SKILL.md +590 -0
  130. package/skills/docx/SYNC.md +5 -0
  131. package/skills/docx/scripts/__init__.py +1 -0
  132. package/skills/docx/scripts/accept_changes.py +135 -0
  133. package/skills/docx/scripts/comment.py +318 -0
  134. package/skills/docx/scripts/office/helpers/__init__.py +0 -0
  135. package/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  136. package/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  137. package/skills/docx/scripts/office/pack.py +159 -0
  138. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  139. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  140. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  141. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  142. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  143. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  144. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  145. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  146. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  147. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  148. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  149. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  150. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  151. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  152. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  153. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  154. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  155. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  156. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  157. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  158. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  159. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  160. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  161. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  162. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  163. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  164. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  165. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  166. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  167. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  168. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  169. package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  170. package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  171. package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  172. package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  173. package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  174. package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  175. package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  176. package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  177. package/skills/docx/scripts/office/soffice.py +183 -0
  178. package/skills/docx/scripts/office/unpack.py +132 -0
  179. package/skills/docx/scripts/office/validate.py +111 -0
  180. package/skills/docx/scripts/office/validators/__init__.py +15 -0
  181. package/skills/docx/scripts/office/validators/base.py +847 -0
  182. package/skills/docx/scripts/office/validators/docx.py +446 -0
  183. package/skills/docx/scripts/office/validators/pptx.py +275 -0
  184. package/skills/docx/scripts/office/validators/redlining.py +247 -0
  185. package/skills/docx/scripts/templates/comments.xml +3 -0
  186. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  187. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  188. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  189. package/skills/docx/scripts/templates/people.xml +3 -0
  190. package/skills/frontend-design/LICENSE.txt +177 -0
  191. package/skills/frontend-design/SKILL.md +42 -0
  192. package/skills/frontend-design/SYNC.md +5 -0
  193. package/skills/internal-comms/LICENSE.txt +202 -0
  194. package/skills/internal-comms/SKILL.md +32 -0
  195. package/skills/internal-comms/SYNC.md +5 -0
  196. package/skills/internal-comms/examples/3p-updates.md +47 -0
  197. package/skills/internal-comms/examples/company-newsletter.md +65 -0
  198. package/skills/internal-comms/examples/faq-answers.md +30 -0
  199. package/skills/internal-comms/examples/general-comms.md +16 -0
  200. package/skills/mcp-builder/LICENSE.txt +202 -0
  201. package/skills/mcp-builder/SKILL.md +236 -0
  202. package/skills/mcp-builder/SYNC.md +5 -0
  203. package/skills/mcp-builder/reference/evaluation.md +602 -0
  204. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  205. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  206. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  207. package/skills/mcp-builder/scripts/connections.py +151 -0
  208. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  209. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  210. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  211. package/skills/next-best-practices/SKILL.md +153 -0
  212. package/skills/next-best-practices/SYNC.md +5 -0
  213. package/skills/next-best-practices/async-patterns.md +87 -0
  214. package/skills/next-best-practices/bundling.md +180 -0
  215. package/skills/next-best-practices/data-patterns.md +297 -0
  216. package/skills/next-best-practices/debug-tricks.md +105 -0
  217. package/skills/next-best-practices/directives.md +73 -0
  218. package/skills/next-best-practices/error-handling.md +227 -0
  219. package/skills/next-best-practices/file-conventions.md +140 -0
  220. package/skills/next-best-practices/font.md +245 -0
  221. package/skills/next-best-practices/functions.md +108 -0
  222. package/skills/next-best-practices/hydration-error.md +91 -0
  223. package/skills/next-best-practices/image.md +173 -0
  224. package/skills/next-best-practices/metadata.md +301 -0
  225. package/skills/next-best-practices/parallel-routes.md +287 -0
  226. package/skills/next-best-practices/route-handlers.md +146 -0
  227. package/skills/next-best-practices/rsc-boundaries.md +159 -0
  228. package/skills/next-best-practices/runtime-selection.md +39 -0
  229. package/skills/next-best-practices/scripts.md +141 -0
  230. package/skills/next-best-practices/self-hosting.md +371 -0
  231. package/skills/next-best-practices/suspense-boundaries.md +67 -0
  232. package/skills/next-cache-components/SKILL.md +411 -0
  233. package/skills/next-cache-components/SYNC.md +5 -0
  234. package/skills/next-upgrade/SKILL.md +50 -0
  235. package/skills/next-upgrade/SYNC.md +5 -0
  236. package/skills/pdf/LICENSE.txt +30 -0
  237. package/skills/pdf/SKILL.md +314 -0
  238. package/skills/pdf/SYNC.md +5 -0
  239. package/skills/pdf/forms.md +294 -0
  240. package/skills/pdf/reference.md +612 -0
  241. package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  242. package/skills/pdf/scripts/check_fillable_fields.py +11 -0
  243. package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  244. package/skills/pdf/scripts/create_validation_image.py +37 -0
  245. package/skills/pdf/scripts/extract_form_field_info.py +122 -0
  246. package/skills/pdf/scripts/extract_form_structure.py +115 -0
  247. package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  248. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  249. package/skills/pptx/LICENSE.txt +30 -0
  250. package/skills/pptx/SKILL.md +232 -0
  251. package/skills/pptx/SYNC.md +5 -0
  252. package/skills/pptx/editing.md +205 -0
  253. package/skills/pptx/pptxgenjs.md +420 -0
  254. package/skills/pptx/scripts/__init__.py +0 -0
  255. package/skills/pptx/scripts/add_slide.py +195 -0
  256. package/skills/pptx/scripts/clean.py +286 -0
  257. package/skills/pptx/scripts/office/helpers/__init__.py +0 -0
  258. package/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  259. package/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  260. package/skills/pptx/scripts/office/pack.py +159 -0
  261. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  262. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  263. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  264. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  265. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  266. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  267. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  268. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  269. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  270. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  271. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  272. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  273. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  274. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  275. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  276. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  277. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  278. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  279. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  280. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  281. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  282. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  283. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  284. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  285. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  286. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  287. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  288. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  289. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  290. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  291. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  292. package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  293. package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  294. package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  295. package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  296. package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  297. package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  298. package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  299. package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  300. package/skills/pptx/scripts/office/soffice.py +183 -0
  301. package/skills/pptx/scripts/office/unpack.py +132 -0
  302. package/skills/pptx/scripts/office/validate.py +111 -0
  303. package/skills/pptx/scripts/office/validators/__init__.py +15 -0
  304. package/skills/pptx/scripts/office/validators/base.py +847 -0
  305. package/skills/pptx/scripts/office/validators/docx.py +446 -0
  306. package/skills/pptx/scripts/office/validators/pptx.py +275 -0
  307. package/skills/pptx/scripts/office/validators/redlining.py +247 -0
  308. package/skills/pptx/scripts/thumbnail.py +289 -0
  309. package/skills/shadcn/LICENSE.md +21 -0
  310. package/skills/shadcn/SKILL.md +242 -0
  311. package/skills/shadcn/SYNC.md +5 -0
  312. package/skills/shadcn/agents/openai.yml +5 -0
  313. package/skills/shadcn/assets/shadcn-small.png +0 -0
  314. package/skills/shadcn/assets/shadcn.png +0 -0
  315. package/skills/shadcn/cli.md +257 -0
  316. package/skills/shadcn/customization.md +202 -0
  317. package/skills/shadcn/evals/evals.json +47 -0
  318. package/skills/shadcn/mcp.md +94 -0
  319. package/skills/shadcn/rules/base-vs-radix.md +306 -0
  320. package/skills/shadcn/rules/composition.md +195 -0
  321. package/skills/shadcn/rules/forms.md +192 -0
  322. package/skills/shadcn/rules/icons.md +101 -0
  323. package/skills/shadcn/rules/styling.md +162 -0
  324. package/skills/skill-creator/LICENSE.txt +202 -0
  325. package/skills/skill-creator/SKILL.md +485 -0
  326. package/skills/skill-creator/SYNC.md +5 -0
  327. package/skills/skill-creator/agents/analyzer.md +274 -0
  328. package/skills/skill-creator/agents/comparator.md +202 -0
  329. package/skills/skill-creator/agents/grader.md +223 -0
  330. package/skills/skill-creator/assets/eval_review.html +146 -0
  331. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  332. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  333. package/skills/skill-creator/references/schemas.md +430 -0
  334. package/skills/skill-creator/scripts/__init__.py +0 -0
  335. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  336. package/skills/skill-creator/scripts/generate_report.py +326 -0
  337. package/skills/skill-creator/scripts/improve_description.py +247 -0
  338. package/skills/skill-creator/scripts/package_skill.py +136 -0
  339. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  340. package/skills/skill-creator/scripts/run_eval.py +310 -0
  341. package/skills/skill-creator/scripts/run_loop.py +328 -0
  342. package/skills/skill-creator/scripts/utils.py +47 -0
  343. package/skills/slack-gif-creator/LICENSE.txt +202 -0
  344. package/skills/slack-gif-creator/SKILL.md +254 -0
  345. package/skills/slack-gif-creator/SYNC.md +5 -0
  346. package/skills/slack-gif-creator/core/easing.py +234 -0
  347. package/skills/slack-gif-creator/core/frame_composer.py +176 -0
  348. package/skills/slack-gif-creator/core/gif_builder.py +269 -0
  349. package/skills/slack-gif-creator/core/validators.py +136 -0
  350. package/skills/slack-gif-creator/requirements.txt +4 -0
  351. package/skills/theme-factory/LICENSE.txt +202 -0
  352. package/skills/theme-factory/SKILL.md +59 -0
  353. package/skills/theme-factory/SYNC.md +5 -0
  354. package/skills/theme-factory/theme-showcase.pdf +0 -0
  355. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  356. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  357. package/skills/theme-factory/themes/desert-rose.md +19 -0
  358. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  359. package/skills/theme-factory/themes/golden-hour.md +19 -0
  360. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  361. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  362. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  363. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  364. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  365. package/skills/vue-best-practices/SYNC.md +1 -1
  366. package/skills/vue-jsx-best-practices/SYNC.md +1 -1
  367. package/skills/vue-options-api-best-practices/SYNC.md +1 -1
  368. package/skills/vue-pinia-best-practices/SYNC.md +1 -1
  369. package/skills/vue-router-best-practices/SYNC.md +1 -1
  370. package/skills/vue-testing-best-practices/SYNC.md +1 -1
  371. package/skills/web-artifacts-builder/LICENSE.txt +202 -0
  372. package/skills/web-artifacts-builder/SKILL.md +74 -0
  373. package/skills/web-artifacts-builder/SYNC.md +5 -0
  374. package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  375. package/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  376. package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  377. package/skills/webapp-testing/LICENSE.txt +202 -0
  378. package/skills/webapp-testing/SKILL.md +96 -0
  379. package/skills/webapp-testing/SYNC.md +5 -0
  380. package/skills/webapp-testing/examples/console_logging.py +35 -0
  381. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  382. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  383. package/skills/webapp-testing/scripts/with_server.py +106 -0
  384. package/skills/xlsx/LICENSE.txt +30 -0
  385. package/skills/xlsx/SKILL.md +292 -0
  386. package/skills/xlsx/SYNC.md +5 -0
  387. package/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  388. package/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  389. package/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  390. package/skills/xlsx/scripts/office/pack.py +159 -0
  391. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  392. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  393. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  394. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  395. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  396. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  397. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  398. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  399. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  400. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  401. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  402. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  403. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  404. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  405. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  406. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  407. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  408. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  409. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  410. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  411. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  412. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  413. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  414. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  415. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  416. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  417. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  418. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  419. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  420. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  421. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  422. package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  423. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  424. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  425. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  426. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  427. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  428. package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  429. package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  430. package/skills/xlsx/scripts/office/soffice.py +183 -0
  431. package/skills/xlsx/scripts/office/unpack.py +132 -0
  432. package/skills/xlsx/scripts/office/validate.py +111 -0
  433. package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  434. package/skills/xlsx/scripts/office/validators/base.py +847 -0
  435. package/skills/xlsx/scripts/office/validators/docx.py +446 -0
  436. package/skills/xlsx/scripts/office/validators/pptx.py +275 -0
  437. package/skills/xlsx/scripts/office/validators/redlining.py +247 -0
  438. package/skills/xlsx/scripts/recalc.py +184 -0
@@ -76,10 +76,10 @@ export default function LandingPage() {
76
76
  <h1 className="text-6xl md:text-8xl font-extrabold mb-8 tracking-tight bg-clip-text text-transparent bg-gradient-to-br from-white via-zinc-200 to-zinc-500 pb-2">
77
77
  {t('title')}
78
78
  </h1>
79
- <p className="text-xl md:text-2xl text-zinc-300 max-w-3xl mx-auto mb-12 leading-relaxed text-balance font-light">
79
+ <p className="text-xl md:text-2xl text-zinc-300 max-w-5xl mx-auto mb-12 leading-relaxed text-balance font-light">
80
80
  {t('subtitle')}
81
81
  </p>
82
- <p className="text-lg text-zinc-400 max-w-2xl mx-auto mb-12 leading-relaxed text-balance">
82
+ <p className="text-lg text-zinc-400 max-w-4xl mx-auto mb-12 leading-relaxed text-balance">
83
83
  {h('description')}
84
84
  </p>
85
85
  <div className="flex flex-col sm:flex-row items-center justify-center gap-4 w-full max-w-md mx-auto sm:max-w-none">
@@ -270,6 +270,72 @@ export default function LandingPage() {
270
270
  </Card>
271
271
  </div>
272
272
  </section>
273
+
274
+ {/* Architecture Section */}
275
+ <section id="architecture" className="container mx-auto px-4 mb-40 relative z-10">
276
+ <div className="text-center mb-16">
277
+ <h2 className="text-4xl md:text-5xl font-extrabold mb-6 tracking-tight text-white">{t('architecture_title')}</h2>
278
+ <div className="w-24 h-1.5 bg-gradient-to-r from-cyan-400 to-rose-500 mx-auto rounded-full mb-6" />
279
+ <p className="text-xl text-zinc-400 max-w-3xl mx-auto leading-relaxed">{t('architecture_desc')}</p>
280
+ </div>
281
+
282
+ <div className="grid md:grid-cols-2 gap-8 max-w-5xl mx-auto">
283
+ <Card className="bg-zinc-900/60 border-cyan-400/20 backdrop-blur-xl hover:bg-zinc-900/80 hover:border-cyan-400/50 hover:-translate-y-2 hover:shadow-2xl hover:shadow-cyan-400/20 transition-all duration-300 group overflow-hidden relative">
284
+ <div className="absolute top-0 right-0 p-32 bg-cyan-400/5 rounded-full blur-[80px] -mr-16 -mt-16 transition-opacity opacity-0 group-hover:opacity-100" />
285
+ <CardHeader className="relative z-10">
286
+ <div className="w-14 h-14 rounded-2xl bg-cyan-400/10 flex items-center justify-center mb-6 group-hover:scale-110 transition-transform duration-500 border border-cyan-400/20">
287
+ <Database className="w-7 h-7 text-cyan-400" />
288
+ </div>
289
+ <CardTitle className="text-2xl text-white font-bold tracking-tight">{t('sources_title')}</CardTitle>
290
+ </CardHeader>
291
+ <CardContent className="relative z-10">
292
+ <p className="text-zinc-300 leading-relaxed text-base">{t('sources_desc')}</p>
293
+ </CardContent>
294
+ </Card>
295
+
296
+ <Card className="bg-zinc-900/60 border-rose-500/20 backdrop-blur-xl hover:bg-zinc-900/80 hover:border-rose-500/50 hover:-translate-y-2 hover:shadow-2xl hover:shadow-rose-500/20 transition-all duration-300 group overflow-hidden relative">
297
+ <div className="absolute top-0 right-0 p-32 bg-rose-500/5 rounded-full blur-[80px] -mr-16 -mt-16 transition-opacity opacity-0 group-hover:opacity-100" />
298
+ <CardHeader className="relative z-10">
299
+ <div className="w-14 h-14 rounded-2xl bg-rose-500/10 flex items-center justify-center mb-6 group-hover:scale-110 transition-transform duration-500 border border-rose-500/20">
300
+ <Boxes className="w-7 h-7 text-rose-500" />
301
+ </div>
302
+ <CardTitle className="text-2xl text-white font-bold tracking-tight">{t('vendor_title')}</CardTitle>
303
+ </CardHeader>
304
+ <CardContent className="relative z-10">
305
+ <p className="text-zinc-300 leading-relaxed text-base">{t('vendor_desc')}</p>
306
+ </CardContent>
307
+ </Card>
308
+ </div>
309
+ </section>
310
+
311
+ {/* Contribute Section */}
312
+ <section id="contribute" className="container mx-auto px-4 mb-40 text-center relative z-10">
313
+ <div className="max-w-4xl mx-auto bg-gradient-to-br from-zinc-900/80 to-zinc-950 border border-white/10 p-10 md:p-14 rounded-3xl shadow-2xl relative overflow-hidden group">
314
+ <div className="absolute top-0 right-0 p-32 bg-rose-500/10 rounded-full blur-[100px] -mr-16 -mt-16 pointer-events-none" />
315
+ <div className="absolute bottom-0 left-0 p-32 bg-cyan-400/10 rounded-full blur-[100px] -ml-16 -mb-16 pointer-events-none" />
316
+
317
+ <h2 className="text-3xl md:text-5xl font-extrabold mb-6 tracking-tight text-white">{t('contribute_title')}</h2>
318
+ <p className="text-lg md:text-xl text-zinc-300 max-w-3xl mx-auto mb-10 leading-relaxed font-light">
319
+ {t('contribute_desc')}
320
+ </p>
321
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-4">
322
+ <a
323
+ href="https://github.com/vuluu2k/skills/issues"
324
+ target="_blank"
325
+ className="px-8 py-4 rounded-xl font-bold bg-white text-zinc-950 hover:bg-zinc-200 transition-colors shadow-lg shadow-white/10"
326
+ >
327
+ {t('contribute_cta_issue')}
328
+ </a>
329
+ <a
330
+ href="https://github.com/vuluu2k/skills"
331
+ target="_blank"
332
+ className="px-8 py-4 rounded-xl font-bold bg-zinc-800 text-white hover:bg-zinc-700 border border-white/10 transition-colors"
333
+ >
334
+ {t('contribute_cta_build')}
335
+ </a>
336
+ </div>
337
+ </div>
338
+ </section>
273
339
  </main>
274
340
 
275
341
  <footer className="border-t border-white/10 py-12 bg-zinc-950/80 backdrop-blur-sm">
@@ -5,9 +5,19 @@
5
5
  "problem": "The Problem",
6
6
  "solution": "The Solution",
7
7
  "why_devskill": "The power of devskill",
8
- "installation": "Simple Installation",
8
+ "installation": "Installation & Quick Start",
9
9
  "collections": "Skill Collections",
10
- "footer": "Built with ❤️ by vuluu2k. License: MIT"
10
+ "footer": "© 2026 devskill. Empower your AI assistants.",
11
+ "contribute_title": "Build & Contribute",
12
+ "contribute_desc": "Does your team have unique coding standards? You can easily build a completely customized AI brain! If you have any awesome frameworks or best-practices you'd like to share, create an Issue on GitHub so we can add it to devskill.",
13
+ "contribute_cta_issue": "💡 Suggest a Skill",
14
+ "contribute_cta_build": "🛠️ Build Your Own",
15
+ "architecture_title": "Smart Directory Architecture",
16
+ "architecture_desc": "More than just a CLI, devskill provides a clearly stratified Knowledge Base management pipeline.",
17
+ "sources_title": "The Root (sources/)",
18
+ "sources_desc": "The raw data layer. Stores official documentation, template repos, and guidelines (often tracked as git submodules). AI reads this to generate your SKILL.md rules.",
19
+ "vendor_title": "Submodules (vendor/)",
20
+ "vendor_desc": "Your external dependency layer. Automatically syncs community or third-party high-quality skills into your project. Keep them fresh with a single 'npm start sync'."
11
21
  },
12
22
  "Hero": {
13
23
  "badge": "🚀 NEW: devskill v2.0",
@@ -5,9 +5,19 @@
5
5
  "problem": "Vấn đề",
6
6
  "solution": "Giải pháp",
7
7
  "why_devskill": "Sức mạnh thực sự của devskill",
8
- "installation": "Cài đặt đơn giản",
9
- "collections": "Thư viện kỹ năng (Collections)",
10
- "footer": "Thiết kế với ❤️ bởi vuluu2k. Giấy phép: MIT"
8
+ "installation": "Cài đặt & Trải nghiệm",
9
+ "collections": "Bộ sưu tập Skills",
10
+ "footer": "© 2026 devskill. Xây dựng bộ não mạnh mẽ nhất cho AI của bạn.",
11
+ "contribute_title": "Tự Xây Dựng & Đóng Góp",
12
+ "contribute_desc": "Đội ngũ của bạn có quy chuẩn code riêng? Đừng lo, bạn có thể tự build bộ não AI chuyên biệt cho team! Nếu bạn biết một framework hay best-practices nào đỉnh cao, hãy tạo Issue trên GitHub để mình thêm vào devskill nhé.",
13
+ "contribute_cta_issue": "💡 Gợi ý Skills (Tạo Issue)",
14
+ "contribute_cta_build": "🛠️ Tự Build Skills",
15
+ "architecture_title": "Cấu trúc Thư mục Thông minh",
16
+ "architecture_desc": "Không chỉ là một CLI, devskill cung cấp vòng đời quản lý tri thức (Knowledge Base) phân tầng rõ rệt.",
17
+ "sources_title": "Nguồn gốc (sources/)",
18
+ "sources_desc": "Nơi chứa tài liệu gốc, mã nguồn mẫu, official documentation (thường track dưới dạng git submodules). AI sẽ đọc và đọc hiểu tự động để trích xuất các quy chuẩn ra file SKILL.md.",
19
+ "vendor_title": "Cộng đồng (vendor/)",
20
+ "vendor_desc": "Kho lưu trữ các skill chất lượng cao được chia sẻ từ cộng đồng hoặc tổ chức khác. Chỉ cần 1 lệnh 'npm start sync' để cập nhật liên tục mọi thay đổi về máy!"
11
21
  },
12
22
  "Hero": {
13
23
  "badge": "🚀 MỚI: devskill v2.0",
package/meta.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export interface VendorSkillMeta {
2
2
  official?: boolean
3
3
  source: string
4
- skills: Record<string, string> // sourceSkillName -> outputSkillName
4
+ skills?: Record<string, string> // sourceSkillName -> outputSkillName. If omitted, auto-discovers all subdirectories.
5
5
  }
6
6
 
7
7
  /**
@@ -80,6 +80,23 @@ export const vendors: Record<string, VendorSkillMeta> = {
80
80
  turborepo: 'turborepo',
81
81
  },
82
82
  },
83
+ 'next-skills': {
84
+ official: true,
85
+ source: 'https://github.com/vercel-labs/next-skills',
86
+ skills: {
87
+ 'next-best-practices': 'next-best-practices',
88
+ 'next-cache-components': 'next-cache-components',
89
+ 'next-upgrade': 'next-upgrade',
90
+ },
91
+ },
92
+ 'anthropics': {
93
+ official: true,
94
+ source: 'https://github.com/anthropics/skills',
95
+ },
96
+ 'shacdn-ui': {
97
+ official: true,
98
+ source: 'https://github.com/shadcn-ui/ui',
99
+ }
83
100
  }
84
101
 
85
102
  export const manual = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devskill",
3
- "version": "2.0.5",
3
+ "version": "2.0.7",
4
4
  "description": "Equip Cursor, Windsurf, Cline, Antigravity, Claude Code, Codex, GitHub Copilot and other AI Agents with expert programming superpowers via a single interactive prompt.",
5
5
  "homepage": "https://vskill.vercel.app",
6
6
  "repository": {
@@ -18,10 +18,14 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@clack/prompts": "^1.1.0",
21
+ "@inquirer/prompts": "^8.3.2",
22
+ "enquirer": "^2.4.1",
23
+ "prompts": "^2.4.2",
21
24
  "tsx": "^4.0.0"
22
25
  },
23
26
  "devDependencies": {
24
27
  "@types/node": "^20.0.0",
28
+ "@types/prompts": "^2.4.9",
25
29
  "typescript": "^5.5.0"
26
30
  }
27
31
  }
package/scripts/cli.ts CHANGED
@@ -4,6 +4,7 @@ import { dirname, join } from 'node:path'
4
4
  import process from 'node:process'
5
5
  import { fileURLToPath } from 'node:url'
6
6
  import * as p from '@clack/prompts'
7
+ import prompts from 'prompts'
7
8
  import { collections, manual, submodules, vendors } from '../meta.ts'
8
9
 
9
10
  const __dirname = dirname(fileURLToPath(import.meta.url))
@@ -63,7 +64,7 @@ interface Project {
63
64
 
64
65
  interface VendorConfig {
65
66
  source: string
66
- skills: Record<string, string>
67
+ skills?: Record<string, string>
67
68
  }
68
69
 
69
70
  async function initSubmodules(skipPrompt = false) {
@@ -187,17 +188,39 @@ async function syncSubmodules() {
187
188
  continue
188
189
  }
189
190
 
190
- if (!existsSync(vendorSkillsPath)) {
191
- p.log.warn(`No skills directory in vendor/${vendorName}/skills/`)
191
+ let skillsToSync: Record<string, string> = {}
192
+
193
+ if (vendorConfig.skills && Object.keys(vendorConfig.skills).length > 0) {
194
+ if (!existsSync(vendorSkillsPath)) {
195
+ p.log.warn(`No skills directory in vendor/${vendorName}/skills/`)
196
+ continue
197
+ }
198
+ skillsToSync = vendorConfig.skills
199
+ } else {
200
+ const searchPath = existsSync(vendorSkillsPath) ? vendorSkillsPath : vendorPath
201
+ if (existsSync(searchPath)) {
202
+ const entries = readdirSync(searchPath, { withFileTypes: true })
203
+ for (const entry of entries) {
204
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
205
+ skillsToSync[entry.name] = entry.name
206
+ }
207
+ }
208
+ }
209
+ }
210
+
211
+ if (Object.keys(skillsToSync).length === 0) {
212
+ p.log.warn(`No skills found or mapped for vendor: ${vendorName}`)
192
213
  continue
193
214
  }
194
215
 
195
- for (const [sourceSkillName, outputSkillName] of Object.entries(vendorConfig.skills)) {
196
- const sourceSkillPath = join(vendorSkillsPath, sourceSkillName)
216
+ for (const [sourceSkillName, outputSkillName] of Object.entries(skillsToSync)) {
217
+ const sourceSkillPath = existsSync(vendorSkillsPath)
218
+ ? join(vendorSkillsPath, sourceSkillName)
219
+ : join(vendorPath, sourceSkillName)
197
220
  const outputPath = join(root, 'skills', outputSkillName)
198
221
 
199
222
  if (!existsSync(sourceSkillPath)) {
200
- p.log.warn(`Skill not found: vendor/${vendorName}/skills/${sourceSkillName}`)
223
+ p.log.warn(`Skill not found: ${sourceSkillPath}`)
201
224
  continue
202
225
  }
203
226
 
@@ -276,7 +299,7 @@ async function checkUpdates() {
276
299
  const behind = execSafe('git rev-list HEAD..@{u} --count', path)
277
300
  const count = behind ? Number.parseInt(behind) : 0
278
301
  if (count > 0) {
279
- const skillNames = Object.values(vendorConfig.skills).join(', ')
302
+ const skillNames = vendorConfig.skills ? Object.values(vendorConfig.skills).join(', ') : 'all'
280
303
  updates.push({ name: `${name} (${skillNames})`, type: 'vendor', behind: count })
281
304
  }
282
305
  }
@@ -298,8 +321,10 @@ function getExpectedSkillNames(): Set<string> {
298
321
  expected.add(name)
299
322
  for (const config of Object.values(vendors)) {
300
323
  const vendorConfig = config as VendorConfig
301
- for (const outputName of Object.values(vendorConfig.skills))
302
- expected.add(outputName)
324
+ if (vendorConfig.skills) {
325
+ for (const outputName of Object.values(vendorConfig.skills))
326
+ expected.add(outputName)
327
+ }
303
328
  }
304
329
  for (const name of manual)
305
330
  expected.add(name)
@@ -364,7 +389,7 @@ async function cleanup(skipPrompt = false) {
364
389
  }
365
390
  }
366
391
 
367
- async function installSkills() {
392
+ async function installSkills(targetCollectionNames: string[] = []) {
368
393
  const spinner = p.spinner()
369
394
 
370
395
  const allCollections: Record<string, string[]> = { ...collections }
@@ -378,23 +403,33 @@ async function installSkills() {
378
403
  return
379
404
  }
380
405
 
381
- const selectedCollectionNames = await p.multiselect({
382
- message: 'Select collections to install (Space to select, Enter to confirm)',
383
- options: Object.keys(allCollections).map(name => ({
384
- value: name,
385
- label: name,
386
- hint: `${allCollections[name].length} skills`
387
- }))
388
- })
406
+ let selectedCollectionNames: string[] = []
389
407
 
390
- if (p.isCancel(selectedCollectionNames)) {
391
- p.cancel('Cancelled')
392
- return
393
- }
408
+ if (targetCollectionNames.length > 0) {
409
+ const invalid = targetCollectionNames.filter(name => !allCollections[name])
410
+ if (invalid.length > 0) {
411
+ p.log.error(`Collections not found: ${invalid.join(', ')}`)
412
+ return
413
+ }
414
+ selectedCollectionNames = targetCollectionNames
415
+ } else {
416
+ const response = await prompts({
417
+ type: 'autocompleteMultiselect',
418
+ name: 'selected',
419
+ message: 'Search and select collections to install (Space to select, Enter to confirm)',
420
+ choices: Object.keys(allCollections).map(name => ({
421
+ title: name,
422
+ value: name,
423
+ description: `${allCollections[name].length} skills`
424
+ }))
425
+ })
394
426
 
395
- if (selectedCollectionNames.length === 0) {
396
- p.log.warn('No collections selected')
397
- return
427
+ if (!response.selected || response.selected.length === 0) {
428
+ p.log.warn('No collections selected (or canceled)')
429
+ return
430
+ }
431
+
432
+ selectedCollectionNames = response.selected
398
433
  }
399
434
 
400
435
  const targetProject = await p.text({
@@ -492,7 +527,7 @@ async function installSkills() {
492
527
  spinner.stop(`Installed ${successCount}/${selectedSkills.length} skills to target project`)
493
528
  }
494
529
 
495
- async function installSpecificSkills() {
530
+ async function installSpecificSkills(targetSkillNames: string[] = []) {
496
531
  const spinner = p.spinner()
497
532
 
498
533
  const allSkills = getExistingSkillNames()
@@ -502,22 +537,32 @@ async function installSpecificSkills() {
502
537
  return
503
538
  }
504
539
 
505
- const selectedSkills = await p.multiselect({
506
- message: 'Select specific skills to install (Space to select, Enter to confirm)',
507
- options: allSkills.map(name => ({
508
- value: name,
509
- label: name
510
- }))
511
- })
540
+ let selectedSkills: string[] = []
512
541
 
513
- if (p.isCancel(selectedSkills)) {
514
- p.cancel('Cancelled')
515
- return
516
- }
542
+ if (targetSkillNames.length > 0) {
543
+ const invalid = targetSkillNames.filter(name => !allSkills.includes(name))
544
+ if (invalid.length > 0) {
545
+ p.log.error(`Skills not found: ${invalid.join(', ')}`)
546
+ return
547
+ }
548
+ selectedSkills = targetSkillNames
549
+ } else {
550
+ const response = await prompts({
551
+ type: 'autocompleteMultiselect',
552
+ name: 'selected',
553
+ message: 'Search and select individual skills to install (Space to select, Enter to confirm)',
554
+ choices: allSkills.map(name => ({
555
+ title: name,
556
+ value: name
557
+ }))
558
+ })
517
559
 
518
- if (selectedSkills.length === 0) {
519
- p.log.warn('No skills selected')
520
- return
560
+ if (!response.selected || response.selected.length === 0) {
561
+ p.log.warn('No skills selected (or canceled)')
562
+ return
563
+ }
564
+
565
+ selectedSkills = response.selected
521
566
  }
522
567
 
523
568
  const targetProject = await p.text({
@@ -612,10 +657,88 @@ async function installSpecificSkills() {
612
657
  spinner.stop(`Installed ${successCount}/${selectedSkills.length} skills to target project`)
613
658
  }
614
659
 
660
+ async function findSkills(query?: string) {
661
+ const allSkills = getExistingSkillNames()
662
+ p.intro(`Search results for ${query ? `"${query}"` : 'all'}`)
663
+
664
+ const allCollections: Record<string, string[]> = { ...collections }
665
+ for (const [vendorName, config] of Object.entries(vendors)) {
666
+ const vendorConfig = config as VendorConfig
667
+ let vendorSkills: string[] = []
668
+
669
+ if (vendorConfig.skills && Object.keys(vendorConfig.skills).length > 0) {
670
+ vendorSkills = Object.values(vendorConfig.skills)
671
+ } else {
672
+ const vendorPath = join(root, 'vendor', vendorName)
673
+ const vendorSkillsPath = join(vendorPath, 'skills')
674
+ const searchPath = existsSync(vendorSkillsPath) ? vendorSkillsPath : (existsSync(vendorPath) ? vendorPath : null)
675
+
676
+ if (searchPath) {
677
+ const entries = readdirSync(searchPath, { withFileTypes: true })
678
+ for (const entry of entries) {
679
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
680
+ vendorSkills.push(entry.name)
681
+ }
682
+ }
683
+ }
684
+ }
685
+
686
+ if (vendorSkills.length > 0) {
687
+ allCollections[vendorName] = vendorSkills
688
+ }
689
+ }
690
+
691
+ let q = ''
692
+ if (!query) {
693
+ const userInput = await p.text({
694
+ message: 'Enter keyword to search (leave empty to list all):',
695
+ placeholder: 'e.g. vue'
696
+ })
697
+
698
+ if (p.isCancel(userInput)) {
699
+ p.cancel('Cancelled')
700
+ return
701
+ }
702
+ q = (userInput as string).toLowerCase()
703
+ } else {
704
+ q = query.toLowerCase()
705
+ }
706
+
707
+ const matchedCollections = Object.keys(allCollections).filter(c => c.toLowerCase().includes(q))
708
+ if (matchedCollections.length > 0) {
709
+ p.log.success('📚 Collections found:')
710
+ for (const c of matchedCollections) {
711
+ p.log.message(` - ${c} (${allCollections[c].length} skills) -> \`npx devskill install ${c}\``)
712
+ }
713
+ } else if (q) {
714
+ p.log.warn('No collections found matching query')
715
+ }
716
+
717
+ const matchedSkills = allSkills.filter(s => s.toLowerCase().includes(q))
718
+ if (matchedSkills.length > 0) {
719
+ p.log.success('🛠️ Individual Skills found:')
720
+ for (const s of matchedSkills) {
721
+ p.log.message(` - ${s} -> \`npx devskill add ${s}\``)
722
+ }
723
+ } else if (q) {
724
+ p.log.warn('No individual skills found matching query')
725
+ }
726
+ }
727
+
615
728
  async function main() {
616
729
  const args = process.argv.slice(2)
617
730
  const skipPrompt = args.includes('-y') || args.includes('--yes')
618
- const command = args.find(arg => !arg.startsWith('-'))
731
+
732
+ const positionalArgs = args.filter(arg => !arg.startsWith('-'))
733
+ const command = positionalArgs[0]
734
+ const targetNames = positionalArgs.slice(1)
735
+ const targetName = targetNames[0] // for finding
736
+
737
+ if (command === 'find') {
738
+ await findSkills(targetName)
739
+ p.outro('Done')
740
+ return
741
+ }
619
742
 
620
743
  if (command === 'init') {
621
744
  p.intro('Skills Manager - Init')
@@ -646,22 +769,24 @@ async function main() {
646
769
  }
647
770
 
648
771
  if (command === 'install') {
649
- p.intro('Skills Manager - Install Groups')
650
- await installSkills()
772
+ const namesJoined = targetNames.length > 0 ? ` (${targetNames.join(', ')})` : ''
773
+ p.intro(`Skills Manager - Install Groups${namesJoined}`)
774
+ await installSkills(targetNames)
651
775
  p.outro('Done')
652
776
  return
653
777
  }
654
778
 
655
779
  if (command === 'add') {
656
- p.intro('Skills Manager - Add Specific Skills')
657
- await installSpecificSkills()
780
+ const namesJoined = targetNames.length > 0 ? ` (${targetNames.join(', ')})` : ''
781
+ p.intro(`Skills Manager - Add Specific Skills${namesJoined}`)
782
+ await installSpecificSkills(targetNames)
658
783
  p.outro('Done')
659
784
  return
660
785
  }
661
786
 
662
787
  if (skipPrompt) {
663
788
  p.log.error('Command required when using -y flag')
664
- p.log.info('Available commands: install, add, init, sync, check, cleanup')
789
+ p.log.info('Available commands: find, install, add, init, sync, check, cleanup')
665
790
  process.exit(1)
666
791
  }
667
792
 
@@ -672,6 +797,7 @@ async function main() {
672
797
  options: [
673
798
  { value: 'install', label: 'Install collections', hint: 'Copy entire skill collections to a local project' },
674
799
  { value: 'add', label: 'Add specific skills', hint: 'Choose individual skills to add to your project' },
800
+ { value: 'find', label: 'Find a skill or collection', hint: 'Search by keyword' },
675
801
  { value: 'sync', label: 'Sync submodules', hint: 'Pull latest and sync Type 2 skills' },
676
802
  { value: 'init', label: 'Init submodules', hint: 'Add new submodules from meta.ts' },
677
803
  { value: 'check', label: 'Check updates', hint: 'See available updates' },
@@ -691,6 +817,9 @@ async function main() {
691
817
  case 'add':
692
818
  await installSpecificSkills()
693
819
  break
820
+ case 'find':
821
+ await findSkills()
822
+ break
694
823
  case 'init':
695
824
  await initSubmodules()
696
825
  break