@thanhvn14/csvibe 0.1.3 → 0.1.5
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/.github/agents/schemas/base-output.schema.json +88 -0
- package/.github/agents/schemas/brainstorm-output.schema.json +88 -0
- package/.github/agents/schemas/scout-output.schema.json +60 -0
- package/.github/agents/scripts/fetch-copilot-tools.js +245 -0
- package/.github/agents/scripts/lib/parse-agent-file.js +275 -0
- package/.github/agents/scripts/package-lock.json +78 -0
- package/.github/agents/scripts/package.json +22 -0
- package/.github/agents/scripts/schemas/agent-frontmatter.schema.json +83 -0
- package/.github/agents/scripts/validate-agent-all.js +157 -0
- package/.github/agents/scripts/validate-agent-frontmatter.js +96 -0
- package/.github/agents/scripts/validate-agent-handoffs.js +169 -0
- package/.github/agents/scripts/validate-agent-output.js +157 -0
- package/.github/agents/scripts/validate-agent-tools.js +278 -0
- package/.github/skills/.env.example +100 -0
- package/.github/skills/.install-state.json +23 -0
- package/.github/skills/README.md +149 -0
- package/.github/skills/ai-multimodal/.env.example +204 -0
- package/.github/skills/ai-multimodal/scripts/.coverage +0 -0
- package/.github/skills/ai-multimodal/scripts/check_setup.py +305 -0
- package/.github/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/.github/skills/ai-multimodal/scripts/gemini_batch_process.py +1184 -0
- package/.github/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/.github/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/.github/skills/better-auth/scripts/.coverage +0 -0
- package/.github/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/.github/skills/better-auth/scripts/requirements.txt +15 -0
- package/.github/skills/chrome-devtools/scripts/README.md +272 -0
- package/.github/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/.github/skills/chrome-devtools/scripts/aria-snapshot.js +362 -0
- package/.github/skills/chrome-devtools/scripts/click.js +83 -0
- package/.github/skills/chrome-devtools/scripts/console.js +79 -0
- package/.github/skills/chrome-devtools/scripts/evaluate.js +53 -0
- package/.github/skills/chrome-devtools/scripts/fill.js +76 -0
- package/.github/skills/chrome-devtools/scripts/inject-auth.js +229 -0
- package/.github/skills/chrome-devtools/scripts/install-deps.sh +181 -0
- package/.github/skills/chrome-devtools/scripts/install.sh +83 -0
- package/.github/skills/chrome-devtools/scripts/lib/browser.js +318 -0
- package/.github/skills/chrome-devtools/scripts/lib/selector.js +178 -0
- package/.github/skills/chrome-devtools/scripts/navigate.js +54 -0
- package/.github/skills/chrome-devtools/scripts/network.js +106 -0
- package/.github/skills/chrome-devtools/scripts/package-lock.json +1589 -0
- package/.github/skills/chrome-devtools/scripts/package.json +16 -0
- package/.github/skills/chrome-devtools/scripts/performance.js +149 -0
- package/.github/skills/chrome-devtools/scripts/screenshot.js +198 -0
- package/.github/skills/chrome-devtools/scripts/select-ref.js +131 -0
- package/.github/skills/chrome-devtools/scripts/snapshot.js +135 -0
- package/.github/skills/common/README.md +120 -0
- package/.github/skills/common/api_key_helper.py +411 -0
- package/.github/skills/common/api_key_rotator.py +248 -0
- package/.github/skills/databases/scripts/.coverage +0 -0
- package/.github/skills/databases/scripts/db_backup.py +502 -0
- package/.github/skills/databases/scripts/db_migrate.py +425 -0
- package/.github/skills/databases/scripts/db_performance_check.py +456 -0
- package/.github/skills/databases/scripts/requirements.txt +20 -0
- package/.github/skills/debugging/scripts/find-polluter.sh +63 -0
- package/.github/skills/devops/.env.example +76 -0
- package/.github/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/.github/skills/devops/scripts/docker_optimize.py +331 -0
- package/.github/skills/devops/scripts/requirements.txt +20 -0
- package/.github/skills/docs-seeker/.env.example +15 -0
- package/.github/skills/docs-seeker/package.json +25 -0
- package/.github/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/.github/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/.github/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/.github/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/.github/skills/document-skills/docx/LICENSE.txt +30 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/.github/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/.github/skills/document-skills/docx/scripts/__init__.py +1 -0
- package/.github/skills/document-skills/docx/scripts/document.py +1276 -0
- package/.github/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
- package/.github/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.github/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.github/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/.github/skills/document-skills/docx/scripts/templates/people.xml +3 -0
- package/.github/skills/document-skills/docx/scripts/utilities.py +374 -0
- package/.github/skills/document-skills/pdf/LICENSE.txt +30 -0
- package/.github/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/.github/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/.github/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/.github/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/.github/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
- package/.github/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/.github/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/.github/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/.github/skills/document-skills/pptx/LICENSE.txt +30 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/.github/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/.github/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
- package/.github/skills/document-skills/pptx/scripts/inventory.py +1020 -0
- package/.github/skills/document-skills/pptx/scripts/rearrange.py +231 -0
- package/.github/skills/document-skills/pptx/scripts/replace.py +385 -0
- package/.github/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
- package/.github/skills/document-skills/xlsx/LICENSE.txt +30 -0
- package/.github/skills/document-skills/xlsx/recalc.py +190 -0
- package/.github/skills/install.ps1 +1220 -0
- package/.github/skills/install.sh +1032 -0
- package/.github/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/.github/skills/markdown-novel-viewer/assets/favicon.png +0 -0
- package/.github/skills/markdown-novel-viewer/assets/novel-theme.css +818 -0
- package/.github/skills/markdown-novel-viewer/assets/reader.js +262 -0
- package/.github/skills/markdown-novel-viewer/assets/template.html +80 -0
- package/.github/skills/markdown-novel-viewer/package-lock.json +146 -0
- package/.github/skills/markdown-novel-viewer/package.json +15 -0
- package/.github/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/.github/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
- package/.github/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/.github/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/.github/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/.github/skills/markdown-novel-viewer/scripts/server.cjs +411 -0
- package/.github/skills/mcp-builder/LICENSE.txt +202 -0
- package/.github/skills/mcp-builder/scripts/connections.py +151 -0
- package/.github/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/.github/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/.github/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/.github/skills/mcp-management/README.md +219 -0
- package/.github/skills/mcp-management/assets/tools.json +3146 -0
- package/.github/skills/mcp-management/package-lock.json +6 -0
- package/.github/skills/mcp-management/scripts/.env.example +10 -0
- package/.github/skills/mcp-management/scripts/cli.ts +195 -0
- package/.github/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/.github/skills/mcp-management/scripts/dist/cli.js +160 -0
- package/.github/skills/mcp-management/scripts/dist/mcp-client.js +183 -0
- package/.github/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/.github/skills/mcp-management/scripts/package.json +20 -0
- package/.github/skills/media-processing/scripts/README.md +111 -0
- package/.github/skills/media-processing/scripts/batch-remove-background.sh +124 -0
- package/.github/skills/media-processing/scripts/batch_resize.py +342 -0
- package/.github/skills/media-processing/scripts/media_convert.py +311 -0
- package/.github/skills/media-processing/scripts/remove-background.sh +96 -0
- package/.github/skills/media-processing/scripts/remove-bg-node.js +158 -0
- package/.github/skills/media-processing/scripts/requirements.txt +24 -0
- package/.github/skills/media-processing/scripts/video_optimize.py +414 -0
- package/.github/skills/payment-integration/README.md +185 -0
- package/.github/skills/payment-integration/scripts/.env.example +20 -0
- package/.github/skills/payment-integration/scripts/checkout-helper.js +244 -0
- package/.github/skills/payment-integration/scripts/package.json +17 -0
- package/.github/skills/payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/.github/skills/payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/.github/skills/payment-integration/scripts/test-scripts.js +237 -0
- package/.github/skills/plans-kanban/assets/dashboard-template.html +119 -0
- package/.github/skills/plans-kanban/assets/dashboard.css +1594 -0
- package/.github/skills/plans-kanban/assets/dashboard.js +596 -0
- package/.github/skills/plans-kanban/assets/favicon.png +0 -0
- package/.github/skills/plans-kanban/package-lock.json +123 -0
- package/.github/skills/plans-kanban/package.json +13 -0
- package/.github/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +884 -0
- package/.github/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
- package/.github/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
- package/.github/skills/plans-kanban/scripts/lib/plan-parser.cjs +175 -0
- package/.github/skills/plans-kanban/scripts/lib/plan-scanner.cjs +272 -0
- package/.github/skills/plans-kanban/scripts/lib/port-finder.cjs +48 -0
- package/.github/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
- package/.github/skills/plans-kanban/scripts/server.cjs +260 -0
- package/.github/skills/repomix/scripts/.coverage +0 -0
- package/.github/skills/repomix/scripts/README.md +179 -0
- package/.github/skills/repomix/scripts/repomix_batch.py +455 -0
- package/.github/skills/repomix/scripts/repos.example.json +15 -0
- package/.github/skills/repomix/scripts/requirements.txt +15 -0
- package/.github/skills/scout-validation/scripts/lib/broad-pattern-detector.cjs +124 -0
- package/.github/skills/scout-validation/scripts/lib/path-checker.cjs +66 -0
- package/.github/skills/scout-validation/scripts/lib/schema-validator.cjs +45 -0
- package/.github/skills/scout-validation/scripts/package.json +11 -0
- package/.github/skills/scout-validation/scripts/validate-scout-output.cjs +219 -0
- package/.github/skills/scout-validation/test/broad-pattern-output.json +18 -0
- package/.github/skills/scout-validation/test/invalid-path-output.json +18 -0
- package/.github/skills/scout-validation/test/valid-scout-output.json +26 -0
- package/.github/skills/sequential-thinking/.env.example +8 -0
- package/.github/skills/sequential-thinking/README.md +183 -0
- package/.github/skills/sequential-thinking/package.json +31 -0
- package/.github/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/.github/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/.github/skills/shopify/README.md +66 -0
- package/.github/skills/shopify/scripts/.coverage +0 -0
- package/.github/skills/shopify/scripts/requirements.txt +19 -0
- package/.github/skills/shopify/scripts/shopify_init.py +423 -0
- package/.github/skills/skill-creator/LICENSE.txt +202 -0
- package/.github/skills/skill-creator/scripts/init_skill.py +303 -0
- package/.github/skills/skill-creator/scripts/package_skill.py +110 -0
- package/.github/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/.github/skills/ui-styling/LICENSE.txt +202 -0
- package/.github/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/.github/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/.github/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/.github/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/.github/skills/ui-styling/scripts/.coverage +0 -0
- package/.github/skills/ui-styling/scripts/requirements.txt +17 -0
- package/.github/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/.github/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/.github/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.github/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/.github/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/.github/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/.github/skills/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.github/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.github/skills/ui-ux-pro-max/data/styles.csv +59 -0
- package/.github/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/.github/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.github/skills/ui-ux-pro-max/scripts/core.py +236 -0
- package/.github/skills/ui-ux-pro-max/scripts/search.py +76 -0
- package/.github/skills/web-frameworks/scripts/.coverage +0 -0
- package/.github/skills/web-frameworks/scripts/__init__.py +0 -0
- package/.github/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/.github/skills/web-frameworks/scripts/requirements.txt +16 -0
- package/.github/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/dist/config/constants.d.ts +3 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +5 -1
- package/dist/config/constants.js.map +1 -1
- package/dist/domains/github/github-client.d.ts +5 -0
- package/dist/domains/github/github-client.d.ts.map +1 -1
- package/dist/domains/github/github-client.js +44 -0
- package/dist/domains/github/github-client.js.map +1 -1
- package/dist/utils/downloader.d.ts +3 -1
- package/dist/utils/downloader.d.ts.map +1 -1
- package/dist/utils/downloader.js +48 -11
- package/dist/utils/downloader.js.map +1 -1
- package/dist/utils/scaffolder.d.ts.map +1 -1
- package/dist/utils/scaffolder.js +2 -0
- package/dist/utils/scaffolder.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* llms.txt Analyzer Script
|
|
5
|
+
* Parses llms.txt content and categorizes URLs for optimal agent distribution
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { loadEnv } = require('./utils/env-loader');
|
|
9
|
+
|
|
10
|
+
// Load environment
|
|
11
|
+
const env = loadEnv();
|
|
12
|
+
const DEBUG = env.DEBUG === 'true';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* URL priority categories
|
|
16
|
+
*/
|
|
17
|
+
const PRIORITY_KEYWORDS = {
|
|
18
|
+
critical: [
|
|
19
|
+
'getting-started', 'quick-start', 'quickstart', 'introduction', 'intro', 'overview',
|
|
20
|
+
'installation', 'install', 'setup', 'basics', 'core-concepts', 'fundamentals',
|
|
21
|
+
],
|
|
22
|
+
supplementary: [
|
|
23
|
+
'advanced', 'internals', 'migration', 'migrate', 'troubleshooting', 'troubleshoot',
|
|
24
|
+
'faq', 'frequently-asked', 'changelog', 'contributing', 'contribute',
|
|
25
|
+
],
|
|
26
|
+
important: [
|
|
27
|
+
'guide', 'tutorial', 'example', 'api-reference', 'api', 'reference',
|
|
28
|
+
'configuration', 'config', 'routing', 'route', 'data-fetching', 'authentication', 'auth',
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Categorize URL by priority
|
|
34
|
+
* @param {string} url - Documentation URL
|
|
35
|
+
* @returns {string} Priority level (critical/important/supplementary)
|
|
36
|
+
*/
|
|
37
|
+
function categorizeUrl(url) {
|
|
38
|
+
const urlLower = url.toLowerCase();
|
|
39
|
+
|
|
40
|
+
// Check in priority order: critical first, then supplementary, then important
|
|
41
|
+
// This ensures specific keywords (advanced, internals) are caught before generic ones
|
|
42
|
+
const priorities = ['critical', 'supplementary', 'important'];
|
|
43
|
+
|
|
44
|
+
for (const priority of priorities) {
|
|
45
|
+
const keywords = PRIORITY_KEYWORDS[priority];
|
|
46
|
+
for (const keyword of keywords) {
|
|
47
|
+
if (urlLower.includes(keyword)) {
|
|
48
|
+
return priority;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return 'important'; // Default
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Parse llms.txt content to extract URLs
|
|
58
|
+
* @param {string} content - llms.txt content
|
|
59
|
+
* @returns {Array<string>} Array of URLs
|
|
60
|
+
*/
|
|
61
|
+
function parseUrls(content) {
|
|
62
|
+
if (!content || typeof content !== 'string') {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const urls = [];
|
|
67
|
+
const lines = content.split('\n');
|
|
68
|
+
|
|
69
|
+
for (const line of lines) {
|
|
70
|
+
const trimmed = line.trim();
|
|
71
|
+
|
|
72
|
+
// Skip comments and empty lines
|
|
73
|
+
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
74
|
+
|
|
75
|
+
// Extract URLs (look for http/https)
|
|
76
|
+
const urlMatch = trimmed.match(/https?:\/\/[^\s<>"]+/i);
|
|
77
|
+
if (urlMatch) {
|
|
78
|
+
urls.push(urlMatch[0]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return urls;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Group URLs by priority
|
|
87
|
+
* @param {Array<string>} urls - Array of URLs
|
|
88
|
+
* @returns {Object} URLs grouped by priority
|
|
89
|
+
*/
|
|
90
|
+
function groupByPriority(urls) {
|
|
91
|
+
const groups = {
|
|
92
|
+
critical: [],
|
|
93
|
+
important: [],
|
|
94
|
+
supplementary: [],
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
for (const url of urls) {
|
|
98
|
+
const priority = categorizeUrl(url);
|
|
99
|
+
groups[priority].push(url);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return groups;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Suggest optimal agent distribution
|
|
107
|
+
* @param {number} urlCount - Total number of URLs
|
|
108
|
+
* @returns {Object} Agent distribution suggestion
|
|
109
|
+
*/
|
|
110
|
+
function suggestAgentDistribution(urlCount) {
|
|
111
|
+
if (urlCount <= 3) {
|
|
112
|
+
return {
|
|
113
|
+
agentCount: 1,
|
|
114
|
+
strategy: 'single',
|
|
115
|
+
urlsPerAgent: urlCount,
|
|
116
|
+
description: 'Single agent can handle all URLs',
|
|
117
|
+
};
|
|
118
|
+
} else if (urlCount <= 10) {
|
|
119
|
+
const agents = Math.min(Math.ceil(urlCount / 2), 5);
|
|
120
|
+
return {
|
|
121
|
+
agentCount: agents,
|
|
122
|
+
strategy: 'parallel',
|
|
123
|
+
urlsPerAgent: Math.ceil(urlCount / agents),
|
|
124
|
+
description: `Deploy ${agents} agents in parallel`,
|
|
125
|
+
};
|
|
126
|
+
} else if (urlCount <= 20) {
|
|
127
|
+
return {
|
|
128
|
+
agentCount: 7,
|
|
129
|
+
strategy: 'parallel',
|
|
130
|
+
urlsPerAgent: Math.ceil(urlCount / 7),
|
|
131
|
+
description: 'Deploy 7 agents with balanced workload',
|
|
132
|
+
};
|
|
133
|
+
} else {
|
|
134
|
+
return {
|
|
135
|
+
agentCount: 7,
|
|
136
|
+
strategy: 'phased',
|
|
137
|
+
urlsPerAgent: Math.ceil(urlCount / 7),
|
|
138
|
+
phases: 2,
|
|
139
|
+
description: 'Use two-phase approach: critical first, then important',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Analyze llms.txt content
|
|
146
|
+
* @param {string} content - llms.txt content
|
|
147
|
+
* @returns {Object} Analysis result
|
|
148
|
+
*/
|
|
149
|
+
function analyzeLlmsTxt(content) {
|
|
150
|
+
const urls = parseUrls(content);
|
|
151
|
+
const grouped = groupByPriority(urls);
|
|
152
|
+
const distribution = suggestAgentDistribution(urls.length);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
totalUrls: urls.length,
|
|
156
|
+
urls,
|
|
157
|
+
grouped,
|
|
158
|
+
distribution,
|
|
159
|
+
summary: {
|
|
160
|
+
critical: grouped.critical.length,
|
|
161
|
+
important: grouped.important.length,
|
|
162
|
+
supplementary: grouped.supplementary.length,
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* CLI entry point
|
|
169
|
+
*/
|
|
170
|
+
function main() {
|
|
171
|
+
const args = process.argv.slice(2);
|
|
172
|
+
|
|
173
|
+
if (args.length === 0) {
|
|
174
|
+
console.error('Usage: node analyze-llms-txt.js <content-file-or-stdin>');
|
|
175
|
+
console.error('Or pipe content: cat llms.txt | node analyze-llms-txt.js');
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const fs = require('fs');
|
|
180
|
+
let content;
|
|
181
|
+
|
|
182
|
+
if (args[0] === '-') {
|
|
183
|
+
// Read from stdin
|
|
184
|
+
content = fs.readFileSync(0, 'utf8');
|
|
185
|
+
} else {
|
|
186
|
+
// Read from file
|
|
187
|
+
const filePath = args[0];
|
|
188
|
+
if (!fs.existsSync(filePath)) {
|
|
189
|
+
console.error(`Error: File not found: ${filePath}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const result = analyzeLlmsTxt(content);
|
|
196
|
+
console.log(JSON.stringify(result, null, 2));
|
|
197
|
+
process.exit(0);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Run if called directly
|
|
201
|
+
if (require.main === module) {
|
|
202
|
+
main();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
module.exports = {
|
|
206
|
+
analyzeLlmsTxt,
|
|
207
|
+
parseUrls,
|
|
208
|
+
groupByPriority,
|
|
209
|
+
categorizeUrl,
|
|
210
|
+
suggestAgentDistribution,
|
|
211
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Topic Detection Script
|
|
5
|
+
* Analyzes user queries to extract library name and topic keywords
|
|
6
|
+
* Returns null for general queries, topic info for specific queries
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { loadEnv } = require('./utils/env-loader');
|
|
10
|
+
|
|
11
|
+
// Load environment
|
|
12
|
+
const env = loadEnv();
|
|
13
|
+
const DEBUG = env.DEBUG === 'true';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Topic-specific query patterns
|
|
17
|
+
*/
|
|
18
|
+
const TOPIC_PATTERNS = [
|
|
19
|
+
// "How do I use X in Y?"
|
|
20
|
+
/how (?:do i|to|can i) (?:use|implement|add|setup|configure) (?:the )?(.+?) (?:in|with|for) (.+)/i,
|
|
21
|
+
|
|
22
|
+
// "Y X strategies/patterns" - e.g., "Next.js caching strategies"
|
|
23
|
+
/(.+?) (.+?) (?:strategies|patterns|techniques|methods|approaches)/i,
|
|
24
|
+
|
|
25
|
+
// "X Y documentation" or "Y X docs"
|
|
26
|
+
/(.+?) (.+?) (?:documentation|docs|guide|tutorial)/i,
|
|
27
|
+
|
|
28
|
+
// "Using X with Y"
|
|
29
|
+
/using (.+?) (?:with|in|for) (.+)/i,
|
|
30
|
+
|
|
31
|
+
// "Y X guide/implementation/setup"
|
|
32
|
+
/(.+?) (.+?) (?:guide|implementation|setup|configuration)/i,
|
|
33
|
+
|
|
34
|
+
// "Implement X in Y"
|
|
35
|
+
/implement(?:ing)? (.+?) (?:in|with|for|using) (.+)/i,
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* General library query patterns (non-topic specific)
|
|
40
|
+
*/
|
|
41
|
+
const GENERAL_PATTERNS = [
|
|
42
|
+
/(?:documentation|docs) for (.+)/i,
|
|
43
|
+
/(.+?) (?:getting started|quick ?start|introduction)/i,
|
|
44
|
+
/(?:how to use|learn) (.+)/i,
|
|
45
|
+
/(.+?) (?:api reference|overview|basics)/i,
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Normalize topic keyword
|
|
50
|
+
* @param {string} topic - Raw topic string
|
|
51
|
+
* @returns {string} Normalized topic keyword
|
|
52
|
+
*/
|
|
53
|
+
function normalizeTopic(topic) {
|
|
54
|
+
return topic
|
|
55
|
+
.toLowerCase()
|
|
56
|
+
.trim()
|
|
57
|
+
.replace(/[^a-z0-9\s-]/g, '') // Remove special chars
|
|
58
|
+
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
59
|
+
.split('-')[0] // Take first word for multi-word topics
|
|
60
|
+
.slice(0, 20); // Limit length
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Normalize library name
|
|
65
|
+
* @param {string} library - Raw library string
|
|
66
|
+
* @returns {string} Normalized library name
|
|
67
|
+
*/
|
|
68
|
+
function normalizeLibrary(library) {
|
|
69
|
+
return library
|
|
70
|
+
.toLowerCase()
|
|
71
|
+
.trim()
|
|
72
|
+
.replace(/[^a-z0-9\s\-\/\.]/g, '')
|
|
73
|
+
.replace(/\s+/g, '-');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Detect if query is topic-specific or general
|
|
78
|
+
* @param {string} query - User query
|
|
79
|
+
* @returns {Object|null} Topic info or null for general query
|
|
80
|
+
*/
|
|
81
|
+
function detectTopic(query) {
|
|
82
|
+
if (!query || typeof query !== 'string') {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const trimmedQuery = query.trim();
|
|
87
|
+
|
|
88
|
+
// Check general patterns first
|
|
89
|
+
for (const pattern of GENERAL_PATTERNS) {
|
|
90
|
+
const match = trimmedQuery.match(pattern);
|
|
91
|
+
if (match) {
|
|
92
|
+
if (DEBUG) console.error('[DEBUG] Matched general pattern, no topic');
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Check topic-specific patterns
|
|
98
|
+
for (let i = 0; i < TOPIC_PATTERNS.length; i++) {
|
|
99
|
+
const pattern = TOPIC_PATTERNS[i];
|
|
100
|
+
const match = trimmedQuery.match(pattern);
|
|
101
|
+
if (match) {
|
|
102
|
+
const [, term1, term2] = match;
|
|
103
|
+
|
|
104
|
+
// Determine which is library and which is topic based on pattern
|
|
105
|
+
let topic, library;
|
|
106
|
+
|
|
107
|
+
// Pattern 0: "How do I use X in Y?" -> X is topic, Y is library
|
|
108
|
+
// Pattern 1: "Y X strategies" -> X is topic, Y is library
|
|
109
|
+
// Pattern 2-5: X is topic, Y is library in most cases
|
|
110
|
+
|
|
111
|
+
// For pattern 1 (strategies/patterns), term1 is library, term2 is topic
|
|
112
|
+
if (i === 1) {
|
|
113
|
+
topic = normalizeTopic(term2);
|
|
114
|
+
library = normalizeLibrary(term1);
|
|
115
|
+
} else {
|
|
116
|
+
// For other patterns, term1 is topic, term2 is library
|
|
117
|
+
topic = normalizeTopic(term1);
|
|
118
|
+
library = normalizeLibrary(term2);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (DEBUG) {
|
|
122
|
+
console.error('[DEBUG] Matched topic pattern');
|
|
123
|
+
console.error('[DEBUG] Topic:', topic);
|
|
124
|
+
console.error('[DEBUG] Library:', library);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
query: trimmedQuery,
|
|
129
|
+
topic,
|
|
130
|
+
library,
|
|
131
|
+
isTopicSpecific: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (DEBUG) console.error('[DEBUG] No pattern matched, treating as general');
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* CLI entry point
|
|
142
|
+
*/
|
|
143
|
+
function main() {
|
|
144
|
+
const args = process.argv.slice(2);
|
|
145
|
+
|
|
146
|
+
if (args.length === 0) {
|
|
147
|
+
console.error('Usage: node detect-topic.js "<user query>"');
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const query = args.join(' ');
|
|
152
|
+
const result = detectTopic(query);
|
|
153
|
+
|
|
154
|
+
if (result) {
|
|
155
|
+
console.log(JSON.stringify(result, null, 2));
|
|
156
|
+
process.exit(0);
|
|
157
|
+
} else {
|
|
158
|
+
console.log(JSON.stringify({ isTopicSpecific: false }, null, 2));
|
|
159
|
+
process.exit(0);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Run if called directly
|
|
164
|
+
if (require.main === module) {
|
|
165
|
+
main();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
module.exports = {
|
|
169
|
+
detectTopic,
|
|
170
|
+
normalizeTopic,
|
|
171
|
+
normalizeLibrary,
|
|
172
|
+
};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Documentation Fetcher Script
|
|
5
|
+
* Fetches documentation from context7.com with topic support and fallback chain
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const https = require('https');
|
|
9
|
+
const { loadEnv } = require('./utils/env-loader');
|
|
10
|
+
const { detectTopic } = require('./detect-topic');
|
|
11
|
+
|
|
12
|
+
// Load environment
|
|
13
|
+
const env = loadEnv();
|
|
14
|
+
const DEBUG = env.DEBUG === 'true';
|
|
15
|
+
const API_KEY = env.CONTEXT7_API_KEY;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Make HTTPS GET request
|
|
19
|
+
* @param {string} url - URL to fetch
|
|
20
|
+
* @returns {Promise<string>} Response body
|
|
21
|
+
*/
|
|
22
|
+
function httpsGet(url) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const options = {
|
|
25
|
+
headers: API_KEY ? { 'Authorization': `Bearer ${API_KEY}` } : {},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
https.get(url, options, (res) => {
|
|
29
|
+
let data = '';
|
|
30
|
+
|
|
31
|
+
res.on('data', (chunk) => {
|
|
32
|
+
data += chunk;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
res.on('end', () => {
|
|
36
|
+
if (res.statusCode === 200) {
|
|
37
|
+
resolve(data);
|
|
38
|
+
} else if (res.statusCode === 404) {
|
|
39
|
+
resolve(null);
|
|
40
|
+
} else {
|
|
41
|
+
reject(new Error(`HTTP ${res.statusCode}: ${data}`));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}).on('error', reject);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Construct context7.com URL
|
|
50
|
+
* @param {string} library - Library name (e.g., "next.js", "shadcn/ui")
|
|
51
|
+
* @param {string} topic - Optional topic keyword
|
|
52
|
+
* @returns {string} context7.com URL
|
|
53
|
+
*/
|
|
54
|
+
function buildContext7Url(library, topic = null) {
|
|
55
|
+
// Determine if GitHub repo or website
|
|
56
|
+
let basePath;
|
|
57
|
+
|
|
58
|
+
if (library.includes('/')) {
|
|
59
|
+
// GitHub repo format: org/repo
|
|
60
|
+
const [org, repo] = library.split('/');
|
|
61
|
+
basePath = `${org}/${repo}`;
|
|
62
|
+
} else {
|
|
63
|
+
// Try common patterns
|
|
64
|
+
const normalized = library.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
65
|
+
basePath = `websites/${normalized}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const baseUrl = `https://context7.com/${basePath}/llms.txt`;
|
|
69
|
+
|
|
70
|
+
if (topic) {
|
|
71
|
+
return `${baseUrl}?topic=${encodeURIComponent(topic)}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return baseUrl;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Try multiple URL variations for a library
|
|
79
|
+
* @param {string} library - Library name
|
|
80
|
+
* @param {string} topic - Optional topic
|
|
81
|
+
* @returns {Promise<Array>} Array of URLs to try
|
|
82
|
+
*/
|
|
83
|
+
async function getUrlVariations(library, topic = null) {
|
|
84
|
+
const urls = [];
|
|
85
|
+
|
|
86
|
+
// Known repo mappings
|
|
87
|
+
const knownRepos = {
|
|
88
|
+
'next.js': 'vercel/next.js',
|
|
89
|
+
'nextjs': 'vercel/next.js',
|
|
90
|
+
'remix': 'remix-run/remix',
|
|
91
|
+
'astro': 'withastro/astro',
|
|
92
|
+
'shadcn': 'shadcn-ui/ui',
|
|
93
|
+
'shadcn/ui': 'shadcn-ui/ui',
|
|
94
|
+
'better-auth': 'better-auth/better-auth',
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const normalized = library.toLowerCase();
|
|
98
|
+
const repo = knownRepos[normalized] || library;
|
|
99
|
+
|
|
100
|
+
// Primary: Try with topic if available
|
|
101
|
+
if (topic) {
|
|
102
|
+
urls.push(buildContext7Url(repo, topic));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Fallback: Try without topic
|
|
106
|
+
urls.push(buildContext7Url(repo));
|
|
107
|
+
|
|
108
|
+
return urls;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Fetch documentation from context7.com
|
|
113
|
+
* @param {string} query - User query
|
|
114
|
+
* @returns {Promise<Object>} Documentation result
|
|
115
|
+
*/
|
|
116
|
+
async function fetchDocs(query) {
|
|
117
|
+
const topicInfo = detectTopic(query);
|
|
118
|
+
|
|
119
|
+
if (DEBUG) {
|
|
120
|
+
console.error('[DEBUG] Topic detection result:', topicInfo);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
let urls = [];
|
|
124
|
+
|
|
125
|
+
if (topicInfo && topicInfo.isTopicSpecific) {
|
|
126
|
+
// Topic-specific search
|
|
127
|
+
urls = await getUrlVariations(topicInfo.library, topicInfo.topic);
|
|
128
|
+
|
|
129
|
+
if (DEBUG) {
|
|
130
|
+
console.error('[DEBUG] Topic-specific URLs:', urls);
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
// Extract library from general query
|
|
134
|
+
const libraryMatch = query.match(/(?:documentation|docs|guide) (?:for )?(.+)/i);
|
|
135
|
+
if (libraryMatch) {
|
|
136
|
+
const library = libraryMatch[1].trim();
|
|
137
|
+
urls = await getUrlVariations(library);
|
|
138
|
+
|
|
139
|
+
if (DEBUG) {
|
|
140
|
+
console.error('[DEBUG] General library URLs:', urls);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Try each URL
|
|
146
|
+
for (const url of urls) {
|
|
147
|
+
if (DEBUG) {
|
|
148
|
+
console.error(`[DEBUG] Trying URL: ${url}`);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
const content = await httpsGet(url);
|
|
153
|
+
|
|
154
|
+
if (content) {
|
|
155
|
+
return {
|
|
156
|
+
success: true,
|
|
157
|
+
source: 'context7.com',
|
|
158
|
+
url,
|
|
159
|
+
content,
|
|
160
|
+
topicSpecific: url.includes('?topic='),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (DEBUG) {
|
|
165
|
+
console.error(`[DEBUG] Failed to fetch ${url}:`, error.message);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// No URL worked
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
source: 'context7.com',
|
|
174
|
+
error: 'Documentation not found on context7.com',
|
|
175
|
+
urls,
|
|
176
|
+
suggestion: 'Try repository analysis or web search',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* CLI entry point
|
|
182
|
+
*/
|
|
183
|
+
async function main() {
|
|
184
|
+
const args = process.argv.slice(2);
|
|
185
|
+
|
|
186
|
+
if (args.length === 0) {
|
|
187
|
+
console.error('Usage: node fetch-docs.js "<user query>"');
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const query = args.join(' ');
|
|
192
|
+
|
|
193
|
+
try {
|
|
194
|
+
const result = await fetchDocs(query);
|
|
195
|
+
console.log(JSON.stringify(result, null, 2));
|
|
196
|
+
process.exit(result.success ? 0 : 1);
|
|
197
|
+
} catch (error) {
|
|
198
|
+
console.error('Error:', error.message);
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Run if called directly
|
|
204
|
+
if (require.main === module) {
|
|
205
|
+
main();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
module.exports = {
|
|
209
|
+
fetchDocs,
|
|
210
|
+
buildContext7Url,
|
|
211
|
+
getUrlVariations,
|
|
212
|
+
httpsGet,
|
|
213
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Environment variable loader for docs-seeker skill
|
|
5
|
+
* Respects order: process.env > skill/.env > skills/.env > %USERPROFILE%/.claude/.env
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Parse .env file content into key-value pairs
|
|
13
|
+
* @param {string} content - .env file content
|
|
14
|
+
* @returns {Object} Parsed environment variables
|
|
15
|
+
*/
|
|
16
|
+
function parseEnvFile(content) {
|
|
17
|
+
const env = {};
|
|
18
|
+
const lines = content.split('\n');
|
|
19
|
+
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
// Skip comments and empty lines
|
|
22
|
+
if (!line || line.trim().startsWith('#')) continue;
|
|
23
|
+
|
|
24
|
+
const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
|
|
25
|
+
if (match) {
|
|
26
|
+
const key = match[1];
|
|
27
|
+
let value = match[2].trim();
|
|
28
|
+
|
|
29
|
+
// Remove quotes if present
|
|
30
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
31
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
32
|
+
value = value.slice(1, -1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
env[key] = value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return env;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Load environment variables from .env files in priority order
|
|
44
|
+
* Priority: process.env > skill/.env > skills/.env > %USERPROFILE%/.claude/.env
|
|
45
|
+
* @returns {Object} Merged environment variables
|
|
46
|
+
*/
|
|
47
|
+
function loadEnv() {
|
|
48
|
+
const skillDir = path.resolve(__dirname, '../..');
|
|
49
|
+
const skillsDir = path.resolve(skillDir, '..');
|
|
50
|
+
const claudeDir = path.resolve(skillsDir, '..');
|
|
51
|
+
|
|
52
|
+
const envPaths = [
|
|
53
|
+
path.join(claudeDir, '.env'), // Lowest priority
|
|
54
|
+
path.join(skillsDir, '.env'),
|
|
55
|
+
path.join(skillDir, '.env'), // Highest priority (file)
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
let mergedEnv = {};
|
|
59
|
+
|
|
60
|
+
// Load .env files in order (lowest to highest priority)
|
|
61
|
+
for (const envPath of envPaths) {
|
|
62
|
+
if (fs.existsSync(envPath)) {
|
|
63
|
+
try {
|
|
64
|
+
const content = fs.readFileSync(envPath, 'utf8');
|
|
65
|
+
const parsed = parseEnvFile(content);
|
|
66
|
+
mergedEnv = { ...mergedEnv, ...parsed };
|
|
67
|
+
} catch (error) {
|
|
68
|
+
// Silently skip unreadable files
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// process.env has highest priority
|
|
74
|
+
mergedEnv = { ...mergedEnv, ...process.env };
|
|
75
|
+
|
|
76
|
+
return mergedEnv;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Get environment variable with fallback
|
|
81
|
+
* @param {string} key - Environment variable key
|
|
82
|
+
* @param {string} defaultValue - Default value if not found
|
|
83
|
+
* @returns {string} Environment variable value
|
|
84
|
+
*/
|
|
85
|
+
function getEnv(key, defaultValue = '') {
|
|
86
|
+
const env = loadEnv();
|
|
87
|
+
return env[key] || defaultValue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports = {
|
|
91
|
+
loadEnv,
|
|
92
|
+
getEnv,
|
|
93
|
+
parseEnvFile,
|
|
94
|
+
};
|