@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.
Files changed (463) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/VERSION +1 -0
  4. package/agents/code-reviewer.md +29 -0
  5. package/bin/atool.js +235 -0
  6. package/bin/postinstall.js +23 -0
  7. package/hooks/doc-sync-reminder +155 -0
  8. package/hooks/hooks-cursor.json +37 -0
  9. package/hooks/hooks.json +37 -0
  10. package/hooks/prompt-guard +135 -0
  11. package/hooks/session-start +286 -0
  12. package/install.sh +603 -0
  13. package/lib/analyze-source.sh +1265 -0
  14. package/lib/common.sh +1041 -0
  15. package/lib/compute-importance.sh +598 -0
  16. package/lib/detect-stack.sh +354 -0
  17. package/lib/generate-visualization.sh +266 -0
  18. package/lib/install-claude.sh +43 -0
  19. package/lib/install-cursor.sh +281 -0
  20. package/lib/install-hooks.sh +285 -0
  21. package/lib/install-kiro.sh +543 -0
  22. package/lib/install-mcp.sh +99 -0
  23. package/lib/install-skills.sh +129 -0
  24. package/lib/knowledge-graph.sh +1014 -0
  25. package/lib/multi-dimensional-analysis.sh +413 -0
  26. package/lib/pre-scan.sh +1045 -0
  27. package/lib/project-init.sh +552 -0
  28. package/lib/visualization-template.html +545 -0
  29. package/mcp/recommended.json +24 -0
  30. package/package.json +39 -0
  31. package/skills/_superpowers/.claude-plugin/marketplace.json +20 -0
  32. package/skills/_superpowers/.claude-plugin/plugin.json +20 -0
  33. package/skills/_superpowers/.codex/INSTALL.md +67 -0
  34. package/skills/_superpowers/.cursor-plugin/plugin.json +25 -0
  35. package/skills/_superpowers/.gitattributes +18 -0
  36. package/skills/_superpowers/.github/FUNDING.yml +3 -0
  37. package/skills/_superpowers/.github/ISSUE_TEMPLATE/bug_report.md +52 -0
  38. package/skills/_superpowers/.github/ISSUE_TEMPLATE/config.yml +5 -0
  39. package/skills/_superpowers/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
  40. package/skills/_superpowers/.github/ISSUE_TEMPLATE/platform_support.md +23 -0
  41. package/skills/_superpowers/.github/PULL_REQUEST_TEMPLATE.md +87 -0
  42. package/skills/_superpowers/.opencode/INSTALL.md +83 -0
  43. package/skills/_superpowers/.opencode/plugins/superpowers.js +107 -0
  44. package/skills/_superpowers/CHANGELOG.md +13 -0
  45. package/skills/_superpowers/CODE_OF_CONDUCT.md +128 -0
  46. package/skills/_superpowers/GEMINI.md +2 -0
  47. package/skills/_superpowers/LICENSE +21 -0
  48. package/skills/_superpowers/README.md +187 -0
  49. package/skills/_superpowers/RELEASE-NOTES.md +1083 -0
  50. package/skills/_superpowers/agents/code-reviewer.md +48 -0
  51. package/skills/_superpowers/commands/brainstorm.md +5 -0
  52. package/skills/_superpowers/commands/execute-plan.md +5 -0
  53. package/skills/_superpowers/commands/write-plan.md +5 -0
  54. package/skills/_superpowers/docs/README.codex.md +126 -0
  55. package/skills/_superpowers/docs/README.opencode.md +130 -0
  56. package/skills/_superpowers/docs/plans/2025-11-22-opencode-support-design.md +294 -0
  57. package/skills/_superpowers/docs/plans/2025-11-22-opencode-support-implementation.md +1095 -0
  58. package/skills/_superpowers/docs/plans/2025-11-28-skills-improvements-from-user-feedback.md +711 -0
  59. package/skills/_superpowers/docs/plans/2026-01-17-visual-brainstorming.md +571 -0
  60. package/skills/_superpowers/docs/superpowers/plans/2026-01-22-document-review-system.md +301 -0
  61. package/skills/_superpowers/docs/superpowers/plans/2026-02-19-visual-brainstorming-refactor.md +523 -0
  62. package/skills/_superpowers/docs/superpowers/plans/2026-03-11-zero-dep-brainstorm-server.md +479 -0
  63. package/skills/_superpowers/docs/superpowers/plans/2026-03-23-codex-app-compatibility.md +564 -0
  64. package/skills/_superpowers/docs/superpowers/specs/2026-01-22-document-review-system-design.md +136 -0
  65. package/skills/_superpowers/docs/superpowers/specs/2026-02-19-visual-brainstorming-refactor-design.md +162 -0
  66. package/skills/_superpowers/docs/superpowers/specs/2026-03-11-zero-dep-brainstorm-server-design.md +118 -0
  67. package/skills/_superpowers/docs/superpowers/specs/2026-03-23-codex-app-compatibility-design.md +244 -0
  68. package/skills/_superpowers/docs/testing.md +303 -0
  69. package/skills/_superpowers/docs/windows/polyglot-hooks.md +212 -0
  70. package/skills/_superpowers/gemini-extension.json +6 -0
  71. package/skills/_superpowers/hooks/hooks-cursor.json +10 -0
  72. package/skills/_superpowers/hooks/hooks.json +16 -0
  73. package/skills/_superpowers/hooks/run-hook.cmd +46 -0
  74. package/skills/_superpowers/hooks/session-start +57 -0
  75. package/skills/_superpowers/package.json +6 -0
  76. package/skills/_superpowers/skills/brainstorming/SKILL.md +164 -0
  77. package/skills/_superpowers/skills/brainstorming/scripts/frame-template.html +214 -0
  78. package/skills/_superpowers/skills/brainstorming/scripts/helper.js +88 -0
  79. package/skills/_superpowers/skills/brainstorming/scripts/server.cjs +354 -0
  80. package/skills/_superpowers/skills/brainstorming/scripts/start-server.sh +148 -0
  81. package/skills/_superpowers/skills/brainstorming/scripts/stop-server.sh +56 -0
  82. package/skills/_superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  83. package/skills/_superpowers/skills/brainstorming/visual-companion.md +287 -0
  84. package/skills/_superpowers/skills/dispatching-parallel-agents/SKILL.md +182 -0
  85. package/skills/_superpowers/skills/executing-plans/SKILL.md +70 -0
  86. package/skills/_superpowers/skills/finishing-a-development-branch/SKILL.md +200 -0
  87. package/skills/_superpowers/skills/receiving-code-review/SKILL.md +213 -0
  88. package/skills/_superpowers/skills/requesting-code-review/SKILL.md +105 -0
  89. package/skills/_superpowers/skills/requesting-code-review/code-reviewer.md +146 -0
  90. package/skills/_superpowers/skills/subagent-driven-development/SKILL.md +277 -0
  91. package/skills/_superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  92. package/skills/_superpowers/skills/subagent-driven-development/implementer-prompt.md +113 -0
  93. package/skills/_superpowers/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  94. package/skills/_superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -0
  95. package/skills/_superpowers/skills/systematic-debugging/SKILL.md +296 -0
  96. package/skills/_superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  97. package/skills/_superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -0
  98. package/skills/_superpowers/skills/systematic-debugging/defense-in-depth.md +122 -0
  99. package/skills/_superpowers/skills/systematic-debugging/find-polluter.sh +63 -0
  100. package/skills/_superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -0
  101. package/skills/_superpowers/skills/systematic-debugging/test-academic.md +14 -0
  102. package/skills/_superpowers/skills/systematic-debugging/test-pressure-1.md +58 -0
  103. package/skills/_superpowers/skills/systematic-debugging/test-pressure-2.md +68 -0
  104. package/skills/_superpowers/skills/systematic-debugging/test-pressure-3.md +69 -0
  105. package/skills/_superpowers/skills/test-driven-development/SKILL.md +371 -0
  106. package/skills/_superpowers/skills/test-driven-development/testing-anti-patterns.md +299 -0
  107. package/skills/_superpowers/skills/using-git-worktrees/SKILL.md +218 -0
  108. package/skills/_superpowers/skills/using-superpowers/SKILL.md +115 -0
  109. package/skills/_superpowers/skills/using-superpowers/references/codex-tools.md +100 -0
  110. package/skills/_superpowers/skills/using-superpowers/references/gemini-tools.md +33 -0
  111. package/skills/_superpowers/skills/verification-before-completion/SKILL.md +139 -0
  112. package/skills/_superpowers/skills/writing-plans/SKILL.md +152 -0
  113. package/skills/_superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  114. package/skills/_superpowers/skills/writing-skills/SKILL.md +655 -0
  115. package/skills/_superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -0
  116. package/skills/_superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  117. package/skills/_superpowers/skills/writing-skills/graphviz-conventions.dot +172 -0
  118. package/skills/_superpowers/skills/writing-skills/persuasion-principles.md +187 -0
  119. package/skills/_superpowers/skills/writing-skills/render-graphs.js +168 -0
  120. package/skills/_superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  121. package/skills/_superpowers/tests/brainstorm-server/package-lock.json +36 -0
  122. package/skills/_superpowers/tests/brainstorm-server/package.json +10 -0
  123. package/skills/_superpowers/tests/brainstorm-server/server.test.js +427 -0
  124. package/skills/_superpowers/tests/brainstorm-server/windows-lifecycle.test.sh +351 -0
  125. package/skills/_superpowers/tests/brainstorm-server/ws-protocol.test.js +392 -0
  126. package/skills/_superpowers/tests/claude-code/README.md +158 -0
  127. package/skills/_superpowers/tests/claude-code/analyze-token-usage.py +168 -0
  128. package/skills/_superpowers/tests/claude-code/run-skill-tests.sh +187 -0
  129. package/skills/_superpowers/tests/claude-code/test-document-review-system.sh +177 -0
  130. package/skills/_superpowers/tests/claude-code/test-helpers.sh +202 -0
  131. package/skills/_superpowers/tests/claude-code/test-subagent-driven-development-integration.sh +314 -0
  132. package/skills/_superpowers/tests/claude-code/test-subagent-driven-development.sh +165 -0
  133. package/skills/_superpowers/tests/explicit-skill-requests/prompts/action-oriented.txt +3 -0
  134. package/skills/_superpowers/tests/explicit-skill-requests/prompts/after-planning-flow.txt +17 -0
  135. package/skills/_superpowers/tests/explicit-skill-requests/prompts/claude-suggested-it.txt +11 -0
  136. package/skills/_superpowers/tests/explicit-skill-requests/prompts/i-know-what-sdd-means.txt +8 -0
  137. package/skills/_superpowers/tests/explicit-skill-requests/prompts/mid-conversation-execute-plan.txt +3 -0
  138. package/skills/_superpowers/tests/explicit-skill-requests/prompts/please-use-brainstorming.txt +1 -0
  139. package/skills/_superpowers/tests/explicit-skill-requests/prompts/skip-formalities.txt +3 -0
  140. package/skills/_superpowers/tests/explicit-skill-requests/prompts/subagent-driven-development-please.txt +1 -0
  141. package/skills/_superpowers/tests/explicit-skill-requests/prompts/use-systematic-debugging.txt +1 -0
  142. package/skills/_superpowers/tests/explicit-skill-requests/run-all.sh +70 -0
  143. package/skills/_superpowers/tests/explicit-skill-requests/run-claude-describes-sdd.sh +100 -0
  144. package/skills/_superpowers/tests/explicit-skill-requests/run-extended-multiturn-test.sh +113 -0
  145. package/skills/_superpowers/tests/explicit-skill-requests/run-haiku-test.sh +144 -0
  146. package/skills/_superpowers/tests/explicit-skill-requests/run-multiturn-test.sh +143 -0
  147. package/skills/_superpowers/tests/explicit-skill-requests/run-test.sh +136 -0
  148. package/skills/_superpowers/tests/opencode/run-tests.sh +163 -0
  149. package/skills/_superpowers/tests/opencode/setup.sh +73 -0
  150. package/skills/_superpowers/tests/opencode/test-plugin-loading.sh +72 -0
  151. package/skills/_superpowers/tests/opencode/test-priority.sh +198 -0
  152. package/skills/_superpowers/tests/opencode/test-tools.sh +104 -0
  153. package/skills/_superpowers/tests/skill-triggering/prompts/dispatching-parallel-agents.txt +8 -0
  154. package/skills/_superpowers/tests/skill-triggering/prompts/executing-plans.txt +1 -0
  155. package/skills/_superpowers/tests/skill-triggering/prompts/requesting-code-review.txt +3 -0
  156. package/skills/_superpowers/tests/skill-triggering/prompts/systematic-debugging.txt +11 -0
  157. package/skills/_superpowers/tests/skill-triggering/prompts/test-driven-development.txt +7 -0
  158. package/skills/_superpowers/tests/skill-triggering/prompts/writing-plans.txt +10 -0
  159. package/skills/_superpowers/tests/skill-triggering/run-all.sh +60 -0
  160. package/skills/_superpowers/tests/skill-triggering/run-test.sh +88 -0
  161. package/skills/_superpowers/tests/subagent-driven-dev/go-fractals/design.md +81 -0
  162. package/skills/_superpowers/tests/subagent-driven-dev/go-fractals/plan.md +172 -0
  163. package/skills/_superpowers/tests/subagent-driven-dev/go-fractals/scaffold.sh +45 -0
  164. package/skills/_superpowers/tests/subagent-driven-dev/run-test.sh +106 -0
  165. package/skills/_superpowers/tests/subagent-driven-dev/svelte-todo/design.md +70 -0
  166. package/skills/_superpowers/tests/subagent-driven-dev/svelte-todo/plan.md +222 -0
  167. package/skills/_superpowers/tests/subagent-driven-dev/svelte-todo/scaffold.sh +46 -0
  168. package/skills/ai-project-architecture/SKILL.md +632 -0
  169. package/skills/ai-project-architecture/reference/structure-rules.md +406 -0
  170. package/skills/ai-project-architecture/templates/compliance-report.md +300 -0
  171. package/skills/ai-project-architecture/templates/migration-plan.md +433 -0
  172. package/skills/ai-project-architecture/templates/verification-checklist.md +408 -0
  173. package/skills/android-conventions/SKILL.md +125 -0
  174. package/skills/atool-init/SKILL.md +141 -0
  175. package/skills/clarify-before-build/SKILL.md +107 -0
  176. package/skills/code-review/SKILL.md +406 -0
  177. package/skills/code-review/rules/architecture.md +285 -0
  178. package/skills/code-review/rules/coupling-cohesion.md +309 -0
  179. package/skills/code-review/rules/dead-code.md +115 -0
  180. package/skills/code-review/rules/deprecation-debt.md +279 -0
  181. package/skills/code-review/rules/duplication.md +104 -0
  182. package/skills/code-review/rules/error-security.md +143 -0
  183. package/skills/code-review/rules/maintainability.md +203 -0
  184. package/skills/code-review/rules/quality.md +158 -0
  185. package/skills/devops-conventions/SKILL.md +205 -0
  186. package/skills/doc-coauthoring/SKILL.md +392 -0
  187. package/skills/doc-standards-enforcer/SKILL.md +290 -0
  188. package/skills/doc-standards-enforcer/examples/valid-document-example.md +67 -0
  189. package/skills/doc-standards-enforcer/references/101-standards-summary.md +318 -0
  190. package/skills/doc-standards-enforcer/scripts/check_references.py +175 -0
  191. package/skills/doc-standards-enforcer/scripts/fix_common_issues.py +303 -0
  192. package/skills/doc-standards-enforcer/scripts/validate_doc_standards.py +332 -0
  193. package/skills/docx/LICENSE.txt +30 -0
  194. package/skills/docx/SKILL.md +200 -0
  195. package/skills/docx/docx-js.md +350 -0
  196. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  197. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  198. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  199. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  200. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  201. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  202. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  203. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  204. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  205. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  206. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  207. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  208. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  209. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  210. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  211. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  212. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  213. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  214. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  215. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  216. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  217. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  218. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  219. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  220. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  221. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  222. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  223. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  224. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  225. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  226. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  227. package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  228. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  229. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  230. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  231. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  232. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  233. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  234. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  235. package/skills/docx/ooxml/scripts/pack.py +159 -0
  236. package/skills/docx/ooxml/scripts/unpack.py +29 -0
  237. package/skills/docx/ooxml/scripts/validate.py +69 -0
  238. package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  239. package/skills/docx/ooxml/scripts/validation/base.py +951 -0
  240. package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  241. package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  242. package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  243. package/skills/docx/ooxml.md +610 -0
  244. package/skills/docx/scripts/__init__.py +1 -0
  245. package/skills/docx/scripts/document.py +1276 -0
  246. package/skills/docx/scripts/templates/comments.xml +3 -0
  247. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  248. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  249. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  250. package/skills/docx/scripts/templates/people.xml +3 -0
  251. package/skills/docx/scripts/utilities.py +374 -0
  252. package/skills/flutter-conventions/SKILL.md +70 -0
  253. package/skills/go-conventions/SKILL.md +230 -0
  254. package/skills/harmony-conventions/SKILL.md +156 -0
  255. package/skills/java-conventions/SKILL.md +277 -0
  256. package/skills/pdf/LICENSE.txt +30 -0
  257. package/skills/pdf/SKILL.md +297 -0
  258. package/skills/pdf/forms.md +205 -0
  259. package/skills/pdf/reference.md +612 -0
  260. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  261. package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  262. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  263. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  264. package/skills/pdf/scripts/create_validation_image.py +41 -0
  265. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  266. package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  267. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  268. package/skills/pptx/LICENSE.txt +30 -0
  269. package/skills/pptx/SKILL.md +487 -0
  270. package/skills/pptx/html2pptx.md +625 -0
  271. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  272. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  273. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  274. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  275. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  276. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  277. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  278. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  279. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  280. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  281. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  282. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  283. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  284. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  285. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  286. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  287. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  288. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  289. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  290. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  291. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  292. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  293. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  294. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  295. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  296. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  297. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  298. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  299. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  300. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  301. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  302. package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  303. package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  304. package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  305. package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  306. package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  307. package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  308. package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  309. package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  310. package/skills/pptx/ooxml/scripts/pack.py +159 -0
  311. package/skills/pptx/ooxml/scripts/unpack.py +29 -0
  312. package/skills/pptx/ooxml/scripts/validate.py +69 -0
  313. package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  314. package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  315. package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  316. package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  317. package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  318. package/skills/pptx/ooxml.md +427 -0
  319. package/skills/pptx/scripts/html2pptx.js +979 -0
  320. package/skills/pptx/scripts/inventory.py +1020 -0
  321. package/skills/pptx/scripts/rearrange.py +231 -0
  322. package/skills/pptx/scripts/replace.py +385 -0
  323. package/skills/pptx/scripts/thumbnail.py +450 -0
  324. package/skills/project-analyze/SKILL.md +270 -0
  325. package/skills/project-analyze/phases/phase0-discovery.md +278 -0
  326. package/skills/project-analyze/phases/phase0.5-prescan.md +139 -0
  327. package/skills/project-analyze/phases/phase1-inventory.md +94 -0
  328. package/skills/project-analyze/phases/phase2-deep-analysis.md +249 -0
  329. package/skills/project-analyze/phases/phase2a-l4-analysis.md +94 -0
  330. package/skills/project-analyze/phases/phase2b-l5-analysis.md +97 -0
  331. package/skills/project-analyze/phases/phase3-knowledge-graph.md +120 -0
  332. package/skills/project-analyze/phases/phase3a-multi-dimensional.md +61 -0
  333. package/skills/project-analyze/phases/phase4-code-quality.md +81 -0
  334. package/skills/project-analyze/phases/phase5-synthesis.md +284 -0
  335. package/skills/project-analyze/phases/phase6-validation.md +179 -0
  336. package/skills/project-analyze/prompts/code-review-agent.md +122 -0
  337. package/skills/project-analyze/prompts/deep-analysis-agent.md +107 -0
  338. package/skills/project-analyze/prompts/inventory-agent.md +67 -0
  339. package/skills/project-analyze/prompts/l4-analysis-agent.md +98 -0
  340. package/skills/project-analyze/rules/android.md +282 -0
  341. package/skills/project-analyze/rules/devops.md +443 -0
  342. package/skills/project-analyze/rules/generic.md +243 -0
  343. package/skills/project-analyze/rules/go.md +289 -0
  344. package/skills/project-analyze/rules/harmony.md +257 -0
  345. package/skills/project-analyze/rules/java.md +507 -0
  346. package/skills/project-analyze/rules/mobile-flutter.md +315 -0
  347. package/skills/project-analyze/rules/mobile-react-native.md +283 -0
  348. package/skills/project-analyze/rules/mobile-swift.md +323 -0
  349. package/skills/project-analyze/rules/python.md +317 -0
  350. package/skills/project-analyze/rules/rust-tauri.md +243 -0
  351. package/skills/project-analyze/rules/rust.md +296 -0
  352. package/skills/project-analyze/rules/web-nextjs.md +364 -0
  353. package/skills/project-analyze/rules/web-react.md +298 -0
  354. package/skills/project-analyze/rules/web-vue.md +378 -0
  355. package/skills/project-analyze/rules/web.md +390 -0
  356. package/skills/project-query/SKILL.md +224 -0
  357. package/skills/project-query/rules/query-templates.md +212 -0
  358. package/skills/python-conventions/SKILL.md +169 -0
  359. package/skills/react-native-conventions/SKILL.md +73 -0
  360. package/skills/requirements-writer/README.md +153 -0
  361. package/skills/requirements-writer/SKILL.md +341 -0
  362. package/skills/requirements-writer/examples/prd-outline-example.md +217 -0
  363. package/skills/requirements-writer/templates/module-prd-template.md +362 -0
  364. package/skills/requirements-writer/templates/prd-outline-template.md +185 -0
  365. package/skills/requirements-writer/templates/user-story-template.md +1125 -0
  366. package/skills/rust-conventions/SKILL.md +361 -0
  367. package/skills/smart-dispatch/SKILL.md +296 -0
  368. package/skills/smart-dispatch/implementer-prompt.md +146 -0
  369. package/skills/smart-dispatch/reviewer-prompt.md +199 -0
  370. package/skills/software-architecture/SKILL.md +278 -0
  371. package/skills/swift-conventions/SKILL.md +72 -0
  372. package/skills/ui-ux-pro/SKILL.md +140 -0
  373. package/skills/verification-before-completion/SKILL.md +119 -0
  374. package/skills/web-conventions/SKILL.md +259 -0
  375. package/skills/webapp-testing/LICENSE.txt +202 -0
  376. package/skills/webapp-testing/SKILL.md +97 -0
  377. package/skills/webapp-testing/examples/console_logging.py +35 -0
  378. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  379. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  380. package/skills/webapp-testing/scripts/with_server.py +106 -0
  381. package/skills/writing-plans/SKILL.md +144 -0
  382. package/skills/xlsx/LICENSE.txt +30 -0
  383. package/skills/xlsx/SKILL.md +292 -0
  384. package/skills/xlsx/recalc.py +178 -0
  385. package/templates/CLAUDE.md.android +57 -0
  386. package/templates/CLAUDE.md.devops +50 -0
  387. package/templates/CLAUDE.md.generic +34 -0
  388. package/templates/CLAUDE.md.go +67 -0
  389. package/templates/CLAUDE.md.harmony +54 -0
  390. package/templates/CLAUDE.md.java +56 -0
  391. package/templates/CLAUDE.md.mobile-flutter +38 -0
  392. package/templates/CLAUDE.md.mobile-react-native +37 -0
  393. package/templates/CLAUDE.md.mobile-swift +40 -0
  394. package/templates/CLAUDE.md.python +65 -0
  395. package/templates/CLAUDE.md.rust +68 -0
  396. package/templates/CLAUDE.md.rust-tauri +120 -0
  397. package/templates/CLAUDE.md.web +63 -0
  398. package/templates/COMPONENT.md.android +58 -0
  399. package/templates/COMPONENT.md.devops +54 -0
  400. package/templates/COMPONENT.md.generic +35 -0
  401. package/templates/COMPONENT.md.go +59 -0
  402. package/templates/COMPONENT.md.harmony +63 -0
  403. package/templates/COMPONENT.md.java +69 -0
  404. package/templates/COMPONENT.md.mobile-flutter +56 -0
  405. package/templates/COMPONENT.md.mobile-react-native +55 -0
  406. package/templates/COMPONENT.md.mobile-swift +56 -0
  407. package/templates/COMPONENT.md.python +67 -0
  408. package/templates/COMPONENT.md.rust +57 -0
  409. package/templates/COMPONENT.md.rust-tauri +66 -0
  410. package/templates/COMPONENT.md.web +39 -0
  411. package/templates/README.md.android +71 -0
  412. package/templates/README.md.devops +68 -0
  413. package/templates/README.md.generic +39 -0
  414. package/templates/README.md.go +70 -0
  415. package/templates/README.md.harmony +72 -0
  416. package/templates/README.md.java +73 -0
  417. package/templates/README.md.mobile-flutter +69 -0
  418. package/templates/README.md.mobile-react-native +65 -0
  419. package/templates/README.md.mobile-swift +69 -0
  420. package/templates/README.md.monorepo +59 -0
  421. package/templates/README.md.python +66 -0
  422. package/templates/README.md.rust +69 -0
  423. package/templates/README.md.rust-tauri +149 -0
  424. package/templates/README.md.web +94 -0
  425. package/templates/UI_STYLE.md.android +74 -0
  426. package/templates/UI_STYLE.md.devops +50 -0
  427. package/templates/UI_STYLE.md.generic +31 -0
  428. package/templates/UI_STYLE.md.go +49 -0
  429. package/templates/UI_STYLE.md.harmony +71 -0
  430. package/templates/UI_STYLE.md.java +61 -0
  431. package/templates/UI_STYLE.md.mobile-flutter +70 -0
  432. package/templates/UI_STYLE.md.mobile-react-native +71 -0
  433. package/templates/UI_STYLE.md.mobile-swift +71 -0
  434. package/templates/UI_STYLE.md.python +58 -0
  435. package/templates/UI_STYLE.md.rust +52 -0
  436. package/templates/UI_STYLE.md.rust-tauri +102 -0
  437. package/templates/UI_STYLE.md.web +92 -0
  438. package/templates/cursor-rules.android.mdc +33 -0
  439. package/templates/cursor-rules.devops.mdc +32 -0
  440. package/templates/cursor-rules.generic.mdc +25 -0
  441. package/templates/cursor-rules.go.mdc +34 -0
  442. package/templates/cursor-rules.harmony.mdc +30 -0
  443. package/templates/cursor-rules.java.mdc +30 -0
  444. package/templates/cursor-rules.mobile-flutter.mdc +42 -0
  445. package/templates/cursor-rules.mobile-react-native.mdc +43 -0
  446. package/templates/cursor-rules.mobile-swift.mdc +42 -0
  447. package/templates/cursor-rules.python.mdc +33 -0
  448. package/templates/cursor-rules.rust-tauri.mdc +67 -0
  449. package/templates/cursor-rules.rust.mdc +30 -0
  450. package/templates/cursor-rules.web.mdc +30 -0
  451. package/templates/kiro-steering.android.md +39 -0
  452. package/templates/kiro-steering.devops.md +32 -0
  453. package/templates/kiro-steering.generic.md +28 -0
  454. package/templates/kiro-steering.go.md +41 -0
  455. package/templates/kiro-steering.harmony.md +36 -0
  456. package/templates/kiro-steering.java.md +37 -0
  457. package/templates/kiro-steering.mobile-flutter.md +73 -0
  458. package/templates/kiro-steering.mobile-react-native.md +71 -0
  459. package/templates/kiro-steering.mobile-swift.md +62 -0
  460. package/templates/kiro-steering.python.md +34 -0
  461. package/templates/kiro-steering.rust-tauri.md +50 -0
  462. package/templates/kiro-steering.rust.md +36 -0
  463. 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