@thanhvn14/csvibe 0.1.4 → 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 +2 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +4 -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/package.json +3 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Chrome DevTools Scripts
|
|
2
|
+
|
|
3
|
+
CLI scripts for browser automation using Puppeteer.
|
|
4
|
+
|
|
5
|
+
**CRITICAL**: Always check `pwd` before running scripts.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
## Skill Location
|
|
10
|
+
|
|
11
|
+
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Detect skill location
|
|
15
|
+
SKILL_DIR=""
|
|
16
|
+
if [ -d "%USERPROFILE%/.claude/skills/chrome-devtools/scripts" ]; then
|
|
17
|
+
SKILL_DIR="%USERPROFILE%/.claude/skills/chrome-devtools/scripts"
|
|
18
|
+
elif [ -d "%USERPROFILE%/.claude/skills/chrome-devtools/scripts" ]; then
|
|
19
|
+
SKILL_DIR="%USERPROFILE%/.claude/skills/chrome-devtools/scripts"
|
|
20
|
+
fi
|
|
21
|
+
cd "$SKILL_DIR"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Quick Install
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pwd # Should show current working directory
|
|
28
|
+
cd $SKILL_DIR/.claude/skills/chrome-devtools/scripts
|
|
29
|
+
./install.sh # Auto-checks dependencies and installs
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Manual Installation
|
|
33
|
+
|
|
34
|
+
**Linux/WSL** - Install system dependencies first:
|
|
35
|
+
```bash
|
|
36
|
+
./install-deps.sh # Auto-detects OS (Ubuntu, Debian, Fedora, etc.)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Or manually:
|
|
40
|
+
```bash
|
|
41
|
+
sudo apt-get install -y libnss3 libnspr4 libasound2t64 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**All platforms** - Install Node dependencies:
|
|
45
|
+
```bash
|
|
46
|
+
npm install
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Scripts
|
|
50
|
+
|
|
51
|
+
**CRITICAL**: Always check `pwd` before running scripts.
|
|
52
|
+
|
|
53
|
+
### inject-auth.js
|
|
54
|
+
Inject authentication (cookies, tokens, storage) for testing protected routes.
|
|
55
|
+
|
|
56
|
+
**Workflow for testing protected routes:**
|
|
57
|
+
1. User manually logs into the site in their browser
|
|
58
|
+
2. User extracts cookies/tokens from browser DevTools (Application tab)
|
|
59
|
+
3. Run inject-auth.js to inject auth into puppeteer session
|
|
60
|
+
4. Run other scripts which will use the authenticated session
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Inject cookies
|
|
64
|
+
node inject-auth.js --url https://example.com --cookies '[{"name":"session","value":"abc123","domain":".example.com"}]'
|
|
65
|
+
|
|
66
|
+
# Inject Bearer token (stores in localStorage + sets HTTP header)
|
|
67
|
+
node inject-auth.js --url https://example.com --token "Bearer eyJhbGciOi..." --header Authorization
|
|
68
|
+
|
|
69
|
+
# Inject localStorage items
|
|
70
|
+
node inject-auth.js --url https://example.com --local-storage '{"auth_token":"xyz","user_id":"123"}'
|
|
71
|
+
|
|
72
|
+
# Inject sessionStorage items
|
|
73
|
+
node inject-auth.js --url https://example.com --session-storage '{"temp_key":"value"}'
|
|
74
|
+
|
|
75
|
+
# Combined injection
|
|
76
|
+
node inject-auth.js --url https://example.com \
|
|
77
|
+
--cookies '[{"name":"session","value":"abc"}]' \
|
|
78
|
+
--local-storage '{"user":"data"}' \
|
|
79
|
+
--reload true
|
|
80
|
+
|
|
81
|
+
# Clear saved auth session
|
|
82
|
+
node inject-auth.js --url https://example.com --cookies '[]' --clear true
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Options:
|
|
86
|
+
- `--cookies '<json>'` - JSON array of cookie objects (name, value, domain required)
|
|
87
|
+
- `--token '<token>'` - Bearer token to inject
|
|
88
|
+
- `--token-key '<key>'` - localStorage key for token (default: access_token)
|
|
89
|
+
- `--header '<name>'` - HTTP header name for token (e.g., Authorization)
|
|
90
|
+
- `--local-storage '<json>'` - JSON object of localStorage key-value pairs
|
|
91
|
+
- `--session-storage '<json>'` - JSON object of sessionStorage key-value pairs
|
|
92
|
+
- `--reload true` - Reload page after injection to apply auth
|
|
93
|
+
- `--clear true` - Clear the saved auth session file
|
|
94
|
+
|
|
95
|
+
**Session persistence:** Auth is saved to `.auth-session.json` (valid 24h) and automatically applied by subsequent script runs until `--clear true` is used or browser closes.
|
|
96
|
+
|
|
97
|
+
### navigate.js
|
|
98
|
+
Navigate to a URL.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
node navigate.js --url https://example.com [--wait-until networkidle2] [--timeout 30000]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### screenshot.js
|
|
105
|
+
Take a screenshot with automatic compression.
|
|
106
|
+
|
|
107
|
+
**Important**: Always save screenshots to `./docs/screenshots` directory.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
node screenshot.js --output screenshot.png [--url https://example.com] [--full-page true] [--selector .element] [--max-size 5] [--no-compress]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Automatic Compression**: Screenshots >5MB are automatically compressed using ImageMagick to ensure compatibility with Gemini API and Claude Code. Install ImageMagick for this feature:
|
|
114
|
+
- macOS: `brew install imagemagick`
|
|
115
|
+
- Linux: `sudo apt-get install imagemagick`
|
|
116
|
+
|
|
117
|
+
Options:
|
|
118
|
+
- `--max-size N` - Custom size threshold in MB (default: 5)
|
|
119
|
+
- `--no-compress` - Disable automatic compression
|
|
120
|
+
- `--format png|jpeg` - Output format (default: png)
|
|
121
|
+
- `--quality N` - JPEG quality 0-100 (default: auto)
|
|
122
|
+
|
|
123
|
+
### click.js
|
|
124
|
+
Click an element.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
node click.js --selector ".button" [--url https://example.com] [--wait-for ".result"]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### fill.js
|
|
131
|
+
Fill form fields.
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
node fill.js --selector "#input" --value "text" [--url https://example.com] [--clear true]
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### evaluate.js
|
|
138
|
+
Execute JavaScript in page context.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
node evaluate.js --script "document.title" [--url https://example.com]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### snapshot.js
|
|
145
|
+
Get DOM snapshot with interactive elements.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
node snapshot.js [--url https://example.com] [--output snapshot.json]
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### console.js
|
|
152
|
+
Monitor console messages.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
node console.js --url https://example.com [--types error,warn] [--duration 5000]
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### network.js
|
|
159
|
+
Monitor network requests.
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
node network.js --url https://example.com [--types xhr,fetch] [--output requests.json]
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### performance.js
|
|
166
|
+
Measure performance metrics and record trace.
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
node performance.js --url https://example.com [--trace trace.json] [--metrics] [--resources true]
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Common Options
|
|
173
|
+
|
|
174
|
+
- `--headless false` - Show browser window
|
|
175
|
+
- `--close false` - Keep browser open
|
|
176
|
+
- `--timeout 30000` - Set timeout in milliseconds
|
|
177
|
+
- `--wait-until networkidle2` - Wait strategy (load, domcontentloaded, networkidle0, networkidle2)
|
|
178
|
+
|
|
179
|
+
## Selector Support
|
|
180
|
+
|
|
181
|
+
Scripts that accept `--selector` (click.js, fill.js, screenshot.js) support both **CSS** and **XPath** selectors.
|
|
182
|
+
|
|
183
|
+
### CSS Selectors (Default)
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Element tag
|
|
187
|
+
node click.js --selector "button" --url https://example.com
|
|
188
|
+
|
|
189
|
+
# Class selector
|
|
190
|
+
node click.js --selector ".btn-submit" --url https://example.com
|
|
191
|
+
|
|
192
|
+
# ID selector
|
|
193
|
+
node fill.js --selector "#email" --value "user@example.com" --url https://example.com
|
|
194
|
+
|
|
195
|
+
# Attribute selector
|
|
196
|
+
node click.js --selector 'button[type="submit"]' --url https://example.com
|
|
197
|
+
|
|
198
|
+
# Complex selector
|
|
199
|
+
node screenshot.js --selector "div.container > button.btn-primary" --output btn.png
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### XPath Selectors
|
|
203
|
+
|
|
204
|
+
XPath selectors start with `/` or `(//` and are automatically detected:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# Text matching - exact
|
|
208
|
+
node click.js --selector '//button[text()="Submit"]' --url https://example.com
|
|
209
|
+
|
|
210
|
+
# Text matching - contains
|
|
211
|
+
node click.js --selector '//button[contains(text(),"Submit")]' --url https://example.com
|
|
212
|
+
|
|
213
|
+
# Attribute matching
|
|
214
|
+
node fill.js --selector '//input[@type="email"]' --value "user@example.com"
|
|
215
|
+
|
|
216
|
+
# Multiple conditions
|
|
217
|
+
node click.js --selector '//button[@type="submit" and contains(text(),"Save")]'
|
|
218
|
+
|
|
219
|
+
# Descendant selection
|
|
220
|
+
node screenshot.js --selector '//div[@class="modal"]//button[@class="close"]' --output modal.png
|
|
221
|
+
|
|
222
|
+
# Nth element
|
|
223
|
+
node click.js --selector '(//button)[2]' # Second button on page
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Discovering Selectors
|
|
227
|
+
|
|
228
|
+
Use `snapshot.js` to discover correct selectors:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
# Get all interactive elements
|
|
232
|
+
node snapshot.js --url https://example.com | jq '.elements[]'
|
|
233
|
+
|
|
234
|
+
# Find buttons
|
|
235
|
+
node snapshot.js --url https://example.com | jq '.elements[] | select(.tagName=="BUTTON")'
|
|
236
|
+
|
|
237
|
+
# Find inputs
|
|
238
|
+
node snapshot.js --url https://example.com | jq '.elements[] | select(.tagName=="INPUT")'
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Security
|
|
242
|
+
|
|
243
|
+
XPath selectors are validated to prevent injection attacks. The following patterns are blocked:
|
|
244
|
+
- `javascript:`
|
|
245
|
+
- `<script`
|
|
246
|
+
- `onerror=`, `onload=`, `onclick=`
|
|
247
|
+
- `eval(`, `Function(`, `constructor(`
|
|
248
|
+
|
|
249
|
+
Selectors exceeding 1000 characters are rejected (DoS prevention).
|
|
250
|
+
|
|
251
|
+
## Output Format
|
|
252
|
+
|
|
253
|
+
All scripts output JSON to stdout:
|
|
254
|
+
|
|
255
|
+
```json
|
|
256
|
+
{
|
|
257
|
+
"success": true,
|
|
258
|
+
"url": "https://example.com",
|
|
259
|
+
"title": "Example Domain",
|
|
260
|
+
...
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Errors are output to stderr:
|
|
265
|
+
|
|
266
|
+
```json
|
|
267
|
+
{
|
|
268
|
+
"success": false,
|
|
269
|
+
"error": "Error message",
|
|
270
|
+
"stack": "..."
|
|
271
|
+
}
|
|
272
|
+
```
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for selector parsing library
|
|
3
|
+
* Run with: node --test __tests__/selector.test.js
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import { parseSelector } from '../lib/selector.js';
|
|
8
|
+
|
|
9
|
+
describe('parseSelector', () => {
|
|
10
|
+
describe('CSS Selectors', () => {
|
|
11
|
+
it('should detect simple CSS selectors', () => {
|
|
12
|
+
const result = parseSelector('button');
|
|
13
|
+
assert.strictEqual(result.type, 'css');
|
|
14
|
+
assert.strictEqual(result.selector, 'button');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should detect class selectors', () => {
|
|
18
|
+
const result = parseSelector('.btn-submit');
|
|
19
|
+
assert.strictEqual(result.type, 'css');
|
|
20
|
+
assert.strictEqual(result.selector, '.btn-submit');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should detect ID selectors', () => {
|
|
24
|
+
const result = parseSelector('#email-input');
|
|
25
|
+
assert.strictEqual(result.type, 'css');
|
|
26
|
+
assert.strictEqual(result.selector, '#email-input');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should detect attribute selectors', () => {
|
|
30
|
+
const result = parseSelector('button[type="submit"]');
|
|
31
|
+
assert.strictEqual(result.type, 'css');
|
|
32
|
+
assert.strictEqual(result.selector, 'button[type="submit"]');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should detect complex CSS selectors', () => {
|
|
36
|
+
const result = parseSelector('div.container > button.btn-primary:hover');
|
|
37
|
+
assert.strictEqual(result.type, 'css');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe('XPath Selectors', () => {
|
|
42
|
+
it('should detect absolute XPath', () => {
|
|
43
|
+
const result = parseSelector('/html/body/button');
|
|
44
|
+
assert.strictEqual(result.type, 'xpath');
|
|
45
|
+
assert.strictEqual(result.selector, '/html/body/button');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should detect relative XPath', () => {
|
|
49
|
+
const result = parseSelector('//button');
|
|
50
|
+
assert.strictEqual(result.type, 'xpath');
|
|
51
|
+
assert.strictEqual(result.selector, '//button');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should detect XPath with text matching', () => {
|
|
55
|
+
const result = parseSelector('//button[text()="Click Me"]');
|
|
56
|
+
assert.strictEqual(result.type, 'xpath');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should detect XPath with contains', () => {
|
|
60
|
+
const result = parseSelector('//button[contains(text(),"Submit")]');
|
|
61
|
+
assert.strictEqual(result.type, 'xpath');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should detect XPath with attributes', () => {
|
|
65
|
+
const result = parseSelector('//input[@type="email"]');
|
|
66
|
+
assert.strictEqual(result.type, 'xpath');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should detect grouped XPath', () => {
|
|
70
|
+
const result = parseSelector('(//button)[1]');
|
|
71
|
+
assert.strictEqual(result.type, 'xpath');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('Security Validation', () => {
|
|
76
|
+
it('should block javascript: injection', () => {
|
|
77
|
+
assert.throws(
|
|
78
|
+
() => parseSelector('//button[@onclick="javascript:alert(1)"]'),
|
|
79
|
+
/XPath injection detected.*javascript:/i
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should block <script tag injection', () => {
|
|
84
|
+
assert.throws(
|
|
85
|
+
() => parseSelector('//div[contains(text(),"<script>alert(1)</script>")]'),
|
|
86
|
+
/XPath injection detected.*<script/i
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should block onerror= injection', () => {
|
|
91
|
+
assert.throws(
|
|
92
|
+
() => parseSelector('//img[@onerror="alert(1)"]'),
|
|
93
|
+
/XPath injection detected.*onerror=/i
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('should block onload= injection', () => {
|
|
98
|
+
assert.throws(
|
|
99
|
+
() => parseSelector('//body[@onload="malicious()"]'),
|
|
100
|
+
/XPath injection detected.*onload=/i
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should block onclick= injection', () => {
|
|
105
|
+
assert.throws(
|
|
106
|
+
() => parseSelector('//a[@onclick="steal()"]'),
|
|
107
|
+
/XPath injection detected.*onclick=/i
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('should block eval( injection', () => {
|
|
112
|
+
assert.throws(
|
|
113
|
+
() => parseSelector('//div[eval("malicious")]'),
|
|
114
|
+
/XPath injection detected.*eval\(/i
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should block Function( injection', () => {
|
|
119
|
+
assert.throws(
|
|
120
|
+
() => parseSelector('//div[Function("return 1")()]'),
|
|
121
|
+
/XPath injection detected.*Function\(/i
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should block constructor( injection', () => {
|
|
126
|
+
assert.throws(
|
|
127
|
+
() => parseSelector('//div[constructor("alert(1)")()]'),
|
|
128
|
+
/XPath injection detected.*constructor\(/i
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('should be case-insensitive for security checks', () => {
|
|
133
|
+
assert.throws(
|
|
134
|
+
() => parseSelector('//div[@ONERROR="alert(1)"]'),
|
|
135
|
+
/XPath injection detected/i
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('should block extremely long selectors (DoS prevention)', () => {
|
|
140
|
+
const longSelector = '//' + 'a'.repeat(1001);
|
|
141
|
+
assert.throws(
|
|
142
|
+
() => parseSelector(longSelector),
|
|
143
|
+
/XPath selector too long/i
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('Edge Cases', () => {
|
|
149
|
+
it('should throw on empty string', () => {
|
|
150
|
+
assert.throws(
|
|
151
|
+
() => parseSelector(''),
|
|
152
|
+
/Selector must be a non-empty string/
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should throw on null', () => {
|
|
157
|
+
assert.throws(
|
|
158
|
+
() => parseSelector(null),
|
|
159
|
+
/Selector must be a non-empty string/
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should throw on undefined', () => {
|
|
164
|
+
assert.throws(
|
|
165
|
+
() => parseSelector(undefined),
|
|
166
|
+
/Selector must be a non-empty string/
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('should throw on non-string input', () => {
|
|
171
|
+
assert.throws(
|
|
172
|
+
() => parseSelector(123),
|
|
173
|
+
/Selector must be a non-empty string/
|
|
174
|
+
);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('should handle selectors with special characters', () => {
|
|
178
|
+
const result = parseSelector('button[data-test="submit-form"]');
|
|
179
|
+
assert.strictEqual(result.type, 'css');
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should allow safe XPath with parentheses', () => {
|
|
183
|
+
const result = parseSelector('//button[contains(text(),"Save")]');
|
|
184
|
+
assert.strictEqual(result.type, 'xpath');
|
|
185
|
+
// Should not throw
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
describe('Real-World Examples', () => {
|
|
190
|
+
it('should handle common button selector', () => {
|
|
191
|
+
const result = parseSelector('//button[contains(text(),"Submit")]');
|
|
192
|
+
assert.strictEqual(result.type, 'xpath');
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('should handle complex form selector', () => {
|
|
196
|
+
const result = parseSelector('//form[@id="login-form"]//input[@type="email"]');
|
|
197
|
+
assert.strictEqual(result.type, 'xpath');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('should handle descendant selector', () => {
|
|
201
|
+
const result = parseSelector('//div[@class="modal"]//button[@class="close"]');
|
|
202
|
+
assert.strictEqual(result.type, 'xpath');
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should handle nth-child equivalent', () => {
|
|
206
|
+
const result = parseSelector('(//li)[3]');
|
|
207
|
+
assert.strictEqual(result.type, 'xpath');
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
});
|