@aslomon/effectum 0.3.3 → 0.4.0
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/bin/install.js +68 -4
- package/bin/lib/cli-tools.js +288 -0
- package/bin/lib/specializations.js +11 -1
- package/bin/lib/template.js +14 -0
- package/bin/lib/ui.js +109 -0
- package/package.json +1 -1
- package/system/agents/data-engineer.md +268 -0
- package/system/agents/mobile-developer.md +257 -0
- package/system/hooks/observe.sh +164 -0
- package/system/hooks/quick-diff.sh +87 -0
- package/system/hooks/save-results.sh +56 -0
- package/system/hooks/scan.sh +170 -0
- package/system/skills/README.md +86 -0
- package/system/skills/SKILL.md +117 -0
- package/system/skills/agents/observer.md +137 -0
- package/system/skills/agents/start-observer.sh +143 -0
- package/system/skills/algorithmic-art/LICENSE.txt +202 -0
- package/system/skills/algorithmic-art/SKILL.md +405 -0
- package/system/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/system/skills/algorithmic-art/templates/viewer.html +599 -0
- package/system/skills/api-endpoint/SKILL.md +106 -0
- package/system/skills/canvas-design/LICENSE.txt +202 -0
- package/system/skills/canvas-design/SKILL.md +130 -0
- package/system/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/system/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/system/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/system/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/system/skills/component/SKILL.md +103 -0
- package/system/skills/config.json +18 -0
- package/system/skills/doc-coauthoring/SKILL.md +375 -0
- package/system/skills/docx/LICENSE.txt +30 -0
- package/system/skills/docx/SKILL.md +590 -0
- package/system/skills/docx/scripts/__init__.py +1 -0
- package/system/skills/docx/scripts/accept_changes.py +135 -0
- package/system/skills/docx/scripts/comment.py +318 -0
- package/system/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/system/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/system/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/system/skills/docx/scripts/office/pack.py +159 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/system/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/system/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/system/skills/docx/scripts/office/soffice.py +183 -0
- package/system/skills/docx/scripts/office/unpack.py +132 -0
- package/system/skills/docx/scripts/office/validate.py +111 -0
- package/system/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/system/skills/docx/scripts/office/validators/base.py +847 -0
- package/system/skills/docx/scripts/office/validators/docx.py +446 -0
- package/system/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/system/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/system/skills/docx/scripts/templates/comments.xml +3 -0
- package/system/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/system/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/system/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/system/skills/docx/scripts/templates/people.xml +3 -0
- package/system/skills/evaluate-session.sh +69 -0
- package/system/skills/feature/SKILL.md +73 -0
- package/system/skills/frontend-design/LICENSE.txt +177 -0
- package/system/skills/frontend-design/SKILL.md +52 -0
- package/system/skills/hooks/observe.sh +164 -0
- package/system/skills/mcp-builder/LICENSE.txt +202 -0
- package/system/skills/mcp-builder/SKILL.md +236 -0
- package/system/skills/mcp-builder/reference/evaluation.md +602 -0
- package/system/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/system/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/system/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/system/skills/mcp-builder/scripts/connections.py +151 -0
- package/system/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/system/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/system/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/system/skills/pdf/LICENSE.txt +30 -0
- package/system/skills/pdf/SKILL.md +314 -0
- package/system/skills/pdf/forms.md +294 -0
- package/system/skills/pdf/reference.md +612 -0
- package/system/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/system/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/system/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/system/skills/pdf/scripts/create_validation_image.py +37 -0
- package/system/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/system/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/system/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/system/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/system/skills/pptx/LICENSE.txt +30 -0
- package/system/skills/pptx/SKILL.md +232 -0
- package/system/skills/pptx/editing.md +205 -0
- package/system/skills/pptx/pptxgenjs.md +420 -0
- package/system/skills/pptx/scripts/__init__.py +0 -0
- package/system/skills/pptx/scripts/add_slide.py +195 -0
- package/system/skills/pptx/scripts/clean.py +286 -0
- package/system/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/system/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/system/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/system/skills/pptx/scripts/office/pack.py +159 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/system/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/system/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/system/skills/pptx/scripts/office/soffice.py +183 -0
- package/system/skills/pptx/scripts/office/unpack.py +132 -0
- package/system/skills/pptx/scripts/office/validate.py +111 -0
- package/system/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/system/skills/pptx/scripts/office/validators/base.py +847 -0
- package/system/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/system/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/system/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/system/skills/pptx/scripts/thumbnail.py +289 -0
- package/system/skills/scripts/quick-diff.sh +87 -0
- package/system/skills/scripts/save-results.sh +56 -0
- package/system/skills/scripts/scan.sh +170 -0
- package/system/skills/security-check/SKILL.md +70 -0
- package/system/skills/skill-creator/LICENSE.txt +202 -0
- package/system/skills/skill-creator/SKILL.md +479 -0
- package/system/skills/skill-creator/agents/analyzer.md +274 -0
- package/system/skills/skill-creator/agents/comparator.md +202 -0
- package/system/skills/skill-creator/agents/grader.md +223 -0
- package/system/skills/skill-creator/assets/eval_review.html +146 -0
- package/system/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/system/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/system/skills/skill-creator/references/schemas.md +430 -0
- package/system/skills/skill-creator/scripts/__init__.py +0 -0
- package/system/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/system/skills/skill-creator/scripts/generate_report.py +326 -0
- package/system/skills/skill-creator/scripts/improve_description.py +248 -0
- package/system/skills/skill-creator/scripts/package_skill.py +136 -0
- package/system/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/system/skills/skill-creator/scripts/run_eval.py +310 -0
- package/system/skills/skill-creator/scripts/run_loop.py +332 -0
- package/system/skills/skill-creator/scripts/utils.py +47 -0
- package/system/skills/suggest-compact.sh +54 -0
- package/system/skills/supabase-migration/SKILL.md +59 -0
- package/system/skills/theme-factory/LICENSE.txt +202 -0
- package/system/skills/theme-factory/SKILL.md +59 -0
- package/system/skills/theme-factory/theme-showcase.pdf +0 -0
- package/system/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/system/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/system/skills/theme-factory/themes/desert-rose.md +19 -0
- package/system/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/system/skills/theme-factory/themes/golden-hour.md +19 -0
- package/system/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/system/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/system/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/system/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/system/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/system/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/system/skills/web-artifacts-builder/SKILL.md +74 -0
- package/system/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/system/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/system/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/system/skills/webapp-testing/LICENSE.txt +202 -0
- package/system/skills/webapp-testing/SKILL.md +96 -0
- package/system/skills/webapp-testing/examples/console_logging.py +35 -0
- package/system/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/system/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/system/skills/webapp-testing/scripts/with_server.py +106 -0
- package/system/skills/xlsx/LICENSE.txt +30 -0
- package/system/skills/xlsx/SKILL.md +292 -0
- package/system/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/system/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/system/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/system/skills/xlsx/scripts/office/pack.py +159 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/system/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/system/skills/xlsx/scripts/office/soffice.py +183 -0
- package/system/skills/xlsx/scripts/office/unpack.py +132 -0
- package/system/skills/xlsx/scripts/office/validate.py +111 -0
- package/system/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/system/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/system/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/system/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/system/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/system/skills/xlsx/scripts/recalc.py +184 -0
- package/system/teams/profiles.md +76 -0
- package/system/templates/CLAUDE.md.tmpl +6 -0
- package/system/templates/settings.json.tmpl +11 -0
package/bin/install.js
CHANGED
|
@@ -53,6 +53,7 @@ const {
|
|
|
53
53
|
askLanguage,
|
|
54
54
|
askAutonomy,
|
|
55
55
|
showRecommendation,
|
|
56
|
+
showCliToolCheck,
|
|
56
57
|
askSetupMode,
|
|
57
58
|
askCustomize,
|
|
58
59
|
askManual,
|
|
@@ -61,6 +62,7 @@ const {
|
|
|
61
62
|
showSummary,
|
|
62
63
|
showOutro,
|
|
63
64
|
} = require("./lib/ui");
|
|
65
|
+
const { checkAllTools, formatToolStatus } = require("./lib/cli-tools");
|
|
64
66
|
|
|
65
67
|
// ─── File helpers ─────────────────────────────────────────────────────────────
|
|
66
68
|
|
|
@@ -306,6 +308,33 @@ function installBaseFiles(targetDir, repoRoot, isGlobal) {
|
|
|
306
308
|
steps.push(...copyDir(agentsSrc, agentsDest, { skipExisting: true }));
|
|
307
309
|
}
|
|
308
310
|
|
|
311
|
+
// 6. Skills
|
|
312
|
+
const skillsSrc = path.join(repoRoot, "system", "skills");
|
|
313
|
+
if (fs.existsSync(skillsSrc)) {
|
|
314
|
+
const skillsDest = isGlobal
|
|
315
|
+
? path.join(targetDir, "skills")
|
|
316
|
+
: path.join(targetDir, ".claude", "skills");
|
|
317
|
+
steps.push(...copyDir(skillsSrc, skillsDest, { skipExisting: true }));
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// 7. Teams (profiles for Agent Teams)
|
|
321
|
+
const teamsSrc = path.join(repoRoot, "system", "teams");
|
|
322
|
+
if (fs.existsSync(teamsSrc)) {
|
|
323
|
+
const teamsDest = isGlobal
|
|
324
|
+
? path.join(targetDir, "teams")
|
|
325
|
+
: path.join(targetDir, ".claude", "teams");
|
|
326
|
+
steps.push(...copyDir(teamsSrc, teamsDest, { skipExisting: true }));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// 8. Hook scripts
|
|
330
|
+
const hooksSrc = path.join(repoRoot, "system", "hooks");
|
|
331
|
+
if (fs.existsSync(hooksSrc)) {
|
|
332
|
+
const hooksDest = isGlobal
|
|
333
|
+
? path.join(targetDir, "hooks")
|
|
334
|
+
: path.join(targetDir, ".claude", "hooks");
|
|
335
|
+
steps.push(...copyDir(hooksSrc, hooksDest, { skipExisting: true }));
|
|
336
|
+
}
|
|
337
|
+
|
|
309
338
|
return steps;
|
|
310
339
|
}
|
|
311
340
|
|
|
@@ -316,7 +345,11 @@ function installRecommendedAgents(targetDir, repoRoot, recommendedAgents) {
|
|
|
316
345
|
const agentsDest = path.join(targetDir, ".claude", "agents");
|
|
317
346
|
const steps = [];
|
|
318
347
|
|
|
319
|
-
if (
|
|
348
|
+
if (
|
|
349
|
+
!fs.existsSync(agentsSrc) ||
|
|
350
|
+
!recommendedAgents ||
|
|
351
|
+
recommendedAgents.length === 0
|
|
352
|
+
) {
|
|
320
353
|
return steps;
|
|
321
354
|
}
|
|
322
355
|
|
|
@@ -565,6 +598,22 @@ Options:
|
|
|
565
598
|
process.exit(0);
|
|
566
599
|
}
|
|
567
600
|
|
|
601
|
+
// CLI tool check (report only, no install in non-interactive mode)
|
|
602
|
+
const toolCheck = checkAllTools(config.stack);
|
|
603
|
+
if (toolCheck.missing.length > 0) {
|
|
604
|
+
console.log("\n CLI Tool Check:");
|
|
605
|
+
console.log(formatToolStatus(toolCheck.tools));
|
|
606
|
+
console.log(
|
|
607
|
+
`\n ${toolCheck.missing.length} tool(s) not installed. Run installer interactively to install.`,
|
|
608
|
+
);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// Store tool status in config
|
|
612
|
+
config.detectedTools = toolCheck.tools.map((t) => ({
|
|
613
|
+
key: t.key,
|
|
614
|
+
installed: t.installed,
|
|
615
|
+
}));
|
|
616
|
+
|
|
568
617
|
// Install base files
|
|
569
618
|
installBaseFiles(targetDir, repoRoot, isGlobal);
|
|
570
619
|
|
|
@@ -582,9 +631,13 @@ Options:
|
|
|
582
631
|
}
|
|
583
632
|
|
|
584
633
|
// MCP servers — always install recommended MCPs (or explicit --with-mcp)
|
|
585
|
-
const mcpKeys =
|
|
634
|
+
const mcpKeys =
|
|
635
|
+
config.mcpServers ||
|
|
636
|
+
(config.recommended ? config.recommended.mcps : []) ||
|
|
637
|
+
[];
|
|
586
638
|
if (mcpKeys.length > 0 || args.withMcp) {
|
|
587
|
-
const keysToInstall =
|
|
639
|
+
const keysToInstall =
|
|
640
|
+
mcpKeys.length > 0 ? mcpKeys : MCP_SERVERS.map((s) => s.key);
|
|
588
641
|
const mcpResults = installMcpServers(keysToInstall);
|
|
589
642
|
const settingsPath = isGlobal
|
|
590
643
|
? path.join(homeClaudeDir, "settings.json")
|
|
@@ -673,6 +726,9 @@ Options:
|
|
|
673
726
|
|
|
674
727
|
showRecommendation(rec);
|
|
675
728
|
|
|
729
|
+
// ── CLI Tool Check ────────────────────────────────────────────────────────
|
|
730
|
+
const cliToolResult = await showCliToolCheck(stack);
|
|
731
|
+
|
|
676
732
|
// ── Step 8: Decision ──────────────────────────────────────────────────────
|
|
677
733
|
const setupMode = await askSetupMode();
|
|
678
734
|
|
|
@@ -706,6 +762,10 @@ Options:
|
|
|
706
762
|
packageManager: detected.packageManager,
|
|
707
763
|
formatter: formatterDef.name,
|
|
708
764
|
mcpServers: finalSetup.mcps,
|
|
765
|
+
detectedTools: cliToolResult.tools.map((t) => ({
|
|
766
|
+
key: t.key,
|
|
767
|
+
installed: t.installed,
|
|
768
|
+
})),
|
|
709
769
|
playwrightBrowsers: wantPlaywright,
|
|
710
770
|
installScope: "local",
|
|
711
771
|
recommended: {
|
|
@@ -777,7 +837,11 @@ Options:
|
|
|
777
837
|
if (recAgents.length > 0) {
|
|
778
838
|
const sAgents = p.spinner();
|
|
779
839
|
sAgents.start("Installing agent specializations...");
|
|
780
|
-
const agentSteps = installRecommendedAgents(
|
|
840
|
+
const agentSteps = installRecommendedAgents(
|
|
841
|
+
installTargetDir,
|
|
842
|
+
repoRoot,
|
|
843
|
+
recAgents,
|
|
844
|
+
);
|
|
781
845
|
const agentCount = agentSteps.filter((s) => s.status === "created").length;
|
|
782
846
|
sAgents.stop(`${agentCount} agent specializations installed`);
|
|
783
847
|
configSteps.push(...agentSteps);
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI tool definitions, detection, installation, and auth checking.
|
|
3
|
+
*
|
|
4
|
+
* Each tool specifies:
|
|
5
|
+
* - key/bin: identifier and binary name
|
|
6
|
+
* - install: platform-specific install commands (darwin/linux/all)
|
|
7
|
+
* - auth/authSetup: commands to check and configure authentication
|
|
8
|
+
* - why: human-readable reason for the tool
|
|
9
|
+
* - foundation: true if always recommended regardless of stack
|
|
10
|
+
* - stacks: array of stack keys where this tool is relevant
|
|
11
|
+
*/
|
|
12
|
+
"use strict";
|
|
13
|
+
|
|
14
|
+
const { spawnSync } = require("child_process");
|
|
15
|
+
const os = require("os");
|
|
16
|
+
|
|
17
|
+
// ─── Tool definitions ────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
const CLI_TOOLS = [
|
|
20
|
+
// Foundation (always recommended)
|
|
21
|
+
{
|
|
22
|
+
key: "git",
|
|
23
|
+
bin: "git",
|
|
24
|
+
install: {
|
|
25
|
+
darwin: "xcode-select --install",
|
|
26
|
+
linux: "sudo apt install -y git",
|
|
27
|
+
},
|
|
28
|
+
auth: "git config user.name && git config user.email",
|
|
29
|
+
authSetup:
|
|
30
|
+
'git config --global user.name "Your Name" && git config --global user.email "you@example.com"',
|
|
31
|
+
why: "Version control — required for all projects",
|
|
32
|
+
foundation: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: "gh",
|
|
36
|
+
bin: "gh",
|
|
37
|
+
install: { darwin: "brew install gh", linux: "sudo apt install -y gh" },
|
|
38
|
+
auth: "gh auth status",
|
|
39
|
+
authSetup: "gh auth login",
|
|
40
|
+
why: "GitHub: Issues, PRs, Code Search, CI status",
|
|
41
|
+
foundation: true,
|
|
42
|
+
},
|
|
43
|
+
// Stack-specific
|
|
44
|
+
{
|
|
45
|
+
key: "supabase",
|
|
46
|
+
bin: "supabase",
|
|
47
|
+
install: {
|
|
48
|
+
darwin: "brew install supabase/tap/supabase",
|
|
49
|
+
linux: "npm i -g supabase",
|
|
50
|
+
},
|
|
51
|
+
auth: "supabase projects list",
|
|
52
|
+
authSetup: "supabase login",
|
|
53
|
+
why: "Database migrations, type generation, edge functions",
|
|
54
|
+
stacks: ["nextjs-supabase"],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
key: "vercel",
|
|
58
|
+
bin: "vercel",
|
|
59
|
+
install: { all: "npm i -g vercel" },
|
|
60
|
+
auth: "vercel whoami",
|
|
61
|
+
authSetup: "vercel login",
|
|
62
|
+
why: "Deployment to Vercel",
|
|
63
|
+
stacks: ["nextjs-supabase"],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
key: "docker",
|
|
67
|
+
bin: "docker",
|
|
68
|
+
install: {
|
|
69
|
+
darwin: "brew install --cask docker",
|
|
70
|
+
linux: "sudo apt install -y docker.io",
|
|
71
|
+
},
|
|
72
|
+
auth: null,
|
|
73
|
+
why: "Container management, local dev environment",
|
|
74
|
+
stacks: ["python-fastapi", "generic"],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
key: "uv",
|
|
78
|
+
bin: "uv",
|
|
79
|
+
install: { all: "curl -LsSf https://astral.sh/uv/install.sh | sh" },
|
|
80
|
+
auth: null,
|
|
81
|
+
why: "Fast Python package management",
|
|
82
|
+
stacks: ["python-fastapi"],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
key: "ruff",
|
|
86
|
+
bin: "ruff",
|
|
87
|
+
install: { all: "pip install ruff" },
|
|
88
|
+
auth: null,
|
|
89
|
+
why: "Python linting and formatting",
|
|
90
|
+
stacks: ["python-fastapi"],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
key: "xcodebuild",
|
|
94
|
+
bin: "xcodebuild",
|
|
95
|
+
install: { darwin: "xcode-select --install" },
|
|
96
|
+
auth: null,
|
|
97
|
+
why: "iOS/macOS build toolchain",
|
|
98
|
+
stacks: ["swift-ios"],
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
// ─── Tool check ──────────────────────────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Check if a CLI tool is installed by looking up its binary.
|
|
106
|
+
* @param {string} bin - binary name (e.g. "git", "gh")
|
|
107
|
+
* @returns {boolean}
|
|
108
|
+
*/
|
|
109
|
+
function checkTool(bin) {
|
|
110
|
+
try {
|
|
111
|
+
const result = spawnSync("which", [bin], {
|
|
112
|
+
timeout: 5000,
|
|
113
|
+
stdio: "pipe",
|
|
114
|
+
encoding: "utf8",
|
|
115
|
+
});
|
|
116
|
+
return result.status === 0 && result.stdout.trim().length > 0;
|
|
117
|
+
} catch (_) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Get the relevant tools for a given stack.
|
|
124
|
+
* Foundation tools are always included.
|
|
125
|
+
* @param {string} stack - stack key (e.g. "nextjs-supabase")
|
|
126
|
+
* @returns {Array<object>}
|
|
127
|
+
*/
|
|
128
|
+
function getToolsForStack(stack) {
|
|
129
|
+
return CLI_TOOLS.filter(
|
|
130
|
+
(tool) => tool.foundation || (tool.stacks && tool.stacks.includes(stack)),
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Check all relevant tools for a stack and return status.
|
|
136
|
+
* @param {string} stack
|
|
137
|
+
* @returns {{ tools: Array<{ key: string, bin: string, installed: boolean, why: string, install: object, auth: string|null, authSetup: string|null }>, missing: Array<object>, installed: Array<object> }}
|
|
138
|
+
*/
|
|
139
|
+
function checkAllTools(stack) {
|
|
140
|
+
const relevant = getToolsForStack(stack);
|
|
141
|
+
const results = relevant.map((tool) => ({
|
|
142
|
+
...tool,
|
|
143
|
+
installed: checkTool(tool.bin),
|
|
144
|
+
}));
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
tools: results,
|
|
148
|
+
missing: results.filter((t) => !t.installed),
|
|
149
|
+
installed: results.filter((t) => t.installed),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ─── Tool installation ───────────────────────────────────────────────────────
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Get the platform key for install commands.
|
|
157
|
+
* @returns {"darwin"|"linux"}
|
|
158
|
+
*/
|
|
159
|
+
function getPlatform() {
|
|
160
|
+
const p = os.platform();
|
|
161
|
+
return p === "darwin" ? "darwin" : "linux";
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Get the install command for a tool on the current platform.
|
|
166
|
+
* @param {object} tool
|
|
167
|
+
* @returns {string|null}
|
|
168
|
+
*/
|
|
169
|
+
function getInstallCommand(tool) {
|
|
170
|
+
if (!tool.install) return null;
|
|
171
|
+
const platform = getPlatform();
|
|
172
|
+
return tool.install[platform] || tool.install.all || null;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Install a single tool using its platform-appropriate command.
|
|
177
|
+
* @param {object} tool
|
|
178
|
+
* @returns {{ ok: boolean, command: string|null, error?: string }}
|
|
179
|
+
*/
|
|
180
|
+
function installTool(tool) {
|
|
181
|
+
const command = getInstallCommand(tool);
|
|
182
|
+
if (!command) {
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
command: null,
|
|
186
|
+
error: "No install command for this platform",
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
const result = spawnSync("bash", ["-c", command], {
|
|
192
|
+
timeout: 120000,
|
|
193
|
+
stdio: "pipe",
|
|
194
|
+
encoding: "utf8",
|
|
195
|
+
});
|
|
196
|
+
if (result.status === 0) {
|
|
197
|
+
return { ok: true, command };
|
|
198
|
+
}
|
|
199
|
+
return { ok: false, command, error: result.stderr || "Install failed" };
|
|
200
|
+
} catch (err) {
|
|
201
|
+
return { ok: false, command, error: err.message };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ─── Auth checking ───────────────────────────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Check if a tool is authenticated.
|
|
209
|
+
* @param {object} tool
|
|
210
|
+
* @returns {{ authenticated: boolean, needsAuth: boolean }}
|
|
211
|
+
*/
|
|
212
|
+
function checkAuth(tool) {
|
|
213
|
+
if (!tool.auth) {
|
|
214
|
+
return { authenticated: true, needsAuth: false };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
try {
|
|
218
|
+
const result = spawnSync("bash", ["-c", tool.auth], {
|
|
219
|
+
timeout: 10000,
|
|
220
|
+
stdio: "pipe",
|
|
221
|
+
encoding: "utf8",
|
|
222
|
+
});
|
|
223
|
+
return {
|
|
224
|
+
authenticated: result.status === 0,
|
|
225
|
+
needsAuth: true,
|
|
226
|
+
};
|
|
227
|
+
} catch (_) {
|
|
228
|
+
return { authenticated: false, needsAuth: true };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ─── Formatting helpers ──────────────────────────────────────────────────────
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Generate a human-readable tools status summary.
|
|
236
|
+
* @param {Array<object>} tools - tool check results
|
|
237
|
+
* @returns {string}
|
|
238
|
+
*/
|
|
239
|
+
function formatToolStatus(tools) {
|
|
240
|
+
return tools
|
|
241
|
+
.map((t) => {
|
|
242
|
+
const icon = t.installed ? "\u2705" : "\u274C";
|
|
243
|
+
return ` ${icon} ${t.key} — ${t.why}`;
|
|
244
|
+
})
|
|
245
|
+
.join("\n");
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Generate install instructions for missing tools.
|
|
250
|
+
* @param {Array<object>} missing - missing tools
|
|
251
|
+
* @returns {string}
|
|
252
|
+
*/
|
|
253
|
+
function formatInstallInstructions(missing) {
|
|
254
|
+
const platform = getPlatform();
|
|
255
|
+
return missing
|
|
256
|
+
.map((t) => {
|
|
257
|
+
const cmd = t.install[platform] || t.install.all || "N/A";
|
|
258
|
+
return ` ${t.key}: ${cmd}`;
|
|
259
|
+
})
|
|
260
|
+
.join("\n");
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Build the AVAILABLE_TOOLS section content for CLAUDE.md.
|
|
265
|
+
* @param {Array<object>} tools - tool check results
|
|
266
|
+
* @returns {string}
|
|
267
|
+
*/
|
|
268
|
+
function buildAvailableToolsSection(tools) {
|
|
269
|
+
const lines = tools.map((t) => {
|
|
270
|
+
const status = t.installed ? "installed" : "not installed";
|
|
271
|
+
return `- **${t.key}** (${status}): ${t.why}`;
|
|
272
|
+
});
|
|
273
|
+
return lines.join("\n");
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
module.exports = {
|
|
277
|
+
CLI_TOOLS,
|
|
278
|
+
checkTool,
|
|
279
|
+
getToolsForStack,
|
|
280
|
+
checkAllTools,
|
|
281
|
+
getPlatform,
|
|
282
|
+
getInstallCommand,
|
|
283
|
+
installTool,
|
|
284
|
+
checkAuth,
|
|
285
|
+
formatToolStatus,
|
|
286
|
+
formatInstallInstructions,
|
|
287
|
+
buildAvailableToolsSection,
|
|
288
|
+
};
|
|
@@ -94,6 +94,16 @@ const SUBAGENT_SPECS = [
|
|
|
94
94
|
label: "Code Reviewer",
|
|
95
95
|
tags: ["testing-heavy", "docs-needed"],
|
|
96
96
|
},
|
|
97
|
+
{
|
|
98
|
+
key: "mobile-developer",
|
|
99
|
+
label: "Mobile Developer",
|
|
100
|
+
tags: ["native-ui", "frontend-heavy", "swift"],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
key: "data-engineer",
|
|
104
|
+
label: "Data Engineer",
|
|
105
|
+
tags: ["data-pipeline", "compute-heavy", "analytics"],
|
|
106
|
+
},
|
|
97
107
|
];
|
|
98
108
|
|
|
99
109
|
/**
|
|
@@ -116,7 +126,7 @@ const STACK_SUBAGENTS = {
|
|
|
116
126
|
"test-automator",
|
|
117
127
|
"api-designer",
|
|
118
128
|
],
|
|
119
|
-
"swift-ios": ["ui-designer", "test-automator"],
|
|
129
|
+
"swift-ios": ["ui-designer", "test-automator", "mobile-developer"],
|
|
120
130
|
generic: ["debugger", "test-automator"],
|
|
121
131
|
};
|
|
122
132
|
|
package/bin/lib/template.js
CHANGED
|
@@ -9,6 +9,7 @@ const fs = require("fs");
|
|
|
9
9
|
const path = require("path");
|
|
10
10
|
const { FORMATTER_MAP } = require("./constants");
|
|
11
11
|
const { LANGUAGE_INSTRUCTIONS } = require("./languages");
|
|
12
|
+
const { getToolsForStack, checkTool } = require("./cli-tools");
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Build a substitution map from user config and parsed stack sections.
|
|
@@ -23,6 +24,18 @@ function buildSubstitutionMap(config, stackSections) {
|
|
|
23
24
|
config.customLanguage ||
|
|
24
25
|
LANGUAGE_INSTRUCTIONS.english;
|
|
25
26
|
|
|
27
|
+
// Build AVAILABLE_TOOLS section from detected CLI tools
|
|
28
|
+
const tools = getToolsForStack(config.stack);
|
|
29
|
+
const toolLines = tools.map((t) => {
|
|
30
|
+
const installed = checkTool(t.bin);
|
|
31
|
+
const status = installed ? "installed" : "not installed";
|
|
32
|
+
return `- **${t.key}** (${status}): ${t.why}`;
|
|
33
|
+
});
|
|
34
|
+
const availableTools =
|
|
35
|
+
toolLines.length > 0
|
|
36
|
+
? toolLines.join("\n")
|
|
37
|
+
: "No CLI tools configured. Run the installer to detect and configure tools.";
|
|
38
|
+
|
|
26
39
|
return {
|
|
27
40
|
PROJECT_NAME: config.projectName,
|
|
28
41
|
LANGUAGE: langInstruction,
|
|
@@ -39,6 +52,7 @@ function buildSubstitutionMap(config, stackSections) {
|
|
|
39
52
|
PACKAGE_MANAGER: config.packageManager,
|
|
40
53
|
TOOL_SPECIFIC_GUARDRAILS:
|
|
41
54
|
stackSections.TOOL_SPECIFIC_GUARDRAILS || "[Not configured]",
|
|
55
|
+
AVAILABLE_TOOLS: availableTools,
|
|
42
56
|
};
|
|
43
57
|
}
|
|
44
58
|
|
package/bin/lib/ui.js
CHANGED
|
@@ -19,6 +19,13 @@ const {
|
|
|
19
19
|
getAllMcps,
|
|
20
20
|
getAllSubagents,
|
|
21
21
|
} = require("./recommendation");
|
|
22
|
+
const {
|
|
23
|
+
checkAllTools,
|
|
24
|
+
formatToolStatus,
|
|
25
|
+
formatInstallInstructions,
|
|
26
|
+
installTool,
|
|
27
|
+
checkAuth,
|
|
28
|
+
} = require("./cli-tools");
|
|
22
29
|
|
|
23
30
|
/** @type {import("@clack/prompts")} */
|
|
24
31
|
let p;
|
|
@@ -495,6 +502,106 @@ async function askGitBranch() {
|
|
|
495
502
|
return { create: true, name };
|
|
496
503
|
}
|
|
497
504
|
|
|
505
|
+
// ─── CLI Tool Check ─────────────────────────────────────────────────────────
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Run CLI tool check and offer installation/auth for missing tools.
|
|
509
|
+
* @param {string} stack - selected stack key
|
|
510
|
+
* @returns {Promise<{ tools: Array<object>, missing: Array<object>, installed: Array<object> }>}
|
|
511
|
+
*/
|
|
512
|
+
async function showCliToolCheck(stack) {
|
|
513
|
+
const result = checkAllTools(stack);
|
|
514
|
+
|
|
515
|
+
p.note(formatToolStatus(result.tools), "CLI Tool Check");
|
|
516
|
+
|
|
517
|
+
if (result.missing.length === 0) {
|
|
518
|
+
p.log.success("All CLI tools are installed.");
|
|
519
|
+
} else {
|
|
520
|
+
p.log.warn(`${result.missing.length} tool(s) not found.`);
|
|
521
|
+
|
|
522
|
+
const action = await p.select({
|
|
523
|
+
message: "How would you like to handle missing tools?",
|
|
524
|
+
options: [
|
|
525
|
+
{
|
|
526
|
+
value: "install",
|
|
527
|
+
label: "Install all missing",
|
|
528
|
+
hint: "Run install commands automatically",
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
value: "show",
|
|
532
|
+
label: "Show commands only",
|
|
533
|
+
hint: "Display install commands for manual use",
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
value: "skip",
|
|
537
|
+
label: "Skip",
|
|
538
|
+
hint: "Continue without installing",
|
|
539
|
+
},
|
|
540
|
+
],
|
|
541
|
+
initialValue: "show",
|
|
542
|
+
});
|
|
543
|
+
handleCancel(action);
|
|
544
|
+
|
|
545
|
+
if (action === "install") {
|
|
546
|
+
for (const tool of result.missing) {
|
|
547
|
+
const s = p.spinner();
|
|
548
|
+
s.start(`Installing ${tool.key}...`);
|
|
549
|
+
const installResult = installTool(tool);
|
|
550
|
+
if (installResult.ok) {
|
|
551
|
+
tool.installed = true;
|
|
552
|
+
s.stop(`${tool.key} installed`);
|
|
553
|
+
} else {
|
|
554
|
+
s.stop(
|
|
555
|
+
`${tool.key} failed: ${installResult.error || "unknown error"}`,
|
|
556
|
+
);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
} else if (action === "show") {
|
|
560
|
+
p.note(formatInstallInstructions(result.missing), "Install Commands");
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// Auth check for installed tools that need auth
|
|
565
|
+
const authTools = result.tools.filter((t) => t.installed && t.auth);
|
|
566
|
+
|
|
567
|
+
if (authTools.length > 0) {
|
|
568
|
+
const authResults = authTools.map((t) => {
|
|
569
|
+
const authStatus = checkAuth(t);
|
|
570
|
+
return { ...t, ...authStatus };
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
const unauthenticated = authResults.filter(
|
|
574
|
+
(t) => t.needsAuth && !t.authenticated,
|
|
575
|
+
);
|
|
576
|
+
|
|
577
|
+
if (unauthenticated.length > 0) {
|
|
578
|
+
const authLines = authResults.map((t) => {
|
|
579
|
+
const icon = t.authenticated ? "\u2705" : "\u274C";
|
|
580
|
+
return ` ${icon} ${t.key}${!t.authenticated ? ` — run: ${t.authSetup}` : ""}`;
|
|
581
|
+
});
|
|
582
|
+
p.note(authLines.join("\n"), "Auth Status");
|
|
583
|
+
|
|
584
|
+
const runAuth = await p.confirm({
|
|
585
|
+
message:
|
|
586
|
+
"Would you like to run auth commands for unauthenticated tools?",
|
|
587
|
+
initialValue: false,
|
|
588
|
+
});
|
|
589
|
+
handleCancel(runAuth);
|
|
590
|
+
|
|
591
|
+
if (runAuth) {
|
|
592
|
+
p.log.info(
|
|
593
|
+
"Auth commands require interactive input. Run these manually:\n" +
|
|
594
|
+
unauthenticated.map((t) => ` ${t.key}: ${t.authSetup}`).join("\n"),
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
} else {
|
|
598
|
+
p.log.success("All tools are authenticated.");
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
return result;
|
|
603
|
+
}
|
|
604
|
+
|
|
498
605
|
// ─── Display helpers ────────────────────────────────────────────────────────
|
|
499
606
|
|
|
500
607
|
/**
|
|
@@ -561,6 +668,8 @@ module.exports = {
|
|
|
561
668
|
askSetupMode,
|
|
562
669
|
askCustomize,
|
|
563
670
|
askManual,
|
|
671
|
+
// CLI tool check
|
|
672
|
+
showCliToolCheck,
|
|
564
673
|
// Legacy / utility prompts
|
|
565
674
|
askMcpServers,
|
|
566
675
|
askPlaywright,
|
package/package.json
CHANGED