claudecode-omc 5.2.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/manifest.json +2 -1
- package/bundled/upstream/anthropic-skills/skills/algorithmic-art/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/algorithmic-art/SKILL.md +405 -0
- package/bundled/upstream/anthropic-skills/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/bundled/upstream/anthropic-skills/skills/algorithmic-art/templates/viewer.html +599 -0
- package/bundled/upstream/anthropic-skills/skills/brand-guidelines/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/brand-guidelines/SKILL.md +73 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/SKILL.md +130 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/bundled/upstream/anthropic-skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/SKILL.md +262 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/csharp/claude-api.md +402 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/curl/examples.md +216 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/go/claude-api.md +421 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/java/claude-api.md +432 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/php/claude-api.md +375 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/agent-sdk/README.md +355 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/agent-sdk/patterns.md +359 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/README.md +420 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/batches.md +185 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/files-api.md +165 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/streaming.md +162 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/python/claude-api/tool-use.md +590 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/ruby/claude-api.md +113 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/error-codes.md +206 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/live-sources.md +121 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/models.md +119 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/prompt-caching.md +128 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/shared/tool-use-concepts.md +305 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/agent-sdk/README.md +297 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/agent-sdk/patterns.md +209 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/README.md +333 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/batches.md +106 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/files-api.md +98 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/streaming.md +178 -0
- package/bundled/upstream/anthropic-skills/skills/claude-api/typescript/claude-api/tool-use.md +527 -0
- package/bundled/upstream/anthropic-skills/skills/doc-coauthoring/SKILL.md +375 -0
- package/bundled/upstream/anthropic-skills/skills/docx/LICENSE.txt +30 -0
- package/bundled/upstream/anthropic-skills/skills/docx/SKILL.md +590 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/__init__.py +1 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/accept_changes.py +135 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/comment.py +318 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/pack.py +159 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/soffice.py +183 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/unpack.py +132 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/validate.py +111 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/validators/base.py +847 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/validators/docx.py +446 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/templates/comments.xml +3 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/bundled/upstream/anthropic-skills/skills/docx/scripts/templates/people.xml +3 -0
- package/bundled/upstream/anthropic-skills/skills/frontend-design/LICENSE.txt +177 -0
- package/bundled/upstream/anthropic-skills/skills/frontend-design/SKILL.md +42 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/SKILL.md +32 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/examples/3p-updates.md +47 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/examples/faq-answers.md +30 -0
- package/bundled/upstream/anthropic-skills/skills/internal-comms/examples/general-comms.md +16 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/SKILL.md +236 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/reference/evaluation.md +602 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/scripts/connections.py +151 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/bundled/upstream/anthropic-skills/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/LICENSE.txt +30 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/SKILL.md +314 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/forms.md +294 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/reference.md +612 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/create_validation_image.py +37 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/bundled/upstream/anthropic-skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/LICENSE.txt +30 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/SKILL.md +232 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/editing.md +205 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/pptxgenjs.md +420 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/__init__.py +0 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/add_slide.py +195 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/clean.py +286 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/pack.py +159 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/soffice.py +183 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/unpack.py +132 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/validate.py +111 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/validators/base.py +847 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/bundled/upstream/anthropic-skills/skills/pptx/scripts/thumbnail.py +289 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/SKILL.md +485 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/agents/analyzer.md +274 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/agents/comparator.md +202 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/agents/grader.md +223 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/assets/eval_review.html +146 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/references/schemas.md +430 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/__init__.py +0 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/generate_report.py +326 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/improve_description.py +247 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/package_skill.py +136 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/run_eval.py +310 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/run_loop.py +328 -0
- package/bundled/upstream/anthropic-skills/skills/skill-creator/scripts/utils.py +47 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/SKILL.md +254 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/core/easing.py +234 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/core/frame_composer.py +176 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/core/gif_builder.py +269 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/core/validators.py +136 -0
- package/bundled/upstream/anthropic-skills/skills/slack-gif-creator/requirements.txt +4 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/SKILL.md +59 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/theme-showcase.pdf +0 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/desert-rose.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/golden-hour.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/bundled/upstream/anthropic-skills/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/web-artifacts-builder/SKILL.md +74 -0
- package/bundled/upstream/anthropic-skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/bundled/upstream/anthropic-skills/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/bundled/upstream/anthropic-skills/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/LICENSE.txt +202 -0
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/SKILL.md +96 -0
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/examples/console_logging.py +35 -0
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/bundled/upstream/anthropic-skills/skills/webapp-testing/scripts/with_server.py +106 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/LICENSE.txt +30 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/SKILL.md +292 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/pack.py +159 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/soffice.py +183 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/unpack.py +132 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/validate.py +111 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/bundled/upstream/anthropic-skills/skills/xlsx/scripts/recalc.py +184 -0
- package/bundled/upstream/anthropic-skills/spec/agent-skills-spec.md +3 -0
- package/bundled/upstream/anthropic-skills/template/SKILL.md +6 -0
- package/package.json +1 -1
- package/src/cli/artifact.js +2 -1
- package/src/cli/index.js +6 -0
- package/src/cli/setup.js +3 -0
- package/src/cli/skill.js +271 -0
- package/src/config/sources.js +12 -0
- package/src/merge/base-merger.js +28 -6
- package/src/utils/overlap.js +300 -0
- package/src/utils/quality.js +286 -32
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { evaluateSkillQuality } = require('./quality');
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Text similarity
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Tokenise text into meaningful words (lowercase, >2 chars, no stop-words).
|
|
13
|
+
*/
|
|
14
|
+
function tokenise(text) {
|
|
15
|
+
const stop = new Set([
|
|
16
|
+
'the', 'and', 'for', 'with', 'this', 'that', 'from', 'are', 'was',
|
|
17
|
+
'will', 'can', 'has', 'have', 'been', 'not', 'but', 'all', 'its',
|
|
18
|
+
'use', 'used', 'using', 'when', 'how', 'what', 'who', 'which',
|
|
19
|
+
'you', 'your', 'they', 'their', 'more', 'also', 'into', 'than',
|
|
20
|
+
'each', 'other', 'about', 'should', 'would', 'could',
|
|
21
|
+
]);
|
|
22
|
+
return text.toLowerCase()
|
|
23
|
+
.replace(/[^a-z0-9-]/g, ' ')
|
|
24
|
+
.split(/\s+/)
|
|
25
|
+
.filter(w => w.length > 2 && !stop.has(w));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Jaccard similarity between two token arrays.
|
|
30
|
+
*/
|
|
31
|
+
function jaccard(a, b) {
|
|
32
|
+
const setA = new Set(a);
|
|
33
|
+
const setB = new Set(b);
|
|
34
|
+
if (setA.size === 0 || setB.size === 0) return 0;
|
|
35
|
+
const intersection = new Set([...setA].filter(x => setB.has(x)));
|
|
36
|
+
const union = new Set([...setA, ...setB]);
|
|
37
|
+
return intersection.size / union.size;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Weighted cosine similarity using term frequency.
|
|
42
|
+
*/
|
|
43
|
+
function cosineTF(a, b) {
|
|
44
|
+
const freqA = {};
|
|
45
|
+
const freqB = {};
|
|
46
|
+
for (const w of a) freqA[w] = (freqA[w] || 0) + 1;
|
|
47
|
+
for (const w of b) freqB[w] = (freqB[w] || 0) + 1;
|
|
48
|
+
|
|
49
|
+
const allWords = new Set([...Object.keys(freqA), ...Object.keys(freqB)]);
|
|
50
|
+
let dot = 0, magA = 0, magB = 0;
|
|
51
|
+
for (const w of allWords) {
|
|
52
|
+
const va = freqA[w] || 0;
|
|
53
|
+
const vb = freqB[w] || 0;
|
|
54
|
+
dot += va * vb;
|
|
55
|
+
magA += va * va;
|
|
56
|
+
magB += vb * vb;
|
|
57
|
+
}
|
|
58
|
+
if (magA === 0 || magB === 0) return 0;
|
|
59
|
+
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Domain classification
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
|
|
66
|
+
const DOMAIN_KEYWORDS = {
|
|
67
|
+
debugging: ['debug', 'trace', 'root-cause', 'investigation', 'diagnose', 'stack-trace', 'breakpoint', 'bisect'],
|
|
68
|
+
testing: ['tdd', 'bdd', 'coverage', 'red-green', 'test-driven', 'playwright', 'vitest', 'jest', 'assertion'],
|
|
69
|
+
planning: ['plan', 'architect', 'requirement', 'roadmap', 'strategy', 'specification', 'decompose', 'scope'],
|
|
70
|
+
execution: ['autopilot', 'parallel', 'worker', 'dispatch', 'pipeline', 'orchestrat', 'ultrawork', 'ralph'],
|
|
71
|
+
review: ['code-review', 'critique', 'slop', 'cleanup', 'refactor', 'lint', 'approve'],
|
|
72
|
+
verification: ['verify', 'validate', 'evidence', 'completion', 'passing', 'ultraqa'],
|
|
73
|
+
research: ['research', 'multi-model', 'codex', 'gemini', 'deepsearch', 'documentation'],
|
|
74
|
+
git: ['worktree', 'rebase', 'cherry-pick', 'pull-request', 'release-branch'],
|
|
75
|
+
skilldev: ['skill-creator', 'skill-tester', 'skill-quality', 'skill-debug', 'writing-skills', 'trigger-rate', 'skill-md', 'frontmatter'],
|
|
76
|
+
brainstorm: ['brainstorm', 'interview', 'ideate', 'crystalliz', 'deep-interview', 'ambiguity'],
|
|
77
|
+
setup: ['install', 'setup', 'configure', 'mcp-setup', 'omc-setup', 'doctor', 'notification'],
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Classify a skill into domains based on its description + body keywords.
|
|
82
|
+
* Returns array of { domain, strength } sorted by strength descending.
|
|
83
|
+
*/
|
|
84
|
+
function classifyDomains(tokens) {
|
|
85
|
+
const scores = {};
|
|
86
|
+
const tokenSet = new Set(tokens);
|
|
87
|
+
for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
88
|
+
let hits = 0;
|
|
89
|
+
for (const kw of keywords) {
|
|
90
|
+
// Exact match or compound keyword match (e.g. "skill-creator" in tokens)
|
|
91
|
+
if (tokenSet.has(kw)) {
|
|
92
|
+
hits += 2;
|
|
93
|
+
} else {
|
|
94
|
+
// Partial: check if any token starts with the keyword
|
|
95
|
+
for (const tok of tokens) {
|
|
96
|
+
if (tok.startsWith(kw) && kw.length >= 4) { hits++; break; }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (hits > 0) scores[domain] = hits;
|
|
101
|
+
}
|
|
102
|
+
return Object.entries(scores)
|
|
103
|
+
.map(([domain, strength]) => ({ domain, strength }))
|
|
104
|
+
.sort((a, b) => b.strength - a.strength);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Overlap detection
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Load skill content tokens for overlap analysis.
|
|
113
|
+
*/
|
|
114
|
+
function loadSkillTokens(skillPath) {
|
|
115
|
+
const file = path.join(skillPath, 'SKILL.md');
|
|
116
|
+
if (!fs.existsSync(file)) return [];
|
|
117
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
118
|
+
return tokenise(content);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Detect functional overlaps across multiple skill sources.
|
|
123
|
+
*
|
|
124
|
+
* @param {Array} sources — [{ name, items: [{ name, path, metadata }] }]
|
|
125
|
+
* @param {object} options — { threshold: 0.3 }
|
|
126
|
+
* @returns {Array} overlap groups
|
|
127
|
+
*/
|
|
128
|
+
function detectOverlaps(sources, options = {}) {
|
|
129
|
+
const threshold = options.threshold || 0.3;
|
|
130
|
+
|
|
131
|
+
// Flatten all skills with source info and pre-compute tokens/domains
|
|
132
|
+
const allSkills = [];
|
|
133
|
+
for (const source of sources) {
|
|
134
|
+
for (const item of (source.items || source.skills || [])) {
|
|
135
|
+
const tokens = loadSkillTokens(item.path);
|
|
136
|
+
const domains = classifyDomains(tokens);
|
|
137
|
+
allSkills.push({
|
|
138
|
+
...item,
|
|
139
|
+
sourceName: source.name,
|
|
140
|
+
tokens,
|
|
141
|
+
domains,
|
|
142
|
+
descTokens: tokenise(item.metadata?.description || ''),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Find pairs with high similarity (cross-source only)
|
|
148
|
+
const pairs = [];
|
|
149
|
+
for (let i = 0; i < allSkills.length; i++) {
|
|
150
|
+
for (let j = i + 1; j < allSkills.length; j++) {
|
|
151
|
+
const a = allSkills[i];
|
|
152
|
+
const b = allSkills[j];
|
|
153
|
+
|
|
154
|
+
// Skip same-source pairs
|
|
155
|
+
if (a.sourceName === b.sourceName) continue;
|
|
156
|
+
|
|
157
|
+
// Description similarity
|
|
158
|
+
const descSim = jaccard(a.descTokens, b.descTokens);
|
|
159
|
+
|
|
160
|
+
// Body content similarity
|
|
161
|
+
const bodySim = cosineTF(a.tokens, b.tokens);
|
|
162
|
+
|
|
163
|
+
// Domain overlap
|
|
164
|
+
const aDomains = new Set(a.domains.slice(0, 3).map(d => d.domain));
|
|
165
|
+
const bDomains = new Set(b.domains.slice(0, 3).map(d => d.domain));
|
|
166
|
+
const domainIntersect = [...aDomains].filter(d => bDomains.has(d)).length;
|
|
167
|
+
const domainUnion = new Set([...aDomains, ...bDomains]).size;
|
|
168
|
+
const domainSim = domainUnion > 0 ? domainIntersect / domainUnion : 0;
|
|
169
|
+
|
|
170
|
+
// Combined similarity (weighted — description is the skill's identity)
|
|
171
|
+
const combined = descSim * 0.4 + bodySim * 0.3 + domainSim * 0.3;
|
|
172
|
+
|
|
173
|
+
if (combined >= threshold) {
|
|
174
|
+
pairs.push({ a, b, descSim, bodySim, domainSim, combined });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Cluster pairs into groups using union-find
|
|
180
|
+
const parent = {};
|
|
181
|
+
function find(x) {
|
|
182
|
+
if (!parent[x]) parent[x] = x;
|
|
183
|
+
if (parent[x] !== x) parent[x] = find(parent[x]);
|
|
184
|
+
return parent[x];
|
|
185
|
+
}
|
|
186
|
+
function union(x, y) {
|
|
187
|
+
parent[find(x)] = find(y);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
for (const pair of pairs) {
|
|
191
|
+
const keyA = `${pair.a.sourceName}:${pair.a.name}`;
|
|
192
|
+
const keyB = `${pair.b.sourceName}:${pair.b.name}`;
|
|
193
|
+
union(keyA, keyB);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Build groups
|
|
197
|
+
const groups = {};
|
|
198
|
+
const skillMap = {};
|
|
199
|
+
for (const skill of allSkills) {
|
|
200
|
+
const key = `${skill.sourceName}:${skill.name}`;
|
|
201
|
+
skillMap[key] = skill;
|
|
202
|
+
}
|
|
203
|
+
for (const pair of pairs) {
|
|
204
|
+
const keyA = `${pair.a.sourceName}:${pair.a.name}`;
|
|
205
|
+
const keyB = `${pair.b.sourceName}:${pair.b.name}`;
|
|
206
|
+
const root = find(keyA);
|
|
207
|
+
if (!groups[root]) groups[root] = new Set();
|
|
208
|
+
groups[root].add(keyA);
|
|
209
|
+
groups[root].add(keyB);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Convert groups to output format with quality scores
|
|
213
|
+
const result = [];
|
|
214
|
+
for (const members of Object.values(groups)) {
|
|
215
|
+
const skills = [...members].map(key => {
|
|
216
|
+
const skill = skillMap[key];
|
|
217
|
+
const quality = evaluateSkillQuality(skill);
|
|
218
|
+
return {
|
|
219
|
+
name: skill.name,
|
|
220
|
+
source: skill.sourceName,
|
|
221
|
+
description: skill.metadata?.description || '',
|
|
222
|
+
domains: skill.domains.slice(0, 3).map(d => d.domain),
|
|
223
|
+
quality,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Sort by quality score descending
|
|
228
|
+
skills.sort((a, b) => b.quality.score - a.quality.score);
|
|
229
|
+
|
|
230
|
+
// Find the best similarity pair for the group label
|
|
231
|
+
const groupPairs = pairs.filter(p => {
|
|
232
|
+
const keyA = `${p.a.sourceName}:${p.a.name}`;
|
|
233
|
+
const keyB = `${p.b.sourceName}:${p.b.name}`;
|
|
234
|
+
return members.has(keyA) && members.has(keyB);
|
|
235
|
+
});
|
|
236
|
+
const maxSim = groupPairs.length > 0
|
|
237
|
+
? Math.max(...groupPairs.map(p => p.combined))
|
|
238
|
+
: 0;
|
|
239
|
+
|
|
240
|
+
// Primary domain for the group
|
|
241
|
+
const domainCounts = {};
|
|
242
|
+
for (const s of skills) {
|
|
243
|
+
for (const d of s.domains) {
|
|
244
|
+
domainCounts[d] = (domainCounts[d] || 0) + 1;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const primaryDomain = Object.entries(domainCounts)
|
|
248
|
+
.sort((a, b) => b[1] - a[1])[0]?.[0] || 'unknown';
|
|
249
|
+
|
|
250
|
+
result.push({
|
|
251
|
+
domain: primaryDomain,
|
|
252
|
+
similarity: Math.round(maxSim * 100),
|
|
253
|
+
skills,
|
|
254
|
+
winner: skills[0],
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Sort groups by similarity descending
|
|
259
|
+
result.sort((a, b) => b.similarity - a.similarity);
|
|
260
|
+
return result;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Generate merge-config preference recommendations from overlap analysis.
|
|
265
|
+
*
|
|
266
|
+
* Only produces recommendations for exact-name conflicts where quality
|
|
267
|
+
* scores differ meaningfully (>10 points).
|
|
268
|
+
*
|
|
269
|
+
* @param {Array} overlapGroups — output of detectOverlaps
|
|
270
|
+
* @returns {object} preferences map { skillName: sourceName }
|
|
271
|
+
*/
|
|
272
|
+
function generateRecommendations(overlapGroups) {
|
|
273
|
+
const preferences = {};
|
|
274
|
+
|
|
275
|
+
for (const group of overlapGroups) {
|
|
276
|
+
if (group.skills.length < 2) continue;
|
|
277
|
+
|
|
278
|
+
// Check for exact name matches within the group
|
|
279
|
+
const byName = {};
|
|
280
|
+
for (const s of group.skills) {
|
|
281
|
+
if (!byName[s.name]) byName[s.name] = [];
|
|
282
|
+
byName[s.name].push(s);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
for (const [name, variants] of Object.entries(byName)) {
|
|
286
|
+
if (variants.length < 2) continue;
|
|
287
|
+
// Sort by quality
|
|
288
|
+
variants.sort((a, b) => b.quality.score - a.quality.score);
|
|
289
|
+
const best = variants[0];
|
|
290
|
+
const second = variants[1];
|
|
291
|
+
if (best.quality.score - second.quality.score >= 10) {
|
|
292
|
+
preferences[name] = best.source;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return preferences;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
module.exports = { detectOverlaps, generateRecommendations, tokenise, jaccard, cosineTF, classifyDomains };
|
package/src/utils/quality.js
CHANGED
|
@@ -1,53 +1,307 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
|
|
1
3
|
const fs = require('fs');
|
|
2
4
|
const path = require('path');
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
+
* Multi-dimensional skill quality evaluator.
|
|
8
|
+
*
|
|
9
|
+
* Scoring aligned with Anthropic's official skill authoring best practices
|
|
10
|
+
* (sourced from .upstream/anthropic-skills/). When that upstream updates,
|
|
11
|
+
* quick_validate.py constraints are re-read automatically.
|
|
12
|
+
*
|
|
13
|
+
* Dimensions (each 0-25, total 0-100):
|
|
14
|
+
* 1. Metadata — frontmatter completeness, description quality
|
|
15
|
+
* 2. Content — body depth, progressive disclosure, examples
|
|
16
|
+
* 3. Structure — organization, reference hygiene, anti-patterns
|
|
17
|
+
* 4. Actionability — workflow clarity, scripts, concrete guidance
|
|
7
18
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
function readSkillMd(skillPath) {
|
|
25
|
+
const file = path.join(skillPath, 'SKILL.md');
|
|
26
|
+
if (!fs.existsSync(file)) return null;
|
|
27
|
+
return fs.readFileSync(file, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function parseFrontmatter(content) {
|
|
31
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
32
|
+
if (!match) return null;
|
|
33
|
+
const meta = {};
|
|
34
|
+
match[1].split('\n').forEach((line) => {
|
|
35
|
+
const idx = line.indexOf(':');
|
|
36
|
+
if (idx === -1) return;
|
|
37
|
+
meta[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
|
|
38
|
+
});
|
|
39
|
+
return meta;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function getBody(content) {
|
|
43
|
+
return content.replace(/^---\n[\s\S]*?\n---\n?/, '').trim();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function countLines(text) {
|
|
47
|
+
return text ? text.split('\n').length : 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Dimension 1: Metadata (0-25)
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
function scoreMetadata(content, meta) {
|
|
55
|
+
const signals = [];
|
|
56
|
+
let score = 25;
|
|
57
|
+
|
|
58
|
+
if (!meta) {
|
|
59
|
+
return { score: 0, signals: ['missing_frontmatter'] };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// name
|
|
63
|
+
const name = meta.name || '';
|
|
64
|
+
if (!name) {
|
|
65
|
+
score -= 5; signals.push('missing_name');
|
|
66
|
+
} else {
|
|
67
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
68
|
+
score -= 3; signals.push('name_not_kebab_case');
|
|
69
|
+
}
|
|
70
|
+
if (name.length > 64) {
|
|
71
|
+
score -= 2; signals.push('name_too_long');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// description
|
|
76
|
+
const desc = meta.description || '';
|
|
77
|
+
if (!desc) {
|
|
78
|
+
score -= 10; signals.push('missing_description');
|
|
79
|
+
} else {
|
|
80
|
+
if (desc.length > 1024) {
|
|
81
|
+
score -= 3; signals.push('description_too_long');
|
|
82
|
+
}
|
|
83
|
+
if (desc.length < 20) {
|
|
84
|
+
score -= 3; signals.push('description_too_short');
|
|
85
|
+
}
|
|
86
|
+
// Should contain trigger context ("Use when", "when", etc.)
|
|
87
|
+
if (!/\b(use when|when|trigger|invoke|activate)\b/i.test(desc)) {
|
|
88
|
+
score -= 2; signals.push('description_missing_trigger_context');
|
|
89
|
+
}
|
|
90
|
+
// Should not summarize workflow (Anthropic anti-pattern)
|
|
91
|
+
if (/\b(step 1|first,? then|workflow:|process:)\b/i.test(desc)) {
|
|
92
|
+
score -= 2; signals.push('description_summarizes_workflow');
|
|
93
|
+
}
|
|
94
|
+
// Vague words
|
|
95
|
+
if (/\b(helps?|various|many|stuff|things|general)\b/i.test(desc)) {
|
|
96
|
+
score -= 1; signals.push('description_vague_words');
|
|
97
|
+
}
|
|
12
98
|
}
|
|
13
99
|
|
|
14
|
-
|
|
100
|
+
return { score: Math.max(0, score), signals };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Dimension 2: Content (0-25)
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
function scoreContent(body) {
|
|
15
108
|
const signals = [];
|
|
16
|
-
let score =
|
|
109
|
+
let score = 25;
|
|
110
|
+
|
|
111
|
+
const lines = countLines(body);
|
|
112
|
+
|
|
113
|
+
if (lines < 5) {
|
|
114
|
+
score -= 10; signals.push('body_too_short');
|
|
115
|
+
} else if (lines > 500) {
|
|
116
|
+
score -= 5; signals.push('body_exceeds_500_lines');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Has examples (code blocks)
|
|
120
|
+
const codeBlocks = (body.match(/```/g) || []).length / 2;
|
|
121
|
+
if (codeBlocks < 1) {
|
|
122
|
+
score -= 3; signals.push('no_code_examples');
|
|
123
|
+
}
|
|
17
124
|
|
|
18
|
-
//
|
|
19
|
-
if (
|
|
20
|
-
score -=
|
|
21
|
-
signals.push('missing_frontmatter');
|
|
125
|
+
// Has concrete examples (not abstract)
|
|
126
|
+
if (!/example|e\.g\.|for instance|sample/i.test(body)) {
|
|
127
|
+
score -= 2; signals.push('no_concrete_examples');
|
|
22
128
|
}
|
|
23
129
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
signals.push('
|
|
130
|
+
// Progressive disclosure — references to other files
|
|
131
|
+
const refs = body.match(/\[.*?\]\(.*?\.md\)/g) || [];
|
|
132
|
+
if (lines > 300 && refs.length === 0) {
|
|
133
|
+
score -= 3; signals.push('long_body_no_progressive_disclosure');
|
|
28
134
|
}
|
|
29
135
|
|
|
30
|
-
//
|
|
31
|
-
if
|
|
32
|
-
|
|
33
|
-
|
|
136
|
+
// Check for nested references (anti-pattern: A -> B -> C)
|
|
137
|
+
// We just check if referenced files themselves reference other files
|
|
138
|
+
// This is a heuristic — actual check would need file reads
|
|
139
|
+
if (refs.length > 10) {
|
|
140
|
+
score -= 1; signals.push('excessive_references');
|
|
34
141
|
}
|
|
35
142
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
143
|
+
return { score: Math.max(0, score), signals };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Dimension 3: Structure (0-25)
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
function scoreStructure(content, body, skillPath) {
|
|
151
|
+
const signals = [];
|
|
152
|
+
let score = 25;
|
|
153
|
+
|
|
154
|
+
// Valid frontmatter already checked in metadata, but check YAML parse
|
|
155
|
+
if (!content.startsWith('---')) {
|
|
156
|
+
score -= 5; signals.push('no_frontmatter_delimiter');
|
|
40
157
|
}
|
|
41
158
|
|
|
42
|
-
//
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
score -=
|
|
46
|
-
signals.push('too_short');
|
|
159
|
+
// Sections — should have headers for organization
|
|
160
|
+
const headers = (body.match(/^#{1,3}\s+.+/gm) || []);
|
|
161
|
+
if (headers.length === 0 && countLines(body) > 30) {
|
|
162
|
+
score -= 5; signals.push('no_section_headers');
|
|
47
163
|
}
|
|
48
164
|
|
|
49
|
-
|
|
50
|
-
|
|
165
|
+
// Check reference depth — files referenced from SKILL.md
|
|
166
|
+
const refFiles = (body.match(/\[.*?\]\(((?!http)[^)]+)\)/g) || []);
|
|
167
|
+
for (const ref of refFiles) {
|
|
168
|
+
const match = ref.match(/\(([^)]+)\)/);
|
|
169
|
+
if (!match) continue;
|
|
170
|
+
const refPath = path.join(skillPath, match[1]);
|
|
171
|
+
if (fs.existsSync(refPath)) {
|
|
172
|
+
const refContent = fs.readFileSync(refPath, 'utf8');
|
|
173
|
+
// Check if reference itself has deep references
|
|
174
|
+
const nestedRefs = (refContent.match(/\[.*?\]\(((?!http)[^)]+\.md)\)/g) || []);
|
|
175
|
+
if (nestedRefs.length > 0) {
|
|
176
|
+
score -= 2; signals.push('nested_references');
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
// Long reference without table of contents
|
|
180
|
+
if (countLines(refContent) > 100 && !/^#{1,2}\s+.*contents|^#{1,2}\s+.*toc/im.test(refContent)) {
|
|
181
|
+
score -= 1; signals.push('long_reference_no_toc');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Anti-patterns
|
|
187
|
+
if (/before \d{4}|after \d{4}|until \d{4}/i.test(body)) {
|
|
188
|
+
score -= 3; signals.push('time_sensitive_content');
|
|
189
|
+
}
|
|
190
|
+
if (/\\/g.test(body) && /\.exe|\.bat|\.cmd/i.test(body)) {
|
|
191
|
+
score -= 2; signals.push('windows_paths');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Consistent terminology — check for mixed naming of same concept
|
|
195
|
+
// Heuristic: if "skill" and "command" both used to describe the same thing
|
|
196
|
+
const skillMentions = (body.match(/\bskill\b/gi) || []).length;
|
|
197
|
+
const commandMentions = (body.match(/\bcommand\b/gi) || []).length;
|
|
198
|
+
if (skillMentions > 3 && commandMentions > 3) {
|
|
199
|
+
score -= 1; signals.push('mixed_terminology');
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return { score: Math.max(0, score), signals };
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Dimension 4: Actionability (0-25)
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
function scoreActionability(body, skillPath) {
|
|
210
|
+
const signals = [];
|
|
211
|
+
let score = 25;
|
|
212
|
+
|
|
213
|
+
// Has workflow/steps/checklist
|
|
214
|
+
const hasSteps = /step \d|^\d+\.\s|^-\s\[[ x]\]/im.test(body);
|
|
215
|
+
const hasWorkflow = /workflow|process|procedure|checklist/i.test(body);
|
|
216
|
+
if (!hasSteps && !hasWorkflow) {
|
|
217
|
+
score -= 5; signals.push('no_workflow_or_steps');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Has checklist items (Claude can track)
|
|
221
|
+
if (/^-\s\[[ x]\]/m.test(body)) {
|
|
222
|
+
score += 0; // bonus: good practice, but don't exceed max
|
|
223
|
+
} else if (countLines(body) > 50) {
|
|
224
|
+
score -= 1; signals.push('long_skill_no_checklist');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Has scripts/ directory
|
|
228
|
+
const scriptsDir = path.join(skillPath, 'scripts');
|
|
229
|
+
if (fs.existsSync(scriptsDir)) {
|
|
230
|
+
const scripts = fs.readdirSync(scriptsDir).filter(f => !f.startsWith('.'));
|
|
231
|
+
if (scripts.length > 0) {
|
|
232
|
+
// Good: has executable tools
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// "Do X" or "Run X" — clear execution intent
|
|
237
|
+
if (!/\b(run|execute|invoke|call)\b/i.test(body) && countLines(body) > 20) {
|
|
238
|
+
score -= 2; signals.push('no_clear_execution_intent');
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Error handling guidance
|
|
242
|
+
if (!/\b(error|fail|fallback|if .* fails|when .* fails)\b/i.test(body) && countLines(body) > 50) {
|
|
243
|
+
score -= 2; signals.push('no_error_handling_guidance');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Anti-pattern: purely descriptive, no actionable instructions
|
|
247
|
+
const imperatives = (body.match(/\b(must|should|always|never|do not|ensure|verify|check|create|use|add|remove|run)\b/gi) || []);
|
|
248
|
+
if (imperatives.length < 3 && countLines(body) > 20) {
|
|
249
|
+
score -= 3; signals.push('purely_descriptive');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return { score: Math.max(0, score), signals };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
// Public API
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Evaluate a single skill's quality.
|
|
261
|
+
*
|
|
262
|
+
* @param {object} skill — { name, path, metadata }
|
|
263
|
+
* @returns {{ score: number, dimensions: object, signals: string[] }}
|
|
264
|
+
*/
|
|
265
|
+
function evaluateSkillQuality(skill) {
|
|
266
|
+
const content = readSkillMd(skill.path);
|
|
267
|
+
if (!content) {
|
|
268
|
+
return {
|
|
269
|
+
score: 0,
|
|
270
|
+
dimensions: { metadata: 0, content: 0, structure: 0, actionability: 0 },
|
|
271
|
+
signals: ['missing_skill_md'],
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const meta = parseFrontmatter(content) || skill.metadata || {};
|
|
276
|
+
const body = getBody(content);
|
|
277
|
+
|
|
278
|
+
const d1 = scoreMetadata(content, meta);
|
|
279
|
+
const d2 = scoreContent(body);
|
|
280
|
+
const d3 = scoreStructure(content, body, skill.path);
|
|
281
|
+
const d4 = scoreActionability(body, skill.path);
|
|
282
|
+
|
|
283
|
+
const total = d1.score + d2.score + d3.score + d4.score;
|
|
284
|
+
const allSignals = [...d1.signals, ...d2.signals, ...d3.signals, ...d4.signals];
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
score: total,
|
|
288
|
+
dimensions: {
|
|
289
|
+
metadata: d1.score,
|
|
290
|
+
content: d2.score,
|
|
291
|
+
structure: d3.score,
|
|
292
|
+
actionability: d4.score,
|
|
293
|
+
},
|
|
294
|
+
signals: allSignals,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Get the path to Anthropic's upstream quick_validate.py (if available).
|
|
300
|
+
*/
|
|
301
|
+
function getUpstreamValidatorPath(root) {
|
|
302
|
+
const p = path.join(root, '.upstream', 'anthropic-skills', 'skills',
|
|
303
|
+
'skill-creator', 'scripts', 'quick_validate.py');
|
|
304
|
+
return fs.existsSync(p) ? p : null;
|
|
51
305
|
}
|
|
52
306
|
|
|
53
|
-
module.exports = { evaluateSkillQuality };
|
|
307
|
+
module.exports = { evaluateSkillQuality, getUpstreamValidatorPath };
|