moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl

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 (524) hide show
  1. moai_adk/__main__.py +136 -5
  2. moai_adk/astgrep/__init__.py +37 -0
  3. moai_adk/astgrep/analyzer.py +522 -0
  4. moai_adk/astgrep/models.py +124 -0
  5. moai_adk/astgrep/rules.py +179 -0
  6. moai_adk/cli/commands/analyze.py +11 -2
  7. moai_adk/cli/commands/doctor.py +7 -1
  8. moai_adk/cli/commands/init.py +321 -11
  9. moai_adk/cli/commands/language.py +7 -1
  10. moai_adk/cli/commands/rank.py +449 -0
  11. moai_adk/cli/commands/status.py +7 -1
  12. moai_adk/cli/commands/switch.py +325 -0
  13. moai_adk/cli/commands/update.py +296 -23
  14. moai_adk/cli/prompts/init_prompts.py +362 -66
  15. moai_adk/cli/prompts/translations/__init__.py +573 -0
  16. moai_adk/cli/ui/prompts.py +61 -2
  17. moai_adk/cli/worktree/cli.py +106 -1
  18. moai_adk/cli/worktree/manager.py +155 -0
  19. moai_adk/core/config/unified.py +244 -63
  20. moai_adk/core/credentials.py +264 -0
  21. moai_adk/core/error_recovery_system.py +22 -4
  22. moai_adk/core/git/conflict_detector.py +10 -1
  23. moai_adk/core/git/event_detector.py +16 -5
  24. moai_adk/core/integration/engine.py +2 -2
  25. moai_adk/core/integration/integration_tester.py +5 -5
  26. moai_adk/core/language_config_resolver.py +9 -3
  27. moai_adk/core/merge/analyzer.py +509 -324
  28. moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
  29. moai_adk/core/migration/backup_manager.py +54 -4
  30. moai_adk/core/migration/file_migrator.py +174 -2
  31. moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
  32. moai_adk/core/migration/version_detector.py +123 -19
  33. moai_adk/core/migration/version_migrator.py +44 -9
  34. moai_adk/core/model_allocator.py +241 -0
  35. moai_adk/core/project/backup_utils.py +12 -2
  36. moai_adk/core/project/initializer.py +44 -87
  37. moai_adk/core/project/phase_executor.py +95 -33
  38. moai_adk/core/project/validator.py +16 -1
  39. moai_adk/core/quality/trust_checker.py +30 -10
  40. moai_adk/core/rollback_manager.py +60 -25
  41. moai_adk/core/template/backup.py +88 -6
  42. moai_adk/core/template/config.py +33 -9
  43. moai_adk/core/template/merger.py +34 -8
  44. moai_adk/core/template/processor.py +334 -11
  45. moai_adk/core/template_engine.py +10 -1
  46. moai_adk/core/template_variable_synchronizer.py +16 -2
  47. moai_adk/core/version_sync.py +54 -6
  48. moai_adk/foundation/__init__.py +1 -20
  49. moai_adk/foundation/testing.py +1 -1
  50. moai_adk/loop/__init__.py +54 -0
  51. moai_adk/loop/controller.py +305 -0
  52. moai_adk/loop/feedback.py +230 -0
  53. moai_adk/loop/state.py +209 -0
  54. moai_adk/loop/storage.py +220 -0
  55. moai_adk/lsp/__init__.py +70 -0
  56. moai_adk/lsp/client.py +320 -0
  57. moai_adk/lsp/models.py +261 -0
  58. moai_adk/lsp/protocol.py +404 -0
  59. moai_adk/lsp/server_manager.py +248 -0
  60. moai_adk/project/configuration.py +8 -1
  61. moai_adk/py.typed +0 -0
  62. moai_adk/ralph/__init__.py +37 -0
  63. moai_adk/ralph/engine.py +307 -0
  64. moai_adk/rank/__init__.py +21 -0
  65. moai_adk/rank/auth.py +425 -0
  66. moai_adk/rank/client.py +557 -0
  67. moai_adk/rank/config.py +147 -0
  68. moai_adk/rank/hook.py +1503 -0
  69. moai_adk/rank/py.typed +0 -0
  70. moai_adk/statusline/__init__.py +3 -0
  71. moai_adk/statusline/enhanced_output_style_detector.py +5 -5
  72. moai_adk/statusline/main.py +20 -1
  73. moai_adk/statusline/memory_collector.py +268 -0
  74. moai_adk/statusline/renderer.py +54 -38
  75. moai_adk/tag_system/__init__.py +48 -0
  76. moai_adk/tag_system/atomic_ops.py +117 -0
  77. moai_adk/tag_system/linkage.py +335 -0
  78. moai_adk/tag_system/parser.py +176 -0
  79. moai_adk/tag_system/validator.py +200 -0
  80. moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
  81. moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
  82. moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
  83. moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
  84. moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
  85. moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
  86. moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
  87. moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
  88. moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
  89. moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
  90. moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
  91. moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
  92. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
  93. moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
  94. moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
  95. moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
  96. moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
  97. moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
  98. moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
  99. moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
  100. moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
  101. moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
  102. moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
  103. moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
  104. moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
  105. moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
  106. moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
  107. moai_adk/templates/.claude/commands/moai/fix.md +264 -0
  108. moai_adk/templates/.claude/commands/moai/loop.md +363 -0
  109. moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
  110. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
  111. moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
  112. moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
  113. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
  114. moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
  115. moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
  116. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
  117. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
  118. moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
  119. moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
  120. moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
  121. moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
  122. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
  123. moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
  124. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
  125. moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
  126. moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
  127. moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
  128. moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
  129. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
  130. moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
  131. moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
  132. moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
  133. moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
  134. moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
  135. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
  136. moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
  137. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
  138. moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
  139. moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
  140. moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
  141. moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
  142. moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
  143. moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
  144. moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
  145. moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
  146. moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
  147. moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
  148. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
  149. moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
  150. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
  151. moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
  152. moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
  153. moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
  154. moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
  155. moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
  156. moai_adk/templates/.claude/settings.json +154 -77
  157. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
  158. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
  159. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
  160. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
  161. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
  162. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
  163. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
  164. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
  165. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
  166. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
  167. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
  168. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
  169. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
  170. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
  171. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
  172. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
  173. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
  174. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
  175. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
  176. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
  177. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
  178. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
  179. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
  180. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
  181. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
  182. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
  183. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
  184. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
  185. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
  186. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
  187. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
  188. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
  189. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
  190. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
  191. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
  192. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
  193. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
  196. moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
  199. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
  201. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
  204. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
  205. moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
  206. moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
  207. moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
  208. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
  209. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
  210. moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
  211. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
  212. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
  213. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
  214. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
  215. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
  216. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
  217. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
  218. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
  219. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
  220. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
  221. moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
  222. moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
  223. moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
  224. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
  225. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
  226. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
  227. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
  228. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
  229. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
  230. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
  231. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
  232. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
  233. moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
  234. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
  235. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
  236. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
  237. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
  238. moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
  239. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
  240. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
  241. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
  242. moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
  243. moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
  244. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
  245. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
  246. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
  247. moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
  248. moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
  249. moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
  250. moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
  251. moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
  252. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
  253. moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
  254. moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
  255. moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
  256. moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
  257. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
  258. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
  259. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
  260. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
  261. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
  262. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
  263. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
  264. moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
  265. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
  266. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
  267. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
  268. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
  269. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
  270. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
  271. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
  272. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
  273. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
  274. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
  275. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
  276. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
  277. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
  278. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
  279. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
  280. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
  281. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
  282. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
  283. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
  284. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
  285. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
  286. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
  287. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
  288. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
  289. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
  290. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
  291. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
  292. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
  293. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
  294. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
  295. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
  296. moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
  297. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
  298. moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
  299. moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
  300. moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
  301. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
  302. moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
  303. moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
  304. moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
  305. moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
  306. moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
  307. moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
  308. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
  309. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
  310. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
  311. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
  312. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
  313. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
  314. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
  315. moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
  316. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
  317. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
  318. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
  319. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
  320. moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
  321. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
  322. moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
  323. moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
  324. moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
  325. moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
  326. moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
  327. moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
  328. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
  329. moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
  330. moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
  331. moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
  332. moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
  333. moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
  334. moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
  335. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
  336. moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
  337. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
  338. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
  339. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
  340. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
  341. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
  342. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
  343. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
  344. moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
  345. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
  346. moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
  347. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
  348. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
  349. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
  350. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
  351. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
  352. moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
  353. moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
  354. moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
  355. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
  356. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
  357. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
  358. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
  359. moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
  360. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
  361. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
  362. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
  363. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
  364. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
  365. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
  366. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
  367. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
  368. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
  369. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
  370. moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
  371. moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
  372. moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
  373. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
  374. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
  375. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
  376. moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
  377. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
  378. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
  379. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
  380. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
  381. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
  382. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
  383. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
  384. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
  385. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
  386. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
  387. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
  388. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
  389. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
  390. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
  391. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
  404. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
  409. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
  416. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
  429. moai_adk/templates/.git-hooks/pre-push +162 -59
  430. moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
  431. moai_adk/templates/.gitignore +65 -107
  432. moai_adk/templates/.lsp.json +152 -0
  433. moai_adk/templates/.mcp.json +2 -20
  434. moai_adk/templates/.moai/announcements/en.json +18 -0
  435. moai_adk/templates/.moai/announcements/ja.json +18 -0
  436. moai_adk/templates/.moai/announcements/ko.json +18 -0
  437. moai_adk/templates/.moai/announcements/zh.json +18 -0
  438. moai_adk/templates/.moai/config/config.yaml +8 -2
  439. moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
  440. moai_adk/templates/.moai/config/sections/language.yaml +2 -2
  441. moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
  442. moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
  443. moai_adk/templates/.moai/config/sections/project.yaml +2 -2
  444. moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
  445. moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
  446. moai_adk/templates/.moai/config/sections/system.yaml +46 -1
  447. moai_adk/templates/.moai/config/sections/user.yaml +1 -1
  448. moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
  449. moai_adk/templates/.moai/llm-configs/glm.json +22 -0
  450. moai_adk/templates/CLAUDE.ja.md +343 -0
  451. moai_adk/templates/CLAUDE.ko.md +343 -0
  452. moai_adk/templates/CLAUDE.md +200 -499
  453. moai_adk/templates/CLAUDE.zh.md +343 -0
  454. moai_adk/utils/common.py +37 -0
  455. moai_adk/version.py +1 -1
  456. moai_adk-1.1.0.dist-info/METADATA +2443 -0
  457. moai_adk-1.1.0.dist-info/RECORD +701 -0
  458. {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
  459. moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
  460. moai_adk/core/config/auto_spec_config.py +0 -340
  461. moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
  462. moai_adk/core/spec/confidence_scoring.py +0 -680
  463. moai_adk/core/spec/ears_template_engine.py +0 -1247
  464. moai_adk/core/spec/quality_validator.py +0 -687
  465. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
  466. moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
  467. moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
  468. moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
  469. moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
  470. moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
  471. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
  472. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
  473. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
  474. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
  475. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
  476. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
  477. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
  478. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
  479. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
  480. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
  481. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
  482. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
  483. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
  484. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
  485. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
  486. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
  487. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
  488. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
  489. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
  490. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
  491. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
  492. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
  493. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
  494. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
  495. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
  496. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
  497. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
  498. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
  499. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
  500. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
  501. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
  502. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
  503. moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
  504. moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
  505. moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
  506. moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
  507. moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
  508. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
  509. moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
  510. moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
  511. moai_adk-0.34.0.dist-info/METADATA +0 -2999
  512. moai_adk-0.34.0.dist-info/RECORD +0 -463
  513. moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
  514. /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
  515. /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
  516. /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
  517. /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
  518. /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
  519. /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
  520. /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
  521. /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
  522. /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
  523. /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
  524. {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,896 @@
1
+ #!/usr/bin/env python3
2
+ """Tool Registry for MoAI-ADK Hooks
3
+
4
+ Provides unified registry for formatters, linters, and language tools.
5
+ Supports 16+ languages with automatic tool detection and fallback.
6
+
7
+ Features:
8
+ - Automatic tool availability detection
9
+ - Graceful fallback when tools unavailable
10
+ - Extensible registry pattern
11
+ - Cross-platform support (macOS, Linux, Windows)
12
+ """
13
+
14
+ import shutil
15
+ import subprocess
16
+ from dataclasses import dataclass, field
17
+ from enum import Enum
18
+ from pathlib import Path
19
+
20
+
21
+ class ToolType(Enum):
22
+ """Tool type classification."""
23
+
24
+ FORMATTER = "formatter"
25
+ LINTER = "linter"
26
+ TYPE_CHECKER = "type_checker"
27
+ SECURITY_SCANNER = "security_scanner"
28
+ AST_ANALYZER = "ast_analyzer"
29
+
30
+
31
+ @dataclass
32
+ class ToolConfig:
33
+ """Configuration for a single tool."""
34
+
35
+ name: str
36
+ command: str
37
+ args: list[str] = field(default_factory=list)
38
+ file_args_position: str = "end" # "end", "start", or "replace:{placeholder}"
39
+ check_args: list[str] = field(default_factory=list) # Args to check if tool exists
40
+ fix_args: list[str] = field(default_factory=list) # Args to auto-fix issues
41
+ extensions: list[str] = field(default_factory=list)
42
+ tool_type: ToolType = ToolType.FORMATTER
43
+ priority: int = 1 # Lower = higher priority
44
+ timeout_seconds: int = 30
45
+ requires_config: bool = False # Needs config file to work
46
+ config_files: list[str] = field(default_factory=list) # e.g., ["pyproject.toml"]
47
+
48
+
49
+ @dataclass
50
+ class ToolResult:
51
+ """Result of tool execution."""
52
+
53
+ success: bool
54
+ tool_name: str
55
+ output: str = ""
56
+ error: str = ""
57
+ exit_code: int = 0
58
+ file_modified: bool = False
59
+ issues_found: int = 0
60
+ issues_fixed: int = 0
61
+
62
+
63
+ class ToolRegistry:
64
+ """Registry for language tools (formatters, linters, etc.)."""
65
+
66
+ def __init__(self) -> None:
67
+ self._tools: dict[str, list[ToolConfig]] = {}
68
+ self._extension_map: dict[str, str] = {}
69
+ self._tool_cache: dict[str, bool] = {}
70
+ self._register_default_tools()
71
+
72
+ def _register_default_tools(self) -> None:
73
+ """Register all default tools for supported languages."""
74
+ # Python tools
75
+ self._register_python_tools()
76
+ # JavaScript/TypeScript tools
77
+ self._register_js_ts_tools()
78
+ # Go tools
79
+ self._register_go_tools()
80
+ # Rust tools
81
+ self._register_rust_tools()
82
+ # Java/Kotlin tools
83
+ self._register_jvm_tools()
84
+ # Swift tools
85
+ self._register_swift_tools()
86
+ # C/C++ tools
87
+ self._register_cpp_tools()
88
+ # Ruby tools
89
+ self._register_ruby_tools()
90
+ # PHP tools
91
+ self._register_php_tools()
92
+ # Elixir tools
93
+ self._register_elixir_tools()
94
+ # Scala tools
95
+ self._register_scala_tools()
96
+ # R tools
97
+ self._register_r_tools()
98
+ # Dart/Flutter tools
99
+ self._register_dart_tools()
100
+ # C# tools
101
+ self._register_csharp_tools()
102
+ # Markdown tools
103
+ self._register_markdown_tools()
104
+ # AST-Grep tools (cross-language)
105
+ self._register_ast_grep_tools()
106
+
107
+ def _register_python_tools(self) -> None:
108
+ """Register Python formatting and linting tools."""
109
+ extensions = [".py", ".pyi"]
110
+ for ext in extensions:
111
+ self._extension_map[ext] = "python"
112
+
113
+ self._tools["python"] = [
114
+ # Ruff - fastest Python linter and formatter
115
+ ToolConfig(
116
+ name="ruff-format",
117
+ command="ruff",
118
+ args=["format"],
119
+ extensions=extensions,
120
+ tool_type=ToolType.FORMATTER,
121
+ priority=1,
122
+ timeout_seconds=30,
123
+ ),
124
+ ToolConfig(
125
+ name="ruff-check",
126
+ command="ruff",
127
+ args=["check", "--fix"],
128
+ extensions=extensions,
129
+ tool_type=ToolType.LINTER,
130
+ priority=1,
131
+ timeout_seconds=30,
132
+ ),
133
+ # Black - fallback formatter
134
+ ToolConfig(
135
+ name="black",
136
+ command="black",
137
+ args=[],
138
+ extensions=extensions,
139
+ tool_type=ToolType.FORMATTER,
140
+ priority=2,
141
+ timeout_seconds=30,
142
+ ),
143
+ # isort - import sorter
144
+ ToolConfig(
145
+ name="isort",
146
+ command="isort",
147
+ args=[],
148
+ extensions=extensions,
149
+ tool_type=ToolType.FORMATTER,
150
+ priority=3,
151
+ timeout_seconds=15,
152
+ ),
153
+ # mypy - type checker
154
+ ToolConfig(
155
+ name="mypy",
156
+ command="mypy",
157
+ args=["--ignore-missing-imports"],
158
+ extensions=extensions,
159
+ tool_type=ToolType.TYPE_CHECKER,
160
+ priority=1,
161
+ timeout_seconds=60,
162
+ ),
163
+ ]
164
+
165
+ def _register_js_ts_tools(self) -> None:
166
+ """Register JavaScript/TypeScript tools."""
167
+ js_extensions = [".js", ".jsx", ".mjs", ".cjs"]
168
+ ts_extensions = [".ts", ".tsx", ".mts", ".cts"]
169
+
170
+ for ext in js_extensions:
171
+ self._extension_map[ext] = "javascript"
172
+ for ext in ts_extensions:
173
+ self._extension_map[ext] = "typescript"
174
+
175
+ # Shared tools for both JS and TS
176
+ shared_tools = [
177
+ # Biome - fast all-in-one tool
178
+ ToolConfig(
179
+ name="biome-format",
180
+ command="biome",
181
+ args=["format", "--write"],
182
+ extensions=js_extensions + ts_extensions,
183
+ tool_type=ToolType.FORMATTER,
184
+ priority=1,
185
+ timeout_seconds=30,
186
+ ),
187
+ ToolConfig(
188
+ name="biome-lint",
189
+ command="biome",
190
+ args=["lint", "--apply"],
191
+ extensions=js_extensions + ts_extensions,
192
+ tool_type=ToolType.LINTER,
193
+ priority=1,
194
+ timeout_seconds=30,
195
+ ),
196
+ # Prettier - universal formatter
197
+ ToolConfig(
198
+ name="prettier",
199
+ command="prettier",
200
+ args=["--write"],
201
+ extensions=js_extensions + ts_extensions,
202
+ tool_type=ToolType.FORMATTER,
203
+ priority=2,
204
+ timeout_seconds=30,
205
+ ),
206
+ # ESLint
207
+ ToolConfig(
208
+ name="eslint",
209
+ command="eslint",
210
+ args=["--fix"],
211
+ extensions=js_extensions + ts_extensions,
212
+ tool_type=ToolType.LINTER,
213
+ priority=2,
214
+ timeout_seconds=60,
215
+ ),
216
+ ]
217
+
218
+ self._tools["javascript"] = shared_tools.copy()
219
+ self._tools["typescript"] = shared_tools.copy()
220
+
221
+ def _register_go_tools(self) -> None:
222
+ """Register Go tools."""
223
+ extensions = [".go"]
224
+ for ext in extensions:
225
+ self._extension_map[ext] = "go"
226
+
227
+ self._tools["go"] = [
228
+ ToolConfig(
229
+ name="gofmt",
230
+ command="gofmt",
231
+ args=["-w"],
232
+ extensions=extensions,
233
+ tool_type=ToolType.FORMATTER,
234
+ priority=1,
235
+ timeout_seconds=15,
236
+ ),
237
+ ToolConfig(
238
+ name="goimports",
239
+ command="goimports",
240
+ args=["-w"],
241
+ extensions=extensions,
242
+ tool_type=ToolType.FORMATTER,
243
+ priority=2,
244
+ timeout_seconds=15,
245
+ ),
246
+ ToolConfig(
247
+ name="golangci-lint",
248
+ command="golangci-lint",
249
+ args=["run", "--fix"],
250
+ file_args_position="start",
251
+ extensions=extensions,
252
+ tool_type=ToolType.LINTER,
253
+ priority=1,
254
+ timeout_seconds=120,
255
+ ),
256
+ ]
257
+
258
+ def _register_rust_tools(self) -> None:
259
+ """Register Rust tools."""
260
+ extensions = [".rs"]
261
+ for ext in extensions:
262
+ self._extension_map[ext] = "rust"
263
+
264
+ self._tools["rust"] = [
265
+ ToolConfig(
266
+ name="rustfmt",
267
+ command="rustfmt",
268
+ args=[],
269
+ extensions=extensions,
270
+ tool_type=ToolType.FORMATTER,
271
+ priority=1,
272
+ timeout_seconds=30,
273
+ ),
274
+ ToolConfig(
275
+ name="clippy",
276
+ command="cargo",
277
+ args=["clippy", "--fix", "--allow-dirty", "--allow-staged"],
278
+ extensions=extensions,
279
+ tool_type=ToolType.LINTER,
280
+ priority=1,
281
+ timeout_seconds=180,
282
+ ),
283
+ ]
284
+
285
+ def _register_jvm_tools(self) -> None:
286
+ """Register Java and Kotlin tools."""
287
+ java_extensions = [".java"]
288
+ kotlin_extensions = [".kt", ".kts"]
289
+
290
+ for ext in java_extensions:
291
+ self._extension_map[ext] = "java"
292
+ for ext in kotlin_extensions:
293
+ self._extension_map[ext] = "kotlin"
294
+
295
+ self._tools["java"] = [
296
+ ToolConfig(
297
+ name="google-java-format",
298
+ command="google-java-format",
299
+ args=["-i"],
300
+ extensions=java_extensions,
301
+ tool_type=ToolType.FORMATTER,
302
+ priority=1,
303
+ timeout_seconds=30,
304
+ ),
305
+ ToolConfig(
306
+ name="checkstyle",
307
+ command="checkstyle",
308
+ args=["-c", "/google_checks.xml"],
309
+ extensions=java_extensions,
310
+ tool_type=ToolType.LINTER,
311
+ priority=1,
312
+ timeout_seconds=60,
313
+ ),
314
+ ]
315
+
316
+ self._tools["kotlin"] = [
317
+ ToolConfig(
318
+ name="ktlint",
319
+ command="ktlint",
320
+ args=["-F"],
321
+ extensions=kotlin_extensions,
322
+ tool_type=ToolType.FORMATTER,
323
+ priority=1,
324
+ timeout_seconds=30,
325
+ ),
326
+ ToolConfig(
327
+ name="detekt",
328
+ command="detekt",
329
+ args=["-i"],
330
+ extensions=kotlin_extensions,
331
+ tool_type=ToolType.LINTER,
332
+ priority=1,
333
+ timeout_seconds=60,
334
+ ),
335
+ ]
336
+
337
+ def _register_swift_tools(self) -> None:
338
+ """Register Swift tools."""
339
+ extensions = [".swift"]
340
+ for ext in extensions:
341
+ self._extension_map[ext] = "swift"
342
+
343
+ self._tools["swift"] = [
344
+ ToolConfig(
345
+ name="swift-format",
346
+ command="swift-format",
347
+ args=["format", "-i"],
348
+ extensions=extensions,
349
+ tool_type=ToolType.FORMATTER,
350
+ priority=1,
351
+ timeout_seconds=30,
352
+ ),
353
+ ToolConfig(
354
+ name="swiftlint",
355
+ command="swiftlint",
356
+ args=["--fix"],
357
+ extensions=extensions,
358
+ tool_type=ToolType.LINTER,
359
+ priority=1,
360
+ timeout_seconds=60,
361
+ ),
362
+ ]
363
+
364
+ def _register_cpp_tools(self) -> None:
365
+ """Register C/C++ tools."""
366
+ extensions = [".c", ".cpp", ".cc", ".cxx", ".h", ".hpp", ".hxx"]
367
+ for ext in extensions:
368
+ self._extension_map[ext] = "cpp"
369
+
370
+ self._tools["cpp"] = [
371
+ ToolConfig(
372
+ name="clang-format",
373
+ command="clang-format",
374
+ args=["-i"],
375
+ extensions=extensions,
376
+ tool_type=ToolType.FORMATTER,
377
+ priority=1,
378
+ timeout_seconds=15,
379
+ ),
380
+ ToolConfig(
381
+ name="clang-tidy",
382
+ command="clang-tidy",
383
+ args=["--fix"],
384
+ extensions=extensions,
385
+ tool_type=ToolType.LINTER,
386
+ priority=1,
387
+ timeout_seconds=120,
388
+ ),
389
+ ]
390
+
391
+ def _register_ruby_tools(self) -> None:
392
+ """Register Ruby tools."""
393
+ extensions = [".rb", ".rake", ".gemspec"]
394
+ for ext in extensions:
395
+ self._extension_map[ext] = "ruby"
396
+
397
+ self._tools["ruby"] = [
398
+ ToolConfig(
399
+ name="rubocop",
400
+ command="rubocop",
401
+ args=["-a"],
402
+ extensions=extensions,
403
+ tool_type=ToolType.FORMATTER,
404
+ priority=1,
405
+ timeout_seconds=60,
406
+ ),
407
+ ]
408
+
409
+ def _register_php_tools(self) -> None:
410
+ """Register PHP tools."""
411
+ extensions = [".php"]
412
+ for ext in extensions:
413
+ self._extension_map[ext] = "php"
414
+
415
+ self._tools["php"] = [
416
+ ToolConfig(
417
+ name="php-cs-fixer",
418
+ command="php-cs-fixer",
419
+ args=["fix"],
420
+ extensions=extensions,
421
+ tool_type=ToolType.FORMATTER,
422
+ priority=1,
423
+ timeout_seconds=60,
424
+ ),
425
+ ToolConfig(
426
+ name="phpstan",
427
+ command="phpstan",
428
+ args=["analyze"],
429
+ extensions=extensions,
430
+ tool_type=ToolType.LINTER,
431
+ priority=1,
432
+ timeout_seconds=120,
433
+ ),
434
+ ]
435
+
436
+ def _register_elixir_tools(self) -> None:
437
+ """Register Elixir tools."""
438
+ extensions = [".ex", ".exs"]
439
+ for ext in extensions:
440
+ self._extension_map[ext] = "elixir"
441
+
442
+ self._tools["elixir"] = [
443
+ ToolConfig(
444
+ name="mix-format",
445
+ command="mix",
446
+ args=["format"],
447
+ extensions=extensions,
448
+ tool_type=ToolType.FORMATTER,
449
+ priority=1,
450
+ timeout_seconds=30,
451
+ ),
452
+ ToolConfig(
453
+ name="credo",
454
+ command="mix",
455
+ args=["credo", "--strict"],
456
+ extensions=extensions,
457
+ tool_type=ToolType.LINTER,
458
+ priority=1,
459
+ timeout_seconds=60,
460
+ ),
461
+ ]
462
+
463
+ def _register_scala_tools(self) -> None:
464
+ """Register Scala tools."""
465
+ extensions = [".scala", ".sc"]
466
+ for ext in extensions:
467
+ self._extension_map[ext] = "scala"
468
+
469
+ self._tools["scala"] = [
470
+ ToolConfig(
471
+ name="scalafmt",
472
+ command="scalafmt",
473
+ args=[],
474
+ extensions=extensions,
475
+ tool_type=ToolType.FORMATTER,
476
+ priority=1,
477
+ timeout_seconds=60,
478
+ ),
479
+ ToolConfig(
480
+ name="scalafix",
481
+ command="scalafix",
482
+ args=[],
483
+ extensions=extensions,
484
+ tool_type=ToolType.LINTER,
485
+ priority=1,
486
+ timeout_seconds=120,
487
+ ),
488
+ ]
489
+
490
+ def _register_r_tools(self) -> None:
491
+ """Register R tools."""
492
+ extensions = [".r", ".R", ".Rmd"]
493
+ for ext in extensions:
494
+ self._extension_map[ext] = "r"
495
+
496
+ self._tools["r"] = [
497
+ ToolConfig(
498
+ name="styler",
499
+ command="Rscript",
500
+ args=["-e", "styler::style_file"],
501
+ file_args_position="replace:style_file",
502
+ extensions=extensions,
503
+ tool_type=ToolType.FORMATTER,
504
+ priority=1,
505
+ timeout_seconds=60,
506
+ ),
507
+ ToolConfig(
508
+ name="lintr",
509
+ command="Rscript",
510
+ args=["-e", "lintr::lint"],
511
+ extensions=extensions,
512
+ tool_type=ToolType.LINTER,
513
+ priority=1,
514
+ timeout_seconds=60,
515
+ ),
516
+ ]
517
+
518
+ def _register_dart_tools(self) -> None:
519
+ """Register Dart/Flutter tools."""
520
+ extensions = [".dart"]
521
+ for ext in extensions:
522
+ self._extension_map[ext] = "dart"
523
+
524
+ self._tools["dart"] = [
525
+ ToolConfig(
526
+ name="dart-format",
527
+ command="dart",
528
+ args=["format"],
529
+ extensions=extensions,
530
+ tool_type=ToolType.FORMATTER,
531
+ priority=1,
532
+ timeout_seconds=30,
533
+ ),
534
+ ToolConfig(
535
+ name="dart-analyze",
536
+ command="dart",
537
+ args=["analyze"],
538
+ extensions=extensions,
539
+ tool_type=ToolType.LINTER,
540
+ priority=1,
541
+ timeout_seconds=60,
542
+ ),
543
+ ]
544
+
545
+ def _register_csharp_tools(self) -> None:
546
+ """Register C# tools."""
547
+ extensions = [".cs"]
548
+ for ext in extensions:
549
+ self._extension_map[ext] = "csharp"
550
+
551
+ self._tools["csharp"] = [
552
+ ToolConfig(
553
+ name="dotnet-format",
554
+ command="dotnet",
555
+ args=["format"],
556
+ extensions=extensions,
557
+ tool_type=ToolType.FORMATTER,
558
+ priority=1,
559
+ timeout_seconds=60,
560
+ ),
561
+ ]
562
+
563
+ def _register_markdown_tools(self) -> None:
564
+ """Register Markdown tools."""
565
+ extensions = [".md", ".mdx", ".markdown"]
566
+ for ext in extensions:
567
+ self._extension_map[ext] = "markdown"
568
+
569
+ self._tools["markdown"] = [
570
+ ToolConfig(
571
+ name="prettier-md",
572
+ command="prettier",
573
+ args=["--write", "--parser", "markdown"],
574
+ extensions=extensions,
575
+ tool_type=ToolType.FORMATTER,
576
+ priority=1,
577
+ timeout_seconds=15,
578
+ ),
579
+ ToolConfig(
580
+ name="markdownlint",
581
+ command="markdownlint",
582
+ args=["--fix"],
583
+ extensions=extensions,
584
+ tool_type=ToolType.LINTER,
585
+ priority=1,
586
+ timeout_seconds=30,
587
+ ),
588
+ ]
589
+
590
+ def _register_ast_grep_tools(self) -> None:
591
+ """Register AST-Grep tools for structural code analysis.
592
+
593
+ AST-Grep (sg) provides AST-based code search, lint, and rewriting.
594
+ Supports 40+ languages with pattern matching and code transformation.
595
+ """
596
+ # AST-Grep supports multiple languages - define common extensions
597
+ ast_grep_extensions = [
598
+ ".py",
599
+ ".pyi", # Python
600
+ ".js",
601
+ ".jsx",
602
+ ".mjs",
603
+ ".cjs", # JavaScript
604
+ ".ts",
605
+ ".tsx",
606
+ ".mts",
607
+ ".cts", # TypeScript
608
+ ".go", # Go
609
+ ".rs", # Rust
610
+ ".java", # Java
611
+ ".kt",
612
+ ".kts", # Kotlin
613
+ ".c",
614
+ ".cpp",
615
+ ".cc",
616
+ ".cxx",
617
+ ".h",
618
+ ".hpp", # C/C++
619
+ ".rb", # Ruby
620
+ ".swift", # Swift
621
+ ".cs", # C#
622
+ ".php", # PHP
623
+ ".scala", # Scala
624
+ ".ex",
625
+ ".exs", # Elixir
626
+ ".lua", # Lua
627
+ ".html",
628
+ ".vue",
629
+ ".svelte", # Web templates
630
+ ]
631
+
632
+ self._tools["ast_grep"] = [
633
+ # Security scanning with rules
634
+ ToolConfig(
635
+ name="ast-grep-scan",
636
+ command="sg",
637
+ args=["scan"],
638
+ extensions=ast_grep_extensions,
639
+ tool_type=ToolType.AST_ANALYZER,
640
+ priority=1,
641
+ timeout_seconds=60,
642
+ requires_config=True,
643
+ config_files=["sgconfig.yml", ".ast-grep/sgconfig.yml"],
644
+ ),
645
+ # Pattern-based search
646
+ ToolConfig(
647
+ name="ast-grep-run",
648
+ command="sg",
649
+ args=["run", "--pattern"],
650
+ file_args_position="end",
651
+ extensions=ast_grep_extensions,
652
+ tool_type=ToolType.AST_ANALYZER,
653
+ priority=2,
654
+ timeout_seconds=30,
655
+ ),
656
+ # Interactive testing
657
+ ToolConfig(
658
+ name="ast-grep-test",
659
+ command="sg",
660
+ args=["test"],
661
+ extensions=ast_grep_extensions,
662
+ tool_type=ToolType.AST_ANALYZER,
663
+ priority=3,
664
+ timeout_seconds=120,
665
+ requires_config=True,
666
+ config_files=["sgconfig.yml"],
667
+ ),
668
+ ]
669
+
670
+ def is_tool_available(self, tool_name: str) -> bool:
671
+ """Check if a tool is available on the system."""
672
+ if tool_name in self._tool_cache:
673
+ return self._tool_cache[tool_name]
674
+
675
+ # Extract base command from tool name
676
+ for lang_tools in self._tools.values():
677
+ for tool in lang_tools:
678
+ if tool.name == tool_name:
679
+ available = shutil.which(tool.command) is not None
680
+ self._tool_cache[tool_name] = available
681
+ return available
682
+
683
+ return False
684
+
685
+ def get_language_for_file(self, file_path: str) -> str | None:
686
+ """Get language identifier for a file path."""
687
+ ext = Path(file_path).suffix.lower()
688
+ return self._extension_map.get(ext)
689
+
690
+ def get_tools_for_language(self, language: str, tool_type: ToolType | None = None) -> list[ToolConfig]:
691
+ """Get available tools for a language, optionally filtered by type."""
692
+ tools = self._tools.get(language, [])
693
+
694
+ if tool_type:
695
+ tools = [t for t in tools if t.tool_type == tool_type]
696
+
697
+ # Filter by availability and sort by priority
698
+ available_tools = [t for t in tools if self.is_tool_available(t.name)]
699
+ return sorted(available_tools, key=lambda t: t.priority)
700
+
701
+ def get_tools_for_file(self, file_path: str, tool_type: ToolType | None = None) -> list[ToolConfig]:
702
+ """Get available tools for a specific file."""
703
+ language = self.get_language_for_file(file_path)
704
+ if not language:
705
+ return []
706
+ return self.get_tools_for_language(language, tool_type)
707
+
708
+ def _validate_file_path(self, file_path: str, cwd: str | None = None) -> str:
709
+ """Validate and sanitize file path to prevent injection attacks.
710
+
711
+ Security measures:
712
+ - Reject paths with null bytes
713
+ - Reject paths with shell metacharacters in dangerous positions
714
+ - Resolve and validate path is within allowed boundaries
715
+ - Ensure path exists and is a file
716
+
717
+ Args:
718
+ file_path: Path to validate
719
+ cwd: Working directory context
720
+
721
+ Returns:
722
+ Validated absolute path
723
+
724
+ Raises:
725
+ ValueError: If path is invalid or potentially dangerous
726
+ """
727
+
728
+ # Check for null bytes (common injection technique)
729
+ if "\x00" in file_path:
730
+ raise ValueError("Invalid file path: contains null byte")
731
+
732
+ # Check for shell metacharacters that could be dangerous
733
+ # These are dangerous in string interpolation contexts (like R code)
734
+ dangerous_chars = ["'", '"', "`", "$", ";", "&", "|", "\n", "\r"]
735
+ for char in dangerous_chars:
736
+ if char in file_path:
737
+ raise ValueError(f"Invalid file path: contains dangerous character '{repr(char)}'")
738
+
739
+ # Resolve path
740
+ try:
741
+ path = Path(file_path)
742
+ if not path.is_absolute():
743
+ base = Path(cwd) if cwd else Path.cwd()
744
+ path = (base / path).resolve()
745
+ else:
746
+ path = path.resolve()
747
+ except (OSError, ValueError) as e:
748
+ raise ValueError(f"Invalid file path: {e}") from e
749
+
750
+ # Ensure path exists and is a file
751
+ if not path.exists():
752
+ raise ValueError(f"File does not exist: {file_path}")
753
+ if not path.is_file():
754
+ raise ValueError(f"Path is not a file: {file_path}")
755
+
756
+ return str(path)
757
+
758
+ def _escape_for_code_string(self, value: str, language: str = "generic") -> str:
759
+ """Escape a string value for safe inclusion in code.
760
+
761
+ Args:
762
+ value: String to escape
763
+ language: Target language (r, python, generic)
764
+
765
+ Returns:
766
+ Escaped string safe for code inclusion
767
+ """
768
+ # Basic escaping for string literals
769
+ # Escape backslashes first, then quotes
770
+ escaped = value.replace("\\", "\\\\")
771
+
772
+ if language == "r":
773
+ # R uses single quotes, escape them
774
+ escaped = escaped.replace("'", "\\'")
775
+ else:
776
+ # Generic: escape both quote types
777
+ escaped = escaped.replace("'", "\\'")
778
+ escaped = escaped.replace('"', '\\"')
779
+
780
+ return escaped
781
+
782
+ def run_tool(
783
+ self,
784
+ tool: ToolConfig,
785
+ file_path: str,
786
+ cwd: str | None = None,
787
+ extra_args: list[str] | None = None,
788
+ ) -> ToolResult:
789
+ """Run a tool on a file and return the result.
790
+
791
+ Security measures:
792
+ - Validates file path before execution
793
+ - Uses subprocess list mode (shell=False) to prevent shell injection
794
+ - Properly escapes paths for code interpolation contexts
795
+ """
796
+ try:
797
+ # Validate file path first (security check)
798
+ try:
799
+ validated_path = self._validate_file_path(file_path, cwd)
800
+ except ValueError as e:
801
+ return ToolResult(
802
+ success=False,
803
+ tool_name=tool.name,
804
+ error=f"Path validation failed: {e}",
805
+ exit_code=-1,
806
+ )
807
+
808
+ # Build command
809
+ cmd = [tool.command] + tool.args
810
+
811
+ # Add file path based on position
812
+ if tool.file_args_position == "end":
813
+ cmd.append(validated_path)
814
+ elif tool.file_args_position == "start":
815
+ cmd.insert(1, validated_path)
816
+ elif tool.file_args_position.startswith("replace:"):
817
+ # Handle code interpolation (e.g., R's styler::style_file)
818
+ placeholder = tool.file_args_position.split(":")[1]
819
+ # Escape path for safe code string inclusion
820
+ escaped_path = self._escape_for_code_string(validated_path, "r")
821
+ # Build function call: placeholder → placeholder('escaped_path')
822
+ replacement = f"{placeholder}('{escaped_path}')"
823
+ cmd = [c.replace(placeholder, replacement) for c in cmd]
824
+
825
+ # Add extra args
826
+ if extra_args:
827
+ cmd.extend(extra_args)
828
+
829
+ # Get file content hash before
830
+ file_hash_before = self._get_file_hash(file_path)
831
+
832
+ # Run tool
833
+ result = subprocess.run(
834
+ cmd,
835
+ capture_output=True,
836
+ text=True,
837
+ timeout=tool.timeout_seconds,
838
+ cwd=cwd,
839
+ )
840
+
841
+ # Get file content hash after
842
+ file_hash_after = self._get_file_hash(file_path)
843
+ file_modified = file_hash_before != file_hash_after
844
+
845
+ return ToolResult(
846
+ success=result.returncode == 0,
847
+ tool_name=tool.name,
848
+ output=result.stdout,
849
+ error=result.stderr,
850
+ exit_code=result.returncode,
851
+ file_modified=file_modified,
852
+ )
853
+
854
+ except subprocess.TimeoutExpired:
855
+ return ToolResult(
856
+ success=False,
857
+ tool_name=tool.name,
858
+ error=f"Tool timed out after {tool.timeout_seconds}s",
859
+ exit_code=-1,
860
+ )
861
+ except FileNotFoundError:
862
+ return ToolResult(
863
+ success=False,
864
+ tool_name=tool.name,
865
+ error=f"Tool not found: {tool.command}",
866
+ exit_code=-1,
867
+ )
868
+ except Exception as e:
869
+ return ToolResult(
870
+ success=False,
871
+ tool_name=tool.name,
872
+ error=str(e),
873
+ exit_code=-1,
874
+ )
875
+
876
+ def _get_file_hash(self, file_path: str) -> str:
877
+ """Get hash of file contents for change detection."""
878
+ try:
879
+ import hashlib
880
+
881
+ with open(file_path, "rb") as f:
882
+ return hashlib.md5(f.read()).hexdigest()
883
+ except Exception:
884
+ return ""
885
+
886
+
887
+ # Global registry instance
888
+ _registry: ToolRegistry | None = None
889
+
890
+
891
+ def get_tool_registry() -> ToolRegistry:
892
+ """Get the global tool registry instance."""
893
+ global _registry
894
+ if _registry is None:
895
+ _registry = ToolRegistry()
896
+ return _registry