@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,1220 @@
|
|
|
1
|
+
# Skills Installation Script for Windows (PowerShell)
|
|
2
|
+
# Installs all dependencies for Claude Code skills
|
|
3
|
+
#
|
|
4
|
+
# Exit codes (rustup model):
|
|
5
|
+
# 0 = Success (full or partial)
|
|
6
|
+
# 1 = Fatal error (no Python, broken venv)
|
|
7
|
+
# 2 = Partial success (some optional deps failed)
|
|
8
|
+
|
|
9
|
+
param(
|
|
10
|
+
[switch]$SkipChocolatey = $false,
|
|
11
|
+
[switch]$Help = $false,
|
|
12
|
+
[switch]$Y = $false, # Skip all prompts and auto-confirm
|
|
13
|
+
[switch]$WithAdmin = $false, # Use admin-requiring package managers (choco)
|
|
14
|
+
[switch]$Resume = $false, # Resume from previous interrupted installation
|
|
15
|
+
[switch]$RetryFailed = $false # Retry previously failed packages
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# Configuration
|
|
19
|
+
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
20
|
+
$VenvDir = Join-Path $ScriptDir ".venv"
|
|
21
|
+
$StateFile = Join-Path $ScriptDir ".install-state.json"
|
|
22
|
+
$LogDir = Join-Path $VenvDir "logs"
|
|
23
|
+
$ErrorSummaryFile = Join-Path $ScriptDir ".install-error-summary.json"
|
|
24
|
+
|
|
25
|
+
# Check for NON_INTERACTIVE environment variable
|
|
26
|
+
if ($env:NON_INTERACTIVE -eq "1") {
|
|
27
|
+
$Y = $true
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# ============================================================================
|
|
31
|
+
# Installation Tracking Variables
|
|
32
|
+
# ============================================================================
|
|
33
|
+
$Script:INSTALLED_CRITICAL = [System.Collections.ArrayList]::new()
|
|
34
|
+
$Script:INSTALLED_OPTIONAL = [System.Collections.ArrayList]::new()
|
|
35
|
+
$Script:FAILED_OPTIONAL = [System.Collections.ArrayList]::new()
|
|
36
|
+
$Script:SKIPPED_ADMIN = [System.Collections.ArrayList]::new()
|
|
37
|
+
$Script:FINAL_EXIT_CODE = 0
|
|
38
|
+
|
|
39
|
+
# ============================================================================
|
|
40
|
+
# Tracking Functions
|
|
41
|
+
# ============================================================================
|
|
42
|
+
function Track-Success {
|
|
43
|
+
param(
|
|
44
|
+
[string]$Category, # "critical" or "optional"
|
|
45
|
+
[string]$Name
|
|
46
|
+
)
|
|
47
|
+
if ($Category -eq "critical") {
|
|
48
|
+
[void]$Script:INSTALLED_CRITICAL.Add($Name)
|
|
49
|
+
} else {
|
|
50
|
+
[void]$Script:INSTALLED_OPTIONAL.Add($Name)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function Track-Failure {
|
|
55
|
+
param(
|
|
56
|
+
[string]$Category, # "critical" or "optional"
|
|
57
|
+
[string]$Name,
|
|
58
|
+
[string]$Reason
|
|
59
|
+
)
|
|
60
|
+
if ($Category -eq "critical") {
|
|
61
|
+
$Script:FINAL_EXIT_CODE = 1
|
|
62
|
+
} else {
|
|
63
|
+
[void]$Script:FAILED_OPTIONAL.Add("${Name}: ${Reason}")
|
|
64
|
+
if ($Script:FINAL_EXIT_CODE -eq 0) {
|
|
65
|
+
$Script:FINAL_EXIT_CODE = 2
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function Track-Skipped {
|
|
71
|
+
param(
|
|
72
|
+
[string]$Name,
|
|
73
|
+
[string]$Reason
|
|
74
|
+
)
|
|
75
|
+
[void]$Script:SKIPPED_ADMIN.Add("${Name}: ${Reason}")
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# ============================================================================
|
|
79
|
+
# State Persistence Functions
|
|
80
|
+
# ============================================================================
|
|
81
|
+
function Initialize-State {
|
|
82
|
+
if ($Resume -and (Test-Path $StateFile)) {
|
|
83
|
+
Write-Info "Resuming from previous installation..."
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# Create fresh state
|
|
88
|
+
$state = @{
|
|
89
|
+
version = 1
|
|
90
|
+
started_at = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
|
|
91
|
+
last_updated = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
|
|
92
|
+
phases = @{
|
|
93
|
+
chocolatey = "pending"
|
|
94
|
+
system_deps = "pending"
|
|
95
|
+
node_deps = "pending"
|
|
96
|
+
python_env = "pending"
|
|
97
|
+
verify = "pending"
|
|
98
|
+
}
|
|
99
|
+
packages = @{
|
|
100
|
+
installed = @()
|
|
101
|
+
failed = @()
|
|
102
|
+
skipped = @()
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
$state | ConvertTo-Json -Depth 5 | Set-Content $StateFile -Encoding UTF8
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function Update-Phase {
|
|
109
|
+
param(
|
|
110
|
+
[string]$Phase,
|
|
111
|
+
[string]$Status
|
|
112
|
+
)
|
|
113
|
+
if (-not (Test-Path $StateFile)) {
|
|
114
|
+
return
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
$state = Get-Content $StateFile -Raw | ConvertFrom-Json
|
|
118
|
+
$state.phases.$Phase = $Status
|
|
119
|
+
$state.last_updated = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
|
|
120
|
+
$state | ConvertTo-Json -Depth 5 | Set-Content $StateFile -Encoding UTF8
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function Test-PhaseDone {
|
|
124
|
+
param([string]$Phase)
|
|
125
|
+
if (-not (Test-Path $StateFile)) {
|
|
126
|
+
return $false
|
|
127
|
+
}
|
|
128
|
+
$state = Get-Content $StateFile -Raw | ConvertFrom-Json
|
|
129
|
+
return ($state.phases.$Phase -eq "done")
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function Remove-StateFile {
|
|
133
|
+
if (Test-Path $StateFile) {
|
|
134
|
+
Remove-Item $StateFile -Force
|
|
135
|
+
Write-Info "Installation state cleaned (success)"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# Colors for output
|
|
140
|
+
function Write-Header {
|
|
141
|
+
param([string]$Message)
|
|
142
|
+
Write-Host ""
|
|
143
|
+
Write-Host "===================================================" -ForegroundColor Blue
|
|
144
|
+
Write-Host $Message -ForegroundColor Blue
|
|
145
|
+
Write-Host "===================================================" -ForegroundColor Blue
|
|
146
|
+
Write-Host ""
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function Write-Success {
|
|
150
|
+
param([string]$Message)
|
|
151
|
+
Write-Host "[OK] $Message" -ForegroundColor Green
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function Write-Warning {
|
|
155
|
+
param([string]$Message)
|
|
156
|
+
Write-Host "[WARN] $Message" -ForegroundColor Yellow
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function Write-Error {
|
|
160
|
+
param([string]$Message)
|
|
161
|
+
Write-Host "[ERROR] $Message" -ForegroundColor Red
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function Write-Info {
|
|
165
|
+
param([string]$Message)
|
|
166
|
+
Write-Host "[INFO] $Message" -ForegroundColor Cyan
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
# Check if running as Administrator
|
|
170
|
+
function Test-Administrator {
|
|
171
|
+
$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
|
|
172
|
+
$principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
|
|
173
|
+
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
# Check if command exists
|
|
177
|
+
function Test-Command {
|
|
178
|
+
param([string]$Command)
|
|
179
|
+
try {
|
|
180
|
+
if (Get-Command $Command -ErrorAction SilentlyContinue) {
|
|
181
|
+
return $true
|
|
182
|
+
}
|
|
183
|
+
} catch {
|
|
184
|
+
return $false
|
|
185
|
+
}
|
|
186
|
+
return $false
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Check if Visual Studio Build Tools are installed (not just in PATH)
|
|
190
|
+
# Returns $true if VS Build Tools are available for compilation
|
|
191
|
+
function Test-VSBuildTools {
|
|
192
|
+
# Quick check: if cl.exe or gcc is in PATH, we're good
|
|
193
|
+
if ((Test-Command "cl") -or (Test-Command "gcc")) {
|
|
194
|
+
return $true
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
# Check via vswhere.exe (most reliable method for VS detection)
|
|
198
|
+
$vswherePaths = @(
|
|
199
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe",
|
|
200
|
+
"${env:ProgramFiles}\Microsoft Visual Studio\Installer\vswhere.exe"
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
foreach ($vswhere in $vswherePaths) {
|
|
204
|
+
if (Test-Path $vswhere) {
|
|
205
|
+
try {
|
|
206
|
+
# Check for any VS installation with C++ build tools
|
|
207
|
+
$vsPath = & $vswhere -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath 2>$null
|
|
208
|
+
if ($vsPath -and (Test-Path $vsPath)) {
|
|
209
|
+
return $true
|
|
210
|
+
}
|
|
211
|
+
# Fallback: check for any VS installation
|
|
212
|
+
$vsPath = & $vswhere -latest -property installationPath 2>$null
|
|
213
|
+
if ($vsPath -and (Test-Path $vsPath)) {
|
|
214
|
+
return $true
|
|
215
|
+
}
|
|
216
|
+
} catch {
|
|
217
|
+
# vswhere failed, continue to fallback checks
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
# Fallback: check common VS Build Tools installation paths
|
|
223
|
+
$commonPaths = @(
|
|
224
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools",
|
|
225
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\Community",
|
|
226
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\Professional",
|
|
227
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\Enterprise",
|
|
228
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\BuildTools",
|
|
229
|
+
"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\Community"
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
foreach ($vsPath in $commonPaths) {
|
|
233
|
+
if (Test-Path $vsPath) {
|
|
234
|
+
# Check if VC tools exist in this installation
|
|
235
|
+
$vcToolsPath = Join-Path $vsPath "VC\Tools\MSVC"
|
|
236
|
+
if (Test-Path $vcToolsPath) {
|
|
237
|
+
return $true
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return $false
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
# Find Python executable, handling Windows Store aliases
|
|
246
|
+
# Returns: hashtable with 'Path' and 'Version', or $null if not found
|
|
247
|
+
function Find-Python {
|
|
248
|
+
# Priority 1: Check py launcher first (most reliable on Windows)
|
|
249
|
+
$py = Get-Command py -ErrorAction SilentlyContinue
|
|
250
|
+
if ($py) {
|
|
251
|
+
try {
|
|
252
|
+
$version = (& py --version 2>&1)
|
|
253
|
+
if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
|
|
254
|
+
return @{ Path = $py.Source; Version = $version; Command = "py" }
|
|
255
|
+
}
|
|
256
|
+
} catch { }
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
# Priority 2: Check common Python install paths
|
|
260
|
+
$commonPaths = @(
|
|
261
|
+
"$env:LOCALAPPDATA\Programs\Python\Python3*\python.exe",
|
|
262
|
+
"$env:LOCALAPPDATA\Programs\Python\Python*\python.exe",
|
|
263
|
+
"C:\Python3*\python.exe",
|
|
264
|
+
"C:\Python*\python.exe",
|
|
265
|
+
"$env:ProgramFiles\Python3*\python.exe",
|
|
266
|
+
"$env:ProgramFiles\Python*\python.exe",
|
|
267
|
+
"$env:ProgramFiles(x86)\Python3*\python.exe"
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
foreach ($pathPattern in $commonPaths) {
|
|
271
|
+
$found = Get-Item $pathPattern -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1
|
|
272
|
+
if ($found) {
|
|
273
|
+
try {
|
|
274
|
+
$version = (& $found.FullName --version 2>&1)
|
|
275
|
+
if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
|
|
276
|
+
return @{ Path = $found.FullName; Version = $version; Command = $found.FullName }
|
|
277
|
+
}
|
|
278
|
+
} catch { }
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
# Priority 3: Check PATH but detect Windows Store alias
|
|
283
|
+
$python = Get-Command python -ErrorAction SilentlyContinue
|
|
284
|
+
if ($python) {
|
|
285
|
+
# Detect Windows Store alias (points to WindowsApps)
|
|
286
|
+
if ($python.Source -like "*WindowsApps*") {
|
|
287
|
+
Write-Warning "Windows Store Python alias detected at: $($python.Source)"
|
|
288
|
+
Write-Warning "This alias redirects to Microsoft Store instead of running Python."
|
|
289
|
+
Write-Info "To fix this, either:"
|
|
290
|
+
Write-Info " 1. Install Python from https://www.python.org/downloads/"
|
|
291
|
+
Write-Info " 2. Or disable the alias: Settings > Apps > Advanced app settings > App execution aliases"
|
|
292
|
+
Write-Info " Then turn off 'python.exe' and 'python3.exe'"
|
|
293
|
+
return $null
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
# Valid Python in PATH
|
|
297
|
+
try {
|
|
298
|
+
$version = (& python --version 2>&1)
|
|
299
|
+
if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
|
|
300
|
+
return @{ Path = $python.Source; Version = $version; Command = "python" }
|
|
301
|
+
}
|
|
302
|
+
} catch { }
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
# Priority 4: Try python3 command
|
|
306
|
+
$python3 = Get-Command python3 -ErrorAction SilentlyContinue
|
|
307
|
+
if ($python3 -and -not ($python3.Source -like "*WindowsApps*")) {
|
|
308
|
+
try {
|
|
309
|
+
$version = (& python3 --version 2>&1)
|
|
310
|
+
if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
|
|
311
|
+
return @{ Path = $python3.Source; Version = $version; Command = "python3" }
|
|
312
|
+
}
|
|
313
|
+
} catch { }
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return $null
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
# Get available package manager (priority: winget > scoop > choco)
|
|
320
|
+
function Get-PackageManager {
|
|
321
|
+
if (Test-Command "winget") { return "winget" }
|
|
322
|
+
if (Test-Command "scoop") { return "scoop" }
|
|
323
|
+
if (Test-Command "choco") { return "choco" }
|
|
324
|
+
return $null
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
# Install package using available package manager
|
|
328
|
+
# Returns $true if installed, $false if failed
|
|
329
|
+
# Now with tracking support
|
|
330
|
+
function Install-WithPackageManager {
|
|
331
|
+
param(
|
|
332
|
+
[string]$DisplayName,
|
|
333
|
+
[string]$WingetId,
|
|
334
|
+
[string]$ChocoName,
|
|
335
|
+
[string]$ScoopName,
|
|
336
|
+
[string]$ManualUrl,
|
|
337
|
+
[string]$Category = "optional" # "critical" or "optional"
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
$pm = Get-PackageManager
|
|
341
|
+
|
|
342
|
+
switch ($pm) {
|
|
343
|
+
"winget" {
|
|
344
|
+
Write-Info "Installing $DisplayName via winget..."
|
|
345
|
+
# Try user scope first, fallback to machine scope
|
|
346
|
+
winget install $WingetId --silent --accept-package-agreements --accept-source-agreements --scope user 2>$null
|
|
347
|
+
if ($LASTEXITCODE -ne 0) {
|
|
348
|
+
# Retry without scope restriction (some packages only support machine-wide)
|
|
349
|
+
winget install $WingetId --silent --accept-package-agreements --accept-source-agreements 2>$null
|
|
350
|
+
}
|
|
351
|
+
if ($LASTEXITCODE -eq 0) {
|
|
352
|
+
Write-Success "$DisplayName installed via winget"
|
|
353
|
+
Track-Success -Category $Category -Name $DisplayName
|
|
354
|
+
return $true
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
"scoop" {
|
|
358
|
+
Write-Info "Installing $DisplayName via scoop..."
|
|
359
|
+
scoop install $ScoopName 2>$null
|
|
360
|
+
if ($LASTEXITCODE -eq 0) {
|
|
361
|
+
Write-Success "$DisplayName installed via scoop"
|
|
362
|
+
Track-Success -Category $Category -Name $DisplayName
|
|
363
|
+
return $true
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
"choco" {
|
|
367
|
+
if ($WithAdmin -and (Test-Administrator)) {
|
|
368
|
+
Write-Info "Installing $DisplayName via chocolatey..."
|
|
369
|
+
choco install $ChocoName -y 2>$null
|
|
370
|
+
if ($LASTEXITCODE -eq 0) {
|
|
371
|
+
Write-Success "$DisplayName installed via chocolatey"
|
|
372
|
+
Track-Success -Category $Category -Name $DisplayName
|
|
373
|
+
return $true
|
|
374
|
+
}
|
|
375
|
+
} elseif (-not $WithAdmin) {
|
|
376
|
+
Write-Info "${DisplayName}: skipped (no -WithAdmin flag)"
|
|
377
|
+
Track-Skipped -Name $DisplayName -Reason "requires admin"
|
|
378
|
+
return $false
|
|
379
|
+
} else {
|
|
380
|
+
Write-Warning "Chocolatey requires admin. Skipping $DisplayName..."
|
|
381
|
+
Track-Skipped -Name $DisplayName -Reason "not running as admin"
|
|
382
|
+
return $false
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
Write-Warning "$DisplayName not installed. Install manually from: $ManualUrl"
|
|
388
|
+
Track-Failure -Category $Category -Name $DisplayName -Reason "installation failed"
|
|
389
|
+
return $false
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
# Get user input with support for redirected stdin
|
|
393
|
+
function Get-UserInput {
|
|
394
|
+
param(
|
|
395
|
+
[string]$Prompt,
|
|
396
|
+
[string]$Default = "N"
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
# Check if stdin is redirected (e.g., from Bash tool or piped input)
|
|
400
|
+
if ([Console]::IsInputRedirected) {
|
|
401
|
+
Write-Host "$Prompt " -NoNewline
|
|
402
|
+
|
|
403
|
+
# Try to read from stdin without blocking
|
|
404
|
+
$inputAvailable = $false
|
|
405
|
+
try {
|
|
406
|
+
$stdin = [Console]::In
|
|
407
|
+
# Peek returns -1 if no data available
|
|
408
|
+
if ($stdin.Peek() -ne -1) {
|
|
409
|
+
$response = $stdin.ReadLine()
|
|
410
|
+
$inputAvailable = $true
|
|
411
|
+
Write-Host $response
|
|
412
|
+
}
|
|
413
|
+
} catch {
|
|
414
|
+
# If peek fails, no input available
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if ($inputAvailable -and $response) {
|
|
418
|
+
return $response
|
|
419
|
+
} else {
|
|
420
|
+
# No input available, use default
|
|
421
|
+
Write-Host $Default
|
|
422
|
+
Write-Warning "No input detected (stdin redirected), using default: $Default"
|
|
423
|
+
return $Default
|
|
424
|
+
}
|
|
425
|
+
} else {
|
|
426
|
+
# Normal interactive mode - use standard Read-Host
|
|
427
|
+
return Read-Host $Prompt
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
# Install Chocolatey (optional - only if admin and no better PM available)
|
|
432
|
+
function Install-Chocolatey {
|
|
433
|
+
if ($SkipChocolatey) {
|
|
434
|
+
Write-Warning "Skipping Chocolatey installation (--SkipChocolatey flag)"
|
|
435
|
+
return $false
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (Test-Command "choco") {
|
|
439
|
+
Write-Success "Chocolatey already installed"
|
|
440
|
+
return $true
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
# Check if we have winget/scoop - no need for choco then
|
|
444
|
+
if ((Test-Command "winget") -or (Test-Command "scoop")) {
|
|
445
|
+
$pm = Get-PackageManager
|
|
446
|
+
Write-Info "Using $pm as package manager (Chocolatey not needed)"
|
|
447
|
+
return $false
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
# Only try to install choco if we're admin and have no other PM
|
|
451
|
+
if (-not (Test-Administrator)) {
|
|
452
|
+
Write-Warning "No package manager found. Options:"
|
|
453
|
+
Write-Info " 1. Run as Administrator to install Chocolatey"
|
|
454
|
+
Write-Info " 2. Install winget (recommended): https://aka.ms/getwinget"
|
|
455
|
+
Write-Info " 3. Install scoop: irm get.scoop.sh | iex"
|
|
456
|
+
return $false
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
Write-Info "Installing Chocolatey package manager..."
|
|
460
|
+
|
|
461
|
+
# Wrap Set-ExecutionPolicy in try-catch (may fail in some PS7 environments)
|
|
462
|
+
try {
|
|
463
|
+
Set-ExecutionPolicy Bypass -Scope Process -Force
|
|
464
|
+
} catch {
|
|
465
|
+
Write-Warning "Could not set execution policy: $($_.Exception.Message)"
|
|
466
|
+
Write-Info "Continuing anyway - Chocolatey install may prompt for confirmation"
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
try {
|
|
470
|
+
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
|
471
|
+
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
|
472
|
+
Write-Success "Chocolatey installed"
|
|
473
|
+
return $true
|
|
474
|
+
} catch {
|
|
475
|
+
Write-Warning "Failed to install Chocolatey: $($_.Exception.Message)"
|
|
476
|
+
return $false
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
# Install system dependencies
|
|
481
|
+
function Install-SystemDeps {
|
|
482
|
+
Write-Header "Installing System Dependencies"
|
|
483
|
+
|
|
484
|
+
$pm = Get-PackageManager
|
|
485
|
+
if ($pm) {
|
|
486
|
+
Write-Info "Using package manager: $pm"
|
|
487
|
+
} else {
|
|
488
|
+
Write-Warning "No package manager found. Will provide manual install instructions."
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
# FFmpeg
|
|
492
|
+
if (Test-Command "ffmpeg") {
|
|
493
|
+
$ffmpegVersion = (ffmpeg -version 2>&1 | Select-Object -First 1)
|
|
494
|
+
Write-Success "FFmpeg already installed ($ffmpegVersion)"
|
|
495
|
+
Track-Success -Category "optional" -Name "FFmpeg"
|
|
496
|
+
} else {
|
|
497
|
+
$null = Install-WithPackageManager `
|
|
498
|
+
-DisplayName "FFmpeg" `
|
|
499
|
+
-WingetId "Gyan.FFmpeg" `
|
|
500
|
+
-ChocoName "ffmpeg" `
|
|
501
|
+
-ScoopName "ffmpeg" `
|
|
502
|
+
-ManualUrl "https://ffmpeg.org/download.html" `
|
|
503
|
+
-Category "optional"
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
# ImageMagick
|
|
507
|
+
if (Test-Command "magick") {
|
|
508
|
+
Write-Success "ImageMagick already installed"
|
|
509
|
+
Track-Success -Category "optional" -Name "ImageMagick"
|
|
510
|
+
} else {
|
|
511
|
+
$null = Install-WithPackageManager `
|
|
512
|
+
-DisplayName "ImageMagick" `
|
|
513
|
+
-WingetId "ImageMagick.ImageMagick" `
|
|
514
|
+
-ChocoName "imagemagick" `
|
|
515
|
+
-ScoopName "imagemagick" `
|
|
516
|
+
-ManualUrl "https://imagemagick.org/script/download.php" `
|
|
517
|
+
-Category "optional"
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
# Docker (optional)
|
|
521
|
+
if (Test-Command "docker") {
|
|
522
|
+
$dockerVersion = (docker --version)
|
|
523
|
+
Write-Success "Docker already installed ($dockerVersion)"
|
|
524
|
+
Track-Success -Category "optional" -Name "Docker"
|
|
525
|
+
} else {
|
|
526
|
+
Write-Warning "Docker not found. Skipping (optional)..."
|
|
527
|
+
Write-Info "Install Docker from: https://docs.docker.com/desktop/install/windows-install/"
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
# Install Node.js and npm packages
|
|
532
|
+
function Install-NodeDeps {
|
|
533
|
+
Write-Header "Installing Node.js Dependencies"
|
|
534
|
+
|
|
535
|
+
# Check Node.js
|
|
536
|
+
if (Test-Command "node") {
|
|
537
|
+
$nodeVersion = (node --version)
|
|
538
|
+
Write-Success "Node.js already installed ($nodeVersion)"
|
|
539
|
+
} else {
|
|
540
|
+
$installed = Install-WithPackageManager `
|
|
541
|
+
-DisplayName "Node.js" `
|
|
542
|
+
-WingetId "OpenJS.NodeJS.LTS" `
|
|
543
|
+
-ChocoName "nodejs-lts" `
|
|
544
|
+
-ScoopName "nodejs-lts" `
|
|
545
|
+
-ManualUrl "https://nodejs.org/"
|
|
546
|
+
|
|
547
|
+
if (-not $installed) {
|
|
548
|
+
Write-Error "Node.js is required but could not be installed"
|
|
549
|
+
Write-Info "Please install Node.js manually and re-run this script"
|
|
550
|
+
exit 1
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
# Refresh PATH after Node.js install
|
|
554
|
+
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
# Install global npm packages
|
|
558
|
+
Write-Info "Installing global npm packages..."
|
|
559
|
+
|
|
560
|
+
$npmPackages = @(
|
|
561
|
+
"rmbg-cli",
|
|
562
|
+
"pnpm",
|
|
563
|
+
"wrangler",
|
|
564
|
+
"repomix"
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
foreach ($package in $npmPackages) {
|
|
568
|
+
try {
|
|
569
|
+
$installed = npm list -g $package 2>&1
|
|
570
|
+
if ($LASTEXITCODE -eq 0) {
|
|
571
|
+
Write-Success "$package already installed"
|
|
572
|
+
} else {
|
|
573
|
+
Write-Info "Installing $package..."
|
|
574
|
+
npm install -g $package
|
|
575
|
+
Write-Success "$package installed"
|
|
576
|
+
}
|
|
577
|
+
} catch {
|
|
578
|
+
Write-Info "Installing $package..."
|
|
579
|
+
npm install -g $package
|
|
580
|
+
Write-Success "$package installed"
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
# Install local npm packages for skills
|
|
585
|
+
Write-Info "Installing local npm packages for skills..."
|
|
586
|
+
|
|
587
|
+
# chrome-devtools
|
|
588
|
+
$chromeDevToolsPath = Join-Path $ScriptDir "chrome-devtools\scripts"
|
|
589
|
+
$chromePackageJson = Join-Path $chromeDevToolsPath "package.json"
|
|
590
|
+
if ((Test-Path $chromeDevToolsPath) -and (Test-Path $chromePackageJson)) {
|
|
591
|
+
Write-Info "Installing chrome-devtools dependencies..."
|
|
592
|
+
Push-Location $chromeDevToolsPath
|
|
593
|
+
npm install --quiet
|
|
594
|
+
Pop-Location
|
|
595
|
+
Write-Success "chrome-devtools dependencies installed"
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
# sequential-thinking
|
|
599
|
+
$seqThinkingPath = Join-Path $ScriptDir "sequential-thinking"
|
|
600
|
+
$seqPackageJson = Join-Path $seqThinkingPath "package.json"
|
|
601
|
+
if ((Test-Path $seqThinkingPath) -and (Test-Path $seqPackageJson)) {
|
|
602
|
+
Write-Info "Installing sequential-thinking dependencies..."
|
|
603
|
+
Push-Location $seqThinkingPath
|
|
604
|
+
npm install --quiet
|
|
605
|
+
Pop-Location
|
|
606
|
+
Write-Success "sequential-thinking dependencies installed"
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
# mcp-management
|
|
610
|
+
$mcpManagementPath = Join-Path $ScriptDir "mcp-management\scripts"
|
|
611
|
+
$mcpPackageJson = Join-Path $mcpManagementPath "package.json"
|
|
612
|
+
if ((Test-Path $mcpManagementPath) -and (Test-Path $mcpPackageJson)) {
|
|
613
|
+
Write-Info "Installing mcp-management dependencies..."
|
|
614
|
+
Push-Location $mcpManagementPath
|
|
615
|
+
npm install --quiet
|
|
616
|
+
Pop-Location
|
|
617
|
+
Write-Success "mcp-management dependencies installed"
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
# markdown-novel-viewer (marked, highlight.js, gray-matter)
|
|
621
|
+
$novelViewerPath = Join-Path $ScriptDir "markdown-novel-viewer"
|
|
622
|
+
$novelViewerPackageJson = Join-Path $novelViewerPath "package.json"
|
|
623
|
+
if ((Test-Path $novelViewerPath) -and (Test-Path $novelViewerPackageJson)) {
|
|
624
|
+
Write-Info "Installing markdown-novel-viewer dependencies..."
|
|
625
|
+
Push-Location $novelViewerPath
|
|
626
|
+
npm install --quiet
|
|
627
|
+
Pop-Location
|
|
628
|
+
Write-Success "markdown-novel-viewer dependencies installed"
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
# plans-kanban (gray-matter)
|
|
632
|
+
$plansKanbanPath = Join-Path $ScriptDir "plans-kanban"
|
|
633
|
+
$plansKanbanPackageJson = Join-Path $plansKanbanPath "package.json"
|
|
634
|
+
if ((Test-Path $plansKanbanPath) -and (Test-Path $plansKanbanPackageJson)) {
|
|
635
|
+
Write-Info "Installing plans-kanban dependencies..."
|
|
636
|
+
Push-Location $plansKanbanPath
|
|
637
|
+
npm install --quiet
|
|
638
|
+
Pop-Location
|
|
639
|
+
Write-Success "plans-kanban dependencies installed"
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
# Optional: Shopify CLI (ask user unless auto-confirming)
|
|
643
|
+
$shopifyPath = Join-Path $ScriptDir "shopify"
|
|
644
|
+
if (Test-Path $shopifyPath) {
|
|
645
|
+
if ($Y) {
|
|
646
|
+
Write-Info "Skipping Shopify CLI installation (optional, use -Y to install all)"
|
|
647
|
+
} else {
|
|
648
|
+
$confirmation = Get-UserInput -Prompt "Install Shopify CLI for Shopify skill? (y/N)" -Default "N"
|
|
649
|
+
if ($confirmation -eq 'y' -or $confirmation -eq 'Y') {
|
|
650
|
+
Write-Info "Installing Shopify CLI..."
|
|
651
|
+
npm install -g @shopify/cli @shopify/theme
|
|
652
|
+
Write-Success "Shopify CLI installed"
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
# Try pip install with wheel-first fallback
|
|
659
|
+
# Returns $true if successful, $false otherwise
|
|
660
|
+
function Try-PipInstall {
|
|
661
|
+
param(
|
|
662
|
+
[string]$PackageSpec,
|
|
663
|
+
[string]$LogFile
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
$packageName = ($PackageSpec -split '[=<>]')[0]
|
|
667
|
+
|
|
668
|
+
# Phase 1: Try with prefer-binary (wheels first)
|
|
669
|
+
$output = pip install $PackageSpec --prefer-binary 2>&1
|
|
670
|
+
$output | Out-File -Append $LogFile -Encoding UTF8
|
|
671
|
+
if ($LASTEXITCODE -eq 0) {
|
|
672
|
+
return $true
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
# Phase 2: Check if we can build from source (uses vswhere for proper VS detection)
|
|
676
|
+
if (-not (Test-VSBuildTools)) {
|
|
677
|
+
Write-Warning "${packageName}: No wheel available, no build tools detected"
|
|
678
|
+
Write-Info "Install Visual Studio Build Tools from: https://visualstudio.microsoft.com/visual-cpp-build-tools/"
|
|
679
|
+
return $false
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
# Phase 3: Try source build
|
|
683
|
+
Write-Info "Trying source build for $packageName..."
|
|
684
|
+
$output = pip install $PackageSpec --no-binary $packageName 2>&1
|
|
685
|
+
$output | Out-File -Append $LogFile -Encoding UTF8
|
|
686
|
+
if ($LASTEXITCODE -eq 0) {
|
|
687
|
+
Write-Success "$packageName installed (source build)"
|
|
688
|
+
return $true
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
Write-Error "${packageName}: Both wheel and source build failed"
|
|
692
|
+
return $false
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
# Setup Python virtual environment
|
|
696
|
+
function Setup-PythonEnv {
|
|
697
|
+
Write-Header "Setting Up Python Environment"
|
|
698
|
+
|
|
699
|
+
# Track successful and failed installations
|
|
700
|
+
$successfulSkills = [System.Collections.ArrayList]::new()
|
|
701
|
+
$failedSkills = [System.Collections.ArrayList]::new()
|
|
702
|
+
|
|
703
|
+
# Find Python using robust detection (handles Windows Store aliases)
|
|
704
|
+
$pythonInfo = Find-Python
|
|
705
|
+
if ($pythonInfo) {
|
|
706
|
+
Write-Success "Python found ($($pythonInfo.Version))"
|
|
707
|
+
Write-Info "Using: $($pythonInfo.Command)"
|
|
708
|
+
$pythonCmd = $pythonInfo.Command
|
|
709
|
+
} else {
|
|
710
|
+
Write-Error "Python not found or only Windows Store alias detected."
|
|
711
|
+
Write-Info "Please install Python 3.7+ from: https://www.python.org/downloads/"
|
|
712
|
+
Write-Info "Make sure to check 'Add Python to PATH' during installation"
|
|
713
|
+
Track-Failure -Category "critical" -Name "Python" -Reason "not installed or Store alias"
|
|
714
|
+
return # Don't exit, return and let final report show
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
# Create virtual environment
|
|
718
|
+
if (Test-Path $VenvDir) {
|
|
719
|
+
# Verify venv is valid
|
|
720
|
+
$activateScript = Join-Path $VenvDir "Scripts\Activate.ps1"
|
|
721
|
+
$pythonExe = Join-Path $VenvDir "Scripts\python.exe"
|
|
722
|
+
if ((Test-Path $activateScript) -and (Test-Path $pythonExe)) {
|
|
723
|
+
Write-Success "Virtual environment already exists at $VenvDir"
|
|
724
|
+
} else {
|
|
725
|
+
Write-Warning "Virtual environment is corrupted. Recreating..."
|
|
726
|
+
Remove-Item -Recurse -Force $VenvDir
|
|
727
|
+
& $pythonCmd -m venv $VenvDir
|
|
728
|
+
Write-Success "Virtual environment recreated"
|
|
729
|
+
}
|
|
730
|
+
} else {
|
|
731
|
+
Write-Info "Creating virtual environment at $VenvDir..."
|
|
732
|
+
& $pythonCmd -m venv $VenvDir
|
|
733
|
+
if ($LASTEXITCODE -eq 0) {
|
|
734
|
+
Write-Success "Virtual environment created"
|
|
735
|
+
} else {
|
|
736
|
+
Write-Error "Failed to create virtual environment"
|
|
737
|
+
Track-Failure -Category "critical" -Name "Python venv" -Reason "venv creation failed"
|
|
738
|
+
return
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
# Create log directory
|
|
743
|
+
if (-not (Test-Path $LogDir)) {
|
|
744
|
+
New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
# Activate and install packages
|
|
748
|
+
Write-Info "Activating virtual environment..."
|
|
749
|
+
$activateScript = Join-Path $VenvDir "Scripts\Activate.ps1"
|
|
750
|
+
|
|
751
|
+
if (Test-Path $activateScript) {
|
|
752
|
+
& $activateScript
|
|
753
|
+
} else {
|
|
754
|
+
Write-Error "Failed to find activation script at $activateScript"
|
|
755
|
+
Track-Failure -Category "critical" -Name "Python venv" -Reason "activation failed"
|
|
756
|
+
return
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
# Upgrade pip with prefer-binary
|
|
760
|
+
Write-Info "Upgrading pip..."
|
|
761
|
+
$pipLogFile = Join-Path $LogDir "pip-upgrade.log"
|
|
762
|
+
pip install --upgrade pip --prefer-binary 2>&1 | Tee-Object -FilePath $pipLogFile
|
|
763
|
+
if ($LASTEXITCODE -eq 0) {
|
|
764
|
+
Write-Success "pip upgraded successfully"
|
|
765
|
+
} else {
|
|
766
|
+
Write-Warning "pip upgrade failed (continuing anyway)"
|
|
767
|
+
Write-Info "See log: $pipLogFile"
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
# Install dependencies from all skills' requirements.txt files
|
|
771
|
+
Write-Info "Installing Python dependencies from all skills..."
|
|
772
|
+
|
|
773
|
+
$installedCount = 0
|
|
774
|
+
Get-ChildItem -Path $ScriptDir -Directory | ForEach-Object {
|
|
775
|
+
$skillName = $_.Name
|
|
776
|
+
|
|
777
|
+
# Skip .venv and document-skills
|
|
778
|
+
if ($skillName -eq ".venv" -or $skillName -eq "document-skills") {
|
|
779
|
+
return
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
# Install main requirements.txt with wheel-first approach
|
|
783
|
+
$requirementsPath = Join-Path $_.FullName "scripts\requirements.txt"
|
|
784
|
+
if (Test-Path $requirementsPath) {
|
|
785
|
+
$skillLogFile = Join-Path $LogDir "install-${skillName}.log"
|
|
786
|
+
Write-Info "Installing $skillName dependencies..."
|
|
787
|
+
|
|
788
|
+
# Read requirements and install one-by-one for granular tracking
|
|
789
|
+
$pkgSuccess = 0
|
|
790
|
+
$pkgFail = 0
|
|
791
|
+
Get-Content $requirementsPath | ForEach-Object {
|
|
792
|
+
$line = $_.Trim()
|
|
793
|
+
# Skip comments and empty lines
|
|
794
|
+
if ($line -match '^#' -or [string]::IsNullOrWhiteSpace($line)) {
|
|
795
|
+
return
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
# Strip inline comments (e.g., "package>=1.0 # comment" -> "package>=1.0")
|
|
799
|
+
$line = ($line -split '#')[0].Trim()
|
|
800
|
+
if ([string]::IsNullOrWhiteSpace($line)) {
|
|
801
|
+
return
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
if (Try-PipInstall -PackageSpec $line -LogFile $skillLogFile) {
|
|
805
|
+
$pkgSuccess++
|
|
806
|
+
} else {
|
|
807
|
+
$pkgFail++
|
|
808
|
+
Track-Failure -Category "optional" -Name "${skillName}:${line}" -Reason "Package install failed"
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
if ($pkgFail -eq 0) {
|
|
813
|
+
Write-Success "${skillName}: all $pkgSuccess packages installed"
|
|
814
|
+
Track-Success -Category "optional" -Name $skillName
|
|
815
|
+
[void]$successfulSkills.Add($skillName)
|
|
816
|
+
$installedCount++
|
|
817
|
+
} else {
|
|
818
|
+
Write-Warning "${skillName}: $pkgSuccess installed, $pkgFail failed"
|
|
819
|
+
[void]$failedSkills.Add($skillName)
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
# Install test requirements.txt
|
|
824
|
+
$testRequirementsPath = Join-Path $_.FullName "scripts\tests\requirements.txt"
|
|
825
|
+
if (Test-Path $testRequirementsPath) {
|
|
826
|
+
$testLogFile = Join-Path $LogDir "install-${skillName}-tests.log"
|
|
827
|
+
Write-Info "Installing $skillName test dependencies..."
|
|
828
|
+
|
|
829
|
+
pip install -r $testRequirementsPath --prefer-binary 2>&1 | Tee-Object -FilePath $testLogFile
|
|
830
|
+
if ($LASTEXITCODE -eq 0) {
|
|
831
|
+
Write-Success "$skillName test dependencies installed successfully"
|
|
832
|
+
} else {
|
|
833
|
+
Write-Warning "$skillName test dependencies failed to install"
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
# Install %USERPROFILE%/.claude/scripts requirements (contains pyyaml for generate_catalogs.py)
|
|
839
|
+
$scriptsReqPath = Join-Path $ScriptDir "..\scripts\requirements.txt"
|
|
840
|
+
if (Test-Path $scriptsReqPath) {
|
|
841
|
+
$scriptsLogFile = Join-Path $LogDir "install-scripts.log"
|
|
842
|
+
Write-Info "Installing %USERPROFILE%/.claude/scripts dependencies..."
|
|
843
|
+
|
|
844
|
+
$pkgSuccess = 0
|
|
845
|
+
$pkgFail = 0
|
|
846
|
+
Get-Content $scriptsReqPath | ForEach-Object {
|
|
847
|
+
$line = $_.Trim()
|
|
848
|
+
if ($line -match '^#' -or [string]::IsNullOrWhiteSpace($line)) {
|
|
849
|
+
return
|
|
850
|
+
}
|
|
851
|
+
$line = ($line -split '#')[0].Trim()
|
|
852
|
+
if ([string]::IsNullOrWhiteSpace($line)) {
|
|
853
|
+
return
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
if (Try-PipInstall -PackageSpec $line -LogFile $scriptsLogFile) {
|
|
857
|
+
$pkgSuccess++
|
|
858
|
+
} else {
|
|
859
|
+
$pkgFail++
|
|
860
|
+
Track-Failure -Category "optional" -Name "scripts:${line}" -Reason "Package install failed"
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
if ($pkgFail -eq 0) {
|
|
865
|
+
Write-Success "%USERPROFILE%/.claude/scripts: all $pkgSuccess packages installed"
|
|
866
|
+
Track-Success -Category "optional" -Name "scripts"
|
|
867
|
+
} else {
|
|
868
|
+
Write-Warning "%USERPROFILE%/.claude/scripts: $pkgSuccess installed, $pkgFail failed"
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
# Print installation summary (brief - final report comes later)
|
|
873
|
+
Write-Header "Python Dependencies Installation Summary"
|
|
874
|
+
|
|
875
|
+
if ($successfulSkills.Count -gt 0) {
|
|
876
|
+
Write-Success "Successfully installed $($successfulSkills.Count) skill(s)"
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
if ($failedSkills.Count -gt 0) {
|
|
880
|
+
Write-Warning "$($failedSkills.Count) skill(s) had package failures (see final report)"
|
|
881
|
+
} elseif ($successfulSkills.Count -eq 0) {
|
|
882
|
+
Write-Warning "No skill requirements.txt files found"
|
|
883
|
+
} else {
|
|
884
|
+
Write-Success "All Python dependencies installed successfully"
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
deactivate
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
# Verify installations
|
|
891
|
+
function Test-Installations {
|
|
892
|
+
Write-Header "Verifying Installations"
|
|
893
|
+
|
|
894
|
+
$tools = @{
|
|
895
|
+
"ffmpeg" = "FFmpeg"
|
|
896
|
+
"magick" = "ImageMagick"
|
|
897
|
+
"node" = "Node.js"
|
|
898
|
+
"npm" = "npm"
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
foreach ($tool in $tools.GetEnumerator()) {
|
|
902
|
+
if (Test-Command $tool.Key) {
|
|
903
|
+
Write-Success "$($tool.Value) is available"
|
|
904
|
+
} else {
|
|
905
|
+
Write-Warning "$($tool.Value) is not available"
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
$npmPackages = @("rmbg", "pnpm", "wrangler", "repomix")
|
|
910
|
+
foreach ($package in $npmPackages) {
|
|
911
|
+
if (Test-Command $package) {
|
|
912
|
+
Write-Success "$package CLI is available"
|
|
913
|
+
} else {
|
|
914
|
+
Write-Warning "$package CLI is not available"
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
# Check Python packages
|
|
919
|
+
if (Test-Path $VenvDir) {
|
|
920
|
+
$activateScript = Join-Path $VenvDir "Scripts\Activate.ps1"
|
|
921
|
+
& $activateScript
|
|
922
|
+
|
|
923
|
+
try {
|
|
924
|
+
python -c "import google.genai" 2>$null
|
|
925
|
+
if ($LASTEXITCODE -eq 0) {
|
|
926
|
+
Write-Success "google-genai Python package is available"
|
|
927
|
+
} else {
|
|
928
|
+
Write-Warning "google-genai Python package is not available"
|
|
929
|
+
}
|
|
930
|
+
} catch {
|
|
931
|
+
Write-Warning "google-genai Python package is not available"
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
deactivate
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
# ============================================================================
|
|
939
|
+
# Final Report Functions
|
|
940
|
+
# ============================================================================
|
|
941
|
+
|
|
942
|
+
function Get-RemediationCommands {
|
|
943
|
+
$hasSudoSkipped = $Script:SKIPPED_ADMIN.Count -gt 0
|
|
944
|
+
$hasPythonFailed = $Script:FAILED_OPTIONAL.Count -gt 0
|
|
945
|
+
|
|
946
|
+
if (-not $hasSudoSkipped -and -not $hasPythonFailed) {
|
|
947
|
+
return
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
Write-Host ""
|
|
951
|
+
Write-Host "---------------------------------------------------" -ForegroundColor Blue
|
|
952
|
+
Write-Host "Manual Installation Commands:" -ForegroundColor Blue
|
|
953
|
+
Write-Host "---------------------------------------------------" -ForegroundColor Blue
|
|
954
|
+
Write-Host ""
|
|
955
|
+
|
|
956
|
+
if ($hasSudoSkipped) {
|
|
957
|
+
Write-Host "# System packages (use winget or scoop):"
|
|
958
|
+
foreach ($item in $Script:SKIPPED_ADMIN) {
|
|
959
|
+
$pkg = ($item -split ':')[0]
|
|
960
|
+
switch ($pkg) {
|
|
961
|
+
"FFmpeg" { Write-Host "winget install Gyan.FFmpeg" }
|
|
962
|
+
"ImageMagick" { Write-Host "winget install ImageMagick.ImageMagick" }
|
|
963
|
+
default { Write-Host "# ${pkg}: see documentation" }
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
Write-Host ""
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
if ($hasPythonFailed) {
|
|
970
|
+
Write-Host "# Python packages (may require build tools):"
|
|
971
|
+
Write-Host "# Install Visual Studio Build Tools: https://visualstudio.microsoft.com/visual-cpp-build-tools/"
|
|
972
|
+
Write-Host ".\.claude\skills\.venv\Scripts\Activate.ps1"
|
|
973
|
+
|
|
974
|
+
foreach ($item in $Script:FAILED_OPTIONAL) {
|
|
975
|
+
$pkg = ($item -split ':')[0]
|
|
976
|
+
# Extract package name from skill:package format
|
|
977
|
+
if ($pkg -match ':') {
|
|
978
|
+
$pkg = ($pkg -split ':')[1]
|
|
979
|
+
}
|
|
980
|
+
Write-Host "pip install $pkg"
|
|
981
|
+
}
|
|
982
|
+
Write-Host ""
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
function Write-FinalReport {
|
|
987
|
+
Write-Host ""
|
|
988
|
+
Write-Host "===================================================" -ForegroundColor Blue
|
|
989
|
+
Write-Host " Installation Report" -ForegroundColor Blue
|
|
990
|
+
Write-Host "===================================================" -ForegroundColor Blue
|
|
991
|
+
Write-Host ""
|
|
992
|
+
|
|
993
|
+
# Installed section
|
|
994
|
+
$installedCount = $Script:INSTALLED_CRITICAL.Count + $Script:INSTALLED_OPTIONAL.Count
|
|
995
|
+
if ($installedCount -gt 0) {
|
|
996
|
+
Write-Host "Installed ($installedCount):" -ForegroundColor Green
|
|
997
|
+
foreach ($item in $Script:INSTALLED_CRITICAL) {
|
|
998
|
+
Write-Host " [OK] $item" -ForegroundColor Green
|
|
999
|
+
}
|
|
1000
|
+
foreach ($item in $Script:INSTALLED_OPTIONAL) {
|
|
1001
|
+
Write-Host " [OK] $item" -ForegroundColor Green
|
|
1002
|
+
}
|
|
1003
|
+
Write-Host ""
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
# Skipped section
|
|
1007
|
+
if ($Script:SKIPPED_ADMIN.Count -gt 0) {
|
|
1008
|
+
Write-Host "Skipped ($($Script:SKIPPED_ADMIN.Count)):" -ForegroundColor Yellow
|
|
1009
|
+
foreach ($item in $Script:SKIPPED_ADMIN) {
|
|
1010
|
+
$name = ($item -split ':')[0]
|
|
1011
|
+
$reason = ($item -split ':')[1]
|
|
1012
|
+
Write-Host " [~] $name ($reason)" -ForegroundColor Yellow
|
|
1013
|
+
}
|
|
1014
|
+
Write-Host ""
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
# Degraded/Failed section
|
|
1018
|
+
if ($Script:FAILED_OPTIONAL.Count -gt 0) {
|
|
1019
|
+
Write-Host "Degraded ($($Script:FAILED_OPTIONAL.Count)):" -ForegroundColor Red
|
|
1020
|
+
foreach ($item in $Script:FAILED_OPTIONAL) {
|
|
1021
|
+
$name = ($item -split ':')[0]
|
|
1022
|
+
$reason = ($item -split ':')[1]
|
|
1023
|
+
Write-Host " [!] $name ($reason)" -ForegroundColor Red
|
|
1024
|
+
}
|
|
1025
|
+
Write-Host ""
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
# Remediation commands
|
|
1029
|
+
Get-RemediationCommands
|
|
1030
|
+
|
|
1031
|
+
# Exit status line
|
|
1032
|
+
Write-Host "===================================================" -ForegroundColor Blue
|
|
1033
|
+
switch ($Script:FINAL_EXIT_CODE) {
|
|
1034
|
+
0 { Write-Host " Exit: 0 (success - all dependencies installed)" -ForegroundColor Green }
|
|
1035
|
+
1 { Write-Host " Exit: 1 (failed - critical dependencies missing)" -ForegroundColor Red }
|
|
1036
|
+
2 { Write-Host " Exit: 2 (partial - some optional deps failed)" -ForegroundColor Yellow }
|
|
1037
|
+
}
|
|
1038
|
+
Write-Host "===================================================" -ForegroundColor Blue
|
|
1039
|
+
Write-Host ""
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
function Write-ErrorSummary {
|
|
1043
|
+
# Only write if there are failures
|
|
1044
|
+
if ($Script:FINAL_EXIT_CODE -eq 0) {
|
|
1045
|
+
return
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
# Build JSON structure
|
|
1049
|
+
$summary = @{
|
|
1050
|
+
exit_code = $Script:FINAL_EXIT_CODE
|
|
1051
|
+
timestamp = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
|
|
1052
|
+
critical_failures = @()
|
|
1053
|
+
optional_failures = @($Script:FAILED_OPTIONAL)
|
|
1054
|
+
skipped = @($Script:SKIPPED_ADMIN)
|
|
1055
|
+
remediation = @{
|
|
1056
|
+
winget_packages = "winget install Gyan.FFmpeg ImageMagick.ImageMagick"
|
|
1057
|
+
build_tools = "https://visualstudio.microsoft.com/visual-cpp-build-tools/"
|
|
1058
|
+
pip_retry = ".\.claude\skills\.venv\Scripts\Activate.ps1; pip install <package>"
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
# Use Out-File with UTF8NoBOM for proper JSON encoding (PS 6+) or UTF8 (PS 5)
|
|
1063
|
+
$jsonContent = $summary | ConvertTo-Json -Depth 5
|
|
1064
|
+
if ($PSVersionTable.PSVersion.Major -ge 6) {
|
|
1065
|
+
$jsonContent | Out-File -FilePath $ErrorSummaryFile -Encoding utf8NoBOM -NoNewline
|
|
1066
|
+
} else {
|
|
1067
|
+
# PowerShell 5.x: Use .NET to write UTF-8 without BOM
|
|
1068
|
+
[System.IO.File]::WriteAllText($ErrorSummaryFile, $jsonContent, [System.Text.UTF8Encoding]::new($false))
|
|
1069
|
+
}
|
|
1070
|
+
Write-Info "Error summary written to: $ErrorSummaryFile"
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
# Print usage instructions (now just brief tips)
|
|
1074
|
+
function Show-Usage {
|
|
1075
|
+
Write-Host "To use the Python virtual environment:" -ForegroundColor Green
|
|
1076
|
+
Write-Host " .\.claude\skills\.venv\Scripts\Activate.ps1"
|
|
1077
|
+
Write-Host ""
|
|
1078
|
+
Write-Host "For more information, see:" -ForegroundColor Blue
|
|
1079
|
+
Write-Host " .claude\skills\INSTALLATION.md"
|
|
1080
|
+
Write-Host ""
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
# Show help
|
|
1084
|
+
function Show-Help {
|
|
1085
|
+
Write-Host "Claude Code Skills Installation Script for Windows"
|
|
1086
|
+
Write-Host ""
|
|
1087
|
+
Write-Host "Usage:"
|
|
1088
|
+
Write-Host " .\install.ps1 [Options]"
|
|
1089
|
+
Write-Host ""
|
|
1090
|
+
Write-Host "Options:"
|
|
1091
|
+
Write-Host " -Y Skip all prompts and auto-confirm installation"
|
|
1092
|
+
Write-Host " -WithAdmin Use admin-requiring package managers (chocolatey)"
|
|
1093
|
+
Write-Host " -Resume Resume from previous interrupted installation"
|
|
1094
|
+
Write-Host " -RetryFailed Retry previously failed packages"
|
|
1095
|
+
Write-Host " -SkipChocolatey Skip Chocolatey installation (uses winget/scoop instead)"
|
|
1096
|
+
Write-Host " -Help Show this help message"
|
|
1097
|
+
Write-Host ""
|
|
1098
|
+
Write-Host "Exit Codes:"
|
|
1099
|
+
Write-Host " 0 Success (all dependencies installed)"
|
|
1100
|
+
Write-Host " 1 Fatal error (critical dependencies missing)"
|
|
1101
|
+
Write-Host " 2 Partial success (some optional deps failed)"
|
|
1102
|
+
Write-Host ""
|
|
1103
|
+
Write-Host "Examples:"
|
|
1104
|
+
Write-Host " .\install.ps1 # Normal install"
|
|
1105
|
+
Write-Host " .\install.ps1 -Y # Non-interactive"
|
|
1106
|
+
Write-Host " .\install.ps1 -WithAdmin # Use chocolatey if admin"
|
|
1107
|
+
Write-Host " .\install.ps1 -Resume # Resume interrupted install"
|
|
1108
|
+
Write-Host ""
|
|
1109
|
+
Write-Host "Package Manager Priority:"
|
|
1110
|
+
Write-Host " 1. winget (recommended, no admin required)"
|
|
1111
|
+
Write-Host " 2. scoop (no admin required)"
|
|
1112
|
+
Write-Host " 3. chocolatey (requires admin + -WithAdmin flag)"
|
|
1113
|
+
Write-Host ""
|
|
1114
|
+
Write-Host "Requirements:"
|
|
1115
|
+
Write-Host " - PowerShell 5.1 or higher"
|
|
1116
|
+
Write-Host " - One of: winget, scoop, or chocolatey (admin)"
|
|
1117
|
+
Write-Host ""
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
# Main installation flow
|
|
1121
|
+
function Main {
|
|
1122
|
+
if ($Help) {
|
|
1123
|
+
Show-Help
|
|
1124
|
+
exit 0
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
Write-Host "" # Just add spacing, don't clear terminal
|
|
1128
|
+
Write-Header "Claude Code Skills Installation (Windows)"
|
|
1129
|
+
Write-Info "Script directory: $ScriptDir"
|
|
1130
|
+
|
|
1131
|
+
# Show detected package manager
|
|
1132
|
+
$pm = Get-PackageManager
|
|
1133
|
+
if ($pm) {
|
|
1134
|
+
Write-Success "Detected package manager: $pm"
|
|
1135
|
+
} else {
|
|
1136
|
+
Write-Warning "No package manager detected (winget, scoop, or choco)"
|
|
1137
|
+
Write-Info "Install winget: https://aka.ms/getwinget"
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
# Show mode info
|
|
1141
|
+
if ($WithAdmin) {
|
|
1142
|
+
Write-Info "Mode: with admin (chocolatey enabled)"
|
|
1143
|
+
} else {
|
|
1144
|
+
Write-Info "Mode: without admin (system packages may be skipped)"
|
|
1145
|
+
}
|
|
1146
|
+
if ($Resume) {
|
|
1147
|
+
Write-Info "Mode: resuming previous installation"
|
|
1148
|
+
}
|
|
1149
|
+
Write-Host ""
|
|
1150
|
+
|
|
1151
|
+
# Confirm installation (skip if -Y flag or NON_INTERACTIVE env is set)
|
|
1152
|
+
if (-not $Y) {
|
|
1153
|
+
$confirmation = Get-UserInput -Prompt "This will install system packages and Node.js dependencies. Continue? (y/N)" -Default "N"
|
|
1154
|
+
if ($confirmation -ne 'y' -and $confirmation -ne 'Y') {
|
|
1155
|
+
Write-Warning "Installation cancelled"
|
|
1156
|
+
exit 0
|
|
1157
|
+
}
|
|
1158
|
+
} else {
|
|
1159
|
+
Write-Info "Auto-confirming installation (-Y flag or NON_INTERACTIVE mode)"
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
# Initialize state tracking
|
|
1163
|
+
Initialize-State
|
|
1164
|
+
|
|
1165
|
+
# Phase 1: Chocolatey (optional)
|
|
1166
|
+
if (-not (Test-PhaseDone "chocolatey")) {
|
|
1167
|
+
Update-Phase "chocolatey" "running"
|
|
1168
|
+
$null = Install-Chocolatey
|
|
1169
|
+
Update-Phase "chocolatey" "done"
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
# Phase 2: System deps
|
|
1173
|
+
if (Test-PhaseDone "system_deps") {
|
|
1174
|
+
Write-Success "System deps: already processed (resume)"
|
|
1175
|
+
} else {
|
|
1176
|
+
Update-Phase "system_deps" "running"
|
|
1177
|
+
Install-SystemDeps
|
|
1178
|
+
Update-Phase "system_deps" "done"
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
# Phase 3: Node deps
|
|
1182
|
+
if (Test-PhaseDone "node_deps") {
|
|
1183
|
+
Write-Success "Node deps: already installed (resume)"
|
|
1184
|
+
} else {
|
|
1185
|
+
Update-Phase "node_deps" "running"
|
|
1186
|
+
Install-NodeDeps
|
|
1187
|
+
Update-Phase "node_deps" "done"
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
# Phase 4: Python env
|
|
1191
|
+
if (Test-PhaseDone "python_env") {
|
|
1192
|
+
Write-Success "Python env: already set up (resume)"
|
|
1193
|
+
} else {
|
|
1194
|
+
Update-Phase "python_env" "running"
|
|
1195
|
+
Setup-PythonEnv
|
|
1196
|
+
Update-Phase "python_env" "done"
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
# Phase 5: Verify
|
|
1200
|
+
Update-Phase "verify" "running"
|
|
1201
|
+
Test-Installations
|
|
1202
|
+
Update-Phase "verify" "done"
|
|
1203
|
+
|
|
1204
|
+
# Print final report with all tracking info
|
|
1205
|
+
Write-FinalReport
|
|
1206
|
+
Show-Usage
|
|
1207
|
+
|
|
1208
|
+
# Write error summary for CLI to parse
|
|
1209
|
+
Write-ErrorSummary
|
|
1210
|
+
|
|
1211
|
+
# Clean state on complete success
|
|
1212
|
+
if ($Script:FINAL_EXIT_CODE -eq 0) {
|
|
1213
|
+
Remove-StateFile
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
exit $Script:FINAL_EXIT_CODE
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
# Run main function
|
|
1220
|
+
Main
|