@dtt_siye/atool 1.1.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/LICENSE +21 -0
- package/README.md +235 -0
- package/VERSION +1 -0
- package/agents/code-reviewer.md +29 -0
- package/bin/atool.js +235 -0
- package/bin/postinstall.js +23 -0
- package/hooks/doc-sync-reminder +155 -0
- package/hooks/hooks-cursor.json +37 -0
- package/hooks/hooks.json +37 -0
- package/hooks/prompt-guard +135 -0
- package/hooks/session-start +286 -0
- package/install.sh +603 -0
- package/lib/analyze-source.sh +1265 -0
- package/lib/common.sh +1041 -0
- package/lib/compute-importance.sh +598 -0
- package/lib/detect-stack.sh +354 -0
- package/lib/generate-visualization.sh +266 -0
- package/lib/install-claude.sh +43 -0
- package/lib/install-cursor.sh +281 -0
- package/lib/install-hooks.sh +285 -0
- package/lib/install-kiro.sh +543 -0
- package/lib/install-mcp.sh +99 -0
- package/lib/install-skills.sh +129 -0
- package/lib/knowledge-graph.sh +1014 -0
- package/lib/multi-dimensional-analysis.sh +413 -0
- package/lib/pre-scan.sh +1045 -0
- package/lib/project-init.sh +552 -0
- package/lib/visualization-template.html +545 -0
- package/mcp/recommended.json +24 -0
- package/package.json +39 -0
- package/skills/_superpowers/.claude-plugin/marketplace.json +20 -0
- package/skills/_superpowers/.claude-plugin/plugin.json +20 -0
- package/skills/_superpowers/.codex/INSTALL.md +67 -0
- package/skills/_superpowers/.cursor-plugin/plugin.json +25 -0
- package/skills/_superpowers/.gitattributes +18 -0
- package/skills/_superpowers/.github/FUNDING.yml +3 -0
- package/skills/_superpowers/.github/ISSUE_TEMPLATE/bug_report.md +52 -0
- package/skills/_superpowers/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/skills/_superpowers/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
- package/skills/_superpowers/.github/ISSUE_TEMPLATE/platform_support.md +23 -0
- package/skills/_superpowers/.github/PULL_REQUEST_TEMPLATE.md +87 -0
- package/skills/_superpowers/.opencode/INSTALL.md +83 -0
- package/skills/_superpowers/.opencode/plugins/superpowers.js +107 -0
- package/skills/_superpowers/CHANGELOG.md +13 -0
- package/skills/_superpowers/CODE_OF_CONDUCT.md +128 -0
- package/skills/_superpowers/GEMINI.md +2 -0
- package/skills/_superpowers/LICENSE +21 -0
- package/skills/_superpowers/README.md +187 -0
- package/skills/_superpowers/RELEASE-NOTES.md +1083 -0
- package/skills/_superpowers/agents/code-reviewer.md +48 -0
- package/skills/_superpowers/commands/brainstorm.md +5 -0
- package/skills/_superpowers/commands/execute-plan.md +5 -0
- package/skills/_superpowers/commands/write-plan.md +5 -0
- package/skills/_superpowers/docs/README.codex.md +126 -0
- package/skills/_superpowers/docs/README.opencode.md +130 -0
- package/skills/_superpowers/docs/plans/2025-11-22-opencode-support-design.md +294 -0
- package/skills/_superpowers/docs/plans/2025-11-22-opencode-support-implementation.md +1095 -0
- package/skills/_superpowers/docs/plans/2025-11-28-skills-improvements-from-user-feedback.md +711 -0
- package/skills/_superpowers/docs/plans/2026-01-17-visual-brainstorming.md +571 -0
- package/skills/_superpowers/docs/superpowers/plans/2026-01-22-document-review-system.md +301 -0
- package/skills/_superpowers/docs/superpowers/plans/2026-02-19-visual-brainstorming-refactor.md +523 -0
- package/skills/_superpowers/docs/superpowers/plans/2026-03-11-zero-dep-brainstorm-server.md +479 -0
- package/skills/_superpowers/docs/superpowers/plans/2026-03-23-codex-app-compatibility.md +564 -0
- package/skills/_superpowers/docs/superpowers/specs/2026-01-22-document-review-system-design.md +136 -0
- package/skills/_superpowers/docs/superpowers/specs/2026-02-19-visual-brainstorming-refactor-design.md +162 -0
- package/skills/_superpowers/docs/superpowers/specs/2026-03-11-zero-dep-brainstorm-server-design.md +118 -0
- package/skills/_superpowers/docs/superpowers/specs/2026-03-23-codex-app-compatibility-design.md +244 -0
- package/skills/_superpowers/docs/testing.md +303 -0
- package/skills/_superpowers/docs/windows/polyglot-hooks.md +212 -0
- package/skills/_superpowers/gemini-extension.json +6 -0
- package/skills/_superpowers/hooks/hooks-cursor.json +10 -0
- package/skills/_superpowers/hooks/hooks.json +16 -0
- package/skills/_superpowers/hooks/run-hook.cmd +46 -0
- package/skills/_superpowers/hooks/session-start +57 -0
- package/skills/_superpowers/package.json +6 -0
- package/skills/_superpowers/skills/brainstorming/SKILL.md +164 -0
- package/skills/_superpowers/skills/brainstorming/scripts/frame-template.html +214 -0
- package/skills/_superpowers/skills/brainstorming/scripts/helper.js +88 -0
- package/skills/_superpowers/skills/brainstorming/scripts/server.cjs +354 -0
- package/skills/_superpowers/skills/brainstorming/scripts/start-server.sh +148 -0
- package/skills/_superpowers/skills/brainstorming/scripts/stop-server.sh +56 -0
- package/skills/_superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/_superpowers/skills/brainstorming/visual-companion.md +287 -0
- package/skills/_superpowers/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/_superpowers/skills/executing-plans/SKILL.md +70 -0
- package/skills/_superpowers/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/skills/_superpowers/skills/receiving-code-review/SKILL.md +213 -0
- package/skills/_superpowers/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/_superpowers/skills/requesting-code-review/code-reviewer.md +146 -0
- package/skills/_superpowers/skills/subagent-driven-development/SKILL.md +277 -0
- package/skills/_superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/_superpowers/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/skills/_superpowers/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/_superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/_superpowers/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/_superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/_superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/_superpowers/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/_superpowers/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/_superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/_superpowers/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/_superpowers/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/_superpowers/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/_superpowers/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/_superpowers/skills/test-driven-development/SKILL.md +371 -0
- package/skills/_superpowers/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/_superpowers/skills/using-git-worktrees/SKILL.md +218 -0
- package/skills/_superpowers/skills/using-superpowers/SKILL.md +115 -0
- package/skills/_superpowers/skills/using-superpowers/references/codex-tools.md +100 -0
- package/skills/_superpowers/skills/using-superpowers/references/gemini-tools.md +33 -0
- package/skills/_superpowers/skills/verification-before-completion/SKILL.md +139 -0
- package/skills/_superpowers/skills/writing-plans/SKILL.md +152 -0
- package/skills/_superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/_superpowers/skills/writing-skills/SKILL.md +655 -0
- package/skills/_superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/_superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/_superpowers/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/_superpowers/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/_superpowers/skills/writing-skills/render-graphs.js +168 -0
- package/skills/_superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/_superpowers/tests/brainstorm-server/package-lock.json +36 -0
- package/skills/_superpowers/tests/brainstorm-server/package.json +10 -0
- package/skills/_superpowers/tests/brainstorm-server/server.test.js +427 -0
- package/skills/_superpowers/tests/brainstorm-server/windows-lifecycle.test.sh +351 -0
- package/skills/_superpowers/tests/brainstorm-server/ws-protocol.test.js +392 -0
- package/skills/_superpowers/tests/claude-code/README.md +158 -0
- package/skills/_superpowers/tests/claude-code/analyze-token-usage.py +168 -0
- package/skills/_superpowers/tests/claude-code/run-skill-tests.sh +187 -0
- package/skills/_superpowers/tests/claude-code/test-document-review-system.sh +177 -0
- package/skills/_superpowers/tests/claude-code/test-helpers.sh +202 -0
- package/skills/_superpowers/tests/claude-code/test-subagent-driven-development-integration.sh +314 -0
- package/skills/_superpowers/tests/claude-code/test-subagent-driven-development.sh +165 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/action-oriented.txt +3 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/after-planning-flow.txt +17 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/claude-suggested-it.txt +11 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/i-know-what-sdd-means.txt +8 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/mid-conversation-execute-plan.txt +3 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/please-use-brainstorming.txt +1 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/skip-formalities.txt +3 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/subagent-driven-development-please.txt +1 -0
- package/skills/_superpowers/tests/explicit-skill-requests/prompts/use-systematic-debugging.txt +1 -0
- package/skills/_superpowers/tests/explicit-skill-requests/run-all.sh +70 -0
- package/skills/_superpowers/tests/explicit-skill-requests/run-claude-describes-sdd.sh +100 -0
- package/skills/_superpowers/tests/explicit-skill-requests/run-extended-multiturn-test.sh +113 -0
- package/skills/_superpowers/tests/explicit-skill-requests/run-haiku-test.sh +144 -0
- package/skills/_superpowers/tests/explicit-skill-requests/run-multiturn-test.sh +143 -0
- package/skills/_superpowers/tests/explicit-skill-requests/run-test.sh +136 -0
- package/skills/_superpowers/tests/opencode/run-tests.sh +163 -0
- package/skills/_superpowers/tests/opencode/setup.sh +73 -0
- package/skills/_superpowers/tests/opencode/test-plugin-loading.sh +72 -0
- package/skills/_superpowers/tests/opencode/test-priority.sh +198 -0
- package/skills/_superpowers/tests/opencode/test-tools.sh +104 -0
- package/skills/_superpowers/tests/skill-triggering/prompts/dispatching-parallel-agents.txt +8 -0
- package/skills/_superpowers/tests/skill-triggering/prompts/executing-plans.txt +1 -0
- package/skills/_superpowers/tests/skill-triggering/prompts/requesting-code-review.txt +3 -0
- package/skills/_superpowers/tests/skill-triggering/prompts/systematic-debugging.txt +11 -0
- package/skills/_superpowers/tests/skill-triggering/prompts/test-driven-development.txt +7 -0
- package/skills/_superpowers/tests/skill-triggering/prompts/writing-plans.txt +10 -0
- package/skills/_superpowers/tests/skill-triggering/run-all.sh +60 -0
- package/skills/_superpowers/tests/skill-triggering/run-test.sh +88 -0
- package/skills/_superpowers/tests/subagent-driven-dev/go-fractals/design.md +81 -0
- package/skills/_superpowers/tests/subagent-driven-dev/go-fractals/plan.md +172 -0
- package/skills/_superpowers/tests/subagent-driven-dev/go-fractals/scaffold.sh +45 -0
- package/skills/_superpowers/tests/subagent-driven-dev/run-test.sh +106 -0
- package/skills/_superpowers/tests/subagent-driven-dev/svelte-todo/design.md +70 -0
- package/skills/_superpowers/tests/subagent-driven-dev/svelte-todo/plan.md +222 -0
- package/skills/_superpowers/tests/subagent-driven-dev/svelte-todo/scaffold.sh +46 -0
- package/skills/ai-project-architecture/SKILL.md +632 -0
- package/skills/ai-project-architecture/reference/structure-rules.md +406 -0
- package/skills/ai-project-architecture/templates/compliance-report.md +300 -0
- package/skills/ai-project-architecture/templates/migration-plan.md +433 -0
- package/skills/ai-project-architecture/templates/verification-checklist.md +408 -0
- package/skills/android-conventions/SKILL.md +125 -0
- package/skills/atool-init/SKILL.md +141 -0
- package/skills/clarify-before-build/SKILL.md +107 -0
- package/skills/code-review/SKILL.md +406 -0
- package/skills/code-review/rules/architecture.md +285 -0
- package/skills/code-review/rules/coupling-cohesion.md +309 -0
- package/skills/code-review/rules/dead-code.md +115 -0
- package/skills/code-review/rules/deprecation-debt.md +279 -0
- package/skills/code-review/rules/duplication.md +104 -0
- package/skills/code-review/rules/error-security.md +143 -0
- package/skills/code-review/rules/maintainability.md +203 -0
- package/skills/code-review/rules/quality.md +158 -0
- package/skills/devops-conventions/SKILL.md +205 -0
- package/skills/doc-coauthoring/SKILL.md +392 -0
- package/skills/doc-standards-enforcer/SKILL.md +290 -0
- package/skills/doc-standards-enforcer/examples/valid-document-example.md +67 -0
- package/skills/doc-standards-enforcer/references/101-standards-summary.md +318 -0
- package/skills/doc-standards-enforcer/scripts/check_references.py +175 -0
- package/skills/doc-standards-enforcer/scripts/fix_common_issues.py +303 -0
- package/skills/doc-standards-enforcer/scripts/validate_doc_standards.py +332 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +200 -0
- package/skills/docx/docx-js.md +350 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/ooxml/scripts/pack.py +159 -0
- package/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/docx/ooxml/scripts/validate.py +69 -0
- package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/docx/ooxml.md +610 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/document.py +1276 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/docx/scripts/utilities.py +374 -0
- package/skills/flutter-conventions/SKILL.md +70 -0
- package/skills/go-conventions/SKILL.md +230 -0
- package/skills/harmony-conventions/SKILL.md +156 -0
- package/skills/java-conventions/SKILL.md +277 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +297 -0
- package/skills/pdf/forms.md +205 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/pdf/scripts/create_validation_image.py +41 -0
- package/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/pptx/LICENSE.txt +30 -0
- package/skills/pptx/SKILL.md +487 -0
- package/skills/pptx/html2pptx.md +625 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/pptx/ooxml.md +427 -0
- package/skills/pptx/scripts/html2pptx.js +979 -0
- package/skills/pptx/scripts/inventory.py +1020 -0
- package/skills/pptx/scripts/rearrange.py +231 -0
- package/skills/pptx/scripts/replace.py +385 -0
- package/skills/pptx/scripts/thumbnail.py +450 -0
- package/skills/project-analyze/SKILL.md +270 -0
- package/skills/project-analyze/phases/phase0-discovery.md +278 -0
- package/skills/project-analyze/phases/phase0.5-prescan.md +139 -0
- package/skills/project-analyze/phases/phase1-inventory.md +94 -0
- package/skills/project-analyze/phases/phase2-deep-analysis.md +249 -0
- package/skills/project-analyze/phases/phase2a-l4-analysis.md +94 -0
- package/skills/project-analyze/phases/phase2b-l5-analysis.md +97 -0
- package/skills/project-analyze/phases/phase3-knowledge-graph.md +120 -0
- package/skills/project-analyze/phases/phase3a-multi-dimensional.md +61 -0
- package/skills/project-analyze/phases/phase4-code-quality.md +81 -0
- package/skills/project-analyze/phases/phase5-synthesis.md +284 -0
- package/skills/project-analyze/phases/phase6-validation.md +179 -0
- package/skills/project-analyze/prompts/code-review-agent.md +122 -0
- package/skills/project-analyze/prompts/deep-analysis-agent.md +107 -0
- package/skills/project-analyze/prompts/inventory-agent.md +67 -0
- package/skills/project-analyze/prompts/l4-analysis-agent.md +98 -0
- package/skills/project-analyze/rules/android.md +282 -0
- package/skills/project-analyze/rules/devops.md +443 -0
- package/skills/project-analyze/rules/generic.md +243 -0
- package/skills/project-analyze/rules/go.md +289 -0
- package/skills/project-analyze/rules/harmony.md +257 -0
- package/skills/project-analyze/rules/java.md +507 -0
- package/skills/project-analyze/rules/mobile-flutter.md +315 -0
- package/skills/project-analyze/rules/mobile-react-native.md +283 -0
- package/skills/project-analyze/rules/mobile-swift.md +323 -0
- package/skills/project-analyze/rules/python.md +317 -0
- package/skills/project-analyze/rules/rust-tauri.md +243 -0
- package/skills/project-analyze/rules/rust.md +296 -0
- package/skills/project-analyze/rules/web-nextjs.md +364 -0
- package/skills/project-analyze/rules/web-react.md +298 -0
- package/skills/project-analyze/rules/web-vue.md +378 -0
- package/skills/project-analyze/rules/web.md +390 -0
- package/skills/project-query/SKILL.md +224 -0
- package/skills/project-query/rules/query-templates.md +212 -0
- package/skills/python-conventions/SKILL.md +169 -0
- package/skills/react-native-conventions/SKILL.md +73 -0
- package/skills/requirements-writer/README.md +153 -0
- package/skills/requirements-writer/SKILL.md +341 -0
- package/skills/requirements-writer/examples/prd-outline-example.md +217 -0
- package/skills/requirements-writer/templates/module-prd-template.md +362 -0
- package/skills/requirements-writer/templates/prd-outline-template.md +185 -0
- package/skills/requirements-writer/templates/user-story-template.md +1125 -0
- package/skills/rust-conventions/SKILL.md +361 -0
- package/skills/smart-dispatch/SKILL.md +296 -0
- package/skills/smart-dispatch/implementer-prompt.md +146 -0
- package/skills/smart-dispatch/reviewer-prompt.md +199 -0
- package/skills/software-architecture/SKILL.md +278 -0
- package/skills/swift-conventions/SKILL.md +72 -0
- package/skills/ui-ux-pro/SKILL.md +140 -0
- package/skills/verification-before-completion/SKILL.md +119 -0
- package/skills/web-conventions/SKILL.md +259 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +97 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/skills/writing-plans/SKILL.md +144 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +292 -0
- package/skills/xlsx/recalc.py +178 -0
- package/templates/CLAUDE.md.android +57 -0
- package/templates/CLAUDE.md.devops +50 -0
- package/templates/CLAUDE.md.generic +34 -0
- package/templates/CLAUDE.md.go +67 -0
- package/templates/CLAUDE.md.harmony +54 -0
- package/templates/CLAUDE.md.java +56 -0
- package/templates/CLAUDE.md.mobile-flutter +38 -0
- package/templates/CLAUDE.md.mobile-react-native +37 -0
- package/templates/CLAUDE.md.mobile-swift +40 -0
- package/templates/CLAUDE.md.python +65 -0
- package/templates/CLAUDE.md.rust +68 -0
- package/templates/CLAUDE.md.rust-tauri +120 -0
- package/templates/CLAUDE.md.web +63 -0
- package/templates/COMPONENT.md.android +58 -0
- package/templates/COMPONENT.md.devops +54 -0
- package/templates/COMPONENT.md.generic +35 -0
- package/templates/COMPONENT.md.go +59 -0
- package/templates/COMPONENT.md.harmony +63 -0
- package/templates/COMPONENT.md.java +69 -0
- package/templates/COMPONENT.md.mobile-flutter +56 -0
- package/templates/COMPONENT.md.mobile-react-native +55 -0
- package/templates/COMPONENT.md.mobile-swift +56 -0
- package/templates/COMPONENT.md.python +67 -0
- package/templates/COMPONENT.md.rust +57 -0
- package/templates/COMPONENT.md.rust-tauri +66 -0
- package/templates/COMPONENT.md.web +39 -0
- package/templates/README.md.android +71 -0
- package/templates/README.md.devops +68 -0
- package/templates/README.md.generic +39 -0
- package/templates/README.md.go +70 -0
- package/templates/README.md.harmony +72 -0
- package/templates/README.md.java +73 -0
- package/templates/README.md.mobile-flutter +69 -0
- package/templates/README.md.mobile-react-native +65 -0
- package/templates/README.md.mobile-swift +69 -0
- package/templates/README.md.monorepo +59 -0
- package/templates/README.md.python +66 -0
- package/templates/README.md.rust +69 -0
- package/templates/README.md.rust-tauri +149 -0
- package/templates/README.md.web +94 -0
- package/templates/UI_STYLE.md.android +74 -0
- package/templates/UI_STYLE.md.devops +50 -0
- package/templates/UI_STYLE.md.generic +31 -0
- package/templates/UI_STYLE.md.go +49 -0
- package/templates/UI_STYLE.md.harmony +71 -0
- package/templates/UI_STYLE.md.java +61 -0
- package/templates/UI_STYLE.md.mobile-flutter +70 -0
- package/templates/UI_STYLE.md.mobile-react-native +71 -0
- package/templates/UI_STYLE.md.mobile-swift +71 -0
- package/templates/UI_STYLE.md.python +58 -0
- package/templates/UI_STYLE.md.rust +52 -0
- package/templates/UI_STYLE.md.rust-tauri +102 -0
- package/templates/UI_STYLE.md.web +92 -0
- package/templates/cursor-rules.android.mdc +33 -0
- package/templates/cursor-rules.devops.mdc +32 -0
- package/templates/cursor-rules.generic.mdc +25 -0
- package/templates/cursor-rules.go.mdc +34 -0
- package/templates/cursor-rules.harmony.mdc +30 -0
- package/templates/cursor-rules.java.mdc +30 -0
- package/templates/cursor-rules.mobile-flutter.mdc +42 -0
- package/templates/cursor-rules.mobile-react-native.mdc +43 -0
- package/templates/cursor-rules.mobile-swift.mdc +42 -0
- package/templates/cursor-rules.python.mdc +33 -0
- package/templates/cursor-rules.rust-tauri.mdc +67 -0
- package/templates/cursor-rules.rust.mdc +30 -0
- package/templates/cursor-rules.web.mdc +30 -0
- package/templates/kiro-steering.android.md +39 -0
- package/templates/kiro-steering.devops.md +32 -0
- package/templates/kiro-steering.generic.md +28 -0
- package/templates/kiro-steering.go.md +41 -0
- package/templates/kiro-steering.harmony.md +36 -0
- package/templates/kiro-steering.java.md +37 -0
- package/templates/kiro-steering.mobile-flutter.md +73 -0
- package/templates/kiro-steering.mobile-react-native.md +71 -0
- package/templates/kiro-steering.mobile-swift.md +62 -0
- package/templates/kiro-steering.python.md +34 -0
- package/templates/kiro-steering.rust-tauri.md +50 -0
- package/templates/kiro-steering.rust.md +36 -0
- package/templates/kiro-steering.web.md +41 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# aTool - lib/install-cursor.sh
|
|
3
|
+
# Cursor IDE installation (skills -> .mdc rules)
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# These functions are sourced by the parent script, not run directly.
|
|
8
|
+
# common.sh must already be loaded.
|
|
9
|
+
|
|
10
|
+
# Get file-type globs for a skill so Cursor auto-loads it for relevant files
|
|
11
|
+
# Args: SKILL_NAME
|
|
12
|
+
# Outputs: comma-separated glob list (e.g. "*.java,pom.xml")
|
|
13
|
+
get_skill_globs() {
|
|
14
|
+
local skill_name="$1"
|
|
15
|
+
case "$skill_name" in
|
|
16
|
+
# Conventions skills - match their file types
|
|
17
|
+
java-conventions) echo "*.java,pom.xml,*.gradle,*.gradle.kts" ;;
|
|
18
|
+
web-conventions) echo "*.tsx,*.ts,*.jsx,*.js,*.vue,*.svelte,package.json" ;;
|
|
19
|
+
python-conventions) echo "*.py,pyproject.toml,requirements.txt,setup.py" ;;
|
|
20
|
+
rust-conventions) echo "*.rs,Cargo.toml,Cargo.lock" ;;
|
|
21
|
+
go-conventions) echo "*.go,go.mod,go.sum" ;;
|
|
22
|
+
android-conventions) echo "*.kt,*.kts,build.gradle,AndroidManifest.xml" ;;
|
|
23
|
+
harmony-conventions) echo "*.ets,*.ts,oh-package.json5,build-profile.json5" ;;
|
|
24
|
+
swift-conventions) echo "*.swift,Package.swift" ;;
|
|
25
|
+
flutter-conventions) echo "*.dart,pubspec.yaml,analysis_options.yaml" ;;
|
|
26
|
+
react-native-conventions) echo "*.tsx,*.ts,*.jsx,*.js,app.json,metro.config.*" ;;
|
|
27
|
+
devops-conventions) echo "Dockerfile,docker-compose.*,*.tf,Chart.yaml" ;;
|
|
28
|
+
# Analysis skills - trigger on code/doc files
|
|
29
|
+
project-analyze) echo "*.md,CLAUDE.md,README.md" ;;
|
|
30
|
+
project-query) echo "*.md,knowledge-graph.json" ;;
|
|
31
|
+
code-review) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.swift,*.kt,*.dart" ;;
|
|
32
|
+
# Workflow skills - trigger on markdown/planning files
|
|
33
|
+
writing-plans) echo "*.md" ;;
|
|
34
|
+
executing-plans) echo "*.md" ;;
|
|
35
|
+
brainstorming) echo "*.md" ;;
|
|
36
|
+
systematic-debugging) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.swift,*.kt" ;;
|
|
37
|
+
verification-before-completion) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.swift,*.kt" ;;
|
|
38
|
+
# Architecture/design
|
|
39
|
+
software-architecture) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.kt,*.swift,*.dart,*.ets,*.yaml,*.yml,*.md" ;;
|
|
40
|
+
ai-project-architecture) echo "*.py,pyproject.toml" ;;
|
|
41
|
+
doc-coauthoring) echo "*.md" ;;
|
|
42
|
+
doc-standards-enforcer) echo "*.md" ;;
|
|
43
|
+
requirements-writer) echo "*.md" ;;
|
|
44
|
+
ui-ux-pro) echo "*.tsx,*.ts,*.jsx,*.js,*.vue,*.svelte,*.css,*.scss" ;;
|
|
45
|
+
webapp-testing) echo "*.test.*,*.spec.*,playwright.config.*" ;;
|
|
46
|
+
find-skills) echo "*.md,*.txt" ;;
|
|
47
|
+
smart-dispatch) echo "*.plan.md" ;;
|
|
48
|
+
# Office skills
|
|
49
|
+
pdf) echo "*.pdf" ;;
|
|
50
|
+
docx) echo "*.docx" ;;
|
|
51
|
+
pptx) echo "*.pptx" ;;
|
|
52
|
+
xlsx) echo "*.xlsx,*.xlsm,*.csv,*.tsv" ;;
|
|
53
|
+
# Superpowers - broad globs for code-related
|
|
54
|
+
test-driven-development) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.swift,*.kt" ;;
|
|
55
|
+
receiving-code-review) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.swift,*.kt" ;;
|
|
56
|
+
requesting-code-review) echo "*.java,*.py,*.ts,*.tsx,*.js,*.go,*.rs,*.swift,*.kt" ;;
|
|
57
|
+
finishing-a-development-branch) echo "*.md" ;;
|
|
58
|
+
dispatching-parallel-agents) echo "*.plan.md" ;;
|
|
59
|
+
subagent-driven-development) echo "*.plan.md" ;;
|
|
60
|
+
using-git-worktrees) echo "" ;;
|
|
61
|
+
writing-skills) echo "SKILL.md,*.skill.md" ;;
|
|
62
|
+
*) echo "" ;;
|
|
63
|
+
esac
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# Determine whether a skill should use alwaysApply: true in .mdc
|
|
67
|
+
# Only truly essential context skills — everything else uses globs or on-demand
|
|
68
|
+
# Args: SKILL_NAME
|
|
69
|
+
# Returns: 0 (true / always apply), 1 (false)
|
|
70
|
+
should_always_apply() {
|
|
71
|
+
local skill_name="$1"
|
|
72
|
+
case "$skill_name" in
|
|
73
|
+
# Must-always: core context injected into every conversation
|
|
74
|
+
atool-init) return 0 ;;
|
|
75
|
+
using-superpowers) return 0 ;;
|
|
76
|
+
clarify-before-build) return 0 ;;
|
|
77
|
+
# Core workflow skills that Cursor users can't invoke via slash commands
|
|
78
|
+
# Must be always-on so the AI knows when to trigger them
|
|
79
|
+
project-analyze) return 0 ;;
|
|
80
|
+
# Workflow skill with no good glob match - must be always-on
|
|
81
|
+
using-git-worktrees) return 0 ;;
|
|
82
|
+
# Conventions skills - always relevant for their file types (via globs too)
|
|
83
|
+
*-conventions) return 0 ;;
|
|
84
|
+
# All other skills: use globs or on-demand (reduces context token consumption)
|
|
85
|
+
*) return 1 ;;
|
|
86
|
+
esac
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# Convert a SKILL.md to Cursor .mdc format
|
|
90
|
+
# Args: SKILL_DIR, OUTPUT_FILE
|
|
91
|
+
skill_to_mdc() {
|
|
92
|
+
local skill_dir="$1"
|
|
93
|
+
local output_file="$2"
|
|
94
|
+
local skill_name
|
|
95
|
+
skill_name=$(basename "$skill_dir")
|
|
96
|
+
|
|
97
|
+
local skill_md="$skill_dir/SKILL.md"
|
|
98
|
+
if [[ ! -f "$skill_md" ]]; then
|
|
99
|
+
return 1
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Extract description from frontmatter or first heading
|
|
103
|
+
local description
|
|
104
|
+
description=$(sed -n '/^---$/,/^---$/p' "$skill_md" | grep '^description:' | head -1 | sed 's/^description:[[:space:]]*//' )
|
|
105
|
+
if [[ -z "$description" ]]; then
|
|
106
|
+
description=$(head -10 "$skill_md" | grep -i '^#' | head -1 | sed 's/^#*\s*//' || echo "$skill_name skill")
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
# Determine globs and alwaysApply
|
|
110
|
+
local globs
|
|
111
|
+
globs=$(get_skill_globs "$skill_name")
|
|
112
|
+
local apply_flag="false"
|
|
113
|
+
if should_always_apply "$skill_name"; then
|
|
114
|
+
apply_flag="true"
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Write frontmatter
|
|
118
|
+
echo "---" > "$output_file"
|
|
119
|
+
local escaped_desc
|
|
120
|
+
escaped_desc=$(printf '%s' "$description" | sed 's/"/\\"/g')
|
|
121
|
+
printf 'description: "%s"\n' "$escaped_desc" >> "$output_file"
|
|
122
|
+
if [[ -n "$globs" ]]; then
|
|
123
|
+
# Convert comma-separated to YAML list
|
|
124
|
+
echo "globs:" >> "$output_file"
|
|
125
|
+
local IFS_OLD="$IFS"
|
|
126
|
+
IFS=','
|
|
127
|
+
for glob in $globs; do
|
|
128
|
+
echo " - \"$glob\"" >> "$output_file"
|
|
129
|
+
done
|
|
130
|
+
IFS="$IFS_OLD"
|
|
131
|
+
else
|
|
132
|
+
echo "globs:" >> "$output_file"
|
|
133
|
+
fi
|
|
134
|
+
echo "alwaysApply: $apply_flag" >> "$output_file"
|
|
135
|
+
echo "---" >> "$output_file"
|
|
136
|
+
|
|
137
|
+
# Add aTool marker
|
|
138
|
+
echo "# Added by aTool - DO NOT EDIT (auto-generated from skill: $skill_name)" >> "$output_file"
|
|
139
|
+
echo "" >> "$output_file"
|
|
140
|
+
|
|
141
|
+
# Append skill content, stripping YAML front matter from source
|
|
142
|
+
awk '/^---$/{n++;next} n<2{next} {print}' "$skill_md" >> "$output_file"
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
# Generate .mdc rules from skills into a target directory
|
|
146
|
+
# Args: TARGET_DIR, SKILLS_DIRS...
|
|
147
|
+
generate_cursor_skill_rules() {
|
|
148
|
+
local target_dir="$1"
|
|
149
|
+
shift
|
|
150
|
+
local skills_dirs=("$@")
|
|
151
|
+
|
|
152
|
+
ensure_dir "$target_dir"
|
|
153
|
+
|
|
154
|
+
for skills_base in "${skills_dirs[@]}"; do
|
|
155
|
+
[[ ! -d "$skills_base" ]] && continue
|
|
156
|
+
for skill_dir in "$skills_base"/*/; do
|
|
157
|
+
[[ ! -d "$skill_dir" ]] && continue
|
|
158
|
+
local skill_name
|
|
159
|
+
skill_name=$(basename "$skill_dir")
|
|
160
|
+
# Skip _superpowers and symlinks
|
|
161
|
+
[[ "$skill_name" == "_superpowers" ]] && continue
|
|
162
|
+
[[ -L "$skill_dir" ]] && continue
|
|
163
|
+
local mdc_file="$target_dir/atool-${skill_name}.mdc"
|
|
164
|
+
|
|
165
|
+
# Always generate to temp, compare checksums, update only if changed
|
|
166
|
+
local tmp_file
|
|
167
|
+
tmp_file=$(mktemp)
|
|
168
|
+
|
|
169
|
+
if skill_to_mdc "$skill_dir" "$tmp_file"; then
|
|
170
|
+
if [[ -f "$mdc_file" ]] && [[ "${ATOOL_FORCE:-0}" != "1" ]]; then
|
|
171
|
+
local existing_cksum new_cksum
|
|
172
|
+
existing_cksum=$(file_checksum "$mdc_file")
|
|
173
|
+
new_cksum=$(file_checksum "$tmp_file")
|
|
174
|
+
if [[ "$existing_cksum" == "$new_cksum" ]]; then
|
|
175
|
+
rm -f "$tmp_file"
|
|
176
|
+
continue # Content unchanged
|
|
177
|
+
fi
|
|
178
|
+
log_info "Rule '$skill_name' content changed, updating"
|
|
179
|
+
fi
|
|
180
|
+
mv "$tmp_file" "$mdc_file"
|
|
181
|
+
log_info "Generated rule: atool-${skill_name}.mdc"
|
|
182
|
+
else
|
|
183
|
+
rm -f "$tmp_file"
|
|
184
|
+
fi
|
|
185
|
+
done
|
|
186
|
+
done
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
install_cursor() {
|
|
190
|
+
log_step "Installing to Cursor..."
|
|
191
|
+
|
|
192
|
+
# Check if Cursor is installed
|
|
193
|
+
if ! command -v cursor &>/dev/null; then
|
|
194
|
+
local _cursor_dir
|
|
195
|
+
_cursor_dir=$(get_cursor_config_dir 2>/dev/null)
|
|
196
|
+
if [[ ! -d "$_cursor_dir" ]]; then
|
|
197
|
+
log_warn "Cursor not found in PATH and config directory does not exist"
|
|
198
|
+
log_info "Install Cursor first: https://cursor.sh"
|
|
199
|
+
if ! confirm "Continue anyway?" "N"; then
|
|
200
|
+
return 0
|
|
201
|
+
fi
|
|
202
|
+
fi
|
|
203
|
+
fi
|
|
204
|
+
|
|
205
|
+
local atool_root="${ATOOL_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
206
|
+
local atool_skills_dir="$atool_root/skills"
|
|
207
|
+
local sp_dir=""
|
|
208
|
+
|
|
209
|
+
# Cursor only loads rules from PROJECT-LEVEL .cursor/rules/
|
|
210
|
+
# Global install generates rules to a staging area (<cursor_config>/rules/.atool-staging/)
|
|
211
|
+
# These are copied to project .cursor/rules/ when --project init runs
|
|
212
|
+
local cursor_config_dir
|
|
213
|
+
cursor_config_dir=$(get_cursor_config_dir)
|
|
214
|
+
local staging_dir="$cursor_config_dir/rules/.atool-staging"
|
|
215
|
+
|
|
216
|
+
# 1. Generate aTool rules to staging area
|
|
217
|
+
log_step "Generating aTool Cursor rules (staging)..."
|
|
218
|
+
generate_cursor_skill_rules "$staging_dir" "$atool_skills_dir"
|
|
219
|
+
|
|
220
|
+
# 2. Generate Superpowers rules to staging area
|
|
221
|
+
log_step "Generating Superpowers Cursor rules (staging)..."
|
|
222
|
+
local sp_submodule="$atool_root/skills/_superpowers"
|
|
223
|
+
|
|
224
|
+
if [[ -d "$sp_submodule/skills" ]]; then
|
|
225
|
+
# Use local submodule
|
|
226
|
+
sp_dir="$sp_submodule"
|
|
227
|
+
log_info "Using local Superpowers submodule"
|
|
228
|
+
else
|
|
229
|
+
# Fallback: download from GitHub
|
|
230
|
+
log_warn "Superpowers submodule not found, downloading..."
|
|
231
|
+
sp_dir="$HOME/.atool/cache/superpowers"
|
|
232
|
+
download_superpowers "$sp_dir"
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
if [[ -d "$sp_dir/skills" ]]; then
|
|
236
|
+
ensure_dir "$staging_dir"
|
|
237
|
+
for skill_dir in "$sp_dir/skills"/*/; do
|
|
238
|
+
[[ ! -d "$skill_dir" ]] && continue
|
|
239
|
+
local skill_name
|
|
240
|
+
skill_name=$(basename "$skill_dir")
|
|
241
|
+
local mdc_file="$staging_dir/superpowers-${skill_name}.mdc"
|
|
242
|
+
|
|
243
|
+
if [[ -f "$mdc_file" ]] && [[ "${ATOOL_FORCE:-0}" != "1" ]]; then
|
|
244
|
+
# Check if content changed
|
|
245
|
+
local tmp_sp_file
|
|
246
|
+
tmp_sp_file=$(mktemp)
|
|
247
|
+
if skill_to_mdc "$skill_dir" "$tmp_sp_file"; then
|
|
248
|
+
local existing_cksum new_cksum
|
|
249
|
+
existing_cksum=$(file_checksum "$mdc_file")
|
|
250
|
+
new_cksum=$(file_checksum "$tmp_sp_file")
|
|
251
|
+
if [[ "$existing_cksum" == "$new_cksum" ]]; then
|
|
252
|
+
rm -f "$tmp_sp_file"
|
|
253
|
+
continue # Content unchanged
|
|
254
|
+
fi
|
|
255
|
+
mv "$tmp_sp_file" "$mdc_file"
|
|
256
|
+
log_info "Updated rule: superpowers-${skill_name}.mdc"
|
|
257
|
+
else
|
|
258
|
+
rm -f "$tmp_sp_file"
|
|
259
|
+
fi
|
|
260
|
+
else
|
|
261
|
+
if skill_to_mdc "$skill_dir" "$mdc_file"; then
|
|
262
|
+
log_info "Generated rule: superpowers-${skill_name}.mdc"
|
|
263
|
+
fi
|
|
264
|
+
fi
|
|
265
|
+
done
|
|
266
|
+
else
|
|
267
|
+
log_warn "Superpowers not available - skipping Superpowers rules"
|
|
268
|
+
fi
|
|
269
|
+
|
|
270
|
+
# 3. Install MCP servers (global, works for Cursor)
|
|
271
|
+
install_mcp "cursor"
|
|
272
|
+
|
|
273
|
+
log_success "Cursor installation complete!"
|
|
274
|
+
echo ""
|
|
275
|
+
log_info "Installed:"
|
|
276
|
+
log_info " Rules (staging): $staging_dir/"
|
|
277
|
+
log_info " MCP: $(get_cursor_config_dir)/mcp.json"
|
|
278
|
+
echo ""
|
|
279
|
+
log_warn "IMPORTANT: Cursor only loads rules from PROJECT-LEVEL .cursor/rules/"
|
|
280
|
+
log_warn "Run './install.sh --project /path/to/project' to copy rules to a project."
|
|
281
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# aTool - lib/install-hooks.sh
|
|
3
|
+
# Hooks installation for Claude Code and Cursor
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# These functions are sourced by the parent script, not run directly.
|
|
8
|
+
# common.sh must already be loaded.
|
|
9
|
+
|
|
10
|
+
# Install hooks to a project directory
|
|
11
|
+
# Args: PROJECT_DIR, IDE_TYPE (claude|cursor|kiro)
|
|
12
|
+
install_hooks() {
|
|
13
|
+
local project_dir="$1"
|
|
14
|
+
local ide_type="$2"
|
|
15
|
+
local atool_root="${ATOOL_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
16
|
+
|
|
17
|
+
# Kiro doesn't support hooks
|
|
18
|
+
if [[ "$ide_type" == "kiro" ]]; then
|
|
19
|
+
log_info "Kiro does not support hooks - skipping"
|
|
20
|
+
return 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
log_step "Installing hooks for $ide_type..."
|
|
24
|
+
|
|
25
|
+
local hooks_dir
|
|
26
|
+
local hook_script_name="atool-session-start"
|
|
27
|
+
|
|
28
|
+
case "$ide_type" in
|
|
29
|
+
claude)
|
|
30
|
+
hooks_dir="$project_dir/.claude/hooks"
|
|
31
|
+
;;
|
|
32
|
+
cursor)
|
|
33
|
+
hooks_dir="$project_dir/.cursor/hooks"
|
|
34
|
+
;;
|
|
35
|
+
*)
|
|
36
|
+
log_warn "Unknown IDE type for hooks: $ide_type"
|
|
37
|
+
return 0
|
|
38
|
+
;;
|
|
39
|
+
esac
|
|
40
|
+
|
|
41
|
+
ensure_dir "$hooks_dir"
|
|
42
|
+
|
|
43
|
+
# Copy lib files (required by session-start hook)
|
|
44
|
+
local project_lib_dir
|
|
45
|
+
case "$ide_type" in
|
|
46
|
+
claude) project_lib_dir="$project_dir/.claude/lib" ;;
|
|
47
|
+
cursor) project_lib_dir="$project_dir/.cursor/lib" ;;
|
|
48
|
+
esac
|
|
49
|
+
if [[ -n "${project_lib_dir:-}" ]]; then
|
|
50
|
+
ensure_dir "$project_lib_dir"
|
|
51
|
+
if [[ -f "$atool_root/lib/common.sh" ]]; then
|
|
52
|
+
run_cmd cp "$atool_root/lib/common.sh" "$project_lib_dir/common.sh"
|
|
53
|
+
fi
|
|
54
|
+
if [[ -f "$atool_root/lib/detect-stack.sh" ]]; then
|
|
55
|
+
run_cmd cp "$atool_root/lib/detect-stack.sh" "$project_lib_dir/detect-stack.sh"
|
|
56
|
+
fi
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
local dest_hook="$hooks_dir/$hook_script_name"
|
|
60
|
+
|
|
61
|
+
# Check if hook already exists
|
|
62
|
+
if [[ -f "$dest_hook" ]] && [[ "${ATOOL_FORCE:-0}" != "1" ]]; then
|
|
63
|
+
local existing_checksum
|
|
64
|
+
local source_checksum
|
|
65
|
+
existing_checksum=$(file_checksum "$dest_hook")
|
|
66
|
+
source_checksum=$(file_checksum "$atool_root/hooks/session-start")
|
|
67
|
+
|
|
68
|
+
if [[ "$existing_checksum" == "$source_checksum" ]]; then
|
|
69
|
+
log_info "Hook '$hook_script_name' already up to date, skipping"
|
|
70
|
+
else
|
|
71
|
+
log_info "Hook '$hook_script_name' exists but differs - backing up"
|
|
72
|
+
backup_file "$dest_hook"
|
|
73
|
+
run_cmd cp "$atool_root/hooks/session-start" "$dest_hook"
|
|
74
|
+
run_cmd chmod +x "$dest_hook"
|
|
75
|
+
log_success "Hook installed: $dest_hook"
|
|
76
|
+
fi
|
|
77
|
+
else
|
|
78
|
+
run_cmd cp "$atool_root/hooks/session-start" "$dest_hook"
|
|
79
|
+
run_cmd chmod +x "$dest_hook"
|
|
80
|
+
log_success "Hook installed: $dest_hook"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Install prompt-guard hook
|
|
84
|
+
local prompt_guard_src="$atool_root/hooks/prompt-guard"
|
|
85
|
+
if [[ -f "$prompt_guard_src" ]]; then
|
|
86
|
+
local prompt_guard_name="atool-prompt-guard"
|
|
87
|
+
local dest_prompt_guard="$hooks_dir/$prompt_guard_name"
|
|
88
|
+
|
|
89
|
+
if [[ -f "$dest_prompt_guard" ]] && [[ "${ATOOL_FORCE:-0}" != "1" ]]; then
|
|
90
|
+
local pg_existing pg_source
|
|
91
|
+
pg_existing=$(file_checksum "$dest_prompt_guard")
|
|
92
|
+
pg_source=$(file_checksum "$prompt_guard_src")
|
|
93
|
+
if [[ "$pg_existing" == "$pg_source" ]]; then
|
|
94
|
+
log_info "Hook '$prompt_guard_name' already up to date, skipping"
|
|
95
|
+
else
|
|
96
|
+
log_info "Hook '$prompt_guard_name' exists but differs - backing up"
|
|
97
|
+
backup_file "$dest_prompt_guard"
|
|
98
|
+
run_cmd cp "$prompt_guard_src" "$dest_prompt_guard"
|
|
99
|
+
run_cmd chmod +x "$dest_prompt_guard"
|
|
100
|
+
log_success "Hook installed: $dest_prompt_guard"
|
|
101
|
+
fi
|
|
102
|
+
else
|
|
103
|
+
run_cmd cp "$prompt_guard_src" "$dest_prompt_guard"
|
|
104
|
+
run_cmd chmod +x "$dest_prompt_guard"
|
|
105
|
+
log_success "Hook installed: $dest_prompt_guard"
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
# Install doc-sync-reminder hook (PostToolUse)
|
|
110
|
+
local doc_sync_src="$atool_root/hooks/doc-sync-reminder"
|
|
111
|
+
if [[ -f "$doc_sync_src" ]]; then
|
|
112
|
+
local doc_sync_name="atool-doc-sync-reminder"
|
|
113
|
+
local dest_doc_sync="$hooks_dir/$doc_sync_name"
|
|
114
|
+
|
|
115
|
+
if [[ -f "$dest_doc_sync" ]] && [[ "${ATOOL_FORCE:-0}" != "1" ]]; then
|
|
116
|
+
local ds_existing ds_source
|
|
117
|
+
ds_existing=$(file_checksum "$dest_doc_sync")
|
|
118
|
+
ds_source=$(file_checksum "$doc_sync_src")
|
|
119
|
+
if [[ "$ds_existing" == "$ds_source" ]]; then
|
|
120
|
+
log_info "Hook '$doc_sync_name' already up to date, skipping"
|
|
121
|
+
else
|
|
122
|
+
log_info "Hook '$doc_sync_name' exists but differs - backing up"
|
|
123
|
+
backup_file "$dest_doc_sync"
|
|
124
|
+
run_cmd cp "$doc_sync_src" "$dest_doc_sync"
|
|
125
|
+
run_cmd chmod +x "$dest_doc_sync"
|
|
126
|
+
log_success "Hook installed: $dest_doc_sync"
|
|
127
|
+
fi
|
|
128
|
+
else
|
|
129
|
+
run_cmd cp "$doc_sync_src" "$dest_doc_sync"
|
|
130
|
+
run_cmd chmod +x "$dest_doc_sync"
|
|
131
|
+
log_success "Hook installed: $dest_doc_sync"
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# Install hooks config JSON
|
|
136
|
+
local config_file
|
|
137
|
+
case "$ide_type" in
|
|
138
|
+
claude)
|
|
139
|
+
config_file="$project_dir/.claude/settings.local.json"
|
|
140
|
+
;;
|
|
141
|
+
cursor)
|
|
142
|
+
config_file="$project_dir/.cursor/hooks.json"
|
|
143
|
+
;;
|
|
144
|
+
esac
|
|
145
|
+
|
|
146
|
+
if [[ -n "${config_file:-}" ]]; then
|
|
147
|
+
local template_file
|
|
148
|
+
template_file="$atool_root/hooks/hooks.json"
|
|
149
|
+
[[ "$ide_type" == "cursor" ]] && template_file="$atool_root/hooks/hooks-cursor.json"
|
|
150
|
+
|
|
151
|
+
if [[ -f "$template_file" ]]; then
|
|
152
|
+
# Expand ~ paths to absolute paths for cross-platform compatibility
|
|
153
|
+
local _claude_dir _cursor_dir
|
|
154
|
+
_claude_dir=$(get_claude_config_dir)
|
|
155
|
+
_cursor_dir=$(get_cursor_config_dir)
|
|
156
|
+
local hook_abs_path
|
|
157
|
+
if [[ "$ide_type" == "claude" ]]; then
|
|
158
|
+
hook_abs_path="$_claude_dir/hooks/atool-session-start"
|
|
159
|
+
else
|
|
160
|
+
hook_abs_path="$_cursor_dir/hooks/atool-session-start"
|
|
161
|
+
fi
|
|
162
|
+
local expanded_template
|
|
163
|
+
expanded_template=$(sed "s|~/.claude/hooks/|$_claude_dir/hooks/|g; s|~/.cursor/hooks/|$_cursor_dir/hooks/|g" "$template_file")
|
|
164
|
+
|
|
165
|
+
if [[ -f "$config_file" ]]; then
|
|
166
|
+
# Merge hooks config (use temp file instead of process substitution for Windows compat)
|
|
167
|
+
local merged _tmp_template
|
|
168
|
+
_tmp_template=$(mktemp)
|
|
169
|
+
echo "$expanded_template" > "$_tmp_template"
|
|
170
|
+
merged=$(json_merge "$config_file" "$_tmp_template")
|
|
171
|
+
rm -f "$_tmp_template"
|
|
172
|
+
if ! is_dry_run; then
|
|
173
|
+
echo "$merged" | jq '.' > "$config_file"
|
|
174
|
+
else
|
|
175
|
+
log_info "[DRY-RUN] Would merge hooks config into $config_file"
|
|
176
|
+
fi
|
|
177
|
+
else
|
|
178
|
+
if ! is_dry_run; then
|
|
179
|
+
echo "$expanded_template" | jq '.' > "$config_file"
|
|
180
|
+
else
|
|
181
|
+
log_info "[DRY-RUN] Would write hooks config to $config_file"
|
|
182
|
+
fi
|
|
183
|
+
fi
|
|
184
|
+
log_success "Hooks config updated: $config_file"
|
|
185
|
+
fi
|
|
186
|
+
fi
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Install hooks globally (for non-project-specific installation)
|
|
190
|
+
# Args: IDE_TYPE
|
|
191
|
+
install_hooks_global() {
|
|
192
|
+
local ide_type="$1"
|
|
193
|
+
local atool_root="${ATOOL_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
194
|
+
|
|
195
|
+
case "$ide_type" in
|
|
196
|
+
claude)
|
|
197
|
+
# 1. Copy lib files (required by session-start hook)
|
|
198
|
+
local claude_config_dir
|
|
199
|
+
claude_config_dir=$(get_claude_config_dir)
|
|
200
|
+
local claude_lib_dir="$claude_config_dir/lib"
|
|
201
|
+
ensure_dir "$claude_lib_dir"
|
|
202
|
+
if [[ -f "$atool_root/lib/common.sh" ]]; then
|
|
203
|
+
run_cmd cp "$atool_root/lib/common.sh" "$claude_lib_dir/common.sh"
|
|
204
|
+
fi
|
|
205
|
+
if [[ -f "$atool_root/lib/detect-stack.sh" ]]; then
|
|
206
|
+
run_cmd cp "$atool_root/lib/detect-stack.sh" "$claude_lib_dir/detect-stack.sh"
|
|
207
|
+
fi
|
|
208
|
+
|
|
209
|
+
# 2. Copy hook scripts
|
|
210
|
+
local claude_hooks_dir="$claude_config_dir/hooks"
|
|
211
|
+
ensure_dir "$claude_hooks_dir"
|
|
212
|
+
run_cmd cp "$atool_root/hooks/session-start" "$claude_hooks_dir/atool-session-start"
|
|
213
|
+
run_cmd chmod +x "$claude_hooks_dir/atool-session-start"
|
|
214
|
+
|
|
215
|
+
# Copy prompt-guard hook
|
|
216
|
+
if [[ -f "$atool_root/hooks/prompt-guard" ]]; then
|
|
217
|
+
run_cmd cp "$atool_root/hooks/prompt-guard" "$claude_hooks_dir/atool-prompt-guard"
|
|
218
|
+
run_cmd chmod +x "$claude_hooks_dir/atool-prompt-guard"
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
# Copy doc-sync-reminder hook (PostToolUse)
|
|
222
|
+
if [[ -f "$atool_root/hooks/doc-sync-reminder" ]]; then
|
|
223
|
+
run_cmd cp "$atool_root/hooks/doc-sync-reminder" "$claude_hooks_dir/atool-doc-sync-reminder"
|
|
224
|
+
run_cmd chmod +x "$claude_hooks_dir/atool-doc-sync-reminder"
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# 2. Register hooks config in settings.json
|
|
228
|
+
# Claude Code reads hooks from settings.json, NOT from files on disk
|
|
229
|
+
local settings_file="$claude_config_dir/settings.json"
|
|
230
|
+
local hooks_template="$atool_root/hooks/hooks.json"
|
|
231
|
+
|
|
232
|
+
if [[ -f "$hooks_template" ]]; then
|
|
233
|
+
# Expand ~ paths to absolute paths for cross-platform compatibility
|
|
234
|
+
local _claude_dir _cursor_dir
|
|
235
|
+
_claude_dir=$(get_claude_config_dir)
|
|
236
|
+
_cursor_dir=$(get_cursor_config_dir)
|
|
237
|
+
local expanded_template
|
|
238
|
+
expanded_template=$(sed "s|~/.claude/hooks/|$_claude_dir/hooks/|g; s|~/.cursor/hooks/|$_cursor_dir/hooks/|g" "$hooks_template")
|
|
239
|
+
|
|
240
|
+
if [[ -f "$settings_file" ]]; then
|
|
241
|
+
# Check both SessionStart and UserPromptSubmit and PostToolUse
|
|
242
|
+
local existing_ss existing_ups existing_ptu
|
|
243
|
+
existing_ss=$(jq -r '.hooks.SessionStart[]?.hooks[]?.command // empty' "$settings_file" 2>/dev/null | grep -c "atool-session-start" 2>/dev/null || true)
|
|
244
|
+
existing_ups=$(jq -r '.hooks.UserPromptSubmit[]?.hooks[]?.command // empty' "$settings_file" 2>/dev/null | grep -c "atool-prompt-guard" 2>/dev/null || true)
|
|
245
|
+
existing_ptu=$(jq -r '.hooks.PostToolUse[]?.hooks[]?.command // empty' "$settings_file" 2>/dev/null | grep -c "atool-doc-sync-reminder" 2>/dev/null || true)
|
|
246
|
+
existing_ss="${existing_ss:-0}"
|
|
247
|
+
existing_ups="${existing_ups:-0}"
|
|
248
|
+
existing_ptu="${existing_ptu:-0}"
|
|
249
|
+
if [[ "$existing_ss" -gt 0 ]] && [[ "$existing_ups" -gt 0 ]] && [[ "$existing_ptu" -gt 0 ]]; then
|
|
250
|
+
log_info "Claude global hooks already registered in settings.json, skipping"
|
|
251
|
+
else
|
|
252
|
+
local merged _tmp_tpl
|
|
253
|
+
_tmp_tpl=$(mktemp)
|
|
254
|
+
echo "$expanded_template" > "$_tmp_tpl"
|
|
255
|
+
merged=$(json_merge "$settings_file" "$_tmp_tpl")
|
|
256
|
+
rm -f "$_tmp_tpl"
|
|
257
|
+
backup_file "$settings_file"
|
|
258
|
+
if ! is_dry_run; then
|
|
259
|
+
echo "$merged" | jq '.' > "$settings_file"
|
|
260
|
+
fi
|
|
261
|
+
log_success "Claude hooks registered in $settings_file"
|
|
262
|
+
fi
|
|
263
|
+
else
|
|
264
|
+
if ! is_dry_run; then
|
|
265
|
+
echo "$expanded_template" | jq '.' > "$settings_file"
|
|
266
|
+
else
|
|
267
|
+
log_info "[DRY-RUN] Would write hooks config to $settings_file"
|
|
268
|
+
fi
|
|
269
|
+
log_success "Claude hooks registered in $settings_file"
|
|
270
|
+
fi
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
log_success "Global Claude hook installed"
|
|
274
|
+
;;
|
|
275
|
+
cursor)
|
|
276
|
+
# Cursor does not support global hooks that run on session start
|
|
277
|
+
# Cursor only supports project-level .cursor/rules/*.mdc for AI rules
|
|
278
|
+
log_info "Cursor does not support global session hooks"
|
|
279
|
+
log_info "Cursor rules are applied per-project via .cursor/rules/*.mdc"
|
|
280
|
+
;;
|
|
281
|
+
*)
|
|
282
|
+
log_info "$ide_type does not support global hooks"
|
|
283
|
+
;;
|
|
284
|
+
esac
|
|
285
|
+
}
|