@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,362 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Get ARIA-based accessibility snapshot with stable element refs
|
|
4
|
+
* Usage: node aria-snapshot.js [--url https://example.com] [--output snapshot.yaml]
|
|
5
|
+
*
|
|
6
|
+
* Returns YAML-formatted accessibility tree with:
|
|
7
|
+
* - Semantic roles (button, link, textbox, heading, etc.)
|
|
8
|
+
* - Accessible names (what screen readers announce)
|
|
9
|
+
* - Element states (checked, disabled, expanded)
|
|
10
|
+
* - Stable refs [ref=eN] that persist for interaction
|
|
11
|
+
*
|
|
12
|
+
* Session behavior:
|
|
13
|
+
* By default, browser stays running for session persistence
|
|
14
|
+
* Use --close true to fully close browser
|
|
15
|
+
*/
|
|
16
|
+
import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
|
|
17
|
+
import fs from 'fs/promises';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
import { fileURLToPath } from 'url';
|
|
20
|
+
|
|
21
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get ARIA snapshot script to inject into page
|
|
25
|
+
* Builds YAML-formatted accessibility tree with element references
|
|
26
|
+
*/
|
|
27
|
+
function getAriaSnapshotScript() {
|
|
28
|
+
return `
|
|
29
|
+
(function() {
|
|
30
|
+
// Store refs on window for later retrieval via selectRef
|
|
31
|
+
window.__chromeDevToolsRefs = window.__chromeDevToolsRefs || new Map();
|
|
32
|
+
let refCounter = window.__chromeDevToolsRefCounter || 1;
|
|
33
|
+
|
|
34
|
+
// ARIA roles we care about for interaction
|
|
35
|
+
const INTERACTIVE_ROLES = new Set([
|
|
36
|
+
'button', 'link', 'textbox', 'checkbox', 'radio', 'combobox',
|
|
37
|
+
'listbox', 'option', 'menuitem', 'menuitemcheckbox', 'menuitemradio',
|
|
38
|
+
'tab', 'switch', 'slider', 'spinbutton', 'searchbox', 'tree', 'treeitem',
|
|
39
|
+
'grid', 'gridcell', 'row', 'rowheader', 'columnheader'
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
// Landmark roles for structure
|
|
43
|
+
const LANDMARK_ROLES = new Set([
|
|
44
|
+
'banner', 'navigation', 'main', 'complementary', 'contentinfo',
|
|
45
|
+
'search', 'form', 'region', 'article', 'dialog', 'alertdialog'
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
// Implicit ARIA roles from HTML elements
|
|
49
|
+
const IMPLICIT_ROLES = {
|
|
50
|
+
'A': (el) => el.href ? 'link' : null,
|
|
51
|
+
'BUTTON': () => 'button',
|
|
52
|
+
'INPUT': (el) => {
|
|
53
|
+
const type = el.type?.toLowerCase();
|
|
54
|
+
if (type === 'checkbox') return 'checkbox';
|
|
55
|
+
if (type === 'radio') return 'radio';
|
|
56
|
+
if (type === 'submit' || type === 'button' || type === 'reset') return 'button';
|
|
57
|
+
if (type === 'search') return 'searchbox';
|
|
58
|
+
if (type === 'range') return 'slider';
|
|
59
|
+
if (type === 'number') return 'spinbutton';
|
|
60
|
+
return 'textbox';
|
|
61
|
+
},
|
|
62
|
+
'TEXTAREA': () => 'textbox',
|
|
63
|
+
'SELECT': () => 'combobox',
|
|
64
|
+
'OPTION': () => 'option',
|
|
65
|
+
'IMG': () => 'img',
|
|
66
|
+
'NAV': () => 'navigation',
|
|
67
|
+
'MAIN': () => 'main',
|
|
68
|
+
'HEADER': () => 'banner',
|
|
69
|
+
'FOOTER': () => 'contentinfo',
|
|
70
|
+
'ASIDE': () => 'complementary',
|
|
71
|
+
'ARTICLE': () => 'article',
|
|
72
|
+
'SECTION': (el) => el.getAttribute('aria-label') || el.getAttribute('aria-labelledby') ? 'region' : null,
|
|
73
|
+
'FORM': () => 'form',
|
|
74
|
+
'UL': () => 'list',
|
|
75
|
+
'OL': () => 'list',
|
|
76
|
+
'LI': () => 'listitem',
|
|
77
|
+
'H1': () => 'heading',
|
|
78
|
+
'H2': () => 'heading',
|
|
79
|
+
'H3': () => 'heading',
|
|
80
|
+
'H4': () => 'heading',
|
|
81
|
+
'H5': () => 'heading',
|
|
82
|
+
'H6': () => 'heading',
|
|
83
|
+
'TABLE': () => 'table',
|
|
84
|
+
'TR': () => 'row',
|
|
85
|
+
'TH': () => 'columnheader',
|
|
86
|
+
'TD': () => 'cell',
|
|
87
|
+
'DIALOG': () => 'dialog'
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
function getRole(el) {
|
|
91
|
+
// Explicit role takes precedence
|
|
92
|
+
const explicitRole = el.getAttribute('role');
|
|
93
|
+
if (explicitRole) return explicitRole;
|
|
94
|
+
|
|
95
|
+
// Check implicit role
|
|
96
|
+
const implicitFn = IMPLICIT_ROLES[el.tagName];
|
|
97
|
+
if (implicitFn) return implicitFn(el);
|
|
98
|
+
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function getAccessibleName(el) {
|
|
103
|
+
// aria-label takes precedence
|
|
104
|
+
const ariaLabel = el.getAttribute('aria-label');
|
|
105
|
+
if (ariaLabel) return ariaLabel.trim();
|
|
106
|
+
|
|
107
|
+
// aria-labelledby
|
|
108
|
+
const labelledBy = el.getAttribute('aria-labelledby');
|
|
109
|
+
if (labelledBy) {
|
|
110
|
+
const labels = labelledBy.split(' ')
|
|
111
|
+
.map(id => document.getElementById(id)?.textContent?.trim())
|
|
112
|
+
.filter(Boolean)
|
|
113
|
+
.join(' ');
|
|
114
|
+
if (labels) return labels;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Input associated label
|
|
118
|
+
if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT') {
|
|
119
|
+
if (el.id) {
|
|
120
|
+
const label = document.querySelector('label[for="' + el.id + '"]');
|
|
121
|
+
if (label) return label.textContent?.trim();
|
|
122
|
+
}
|
|
123
|
+
// Check parent label
|
|
124
|
+
const parentLabel = el.closest('label');
|
|
125
|
+
if (parentLabel) {
|
|
126
|
+
const labelText = parentLabel.textContent?.replace(el.value || '', '')?.trim();
|
|
127
|
+
if (labelText) return labelText;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Button/link content
|
|
132
|
+
if (el.tagName === 'BUTTON' || el.tagName === 'A') {
|
|
133
|
+
const text = el.textContent?.trim();
|
|
134
|
+
if (text) return text.substring(0, 100);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Alt text for images
|
|
138
|
+
if (el.tagName === 'IMG') {
|
|
139
|
+
return el.alt || null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Title attribute fallback
|
|
143
|
+
if (el.title) return el.title.trim();
|
|
144
|
+
|
|
145
|
+
// Placeholder for inputs
|
|
146
|
+
if (el.placeholder) return null; // Return null, will add as /placeholder
|
|
147
|
+
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function getStateFlags(el) {
|
|
152
|
+
const flags = [];
|
|
153
|
+
|
|
154
|
+
// Checked state
|
|
155
|
+
if (el.checked || el.getAttribute('aria-checked') === 'true') {
|
|
156
|
+
flags.push('checked');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Disabled state
|
|
160
|
+
if (el.disabled || el.getAttribute('aria-disabled') === 'true') {
|
|
161
|
+
flags.push('disabled');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Expanded state
|
|
165
|
+
if (el.getAttribute('aria-expanded') === 'true') {
|
|
166
|
+
flags.push('expanded');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Selected state
|
|
170
|
+
if (el.selected || el.getAttribute('aria-selected') === 'true') {
|
|
171
|
+
flags.push('selected');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Pressed state
|
|
175
|
+
if (el.getAttribute('aria-pressed') === 'true') {
|
|
176
|
+
flags.push('pressed');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Required state
|
|
180
|
+
if (el.required || el.getAttribute('aria-required') === 'true') {
|
|
181
|
+
flags.push('required');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return flags;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function isVisible(el) {
|
|
188
|
+
const style = window.getComputedStyle(el);
|
|
189
|
+
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
190
|
+
const rect = el.getBoundingClientRect();
|
|
191
|
+
return rect.width > 0 && rect.height > 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function isInteractiveOrLandmark(role) {
|
|
195
|
+
return INTERACTIVE_ROLES.has(role) || LANDMARK_ROLES.has(role);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function shouldInclude(el) {
|
|
199
|
+
if (!isVisible(el)) return false;
|
|
200
|
+
const role = getRole(el);
|
|
201
|
+
if (!role) return false;
|
|
202
|
+
// Include interactive, landmarks, and structural elements
|
|
203
|
+
return isInteractiveOrLandmark(role) ||
|
|
204
|
+
role === 'heading' ||
|
|
205
|
+
role === 'img' ||
|
|
206
|
+
role === 'list' ||
|
|
207
|
+
role === 'listitem' ||
|
|
208
|
+
role === 'table' ||
|
|
209
|
+
role === 'row' ||
|
|
210
|
+
role === 'cell' ||
|
|
211
|
+
role === 'columnheader';
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function assignRef(el, role) {
|
|
215
|
+
// Only assign refs to interactive elements
|
|
216
|
+
if (!INTERACTIVE_ROLES.has(role)) return null;
|
|
217
|
+
|
|
218
|
+
const ref = 'e' + refCounter++;
|
|
219
|
+
window.__chromeDevToolsRefs.set(ref, el);
|
|
220
|
+
return ref;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function buildYaml(el, indent = 0) {
|
|
224
|
+
const role = getRole(el);
|
|
225
|
+
if (!role) return '';
|
|
226
|
+
|
|
227
|
+
const prefix = ' '.repeat(indent) + '- ';
|
|
228
|
+
const lines = [];
|
|
229
|
+
|
|
230
|
+
// Build the line: role "name" [flags] [ref=eN]
|
|
231
|
+
let line = prefix + role;
|
|
232
|
+
|
|
233
|
+
const name = getAccessibleName(el);
|
|
234
|
+
if (name) {
|
|
235
|
+
line += ' "' + name.replace(/"/g, '\\\\"') + '"';
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Add heading level
|
|
239
|
+
if (role === 'heading') {
|
|
240
|
+
const level = el.tagName.match(/H(\\d)/)?.[1] || el.getAttribute('aria-level');
|
|
241
|
+
if (level) line += ' [level=' + level + ']';
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Add state flags
|
|
245
|
+
const flags = getStateFlags(el);
|
|
246
|
+
flags.forEach(flag => {
|
|
247
|
+
line += ' [' + flag + ']';
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Add ref for interactive elements
|
|
251
|
+
const ref = assignRef(el, role);
|
|
252
|
+
if (ref) {
|
|
253
|
+
line += ' [ref=' + ref + ']';
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
lines.push(line);
|
|
257
|
+
|
|
258
|
+
// Add metadata on subsequent lines
|
|
259
|
+
if (el.tagName === 'A' && el.href) {
|
|
260
|
+
lines.push(' '.repeat(indent + 1) + '/url: ' + el.href);
|
|
261
|
+
}
|
|
262
|
+
if (el.placeholder) {
|
|
263
|
+
lines.push(' '.repeat(indent + 1) + '/placeholder: "' + el.placeholder + '"');
|
|
264
|
+
}
|
|
265
|
+
if (el.tagName === 'INPUT' && el.value && el.type !== 'password') {
|
|
266
|
+
lines.push(' '.repeat(indent + 1) + '/value: "' + el.value.substring(0, 50) + '"');
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Process children
|
|
270
|
+
const children = Array.from(el.children);
|
|
271
|
+
children.forEach(child => {
|
|
272
|
+
const childYaml = buildYaml(child, indent + 1);
|
|
273
|
+
if (childYaml) lines.push(childYaml);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
return lines.join('\\n');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function getSnapshot() {
|
|
280
|
+
const lines = [];
|
|
281
|
+
|
|
282
|
+
// Start from body
|
|
283
|
+
const children = Array.from(document.body.children);
|
|
284
|
+
children.forEach(child => {
|
|
285
|
+
const yaml = buildYaml(child, 0);
|
|
286
|
+
if (yaml) lines.push(yaml);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// Save ref counter for next snapshot
|
|
290
|
+
window.__chromeDevToolsRefCounter = refCounter;
|
|
291
|
+
|
|
292
|
+
return lines.join('\\n');
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return getSnapshot();
|
|
296
|
+
})();
|
|
297
|
+
`;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async function ariaSnapshot() {
|
|
301
|
+
const args = parseArgs(process.argv.slice(2));
|
|
302
|
+
|
|
303
|
+
try {
|
|
304
|
+
const browser = await getBrowser({
|
|
305
|
+
headless: args.headless !== 'false'
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const page = await getPage(browser);
|
|
309
|
+
|
|
310
|
+
// Navigate if URL provided
|
|
311
|
+
if (args.url) {
|
|
312
|
+
await page.goto(args.url, {
|
|
313
|
+
waitUntil: args['wait-until'] || 'networkidle2'
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Get ARIA snapshot
|
|
318
|
+
const snapshot = await page.evaluate(getAriaSnapshotScript());
|
|
319
|
+
|
|
320
|
+
// Build result
|
|
321
|
+
const result = {
|
|
322
|
+
success: true,
|
|
323
|
+
url: page.url(),
|
|
324
|
+
title: await page.title(),
|
|
325
|
+
format: 'yaml',
|
|
326
|
+
snapshot: snapshot
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
// Output to file or stdout
|
|
330
|
+
if (args.output) {
|
|
331
|
+
const outputPath = args.output;
|
|
332
|
+
|
|
333
|
+
// Ensure snapshots directory exists
|
|
334
|
+
const outputDir = path.dirname(outputPath);
|
|
335
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
336
|
+
|
|
337
|
+
// Write YAML snapshot
|
|
338
|
+
await fs.writeFile(outputPath, snapshot, 'utf8');
|
|
339
|
+
|
|
340
|
+
outputJSON({
|
|
341
|
+
success: true,
|
|
342
|
+
output: path.resolve(outputPath),
|
|
343
|
+
url: page.url()
|
|
344
|
+
});
|
|
345
|
+
} else {
|
|
346
|
+
// Output to stdout
|
|
347
|
+
outputJSON(result);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Default: disconnect to keep browser running for session persistence
|
|
351
|
+
// Use --close true to fully close browser
|
|
352
|
+
if (args.close === 'true') {
|
|
353
|
+
await closeBrowser();
|
|
354
|
+
} else {
|
|
355
|
+
await disconnectBrowser();
|
|
356
|
+
}
|
|
357
|
+
} catch (error) {
|
|
358
|
+
outputError(error);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
ariaSnapshot();
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Click an element
|
|
4
|
+
* Usage: node click.js --selector ".button" [--url https://example.com] [--wait-for ".result"]
|
|
5
|
+
* Supports both CSS and XPath selectors:
|
|
6
|
+
* - CSS: node click.js --selector "button.submit"
|
|
7
|
+
* - XPath: node click.js --selector "//button[contains(text(),'Submit')]"
|
|
8
|
+
*/
|
|
9
|
+
import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
|
|
10
|
+
import { parseSelector, waitForElement, clickElement, enhanceError } from './lib/selector.js';
|
|
11
|
+
|
|
12
|
+
async function click() {
|
|
13
|
+
const args = parseArgs(process.argv.slice(2));
|
|
14
|
+
|
|
15
|
+
if (!args.selector) {
|
|
16
|
+
outputError(new Error('--selector is required'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const browser = await getBrowser({
|
|
22
|
+
headless: args.headless !== 'false'
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const page = await getPage(browser);
|
|
26
|
+
|
|
27
|
+
// Navigate if URL provided
|
|
28
|
+
if (args.url) {
|
|
29
|
+
await page.goto(args.url, {
|
|
30
|
+
waitUntil: args['wait-until'] || 'networkidle2'
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Parse and validate selector
|
|
35
|
+
const parsed = parseSelector(args.selector);
|
|
36
|
+
|
|
37
|
+
// Wait for element based on selector type
|
|
38
|
+
await waitForElement(page, parsed, {
|
|
39
|
+
visible: true,
|
|
40
|
+
timeout: parseInt(args.timeout || '5000')
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Set up navigation promise BEFORE clicking (in case click triggers immediate navigation)
|
|
44
|
+
const navigationPromise = page.waitForNavigation({
|
|
45
|
+
waitUntil: 'load',
|
|
46
|
+
timeout: 5000
|
|
47
|
+
}).catch(() => null); // Catch timeout - navigation may not occur
|
|
48
|
+
|
|
49
|
+
// Click element
|
|
50
|
+
await clickElement(page, parsed);
|
|
51
|
+
|
|
52
|
+
// Wait for optional selector after click
|
|
53
|
+
if (args['wait-for']) {
|
|
54
|
+
await page.waitForSelector(args['wait-for'], {
|
|
55
|
+
timeout: parseInt(args.timeout || '5000')
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
// Wait for navigation to complete (or timeout if no navigation)
|
|
59
|
+
await navigationPromise;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
outputJSON({
|
|
63
|
+
success: true,
|
|
64
|
+
url: page.url(),
|
|
65
|
+
title: await page.title()
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Default: disconnect to keep browser running for session persistence
|
|
69
|
+
// Use --close true to fully close browser
|
|
70
|
+
if (args.close === 'true') {
|
|
71
|
+
await closeBrowser();
|
|
72
|
+
} else {
|
|
73
|
+
await disconnectBrowser();
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
// Enhance error message with troubleshooting tips
|
|
77
|
+
const enhanced = enhanceError(error, args.selector);
|
|
78
|
+
outputError(enhanced);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
click();
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Monitor console messages
|
|
4
|
+
* Usage: node console.js --url https://example.com [--types error,warn] [--duration 5000]
|
|
5
|
+
*/
|
|
6
|
+
import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
|
|
7
|
+
|
|
8
|
+
async function monitorConsole() {
|
|
9
|
+
const args = parseArgs(process.argv.slice(2));
|
|
10
|
+
|
|
11
|
+
if (!args.url) {
|
|
12
|
+
outputError(new Error('--url is required'));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const browser = await getBrowser({
|
|
18
|
+
headless: args.headless !== 'false'
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const page = await getPage(browser);
|
|
22
|
+
|
|
23
|
+
const messages = [];
|
|
24
|
+
const filterTypes = args.types ? args.types.split(',') : null;
|
|
25
|
+
|
|
26
|
+
// Listen for console messages
|
|
27
|
+
page.on('console', (msg) => {
|
|
28
|
+
const type = msg.type();
|
|
29
|
+
|
|
30
|
+
if (!filterTypes || filterTypes.includes(type)) {
|
|
31
|
+
messages.push({
|
|
32
|
+
type: type,
|
|
33
|
+
text: msg.text(),
|
|
34
|
+
location: msg.location(),
|
|
35
|
+
timestamp: Date.now()
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Listen for page errors
|
|
41
|
+
page.on('pageerror', (error) => {
|
|
42
|
+
messages.push({
|
|
43
|
+
type: 'pageerror',
|
|
44
|
+
text: error.message,
|
|
45
|
+
stack: error.stack,
|
|
46
|
+
timestamp: Date.now()
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Navigate
|
|
51
|
+
await page.goto(args.url, {
|
|
52
|
+
waitUntil: args['wait-until'] || 'networkidle2'
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Wait for additional time if specified
|
|
56
|
+
if (args.duration) {
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, parseInt(args.duration)));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
outputJSON({
|
|
61
|
+
success: true,
|
|
62
|
+
url: page.url(),
|
|
63
|
+
messageCount: messages.length,
|
|
64
|
+
messages: messages
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Default: disconnect to keep browser running for session persistence
|
|
68
|
+
// Use --close true to fully close browser
|
|
69
|
+
if (args.close === 'true') {
|
|
70
|
+
await closeBrowser();
|
|
71
|
+
} else {
|
|
72
|
+
await disconnectBrowser();
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
outputError(error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
monitorConsole();
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Execute JavaScript in page context
|
|
4
|
+
* Usage: node evaluate.js --script "document.title" [--url https://example.com]
|
|
5
|
+
*/
|
|
6
|
+
import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
|
|
7
|
+
|
|
8
|
+
async function evaluate() {
|
|
9
|
+
const args = parseArgs(process.argv.slice(2));
|
|
10
|
+
|
|
11
|
+
if (!args.script) {
|
|
12
|
+
outputError(new Error('--script is required'));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const browser = await getBrowser({
|
|
18
|
+
headless: args.headless !== 'false'
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const page = await getPage(browser);
|
|
22
|
+
|
|
23
|
+
// Navigate if URL provided
|
|
24
|
+
if (args.url) {
|
|
25
|
+
await page.goto(args.url, {
|
|
26
|
+
waitUntil: args['wait-until'] || 'networkidle2'
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const result = await page.evaluate((script) => {
|
|
31
|
+
// eslint-disable-next-line no-eval
|
|
32
|
+
return eval(script);
|
|
33
|
+
}, args.script);
|
|
34
|
+
|
|
35
|
+
outputJSON({
|
|
36
|
+
success: true,
|
|
37
|
+
result: result,
|
|
38
|
+
url: page.url()
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Default: disconnect to keep browser running for session persistence
|
|
42
|
+
// Use --close true to fully close browser
|
|
43
|
+
if (args.close === 'true') {
|
|
44
|
+
await closeBrowser();
|
|
45
|
+
} else {
|
|
46
|
+
await disconnectBrowser();
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
outputError(error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
evaluate();
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Fill form fields
|
|
4
|
+
* Usage: node fill.js --selector "#input" --value "text" [--url https://example.com]
|
|
5
|
+
* Supports both CSS and XPath selectors:
|
|
6
|
+
* - CSS: node fill.js --selector "#email" --value "user@example.com"
|
|
7
|
+
* - XPath: node fill.js --selector "//input[@type='email']" --value "user@example.com"
|
|
8
|
+
*/
|
|
9
|
+
import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
|
|
10
|
+
import { parseSelector, waitForElement, typeIntoElement, enhanceError } from './lib/selector.js';
|
|
11
|
+
|
|
12
|
+
async function fill() {
|
|
13
|
+
const args = parseArgs(process.argv.slice(2));
|
|
14
|
+
|
|
15
|
+
if (!args.selector) {
|
|
16
|
+
outputError(new Error('--selector is required'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!args.value) {
|
|
21
|
+
outputError(new Error('--value is required'));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const browser = await getBrowser({
|
|
27
|
+
headless: args.headless !== 'false'
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const page = await getPage(browser);
|
|
31
|
+
|
|
32
|
+
// Navigate if URL provided
|
|
33
|
+
if (args.url) {
|
|
34
|
+
await page.goto(args.url, {
|
|
35
|
+
waitUntil: args['wait-until'] || 'networkidle2'
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Parse and validate selector
|
|
40
|
+
const parsed = parseSelector(args.selector);
|
|
41
|
+
|
|
42
|
+
// Wait for element based on selector type
|
|
43
|
+
await waitForElement(page, parsed, {
|
|
44
|
+
visible: true,
|
|
45
|
+
timeout: parseInt(args.timeout || '5000')
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Type into element
|
|
49
|
+
await typeIntoElement(page, parsed, args.value, {
|
|
50
|
+
clear: args.clear === 'true',
|
|
51
|
+
delay: parseInt(args.delay || '0')
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
outputJSON({
|
|
55
|
+
success: true,
|
|
56
|
+
selector: args.selector,
|
|
57
|
+
value: args.value,
|
|
58
|
+
url: page.url()
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Default: disconnect to keep browser running for session persistence
|
|
62
|
+
// Use --close true to fully close browser
|
|
63
|
+
if (args.close === 'true') {
|
|
64
|
+
await closeBrowser();
|
|
65
|
+
} else {
|
|
66
|
+
await disconnectBrowser();
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
// Enhance error message with troubleshooting tips
|
|
70
|
+
const enhanced = enhanceError(error, args.selector);
|
|
71
|
+
outputError(enhanced);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
fill();
|