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.
- package/landing/app/[locale]/page.tsx +68 -2
- package/landing/messages/en.json +12 -2
- package/landing/messages/vi.json +13 -3
- package/meta.ts +18 -1
- package/package.json +5 -1
- package/scripts/cli.ts +175 -46
- package/skills/algorithmic-art/LICENSE.txt +202 -0
- package/skills/algorithmic-art/SKILL.md +405 -0
- package/skills/algorithmic-art/SYNC.md +5 -0
- package/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/algorithmic-art/templates/viewer.html +599 -0
- package/skills/brand-guidelines/LICENSE.txt +202 -0
- package/skills/brand-guidelines/SKILL.md +73 -0
- package/skills/brand-guidelines/SYNC.md +5 -0
- package/skills/canvas-design/LICENSE.txt +202 -0
- package/skills/canvas-design/SKILL.md +130 -0
- package/skills/canvas-design/SYNC.md +5 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/claude-api/LICENSE.txt +202 -0
- package/skills/claude-api/SKILL.md +246 -0
- package/skills/claude-api/SYNC.md +5 -0
- package/skills/claude-api/csharp/claude-api.md +400 -0
- package/skills/claude-api/curl/examples.md +193 -0
- package/skills/claude-api/go/claude-api.md +404 -0
- package/skills/claude-api/java/claude-api.md +430 -0
- package/skills/claude-api/php/claude-api.md +241 -0
- package/skills/claude-api/python/agent-sdk/README.md +345 -0
- package/skills/claude-api/python/agent-sdk/patterns.md +359 -0
- package/skills/claude-api/python/claude-api/README.md +410 -0
- package/skills/claude-api/python/claude-api/batches.md +185 -0
- package/skills/claude-api/python/claude-api/files-api.md +165 -0
- package/skills/claude-api/python/claude-api/streaming.md +162 -0
- package/skills/claude-api/python/claude-api/tool-use.md +590 -0
- package/skills/claude-api/ruby/claude-api.md +92 -0
- package/skills/claude-api/shared/error-codes.md +206 -0
- package/skills/claude-api/shared/live-sources.md +121 -0
- package/skills/claude-api/shared/models.md +119 -0
- package/skills/claude-api/shared/tool-use-concepts.md +305 -0
- package/skills/claude-api/typescript/agent-sdk/README.md +296 -0
- package/skills/claude-api/typescript/agent-sdk/patterns.md +209 -0
- package/skills/claude-api/typescript/claude-api/README.md +321 -0
- package/skills/claude-api/typescript/claude-api/batches.md +106 -0
- package/skills/claude-api/typescript/claude-api/files-api.md +98 -0
- package/skills/claude-api/typescript/claude-api/streaming.md +178 -0
- package/skills/claude-api/typescript/claude-api/tool-use.md +527 -0
- package/skills/doc-coauthoring/SKILL.md +375 -0
- package/skills/doc-coauthoring/SYNC.md +5 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +590 -0
- package/skills/docx/SYNC.md +5 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/accept_changes.py +135 -0
- package/skills/docx/scripts/comment.py +318 -0
- package/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/skills/docx/scripts/office/pack.py +159 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/scripts/office/soffice.py +183 -0
- package/skills/docx/scripts/office/unpack.py +132 -0
- package/skills/docx/scripts/office/validate.py +111 -0
- package/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/skills/docx/scripts/office/validators/base.py +847 -0
- package/skills/docx/scripts/office/validators/docx.py +446 -0
- package/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/frontend-design/SYNC.md +5 -0
- package/skills/internal-comms/LICENSE.txt +202 -0
- package/skills/internal-comms/SKILL.md +32 -0
- package/skills/internal-comms/SYNC.md +5 -0
- package/skills/internal-comms/examples/3p-updates.md +47 -0
- package/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/internal-comms/examples/faq-answers.md +30 -0
- package/skills/internal-comms/examples/general-comms.md +16 -0
- package/skills/mcp-builder/LICENSE.txt +202 -0
- package/skills/mcp-builder/SKILL.md +236 -0
- package/skills/mcp-builder/SYNC.md +5 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/next-best-practices/SKILL.md +153 -0
- package/skills/next-best-practices/SYNC.md +5 -0
- package/skills/next-best-practices/async-patterns.md +87 -0
- package/skills/next-best-practices/bundling.md +180 -0
- package/skills/next-best-practices/data-patterns.md +297 -0
- package/skills/next-best-practices/debug-tricks.md +105 -0
- package/skills/next-best-practices/directives.md +73 -0
- package/skills/next-best-practices/error-handling.md +227 -0
- package/skills/next-best-practices/file-conventions.md +140 -0
- package/skills/next-best-practices/font.md +245 -0
- package/skills/next-best-practices/functions.md +108 -0
- package/skills/next-best-practices/hydration-error.md +91 -0
- package/skills/next-best-practices/image.md +173 -0
- package/skills/next-best-practices/metadata.md +301 -0
- package/skills/next-best-practices/parallel-routes.md +287 -0
- package/skills/next-best-practices/route-handlers.md +146 -0
- package/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/skills/next-best-practices/runtime-selection.md +39 -0
- package/skills/next-best-practices/scripts.md +141 -0
- package/skills/next-best-practices/self-hosting.md +371 -0
- package/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/skills/next-cache-components/SKILL.md +411 -0
- package/skills/next-cache-components/SYNC.md +5 -0
- package/skills/next-upgrade/SKILL.md +50 -0
- package/skills/next-upgrade/SYNC.md +5 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +314 -0
- package/skills/pdf/SYNC.md +5 -0
- package/skills/pdf/forms.md +294 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/skills/pdf/scripts/create_validation_image.py +37 -0
- package/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/skills/pptx/LICENSE.txt +30 -0
- package/skills/pptx/SKILL.md +232 -0
- package/skills/pptx/SYNC.md +5 -0
- package/skills/pptx/editing.md +205 -0
- package/skills/pptx/pptxgenjs.md +420 -0
- package/skills/pptx/scripts/__init__.py +0 -0
- package/skills/pptx/scripts/add_slide.py +195 -0
- package/skills/pptx/scripts/clean.py +286 -0
- package/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/skills/pptx/scripts/office/pack.py +159 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/pptx/scripts/office/soffice.py +183 -0
- package/skills/pptx/scripts/office/unpack.py +132 -0
- package/skills/pptx/scripts/office/validate.py +111 -0
- package/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/skills/pptx/scripts/office/validators/base.py +847 -0
- package/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/skills/pptx/scripts/thumbnail.py +289 -0
- package/skills/shadcn/LICENSE.md +21 -0
- package/skills/shadcn/SKILL.md +242 -0
- package/skills/shadcn/SYNC.md +5 -0
- package/skills/shadcn/agents/openai.yml +5 -0
- package/skills/shadcn/assets/shadcn-small.png +0 -0
- package/skills/shadcn/assets/shadcn.png +0 -0
- package/skills/shadcn/cli.md +257 -0
- package/skills/shadcn/customization.md +202 -0
- package/skills/shadcn/evals/evals.json +47 -0
- package/skills/shadcn/mcp.md +94 -0
- package/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/skills/shadcn/rules/composition.md +195 -0
- package/skills/shadcn/rules/forms.md +192 -0
- package/skills/shadcn/rules/icons.md +101 -0
- package/skills/shadcn/rules/styling.md +162 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/SYNC.md +5 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +247 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/skills/slack-gif-creator/SKILL.md +254 -0
- package/skills/slack-gif-creator/SYNC.md +5 -0
- package/skills/slack-gif-creator/core/easing.py +234 -0
- package/skills/slack-gif-creator/core/frame_composer.py +176 -0
- package/skills/slack-gif-creator/core/gif_builder.py +269 -0
- package/skills/slack-gif-creator/core/validators.py +136 -0
- package/skills/slack-gif-creator/requirements.txt +4 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/SYNC.md +5 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/vue-best-practices/SYNC.md +1 -1
- package/skills/vue-jsx-best-practices/SYNC.md +1 -1
- package/skills/vue-options-api-best-practices/SYNC.md +1 -1
- package/skills/vue-pinia-best-practices/SYNC.md +1 -1
- package/skills/vue-router-best-practices/SYNC.md +1 -1
- package/skills/vue-testing-best-practices/SYNC.md +1 -1
- package/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/web-artifacts-builder/SKILL.md +74 -0
- package/skills/web-artifacts-builder/SYNC.md +5 -0
- package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/SYNC.md +5 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +292 -0
- package/skills/xlsx/SYNC.md +5 -0
- package/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/skills/xlsx/scripts/office/pack.py +159 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/xlsx/scripts/office/soffice.py +183 -0
- package/skills/xlsx/scripts/office/unpack.py +132 -0
- package/skills/xlsx/scripts/office/validate.py +111 -0
- package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- 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-
|
|
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-
|
|
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">
|
package/landing/messages/en.json
CHANGED
|
@@ -5,9 +5,19 @@
|
|
|
5
5
|
"problem": "The Problem",
|
|
6
6
|
"solution": "The Solution",
|
|
7
7
|
"why_devskill": "The power of devskill",
|
|
8
|
-
"installation": "
|
|
8
|
+
"installation": "Installation & Quick Start",
|
|
9
9
|
"collections": "Skill Collections",
|
|
10
|
-
"footer": "
|
|
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",
|
package/landing/messages/vi.json
CHANGED
|
@@ -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
|
|
9
|
-
"collections": "
|
|
10
|
-
"footer": "
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
191
|
-
|
|
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(
|
|
196
|
-
const sourceSkillPath =
|
|
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:
|
|
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
|
-
|
|
302
|
-
|
|
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
|
-
|
|
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 (
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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
|
-
|
|
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 (
|
|
514
|
-
|
|
515
|
-
|
|
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
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
-
|
|
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
|
-
|
|
650
|
-
|
|
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
|
-
|
|
657
|
-
|
|
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
|