@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,598 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# aTool - lib/compute-importance.sh
|
|
3
|
+
# Module importance scoring for project-analyze v5.0
|
|
4
|
+
#
|
|
5
|
+
# Usage: source this file, then call compute_importance <project_root> [--inventory-dir <path>]
|
|
6
|
+
# Or run directly: compute-importance.sh <project_root> [--inventory-dir <path>]
|
|
7
|
+
#
|
|
8
|
+
# Reads module structure and computes importance scores based on:
|
|
9
|
+
# - Centrality (20%): How many modules import this module
|
|
10
|
+
# - Size score (15%): Relative file count (log-scaled)
|
|
11
|
+
# - Entry point (15%): Contains router/main/App/entry files
|
|
12
|
+
# - Recency (10%): Recently changed files (git log, last 30 days)
|
|
13
|
+
# - Business critical (15%): Domain keywords in paths/files
|
|
14
|
+
# - Layer core (10%): Module in core business layer (service/domain)
|
|
15
|
+
# - API surface (10%): Number of exposed API endpoints
|
|
16
|
+
# - Data ownership (5%): Number of owned data entities
|
|
17
|
+
#
|
|
18
|
+
# Output format (tab-separated): module_path<tab>importance_score<tab>tier
|
|
19
|
+
# tier is one of: deep, catalog, skip
|
|
20
|
+
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
|
|
23
|
+
# shellcheck source=lib/common.sh
|
|
24
|
+
# shellcheck disable=SC1091
|
|
25
|
+
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
|
26
|
+
|
|
27
|
+
# === Configuration ===
|
|
28
|
+
|
|
29
|
+
BUSINESS_KEYWORDS="auth|authentication|login|session|token|jwt|oauth|permission|role|rbac|acl|payment|pay|order|cart|checkout|purchase|billing|invoice|subscription|user|account|member|profile|admin|tenant|customer"
|
|
30
|
+
|
|
31
|
+
ENTRY_POINT_PATTERNS="router routes index main App app bootstrap setup server handler controller"
|
|
32
|
+
|
|
33
|
+
# Directories to exclude from module discovery
|
|
34
|
+
IMPORTANCE_EXCLUDE_DIRS=(
|
|
35
|
+
"node_modules" "vendor" ".git" "dist" "build" "target"
|
|
36
|
+
"__pycache__" ".next" ".nuxt" ".output" ".atool-docs"
|
|
37
|
+
"coverage" ".cache" ".turbo" ".gradle" ".mvn"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# Source file extensions for module detection
|
|
41
|
+
SOURCE_EXTENSIONS=(
|
|
42
|
+
"*.ts" "*.tsx" "*.js" "*.jsx" "*.vue" "*.py" "*.java"
|
|
43
|
+
"*.kt" "*.go" "*.rs" "*.swift" "*.dart" "*.c" "*.cpp" "*.h"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# === Module Discovery ===
|
|
47
|
+
|
|
48
|
+
# Build find exclude arguments from IMPORTANCE_EXCLUDE_DIRS
|
|
49
|
+
# Args: none
|
|
50
|
+
# Output: space-separated exclude args for find
|
|
51
|
+
_build_importance_exclude_args() {
|
|
52
|
+
local args=""
|
|
53
|
+
for d in "${IMPORTANCE_EXCLUDE_DIRS[@]}"; do
|
|
54
|
+
args+="-not -path */${d}/* "
|
|
55
|
+
done
|
|
56
|
+
printf '%s' "$args"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Scan project for source modules (directories with 3+ source files).
|
|
60
|
+
# Args: PROJECT_ROOT - root directory to scan
|
|
61
|
+
# Output: one module path per line
|
|
62
|
+
discover_modules() {
|
|
63
|
+
local root="$1"
|
|
64
|
+
|
|
65
|
+
local exclude_args=()
|
|
66
|
+
for d in "${IMPORTANCE_EXCLUDE_DIRS[@]}"; do
|
|
67
|
+
exclude_args+=(-not -path "*/${d}/*")
|
|
68
|
+
done
|
|
69
|
+
|
|
70
|
+
local find_args=()
|
|
71
|
+
for ext in "${SOURCE_EXTENSIONS[@]}"; do
|
|
72
|
+
find_args+=(-o -name "$ext")
|
|
73
|
+
done
|
|
74
|
+
|
|
75
|
+
# Find all directories that contain 3+ source files (non-recursive per dir)
|
|
76
|
+
while IFS= read -r -d '' dir; do
|
|
77
|
+
local src_count
|
|
78
|
+
# shellcheck disable=SC2068
|
|
79
|
+
src_count=$(find "$dir" -maxdepth 1 -type f \( -false ${find_args[@]} \) 2>/dev/null | wc -l | tr -d ' ')
|
|
80
|
+
if [[ "$src_count" -ge 3 ]]; then
|
|
81
|
+
printf '%s\n' "$dir"
|
|
82
|
+
fi
|
|
83
|
+
done < <(find "$root" -type d "${exclude_args[@]}" -print0 2>/dev/null)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# === Factor 1: Centrality (30%) ===
|
|
87
|
+
# Count how many modules import each module based on inventory JSON edges.
|
|
88
|
+
# Args: INVENTORY_DIR - directory containing .json module inventory files
|
|
89
|
+
# MODULES_LIST - newline-separated list of module paths
|
|
90
|
+
# Output: module_path=<importer_count> per line (for all modules, even those not in inventory)
|
|
91
|
+
compute_centrality() {
|
|
92
|
+
local inventory_dir="$1"
|
|
93
|
+
local modules_list="$2"
|
|
94
|
+
|
|
95
|
+
# If no inventory data, all modules get centrality 0
|
|
96
|
+
if [[ ! -d "$inventory_dir" ]]; then
|
|
97
|
+
while IFS= read -r module; do
|
|
98
|
+
printf '%s=0\n' "$module"
|
|
99
|
+
done <<< "$modules_list"
|
|
100
|
+
return 0
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# Count inventory files; if none, return 0 for all
|
|
104
|
+
local inv_count=0
|
|
105
|
+
for _ in "$inventory_dir"/*.json; do
|
|
106
|
+
[[ -f "$_" ]] || continue
|
|
107
|
+
inv_count=$((inv_count + 1))
|
|
108
|
+
done
|
|
109
|
+
|
|
110
|
+
if [[ "$inv_count" -eq 0 ]]; then
|
|
111
|
+
while IFS= read -r module; do
|
|
112
|
+
printf '%s=0\n' "$module"
|
|
113
|
+
done <<< "$modules_list"
|
|
114
|
+
return 0
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Count importers for each target module from outgoing edges
|
|
118
|
+
local centrality_data=""
|
|
119
|
+
if command -v jq &>/dev/null; then
|
|
120
|
+
# Parse all outgoing edges from inventory files
|
|
121
|
+
for inv_file in "$inventory_dir"/*.json; do
|
|
122
|
+
[[ -f "$inv_file" ]] || continue
|
|
123
|
+
# Extract target_module from outgoing_edges
|
|
124
|
+
local targets
|
|
125
|
+
targets=$(jq -r '(.outgoing_edges // [])[] | .[].target_module // empty' "$inv_file" 2>/dev/null || true)
|
|
126
|
+
if [[ -n "$targets" ]]; then
|
|
127
|
+
centrality_data+="$targets"$'\n'
|
|
128
|
+
fi
|
|
129
|
+
done
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# Count occurrences of each module path as an import target
|
|
133
|
+
while IFS= read -r module; do
|
|
134
|
+
local count=0
|
|
135
|
+
if [[ -n "$centrality_data" ]]; then
|
|
136
|
+
local module_name
|
|
137
|
+
module_name=$(basename "$module")
|
|
138
|
+
# Count how many times this module appears as a target
|
|
139
|
+
count=$(printf '%s' "$centrality_data" | grep -cF "$module_name" 2>/dev/null || echo "0")
|
|
140
|
+
# Also try matching by path
|
|
141
|
+
local by_path
|
|
142
|
+
by_path=$(printf '%s' "$centrality_data" | grep -cF "$module" 2>/dev/null || echo "0")
|
|
143
|
+
if [[ "$by_path" -gt "$count" ]]; then
|
|
144
|
+
count="$by_path"
|
|
145
|
+
fi
|
|
146
|
+
fi
|
|
147
|
+
printf '%s=%s\n' "$module" "$count"
|
|
148
|
+
done <<< "$modules_list"
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# === Factor 2: Size Score (20%) ===
|
|
152
|
+
# log(file_count) / log(max_files) — normalized 0..1
|
|
153
|
+
# Args: MODULES_LIST - newline-separated list of module paths
|
|
154
|
+
# Output: module_path <score> per line (space-separated)
|
|
155
|
+
compute_size_score() {
|
|
156
|
+
local modules_list="$1"
|
|
157
|
+
|
|
158
|
+
local max_files=0
|
|
159
|
+
|
|
160
|
+
# First pass: find max file count
|
|
161
|
+
while IFS= read -r module; do
|
|
162
|
+
[[ -z "$module" ]] && continue
|
|
163
|
+
local src_count
|
|
164
|
+
src_count=$(find "$module" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
165
|
+
if [[ "$src_count" -gt "$max_files" ]]; then
|
|
166
|
+
max_files="$src_count"
|
|
167
|
+
fi
|
|
168
|
+
done <<< "$modules_list"
|
|
169
|
+
|
|
170
|
+
# Second pass: compute log-scaled normalized score
|
|
171
|
+
if [[ "$max_files" -gt 0 ]]; then
|
|
172
|
+
while IFS= read -r module; do
|
|
173
|
+
[[ -z "$module" ]] && continue
|
|
174
|
+
local src_count
|
|
175
|
+
src_count=$(find "$module" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
176
|
+
# Use awk for cross-platform log calculation (avoid bc dependency)
|
|
177
|
+
printf '%s %s\n' "$module" "$(awk "BEGIN { printf \"%.4f\", log($src_count + 1) / log($max_files + 1) }")"
|
|
178
|
+
done <<< "$modules_list"
|
|
179
|
+
else
|
|
180
|
+
# No files found; all modules get neutral score
|
|
181
|
+
while IFS= read -r module; do
|
|
182
|
+
[[ -z "$module" ]] && continue
|
|
183
|
+
printf '%s 0.0\n' "$module"
|
|
184
|
+
done <<< "$modules_list"
|
|
185
|
+
fi
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# === Factor 3: Entry Point (20%) ===
|
|
189
|
+
# Check if module contains entry-point files (router, main, App, etc.)
|
|
190
|
+
# Args: MODULES_LIST - newline-separated list of module paths
|
|
191
|
+
# Output: module_path <0|1> per line (space-separated)
|
|
192
|
+
compute_entry_point() {
|
|
193
|
+
local modules_list="$1"
|
|
194
|
+
|
|
195
|
+
while IFS= read -r module; do
|
|
196
|
+
[[ -z "$module" ]] && continue
|
|
197
|
+
local found=0
|
|
198
|
+
for pattern in $ENTRY_POINT_PATTERNS; do
|
|
199
|
+
# Use find + head (cross-platform) instead of grep -qi
|
|
200
|
+
if find "$module" -maxdepth 1 -type f -iname "*${pattern}*" 2>/dev/null | head -1 | grep -q .; then
|
|
201
|
+
found=1
|
|
202
|
+
break
|
|
203
|
+
fi
|
|
204
|
+
done
|
|
205
|
+
printf '%s %d\n' "$module" "$found"
|
|
206
|
+
done <<< "$modules_list"
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# === Factor 4: Recency (15%) ===
|
|
210
|
+
# Normalize git commit count in last 30 days per module (0..1)
|
|
211
|
+
# Args: PROJECT_ROOT - git repository root
|
|
212
|
+
# MODULES_LIST - newline-separated list of module paths
|
|
213
|
+
# Output: module_path <score> per line (space-separated)
|
|
214
|
+
compute_recency() {
|
|
215
|
+
local root="$1"
|
|
216
|
+
local modules_list="$2"
|
|
217
|
+
|
|
218
|
+
# Not a git repo: all modules get neutral 0.5
|
|
219
|
+
if ! git -C "$root" rev-parse --short &>/dev/null 2>&1; then
|
|
220
|
+
while IFS= read -r module; do
|
|
221
|
+
[[ -z "$module" ]] && continue
|
|
222
|
+
printf '%s 0.5\n' "$module"
|
|
223
|
+
done <<< "$modules_list"
|
|
224
|
+
return 0
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
local max_commits=0
|
|
228
|
+
|
|
229
|
+
# First pass: find max commit count across modules
|
|
230
|
+
while IFS= read -r module; do
|
|
231
|
+
[[ -z "$module" ]] && continue
|
|
232
|
+
local rel_path
|
|
233
|
+
rel_path=$(cd "$root" && git ls-files -- "$module" 2>/dev/null | head -1 || true)
|
|
234
|
+
if [[ -n "$rel_path" ]]; then
|
|
235
|
+
local commit_count
|
|
236
|
+
commit_count=$(cd "$root" && git log --since="30 days ago" --oneline -- "$rel_path" 2>/dev/null | wc -l | tr -d ' ')
|
|
237
|
+
if [[ "$commit_count" -gt "$max_commits" ]]; then
|
|
238
|
+
max_commits="$commit_count"
|
|
239
|
+
fi
|
|
240
|
+
fi
|
|
241
|
+
done <<< "$modules_list"
|
|
242
|
+
|
|
243
|
+
# Second pass: compute normalized recency
|
|
244
|
+
if [[ "$max_commits" -gt 0 ]]; then
|
|
245
|
+
while IFS= read -r module; do
|
|
246
|
+
[[ -z "$module" ]] && continue
|
|
247
|
+
local rel_path
|
|
248
|
+
rel_path=$(cd "$root" && git ls-files -- "$module" 2>/dev/null | head -1 || true)
|
|
249
|
+
if [[ -n "$rel_path" ]]; then
|
|
250
|
+
local commit_count
|
|
251
|
+
commit_count=$(cd "$root" && git log --since="30 days ago" --oneline -- "$rel_path" 2>/dev/null | wc -l | tr -d ' ')
|
|
252
|
+
printf '%s %s\n' "$module" "$(awk "BEGIN { printf \"%.4f\", $commit_count / $max_commits }")"
|
|
253
|
+
else
|
|
254
|
+
printf '%s 0.0\n' "$module"
|
|
255
|
+
fi
|
|
256
|
+
done <<< "$modules_list"
|
|
257
|
+
else
|
|
258
|
+
# No git history in last 30 days; all modules get neutral score
|
|
259
|
+
while IFS= read -r module; do
|
|
260
|
+
[[ -z "$module" ]] && continue
|
|
261
|
+
printf '%s 0.5\n' "$module"
|
|
262
|
+
done <<< "$modules_list"
|
|
263
|
+
fi
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
# === Factor 5: Business Critical (15%) ===
|
|
267
|
+
# Check if module path contains business-critical keywords
|
|
268
|
+
# Args: MODULES_LIST - newline-separated list of module paths
|
|
269
|
+
# Output: module_path <0|1> per line (space-separated)
|
|
270
|
+
compute_business_critical() {
|
|
271
|
+
local modules_list="$1"
|
|
272
|
+
|
|
273
|
+
while IFS= read -r module; do
|
|
274
|
+
[[ -z "$module" ]] && continue
|
|
275
|
+
local found=0
|
|
276
|
+
# Convert pipe-separated keywords to newline-separated for iteration
|
|
277
|
+
# Use grep -iE for cross-platform case-insensitive extended regex
|
|
278
|
+
if printf '%s' "$BUSINESS_KEYWORDS" | tr '|' '\n' | while IFS= read -r keyword; do
|
|
279
|
+
# Use case-insensitive match via shell [[ ]] (cross-platform)
|
|
280
|
+
shopt -s nocasematch 2>/dev/null || true
|
|
281
|
+
if [[ "$module" == *"$keyword"* ]]; then
|
|
282
|
+
echo "match"
|
|
283
|
+
break
|
|
284
|
+
fi
|
|
285
|
+
shopt -u nocasematch 2>/dev/null || true
|
|
286
|
+
done | grep -q "match"; then
|
|
287
|
+
found=1
|
|
288
|
+
fi
|
|
289
|
+
printf '%s %d\n' "$module" "$found"
|
|
290
|
+
done <<< "$modules_list"
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
# === Factor 6: Layer Core (10%) ===
|
|
294
|
+
# Check if module is in a core business layer (service, domain, application).
|
|
295
|
+
# Uses directory name and architectural layer detection.
|
|
296
|
+
# Args: MODULES_LIST - newline-separated list of module paths
|
|
297
|
+
# Output: module_path <0|1> per line (space-separated)
|
|
298
|
+
compute_layer_core() {
|
|
299
|
+
local modules_list="$1"
|
|
300
|
+
local core_patterns="service|domain|usecase|application|business|core|logic|facade|manager"
|
|
301
|
+
|
|
302
|
+
while IFS= read -r module; do
|
|
303
|
+
[[ -z "$module" ]] && continue
|
|
304
|
+
local found=0
|
|
305
|
+
local basename
|
|
306
|
+
basename=$(basename "$module")
|
|
307
|
+
# Check if module directory name matches core layer patterns
|
|
308
|
+
if printf '%s' "$core_patterns" | tr '|' '\n' | while IFS= read -r keyword; do
|
|
309
|
+
shopt -s nocasematch 2>/dev/null || true
|
|
310
|
+
if [[ "$basename" == *"$keyword"* ]]; then
|
|
311
|
+
echo "match"
|
|
312
|
+
break
|
|
313
|
+
fi
|
|
314
|
+
shopt -u nocasematch 2>/dev/null || true
|
|
315
|
+
done | grep -q "match"; then
|
|
316
|
+
found=1
|
|
317
|
+
fi
|
|
318
|
+
printf '%s %d\n' "$module" "$found"
|
|
319
|
+
done <<< "$modules_list"
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
# === Factor 7: API Surface (10%) ===
|
|
323
|
+
# Count API endpoints exposed by module (normalized).
|
|
324
|
+
# Checks for API-related files: controllers, routes, handlers, endpoints.
|
|
325
|
+
# Args: MODULES_LIST - newline-separated list of module paths
|
|
326
|
+
# INVENTORY_DIR - optional path to inventory JSON (for accurate count)
|
|
327
|
+
# Output: module_path <score> per line (space-separated), normalized 0..1
|
|
328
|
+
compute_api_surface() {
|
|
329
|
+
local modules_list="$1"
|
|
330
|
+
local inventory_dir="${2:-}"
|
|
331
|
+
|
|
332
|
+
local max_endpoints=0
|
|
333
|
+
local -A module_api_counts 2>/dev/null || true # May not work in older bash
|
|
334
|
+
|
|
335
|
+
# First pass: count API endpoints per module
|
|
336
|
+
local tmpfile
|
|
337
|
+
tmpfile=$(mktemp "${TMPDIR:-/tmp}/atool-api-surface.XXXXXX")
|
|
338
|
+
|
|
339
|
+
while IFS= read -r module; do
|
|
340
|
+
[[ -z "$module" ]] && continue
|
|
341
|
+
local count=0
|
|
342
|
+
|
|
343
|
+
# Try inventory JSON first for accurate count
|
|
344
|
+
if [[ -n "$inventory_dir" && -d "$inventory_dir" ]] && command -v jq &>/dev/null; then
|
|
345
|
+
local module_slug
|
|
346
|
+
module_slug=$(echo "$module" | tr '/' '-' | sed 's/^-//')
|
|
347
|
+
local inv_file="$inventory_dir/${module_slug}.json"
|
|
348
|
+
if [[ -f "$inv_file" ]]; then
|
|
349
|
+
count=$(jq '[.files[] | select(.type == "api_endpoint" or .type == "route")] | length' "$inv_file" 2>/dev/null || echo "0")
|
|
350
|
+
fi
|
|
351
|
+
fi
|
|
352
|
+
|
|
353
|
+
# Fallback: heuristic file counting
|
|
354
|
+
if [[ "$count" -eq 0 ]]; then
|
|
355
|
+
# Count files with API-related names
|
|
356
|
+
count=$(find "$module" -maxdepth 1 -type f \( -iname "*controller*" -o -iname "*handler*" -o -iname "*route*" -o -iname "*endpoint*" -o -iname "*api*" \) 2>/dev/null | wc -l | tr -d ' ')
|
|
357
|
+
# Also count @RequestMapping/@GetMapping/etc in Java files
|
|
358
|
+
local java_count=0
|
|
359
|
+
java_count=$(find "$module" -maxdepth 1 -name "*.java" -exec grep -l "@.*Mapping\|@Controller\|@RestController" {} \; 2>/dev/null | wc -l | tr -d ' ')
|
|
360
|
+
count=$((count + java_count))
|
|
361
|
+
fi
|
|
362
|
+
|
|
363
|
+
printf '%s %d\n' "$module" "$count" >> "$tmpfile"
|
|
364
|
+
if [[ "$count" -gt "$max_endpoints" ]]; then
|
|
365
|
+
max_endpoints="$count"
|
|
366
|
+
fi
|
|
367
|
+
done <<< "$modules_list"
|
|
368
|
+
|
|
369
|
+
# Second pass: normalize
|
|
370
|
+
while IFS=' ' read -r module count; do
|
|
371
|
+
[[ -z "$module" ]] && continue
|
|
372
|
+
if [[ "$max_endpoints" -gt 0 ]]; then
|
|
373
|
+
printf '%s %s\n' "$module" "$(awk "BEGIN { printf \"%.4f\", $count / $max_endpoints }")"
|
|
374
|
+
else
|
|
375
|
+
printf '%s 0.0\n' "$module"
|
|
376
|
+
fi
|
|
377
|
+
done < "$tmpfile"
|
|
378
|
+
|
|
379
|
+
rm -f "$tmpfile"
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
# === Factor 8: Data Ownership (5%) ===
|
|
383
|
+
# Count data entities owned by module (normalized).
|
|
384
|
+
# Checks for entity/model/schema/type definitions.
|
|
385
|
+
# Args: MODULES_LIST - newline-separated list of module paths
|
|
386
|
+
# INVENTORY_DIR - optional path to inventory JSON
|
|
387
|
+
# Output: module_path <score> per line (space-separated), normalized 0..1
|
|
388
|
+
compute_data_ownership() {
|
|
389
|
+
local modules_list="$1"
|
|
390
|
+
local inventory_dir="${2:-}"
|
|
391
|
+
|
|
392
|
+
local max_entities=0
|
|
393
|
+
local tmpfile
|
|
394
|
+
tmpfile=$(mktemp "${TMPDIR:-/tmp}/atool-data-own.XXXXXX")
|
|
395
|
+
|
|
396
|
+
while IFS= read -r module; do
|
|
397
|
+
[[ -z "$module" ]] && continue
|
|
398
|
+
local count=0
|
|
399
|
+
|
|
400
|
+
# Try inventory JSON first
|
|
401
|
+
if [[ -n "$inventory_dir" && -d "$inventory_dir" ]] && command -v jq &>/dev/null; then
|
|
402
|
+
local module_slug
|
|
403
|
+
module_slug=$(echo "$module" | tr '/' '-' | sed 's/^-//')
|
|
404
|
+
local inv_file="$inventory_dir/${module_slug}.json"
|
|
405
|
+
if [[ -f "$inv_file" ]]; then
|
|
406
|
+
count=$(jq '[.files[] | select(.type == "data_entity" or .type == "store")] | length' "$inv_file" 2>/dev/null || echo "0")
|
|
407
|
+
fi
|
|
408
|
+
fi
|
|
409
|
+
|
|
410
|
+
# Fallback: heuristic counting
|
|
411
|
+
if [[ "$count" -eq 0 ]]; then
|
|
412
|
+
count=$(find "$module" -maxdepth 1 -type f \( -iname "*entity*" -o -iname "*model*" -o -iname "*schema*" -o -iname "*type*" -o -iname "*dto*" -o -iname "*vo*" \) 2>/dev/null | wc -l | tr -d ' ')
|
|
413
|
+
fi
|
|
414
|
+
|
|
415
|
+
printf '%s %d\n' "$module" "$count" >> "$tmpfile"
|
|
416
|
+
if [[ "$count" -gt "$max_entities" ]]; then
|
|
417
|
+
max_entities="$count"
|
|
418
|
+
fi
|
|
419
|
+
done <<< "$modules_list"
|
|
420
|
+
|
|
421
|
+
while IFS=' ' read -r module count; do
|
|
422
|
+
[[ -z "$module" ]] && continue
|
|
423
|
+
if [[ "$max_entities" -gt 0 ]]; then
|
|
424
|
+
printf '%s %s\n' "$module" "$(awk "BEGIN { printf \"%.4f\", $count / $max_entities }")"
|
|
425
|
+
else
|
|
426
|
+
printf '%s 0.0\n' "$module"
|
|
427
|
+
fi
|
|
428
|
+
done < "$tmpfile"
|
|
429
|
+
|
|
430
|
+
rm -f "$tmpfile"
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
# === Tier Classification ===
|
|
434
|
+
# Map a composite score to a tier label.
|
|
435
|
+
# Args: SCORE - composite importance score (0..1)
|
|
436
|
+
# Output: tier label (deep, catalog, or skip)
|
|
437
|
+
classify_tier() {
|
|
438
|
+
local score="$1"
|
|
439
|
+
# Use awk for cross-platform float comparison
|
|
440
|
+
local tier
|
|
441
|
+
tier=$(awk "BEGIN {
|
|
442
|
+
if ($score >= 0.6) print \"deep\"
|
|
443
|
+
else if ($score >= 0.3) print \"catalog\"
|
|
444
|
+
else print \"skip\"
|
|
445
|
+
}")
|
|
446
|
+
printf '%s' "$tier"
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
# === Normalize Centrality ===
|
|
450
|
+
# Normalize raw importer counts to 0..1 range
|
|
451
|
+
# Args: CENTRALITY_RAW - module=count lines
|
|
452
|
+
# Output: module=<normalized_score> lines
|
|
453
|
+
_normalize_centrality() {
|
|
454
|
+
local raw_data="$1"
|
|
455
|
+
|
|
456
|
+
local max_count=0
|
|
457
|
+
while IFS='=' read -r mod value; do
|
|
458
|
+
[[ -z "$mod" ]] && continue
|
|
459
|
+
if [[ "$value" -gt "$max_count" ]] 2>/dev/null; then
|
|
460
|
+
max_count="$value"
|
|
461
|
+
fi
|
|
462
|
+
done <<< "$raw_data"
|
|
463
|
+
|
|
464
|
+
while IFS='=' read -r mod value; do
|
|
465
|
+
[[ -z "$mod" ]] && continue
|
|
466
|
+
if [[ "$max_count" -gt 0 ]]; then
|
|
467
|
+
printf '%s=%s\n' "$mod" "$(awk "BEGIN { printf \"%.4f\", $value / $max_count }")"
|
|
468
|
+
else
|
|
469
|
+
printf '%s=0.0\n' "$mod"
|
|
470
|
+
fi
|
|
471
|
+
done <<< "$raw_data"
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
# === Main Entry Point ===
|
|
475
|
+
# Compute composite importance scores for all discovered modules.
|
|
476
|
+
# Args: PROJECT_ROOT - project root directory
|
|
477
|
+
# [--inventory-dir PATH] - optional path to inventory JSON files
|
|
478
|
+
# Output: tab-separated: module_path<tab>importance_score<tab>tier
|
|
479
|
+
compute_importance() {
|
|
480
|
+
local root="${1:-.}"
|
|
481
|
+
local inventory_dir="${root}/.atool-docs/inventory"
|
|
482
|
+
|
|
483
|
+
# Parse optional arguments
|
|
484
|
+
local shift_count=1
|
|
485
|
+
while [[ $# -gt 0 ]]; do
|
|
486
|
+
case "$1" in
|
|
487
|
+
--inventory-dir)
|
|
488
|
+
inventory_dir="$2"
|
|
489
|
+
shift 2
|
|
490
|
+
;;
|
|
491
|
+
*)
|
|
492
|
+
shift
|
|
493
|
+
;;
|
|
494
|
+
esac
|
|
495
|
+
done
|
|
496
|
+
|
|
497
|
+
if [[ ! -d "$root" ]]; then
|
|
498
|
+
log_error "Project root '$root' does not exist"
|
|
499
|
+
return 1
|
|
500
|
+
fi
|
|
501
|
+
|
|
502
|
+
log_info "Discovering modules in $root"
|
|
503
|
+
local modules
|
|
504
|
+
modules=$(discover_modules "$root")
|
|
505
|
+
|
|
506
|
+
if [[ -z "$modules" ]]; then
|
|
507
|
+
log_warn "No modules found in $root"
|
|
508
|
+
return 0
|
|
509
|
+
fi
|
|
510
|
+
|
|
511
|
+
local module_count
|
|
512
|
+
module_count=$(printf '%s' "$modules" | grep -c . || true)
|
|
513
|
+
log_info "Found $module_count modules"
|
|
514
|
+
|
|
515
|
+
# Compute all eight factors
|
|
516
|
+
log_info "Computing centrality..."
|
|
517
|
+
local centrality_raw
|
|
518
|
+
centrality_raw=$(compute_centrality "$inventory_dir" "$modules")
|
|
519
|
+
local centrality
|
|
520
|
+
centrality=$(_normalize_centrality "$centrality_raw")
|
|
521
|
+
|
|
522
|
+
log_info "Computing size scores..."
|
|
523
|
+
local size_scores
|
|
524
|
+
size_scores=$(compute_size_score "$modules")
|
|
525
|
+
|
|
526
|
+
log_info "Computing entry points..."
|
|
527
|
+
local entry_points
|
|
528
|
+
entry_points=$(compute_entry_point "$modules")
|
|
529
|
+
|
|
530
|
+
log_info "Computing recency..."
|
|
531
|
+
local recency
|
|
532
|
+
recency=$(compute_recency "$root" "$modules")
|
|
533
|
+
|
|
534
|
+
log_info "Computing business criticality..."
|
|
535
|
+
local business_critical
|
|
536
|
+
business_critical=$(compute_business_critical "$modules")
|
|
537
|
+
|
|
538
|
+
log_info "Computing layer core..."
|
|
539
|
+
local layer_core
|
|
540
|
+
layer_core=$(compute_layer_core "$modules")
|
|
541
|
+
|
|
542
|
+
log_info "Computing API surface..."
|
|
543
|
+
local api_surface
|
|
544
|
+
api_surface=$(compute_api_surface "$modules" "$inventory_dir")
|
|
545
|
+
|
|
546
|
+
log_info "Computing data ownership..."
|
|
547
|
+
local data_ownership
|
|
548
|
+
data_ownership=$(compute_data_ownership "$modules" "$inventory_dir")
|
|
549
|
+
|
|
550
|
+
# Build associative maps from factor outputs
|
|
551
|
+
# Using temporary files for portability (avoid bash 4+ associative arrays in pipe subshells)
|
|
552
|
+
local tmpdir
|
|
553
|
+
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/atool-importance.XXXXXX")
|
|
554
|
+
|
|
555
|
+
# Parse each factor into temp files: module<TAB>value
|
|
556
|
+
printf '%s\n' "$centrality" | sed 's/=/\t/' > "$tmpdir/centrality"
|
|
557
|
+
printf '%s\n' "$size_scores" | sed 's/ /\t/' > "$tmpdir/size"
|
|
558
|
+
printf '%s\n' "$entry_points" | sed 's/ /\t/' > "$tmpdir/entry"
|
|
559
|
+
printf '%s\n' "$recency" | sed 's/ /\t/' > "$tmpdir/recency"
|
|
560
|
+
printf '%s\n' "$business_critical" | sed 's/ /\t/' > "$tmpdir/business"
|
|
561
|
+
printf '%s\n' "$layer_core" | sed 's/ /\t/' > "$tmpdir/layer_core"
|
|
562
|
+
printf '%s\n' "$api_surface" | sed 's/ /\t/' > "$tmpdir/api_surface"
|
|
563
|
+
printf '%s\n' "$data_ownership" | sed 's/ /\t/' > "$tmpdir/data_ownership"
|
|
564
|
+
|
|
565
|
+
# Join all factors by module path and compute composite score
|
|
566
|
+
while IFS= read -r module; do
|
|
567
|
+
[[ -z "$module" ]] && continue
|
|
568
|
+
|
|
569
|
+
# Look up each factor value for this module
|
|
570
|
+
local c s e r b l a d
|
|
571
|
+
c=$(grep -F "$module" "$tmpdir/centrality" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
572
|
+
s=$(grep -F "$module" "$tmpdir/size" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
573
|
+
e=$(grep -F "$module" "$tmpdir/entry" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
574
|
+
r=$(grep -F "$module" "$tmpdir/recency" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
575
|
+
b=$(grep -F "$module" "$tmpdir/business" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
576
|
+
l=$(grep -F "$module" "$tmpdir/layer_core" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
577
|
+
a=$(grep -F "$module" "$tmpdir/api_surface" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
578
|
+
d=$(grep -F "$module" "$tmpdir/data_ownership" 2>/dev/null | head -1 | cut -f2 || echo "0")
|
|
579
|
+
|
|
580
|
+
# Weighted composite: 20% centrality + 15% size + 15% entry + 15% business + 10% recency + 10% layer + 10% API + 5% data
|
|
581
|
+
local score
|
|
582
|
+
score=$(awk "BEGIN { printf \"%.4f\", 0.20 * ${c:-0} + 0.15 * ${s:-0} + 0.15 * ${e:-0} + 0.15 * ${b:-0} + 0.10 * ${r:-0} + 0.10 * ${l:-0} + 0.10 * ${a:-0} + 0.05 * ${d:-0} }")
|
|
583
|
+
|
|
584
|
+
local tier
|
|
585
|
+
tier=$(classify_tier "$score")
|
|
586
|
+
|
|
587
|
+
printf '%s\t%s\t%s\n' "$module" "$score" "$tier"
|
|
588
|
+
done <<< "$modules" | sort -t' ' -k2,2nr
|
|
589
|
+
|
|
590
|
+
# Cleanup temp directory
|
|
591
|
+
rm -rf "$tmpdir"
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
# === Standalone Execution ===
|
|
595
|
+
# When run directly (not sourced), execute compute_importance with CLI args
|
|
596
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
597
|
+
compute_importance "$@"
|
|
598
|
+
fi
|