@amrhas82/agentic-kit 1.1.0 → 1.2.1
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/CHANGELOG.md +378 -0
- package/README.md +166 -33
- package/docs/.gitkeep +1 -0
- package/docs/CONTRIBUTING.md +739 -0
- package/docs/DUAL_PUBLISH_SUMMARY.md +177 -0
- package/docs/ERROR_HANDLING_IMPLEMENTATION.md +327 -0
- package/docs/GITHUB_PACKAGES.md +181 -0
- package/docs/GITHUB_SETUP.md +158 -0
- package/docs/INSTALLATION_DEMO.md +691 -0
- package/docs/INSTALLER_GUIDE.md +1586 -0
- package/docs/INTEGRATION_ISSUES_9.1.md +341 -0
- package/docs/KNOWLEDGE_BASE.md +727 -0
- package/docs/MIGRATION.md +384 -0
- package/docs/PACKAGE_BASELINE.md +557 -0
- package/docs/PACKAGE_VALIDATION_REPORT.md +427 -0
- package/docs/PASS_INTEGRATION.md +307 -0
- package/docs/PASS_QUICK_START.md +150 -0
- package/docs/PRIVACY.md +203 -0
- package/docs/PUBLISHING.md +494 -0
- package/docs/SECURITY.md +317 -0
- package/docs/SILENT_MODE_GUIDE.md +526 -0
- package/docs/SKILLS_CONVERSION.md +154 -0
- package/docs/TESTING.md +582 -0
- package/docs/TEST_COVERAGE.md +347 -0
- package/docs/UPDATED_VARIANT_CONFIGURATION.md +274 -0
- package/docs/VARIANT_CONFIGURATION.md +440 -0
- package/installer/cli.js +2229 -0
- package/installer/installation-engine.js +1502 -0
- package/installer/package-manager.js +597 -0
- package/installer/path-manager.js +427 -0
- package/installer/report-template.js +298 -0
- package/installer/state-manager.js +426 -0
- package/installer/telemetry.js +241 -0
- package/installer/verification-system.js +274 -0
- package/package.json +25 -12
- package/packages/ampcode/AGENTS.md +109 -0
- package/packages/ampcode/README.md +17 -0
- package/packages/ampcode/agents/orchestrator.md +103 -0
- package/packages/ampcode/hooks/register-agents.js +128 -0
- package/packages/ampcode/hooks/session-start.js +168 -0
- package/packages/ampcode/resources/data.md +1372 -0
- package/packages/ampcode/settings.json +13 -0
- package/packages/ampcode/skills/README.md +76 -0
- package/packages/ampcode/subagents-and-skills.md +79 -0
- package/packages/ampcode/variants.json +67 -0
- package/packages/claude/AGENTS.md +243 -0
- package/packages/claude/README.md +23 -0
- package/packages/claude/agents/1-create-prd.md +56 -0
- package/packages/claude/agents/2-generate-tasks.md +73 -0
- package/packages/claude/agents/3-process-task-list.md +101 -0
- package/packages/claude/agents/business-analyst.md +76 -0
- package/packages/claude/agents/full-stack-dev.md +80 -0
- package/packages/claude/agents/holistic-architect.md +91 -0
- package/packages/claude/agents/master.md +55 -0
- package/packages/claude/agents/product-manager.md +82 -0
- package/packages/claude/agents/product-owner.md +97 -0
- package/packages/claude/agents/qa-test-architect.md +72 -0
- package/packages/claude/agents/scrum-master.md +64 -0
- package/packages/claude/agents/ux-expert.md +74 -0
- package/packages/claude/resources/agent-teams.yaml +50 -0
- package/packages/claude/resources/checklists.md +1724 -0
- package/packages/claude/resources/task-briefs.md +4428 -0
- package/packages/claude/resources/templates.yaml +5810 -0
- package/packages/claude/resources/workflows.yaml +1513 -0
- package/packages/claude/skills/README.md +76 -0
- package/packages/claude/skills/algorithmic-art/LICENSE.txt +202 -0
- package/packages/claude/skills/algorithmic-art/SKILL.md +405 -0
- package/packages/claude/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/packages/claude/skills/algorithmic-art/templates/viewer.html +599 -0
- package/packages/claude/skills/artifacts-builder/LICENSE.txt +202 -0
- package/packages/claude/skills/artifacts-builder/SKILL.md +74 -0
- package/packages/claude/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/packages/claude/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/packages/claude/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/packages/claude/skills/brainstorming/SKILL.md +54 -0
- package/packages/claude/skills/brand-guidelines/LICENSE.txt +202 -0
- package/packages/claude/skills/brand-guidelines/SKILL.md +73 -0
- package/packages/claude/skills/canvas-design/LICENSE.txt +202 -0
- package/packages/claude/skills/canvas-design/SKILL.md +130 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/packages/claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/packages/claude/skills/code-review/SKILL.md +105 -0
- package/packages/claude/skills/code-review/code-reviewer.md +146 -0
- package/packages/claude/skills/condition-based-waiting/SKILL.md +120 -0
- package/packages/claude/skills/condition-based-waiting/example.ts +158 -0
- package/packages/claude/skills/docx/LICENSE.txt +30 -0
- package/packages/claude/skills/docx/SKILL.md +197 -0
- package/packages/claude/skills/docx/docx-js.md +350 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/packages/claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/packages/claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/packages/claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/packages/claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/packages/claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/packages/claude/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/packages/claude/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/packages/claude/skills/docx/ooxml/scripts/pack.py +159 -0
- package/packages/claude/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/packages/claude/skills/docx/ooxml/scripts/validate.py +69 -0
- package/packages/claude/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/packages/claude/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/packages/claude/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/packages/claude/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/packages/claude/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/packages/claude/skills/docx/ooxml.md +610 -0
- package/packages/claude/skills/docx/scripts/__init__.py +1 -0
- package/packages/claude/skills/docx/scripts/document.py +1276 -0
- package/packages/claude/skills/docx/scripts/templates/comments.xml +3 -0
- package/packages/claude/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/packages/claude/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/packages/claude/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/packages/claude/skills/docx/scripts/templates/people.xml +3 -0
- package/packages/claude/skills/docx/scripts/utilities.py +374 -0
- package/packages/claude/skills/internal-comms/LICENSE.txt +202 -0
- package/packages/claude/skills/internal-comms/SKILL.md +32 -0
- package/packages/claude/skills/internal-comms/examples/3p-updates.md +47 -0
- package/packages/claude/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/packages/claude/skills/internal-comms/examples/faq-answers.md +30 -0
- package/packages/claude/skills/internal-comms/examples/general-comms.md +16 -0
- package/packages/claude/skills/mcp-builder/LICENSE.txt +202 -0
- package/packages/claude/skills/mcp-builder/SKILL.md +328 -0
- package/packages/claude/skills/mcp-builder/reference/evaluation.md +602 -0
- package/packages/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/packages/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/packages/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/packages/claude/skills/mcp-builder/scripts/connections.py +151 -0
- package/packages/claude/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/packages/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/packages/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/packages/claude/skills/pdf/LICENSE.txt +30 -0
- package/packages/claude/skills/pdf/SKILL.md +294 -0
- package/packages/claude/skills/pdf/forms.md +205 -0
- package/packages/claude/skills/pdf/reference.md +612 -0
- package/packages/claude/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/packages/claude/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/packages/claude/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/packages/claude/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/packages/claude/skills/pdf/scripts/create_validation_image.py +41 -0
- package/packages/claude/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/packages/claude/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/packages/claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/packages/claude/skills/pptx/LICENSE.txt +30 -0
- package/packages/claude/skills/pptx/SKILL.md +484 -0
- package/packages/claude/skills/pptx/html2pptx.md +625 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/packages/claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/packages/claude/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/packages/claude/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/packages/claude/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/packages/claude/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/packages/claude/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/packages/claude/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/packages/claude/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/packages/claude/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/packages/claude/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/packages/claude/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/packages/claude/skills/pptx/ooxml.md +427 -0
- package/packages/claude/skills/pptx/scripts/html2pptx.js +979 -0
- package/packages/claude/skills/pptx/scripts/inventory.py +1020 -0
- package/packages/claude/skills/pptx/scripts/rearrange.py +231 -0
- package/packages/claude/skills/pptx/scripts/replace.py +385 -0
- package/packages/claude/skills/pptx/scripts/thumbnail.py +450 -0
- package/packages/claude/skills/root-cause-tracing/SKILL.md +174 -0
- package/packages/claude/skills/root-cause-tracing/find-polluter.sh +63 -0
- package/packages/claude/skills/skill-creator/LICENSE.txt +202 -0
- package/packages/claude/skills/skill-creator/SKILL.md +209 -0
- package/packages/claude/skills/skill-creator/scripts/init_skill.py +303 -0
- package/packages/claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/packages/claude/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/packages/claude/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/packages/claude/skills/slack-gif-creator/SKILL.md +646 -0
- package/packages/claude/skills/slack-gif-creator/core/color_palettes.py +302 -0
- package/packages/claude/skills/slack-gif-creator/core/easing.py +230 -0
- package/packages/claude/skills/slack-gif-creator/core/frame_composer.py +469 -0
- package/packages/claude/skills/slack-gif-creator/core/gif_builder.py +246 -0
- package/packages/claude/skills/slack-gif-creator/core/typography.py +357 -0
- package/packages/claude/skills/slack-gif-creator/core/validators.py +264 -0
- package/packages/claude/skills/slack-gif-creator/core/visual_effects.py +494 -0
- package/packages/claude/skills/slack-gif-creator/requirements.txt +4 -0
- package/packages/claude/skills/slack-gif-creator/templates/bounce.py +106 -0
- package/packages/claude/skills/slack-gif-creator/templates/explode.py +331 -0
- package/packages/claude/skills/slack-gif-creator/templates/fade.py +329 -0
- package/packages/claude/skills/slack-gif-creator/templates/flip.py +291 -0
- package/packages/claude/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
- package/packages/claude/skills/slack-gif-creator/templates/morph.py +329 -0
- package/packages/claude/skills/slack-gif-creator/templates/move.py +293 -0
- package/packages/claude/skills/slack-gif-creator/templates/pulse.py +268 -0
- package/packages/claude/skills/slack-gif-creator/templates/shake.py +127 -0
- package/packages/claude/skills/slack-gif-creator/templates/slide.py +291 -0
- package/packages/claude/skills/slack-gif-creator/templates/spin.py +269 -0
- package/packages/claude/skills/slack-gif-creator/templates/wiggle.py +300 -0
- package/packages/claude/skills/slack-gif-creator/templates/zoom.py +312 -0
- package/packages/claude/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/packages/claude/skills/systematic-debugging/SKILL.md +295 -0
- package/packages/claude/skills/systematic-debugging/test-academic.md +14 -0
- package/packages/claude/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/packages/claude/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/packages/claude/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/packages/claude/skills/test-driven-development/SKILL.md +364 -0
- package/packages/claude/skills/testing-anti-patterns/SKILL.md +302 -0
- package/packages/claude/skills/theme-factory/LICENSE.txt +202 -0
- package/packages/claude/skills/theme-factory/SKILL.md +59 -0
- package/packages/claude/skills/theme-factory/theme-showcase.pdf +0 -0
- package/packages/claude/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/packages/claude/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/packages/claude/skills/theme-factory/themes/desert-rose.md +19 -0
- package/packages/claude/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/packages/claude/skills/theme-factory/themes/golden-hour.md +19 -0
- package/packages/claude/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/packages/claude/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/packages/claude/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/packages/claude/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/packages/claude/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/packages/claude/skills/verification-before-completion/SKILL.md +139 -0
- package/packages/claude/skills/webapp-testing/LICENSE.txt +202 -0
- package/packages/claude/skills/webapp-testing/SKILL.md +96 -0
- package/packages/claude/skills/webapp-testing/examples/console_logging.py +35 -0
- package/packages/claude/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/packages/claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/packages/claude/skills/webapp-testing/scripts/with_server.py +106 -0
- package/packages/claude/skills/xlsx/LICENSE.txt +30 -0
- package/packages/claude/skills/xlsx/SKILL.md +289 -0
- package/packages/claude/skills/xlsx/recalc.py +178 -0
- package/packages/claude/subagents-and-skills.md +79 -0
- package/packages/claude/variants.json +67 -0
- package/packages/droid/README.md +17 -0
- package/packages/droid/agents/1-create-prd.md +56 -0
- package/packages/droid/agents/2-generate-tasks.md +73 -0
- package/packages/droid/agents/3-process-task-list.md +101 -0
- package/packages/droid/agents/business-analyst.md +76 -0
- package/packages/droid/agents/full-stack-dev.md +80 -0
- package/packages/droid/agents/holistic-architect.md +91 -0
- package/packages/droid/agents/master.md +55 -0
- package/packages/droid/agents/orchestrator.md +103 -0
- package/packages/droid/agents/product-manager.md +82 -0
- package/packages/droid/agents/product-owner.md +97 -0
- package/packages/droid/agents/qa-test-architect.md +72 -0
- package/packages/droid/agents/scrum-master.md +64 -0
- package/packages/droid/agents/ux-expert.md +74 -0
- package/packages/droid/hooks/register-agents.js +128 -0
- package/packages/droid/hooks/session-start.js +168 -0
- package/packages/droid/resources/agent-teams.yaml +50 -0
- package/packages/droid/resources/checklists.md +1724 -0
- package/packages/droid/resources/data.md +1372 -0
- package/packages/droid/resources/task-briefs.md +4428 -0
- package/packages/droid/resources/templates.yaml +5810 -0
- package/packages/droid/resources/workflows.yaml +1513 -0
- package/packages/droid/skills/README.md +76 -0
- package/packages/droid/skills/algorithmic-art/LICENSE.txt +202 -0
- package/packages/droid/skills/algorithmic-art/SKILL.md +405 -0
- package/packages/droid/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/packages/droid/skills/algorithmic-art/templates/viewer.html +599 -0
- package/packages/droid/skills/artifacts-builder/LICENSE.txt +202 -0
- package/packages/droid/skills/artifacts-builder/SKILL.md +74 -0
- package/packages/droid/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/packages/droid/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/packages/droid/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/packages/droid/skills/brainstorming/SKILL.md +54 -0
- package/packages/droid/skills/brand-guidelines/LICENSE.txt +202 -0
- package/packages/droid/skills/brand-guidelines/SKILL.md +73 -0
- package/packages/droid/skills/canvas-design/LICENSE.txt +202 -0
- package/packages/droid/skills/canvas-design/SKILL.md +130 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/packages/droid/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/packages/droid/skills/code-review/SKILL.md +105 -0
- package/packages/droid/skills/code-review/code-reviewer.md +146 -0
- package/packages/droid/skills/condition-based-waiting/SKILL.md +120 -0
- package/packages/droid/skills/condition-based-waiting/example.ts +158 -0
- package/packages/droid/skills/docx/LICENSE.txt +30 -0
- package/packages/droid/skills/docx/SKILL.md +197 -0
- package/packages/droid/skills/docx/docx-js.md +350 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/packages/droid/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/packages/droid/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/packages/droid/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/packages/droid/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/packages/droid/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/packages/droid/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/packages/droid/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/packages/droid/skills/docx/ooxml/scripts/pack.py +159 -0
- package/packages/droid/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/packages/droid/skills/docx/ooxml/scripts/validate.py +69 -0
- package/packages/droid/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/packages/droid/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/packages/droid/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/packages/droid/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/packages/droid/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/packages/droid/skills/docx/ooxml.md +610 -0
- package/packages/droid/skills/docx/scripts/__init__.py +1 -0
- package/packages/droid/skills/docx/scripts/document.py +1276 -0
- package/packages/droid/skills/docx/scripts/templates/comments.xml +3 -0
- package/packages/droid/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/packages/droid/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/packages/droid/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/packages/droid/skills/docx/scripts/templates/people.xml +3 -0
- package/packages/droid/skills/docx/scripts/utilities.py +374 -0
- package/packages/droid/skills/internal-comms/LICENSE.txt +202 -0
- package/packages/droid/skills/internal-comms/SKILL.md +32 -0
- package/packages/droid/skills/internal-comms/examples/3p-updates.md +47 -0
- package/packages/droid/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/packages/droid/skills/internal-comms/examples/faq-answers.md +30 -0
- package/packages/droid/skills/internal-comms/examples/general-comms.md +16 -0
- package/packages/droid/skills/mcp-builder/LICENSE.txt +202 -0
- package/packages/droid/skills/mcp-builder/SKILL.md +328 -0
- package/packages/droid/skills/mcp-builder/reference/evaluation.md +602 -0
- package/packages/droid/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/packages/droid/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/packages/droid/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/packages/droid/skills/mcp-builder/scripts/connections.py +151 -0
- package/packages/droid/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/packages/droid/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/packages/droid/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/packages/droid/skills/pdf/LICENSE.txt +30 -0
- package/packages/droid/skills/pdf/SKILL.md +294 -0
- package/packages/droid/skills/pdf/forms.md +205 -0
- package/packages/droid/skills/pdf/reference.md +612 -0
- package/packages/droid/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/packages/droid/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/packages/droid/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/packages/droid/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/packages/droid/skills/pdf/scripts/create_validation_image.py +41 -0
- package/packages/droid/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/packages/droid/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/packages/droid/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/packages/droid/skills/pptx/LICENSE.txt +30 -0
- package/packages/droid/skills/pptx/SKILL.md +484 -0
- package/packages/droid/skills/pptx/html2pptx.md +625 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/packages/droid/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/packages/droid/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/packages/droid/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/packages/droid/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/packages/droid/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/packages/droid/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/packages/droid/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/packages/droid/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/packages/droid/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/packages/droid/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/packages/droid/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/packages/droid/skills/pptx/ooxml.md +427 -0
- package/packages/droid/skills/pptx/scripts/html2pptx.js +979 -0
- package/packages/droid/skills/pptx/scripts/inventory.py +1020 -0
- package/packages/droid/skills/pptx/scripts/rearrange.py +231 -0
- package/packages/droid/skills/pptx/scripts/replace.py +385 -0
- package/packages/droid/skills/pptx/scripts/thumbnail.py +450 -0
- package/packages/droid/skills/root-cause-tracing/SKILL.md +174 -0
- package/packages/droid/skills/root-cause-tracing/find-polluter.sh +63 -0
- package/packages/droid/skills/skill-creator/LICENSE.txt +202 -0
- package/packages/droid/skills/skill-creator/SKILL.md +209 -0
- package/packages/droid/skills/skill-creator/scripts/init_skill.py +303 -0
- package/packages/droid/skills/skill-creator/scripts/package_skill.py +110 -0
- package/packages/droid/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/packages/droid/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/packages/droid/skills/slack-gif-creator/SKILL.md +646 -0
- package/packages/droid/skills/slack-gif-creator/core/color_palettes.py +302 -0
- package/packages/droid/skills/slack-gif-creator/core/easing.py +230 -0
- package/packages/droid/skills/slack-gif-creator/core/frame_composer.py +469 -0
- package/packages/droid/skills/slack-gif-creator/core/gif_builder.py +246 -0
- package/packages/droid/skills/slack-gif-creator/core/typography.py +357 -0
- package/packages/droid/skills/slack-gif-creator/core/validators.py +264 -0
- package/packages/droid/skills/slack-gif-creator/core/visual_effects.py +494 -0
- package/packages/droid/skills/slack-gif-creator/requirements.txt +4 -0
- package/packages/droid/skills/slack-gif-creator/templates/bounce.py +106 -0
- package/packages/droid/skills/slack-gif-creator/templates/explode.py +331 -0
- package/packages/droid/skills/slack-gif-creator/templates/fade.py +329 -0
- package/packages/droid/skills/slack-gif-creator/templates/flip.py +291 -0
- package/packages/droid/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
- package/packages/droid/skills/slack-gif-creator/templates/morph.py +329 -0
- package/packages/droid/skills/slack-gif-creator/templates/move.py +293 -0
- package/packages/droid/skills/slack-gif-creator/templates/pulse.py +268 -0
- package/packages/droid/skills/slack-gif-creator/templates/shake.py +127 -0
- package/packages/droid/skills/slack-gif-creator/templates/slide.py +291 -0
- package/packages/droid/skills/slack-gif-creator/templates/spin.py +269 -0
- package/packages/droid/skills/slack-gif-creator/templates/wiggle.py +300 -0
- package/packages/droid/skills/slack-gif-creator/templates/zoom.py +312 -0
- package/packages/droid/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/packages/droid/skills/systematic-debugging/SKILL.md +295 -0
- package/packages/droid/skills/systematic-debugging/test-academic.md +14 -0
- package/packages/droid/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/packages/droid/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/packages/droid/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/packages/droid/skills/test-driven-development/SKILL.md +364 -0
- package/packages/droid/skills/testing-anti-patterns/SKILL.md +302 -0
- package/packages/droid/skills/theme-factory/LICENSE.txt +202 -0
- package/packages/droid/skills/theme-factory/SKILL.md +59 -0
- package/packages/droid/skills/theme-factory/theme-showcase.pdf +0 -0
- package/packages/droid/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/packages/droid/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/packages/droid/skills/theme-factory/themes/desert-rose.md +19 -0
- package/packages/droid/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/packages/droid/skills/theme-factory/themes/golden-hour.md +19 -0
- package/packages/droid/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/packages/droid/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/packages/droid/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/packages/droid/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/packages/droid/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/packages/droid/skills/verification-before-completion/SKILL.md +139 -0
- package/packages/droid/skills/webapp-testing/LICENSE.txt +202 -0
- package/packages/droid/skills/webapp-testing/SKILL.md +96 -0
- package/packages/droid/skills/webapp-testing/examples/console_logging.py +35 -0
- package/packages/droid/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/packages/droid/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/packages/droid/skills/webapp-testing/scripts/with_server.py +106 -0
- package/packages/droid/skills/xlsx/LICENSE.txt +30 -0
- package/packages/droid/skills/xlsx/SKILL.md +289 -0
- package/packages/droid/skills/xlsx/recalc.py +178 -0
- package/packages/droid/subagents-and-skills.md +79 -0
- package/packages/droid/variants.json +67 -0
- package/packages/opencode/AGENTS.md +379 -0
- package/packages/opencode/README.md +17 -0
- package/packages/opencode/agents/1-create-prd.md +56 -0
- package/packages/opencode/agents/2-generate-tasks.md +73 -0
- package/packages/opencode/agents/3-process-task-list.md +101 -0
- package/packages/opencode/agents/business-analyst.md +76 -0
- package/packages/opencode/agents/full-stack-dev.md +73 -0
- package/packages/opencode/agents/holistic-architect.md +91 -0
- package/packages/opencode/agents/master.md +55 -0
- package/packages/opencode/agents/orchestrator.md +103 -0
- package/packages/opencode/agents/product-manager.md +82 -0
- package/packages/opencode/agents/product-owner.md +97 -0
- package/packages/opencode/agents/qa-test-architect.md +72 -0
- package/packages/opencode/agents/scrum-master.md +64 -0
- package/packages/opencode/agents/ux-expert.md +74 -0
- package/packages/opencode/hooks/register-agents.js +128 -0
- package/packages/opencode/hooks/session-start.js +168 -0
- package/packages/opencode/opencode.jsonc +225 -0
- package/packages/opencode/resources/agent-teams.yaml +50 -0
- package/packages/opencode/resources/checklists.md +1724 -0
- package/packages/opencode/resources/data.md +1372 -0
- package/packages/opencode/resources/task-briefs.md +4428 -0
- package/packages/opencode/resources/templates.yaml +5810 -0
- package/packages/opencode/resources/workflows.yaml +1513 -0
- package/packages/opencode/skills/README.md +76 -0
- package/packages/opencode/skills/algorithmic-art/LICENSE.txt +202 -0
- package/packages/opencode/skills/algorithmic-art/SKILL.md +405 -0
- package/packages/opencode/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/packages/opencode/skills/algorithmic-art/templates/viewer.html +599 -0
- package/packages/opencode/skills/artifacts-builder/LICENSE.txt +202 -0
- package/packages/opencode/skills/artifacts-builder/SKILL.md +74 -0
- package/packages/opencode/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/packages/opencode/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/packages/opencode/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/packages/opencode/skills/brainstorming/SKILL.md +54 -0
- package/packages/opencode/skills/brand-guidelines/LICENSE.txt +202 -0
- package/packages/opencode/skills/brand-guidelines/SKILL.md +73 -0
- package/packages/opencode/skills/canvas-design/LICENSE.txt +202 -0
- package/packages/opencode/skills/canvas-design/SKILL.md +130 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/packages/opencode/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/packages/opencode/skills/code-review/SKILL.md +105 -0
- package/packages/opencode/skills/code-review/code-reviewer.md +146 -0
- package/packages/opencode/skills/condition-based-waiting/SKILL.md +120 -0
- package/packages/opencode/skills/condition-based-waiting/example.ts +158 -0
- package/packages/opencode/skills/docx/LICENSE.txt +30 -0
- package/packages/opencode/skills/docx/SKILL.md +197 -0
- package/packages/opencode/skills/docx/docx-js.md +350 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/packages/opencode/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/packages/opencode/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/packages/opencode/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/packages/opencode/skills/docx/ooxml/scripts/pack.py +159 -0
- package/packages/opencode/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/packages/opencode/skills/docx/ooxml/scripts/validate.py +69 -0
- package/packages/opencode/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/packages/opencode/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/packages/opencode/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/packages/opencode/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/packages/opencode/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/packages/opencode/skills/docx/ooxml.md +610 -0
- package/packages/opencode/skills/docx/scripts/__init__.py +1 -0
- package/packages/opencode/skills/docx/scripts/document.py +1276 -0
- package/packages/opencode/skills/docx/scripts/templates/comments.xml +3 -0
- package/packages/opencode/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/packages/opencode/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/packages/opencode/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/packages/opencode/skills/docx/scripts/templates/people.xml +3 -0
- package/packages/opencode/skills/docx/scripts/utilities.py +374 -0
- package/packages/opencode/skills/internal-comms/LICENSE.txt +202 -0
- package/packages/opencode/skills/internal-comms/SKILL.md +32 -0
- package/packages/opencode/skills/internal-comms/examples/3p-updates.md +47 -0
- package/packages/opencode/skills/internal-comms/examples/company-newsletter.md +65 -0
- package/packages/opencode/skills/internal-comms/examples/faq-answers.md +30 -0
- package/packages/opencode/skills/internal-comms/examples/general-comms.md +16 -0
- package/packages/opencode/skills/mcp-builder/LICENSE.txt +202 -0
- package/packages/opencode/skills/mcp-builder/SKILL.md +328 -0
- package/packages/opencode/skills/mcp-builder/reference/evaluation.md +602 -0
- package/packages/opencode/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/packages/opencode/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/packages/opencode/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/packages/opencode/skills/mcp-builder/scripts/connections.py +151 -0
- package/packages/opencode/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/packages/opencode/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/packages/opencode/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/packages/opencode/skills/pdf/LICENSE.txt +30 -0
- package/packages/opencode/skills/pdf/SKILL.md +294 -0
- package/packages/opencode/skills/pdf/forms.md +205 -0
- package/packages/opencode/skills/pdf/reference.md +612 -0
- package/packages/opencode/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/packages/opencode/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/packages/opencode/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/packages/opencode/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/packages/opencode/skills/pdf/scripts/create_validation_image.py +41 -0
- package/packages/opencode/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/packages/opencode/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/packages/opencode/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/packages/opencode/skills/pptx/LICENSE.txt +30 -0
- package/packages/opencode/skills/pptx/SKILL.md +484 -0
- package/packages/opencode/skills/pptx/html2pptx.md +625 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/packages/opencode/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/packages/opencode/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/packages/opencode/skills/pptx/ooxml.md +427 -0
- package/packages/opencode/skills/pptx/scripts/html2pptx.js +979 -0
- package/packages/opencode/skills/pptx/scripts/inventory.py +1020 -0
- package/packages/opencode/skills/pptx/scripts/rearrange.py +231 -0
- package/packages/opencode/skills/pptx/scripts/replace.py +385 -0
- package/packages/opencode/skills/pptx/scripts/thumbnail.py +450 -0
- package/packages/opencode/skills/root-cause-tracing/SKILL.md +174 -0
- package/packages/opencode/skills/root-cause-tracing/find-polluter.sh +63 -0
- package/packages/opencode/skills/skill-creator/LICENSE.txt +202 -0
- package/packages/opencode/skills/skill-creator/SKILL.md +209 -0
- package/packages/opencode/skills/skill-creator/scripts/init_skill.py +303 -0
- package/packages/opencode/skills/skill-creator/scripts/package_skill.py +110 -0
- package/packages/opencode/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/packages/opencode/skills/slack-gif-creator/LICENSE.txt +202 -0
- package/packages/opencode/skills/slack-gif-creator/SKILL.md +646 -0
- package/packages/opencode/skills/slack-gif-creator/core/color_palettes.py +302 -0
- package/packages/opencode/skills/slack-gif-creator/core/easing.py +230 -0
- package/packages/opencode/skills/slack-gif-creator/core/frame_composer.py +469 -0
- package/packages/opencode/skills/slack-gif-creator/core/gif_builder.py +246 -0
- package/packages/opencode/skills/slack-gif-creator/core/typography.py +357 -0
- package/packages/opencode/skills/slack-gif-creator/core/validators.py +264 -0
- package/packages/opencode/skills/slack-gif-creator/core/visual_effects.py +494 -0
- package/packages/opencode/skills/slack-gif-creator/requirements.txt +4 -0
- package/packages/opencode/skills/slack-gif-creator/templates/bounce.py +106 -0
- package/packages/opencode/skills/slack-gif-creator/templates/explode.py +331 -0
- package/packages/opencode/skills/slack-gif-creator/templates/fade.py +329 -0
- package/packages/opencode/skills/slack-gif-creator/templates/flip.py +291 -0
- package/packages/opencode/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
- package/packages/opencode/skills/slack-gif-creator/templates/morph.py +329 -0
- package/packages/opencode/skills/slack-gif-creator/templates/move.py +293 -0
- package/packages/opencode/skills/slack-gif-creator/templates/pulse.py +268 -0
- package/packages/opencode/skills/slack-gif-creator/templates/shake.py +127 -0
- package/packages/opencode/skills/slack-gif-creator/templates/slide.py +291 -0
- package/packages/opencode/skills/slack-gif-creator/templates/spin.py +269 -0
- package/packages/opencode/skills/slack-gif-creator/templates/wiggle.py +300 -0
- package/packages/opencode/skills/slack-gif-creator/templates/zoom.py +312 -0
- package/packages/opencode/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/packages/opencode/skills/systematic-debugging/SKILL.md +295 -0
- package/packages/opencode/skills/systematic-debugging/test-academic.md +14 -0
- package/packages/opencode/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/packages/opencode/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/packages/opencode/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/packages/opencode/skills/test-driven-development/SKILL.md +364 -0
- package/packages/opencode/skills/testing-anti-patterns/SKILL.md +302 -0
- package/packages/opencode/skills/theme-factory/LICENSE.txt +202 -0
- package/packages/opencode/skills/theme-factory/SKILL.md +59 -0
- package/packages/opencode/skills/theme-factory/theme-showcase.pdf +0 -0
- package/packages/opencode/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/desert-rose.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/golden-hour.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/packages/opencode/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/packages/opencode/skills/verification-before-completion/SKILL.md +139 -0
- package/packages/opencode/skills/webapp-testing/LICENSE.txt +202 -0
- package/packages/opencode/skills/webapp-testing/SKILL.md +96 -0
- package/packages/opencode/skills/webapp-testing/examples/console_logging.py +35 -0
- package/packages/opencode/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/packages/opencode/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/packages/opencode/skills/webapp-testing/scripts/with_server.py +106 -0
- package/packages/opencode/skills/xlsx/LICENSE.txt +30 -0
- package/packages/opencode/skills/xlsx/SKILL.md +289 -0
- package/packages/opencode/skills/xlsx/recalc.py +178 -0
- package/packages/opencode/skills-backup/README.md +76 -0
- package/packages/opencode/skills-backup/algorithmic-art.md +159 -0
- package/packages/opencode/skills-backup/artifacts-builder.md +285 -0
- package/packages/opencode/skills-backup/brainstorming.md +49 -0
- package/packages/opencode/skills-backup/brand-guidelines.md +123 -0
- package/packages/opencode/skills-backup/canvas-design.md +155 -0
- package/packages/opencode/skills-backup/code-review.md +92 -0
- package/packages/opencode/skills-backup/condition-based-waiting.md +133 -0
- package/packages/opencode/skills-backup/docx.md +255 -0
- package/packages/opencode/skills-backup/internal-comms.md +142 -0
- package/packages/opencode/skills-backup/mcp-builder.md +282 -0
- package/packages/opencode/skills-backup/pdf.md +194 -0
- package/packages/opencode/skills-backup/pptx.md +272 -0
- package/packages/opencode/skills-backup/root-cause-tracing.md +211 -0
- package/packages/opencode/skills-backup/skill-creator.md +196 -0
- package/packages/opencode/skills-backup/slack-gif-creator.md +340 -0
- package/packages/opencode/skills-backup/systematic-debugging.md +215 -0
- package/packages/opencode/skills-backup/test-driven-development.md +231 -0
- package/packages/opencode/skills-backup/testing-anti-patterns.md +248 -0
- package/packages/opencode/skills-backup/theme-factory.md +146 -0
- package/packages/opencode/skills-backup/verification-before-completion.md +151 -0
- package/packages/opencode/skills-backup/webapp-testing.md +275 -0
- package/packages/opencode/skills-backup/xlsx.md +254 -0
- package/packages/opencode/subagents-and-skills.md +79 -0
- package/packages/opencode/variants.json +67 -0
- package/validate-references.sh +0 -86
- /package/{agents → packages/ampcode/agents}/1-create-prd.md +0 -0
- /package/{agents → packages/ampcode/agents}/2-generate-tasks.md +0 -0
- /package/{agents → packages/ampcode/agents}/3-process-task-list.md +0 -0
- /package/{agents → packages/ampcode/agents}/business-analyst.md +0 -0
- /package/{agents → packages/ampcode/agents}/full-stack-dev.md +0 -0
- /package/{agents → packages/ampcode/agents}/holistic-architect.md +0 -0
- /package/{agents → packages/ampcode/agents}/master.md +0 -0
- /package/{agents → packages/ampcode/agents}/product-manager.md +0 -0
- /package/{agents → packages/ampcode/agents}/product-owner.md +0 -0
- /package/{agents → packages/ampcode/agents}/qa-test-architect.md +0 -0
- /package/{agents → packages/ampcode/agents}/scrum-master.md +0 -0
- /package/{agents → packages/ampcode/agents}/ux-expert.md +0 -0
- /package/{resources → packages/ampcode/resources}/agent-teams.yaml +0 -0
- /package/{resources → packages/ampcode/resources}/checklists.md +0 -0
- /package/{resources → packages/ampcode/resources}/task-briefs.md +0 -0
- /package/{resources → packages/ampcode/resources}/templates.yaml +0 -0
- /package/{resources → packages/ampcode/resources}/workflows.yaml +0 -0
- /package/{skills → packages/ampcode/skills}/algorithmic-art/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/algorithmic-art/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/algorithmic-art/templates/generator_template.js +0 -0
- /package/{skills → packages/ampcode/skills}/algorithmic-art/templates/viewer.html +0 -0
- /package/{skills → packages/ampcode/skills}/artifacts-builder/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/artifacts-builder/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/artifacts-builder/scripts/bundle-artifact.sh +0 -0
- /package/{skills → packages/ampcode/skills}/artifacts-builder/scripts/init-artifact.sh +0 -0
- /package/{skills → packages/ampcode/skills}/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- /package/{skills → packages/ampcode/skills}/brainstorming/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/brand-guidelines/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/brand-guidelines/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Jura-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Lora-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -0
- /package/{skills → packages/ampcode/skills}/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- /package/{skills → packages/ampcode/skills}/code-review/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/code-review/code-reviewer.md +0 -0
- /package/{skills → packages/ampcode/skills}/condition-based-waiting/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/condition-based-waiting/example.ts +0 -0
- /package/{skills → packages/ampcode/skills}/docx/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/docx/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/docx/docx-js.md +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/mce/mc.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/pack.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/unpack.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/validate.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/validation/__init__.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/validation/base.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/validation/docx.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/validation/pptx.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml/scripts/validation/redlining.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/ooxml.md +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/__init__.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/document.py +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/templates/comments.xml +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/templates/commentsExtended.xml +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/templates/commentsExtensible.xml +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/templates/commentsIds.xml +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/templates/people.xml +0 -0
- /package/{skills → packages/ampcode/skills}/docx/scripts/utilities.py +0 -0
- /package/{skills → packages/ampcode/skills}/internal-comms/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/internal-comms/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/internal-comms/examples/3p-updates.md +0 -0
- /package/{skills → packages/ampcode/skills}/internal-comms/examples/company-newsletter.md +0 -0
- /package/{skills → packages/ampcode/skills}/internal-comms/examples/faq-answers.md +0 -0
- /package/{skills → packages/ampcode/skills}/internal-comms/examples/general-comms.md +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/reference/evaluation.md +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/reference/mcp_best_practices.md +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/reference/node_mcp_server.md +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/reference/python_mcp_server.md +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/scripts/connections.py +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/scripts/evaluation.py +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/scripts/example_evaluation.xml +0 -0
- /package/{skills → packages/ampcode/skills}/mcp-builder/scripts/requirements.txt +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/forms.md +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/reference.md +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/check_bounding_boxes.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/check_bounding_boxes_test.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/check_fillable_fields.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/convert_pdf_to_images.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/create_validation_image.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/extract_form_field_info.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/fill_fillable_fields.py +0 -0
- /package/{skills → packages/ampcode/skills}/pdf/scripts/fill_pdf_form_with_annotations.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/html2pptx.md +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/mce/mc.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/pack.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/unpack.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/validate.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/validation/__init__.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/validation/base.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/validation/docx.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/validation/pptx.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml/scripts/validation/redlining.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/ooxml.md +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/scripts/html2pptx.js +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/scripts/inventory.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/scripts/rearrange.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/scripts/replace.py +0 -0
- /package/{skills → packages/ampcode/skills}/pptx/scripts/thumbnail.py +0 -0
- /package/{skills → packages/ampcode/skills}/root-cause-tracing/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/root-cause-tracing/find-polluter.sh +0 -0
- /package/{skills → packages/ampcode/skills}/skill-creator/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/skill-creator/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/skill-creator/scripts/init_skill.py +0 -0
- /package/{skills → packages/ampcode/skills}/skill-creator/scripts/package_skill.py +0 -0
- /package/{skills → packages/ampcode/skills}/skill-creator/scripts/quick_validate.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/color_palettes.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/easing.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/frame_composer.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/gif_builder.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/typography.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/validators.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/core/visual_effects.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/requirements.txt +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/bounce.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/explode.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/fade.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/flip.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/kaleidoscope.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/morph.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/move.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/pulse.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/shake.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/slide.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/spin.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/wiggle.py +0 -0
- /package/{skills → packages/ampcode/skills}/slack-gif-creator/templates/zoom.py +0 -0
- /package/{skills → packages/ampcode/skills}/systematic-debugging/CREATION-LOG.md +0 -0
- /package/{skills → packages/ampcode/skills}/systematic-debugging/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/systematic-debugging/test-academic.md +0 -0
- /package/{skills → packages/ampcode/skills}/systematic-debugging/test-pressure-1.md +0 -0
- /package/{skills → packages/ampcode/skills}/systematic-debugging/test-pressure-2.md +0 -0
- /package/{skills → packages/ampcode/skills}/systematic-debugging/test-pressure-3.md +0 -0
- /package/{skills → packages/ampcode/skills}/test-driven-development/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/testing-anti-patterns/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/theme-showcase.pdf +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/arctic-frost.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/botanical-garden.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/desert-rose.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/forest-canopy.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/golden-hour.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/midnight-galaxy.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/modern-minimalist.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/ocean-depths.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/sunset-boulevard.md +0 -0
- /package/{skills → packages/ampcode/skills}/theme-factory/themes/tech-innovation.md +0 -0
- /package/{skills → packages/ampcode/skills}/verification-before-completion/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/webapp-testing/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/webapp-testing/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/webapp-testing/examples/console_logging.py +0 -0
- /package/{skills → packages/ampcode/skills}/webapp-testing/examples/element_discovery.py +0 -0
- /package/{skills → packages/ampcode/skills}/webapp-testing/examples/static_html_automation.py +0 -0
- /package/{skills → packages/ampcode/skills}/webapp-testing/scripts/with_server.py +0 -0
- /package/{skills → packages/ampcode/skills}/xlsx/LICENSE.txt +0 -0
- /package/{skills → packages/ampcode/skills}/xlsx/SKILL.md +0 -0
- /package/{skills → packages/ampcode/skills}/xlsx/recalc.py +0 -0
- /package/{.claude-plugin → packages/claude/.claude-plugin}/marketplace.json +0 -0
- /package/{.claude-plugin → packages/claude/.claude-plugin}/plugin-lite.json +0 -0
- /package/{.claude-plugin → packages/claude/.claude-plugin}/plugin-pro.json +0 -0
- /package/{.claude-plugin → packages/claude/.claude-plugin}/plugin-standard.json +0 -0
- /package/{.claude-plugin → packages/claude/.claude-plugin}/plugin.json +0 -0
- /package/{agents → packages/claude/agents}/orchestrator.md +0 -0
- /package/{hooks → packages/claude/hooks}/register-agents.js +0 -0
- /package/{hooks → packages/claude/hooks}/session-start.js +0 -0
- /package/{resources → packages/claude/resources}/data.md +0 -0
package/installer/cli.js
ADDED
|
@@ -0,0 +1,2229 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Interactive CLI Installer for Agentic Kit
|
|
5
|
+
*
|
|
6
|
+
* Provides 4-step installation process:
|
|
7
|
+
* 1. Package variant selection (Lite/Standard/Pro)
|
|
8
|
+
* 2. Tool selection (Claude/Opencode/Ampcode/Droid)
|
|
9
|
+
* 3. Path configuration with confirmation
|
|
10
|
+
* 4. Installation summary and execution
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const readline = require('readline');
|
|
16
|
+
|
|
17
|
+
// ANSI color codes
|
|
18
|
+
const colors = {
|
|
19
|
+
reset: '\x1b[0m',
|
|
20
|
+
bright: '\x1b[1m',
|
|
21
|
+
green: '\x1b[32m',
|
|
22
|
+
blue: '\x1b[34m',
|
|
23
|
+
yellow: '\x1b[33m',
|
|
24
|
+
cyan: '\x1b[36m',
|
|
25
|
+
magenta: '\x1b[35m',
|
|
26
|
+
red: '\x1b[31m'
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
class InteractiveInstaller {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.rl = readline.createInterface({
|
|
32
|
+
input: process.stdin,
|
|
33
|
+
output: process.stdout
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
this.selections = {
|
|
37
|
+
variant: null,
|
|
38
|
+
tools: [],
|
|
39
|
+
paths: {}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Command-line arguments
|
|
43
|
+
this.cliArgs = this.parseCommandLineArgs();
|
|
44
|
+
|
|
45
|
+
// Initialize PackageManager for accessing package information
|
|
46
|
+
const PackageManager = require('./package-manager');
|
|
47
|
+
this.packageManager = new PackageManager();
|
|
48
|
+
|
|
49
|
+
this.tools = [
|
|
50
|
+
{
|
|
51
|
+
id: 'claude',
|
|
52
|
+
name: 'Claude Code',
|
|
53
|
+
path: '~/.claude',
|
|
54
|
+
description: 'AI-powered development assistant',
|
|
55
|
+
useCase: 'General software development with conversational AI',
|
|
56
|
+
targetUsers: 'All developers'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'opencode',
|
|
60
|
+
name: 'Opencode',
|
|
61
|
+
path: '~/.config/opencode',
|
|
62
|
+
description: 'CLI-optimized AI codegen tool',
|
|
63
|
+
useCase: 'Terminal-based development and automation',
|
|
64
|
+
targetUsers: 'CLI power users, DevOps teams'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'ampcode',
|
|
68
|
+
name: 'Ampcode',
|
|
69
|
+
path: '~/.config/amp',
|
|
70
|
+
description: 'Amplified AI development accelerator',
|
|
71
|
+
useCase: 'Velocity-focused workflows and rapid prototyping',
|
|
72
|
+
targetUsers: 'Teams seeking development acceleration'
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'droid',
|
|
76
|
+
name: 'Droid',
|
|
77
|
+
path: '~/.factory',
|
|
78
|
+
description: 'Android-focused AI development companion',
|
|
79
|
+
useCase: 'Mobile app development with Android Studio',
|
|
80
|
+
targetUsers: 'Android developers, mobile teams'
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
this.variants = [
|
|
85
|
+
{ id: 'lite', name: 'Lite', agents: 3, skills: 0, description: 'Minimal setup, CI/CD' },
|
|
86
|
+
{ id: 'standard', name: 'Standard', agents: 13, skills: 8, description: 'Most users, general dev' },
|
|
87
|
+
{ id: 'pro', name: 'Pro', agents: 13, skills: 14, description: 'Advanced users, full features' }
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Parse command-line arguments
|
|
93
|
+
* Supports various flags for non-interactive operation
|
|
94
|
+
*
|
|
95
|
+
* @returns {Object} - Parsed arguments object
|
|
96
|
+
*/
|
|
97
|
+
parseCommandLineArgs() {
|
|
98
|
+
const args = process.argv.slice(2);
|
|
99
|
+
const parsed = {
|
|
100
|
+
help: false,
|
|
101
|
+
uninstall: null,
|
|
102
|
+
upgrade: null,
|
|
103
|
+
upgradeVariant: null,
|
|
104
|
+
variant: null,
|
|
105
|
+
tools: [],
|
|
106
|
+
paths: {},
|
|
107
|
+
silent: false,
|
|
108
|
+
nonInteractive: false,
|
|
109
|
+
config: null,
|
|
110
|
+
noTelemetry: false
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
for (let i = 0; i < args.length; i++) {
|
|
114
|
+
const arg = args[i];
|
|
115
|
+
|
|
116
|
+
if (arg === '--help' || arg === '-h') {
|
|
117
|
+
parsed.help = true;
|
|
118
|
+
} else if (arg === '--uninstall') {
|
|
119
|
+
parsed.uninstall = args[++i];
|
|
120
|
+
} else if (arg === '--upgrade') {
|
|
121
|
+
parsed.upgrade = args[++i];
|
|
122
|
+
parsed.upgradeVariant = args[++i];
|
|
123
|
+
} else if (arg === '--variant') {
|
|
124
|
+
parsed.variant = args[++i];
|
|
125
|
+
} else if (arg === '--tools') {
|
|
126
|
+
parsed.tools = args[++i].split(',').map(t => t.trim());
|
|
127
|
+
} else if (arg === '--path') {
|
|
128
|
+
const pathArg = args[++i];
|
|
129
|
+
const [tool, pathValue] = pathArg.split('=');
|
|
130
|
+
parsed.paths[tool] = pathValue;
|
|
131
|
+
} else if (arg === '--silent' || arg === '--non-interactive' || arg === '--yes' || arg === '-y') {
|
|
132
|
+
parsed.silent = true;
|
|
133
|
+
parsed.nonInteractive = true;
|
|
134
|
+
} else if (arg === '--config') {
|
|
135
|
+
parsed.config = args[++i];
|
|
136
|
+
} else if (arg === '--no-telemetry') {
|
|
137
|
+
parsed.noTelemetry = true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return parsed;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Display help information
|
|
146
|
+
* Shows usage, options, and examples
|
|
147
|
+
*/
|
|
148
|
+
showHelp() {
|
|
149
|
+
console.log(`
|
|
150
|
+
${colors.bright}${colors.cyan}Agentic Kit Installer${colors.reset}
|
|
151
|
+
|
|
152
|
+
${colors.bright}USAGE:${colors.reset}
|
|
153
|
+
node installer/cli.js [OPTIONS]
|
|
154
|
+
|
|
155
|
+
${colors.bright}OPTIONS:${colors.reset}
|
|
156
|
+
${colors.green}--help, -h${colors.reset}
|
|
157
|
+
Display this help message
|
|
158
|
+
|
|
159
|
+
${colors.green}--uninstall <tool>${colors.reset}
|
|
160
|
+
Uninstall a specific tool
|
|
161
|
+
Example: node installer/cli.js --uninstall claude
|
|
162
|
+
|
|
163
|
+
${colors.green}--upgrade <tool> <variant>${colors.reset}
|
|
164
|
+
Upgrade or downgrade a tool to a different variant
|
|
165
|
+
Example: node installer/cli.js --upgrade claude pro
|
|
166
|
+
Example: node installer/cli.js --upgrade claude lite
|
|
167
|
+
|
|
168
|
+
${colors.green}--variant <lite|standard|pro>${colors.reset}
|
|
169
|
+
Select package variant (non-interactive mode)
|
|
170
|
+
Example: node installer/cli.js --variant standard --tools claude
|
|
171
|
+
|
|
172
|
+
${colors.green}--tools <tool1,tool2,...>${colors.reset}
|
|
173
|
+
Select tools to install (comma-separated, non-interactive mode)
|
|
174
|
+
Example: node installer/cli.js --variant standard --tools claude,opencode
|
|
175
|
+
|
|
176
|
+
${colors.green}--path <tool>=<path>${colors.reset}
|
|
177
|
+
Specify custom installation path for a tool
|
|
178
|
+
Example: node installer/cli.js --variant standard --tools claude --path claude=/custom/path
|
|
179
|
+
|
|
180
|
+
${colors.green}--silent, --non-interactive, --yes, -y${colors.reset}
|
|
181
|
+
Run in silent mode (no prompts, auto-confirm all)
|
|
182
|
+
Example: node installer/cli.js --variant standard --tools claude --silent
|
|
183
|
+
|
|
184
|
+
${colors.green}--config <file>${colors.reset}
|
|
185
|
+
Load configuration from JSON file
|
|
186
|
+
Example: node installer/cli.js --config install-config.json
|
|
187
|
+
|
|
188
|
+
${colors.green}--no-telemetry${colors.reset}
|
|
189
|
+
Disable anonymous usage statistics collection
|
|
190
|
+
Example: node installer/cli.js --no-telemetry
|
|
191
|
+
See docs/PRIVACY.md for details
|
|
192
|
+
|
|
193
|
+
${colors.bright}TOOLS:${colors.reset}
|
|
194
|
+
${colors.cyan}claude${colors.reset} - Claude Code (AI-powered development assistant)
|
|
195
|
+
${colors.cyan}opencode${colors.reset} - Opencode (CLI-optimized AI codegen tool)
|
|
196
|
+
${colors.cyan}ampcode${colors.reset} - Ampcode (Amplified AI development accelerator)
|
|
197
|
+
${colors.cyan}droid${colors.reset} - Droid (Android-focused AI development companion)
|
|
198
|
+
|
|
199
|
+
${colors.bright}VARIANTS:${colors.reset}
|
|
200
|
+
${colors.cyan}lite${colors.reset} - Minimal setup (3 agents, 0 skills) - For CI/CD
|
|
201
|
+
${colors.cyan}standard${colors.reset} - Standard setup (13 agents, 8 skills) - For most users
|
|
202
|
+
${colors.cyan}pro${colors.reset} - Full setup (13 agents, 22 skills) - For advanced users
|
|
203
|
+
|
|
204
|
+
${colors.bright}EXAMPLES:${colors.reset}
|
|
205
|
+
# Interactive installation (default)
|
|
206
|
+
node installer/cli.js
|
|
207
|
+
|
|
208
|
+
# Install Claude with Standard variant (non-interactive)
|
|
209
|
+
node installer/cli.js --variant standard --tools claude
|
|
210
|
+
|
|
211
|
+
# Install multiple tools with custom paths
|
|
212
|
+
node installer/cli.js --variant pro --tools claude,opencode --path claude=~/.claude-custom
|
|
213
|
+
|
|
214
|
+
# Uninstall a tool
|
|
215
|
+
node installer/cli.js --uninstall claude
|
|
216
|
+
|
|
217
|
+
# Silent installation for CI/CD
|
|
218
|
+
node installer/cli.js --variant lite --tools claude --silent
|
|
219
|
+
|
|
220
|
+
${colors.bright}For more information, visit:${colors.reset}
|
|
221
|
+
https://github.com/amrhas82/agentic-kit
|
|
222
|
+
`);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async run() {
|
|
226
|
+
try {
|
|
227
|
+
// Handle --help flag
|
|
228
|
+
if (this.cliArgs.help) {
|
|
229
|
+
this.showHelp();
|
|
230
|
+
process.exit(0);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Handle --uninstall flag
|
|
234
|
+
if (this.cliArgs.uninstall) {
|
|
235
|
+
await this.runUninstall(this.cliArgs.uninstall);
|
|
236
|
+
process.exit(0);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Handle --upgrade flag
|
|
240
|
+
if (this.cliArgs.upgrade) {
|
|
241
|
+
await this.runUpgrade(this.cliArgs.upgrade, this.cliArgs.upgradeVariant);
|
|
242
|
+
process.exit(0);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Handle --config flag
|
|
246
|
+
if (this.cliArgs.config) {
|
|
247
|
+
await this.loadConfig(this.cliArgs.config);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Handle non-interactive mode
|
|
251
|
+
if (this.cliArgs.variant && this.cliArgs.tools.length > 0) {
|
|
252
|
+
await this.runNonInteractive();
|
|
253
|
+
process.exit(0);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Interactive mode
|
|
257
|
+
this.showWelcome();
|
|
258
|
+
|
|
259
|
+
// Prompt for telemetry consent (first-time only)
|
|
260
|
+
await this.promptTelemetryConsent();
|
|
261
|
+
|
|
262
|
+
// Check for interrupted installation
|
|
263
|
+
const InstallationEngine = require('./installation-engine');
|
|
264
|
+
const PathManager = require('./path-manager');
|
|
265
|
+
const pathManager = new PathManager();
|
|
266
|
+
const installationEngine = new InstallationEngine(pathManager, this.packageManager);
|
|
267
|
+
|
|
268
|
+
const hasInterrupted = await installationEngine.hasInterruptedInstallation();
|
|
269
|
+
|
|
270
|
+
if (hasInterrupted) {
|
|
271
|
+
const shouldResume = await this.promptResume(installationEngine);
|
|
272
|
+
|
|
273
|
+
if (shouldResume) {
|
|
274
|
+
await this.resumeInstallation(installationEngine);
|
|
275
|
+
return; // Exit after resume
|
|
276
|
+
} else {
|
|
277
|
+
// Clear state and start fresh
|
|
278
|
+
await installationEngine.getStateManager().clearState();
|
|
279
|
+
console.log(`${colors.yellow}Starting fresh installation...${colors.reset}\n`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Normal installation flow
|
|
284
|
+
await this.selectVariant();
|
|
285
|
+
await this.selectTools();
|
|
286
|
+
await this.configurePaths();
|
|
287
|
+
await this.showSummary();
|
|
288
|
+
await this.install();
|
|
289
|
+
} catch (error) {
|
|
290
|
+
await this.handleFatalError(error);
|
|
291
|
+
} finally {
|
|
292
|
+
this.rl.close();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Run uninstall command for a specific tool
|
|
298
|
+
* Detects installation, prompts for confirmation, and executes uninstall
|
|
299
|
+
*
|
|
300
|
+
* @param {string} toolId - Tool to uninstall (claude, opencode, ampcode, droid)
|
|
301
|
+
*/
|
|
302
|
+
async runUninstall(toolId) {
|
|
303
|
+
console.log(`\n${colors.bright}${colors.cyan}Agentic Kit Uninstaller${colors.reset}\n`);
|
|
304
|
+
|
|
305
|
+
// Validate tool ID
|
|
306
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
307
|
+
if (!tool) {
|
|
308
|
+
console.log(`${colors.red}Error: Unknown tool '${toolId}'${colors.reset}`);
|
|
309
|
+
console.log(`${colors.yellow}Available tools: ${this.tools.map(t => t.id).join(', ')}${colors.reset}\n`);
|
|
310
|
+
process.exit(1);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Detect installation at default path
|
|
314
|
+
const os = require('os');
|
|
315
|
+
const defaultPath = tool.path.startsWith('~')
|
|
316
|
+
? path.join(os.homedir(), tool.path.slice(1))
|
|
317
|
+
: path.resolve(tool.path);
|
|
318
|
+
|
|
319
|
+
// Check if manifest exists at default path
|
|
320
|
+
const manifestPath = path.join(defaultPath, 'manifest.json');
|
|
321
|
+
let targetPath = defaultPath;
|
|
322
|
+
|
|
323
|
+
if (!fs.existsSync(manifestPath)) {
|
|
324
|
+
console.log(`${colors.yellow}No installation found at default path: ${defaultPath}${colors.reset}\n`);
|
|
325
|
+
|
|
326
|
+
// If not in silent mode, ask for custom path
|
|
327
|
+
if (!this.cliArgs.silent) {
|
|
328
|
+
const customPath = await this.askQuestion(
|
|
329
|
+
`${colors.cyan}Enter installation path (or press Enter to cancel):${colors.reset} `,
|
|
330
|
+
''
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
if (!customPath) {
|
|
334
|
+
console.log(`${colors.yellow}Uninstall cancelled${colors.reset}\n`);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
targetPath = customPath.startsWith('~')
|
|
339
|
+
? path.join(os.homedir(), customPath.slice(1))
|
|
340
|
+
: path.resolve(customPath);
|
|
341
|
+
|
|
342
|
+
const customManifestPath = path.join(targetPath, 'manifest.json');
|
|
343
|
+
if (!fs.existsSync(customManifestPath)) {
|
|
344
|
+
console.log(`${colors.red}Error: No installation found at ${targetPath}${colors.reset}\n`);
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
console.log(`${colors.red}Error: No installation found at default path${colors.reset}\n`);
|
|
349
|
+
process.exit(1);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
console.log(`${colors.bright}Tool:${colors.reset} ${tool.name}`);
|
|
354
|
+
console.log(`${colors.bright}Path:${colors.reset} ${targetPath}\n`);
|
|
355
|
+
|
|
356
|
+
// Initialize InstallationEngine
|
|
357
|
+
const PathManager = require('./path-manager');
|
|
358
|
+
const InstallationEngine = require('./installation-engine');
|
|
359
|
+
const pathManager = new PathManager();
|
|
360
|
+
const installationEngine = new InstallationEngine(pathManager, this.packageManager);
|
|
361
|
+
|
|
362
|
+
try {
|
|
363
|
+
// Read manifest to get file count
|
|
364
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
365
|
+
const fileCount = manifest.installedFiles
|
|
366
|
+
? Object.values(manifest.installedFiles).reduce((sum, arr) => sum + arr.length, 0)
|
|
367
|
+
: 0;
|
|
368
|
+
|
|
369
|
+
// Confirmation prompt (unless in silent mode)
|
|
370
|
+
if (!this.cliArgs.silent) {
|
|
371
|
+
console.log(`${colors.yellow}This will remove ${fileCount} file(s) and create a backup.${colors.reset}\n`);
|
|
372
|
+
|
|
373
|
+
const confirm = await this.askQuestion(
|
|
374
|
+
`${colors.bright}Proceed with uninstallation? (y/N):${colors.reset} `,
|
|
375
|
+
'n'
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
if (confirm.toLowerCase() !== 'y') {
|
|
379
|
+
console.log(`${colors.yellow}Uninstall cancelled${colors.reset}\n`);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
console.log(`\n${colors.bright}Uninstalling ${tool.name}...${colors.reset}\n`);
|
|
385
|
+
|
|
386
|
+
// Uninstall with progress callback
|
|
387
|
+
const result = await installationEngine.uninstall(
|
|
388
|
+
toolId,
|
|
389
|
+
targetPath,
|
|
390
|
+
null, // confirmCallback (already confirmed above)
|
|
391
|
+
(progress) => {
|
|
392
|
+
// Display progress
|
|
393
|
+
const percentage = Math.round((progress.filesRemoved / progress.totalFiles) * 100);
|
|
394
|
+
process.stdout.write(`\r${colors.cyan}Progress:${colors.reset} ${percentage}% (${progress.filesRemoved}/${progress.totalFiles} files removed)`);
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
// Clear progress line
|
|
399
|
+
process.stdout.write('\r' + ' '.repeat(80) + '\r');
|
|
400
|
+
|
|
401
|
+
// Display results
|
|
402
|
+
console.log(`${colors.green}✓ ${tool.name} uninstalled successfully${colors.reset}`);
|
|
403
|
+
console.log(`${colors.cyan}Files removed:${colors.reset} ${result.filesRemoved}`);
|
|
404
|
+
console.log(`${colors.cyan}Directories removed:${colors.reset} ${result.directoriesRemoved}`);
|
|
405
|
+
console.log(`${colors.cyan}Backup created:${colors.reset} ${result.backupPath}\n`);
|
|
406
|
+
|
|
407
|
+
if (result.warnings.length > 0) {
|
|
408
|
+
console.log(`${colors.yellow}Warnings:${colors.reset}`);
|
|
409
|
+
result.warnings.forEach(warning => {
|
|
410
|
+
console.log(` ${colors.yellow}⚠${colors.reset} ${warning.message}`);
|
|
411
|
+
});
|
|
412
|
+
console.log('');
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (result.errors.length > 0) {
|
|
416
|
+
console.log(`${colors.red}Errors:${colors.reset}`);
|
|
417
|
+
result.errors.forEach(error => {
|
|
418
|
+
console.log(` ${colors.red}✗${colors.reset} ${error.message}`);
|
|
419
|
+
});
|
|
420
|
+
console.log('');
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
} catch (error) {
|
|
424
|
+
console.error(`\n${colors.red}✗ Uninstall failed: ${error.message}${colors.reset}\n`);
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Run upgrade/downgrade command for a specific tool
|
|
431
|
+
* Changes the variant of an installed tool
|
|
432
|
+
*
|
|
433
|
+
* @param {string} toolId - Tool to upgrade (claude, opencode, ampcode, droid)
|
|
434
|
+
* @param {string} newVariant - Target variant (lite, standard, pro)
|
|
435
|
+
*/
|
|
436
|
+
async runUpgrade(toolId, newVariant) {
|
|
437
|
+
console.log(`\n${colors.bright}${colors.cyan}Agentic Kit Variant Upgrade${colors.reset}\n`);
|
|
438
|
+
|
|
439
|
+
// Validate tool ID
|
|
440
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
441
|
+
if (!tool) {
|
|
442
|
+
console.log(`${colors.red}Error: Unknown tool '${toolId}'${colors.reset}`);
|
|
443
|
+
console.log(`${colors.yellow}Available tools: ${this.tools.map(t => t.id).join(', ')}${colors.reset}\n`);
|
|
444
|
+
process.exit(1);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Validate variant
|
|
448
|
+
const validVariants = ['lite', 'standard', 'pro'];
|
|
449
|
+
if (!validVariants.includes(newVariant)) {
|
|
450
|
+
console.log(`${colors.red}Error: Invalid variant '${newVariant}'${colors.reset}`);
|
|
451
|
+
console.log(`${colors.yellow}Valid variants: ${validVariants.join(', ')}${colors.reset}\n`);
|
|
452
|
+
process.exit(1);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Detect installation at default path
|
|
456
|
+
const os = require('os');
|
|
457
|
+
const defaultPath = tool.path.startsWith('~')
|
|
458
|
+
? path.join(os.homedir(), tool.path.slice(1))
|
|
459
|
+
: path.resolve(tool.path);
|
|
460
|
+
|
|
461
|
+
// Check if manifest exists at default path
|
|
462
|
+
const manifestPath = path.join(defaultPath, 'manifest.json');
|
|
463
|
+
let targetPath = defaultPath;
|
|
464
|
+
|
|
465
|
+
if (!fs.existsSync(manifestPath)) {
|
|
466
|
+
console.log(`${colors.yellow}No installation found at default path: ${defaultPath}${colors.reset}\n`);
|
|
467
|
+
|
|
468
|
+
// If not in silent mode, ask for custom path
|
|
469
|
+
if (!this.cliArgs.silent) {
|
|
470
|
+
const customPath = await this.askQuestion(
|
|
471
|
+
`${colors.cyan}Enter installation path (or press Enter to cancel):${colors.reset} `,
|
|
472
|
+
''
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
if (!customPath) {
|
|
476
|
+
console.log(`${colors.yellow}Upgrade cancelled${colors.reset}\n`);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
targetPath = customPath.startsWith('~')
|
|
481
|
+
? path.join(os.homedir(), customPath.slice(1))
|
|
482
|
+
: path.resolve(customPath);
|
|
483
|
+
|
|
484
|
+
const customManifestPath = path.join(targetPath, 'manifest.json');
|
|
485
|
+
if (!fs.existsSync(customManifestPath)) {
|
|
486
|
+
console.log(`${colors.red}Error: No installation found at ${targetPath}${colors.reset}\n`);
|
|
487
|
+
process.exit(1);
|
|
488
|
+
}
|
|
489
|
+
} else {
|
|
490
|
+
console.log(`${colors.red}Error: No installation found at default path${colors.reset}\n`);
|
|
491
|
+
process.exit(1);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Read current variant
|
|
496
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(targetPath, 'manifest.json'), 'utf8'));
|
|
497
|
+
const currentVariant = manifest.variant;
|
|
498
|
+
|
|
499
|
+
console.log(`${colors.bright}Tool:${colors.reset} ${tool.name}`);
|
|
500
|
+
console.log(`${colors.bright}Current variant:${colors.reset} ${currentVariant}`);
|
|
501
|
+
console.log(`${colors.bright}Target variant:${colors.reset} ${newVariant}`);
|
|
502
|
+
console.log(`${colors.bright}Path:${colors.reset} ${targetPath}\n`);
|
|
503
|
+
|
|
504
|
+
// Check if same variant
|
|
505
|
+
if (currentVariant === newVariant) {
|
|
506
|
+
console.log(`${colors.yellow}Already using variant: ${newVariant}${colors.reset}\n`);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// Initialize InstallationEngine
|
|
511
|
+
const PathManager = require('./path-manager');
|
|
512
|
+
const InstallationEngine = require('./installation-engine');
|
|
513
|
+
const pathManager = new PathManager();
|
|
514
|
+
const installationEngine = new InstallationEngine(pathManager, this.packageManager);
|
|
515
|
+
|
|
516
|
+
try {
|
|
517
|
+
// Confirmation callback (unless in silent mode)
|
|
518
|
+
const confirmCallback = this.cliArgs.silent ? null : (data) => {
|
|
519
|
+
return new Promise(async (resolve) => {
|
|
520
|
+
const action = data.filesAdded > data.filesRemoved ? 'Upgrade' : 'Downgrade';
|
|
521
|
+
console.log(`${colors.yellow}${action} Summary:${colors.reset}`);
|
|
522
|
+
console.log(` ${colors.green}+${data.filesAdded} file(s) to add${colors.reset}`);
|
|
523
|
+
console.log(` ${colors.red}-${data.filesRemoved} file(s) to remove${colors.reset}\n`);
|
|
524
|
+
|
|
525
|
+
const confirm = await this.askQuestion(
|
|
526
|
+
`${colors.bright}Proceed with ${action.toLowerCase()}? (y/N):${colors.reset} `,
|
|
527
|
+
'n'
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
resolve(confirm.toLowerCase() === 'y');
|
|
531
|
+
});
|
|
532
|
+
};
|
|
533
|
+
|
|
534
|
+
// Progress callback
|
|
535
|
+
let lastStage = '';
|
|
536
|
+
const progressCallback = (progress) => {
|
|
537
|
+
if (progress.stage !== lastStage) {
|
|
538
|
+
if (lastStage) {
|
|
539
|
+
process.stdout.write('\n');
|
|
540
|
+
}
|
|
541
|
+
lastStage = progress.stage;
|
|
542
|
+
|
|
543
|
+
const stageMessages = {
|
|
544
|
+
reading_manifest: 'Reading current installation...',
|
|
545
|
+
comparing_variants: 'Comparing variants...',
|
|
546
|
+
creating_backup: 'Creating backup...',
|
|
547
|
+
removing_files: `Removing ${progress.count || 0} file(s)...`,
|
|
548
|
+
adding_files: `Adding ${progress.count || 0} file(s)...`,
|
|
549
|
+
updating_manifest: 'Updating manifest...',
|
|
550
|
+
verifying: 'Verifying installation...',
|
|
551
|
+
complete: 'Complete!'
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
const message = stageMessages[progress.stage] || progress.stage;
|
|
555
|
+
process.stdout.write(`${colors.cyan}${message}${colors.reset}`);
|
|
556
|
+
}
|
|
557
|
+
};
|
|
558
|
+
|
|
559
|
+
console.log(`${colors.bright}Upgrading ${tool.name}...${colors.reset}\n`);
|
|
560
|
+
|
|
561
|
+
// Execute upgrade
|
|
562
|
+
const result = await installationEngine.upgradeVariant(
|
|
563
|
+
toolId,
|
|
564
|
+
newVariant,
|
|
565
|
+
targetPath,
|
|
566
|
+
confirmCallback,
|
|
567
|
+
progressCallback
|
|
568
|
+
);
|
|
569
|
+
|
|
570
|
+
// Clear progress line
|
|
571
|
+
process.stdout.write('\n\n');
|
|
572
|
+
|
|
573
|
+
// Display results
|
|
574
|
+
if (!result.success) {
|
|
575
|
+
console.log(`${colors.red}✗ Upgrade failed: ${result.error}${colors.reset}\n`);
|
|
576
|
+
process.exit(1);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
const action = result.filesAdded > result.filesRemoved ? 'Upgrade' : 'Downgrade';
|
|
580
|
+
console.log(`${colors.green}✓ ${tool.name} ${action.toLowerCase()}d successfully${colors.reset}`);
|
|
581
|
+
console.log(`${colors.cyan}From variant:${colors.reset} ${result.fromVariant}`);
|
|
582
|
+
console.log(`${colors.cyan}To variant:${colors.reset} ${result.toVariant}`);
|
|
583
|
+
console.log(`${colors.cyan}Files added:${colors.reset} ${result.filesAdded}`);
|
|
584
|
+
console.log(`${colors.cyan}Files removed:${colors.reset} ${result.filesRemoved}`);
|
|
585
|
+
console.log(`${colors.cyan}Backup created:${colors.reset} ${result.backupPath}\n`);
|
|
586
|
+
|
|
587
|
+
if (result.verification && !result.verification.valid) {
|
|
588
|
+
console.log(`${colors.yellow}Warnings:${colors.reset}`);
|
|
589
|
+
result.verification.issues.forEach(issue => {
|
|
590
|
+
console.log(` ${colors.yellow}⚠${colors.reset} ${issue.message}`);
|
|
591
|
+
});
|
|
592
|
+
console.log('');
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
} catch (error) {
|
|
596
|
+
console.error(`\n${colors.red}✗ Upgrade failed: ${error.message}${colors.reset}\n`);
|
|
597
|
+
process.exit(1);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Load configuration from JSON file
|
|
603
|
+
* Used with --config flag
|
|
604
|
+
*
|
|
605
|
+
* @param {string} configPath - Path to configuration file
|
|
606
|
+
*/
|
|
607
|
+
async loadConfig(configPath) {
|
|
608
|
+
try {
|
|
609
|
+
const configContent = await fs.promises.readFile(configPath, 'utf8');
|
|
610
|
+
const config = JSON.parse(configContent);
|
|
611
|
+
|
|
612
|
+
// Validate and apply configuration
|
|
613
|
+
if (config.variant) {
|
|
614
|
+
this.cliArgs.variant = config.variant;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
if (config.tools && Array.isArray(config.tools)) {
|
|
618
|
+
this.cliArgs.tools = config.tools;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
if (config.paths && typeof config.paths === 'object') {
|
|
622
|
+
this.cliArgs.paths = { ...this.cliArgs.paths, ...config.paths };
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
if (config.silent !== undefined) {
|
|
626
|
+
this.cliArgs.silent = config.silent;
|
|
627
|
+
this.cliArgs.nonInteractive = config.silent;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
console.log(`${colors.green}✓ Configuration loaded from ${configPath}${colors.reset}\n`);
|
|
631
|
+
|
|
632
|
+
} catch (error) {
|
|
633
|
+
console.error(`${colors.red}Error loading configuration: ${error.message}${colors.reset}\n`);
|
|
634
|
+
process.exit(1);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* Run non-interactive installation
|
|
640
|
+
* Uses command-line arguments instead of prompts
|
|
641
|
+
*/
|
|
642
|
+
async runNonInteractive() {
|
|
643
|
+
console.log(`\n${colors.bright}${colors.cyan}Agentic Kit Installer (Non-Interactive Mode)${colors.reset}\n`);
|
|
644
|
+
|
|
645
|
+
// Validate variant
|
|
646
|
+
const variant = this.cliArgs.variant;
|
|
647
|
+
if (!['lite', 'standard', 'pro'].includes(variant)) {
|
|
648
|
+
console.log(`${colors.red}Error: Invalid variant '${variant}'${colors.reset}`);
|
|
649
|
+
console.log(`${colors.yellow}Valid variants: lite, standard, pro${colors.reset}\n`);
|
|
650
|
+
process.exit(1);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// Validate tools
|
|
654
|
+
const validTools = this.tools.map(t => t.id);
|
|
655
|
+
const invalidTools = this.cliArgs.tools.filter(t => !validTools.includes(t));
|
|
656
|
+
if (invalidTools.length > 0) {
|
|
657
|
+
console.log(`${colors.red}Error: Invalid tool(s): ${invalidTools.join(', ')}${colors.reset}`);
|
|
658
|
+
console.log(`${colors.yellow}Valid tools: ${validTools.join(', ')}${colors.reset}\n`);
|
|
659
|
+
process.exit(1);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
if (this.cliArgs.tools.length === 0) {
|
|
663
|
+
console.log(`${colors.red}Error: At least one tool must be specified${colors.reset}\n`);
|
|
664
|
+
process.exit(1);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// Set selections
|
|
668
|
+
this.selections.variant = variant;
|
|
669
|
+
this.selections.tools = this.cliArgs.tools;
|
|
670
|
+
|
|
671
|
+
// Set paths (use custom paths or defaults)
|
|
672
|
+
const os = require('os');
|
|
673
|
+
for (const toolId of this.selections.tools) {
|
|
674
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
675
|
+
|
|
676
|
+
if (this.cliArgs.paths[toolId]) {
|
|
677
|
+
this.selections.paths[toolId] = this.cliArgs.paths[toolId];
|
|
678
|
+
} else {
|
|
679
|
+
this.selections.paths[toolId] = tool.path;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// Display summary
|
|
684
|
+
const variantInfo = this.variants.find(v => v.id === variant);
|
|
685
|
+
console.log(`${colors.bright}Installation Summary:${colors.reset}`);
|
|
686
|
+
console.log(`${colors.cyan}Variant:${colors.reset} ${variantInfo.name} (${variantInfo.agents} agents, ${variantInfo.skills} skills)`);
|
|
687
|
+
console.log(`${colors.cyan}Tools:${colors.reset} ${this.selections.tools.join(', ')}`);
|
|
688
|
+
console.log('');
|
|
689
|
+
|
|
690
|
+
for (const toolId of this.selections.tools) {
|
|
691
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
692
|
+
const isCustom = this.selections.paths[toolId] !== tool.path;
|
|
693
|
+
console.log(`${colors.bright}${tool.name}${colors.reset}`);
|
|
694
|
+
console.log(` Path: ${this.selections.paths[toolId]}${isCustom ? ' (custom)' : ''}`);
|
|
695
|
+
}
|
|
696
|
+
console.log('');
|
|
697
|
+
|
|
698
|
+
// Run installation
|
|
699
|
+
try {
|
|
700
|
+
await this.install();
|
|
701
|
+
} catch (error) {
|
|
702
|
+
console.error(`${colors.red}✗ Installation failed: ${error.message}${colors.reset}\n`);
|
|
703
|
+
process.exit(1);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Handle fatal errors with detailed error messages and actionable advice
|
|
709
|
+
* Categorizes errors and provides specific guidance for each type
|
|
710
|
+
*
|
|
711
|
+
* @param {Error} error - The error that occurred
|
|
712
|
+
*/
|
|
713
|
+
async handleFatalError(error) {
|
|
714
|
+
console.log(''); // Add spacing
|
|
715
|
+
|
|
716
|
+
// Categorize the error and provide appropriate guidance
|
|
717
|
+
const errorInfo = this.categorizeError(error);
|
|
718
|
+
|
|
719
|
+
console.log(`${colors.red}${colors.bright}✗ Installation Failed${colors.reset}`);
|
|
720
|
+
console.log(`${colors.red}${'─'.repeat(60)}${colors.reset}\n`);
|
|
721
|
+
|
|
722
|
+
console.log(`${colors.bright}Error Type:${colors.reset} ${errorInfo.type}`);
|
|
723
|
+
console.log(`${colors.bright}Message:${colors.reset} ${error.message}\n`);
|
|
724
|
+
|
|
725
|
+
if (errorInfo.advice.length > 0) {
|
|
726
|
+
console.log(`${colors.yellow}${colors.bright}Suggested Actions:${colors.reset}`);
|
|
727
|
+
errorInfo.advice.forEach((advice, index) => {
|
|
728
|
+
console.log(` ${index + 1}. ${advice}`);
|
|
729
|
+
});
|
|
730
|
+
console.log('');
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// Display additional technical details if available
|
|
734
|
+
if (errorInfo.technicalDetails) {
|
|
735
|
+
console.log(`${colors.cyan}Technical Details:${colors.reset}`);
|
|
736
|
+
console.log(` ${errorInfo.technicalDetails}\n`);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// Exit with error code
|
|
740
|
+
process.exit(1);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Categorize errors and provide actionable advice
|
|
745
|
+
*
|
|
746
|
+
* @param {Error} error - The error to categorize
|
|
747
|
+
* @returns {object} Object with type, advice array, and technical details
|
|
748
|
+
*/
|
|
749
|
+
categorizeError(error) {
|
|
750
|
+
const message = error.message.toLowerCase();
|
|
751
|
+
const code = error.code;
|
|
752
|
+
|
|
753
|
+
// Permission errors
|
|
754
|
+
if (code === 'EACCES' || code === 'EPERM' || message.includes('permission denied')) {
|
|
755
|
+
return {
|
|
756
|
+
type: 'Permission Error',
|
|
757
|
+
advice: [
|
|
758
|
+
'Try running the installer with elevated permissions: sudo node installer/cli.js',
|
|
759
|
+
'Or choose a different installation directory where you have write access',
|
|
760
|
+
'Check directory permissions: ls -la on the parent directory'
|
|
761
|
+
],
|
|
762
|
+
technicalDetails: `Error code: ${code || 'EACCES'}`
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
// Disk space errors
|
|
767
|
+
if (code === 'ENOSPC' || message.includes('no space') || message.includes('disk space')) {
|
|
768
|
+
return {
|
|
769
|
+
type: 'Disk Space Error',
|
|
770
|
+
advice: [
|
|
771
|
+
'Free up disk space by removing unnecessary files',
|
|
772
|
+
'Check available space: df -h',
|
|
773
|
+
'Consider installing to a different location with more space',
|
|
774
|
+
'The installer requires at least 50MB of free space'
|
|
775
|
+
],
|
|
776
|
+
technicalDetails: 'Installation requires approximately 10MB per tool'
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// Network errors (if applicable)
|
|
781
|
+
if (code === 'ENOTFOUND' || code === 'ETIMEDOUT' || message.includes('network') || message.includes('connection')) {
|
|
782
|
+
return {
|
|
783
|
+
type: 'Network Error',
|
|
784
|
+
advice: [
|
|
785
|
+
'Check your internet connection',
|
|
786
|
+
'Verify proxy settings if behind a corporate firewall',
|
|
787
|
+
'Try again in a few moments',
|
|
788
|
+
'Use offline installation mode if available'
|
|
789
|
+
],
|
|
790
|
+
technicalDetails: `Network error code: ${code || 'UNKNOWN'}`
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// File not found / missing package errors
|
|
795
|
+
if (code === 'ENOENT' || message.includes('no such file') || message.includes('not found') || message.includes('invalid package')) {
|
|
796
|
+
return {
|
|
797
|
+
type: 'Missing Package Error',
|
|
798
|
+
advice: [
|
|
799
|
+
'Ensure agentic-kit is properly installed: npm install -g @amrhas82/agentic-kit',
|
|
800
|
+
'Verify the packages directory exists and contains required files',
|
|
801
|
+
'Try reinstalling agentic-kit: npm uninstall -g @amrhas82/agentic-kit && npm install -g @amrhas82/agentic-kit',
|
|
802
|
+
'Check that you are running the installer from the correct directory'
|
|
803
|
+
],
|
|
804
|
+
technicalDetails: `Missing file or package validation failed`
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// Path validation errors (check before invalid input errors)
|
|
809
|
+
if (message.includes('path') && (message.includes('invalid') || message.includes('absolute') || message.includes('must be absolute'))) {
|
|
810
|
+
return {
|
|
811
|
+
type: 'Path Validation Error',
|
|
812
|
+
advice: [
|
|
813
|
+
'Ensure the path is absolute (starts with / or ~)',
|
|
814
|
+
'Verify the parent directory exists',
|
|
815
|
+
'Check that you have write permissions for the specified path',
|
|
816
|
+
'Use default paths if custom paths are causing issues'
|
|
817
|
+
],
|
|
818
|
+
technicalDetails: 'Paths must be absolute and writable'
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// Invalid input errors
|
|
823
|
+
if (message.includes('invalid') || message.includes('must be') || message.includes('required')) {
|
|
824
|
+
return {
|
|
825
|
+
type: 'Invalid Input Error',
|
|
826
|
+
advice: [
|
|
827
|
+
'Review your selections and ensure all required options are provided',
|
|
828
|
+
'At least one tool must be selected',
|
|
829
|
+
'Paths must be absolute (start with / or ~)',
|
|
830
|
+
'Restart the installer and try again'
|
|
831
|
+
],
|
|
832
|
+
technicalDetails: error.message
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// Installation failures (general)
|
|
837
|
+
if (message.includes('install') || message.includes('copy') || message.includes('failed')) {
|
|
838
|
+
return {
|
|
839
|
+
type: 'Installation Error',
|
|
840
|
+
advice: [
|
|
841
|
+
'Check available disk space: df -h',
|
|
842
|
+
'Verify write permissions on the target directory',
|
|
843
|
+
'Ensure no other process is using the installation directory',
|
|
844
|
+
'Try installing to a different location',
|
|
845
|
+
'Review the installation log at ~/.agentic-kit-install.log for details'
|
|
846
|
+
],
|
|
847
|
+
technicalDetails: 'Installation process encountered an error during file operations'
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// Generic error
|
|
852
|
+
return {
|
|
853
|
+
type: 'Unknown Error',
|
|
854
|
+
advice: [
|
|
855
|
+
'Try running the installer again',
|
|
856
|
+
'Check system logs for more details',
|
|
857
|
+
'Report this issue at: https://github.com/amrhas82/agentic-kit/issues',
|
|
858
|
+
'Include the error message and your system information (OS, Node version)'
|
|
859
|
+
],
|
|
860
|
+
technicalDetails: error.stack ? error.stack.split('\n')[1] : 'No additional details'
|
|
861
|
+
};
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* Offer recovery options when an installation fails
|
|
866
|
+
* Allows user to continue with remaining tools or cancel
|
|
867
|
+
*
|
|
868
|
+
* @param {string} failedTool - Name of the tool that failed
|
|
869
|
+
* @param {number} currentIndex - Current tool index (1-based)
|
|
870
|
+
* @param {number} totalTools - Total number of tools
|
|
871
|
+
* @returns {Promise<boolean>} True to continue, false to cancel
|
|
872
|
+
*/
|
|
873
|
+
async offerRecoveryOptions(failedTool, currentIndex, totalTools) {
|
|
874
|
+
const remainingTools = totalTools - currentIndex;
|
|
875
|
+
|
|
876
|
+
console.log(`${colors.yellow}┌─────────────────────────────────────────────────────────────┐${colors.reset}`);
|
|
877
|
+
console.log(`${colors.yellow}│ Installation Failure - Recovery Options │${colors.reset}`);
|
|
878
|
+
console.log(`${colors.yellow}└─────────────────────────────────────────────────────────────┘${colors.reset}\n`);
|
|
879
|
+
|
|
880
|
+
console.log(`${colors.bright}Status:${colors.reset} ${failedTool} installation failed`);
|
|
881
|
+
console.log(`${colors.bright}Remaining:${colors.reset} ${remainingTools} tool${remainingTools > 1 ? 's' : ''} to install\n`);
|
|
882
|
+
|
|
883
|
+
// In silent mode, auto-continue with remaining tools
|
|
884
|
+
if (this.cliArgs.silent) {
|
|
885
|
+
console.log(`${colors.yellow}Silent mode: auto-continuing with remaining tools${colors.reset}\n`);
|
|
886
|
+
console.log(`${colors.yellow}Note:${colors.reset} The failed installation has been rolled back automatically.`);
|
|
887
|
+
console.log(`${colors.yellow}No partial files remain for ${failedTool}.${colors.reset}\n`);
|
|
888
|
+
return true;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
console.log(`${colors.cyan}Options:${colors.reset}`);
|
|
892
|
+
console.log(` ${colors.green}C${colors.reset} - Continue with remaining tools (recommended)`);
|
|
893
|
+
console.log(` ${colors.red}Q${colors.reset} - Quit installation (successful installations will be kept)\n`);
|
|
894
|
+
|
|
895
|
+
console.log(`${colors.yellow}Note:${colors.reset} The failed installation has been rolled back automatically.`);
|
|
896
|
+
console.log(`${colors.yellow}No partial files remain for ${failedTool}.${colors.reset}\n`);
|
|
897
|
+
|
|
898
|
+
const answer = await this.askQuestion(
|
|
899
|
+
`${colors.bright}Choose an option (C/Q):${colors.reset} `,
|
|
900
|
+
'C'
|
|
901
|
+
);
|
|
902
|
+
|
|
903
|
+
const choice = answer.toUpperCase();
|
|
904
|
+
|
|
905
|
+
if (choice === 'C' || choice === '') {
|
|
906
|
+
console.log(`${colors.green}Continuing with remaining tools...${colors.reset}\n`);
|
|
907
|
+
return true;
|
|
908
|
+
} else if (choice === 'Q') {
|
|
909
|
+
return false;
|
|
910
|
+
} else {
|
|
911
|
+
// Invalid choice, ask again
|
|
912
|
+
console.log(`${colors.red}Invalid choice. Please enter C or Q.${colors.reset}\n`);
|
|
913
|
+
return this.offerRecoveryOptions(failedTool, currentIndex, totalTools);
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* Prompt user to resume interrupted installation
|
|
919
|
+
* Shows summary of previous installation progress
|
|
920
|
+
*
|
|
921
|
+
* @param {InstallationEngine} installationEngine - Installation engine instance
|
|
922
|
+
* @returns {Promise<boolean>} - True if user wants to resume, false otherwise
|
|
923
|
+
*/
|
|
924
|
+
async promptResume(installationEngine) {
|
|
925
|
+
const summary = await installationEngine.getResumeSummary();
|
|
926
|
+
|
|
927
|
+
if (!summary) {
|
|
928
|
+
return false;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
console.clear();
|
|
932
|
+
console.log(`\n${colors.yellow}${colors.bright}Previous Installation Detected${colors.reset}`);
|
|
933
|
+
console.log(`${colors.yellow}${'─'.repeat(60)}${colors.reset}\n`);
|
|
934
|
+
|
|
935
|
+
// Format timestamp
|
|
936
|
+
const startedAt = new Date(summary.startedAt);
|
|
937
|
+
const lastUpdated = new Date(summary.lastUpdated);
|
|
938
|
+
const timeDiff = Math.floor((lastUpdated - startedAt) / 1000 / 60);
|
|
939
|
+
|
|
940
|
+
console.log(`${colors.cyan}Session ID:${colors.reset} ${summary.sessionId}`);
|
|
941
|
+
console.log(`${colors.cyan}Started:${colors.reset} ${startedAt.toLocaleString()}`);
|
|
942
|
+
console.log(`${colors.cyan}Last Updated:${colors.reset} ${lastUpdated.toLocaleString()} (${timeDiff} min ago)`);
|
|
943
|
+
console.log(`${colors.cyan}Variant:${colors.reset} ${summary.variant}`);
|
|
944
|
+
console.log('');
|
|
945
|
+
|
|
946
|
+
// Show progress
|
|
947
|
+
console.log(`${colors.bright}Progress:${colors.reset}`);
|
|
948
|
+
console.log(` Tools: ${summary.completedTools}/${summary.totalTools} completed`);
|
|
949
|
+
|
|
950
|
+
if (summary.completedToolsList.length > 0) {
|
|
951
|
+
console.log(`\n${colors.green}Completed:${colors.reset}`);
|
|
952
|
+
summary.completedToolsList.forEach(toolId => {
|
|
953
|
+
console.log(` ${colors.green}✓${colors.reset} ${toolId}`);
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
if (summary.failedToolsList.length > 0) {
|
|
958
|
+
console.log(`\n${colors.red}Failed:${colors.reset}`);
|
|
959
|
+
summary.failedToolsList.forEach(toolId => {
|
|
960
|
+
console.log(` ${colors.red}✗${colors.reset} ${toolId}`);
|
|
961
|
+
});
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
if (summary.currentTool) {
|
|
965
|
+
console.log(`\n${colors.yellow}Current Tool:${colors.reset} ${summary.currentTool}`);
|
|
966
|
+
const progress = summary.currentToolProgress;
|
|
967
|
+
if (progress.totalFiles > 0) {
|
|
968
|
+
console.log(` Progress: ${progress.filesCompleted}/${progress.totalFiles} files (${progress.percentComplete}%)`);
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
console.log('');
|
|
973
|
+
console.log(`${colors.bright}Would you like to resume this installation?${colors.reset}`);
|
|
974
|
+
console.log(` ${colors.green}Y${colors.reset} - Resume from where it left off`);
|
|
975
|
+
console.log(` ${colors.yellow}N${colors.reset} - Start fresh (previous state will be cleared)\n`);
|
|
976
|
+
|
|
977
|
+
const answer = await this.askQuestion(
|
|
978
|
+
`${colors.bright}Resume installation? (Y/n):${colors.reset} `,
|
|
979
|
+
'Y'
|
|
980
|
+
);
|
|
981
|
+
|
|
982
|
+
return answer.toLowerCase() !== 'n';
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
/**
|
|
986
|
+
* Resume interrupted installation
|
|
987
|
+
* Uses saved state to continue from where it left off
|
|
988
|
+
*
|
|
989
|
+
* @param {InstallationEngine} installationEngine - Installation engine instance with loaded state
|
|
990
|
+
*/
|
|
991
|
+
async resumeInstallation(installationEngine) {
|
|
992
|
+
const state = installationEngine.getStateManager().getState();
|
|
993
|
+
|
|
994
|
+
if (!state) {
|
|
995
|
+
console.log(`${colors.red}Error: Could not load installation state${colors.reset}`);
|
|
996
|
+
return;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
console.log(`\n${colors.bright}${colors.green}Resuming installation...${colors.reset}\n`);
|
|
1000
|
+
|
|
1001
|
+
// Restore selections from state
|
|
1002
|
+
this.selections.variant = state.variant;
|
|
1003
|
+
this.selections.tools = state.tools;
|
|
1004
|
+
this.selections.paths = state.paths;
|
|
1005
|
+
|
|
1006
|
+
// Use installMultipleTools with resume flag
|
|
1007
|
+
try {
|
|
1008
|
+
const results = await installationEngine.installMultipleTools(
|
|
1009
|
+
state.variant,
|
|
1010
|
+
state.tools,
|
|
1011
|
+
state.paths,
|
|
1012
|
+
(progress) => {
|
|
1013
|
+
// Progress callback (same as normal installation)
|
|
1014
|
+
this.drawProgressBar(
|
|
1015
|
+
progress.filesCompleted,
|
|
1016
|
+
progress.totalFiles,
|
|
1017
|
+
progress.percentage,
|
|
1018
|
+
progress.currentFile,
|
|
1019
|
+
this.formatBytes(progress.bytesTransferred),
|
|
1020
|
+
this.formatBytes(progress.totalBytes),
|
|
1021
|
+
this.formatBytes(progress.bytesTransferred / ((Date.now() - Date.now()) / 1000 || 1)) + '/s',
|
|
1022
|
+
'0:00',
|
|
1023
|
+
'0:00'
|
|
1024
|
+
);
|
|
1025
|
+
},
|
|
1026
|
+
true // resume = true
|
|
1027
|
+
);
|
|
1028
|
+
|
|
1029
|
+
// Display results
|
|
1030
|
+
console.log(`\n${colors.bright}Installation Complete${colors.reset}\n`);
|
|
1031
|
+
|
|
1032
|
+
if (results.successful.length > 0) {
|
|
1033
|
+
console.log(`${colors.green}Successfully installed:${colors.reset}`);
|
|
1034
|
+
results.successful.forEach(toolId => {
|
|
1035
|
+
console.log(` ${colors.green}✓${colors.reset} ${toolId}`);
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
if (results.skipped.length > 0) {
|
|
1040
|
+
console.log(`\n${colors.yellow}Skipped (already completed):${colors.reset}`);
|
|
1041
|
+
results.skipped.forEach(toolId => {
|
|
1042
|
+
console.log(` ${colors.yellow}○${colors.reset} ${toolId}`);
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
if (results.failed.length > 0) {
|
|
1047
|
+
console.log(`\n${colors.red}Failed:${colors.reset}`);
|
|
1048
|
+
results.failed.forEach(failure => {
|
|
1049
|
+
console.log(` ${colors.red}✗${colors.reset} ${failure.toolId}: ${failure.error}`);
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
} catch (error) {
|
|
1054
|
+
console.error(`${colors.red}Resume failed: ${error.message}${colors.reset}`);
|
|
1055
|
+
throw error;
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
showWelcome() {
|
|
1060
|
+
console.clear();
|
|
1061
|
+
console.log(`
|
|
1062
|
+
${colors.bright}${colors.cyan}┌─────────────────────────────────────────────────────────────┐${colors.reset}
|
|
1063
|
+
${colors.bright}${colors.cyan}│ Agentic Kit Installer v1.1.0 │${colors.reset}
|
|
1064
|
+
${colors.bright}${colors.cyan}│ Multi-Tool AI Development Kit Installer │${colors.reset}
|
|
1065
|
+
${colors.bright}${colors.cyan}└─────────────────────────────────────────────────────────────┘${colors.reset}
|
|
1066
|
+
|
|
1067
|
+
${colors.bright}This installer will set up AI development tools for:${colors.reset}
|
|
1068
|
+
• Claude Code • Opencode • Ampcode • Droid
|
|
1069
|
+
|
|
1070
|
+
${colors.yellow}Press Enter to begin or Ctrl+C to exit${colors.reset}
|
|
1071
|
+
`);
|
|
1072
|
+
|
|
1073
|
+
return new Promise(resolve => {
|
|
1074
|
+
this.rl.question('', resolve);
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
async selectVariant() {
|
|
1079
|
+
console.log(`\n${colors.bright}Step 1/4 — Choose Package Variant${colors.reset}\n`);
|
|
1080
|
+
|
|
1081
|
+
console.log('┌─────────────┬─────────┬─────────┬─────────────────────────────┐');
|
|
1082
|
+
console.log('│ Variant │ Agents │ Skills │ Description │');
|
|
1083
|
+
console.log('├─────────────┼─────────┼─────────┼─────────────────────────────┤');
|
|
1084
|
+
|
|
1085
|
+
this.variants.forEach((variant, index) => {
|
|
1086
|
+
const selected = index === 1 ? '●' : '○';
|
|
1087
|
+
const color = index === 1 ? colors.blue : colors.reset;
|
|
1088
|
+
console.log(`│ ${selected} ${color}${variant.name.padEnd(10)}${colors.reset} │ ${variant.agents.toString().padEnd(7)} │ ${variant.skills.toString().padEnd(7)} │ ${variant.description.padEnd(27)} │`);
|
|
1089
|
+
});
|
|
1090
|
+
|
|
1091
|
+
console.log('└─────────────┴─────────┴─────────┴─────────────────────────────┘');
|
|
1092
|
+
console.log('\nUse arrow keys to navigate, Enter to select');
|
|
1093
|
+
|
|
1094
|
+
// Default to Standard
|
|
1095
|
+
this.selections.variant = 'standard';
|
|
1096
|
+
|
|
1097
|
+
return new Promise(resolve => {
|
|
1098
|
+
this.rl.question('\nPress Enter to continue (default: Standard)', (answer) => {
|
|
1099
|
+
if (answer && ['lite', 'standard', 'pro'].includes(answer.toLowerCase())) {
|
|
1100
|
+
this.selections.variant = answer.toLowerCase();
|
|
1101
|
+
}
|
|
1102
|
+
resolve();
|
|
1103
|
+
});
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
async selectTools() {
|
|
1108
|
+
console.log(`\n${colors.bright}Step 2/4 — Choose Tools (Minimum 1 required)${colors.reset}\n`);
|
|
1109
|
+
|
|
1110
|
+
console.log(`${colors.cyan}Available Tools:${colors.reset}\n`);
|
|
1111
|
+
|
|
1112
|
+
// Display each tool with detailed information
|
|
1113
|
+
this.tools.forEach((tool, index) => {
|
|
1114
|
+
const num = index + 1;
|
|
1115
|
+
console.log(`${colors.bright}${num}. ${tool.name}${colors.reset}`);
|
|
1116
|
+
console.log(` ${colors.cyan}Description:${colors.reset} ${tool.description}`);
|
|
1117
|
+
console.log(` ${colors.cyan}Best for:${colors.reset} ${tool.useCase}`);
|
|
1118
|
+
console.log(` ${colors.cyan}Target Users:${colors.reset} ${tool.targetUsers}`);
|
|
1119
|
+
console.log(` ${colors.cyan}Default Path:${colors.reset} ${tool.path}`);
|
|
1120
|
+
console.log('');
|
|
1121
|
+
});
|
|
1122
|
+
|
|
1123
|
+
console.log(`${colors.yellow}Select tools by entering IDs separated by spaces${colors.reset}`);
|
|
1124
|
+
console.log(`${colors.yellow}Examples:${colors.reset}`);
|
|
1125
|
+
console.log(` "claude" - Install Claude Code only`);
|
|
1126
|
+
console.log(` "claude opencode" - Install Claude Code and Opencode`);
|
|
1127
|
+
console.log(` "claude opencode ampcode droid" - Install all tools`);
|
|
1128
|
+
|
|
1129
|
+
return new Promise(resolve => {
|
|
1130
|
+
this.rl.question(`\n${colors.bright}Select tools:${colors.reset} `, (answer) => {
|
|
1131
|
+
if (answer.trim()) {
|
|
1132
|
+
const selected = answer.toLowerCase().split(/\s+/);
|
|
1133
|
+
this.selections.tools = selected.filter(id =>
|
|
1134
|
+
this.tools.some(tool => tool.id === id)
|
|
1135
|
+
);
|
|
1136
|
+
|
|
1137
|
+
// Show invalid tool IDs if any
|
|
1138
|
+
const invalid = selected.filter(id =>
|
|
1139
|
+
!this.tools.some(tool => tool.id === id)
|
|
1140
|
+
);
|
|
1141
|
+
if (invalid.length > 0) {
|
|
1142
|
+
console.log(`${colors.yellow}Warning: Unrecognized tool IDs ignored: ${invalid.join(', ')}${colors.reset}`);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
if (this.selections.tools.length === 0) {
|
|
1147
|
+
console.log(`${colors.red}Error: At least one tool must be selected${colors.reset}`);
|
|
1148
|
+
console.log(`${colors.yellow}Valid tool IDs: ${this.tools.map(t => t.id).join(', ')}${colors.reset}\n`);
|
|
1149
|
+
throw new Error('At least one tool must be selected');
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
// Show selection summary
|
|
1153
|
+
console.log(`\n${colors.green}Selected ${this.selections.tools.length}/${this.tools.length} tools:${colors.reset}`);
|
|
1154
|
+
this.selections.tools.forEach(id => {
|
|
1155
|
+
const tool = this.tools.find(t => t.id === id);
|
|
1156
|
+
console.log(` ${colors.green}✓${colors.reset} ${tool.name}`);
|
|
1157
|
+
});
|
|
1158
|
+
|
|
1159
|
+
resolve();
|
|
1160
|
+
});
|
|
1161
|
+
});
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
async configurePaths() {
|
|
1165
|
+
console.log(`\n${colors.bright}Step 3/4 — Path Configuration${colors.reset}\n`);
|
|
1166
|
+
|
|
1167
|
+
console.log('Default installation paths for selected tools:\n');
|
|
1168
|
+
|
|
1169
|
+
for (const toolId of this.selections.tools) {
|
|
1170
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
1171
|
+
console.log(`${colors.bright}${tool.name}${colors.reset}`);
|
|
1172
|
+
console.log(`${colors.cyan}Default path:${colors.reset} ${tool.path}`);
|
|
1173
|
+
|
|
1174
|
+
const customPath = await this.askQuestion(
|
|
1175
|
+
`Enter path (or press Enter for default): `,
|
|
1176
|
+
tool.path
|
|
1177
|
+
);
|
|
1178
|
+
|
|
1179
|
+
// Detect custom path
|
|
1180
|
+
if (customPath !== tool.path) {
|
|
1181
|
+
// Show custom path confirmation dialog
|
|
1182
|
+
const confirmed = await this.showCustomPathConfirmation(tool, customPath);
|
|
1183
|
+
|
|
1184
|
+
if (confirmed) {
|
|
1185
|
+
this.selections.paths[toolId] = customPath;
|
|
1186
|
+
console.log(`${colors.green}✓ Using custom path: ${customPath}${colors.reset}\n`);
|
|
1187
|
+
} else {
|
|
1188
|
+
this.selections.paths[toolId] = tool.path;
|
|
1189
|
+
console.log(`${colors.blue}Using default path: ${tool.path}${colors.reset}\n`);
|
|
1190
|
+
}
|
|
1191
|
+
} else {
|
|
1192
|
+
this.selections.paths[toolId] = tool.path;
|
|
1193
|
+
console.log(`${colors.green}✓ Using default path${colors.reset}\n`);
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
async showCustomPathConfirmation(tool, customPath) {
|
|
1199
|
+
console.log(`\n${colors.yellow}┌─────────────────────────────────────────────────────────────┐${colors.reset}`);
|
|
1200
|
+
console.log(`${colors.yellow}│ Custom Path Confirmation │${colors.reset}`);
|
|
1201
|
+
console.log(`${colors.yellow}└─────────────────────────────────────────────────────────────┘${colors.reset}\n`);
|
|
1202
|
+
|
|
1203
|
+
console.log(`${colors.bright}Tool:${colors.reset} ${tool.name}`);
|
|
1204
|
+
console.log(`${colors.bright}Proposed custom path:${colors.reset} ${customPath}`);
|
|
1205
|
+
console.log(`${colors.bright}Default path:${colors.reset} ${tool.path}\n`);
|
|
1206
|
+
|
|
1207
|
+
// Validate the custom path
|
|
1208
|
+
const validation = this.validatePath(customPath);
|
|
1209
|
+
|
|
1210
|
+
// Display validation results
|
|
1211
|
+
console.log(`${colors.cyan}Validation Results:${colors.reset}`);
|
|
1212
|
+
|
|
1213
|
+
if (validation.valid) {
|
|
1214
|
+
console.log(`${colors.green}✓ Path is valid${colors.reset}`);
|
|
1215
|
+
if (validation.parentExists) {
|
|
1216
|
+
console.log(`${colors.green}✓ Parent directory exists${colors.reset}`);
|
|
1217
|
+
}
|
|
1218
|
+
if (validation.hasPermission) {
|
|
1219
|
+
console.log(`${colors.green}✓ Write permission available${colors.reset}`);
|
|
1220
|
+
}
|
|
1221
|
+
if (validation.hasDiskSpace) {
|
|
1222
|
+
console.log(`${colors.green}✓ Sufficient disk space${colors.reset}`);
|
|
1223
|
+
}
|
|
1224
|
+
} else {
|
|
1225
|
+
// Show validation warnings/errors
|
|
1226
|
+
validation.issues.forEach(issue => {
|
|
1227
|
+
const icon = issue.severity === 'error' ? '✗' : '⚠';
|
|
1228
|
+
const color = issue.severity === 'error' ? colors.red : colors.yellow;
|
|
1229
|
+
console.log(`${color}${icon} ${issue.message}${colors.reset}`);
|
|
1230
|
+
});
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
console.log('');
|
|
1234
|
+
|
|
1235
|
+
// Require explicit confirmation
|
|
1236
|
+
if (!validation.valid && validation.issues.some(i => i.severity === 'error')) {
|
|
1237
|
+
console.log(`${colors.red}Cannot use this path due to validation errors${colors.reset}`);
|
|
1238
|
+
console.log(`${colors.yellow}Press Enter to use default path instead${colors.reset}`);
|
|
1239
|
+
await this.askQuestion('');
|
|
1240
|
+
return false;
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
// Ask for confirmation
|
|
1244
|
+
const answer = await this.askQuestion(
|
|
1245
|
+
`${colors.bright}Confirm custom path? (y/N):${colors.reset} `,
|
|
1246
|
+
'n'
|
|
1247
|
+
);
|
|
1248
|
+
|
|
1249
|
+
return answer.toLowerCase() === 'y';
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
validatePath(customPath) {
|
|
1253
|
+
const result = {
|
|
1254
|
+
valid: true,
|
|
1255
|
+
issues: [],
|
|
1256
|
+
parentExists: false,
|
|
1257
|
+
hasPermission: false,
|
|
1258
|
+
hasDiskSpace: false
|
|
1259
|
+
};
|
|
1260
|
+
|
|
1261
|
+
// Expand tilde to home directory
|
|
1262
|
+
const expandedPath = customPath.startsWith('~')
|
|
1263
|
+
? path.join(require('os').homedir(), customPath.slice(1))
|
|
1264
|
+
: path.resolve(customPath);
|
|
1265
|
+
|
|
1266
|
+
try {
|
|
1267
|
+
// Check if path is absolute or can be resolved
|
|
1268
|
+
if (!path.isAbsolute(expandedPath)) {
|
|
1269
|
+
result.issues.push({
|
|
1270
|
+
severity: 'error',
|
|
1271
|
+
message: 'Path must be absolute'
|
|
1272
|
+
});
|
|
1273
|
+
result.valid = false;
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
// Check parent directory exists
|
|
1277
|
+
const parentDir = path.dirname(expandedPath);
|
|
1278
|
+
if (fs.existsSync(parentDir)) {
|
|
1279
|
+
result.parentExists = true;
|
|
1280
|
+
|
|
1281
|
+
// Check write permission on parent directory
|
|
1282
|
+
try {
|
|
1283
|
+
fs.accessSync(parentDir, fs.constants.W_OK);
|
|
1284
|
+
result.hasPermission = true;
|
|
1285
|
+
} catch (err) {
|
|
1286
|
+
result.issues.push({
|
|
1287
|
+
severity: 'error',
|
|
1288
|
+
message: 'No write permission for parent directory'
|
|
1289
|
+
});
|
|
1290
|
+
result.valid = false;
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
// Check disk space (require at least 50MB free)
|
|
1294
|
+
try {
|
|
1295
|
+
const stats = fs.statfsSync ? fs.statfsSync(parentDir) : null;
|
|
1296
|
+
if (stats) {
|
|
1297
|
+
const availableSpace = stats.bavail * stats.bsize;
|
|
1298
|
+
const requiredSpace = 50 * 1024 * 1024; // 50MB
|
|
1299
|
+
|
|
1300
|
+
if (availableSpace >= requiredSpace) {
|
|
1301
|
+
result.hasDiskSpace = true;
|
|
1302
|
+
} else {
|
|
1303
|
+
result.issues.push({
|
|
1304
|
+
severity: 'warning',
|
|
1305
|
+
message: `Low disk space (${Math.round(availableSpace / 1024 / 1024)}MB available, 50MB recommended)`
|
|
1306
|
+
});
|
|
1307
|
+
}
|
|
1308
|
+
} else {
|
|
1309
|
+
// Cannot check disk space on this platform
|
|
1310
|
+
result.hasDiskSpace = true; // Assume OK
|
|
1311
|
+
}
|
|
1312
|
+
} catch (err) {
|
|
1313
|
+
// Disk space check failed, but don't block installation
|
|
1314
|
+
result.hasDiskSpace = true; // Assume OK
|
|
1315
|
+
}
|
|
1316
|
+
} else {
|
|
1317
|
+
result.issues.push({
|
|
1318
|
+
severity: 'warning',
|
|
1319
|
+
message: 'Parent directory does not exist (will be created)'
|
|
1320
|
+
});
|
|
1321
|
+
// Still allow installation if parent can be created
|
|
1322
|
+
result.parentExists = false;
|
|
1323
|
+
result.hasPermission = true; // Assume OK if we can check grandparent
|
|
1324
|
+
result.hasDiskSpace = true; // Assume OK
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
// Check if path already exists
|
|
1328
|
+
if (fs.existsSync(expandedPath)) {
|
|
1329
|
+
result.issues.push({
|
|
1330
|
+
severity: 'warning',
|
|
1331
|
+
message: 'Path already exists (files may be overwritten)'
|
|
1332
|
+
});
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
} catch (err) {
|
|
1336
|
+
result.issues.push({
|
|
1337
|
+
severity: 'error',
|
|
1338
|
+
message: `Path validation error: ${err.message}`
|
|
1339
|
+
});
|
|
1340
|
+
result.valid = false;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
return result;
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
async showSummary() {
|
|
1347
|
+
console.log(`\n${colors.bright}Step 4/4 — Installation Summary${colors.reset}\n`);
|
|
1348
|
+
|
|
1349
|
+
const variant = this.variants.find(v => v.id === this.selections.variant);
|
|
1350
|
+
console.log(`Package: ${variant.name} (${variant.agents} agents, ${variant.skills} skills)`);
|
|
1351
|
+
console.log(`Tools: ${this.selections.tools.map(id =>
|
|
1352
|
+
this.tools.find(t => t.id === id).name
|
|
1353
|
+
).join(', ')}\n`);
|
|
1354
|
+
|
|
1355
|
+
console.log('Installation Details:');
|
|
1356
|
+
console.log('┌─────────────┬──────────────────┬──────────┬─────────────┐');
|
|
1357
|
+
console.log('│ Tool │ Path │ Files │ Size │');
|
|
1358
|
+
console.log('├─────────────┼──────────────────┼──────────┼─────────────┤');
|
|
1359
|
+
|
|
1360
|
+
// Collect actual file counts and sizes for each tool
|
|
1361
|
+
let totalFiles = 0;
|
|
1362
|
+
let totalBytes = 0;
|
|
1363
|
+
const toolData = [];
|
|
1364
|
+
|
|
1365
|
+
for (const toolId of this.selections.tools) {
|
|
1366
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
1367
|
+
const installPath = this.selections.paths[toolId];
|
|
1368
|
+
const isCustom = installPath !== tool.path;
|
|
1369
|
+
|
|
1370
|
+
try {
|
|
1371
|
+
// Get actual package contents and size from PackageManager
|
|
1372
|
+
const contents = await this.packageManager.getPackageContents(toolId, this.selections.variant);
|
|
1373
|
+
const sizeInfo = await this.packageManager.getPackageSize(toolId, this.selections.variant);
|
|
1374
|
+
|
|
1375
|
+
toolData.push({
|
|
1376
|
+
tool,
|
|
1377
|
+
path: installPath,
|
|
1378
|
+
isCustom,
|
|
1379
|
+
fileCount: contents.totalFiles,
|
|
1380
|
+
size: sizeInfo.formattedSize
|
|
1381
|
+
});
|
|
1382
|
+
|
|
1383
|
+
totalFiles += contents.totalFiles;
|
|
1384
|
+
totalBytes += sizeInfo.size;
|
|
1385
|
+
} catch (error) {
|
|
1386
|
+
// If package data not available, show placeholder
|
|
1387
|
+
toolData.push({
|
|
1388
|
+
tool,
|
|
1389
|
+
path: installPath,
|
|
1390
|
+
isCustom,
|
|
1391
|
+
fileCount: 'N/A',
|
|
1392
|
+
size: 'N/A'
|
|
1393
|
+
});
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
// Display tool rows with actual data
|
|
1398
|
+
for (const data of toolData) {
|
|
1399
|
+
const pathDisplay = data.isCustom ? `${data.path} *` : data.path;
|
|
1400
|
+
|
|
1401
|
+
// Format file count and size for display
|
|
1402
|
+
const fileCountStr = typeof data.fileCount === 'number' ? `${data.fileCount}` : data.fileCount;
|
|
1403
|
+
const sizeStr = data.size;
|
|
1404
|
+
|
|
1405
|
+
console.log(`│ ${data.tool.name.padEnd(11)} │ ${pathDisplay.padEnd(16)} │ ${fileCountStr.padEnd(8)} │ ${sizeStr.padEnd(11)} │`);
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
console.log('└─────────────┴──────────────────┴──────────┴─────────────┘');
|
|
1409
|
+
|
|
1410
|
+
// Show custom path footnote if applicable
|
|
1411
|
+
if (toolData.some(d => d.isCustom)) {
|
|
1412
|
+
console.log('\n* Custom path specified');
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
// Show totals if we have data
|
|
1416
|
+
if (totalFiles > 0) {
|
|
1417
|
+
// Format total size
|
|
1418
|
+
const totalSizeFormatted = this.formatBytes(totalBytes);
|
|
1419
|
+
console.log(`\n${colors.cyan}Total:${colors.reset} ${totalFiles} files, ${totalSizeFormatted}`);
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
console.log('\nPress Enter to install or Esc to cancel');
|
|
1423
|
+
|
|
1424
|
+
return new Promise(resolve => {
|
|
1425
|
+
this.rl.question('', resolve);
|
|
1426
|
+
});
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
/**
|
|
1430
|
+
* Format bytes to human-readable size (helper method for summary display)
|
|
1431
|
+
* @param {number} bytes - Size in bytes
|
|
1432
|
+
* @returns {string} Formatted size string (e.g., "8.39 MB")
|
|
1433
|
+
*/
|
|
1434
|
+
formatBytes(bytes) {
|
|
1435
|
+
if (bytes === 0) return '0 Bytes';
|
|
1436
|
+
|
|
1437
|
+
const k = 1024;
|
|
1438
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
1439
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
1440
|
+
|
|
1441
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
/**
|
|
1445
|
+
* Get PackageManager instance (for testing and internal use)
|
|
1446
|
+
* @returns {PackageManager} Package manager instance
|
|
1447
|
+
*/
|
|
1448
|
+
getPackageManager() {
|
|
1449
|
+
return this.packageManager;
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
/**
|
|
1453
|
+
* Perform pre-installation checks to catch potential issues early
|
|
1454
|
+
* Validates packages, paths, permissions, and disk space
|
|
1455
|
+
*
|
|
1456
|
+
* @returns {Promise<object>} Object with success flag, errors array, and warnings array
|
|
1457
|
+
*/
|
|
1458
|
+
async performPreInstallationChecks() {
|
|
1459
|
+
const errors = [];
|
|
1460
|
+
const warnings = [];
|
|
1461
|
+
const os = require('os');
|
|
1462
|
+
|
|
1463
|
+
// Check Node.js version (require 14+)
|
|
1464
|
+
const nodeVersion = process.version;
|
|
1465
|
+
const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0]);
|
|
1466
|
+
if (majorVersion < 14) {
|
|
1467
|
+
errors.push(`Node.js version ${nodeVersion} is too old. Please upgrade to Node.js 14 or higher.`);
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
// Validate each selected tool's package
|
|
1471
|
+
for (const toolId of this.selections.tools) {
|
|
1472
|
+
try {
|
|
1473
|
+
const validation = await this.packageManager.validatePackage(toolId, this.selections.variant);
|
|
1474
|
+
if (!validation.valid) {
|
|
1475
|
+
errors.push(`Package validation failed for ${toolId}: ${validation.error}`);
|
|
1476
|
+
}
|
|
1477
|
+
} catch (error) {
|
|
1478
|
+
errors.push(`Cannot validate package for ${toolId}: ${error.message}`);
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
// Validate all installation paths
|
|
1483
|
+
for (const toolId of this.selections.tools) {
|
|
1484
|
+
const targetPath = this.selections.paths[toolId];
|
|
1485
|
+
const expandedPath = targetPath.startsWith('~')
|
|
1486
|
+
? path.join(os.homedir(), targetPath.slice(1))
|
|
1487
|
+
: path.resolve(targetPath);
|
|
1488
|
+
|
|
1489
|
+
// Check parent directory write permissions
|
|
1490
|
+
const parentDir = path.dirname(expandedPath);
|
|
1491
|
+
try {
|
|
1492
|
+
if (fs.existsSync(parentDir)) {
|
|
1493
|
+
fs.accessSync(parentDir, fs.constants.W_OK);
|
|
1494
|
+
} else {
|
|
1495
|
+
// Check if we can create parent directory
|
|
1496
|
+
const grandParentDir = path.dirname(parentDir);
|
|
1497
|
+
if (fs.existsSync(grandParentDir)) {
|
|
1498
|
+
fs.accessSync(grandParentDir, fs.constants.W_OK);
|
|
1499
|
+
} else {
|
|
1500
|
+
errors.push(`Cannot create installation path for ${toolId}: parent directories do not exist`);
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
} catch (error) {
|
|
1504
|
+
errors.push(`No write permission for ${toolId} installation path: ${targetPath}`);
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
// Check if path already exists and has content
|
|
1508
|
+
if (fs.existsSync(expandedPath)) {
|
|
1509
|
+
try {
|
|
1510
|
+
const files = fs.readdirSync(expandedPath);
|
|
1511
|
+
if (files.length > 0) {
|
|
1512
|
+
warnings.push(`${toolId} installation path already exists and contains ${files.length} file(s). Existing installation will be backed up.`);
|
|
1513
|
+
}
|
|
1514
|
+
} catch (error) {
|
|
1515
|
+
warnings.push(`Cannot read existing installation directory for ${toolId}`);
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
// Check available disk space
|
|
1521
|
+
try {
|
|
1522
|
+
// Calculate total required space for all selected tools
|
|
1523
|
+
let totalRequiredSpace = 0;
|
|
1524
|
+
for (const toolId of this.selections.tools) {
|
|
1525
|
+
try {
|
|
1526
|
+
const sizeInfo = await this.packageManager.getPackageSize(toolId, this.selections.variant);
|
|
1527
|
+
totalRequiredSpace += sizeInfo.size;
|
|
1528
|
+
} catch (error) {
|
|
1529
|
+
// Skip if we can't determine size
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
// Check disk space on home directory
|
|
1534
|
+
const homeDir = os.homedir();
|
|
1535
|
+
if (fs.statfsSync) {
|
|
1536
|
+
const stats = fs.statfsSync(homeDir);
|
|
1537
|
+
const availableSpace = stats.bavail * stats.bsize;
|
|
1538
|
+
const requiredSpace = totalRequiredSpace * 1.5; // 50% buffer for safety
|
|
1539
|
+
|
|
1540
|
+
if (availableSpace < requiredSpace) {
|
|
1541
|
+
const availableMB = Math.round(availableSpace / 1024 / 1024);
|
|
1542
|
+
const requiredMB = Math.round(requiredSpace / 1024 / 1024);
|
|
1543
|
+
errors.push(`Insufficient disk space: ${availableMB}MB available, ${requiredMB}MB required`);
|
|
1544
|
+
} else if (availableSpace < totalRequiredSpace * 2) {
|
|
1545
|
+
const availableMB = Math.round(availableSpace / 1024 / 1024);
|
|
1546
|
+
warnings.push(`Low disk space: ${availableMB}MB available. Consider freeing up space.`);
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
} catch (error) {
|
|
1550
|
+
// Disk space check not available on this platform
|
|
1551
|
+
warnings.push('Could not check disk space (platform limitation)');
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
// Check for conflicting installations
|
|
1555
|
+
for (const toolId of this.selections.tools) {
|
|
1556
|
+
const targetPath = this.selections.paths[toolId];
|
|
1557
|
+
const expandedPath = targetPath.startsWith('~')
|
|
1558
|
+
? path.join(os.homedir(), targetPath.slice(1))
|
|
1559
|
+
: path.resolve(targetPath);
|
|
1560
|
+
|
|
1561
|
+
const manifestPath = path.join(expandedPath, 'manifest.json');
|
|
1562
|
+
if (fs.existsSync(manifestPath)) {
|
|
1563
|
+
try {
|
|
1564
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
1565
|
+
if (manifest.tool !== toolId) {
|
|
1566
|
+
warnings.push(`Path ${targetPath} contains a different tool (${manifest.tool}). This may cause conflicts.`);
|
|
1567
|
+
}
|
|
1568
|
+
} catch (error) {
|
|
1569
|
+
warnings.push(`Cannot read existing manifest at ${targetPath}`);
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
return {
|
|
1575
|
+
success: errors.length === 0,
|
|
1576
|
+
errors,
|
|
1577
|
+
warnings
|
|
1578
|
+
};
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
async install() {
|
|
1582
|
+
console.log(`\n${colors.bright}Installing ${this.selections.variant} package...${colors.reset}\n`);
|
|
1583
|
+
|
|
1584
|
+
// Perform pre-installation checks
|
|
1585
|
+
console.log(`${colors.cyan}Performing pre-installation checks...${colors.reset}`);
|
|
1586
|
+
const preCheckResult = await this.performPreInstallationChecks();
|
|
1587
|
+
|
|
1588
|
+
if (!preCheckResult.success) {
|
|
1589
|
+
console.log(`\n${colors.red}Pre-installation checks failed:${colors.reset}`);
|
|
1590
|
+
preCheckResult.errors.forEach(error => {
|
|
1591
|
+
console.log(` ${colors.red}✗${colors.reset} ${error}`);
|
|
1592
|
+
});
|
|
1593
|
+
|
|
1594
|
+
if (preCheckResult.warnings.length > 0) {
|
|
1595
|
+
console.log(`\n${colors.yellow}Warnings:${colors.reset}`);
|
|
1596
|
+
preCheckResult.warnings.forEach(warning => {
|
|
1597
|
+
console.log(` ${colors.yellow}⚠${colors.reset} ${warning}`);
|
|
1598
|
+
});
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
throw new Error('Pre-installation checks failed. Please resolve the issues above and try again.');
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
if (preCheckResult.warnings.length > 0) {
|
|
1605
|
+
console.log(`${colors.yellow}Warnings detected:${colors.reset}`);
|
|
1606
|
+
preCheckResult.warnings.forEach(warning => {
|
|
1607
|
+
console.log(` ${colors.yellow}⚠${colors.reset} ${warning}`);
|
|
1608
|
+
});
|
|
1609
|
+
|
|
1610
|
+
// In silent mode, auto-proceed with warnings
|
|
1611
|
+
if (!this.cliArgs.silent) {
|
|
1612
|
+
const proceed = await this.askQuestion(
|
|
1613
|
+
`\n${colors.bright}Continue despite warnings? (Y/n):${colors.reset} `,
|
|
1614
|
+
'Y'
|
|
1615
|
+
);
|
|
1616
|
+
|
|
1617
|
+
if (proceed.toLowerCase() === 'n') {
|
|
1618
|
+
throw new Error('Installation cancelled by user due to warnings');
|
|
1619
|
+
}
|
|
1620
|
+
} else {
|
|
1621
|
+
console.log(`${colors.yellow}Silent mode: auto-proceeding despite warnings${colors.reset}`);
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
console.log(`${colors.green}✓ Pre-installation checks passed${colors.reset}\n`);
|
|
1626
|
+
|
|
1627
|
+
// Initialize InstallationEngine
|
|
1628
|
+
const PathManager = require('./path-manager');
|
|
1629
|
+
const InstallationEngine = require('./installation-engine');
|
|
1630
|
+
|
|
1631
|
+
const pathManager = new PathManager();
|
|
1632
|
+
const installationEngine = new InstallationEngine(pathManager, this.packageManager);
|
|
1633
|
+
|
|
1634
|
+
// Initialize state management for resume capability
|
|
1635
|
+
installationEngine.getStateManager().initializeState(
|
|
1636
|
+
this.selections.variant,
|
|
1637
|
+
this.selections.tools,
|
|
1638
|
+
this.selections.paths
|
|
1639
|
+
);
|
|
1640
|
+
await installationEngine.getStateManager().saveState({ stage: 'initializing' });
|
|
1641
|
+
|
|
1642
|
+
// Track overall progress
|
|
1643
|
+
let overallFilesCompleted = 0;
|
|
1644
|
+
let overallTotalFiles = 0;
|
|
1645
|
+
let successfulInstalls = [];
|
|
1646
|
+
let failedInstalls = [];
|
|
1647
|
+
let verificationResults = [];
|
|
1648
|
+
|
|
1649
|
+
// Calculate total files across all tools (only for valid tools)
|
|
1650
|
+
const toolFileCount = {};
|
|
1651
|
+
for (const toolId of this.selections.tools) {
|
|
1652
|
+
try {
|
|
1653
|
+
const contents = await this.packageManager.getPackageContents(toolId, this.selections.variant);
|
|
1654
|
+
toolFileCount[toolId] = contents.totalFiles;
|
|
1655
|
+
overallTotalFiles += contents.totalFiles;
|
|
1656
|
+
} catch (error) {
|
|
1657
|
+
// Skip tools that don't have valid packages
|
|
1658
|
+
toolFileCount[toolId] = 0;
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
const startTime = Date.now();
|
|
1663
|
+
|
|
1664
|
+
// Install each selected tool
|
|
1665
|
+
for (let i = 0; i < this.selections.tools.length; i++) {
|
|
1666
|
+
const toolId = this.selections.tools[i];
|
|
1667
|
+
const tool = this.tools.find(t => t.id === toolId);
|
|
1668
|
+
const targetPath = this.selections.paths[toolId];
|
|
1669
|
+
|
|
1670
|
+
console.log(`\n${colors.bright}[${i + 1}/${this.selections.tools.length}] Installing ${tool.name}...${colors.reset}`);
|
|
1671
|
+
console.log(`${colors.cyan}Target:${colors.reset} ${targetPath}\n`);
|
|
1672
|
+
|
|
1673
|
+
// Track files completed for this tool
|
|
1674
|
+
let toolFilesCompleted = 0;
|
|
1675
|
+
let toolStartTime = Date.now();
|
|
1676
|
+
|
|
1677
|
+
try {
|
|
1678
|
+
// Install with progress callback
|
|
1679
|
+
await installationEngine.installPackage(
|
|
1680
|
+
toolId,
|
|
1681
|
+
this.selections.variant,
|
|
1682
|
+
targetPath,
|
|
1683
|
+
(progress) => {
|
|
1684
|
+
// Update tool files completed (only count new files)
|
|
1685
|
+
if (progress.filesCompleted > toolFilesCompleted) {
|
|
1686
|
+
const newFiles = progress.filesCompleted - toolFilesCompleted;
|
|
1687
|
+
overallFilesCompleted += newFiles;
|
|
1688
|
+
toolFilesCompleted = progress.filesCompleted;
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
// Calculate elapsed time and speed
|
|
1692
|
+
const elapsedMs = Date.now() - toolStartTime;
|
|
1693
|
+
const elapsedSec = Math.floor(elapsedMs / 1000);
|
|
1694
|
+
const elapsedMin = Math.floor(elapsedSec / 60);
|
|
1695
|
+
const elapsedSecRemainder = elapsedSec % 60;
|
|
1696
|
+
const elapsedFormatted = `${elapsedMin}:${elapsedSecRemainder.toString().padStart(2, '0')}`;
|
|
1697
|
+
|
|
1698
|
+
// Calculate transfer speed (bytes per second)
|
|
1699
|
+
const speed = elapsedMs > 0 ? progress.bytesTransferred / (elapsedMs / 1000) : 0;
|
|
1700
|
+
const speedFormatted = this.formatBytes(speed);
|
|
1701
|
+
|
|
1702
|
+
// Calculate ETA
|
|
1703
|
+
const remainingBytes = progress.totalBytes - progress.bytesTransferred;
|
|
1704
|
+
const etaSec = speed > 0 ? Math.floor(remainingBytes / speed) : 0;
|
|
1705
|
+
const etaMin = Math.floor(etaSec / 60);
|
|
1706
|
+
const etaSecRemainder = etaSec % 60;
|
|
1707
|
+
const etaFormatted = `${etaMin}:${etaSecRemainder.toString().padStart(2, '0')}`;
|
|
1708
|
+
|
|
1709
|
+
// Draw progress bar for current tool
|
|
1710
|
+
this.drawProgressBar(
|
|
1711
|
+
progress.filesCompleted,
|
|
1712
|
+
progress.totalFiles,
|
|
1713
|
+
progress.percentage,
|
|
1714
|
+
progress.currentFile,
|
|
1715
|
+
this.formatBytes(progress.bytesTransferred),
|
|
1716
|
+
this.formatBytes(progress.totalBytes),
|
|
1717
|
+
speedFormatted,
|
|
1718
|
+
elapsedFormatted,
|
|
1719
|
+
etaFormatted
|
|
1720
|
+
);
|
|
1721
|
+
|
|
1722
|
+
// Draw overall progress
|
|
1723
|
+
// Cap overall percentage at 100% to handle file count mismatches
|
|
1724
|
+
const overallPercentage = overallTotalFiles > 0
|
|
1725
|
+
? Math.min(100, Math.round((overallFilesCompleted / overallTotalFiles) * 100))
|
|
1726
|
+
: 0;
|
|
1727
|
+
|
|
1728
|
+
this.drawOverallProgress(
|
|
1729
|
+
overallFilesCompleted,
|
|
1730
|
+
overallTotalFiles,
|
|
1731
|
+
overallPercentage,
|
|
1732
|
+
i + 1,
|
|
1733
|
+
this.selections.tools.length
|
|
1734
|
+
);
|
|
1735
|
+
}
|
|
1736
|
+
);
|
|
1737
|
+
|
|
1738
|
+
// Clear progress lines after completion
|
|
1739
|
+
process.stdout.write('\x1b[2K\r'); // Clear current line
|
|
1740
|
+
process.stdout.write('\x1b[1A\x1b[2K\r'); // Clear previous line
|
|
1741
|
+
|
|
1742
|
+
console.log(`${colors.green}✓ ${tool.name} installed successfully${colors.reset}`);
|
|
1743
|
+
console.log(` ${colors.cyan}Location:${colors.reset} ${targetPath}`);
|
|
1744
|
+
console.log(` ${colors.cyan}Files:${colors.reset} ${toolFilesCompleted} files`);
|
|
1745
|
+
|
|
1746
|
+
// Verify installation
|
|
1747
|
+
console.log(` ${colors.cyan}Verifying installation...${colors.reset}`);
|
|
1748
|
+
const verification = await installationEngine.verifyInstallation(toolId, targetPath);
|
|
1749
|
+
|
|
1750
|
+
if (verification.valid) {
|
|
1751
|
+
console.log(` ${colors.green}✓ Verification passed${colors.reset}`);
|
|
1752
|
+
} else {
|
|
1753
|
+
console.log(` ${colors.yellow}⚠ Verification completed with issues${colors.reset}`);
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1756
|
+
successfulInstalls.push({
|
|
1757
|
+
toolId,
|
|
1758
|
+
name: tool.name,
|
|
1759
|
+
path: targetPath,
|
|
1760
|
+
fileCount: toolFilesCompleted
|
|
1761
|
+
});
|
|
1762
|
+
|
|
1763
|
+
verificationResults.push(verification);
|
|
1764
|
+
|
|
1765
|
+
// Mark tool as completed in state
|
|
1766
|
+
await installationEngine.getStateManager().completeCurrentTool();
|
|
1767
|
+
|
|
1768
|
+
} catch (error) {
|
|
1769
|
+
// Clear progress lines on error
|
|
1770
|
+
process.stdout.write('\x1b[2K\r');
|
|
1771
|
+
process.stdout.write('\x1b[1A\x1b[2K\r');
|
|
1772
|
+
|
|
1773
|
+
// Categorize the error for better user guidance
|
|
1774
|
+
const errorInfo = this.categorizeError(error);
|
|
1775
|
+
|
|
1776
|
+
console.error(`${colors.red}✗ Failed to install ${tool.name}${colors.reset}`);
|
|
1777
|
+
console.error(` ${colors.red}Error Type:${colors.reset} ${errorInfo.type}`);
|
|
1778
|
+
console.error(` ${colors.red}Message:${colors.reset} ${error.message}\n`);
|
|
1779
|
+
|
|
1780
|
+
// Display actionable advice
|
|
1781
|
+
if (errorInfo.advice.length > 0) {
|
|
1782
|
+
console.error(` ${colors.yellow}Suggested Actions:${colors.reset}`);
|
|
1783
|
+
errorInfo.advice.slice(0, 3).forEach((advice, index) => {
|
|
1784
|
+
console.error(` ${index + 1}. ${advice}`);
|
|
1785
|
+
});
|
|
1786
|
+
console.error('');
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
failedInstalls.push({
|
|
1790
|
+
toolId,
|
|
1791
|
+
name: tool.name,
|
|
1792
|
+
path: targetPath,
|
|
1793
|
+
error: error.message,
|
|
1794
|
+
errorType: errorInfo.type
|
|
1795
|
+
});
|
|
1796
|
+
|
|
1797
|
+
// Mark tool as failed in state
|
|
1798
|
+
await installationEngine.getStateManager().failCurrentTool(error);
|
|
1799
|
+
|
|
1800
|
+
// Offer recovery options if there are more tools to install
|
|
1801
|
+
if (i < this.selections.tools.length - 1) {
|
|
1802
|
+
const shouldContinue = await this.offerRecoveryOptions(tool.name, i + 1, this.selections.tools.length);
|
|
1803
|
+
|
|
1804
|
+
if (!shouldContinue) {
|
|
1805
|
+
console.log(`\n${colors.yellow}Installation cancelled by user${colors.reset}`);
|
|
1806
|
+
break; // Stop installing remaining tools
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
// Calculate total elapsed time
|
|
1813
|
+
const totalElapsedMs = Date.now() - startTime;
|
|
1814
|
+
const totalElapsedSec = Math.floor(totalElapsedMs / 1000);
|
|
1815
|
+
const totalElapsedMin = Math.floor(totalElapsedSec / 60);
|
|
1816
|
+
const totalElapsedSecRemainder = totalElapsedSec % 60;
|
|
1817
|
+
const totalElapsedFormatted = `${totalElapsedMin}:${totalElapsedSecRemainder.toString().padStart(2, '0')}`;
|
|
1818
|
+
|
|
1819
|
+
// Display final summary
|
|
1820
|
+
console.log(`\n${colors.bright}Installation Complete${colors.reset}`);
|
|
1821
|
+
console.log(`${colors.cyan}Total time:${colors.reset} ${totalElapsedFormatted}`);
|
|
1822
|
+
console.log(`${colors.cyan}Total files:${colors.reset} ${overallFilesCompleted} files\n`);
|
|
1823
|
+
|
|
1824
|
+
if (successfulInstalls.length > 0) {
|
|
1825
|
+
console.log(`${colors.green}Successfully installed:${colors.reset}`);
|
|
1826
|
+
for (const install of successfulInstalls) {
|
|
1827
|
+
console.log(` ${colors.green}✓${colors.reset} ${install.name} (${install.fileCount} files)`);
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
if (failedInstalls.length > 0) {
|
|
1832
|
+
console.log(`\n${colors.red}Failed installations:${colors.reset}`);
|
|
1833
|
+
for (const install of failedInstalls) {
|
|
1834
|
+
console.log(` ${colors.red}✗${colors.reset} ${install.name} (${install.errorType}): ${install.error}`);
|
|
1835
|
+
}
|
|
1836
|
+
console.log(`\n${colors.yellow}Note: Failed installations have been automatically rolled back${colors.reset}`);
|
|
1837
|
+
console.log(`${colors.yellow}No partial installations remain on your system${colors.reset}`);
|
|
1838
|
+
|
|
1839
|
+
// Offer retry options for failed installations
|
|
1840
|
+
if (failedInstalls.length > 0 && successfulInstalls.length > 0) {
|
|
1841
|
+
console.log(`\n${colors.cyan}You can retry failed installations by running the installer again${colors.reset}`);
|
|
1842
|
+
}
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
// Display detailed verification reports for successful installations
|
|
1846
|
+
if (successfulInstalls.length > 0 && verificationResults.length > 0) {
|
|
1847
|
+
console.log(`\n${colors.bright}${'='.repeat(60)}${colors.reset}`);
|
|
1848
|
+
for (let i = 0; i < successfulInstalls.length; i++) {
|
|
1849
|
+
const install = successfulInstalls[i];
|
|
1850
|
+
const verification = verificationResults[i];
|
|
1851
|
+
this.displayVerificationReport(verification, install.name);
|
|
1852
|
+
}
|
|
1853
|
+
console.log(`${colors.bright}${'='.repeat(60)}${colors.reset}\n`);
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
// Generate and save installation report
|
|
1857
|
+
if (successfulInstalls.length > 0 || failedInstalls.length > 0) {
|
|
1858
|
+
await this.generateInstallationReport(
|
|
1859
|
+
successfulInstalls,
|
|
1860
|
+
failedInstalls,
|
|
1861
|
+
verificationResults,
|
|
1862
|
+
totalElapsedMs
|
|
1863
|
+
);
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
// Clear installation state if all tools completed successfully
|
|
1867
|
+
if (failedInstalls.length === 0) {
|
|
1868
|
+
await installationEngine.getStateManager().clearState();
|
|
1869
|
+
console.log(`${colors.green}✓ Installation state cleared${colors.reset}`);
|
|
1870
|
+
} else {
|
|
1871
|
+
console.log(`\n${colors.yellow}Installation state preserved for resume capability${colors.reset}`);
|
|
1872
|
+
console.log(`${colors.yellow}Run the installer again to retry failed tools${colors.reset}`);
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
// Collect telemetry data (if user has consented)
|
|
1876
|
+
await this.collectInstallationTelemetry(
|
|
1877
|
+
failedInstalls.length === 0,
|
|
1878
|
+
this.selections.tools.length,
|
|
1879
|
+
failedInstalls.length,
|
|
1880
|
+
0, // warnings are tracked in verification
|
|
1881
|
+
totalElapsedMs
|
|
1882
|
+
);
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
/**
|
|
1886
|
+
* Draw progress bar for current tool installation
|
|
1887
|
+
* Updates in place without scrolling using ANSI escape codes
|
|
1888
|
+
*/
|
|
1889
|
+
drawProgressBar(filesCompleted, totalFiles, percentage, currentFile, bytesTransferred, totalBytes, speed, elapsed, eta) {
|
|
1890
|
+
// Move cursor to beginning of line and clear it
|
|
1891
|
+
process.stdout.write('\x1b[2K\r');
|
|
1892
|
+
|
|
1893
|
+
// Calculate progress bar width (40 characters)
|
|
1894
|
+
const barWidth = 40;
|
|
1895
|
+
const filledWidth = Math.round((percentage / 100) * barWidth);
|
|
1896
|
+
const emptyWidth = barWidth - filledWidth;
|
|
1897
|
+
|
|
1898
|
+
// Build progress bar
|
|
1899
|
+
const bar = '█'.repeat(filledWidth) + '░'.repeat(emptyWidth);
|
|
1900
|
+
|
|
1901
|
+
// Truncate current file name if too long
|
|
1902
|
+
const maxFileNameLength = 50;
|
|
1903
|
+
let displayFileName = currentFile;
|
|
1904
|
+
if (displayFileName.length > maxFileNameLength) {
|
|
1905
|
+
displayFileName = '...' + displayFileName.slice(-(maxFileNameLength - 3));
|
|
1906
|
+
}
|
|
1907
|
+
|
|
1908
|
+
// Display progress bar
|
|
1909
|
+
process.stdout.write(
|
|
1910
|
+
`[${colors.cyan}${bar}${colors.reset}] ${percentage}% (${filesCompleted}/${totalFiles} files)\n`
|
|
1911
|
+
);
|
|
1912
|
+
|
|
1913
|
+
// Display current file and stats
|
|
1914
|
+
process.stdout.write(
|
|
1915
|
+
`${colors.yellow}Copying:${colors.reset} ${displayFileName} | ` +
|
|
1916
|
+
`${bytesTransferred}/${totalBytes} | ` +
|
|
1917
|
+
`${speed}/s | ` +
|
|
1918
|
+
`Elapsed: ${elapsed} | ` +
|
|
1919
|
+
`ETA: ${eta}`
|
|
1920
|
+
);
|
|
1921
|
+
|
|
1922
|
+
// Move cursor up one line to overwrite on next update
|
|
1923
|
+
process.stdout.write('\x1b[1A');
|
|
1924
|
+
}
|
|
1925
|
+
|
|
1926
|
+
/**
|
|
1927
|
+
* Draw overall progress across all tools
|
|
1928
|
+
*/
|
|
1929
|
+
drawOverallProgress(filesCompleted, totalFiles, percentage, currentTool, totalTools) {
|
|
1930
|
+
// This is called after the tool progress, so cursor is already up one line
|
|
1931
|
+
// Move down to write overall progress below the tool progress
|
|
1932
|
+
process.stdout.write('\x1b[2B'); // Move down 2 lines
|
|
1933
|
+
process.stdout.write('\x1b[2K\r'); // Clear line
|
|
1934
|
+
|
|
1935
|
+
// Display overall progress
|
|
1936
|
+
process.stdout.write(
|
|
1937
|
+
`${colors.bright}Overall:${colors.reset} Tool ${currentTool}/${totalTools} | ` +
|
|
1938
|
+
`${filesCompleted}/${totalFiles} files (${percentage}%)`
|
|
1939
|
+
);
|
|
1940
|
+
|
|
1941
|
+
// Move cursor back up
|
|
1942
|
+
process.stdout.write('\x1b[1A'); // Move up 1 line to be ready for next tool progress update
|
|
1943
|
+
}
|
|
1944
|
+
|
|
1945
|
+
askQuestion(prompt, defaultValue = '') {
|
|
1946
|
+
return new Promise(resolve => {
|
|
1947
|
+
this.rl.question(prompt, (answer) => {
|
|
1948
|
+
resolve(answer.trim() || defaultValue);
|
|
1949
|
+
});
|
|
1950
|
+
});
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
/**
|
|
1954
|
+
* Display verification report for a single tool
|
|
1955
|
+
* Shows verification status, component counts, and any issues/warnings
|
|
1956
|
+
*
|
|
1957
|
+
* @param {object} verification - Verification result from InstallationEngine
|
|
1958
|
+
* @param {string} toolName - Display name of the tool
|
|
1959
|
+
*/
|
|
1960
|
+
displayVerificationReport(verification, toolName) {
|
|
1961
|
+
console.log(`\n${colors.bright}Verification Report: ${toolName}${colors.reset}`);
|
|
1962
|
+
console.log('─'.repeat(60));
|
|
1963
|
+
|
|
1964
|
+
if (verification.valid) {
|
|
1965
|
+
console.log(`${colors.green}✓ Installation verified successfully${colors.reset}`);
|
|
1966
|
+
} else {
|
|
1967
|
+
console.log(`${colors.red}✗ Verification failed${colors.reset}`);
|
|
1968
|
+
}
|
|
1969
|
+
|
|
1970
|
+
// Display manifest location
|
|
1971
|
+
const manifestPath = path.join(verification.targetPath, 'manifest.json');
|
|
1972
|
+
console.log(`\n${colors.cyan}Manifest:${colors.reset} ${manifestPath}`);
|
|
1973
|
+
|
|
1974
|
+
// Display variant and version info
|
|
1975
|
+
if (verification.variant) {
|
|
1976
|
+
console.log(`${colors.cyan}Variant:${colors.reset} ${verification.variant}`);
|
|
1977
|
+
}
|
|
1978
|
+
if (verification.version) {
|
|
1979
|
+
console.log(`${colors.cyan}Version:${colors.reset} ${verification.version}`);
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
// Display component counts
|
|
1983
|
+
console.log(`\n${colors.cyan}Components:${colors.reset}`);
|
|
1984
|
+
const components = verification.components;
|
|
1985
|
+
const agentCount = components.agents.found;
|
|
1986
|
+
const skillCount = components.skills.found;
|
|
1987
|
+
const resourceCount = components.resources.found;
|
|
1988
|
+
const hookCount = components.hooks.found;
|
|
1989
|
+
|
|
1990
|
+
const componentSummary = [];
|
|
1991
|
+
if (agentCount > 0) componentSummary.push(`${agentCount} agent${agentCount !== 1 ? 's' : ''}`);
|
|
1992
|
+
if (skillCount > 0) componentSummary.push(`${skillCount} skill${skillCount !== 1 ? 's' : ''}`);
|
|
1993
|
+
if (resourceCount > 0) componentSummary.push(`${resourceCount} resource${resourceCount !== 1 ? 's' : ''}`);
|
|
1994
|
+
if (hookCount > 0) componentSummary.push(`${hookCount} hook${hookCount !== 1 ? 's' : ''}`);
|
|
1995
|
+
|
|
1996
|
+
console.log(` ${componentSummary.join(', ')}`);
|
|
1997
|
+
|
|
1998
|
+
// Display issues if any
|
|
1999
|
+
if (verification.issues.length > 0) {
|
|
2000
|
+
console.log(`\n${colors.red}Issues:${colors.reset}`);
|
|
2001
|
+
for (const issue of verification.issues) {
|
|
2002
|
+
console.log(` ${colors.red}✗${colors.reset} ${issue.message}`);
|
|
2003
|
+
}
|
|
2004
|
+
}
|
|
2005
|
+
|
|
2006
|
+
// Display warnings if any
|
|
2007
|
+
if (verification.warnings.length > 0) {
|
|
2008
|
+
console.log(`\n${colors.yellow}Warnings:${colors.reset}`);
|
|
2009
|
+
for (const warning of verification.warnings) {
|
|
2010
|
+
console.log(` ${colors.yellow}⚠${colors.reset} ${warning.message}`);
|
|
2011
|
+
}
|
|
2012
|
+
}
|
|
2013
|
+
|
|
2014
|
+
// Display next steps for successful installations
|
|
2015
|
+
if (verification.valid) {
|
|
2016
|
+
console.log(`\n${colors.bright}Next Steps:${colors.reset}`);
|
|
2017
|
+
console.log(` To use ${toolName}, navigate to: ${verification.targetPath}`);
|
|
2018
|
+
|
|
2019
|
+
// Provide tool-specific usage hints
|
|
2020
|
+
const toolId = verification.toolId;
|
|
2021
|
+
if (toolId === 'claude') {
|
|
2022
|
+
console.log(` ${colors.cyan}Quick start:${colors.reset} Run 'claude' to start using Claude Code`);
|
|
2023
|
+
} else if (toolId === 'opencode') {
|
|
2024
|
+
console.log(` ${colors.cyan}Quick start:${colors.reset} Run 'opencode' to start using Opencode`);
|
|
2025
|
+
} else if (toolId === 'ampcode') {
|
|
2026
|
+
console.log(` ${colors.cyan}Quick start:${colors.reset} Run 'ampcode' to start using Ampcode`);
|
|
2027
|
+
} else if (toolId === 'droid') {
|
|
2028
|
+
console.log(` ${colors.cyan}Quick start:${colors.reset} Run 'droid' to start using Droid`);
|
|
2029
|
+
}
|
|
2030
|
+
}
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
/**
|
|
2034
|
+
* Generate and save installation report to ~/.agentic-kit-install.log
|
|
2035
|
+
* Creates a detailed log of the installation session
|
|
2036
|
+
*
|
|
2037
|
+
* @param {array} successfulInstalls - Array of successful installation objects
|
|
2038
|
+
* @param {array} failedInstalls - Array of failed installation objects
|
|
2039
|
+
* @param {array} verificationResults - Array of verification result objects
|
|
2040
|
+
* @param {number} totalElapsedMs - Total elapsed time in milliseconds
|
|
2041
|
+
*/
|
|
2042
|
+
async generateInstallationReport(successfulInstalls, failedInstalls, verificationResults, totalElapsedMs) {
|
|
2043
|
+
const ReportTemplate = require('./report-template');
|
|
2044
|
+
const reportTemplate = new ReportTemplate();
|
|
2045
|
+
|
|
2046
|
+
// Prepare installation data for the report template
|
|
2047
|
+
const startTime = Date.now() - totalElapsedMs;
|
|
2048
|
+
const endTime = Date.now();
|
|
2049
|
+
|
|
2050
|
+
// Build tools array with complete information
|
|
2051
|
+
const tools = [];
|
|
2052
|
+
const allErrors = [];
|
|
2053
|
+
const allWarnings = [];
|
|
2054
|
+
|
|
2055
|
+
// Process successful installations
|
|
2056
|
+
for (let i = 0; i < successfulInstalls.length; i++) {
|
|
2057
|
+
const install = successfulInstalls[i];
|
|
2058
|
+
const verification = verificationResults[i];
|
|
2059
|
+
|
|
2060
|
+
// Get package size information
|
|
2061
|
+
let sizeBytes = 0;
|
|
2062
|
+
try {
|
|
2063
|
+
const sizeInfo = await this.packageManager.getPackageSize(install.toolId, this.selections.variant);
|
|
2064
|
+
sizeBytes = sizeInfo.bytes || 0;
|
|
2065
|
+
} catch (error) {
|
|
2066
|
+
// If we can't get size, estimate based on file count (rough estimate: 15KB per file)
|
|
2067
|
+
sizeBytes = install.fileCount * 15 * 1024;
|
|
2068
|
+
}
|
|
2069
|
+
|
|
2070
|
+
// Get manifest path
|
|
2071
|
+
const manifestPath = path.join(install.path, 'manifest.json');
|
|
2072
|
+
|
|
2073
|
+
tools.push({
|
|
2074
|
+
toolId: install.toolId,
|
|
2075
|
+
path: install.path,
|
|
2076
|
+
filesInstalled: install.fileCount,
|
|
2077
|
+
sizeBytes: sizeBytes,
|
|
2078
|
+
components: verification && verification.components ? {
|
|
2079
|
+
agents: verification.components.agents.found,
|
|
2080
|
+
skills: verification.components.skills.found,
|
|
2081
|
+
resources: verification.components.resources.found,
|
|
2082
|
+
hooks: verification.components.hooks.found
|
|
2083
|
+
} : {},
|
|
2084
|
+
verified: verification ? verification.valid : false,
|
|
2085
|
+
verificationStatus: verification && verification.valid ? 'All components verified successfully' : 'Verification completed with issues',
|
|
2086
|
+
manifestPath: manifestPath
|
|
2087
|
+
});
|
|
2088
|
+
|
|
2089
|
+
// Collect warnings from verification
|
|
2090
|
+
if (verification && verification.warnings && verification.warnings.length > 0) {
|
|
2091
|
+
verification.warnings.forEach(warning => {
|
|
2092
|
+
allWarnings.push(`[${install.toolId}] ${warning.message}`);
|
|
2093
|
+
});
|
|
2094
|
+
}
|
|
2095
|
+
|
|
2096
|
+
// Collect issues from verification as errors
|
|
2097
|
+
if (verification && verification.issues && verification.issues.length > 0) {
|
|
2098
|
+
verification.issues.forEach(issue => {
|
|
2099
|
+
allErrors.push(`[${install.toolId}] ${issue.message}`);
|
|
2100
|
+
});
|
|
2101
|
+
}
|
|
2102
|
+
}
|
|
2103
|
+
|
|
2104
|
+
// Process failed installations
|
|
2105
|
+
for (const install of failedInstalls) {
|
|
2106
|
+
allErrors.push(`[${install.toolId}] Installation failed: ${install.error}`);
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
// Build installation data object
|
|
2110
|
+
const installationData = {
|
|
2111
|
+
variant: this.selections.variant,
|
|
2112
|
+
tools: tools,
|
|
2113
|
+
startTime: startTime,
|
|
2114
|
+
endTime: endTime,
|
|
2115
|
+
success: failedInstalls.length === 0,
|
|
2116
|
+
errors: allErrors,
|
|
2117
|
+
warnings: allWarnings
|
|
2118
|
+
};
|
|
2119
|
+
|
|
2120
|
+
// Generate and save report using ReportTemplate
|
|
2121
|
+
try {
|
|
2122
|
+
const reportPath = await reportTemplate.createAndSaveReport(installationData);
|
|
2123
|
+
console.log(`\n${colors.cyan}Installation report saved to:${colors.reset} ${reportPath}`);
|
|
2124
|
+
} catch (error) {
|
|
2125
|
+
console.warn(`${colors.yellow}Warning: Could not save installation report: ${error.message}${colors.reset}`);
|
|
2126
|
+
}
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
/**
|
|
2130
|
+
* Prompt user for telemetry consent
|
|
2131
|
+
* Only prompts if consent hasn't been set before and --no-telemetry flag not present
|
|
2132
|
+
*
|
|
2133
|
+
* @returns {Promise<void>}
|
|
2134
|
+
*/
|
|
2135
|
+
async promptTelemetryConsent() {
|
|
2136
|
+
// Skip if --no-telemetry flag is present
|
|
2137
|
+
if (this.cliArgs.noTelemetry) {
|
|
2138
|
+
return;
|
|
2139
|
+
}
|
|
2140
|
+
|
|
2141
|
+
// Skip if in silent mode
|
|
2142
|
+
if (this.cliArgs.silent) {
|
|
2143
|
+
return;
|
|
2144
|
+
}
|
|
2145
|
+
|
|
2146
|
+
const Telemetry = require('./telemetry');
|
|
2147
|
+
const telemetry = new Telemetry();
|
|
2148
|
+
|
|
2149
|
+
// Check if user has already made a decision
|
|
2150
|
+
const hasConsent = await telemetry.hasConsent();
|
|
2151
|
+
const hasOptedOut = await telemetry.hasOptedOut();
|
|
2152
|
+
|
|
2153
|
+
// Only prompt if user hasn't decided yet
|
|
2154
|
+
if (!hasConsent && !hasOptedOut) {
|
|
2155
|
+
console.log(`\n${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`);
|
|
2156
|
+
console.log(`${colors.bright}Help Improve Agentic Kit${colors.reset}\n`);
|
|
2157
|
+
console.log('Would you like to share anonymous usage statistics to help improve agentic-kit?');
|
|
2158
|
+
console.log('\nData collected:');
|
|
2159
|
+
console.log(' • Package variant selected (lite/standard/pro)');
|
|
2160
|
+
console.log(' • Number of tools installed');
|
|
2161
|
+
console.log(' • Installation time and success status');
|
|
2162
|
+
console.log(' • Operating system type');
|
|
2163
|
+
console.log(' • Node.js version');
|
|
2164
|
+
console.log('\nData NOT collected:');
|
|
2165
|
+
console.log(' • File paths or directory locations');
|
|
2166
|
+
console.log(' • Personal information');
|
|
2167
|
+
console.log(' • Specific tool names');
|
|
2168
|
+
console.log(' • Any identifying information');
|
|
2169
|
+
console.log('\nYou can change this setting later or opt-out anytime.');
|
|
2170
|
+
console.log(`For details, see: ${colors.cyan}docs/PRIVACY.md${colors.reset}`);
|
|
2171
|
+
console.log(`${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}\n`);
|
|
2172
|
+
|
|
2173
|
+
const answer = await this.askQuestion(
|
|
2174
|
+
`${colors.bright}Share anonymous usage data? (y/N):${colors.reset} `,
|
|
2175
|
+
'N'
|
|
2176
|
+
);
|
|
2177
|
+
|
|
2178
|
+
const consent = answer.toLowerCase() === 'y';
|
|
2179
|
+
await telemetry.setConsent(consent);
|
|
2180
|
+
|
|
2181
|
+
if (consent) {
|
|
2182
|
+
console.log(`${colors.green}✓ Thank you! Anonymous usage statistics enabled${colors.reset}\n`);
|
|
2183
|
+
} else {
|
|
2184
|
+
console.log(`${colors.yellow}Usage statistics disabled${colors.reset}\n`);
|
|
2185
|
+
}
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
/**
|
|
2190
|
+
* Collect and send telemetry data for installation
|
|
2191
|
+
*
|
|
2192
|
+
* @param {boolean} success - Installation success status
|
|
2193
|
+
* @param {number} toolCount - Number of tools installed
|
|
2194
|
+
* @param {number} errorCount - Number of errors encountered
|
|
2195
|
+
* @param {number} warningCount - Number of warnings encountered
|
|
2196
|
+
* @param {number} installationTime - Installation time in milliseconds
|
|
2197
|
+
* @returns {Promise<void>}
|
|
2198
|
+
*/
|
|
2199
|
+
async collectInstallationTelemetry(success, toolCount, errorCount, warningCount, installationTime) {
|
|
2200
|
+
// Skip if --no-telemetry flag is present
|
|
2201
|
+
if (this.cliArgs.noTelemetry) {
|
|
2202
|
+
return;
|
|
2203
|
+
}
|
|
2204
|
+
|
|
2205
|
+
const Telemetry = require('./telemetry');
|
|
2206
|
+
const telemetry = new Telemetry();
|
|
2207
|
+
|
|
2208
|
+
try {
|
|
2209
|
+
await telemetry.collectInstallationStats({
|
|
2210
|
+
variant: this.selections.variant,
|
|
2211
|
+
toolCount: toolCount,
|
|
2212
|
+
installationTime: installationTime,
|
|
2213
|
+
success: success,
|
|
2214
|
+
errorCount: errorCount,
|
|
2215
|
+
warningCount: warningCount
|
|
2216
|
+
});
|
|
2217
|
+
} catch (error) {
|
|
2218
|
+
// Silently fail - don't interrupt user experience for telemetry issues
|
|
2219
|
+
}
|
|
2220
|
+
}
|
|
2221
|
+
}
|
|
2222
|
+
|
|
2223
|
+
// Run installer if called directly
|
|
2224
|
+
if (require.main === module) {
|
|
2225
|
+
const installer = new InteractiveInstaller();
|
|
2226
|
+
installer.run().catch(console.error);
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
module.exports = InteractiveInstaller;
|