moai-adk 0.35.1__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.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

Files changed (502) hide show
  1. moai_adk/__init__.py +10 -0
  2. moai_adk/__main__.py +199 -0
  3. moai_adk/cli/__init__.py +6 -0
  4. moai_adk/cli/commands/__init__.py +17 -0
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +272 -0
  7. moai_adk/cli/commands/init.py +372 -0
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +104 -0
  10. moai_adk/cli/commands/update.py +2686 -0
  11. moai_adk/cli/main.py +13 -0
  12. moai_adk/cli/prompts/__init__.py +5 -0
  13. moai_adk/cli/prompts/init_prompts.py +219 -0
  14. moai_adk/cli/spec_status.py +263 -0
  15. moai_adk/cli/ui/__init__.py +44 -0
  16. moai_adk/cli/ui/progress.py +422 -0
  17. moai_adk/cli/ui/prompts.py +389 -0
  18. moai_adk/cli/ui/theme.py +129 -0
  19. moai_adk/cli/worktree/__init__.py +27 -0
  20. moai_adk/cli/worktree/__main__.py +31 -0
  21. moai_adk/cli/worktree/cli.py +683 -0
  22. moai_adk/cli/worktree/exceptions.py +89 -0
  23. moai_adk/cli/worktree/manager.py +493 -0
  24. moai_adk/cli/worktree/models.py +65 -0
  25. moai_adk/cli/worktree/registry.py +422 -0
  26. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  27. moai_adk/core/__init__.py +1 -0
  28. moai_adk/core/analysis/__init__.py +9 -0
  29. moai_adk/core/analysis/session_analyzer.py +400 -0
  30. moai_adk/core/claude_integration.py +393 -0
  31. moai_adk/core/command_helpers.py +270 -0
  32. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  33. moai_adk/core/config/__init__.py +19 -0
  34. moai_adk/core/config/auto_spec_config.py +340 -0
  35. moai_adk/core/config/migration.py +244 -0
  36. moai_adk/core/config/unified.py +436 -0
  37. moai_adk/core/context_manager.py +273 -0
  38. moai_adk/core/diagnostics/__init__.py +19 -0
  39. moai_adk/core/diagnostics/slash_commands.py +159 -0
  40. moai_adk/core/enterprise_features.py +1404 -0
  41. moai_adk/core/error_recovery_system.py +1902 -0
  42. moai_adk/core/event_driven_hook_system.py +1371 -0
  43. moai_adk/core/git/__init__.py +31 -0
  44. moai_adk/core/git/branch.py +25 -0
  45. moai_adk/core/git/branch_manager.py +129 -0
  46. moai_adk/core/git/checkpoint.py +134 -0
  47. moai_adk/core/git/commit.py +67 -0
  48. moai_adk/core/git/conflict_detector.py +413 -0
  49. moai_adk/core/git/event_detector.py +79 -0
  50. moai_adk/core/git/manager.py +216 -0
  51. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  52. moai_adk/core/input_validation_middleware.py +1006 -0
  53. moai_adk/core/integration/__init__.py +22 -0
  54. moai_adk/core/integration/engine.py +157 -0
  55. moai_adk/core/integration/integration_tester.py +226 -0
  56. moai_adk/core/integration/models.py +88 -0
  57. moai_adk/core/integration/utils.py +211 -0
  58. moai_adk/core/issue_creator.py +305 -0
  59. moai_adk/core/jit_context_loader.py +956 -0
  60. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  61. moai_adk/core/language_config.py +202 -0
  62. moai_adk/core/language_config_resolver.py +572 -0
  63. moai_adk/core/language_validator.py +543 -0
  64. moai_adk/core/mcp/setup.py +116 -0
  65. moai_adk/core/merge/__init__.py +9 -0
  66. moai_adk/core/merge/analyzer.py +605 -0
  67. moai_adk/core/migration/__init__.py +18 -0
  68. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  69. moai_adk/core/migration/backup_manager.py +277 -0
  70. moai_adk/core/migration/custom_element_scanner.py +358 -0
  71. moai_adk/core/migration/file_migrator.py +209 -0
  72. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  73. moai_adk/core/migration/selective_restorer.py +470 -0
  74. moai_adk/core/migration/template_utils.py +74 -0
  75. moai_adk/core/migration/user_selection_ui.py +338 -0
  76. moai_adk/core/migration/version_detector.py +139 -0
  77. moai_adk/core/migration/version_migrator.py +228 -0
  78. moai_adk/core/performance/__init__.py +6 -0
  79. moai_adk/core/performance/cache_system.py +316 -0
  80. moai_adk/core/performance/parallel_processor.py +116 -0
  81. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  82. moai_adk/core/project/__init__.py +1 -0
  83. moai_adk/core/project/backup_utils.py +70 -0
  84. moai_adk/core/project/checker.py +300 -0
  85. moai_adk/core/project/detector.py +293 -0
  86. moai_adk/core/project/initializer.py +387 -0
  87. moai_adk/core/project/phase_executor.py +716 -0
  88. moai_adk/core/project/validator.py +139 -0
  89. moai_adk/core/quality/__init__.py +6 -0
  90. moai_adk/core/quality/trust_checker.py +377 -0
  91. moai_adk/core/quality/validators/__init__.py +6 -0
  92. moai_adk/core/quality/validators/base_validator.py +19 -0
  93. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  94. moai_adk/core/robust_json_parser.py +611 -0
  95. moai_adk/core/rollback_manager.py +918 -0
  96. moai_adk/core/session_manager.py +651 -0
  97. moai_adk/core/skill_loading_system.py +579 -0
  98. moai_adk/core/spec/confidence_scoring.py +680 -0
  99. moai_adk/core/spec/ears_template_engine.py +1247 -0
  100. moai_adk/core/spec/quality_validator.py +687 -0
  101. moai_adk/core/spec_status_manager.py +478 -0
  102. moai_adk/core/template/__init__.py +7 -0
  103. moai_adk/core/template/backup.py +174 -0
  104. moai_adk/core/template/config.py +191 -0
  105. moai_adk/core/template/languages.py +43 -0
  106. moai_adk/core/template/merger.py +233 -0
  107. moai_adk/core/template/processor.py +1200 -0
  108. moai_adk/core/template_engine.py +310 -0
  109. moai_adk/core/template_variable_synchronizer.py +417 -0
  110. moai_adk/core/unified_permission_manager.py +745 -0
  111. moai_adk/core/user_behavior_analytics.py +851 -0
  112. moai_adk/core/version_sync.py +429 -0
  113. moai_adk/foundation/__init__.py +56 -0
  114. moai_adk/foundation/backend.py +1027 -0
  115. moai_adk/foundation/database.py +1115 -0
  116. moai_adk/foundation/devops.py +1585 -0
  117. moai_adk/foundation/ears.py +431 -0
  118. moai_adk/foundation/frontend.py +870 -0
  119. moai_adk/foundation/git/commit_templates.py +557 -0
  120. moai_adk/foundation/git.py +376 -0
  121. moai_adk/foundation/langs.py +484 -0
  122. moai_adk/foundation/ml_ops.py +1162 -0
  123. moai_adk/foundation/testing.py +1524 -0
  124. moai_adk/foundation/trust/trust_principles.py +676 -0
  125. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  126. moai_adk/project/__init__.py +0 -0
  127. moai_adk/project/configuration.py +1084 -0
  128. moai_adk/project/documentation.py +566 -0
  129. moai_adk/project/schema.py +447 -0
  130. moai_adk/statusline/__init__.py +38 -0
  131. moai_adk/statusline/alfred_detector.py +105 -0
  132. moai_adk/statusline/config.py +376 -0
  133. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  134. moai_adk/statusline/git_collector.py +190 -0
  135. moai_adk/statusline/main.py +322 -0
  136. moai_adk/statusline/metrics_tracker.py +78 -0
  137. moai_adk/statusline/renderer.py +343 -0
  138. moai_adk/statusline/update_checker.py +129 -0
  139. moai_adk/statusline/version_reader.py +741 -0
  140. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
  141. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  142. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  143. moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
  144. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  145. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  146. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  147. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  148. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  149. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  150. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  151. moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
  152. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  153. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  154. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  155. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  156. moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
  157. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  158. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  159. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  160. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  161. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  164. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  165. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  166. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  167. moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
  168. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  169. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  170. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  171. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  172. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  173. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  185. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  186. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  187. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  188. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  189. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
  190. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  191. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  192. moai_adk/templates/.claude/settings.json +172 -0
  193. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
  194. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  195. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
  196. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  200. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  201. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  202. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  203. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  204. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  205. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
  206. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
  207. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
  210. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  211. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  212. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  213. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  214. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
  215. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
  216. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
  217. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  221. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  222. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  223. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  224. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  230. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  231. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  232. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  233. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  280. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  281. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  282. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  283. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  284. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
  285. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
  286. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  287. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  288. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  289. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  290. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
  291. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
  292. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
  293. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
  294. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
  295. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
  297. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
  298. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
  304. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
  305. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
  306. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
  307. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
  308. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
  309. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
  310. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
  311. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
  312. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
  313. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
  314. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
  315. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
  316. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  318. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  319. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  320. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  321. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  331. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  332. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  333. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  334. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  338. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  339. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  340. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  341. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  342. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  343. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  344. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  345. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  346. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
  347. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  348. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  349. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  350. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  351. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  352. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  353. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  354. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  355. moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
  356. moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
  357. moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
  358. moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
  359. moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
  360. moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
  361. moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
  362. moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
  363. moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
  364. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
  365. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
  366. moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
  367. moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
  368. moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
  369. moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
  370. moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
  371. moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
  372. moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
  373. moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
  374. moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
  375. moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
  376. moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
  377. moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
  378. moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
  379. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
  380. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
  381. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
  382. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
  383. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
  384. moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
  385. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
  386. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
  387. moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
  388. moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
  389. moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
  390. moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
  391. moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  429. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  430. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  431. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  432. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  433. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  434. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  435. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  436. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  437. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  438. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  439. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  440. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  441. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  442. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  443. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  444. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  445. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  446. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  447. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  448. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  449. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  450. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  451. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  452. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  453. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  454. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  455. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  456. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  457. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  458. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  459. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  460. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  461. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  462. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  463. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  464. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  465. moai_adk/templates/.git-hooks/pre-commit +128 -0
  466. moai_adk/templates/.git-hooks/pre-push +365 -0
  467. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  468. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  469. moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
  470. moai_adk/templates/.gitignore +222 -0
  471. moai_adk/templates/.mcp.json +13 -0
  472. moai_adk/templates/.moai/config/config.yaml +58 -0
  473. moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
  474. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  475. moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
  476. moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
  477. moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
  478. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
  479. moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
  480. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  481. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  482. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  483. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  484. moai_adk/templates/.moai/config/sections/system.yaml +24 -0
  485. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  486. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  487. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  488. moai_adk/templates/CLAUDE.md +642 -0
  489. moai_adk/utils/__init__.py +30 -0
  490. moai_adk/utils/banner.py +38 -0
  491. moai_adk/utils/common.py +294 -0
  492. moai_adk/utils/link_validator.py +241 -0
  493. moai_adk/utils/logger.py +147 -0
  494. moai_adk/utils/safe_file_reader.py +206 -0
  495. moai_adk/utils/timeout.py +160 -0
  496. moai_adk/utils/toon_utils.py +256 -0
  497. moai_adk/version.py +22 -0
  498. moai_adk-0.35.1.dist-info/METADATA +3018 -0
  499. moai_adk-0.35.1.dist-info/RECORD +502 -0
  500. moai_adk-0.35.1.dist-info/WHEEL +4 -0
  501. moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
  502. moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,879 @@
1
+ """
2
+ Phase-Optimized Hook Scheduler
3
+
4
+ Intelligent scheduling system for hooks based on development phases,
5
+ token budget constraints, and performance requirements.
6
+
7
+ Key Features:
8
+ - Phase-aware hook scheduling
9
+ - Token budget optimization
10
+ - Dynamic priority adjustment
11
+ - Performance-based scheduling
12
+ - Dependency resolution
13
+ - Resource management
14
+ """
15
+
16
+ import asyncio
17
+ import threading
18
+ import time
19
+ from dataclasses import dataclass, field
20
+ from datetime import datetime
21
+ from enum import Enum
22
+ from typing import Any, Dict, List, Optional, Set
23
+
24
+ from .jit_enhanced_hook_manager import (
25
+ HookEvent,
26
+ HookMetadata,
27
+ HookPriority,
28
+ JITEnhancedHookManager,
29
+ Phase,
30
+ )
31
+
32
+
33
+ class SchedulingStrategy(Enum):
34
+ """Hook scheduling strategies"""
35
+
36
+ PRIORITY_FIRST = "priority_first" # Execute highest priority hooks first
37
+ PERFORMANCE_FIRST = "performance_first" # Execute fastest hooks first
38
+ PHASE_OPTIMIZED = "phase_optimized" # Optimize for current phase
39
+ TOKEN_EFFICIENT = "token_efficient" # Minimize token usage
40
+ BALANCED = "balanced" # Balance all factors
41
+
42
+
43
+ class SchedulingDecision(Enum):
44
+ """Scheduling decisions for hooks"""
45
+
46
+ EXECUTE = "execute" # Execute hook now
47
+ DEFER = "defer" # Defer to later
48
+ SKIP = "skip" # Skip execution
49
+ PARALLEL = "parallel" # Execute in parallel group
50
+ SEQUENTIAL = "sequential" # Execute sequentially
51
+
52
+
53
+ @dataclass
54
+ class HookSchedulingContext:
55
+ """Context for hook scheduling decisions"""
56
+
57
+ event_type: HookEvent
58
+ current_phase: Phase
59
+ user_input: str
60
+ available_token_budget: int
61
+ max_execution_time_ms: float
62
+ current_time: datetime = field(default_factory=datetime.now)
63
+ system_load: float = 0.5 # 0.0 (idle) to 1.0 (busy)
64
+ recent_performance: Dict[str, float] = field(default_factory=dict) # hook_path -> avg_time_ms
65
+ active_dependencies: Set[str] = field(default_factory=set)
66
+
67
+
68
+ @dataclass
69
+ class ScheduledHook:
70
+ """Hook scheduled for execution"""
71
+
72
+ hook_path: str
73
+ metadata: HookMetadata
74
+ priority_score: float
75
+ estimated_cost: int # Token cost
76
+ estimated_time_ms: float
77
+ scheduling_decision: SchedulingDecision
78
+ execution_group: Optional[int] = None # Group ID for parallel execution
79
+ dependencies: Set[str] = field(default_factory=set)
80
+ dependents: Set[str] = field(default_factory=set)
81
+ retry_count: int = 0
82
+ max_retries: int = 2
83
+
84
+
85
+ @dataclass
86
+ class SchedulingResult:
87
+ """Result of hook scheduling"""
88
+
89
+ scheduled_hooks: List[ScheduledHook]
90
+ execution_plan: List[List[ScheduledHook]] # Groups of hooks to execute
91
+ estimated_total_time_ms: float
92
+ estimated_total_tokens: int
93
+ skipped_hooks: List[ScheduledHook]
94
+ deferred_hooks: List[ScheduledHook]
95
+ scheduling_strategy: SchedulingStrategy
96
+
97
+
98
+ @dataclass
99
+ class ExecutionGroup:
100
+ """Group of hooks to execute together"""
101
+
102
+ group_id: int
103
+ execution_type: SchedulingDecision # PARALLEL or SEQUENTIAL
104
+ hooks: List[ScheduledHook]
105
+ estimated_time_ms: float
106
+ estimated_tokens: int
107
+ max_wait_time_ms: float
108
+ dependencies: Set[str] = field(default_factory=set)
109
+
110
+
111
+ class PhaseOptimizedHookScheduler:
112
+ """
113
+ Intelligent scheduler for hooks with phase awareness and resource optimization
114
+
115
+ Provides optimal hook execution scheduling based on:
116
+ - Current development phase
117
+ - Token budget constraints
118
+ - Performance requirements
119
+ - Hook dependencies
120
+ - System load
121
+ """
122
+
123
+ def __init__(
124
+ self,
125
+ hook_manager: Optional[JITEnhancedHookManager] = None,
126
+ default_strategy: SchedulingStrategy = SchedulingStrategy.PHASE_OPTIMIZED,
127
+ max_parallel_groups: int = 3,
128
+ enable_adaptive_scheduling: bool = True,
129
+ ):
130
+ """Initialize Phase-Optimized Hook Scheduler
131
+
132
+ Args:
133
+ hook_manager: JIT-Enhanced Hook Manager instance
134
+ default_strategy: Default scheduling strategy
135
+ max_parallel_groups: Maximum parallel execution groups
136
+ enable_adaptive_scheduling: Enable adaptive strategy selection
137
+ """
138
+ self.hook_manager = hook_manager or JITEnhancedHookManager()
139
+ self.default_strategy = default_strategy
140
+ self.max_parallel_groups = max_parallel_groups
141
+ self.enable_adaptive_scheduling = enable_adaptive_scheduling
142
+
143
+ # Performance tracking
144
+ self._scheduling_history: List[Dict[str, Any]] = []
145
+ self._performance_cache: Dict[str, Dict[str, float]] = {}
146
+ self._scheduling_lock = threading.Lock()
147
+
148
+ # Phase-specific optimization parameters
149
+ self._phase_parameters = self._initialize_phase_parameters()
150
+
151
+ # Adaptive strategy selection
152
+ self._strategy_performance: Dict[SchedulingStrategy, Dict[str, float]] = {
153
+ strategy: {"success_rate": 1.0, "avg_efficiency": 0.8, "usage_count": 0} for strategy in SchedulingStrategy
154
+ }
155
+
156
+ def _initialize_phase_parameters(self) -> Dict[Phase, Dict[str, Any]]:
157
+ """Initialize phase-specific optimization parameters"""
158
+ return {
159
+ Phase.SPEC: {
160
+ "max_total_time_ms": 1000.0,
161
+ "token_budget_ratio": 0.3, # 30% of total budget
162
+ "priority_weights": {
163
+ HookPriority.CRITICAL: 1.0,
164
+ HookPriority.HIGH: 0.9,
165
+ HookPriority.NORMAL: 0.6,
166
+ HookPriority.LOW: 0.2,
167
+ },
168
+ "prefer_parallel": False, # Sequential for consistency
169
+ },
170
+ Phase.RED: {
171
+ "max_total_time_ms": 800.0,
172
+ "token_budget_ratio": 0.2, # 20% of total budget
173
+ "priority_weights": {
174
+ HookPriority.CRITICAL: 1.0,
175
+ HookPriority.HIGH: 1.0, # Testing is high priority
176
+ HookPriority.NORMAL: 0.8,
177
+ HookPriority.LOW: 0.3,
178
+ },
179
+ "prefer_parallel": True, # Parallel for faster test feedback
180
+ },
181
+ Phase.GREEN: {
182
+ "max_total_time_ms": 600.0,
183
+ "token_budget_ratio": 0.15, # 15% of total budget
184
+ "priority_weights": {
185
+ HookPriority.CRITICAL: 1.0,
186
+ HookPriority.HIGH: 0.8,
187
+ HookPriority.NORMAL: 0.7,
188
+ HookPriority.LOW: 0.4,
189
+ },
190
+ "prefer_parallel": True, # Parallel for faster implementation
191
+ },
192
+ Phase.REFACTOR: {
193
+ "max_total_time_ms": 1200.0,
194
+ "token_budget_ratio": 0.2, # 20% of total budget
195
+ "priority_weights": {
196
+ HookPriority.CRITICAL: 1.0,
197
+ HookPriority.HIGH: 0.9, # Code quality is important
198
+ HookPriority.NORMAL: 0.8,
199
+ HookPriority.LOW: 0.5,
200
+ },
201
+ "prefer_parallel": False, # Sequential for safety
202
+ },
203
+ Phase.SYNC: {
204
+ "max_total_time_ms": 1500.0,
205
+ "token_budget_ratio": 0.1, # 10% of total budget
206
+ "priority_weights": {
207
+ HookPriority.CRITICAL: 1.0,
208
+ HookPriority.HIGH: 0.7,
209
+ HookPriority.NORMAL: 0.9, # Documentation is important
210
+ HookPriority.LOW: 0.6,
211
+ },
212
+ "prefer_parallel": False, # Sequential for consistency
213
+ },
214
+ Phase.DEBUG: {
215
+ "max_total_time_ms": 500.0,
216
+ "token_budget_ratio": 0.05, # 5% of total budget
217
+ "priority_weights": {
218
+ HookPriority.CRITICAL: 1.0,
219
+ HookPriority.HIGH: 0.9, # Debug info is critical
220
+ HookPriority.NORMAL: 0.8,
221
+ HookPriority.LOW: 0.3,
222
+ },
223
+ "prefer_parallel": True, # Parallel for faster debugging
224
+ },
225
+ Phase.PLANNING: {
226
+ "max_total_time_ms": 800.0,
227
+ "token_budget_ratio": 0.25, # 25% of total budget
228
+ "priority_weights": {
229
+ HookPriority.CRITICAL: 1.0,
230
+ HookPriority.HIGH: 0.8,
231
+ HookPriority.NORMAL: 0.7,
232
+ HookPriority.LOW: 0.4,
233
+ },
234
+ "prefer_parallel": False, # Sequential for careful planning
235
+ },
236
+ }
237
+
238
+ async def schedule_hooks(
239
+ self,
240
+ event_type: HookEvent,
241
+ context: HookSchedulingContext,
242
+ strategy: Optional[SchedulingStrategy] = None,
243
+ ) -> SchedulingResult:
244
+ """Schedule hooks for execution with optimization
245
+
246
+ Args:
247
+ event_type: Hook event type
248
+ context: Scheduling context with phase and constraints
249
+ strategy: Scheduling strategy (uses default if None)
250
+
251
+ Returns:
252
+ Scheduling result with execution plan
253
+ """
254
+ start_time = time.time()
255
+
256
+ # Select optimal strategy
257
+ selected_strategy = strategy or self._select_optimal_strategy(event_type, context)
258
+
259
+ # Get available hooks for event type
260
+ available_hooks = self.hook_manager._hooks_by_event.get(event_type, [])
261
+
262
+ # Create scheduled hooks with initial analysis
263
+ scheduled_hooks = await self._create_scheduled_hooks(available_hooks, context, selected_strategy)
264
+
265
+ # Filter and prioritize hooks
266
+ filtered_hooks = self._filter_hooks_by_constraints(scheduled_hooks, context)
267
+ prioritized_hooks = self._prioritize_hooks(filtered_hooks, context, selected_strategy)
268
+
269
+ # Resolve dependencies
270
+ dependency_resolved_hooks = self._resolve_dependencies(prioritized_hooks)
271
+
272
+ # Create execution groups
273
+ execution_groups = self._create_execution_groups(dependency_resolved_hooks, context, selected_strategy)
274
+
275
+ # Optimize execution order
276
+ optimized_groups = self._optimize_execution_order(execution_groups, context)
277
+
278
+ # Calculate estimates
279
+ total_time_ms = sum(group.estimated_time_ms for group in optimized_groups)
280
+ total_tokens = sum(group.estimated_tokens for group in optimized_groups)
281
+
282
+ # Create execution plan
283
+ execution_plan = [
284
+ [hook for hook in group.hooks if hook.scheduling_decision == SchedulingDecision.EXECUTE]
285
+ for group in optimized_groups
286
+ ]
287
+
288
+ # Separate skipped and deferred hooks
289
+ executed_hooks = [hook for group in optimized_groups for hook in group.hooks]
290
+ skipped_hooks = [
291
+ hook
292
+ for hook in scheduled_hooks
293
+ if hook not in executed_hooks and hook.scheduling_decision == SchedulingDecision.SKIP
294
+ ]
295
+ deferred_hooks = [
296
+ hook
297
+ for hook in scheduled_hooks
298
+ if hook not in executed_hooks and hook.scheduling_decision == SchedulingDecision.DEFER
299
+ ]
300
+
301
+ # Create scheduling result
302
+ result = SchedulingResult(
303
+ scheduled_hooks=scheduled_hooks,
304
+ execution_plan=execution_plan,
305
+ estimated_total_time_ms=total_time_ms,
306
+ estimated_total_tokens=total_tokens,
307
+ skipped_hooks=skipped_hooks,
308
+ deferred_hooks=deferred_hooks,
309
+ scheduling_strategy=selected_strategy,
310
+ )
311
+
312
+ # Update scheduling history and performance
313
+ self._update_scheduling_history(result, time.time() - start_time)
314
+ self._update_strategy_performance(selected_strategy, result, context)
315
+
316
+ return result
317
+
318
+ def _select_optimal_strategy(self, event_type: HookEvent, context: HookSchedulingContext) -> SchedulingStrategy:
319
+ """Select optimal scheduling strategy based on context"""
320
+ if not self.enable_adaptive_scheduling:
321
+ return self.default_strategy
322
+
323
+ # Strategy selection based on phase and constraints
324
+ if context.available_token_budget < 5000:
325
+ # Low token budget - prioritize token efficiency
326
+ return SchedulingStrategy.TOKEN_EFFICIENT
327
+
328
+ elif context.max_execution_time_ms < 500:
329
+ # Tight time constraint - prioritize performance
330
+ return SchedulingStrategy.PERFORMANCE_FIRST
331
+
332
+ elif context.system_load > 0.8:
333
+ # High system load - prioritize priority
334
+ return SchedulingStrategy.PRIORITY_FIRST
335
+
336
+ elif context.current_phase == Phase.SYNC:
337
+ # Documentation phase - use phase-optimized
338
+ return SchedulingStrategy.PHASE_OPTIMIZED
339
+
340
+ else:
341
+ # Use best performing strategy from history
342
+ best_strategy = self.default_strategy
343
+ best_efficiency = 0.0
344
+
345
+ for strategy, performance in self._strategy_performance.items():
346
+ if performance["usage_count"] > 0:
347
+ efficiency = performance["success_rate"] * performance["avg_efficiency"]
348
+ if efficiency > best_efficiency:
349
+ best_efficiency = efficiency
350
+ best_strategy = strategy
351
+
352
+ return best_strategy
353
+
354
+ async def _create_scheduled_hooks(
355
+ self,
356
+ hook_paths: List[str],
357
+ context: HookSchedulingContext,
358
+ strategy: SchedulingStrategy,
359
+ ) -> List[ScheduledHook]:
360
+ """Create scheduled hooks from hook paths with analysis"""
361
+ scheduled_hooks = []
362
+
363
+ for hook_path in hook_paths:
364
+ metadata = self.hook_manager._hook_registry.get(hook_path)
365
+ if not metadata:
366
+ continue
367
+
368
+ # Calculate priority score based on strategy
369
+ priority_score = self._calculate_priority_score(metadata, context, strategy)
370
+
371
+ # Estimate execution cost
372
+ estimated_cost = self._estimate_hook_cost(metadata, context)
373
+ estimated_time = self._estimate_hook_time(metadata, context)
374
+
375
+ # Make initial scheduling decision
376
+ scheduling_decision = self._make_initial_scheduling_decision(
377
+ metadata, context, estimated_cost, estimated_time
378
+ )
379
+
380
+ scheduled_hook = ScheduledHook(
381
+ hook_path=hook_path,
382
+ metadata=metadata,
383
+ priority_score=priority_score,
384
+ estimated_cost=estimated_cost,
385
+ estimated_time_ms=estimated_time,
386
+ scheduling_decision=scheduling_decision,
387
+ dependencies=metadata.dependencies.copy(),
388
+ dependents=set(),
389
+ )
390
+
391
+ scheduled_hooks.append(scheduled_hook)
392
+
393
+ return scheduled_hooks
394
+
395
+ def _calculate_priority_score(
396
+ self,
397
+ metadata: HookMetadata,
398
+ context: HookSchedulingContext,
399
+ strategy: SchedulingStrategy,
400
+ ) -> float:
401
+ """Calculate priority score for hook based on strategy"""
402
+ base_score = 0.0
403
+
404
+ if strategy == SchedulingStrategy.PRIORITY_FIRST:
405
+ # Priority-based scoring
406
+ phase_params = self._phase_parameters.get(context.current_phase, {})
407
+ priority_weights = phase_params.get("priority_weights", {})
408
+ base_score = priority_weights.get(metadata.priority, 0.5) * 100
409
+
410
+ elif strategy == SchedulingStrategy.PERFORMANCE_FIRST:
411
+ # Performance-based scoring (faster hooks get higher priority)
412
+ base_score = max(0, 100 - metadata.estimated_execution_time_ms / 10)
413
+
414
+ elif strategy == SchedulingStrategy.PHASE_OPTIMIZED:
415
+ # Phase relevance scoring
416
+ phase_relevance = metadata.phase_relevance.get(context.current_phase, 0.5)
417
+ base_score = phase_relevance * 100
418
+
419
+ # Add priority bonus
420
+ priority_bonus = (5 - metadata.priority.value) * 10
421
+ base_score += priority_bonus
422
+
423
+ elif strategy == SchedulingStrategy.TOKEN_EFFICIENT:
424
+ # Token efficiency scoring (lower token cost gets higher priority)
425
+ base_score = max(0, 100 - metadata.token_cost_estimate / 10)
426
+
427
+ else: # BALANCED
428
+ # Combine all factors
429
+ priority_score = (5 - metadata.priority.value) * 20
430
+ phase_score = metadata.phase_relevance.get(context.current_phase, 0.5) * 30
431
+ performance_score = max(0, 30 - metadata.estimated_execution_time_ms / 20)
432
+ token_score = max(0, 20 - metadata.token_cost_estimate / 50)
433
+
434
+ base_score = priority_score + phase_score + performance_score + token_score
435
+
436
+ # Apply success rate modifier
437
+ base_score *= metadata.success_rate
438
+
439
+ return base_score
440
+
441
+ def _estimate_hook_cost(self, metadata: HookMetadata, context: HookSchedulingContext) -> int:
442
+ """Estimate token cost for hook execution"""
443
+ base_cost = metadata.token_cost_estimate
444
+
445
+ # Phase-based cost adjustment
446
+ phase_relevance = metadata.phase_relevance.get(context.current_phase, 0.5)
447
+ if phase_relevance < 0.3:
448
+ # Low relevance - increase cost to discourage execution
449
+ base_cost = int(base_cost * 2.0)
450
+ elif phase_relevance > 0.8:
451
+ # High relevance - reduce cost to encourage execution
452
+ base_cost = int(base_cost * 0.7)
453
+
454
+ # System load adjustment
455
+ if context.system_load > 0.8:
456
+ base_cost = int(base_cost * 1.3) # Increase cost under high load
457
+
458
+ return base_cost
459
+
460
+ def _estimate_hook_time(self, metadata: HookMetadata, context: HookSchedulingContext) -> float:
461
+ """Estimate execution time for hook"""
462
+ base_time = metadata.estimated_execution_time_ms
463
+
464
+ # System load adjustment
465
+ load_factor = 1.0 + (context.system_load * 0.5) # Up to 1.5x slower under load
466
+
467
+ # Success rate adjustment (unreliable hooks might take longer due to retries)
468
+ reliability_factor = 2.0 - metadata.success_rate # 1.0 to 2.0
469
+
470
+ return base_time * load_factor * reliability_factor
471
+
472
+ def _make_initial_scheduling_decision(
473
+ self,
474
+ metadata: HookMetadata,
475
+ context: HookSchedulingContext,
476
+ estimated_cost: int,
477
+ estimated_time: float,
478
+ ) -> SchedulingDecision:
479
+ """Make initial scheduling decision for hook"""
480
+ # Critical hooks always execute
481
+ if metadata.priority == HookPriority.CRITICAL:
482
+ return SchedulingDecision.EXECUTE
483
+
484
+ # Check constraints
485
+ if estimated_cost > context.available_token_budget:
486
+ return SchedulingDecision.SKIP
487
+
488
+ if estimated_time > context.max_execution_time_ms:
489
+ return SchedulingDecision.DEFER
490
+
491
+ # Phase relevance check
492
+ phase_relevance = metadata.phase_relevance.get(context.current_phase, 0.5)
493
+ if phase_relevance < 0.2:
494
+ return SchedulingDecision.SKIP
495
+
496
+ # Success rate check
497
+ if metadata.success_rate < 0.3:
498
+ return SchedulingDecision.DEFER
499
+
500
+ # System load check
501
+ if context.system_load > 0.9 and metadata.priority != HookPriority.HIGH:
502
+ return SchedulingDecision.DEFER
503
+
504
+ # Default to execution
505
+ return SchedulingDecision.EXECUTE
506
+
507
+ def _filter_hooks_by_constraints(
508
+ self, scheduled_hooks: List[ScheduledHook], context: HookSchedulingContext
509
+ ) -> List[ScheduledHook]:
510
+ """Filter hooks based on constraints"""
511
+ filtered_hooks = []
512
+ remaining_token_budget = context.available_token_budget
513
+ remaining_time_budget = context.max_execution_time_ms
514
+
515
+ # Sort by priority score (highest first)
516
+ sorted_hooks = sorted(scheduled_hooks, key=lambda h: h.priority_score, reverse=True)
517
+
518
+ for hook in sorted_hooks:
519
+ if hook.scheduling_decision != SchedulingDecision.EXECUTE:
520
+ filtered_hooks.append(hook)
521
+ continue
522
+
523
+ # Check if hook fits within constraints
524
+ if hook.estimated_cost <= remaining_token_budget and hook.estimated_time_ms <= remaining_time_budget:
525
+ filtered_hooks.append(hook)
526
+ remaining_token_budget -= hook.estimated_cost
527
+ remaining_time_budget -= hook.estimated_time_ms
528
+ else:
529
+ # Can't fit - mark as deferred
530
+ hook.scheduling_decision = SchedulingDecision.DEFER
531
+ filtered_hooks.append(hook)
532
+
533
+ return filtered_hooks
534
+
535
+ def _prioritize_hooks(
536
+ self,
537
+ scheduled_hooks: List[ScheduledHook],
538
+ context: HookSchedulingContext,
539
+ strategy: SchedulingStrategy,
540
+ ) -> List[ScheduledHook]:
541
+ """Prioritize hooks for execution"""
542
+ # Separate by scheduling decision
543
+ execute_hooks = [h for h in scheduled_hooks if h.scheduling_decision == SchedulingDecision.EXECUTE]
544
+ other_hooks = [h for h in scheduled_hooks if h.scheduling_decision != SchedulingDecision.EXECUTE]
545
+
546
+ # Sort execute hooks by priority (descending)
547
+ execute_hooks.sort(key=lambda h: h.priority_score, reverse=True)
548
+
549
+ # Sort other hooks by priority (ascending - least important first for skipping)
550
+ other_hooks.sort(key=lambda h: h.priority_score)
551
+
552
+ return execute_hooks + other_hooks
553
+
554
+ def _resolve_dependencies(self, hooks: List[ScheduledHook]) -> List[ScheduledHook]:
555
+ """Resolve hook dependencies and adjust execution order"""
556
+ # Build dependency graph
557
+ for hook in hooks:
558
+ for dep_path in hook.dependencies:
559
+ # Find dependent hook
560
+ for other_hook in hooks:
561
+ if other_hook.hook_path == dep_path:
562
+ other_hook.dependents.add(hook.hook_path)
563
+ break
564
+
565
+ # Topological sort considering dependencies
566
+ resolved_hooks = []
567
+ remaining_hooks = hooks.copy()
568
+
569
+ while remaining_hooks:
570
+ # Find hooks with no unresolved dependencies
571
+ ready_hooks = [
572
+ h
573
+ for h in remaining_hooks
574
+ if not any(dep in [rh.hook_path for rh in remaining_hooks] for dep in h.dependencies)
575
+ ]
576
+
577
+ if not ready_hooks:
578
+ # Circular dependency - break by priority
579
+ ready_hooks = sorted(remaining_hooks, key=lambda h: h.priority_score, reverse=True)
580
+ ready_hooks = [ready_hooks[0]]
581
+
582
+ # Add highest priority ready hook
583
+ next_hook = max(ready_hooks, key=lambda h: h.priority_score)
584
+ resolved_hooks.append(next_hook)
585
+ remaining_hooks.remove(next_hook)
586
+
587
+ return resolved_hooks
588
+
589
+ def _create_execution_groups(
590
+ self,
591
+ hooks: List[ScheduledHook],
592
+ context: HookSchedulingContext,
593
+ strategy: SchedulingStrategy,
594
+ ) -> List[ExecutionGroup]:
595
+ """Create execution groups for optimal performance"""
596
+ groups = []
597
+ current_group = None
598
+ group_id = 0
599
+
600
+ # Get phase preferences
601
+ phase_params = self._phase_parameters.get(context.current_phase, {})
602
+ prefer_parallel = phase_params.get("prefer_parallel", True)
603
+
604
+ for hook in hooks:
605
+ if hook.scheduling_decision != SchedulingDecision.EXECUTE:
606
+ continue
607
+
608
+ # Determine execution type
609
+ execution_type = (
610
+ SchedulingDecision.PARALLEL
611
+ if (prefer_parallel and hook.metadata.parallel_safe)
612
+ else SchedulingDecision.SEQUENTIAL
613
+ )
614
+
615
+ # Create new group if needed
616
+ if (
617
+ current_group is None
618
+ or current_group.execution_type != execution_type
619
+ or len(current_group.hooks) >= self.max_parallel_groups
620
+ ):
621
+ current_group = ExecutionGroup(
622
+ group_id=group_id,
623
+ execution_type=execution_type,
624
+ hooks=[],
625
+ estimated_time_ms=0.0,
626
+ estimated_tokens=0,
627
+ max_wait_time_ms=0.0,
628
+ dependencies=set(),
629
+ )
630
+ groups.append(current_group)
631
+ group_id += 1
632
+
633
+ # Add hook to current group
634
+ current_group.hooks.append(hook)
635
+ current_group.estimated_time_ms += hook.estimated_time_ms
636
+ current_group.estimated_tokens += hook.estimated_cost
637
+ current_group.dependencies.update(hook.dependencies)
638
+
639
+ # Set max wait time for parallel groups
640
+ for group in groups:
641
+ if group.execution_type == SchedulingDecision.PARALLEL:
642
+ # For parallel groups, wait time is determined by slowest hook
643
+ group.max_wait_time_ms = max(h.estimated_time_ms for h in group.hooks)
644
+ else:
645
+ # For sequential groups, sum all hook times
646
+ group.max_wait_time_ms = group.estimated_time_ms
647
+
648
+ return groups
649
+
650
+ def _optimize_execution_order(
651
+ self, groups: List[ExecutionGroup], context: HookSchedulingContext
652
+ ) -> List[ExecutionGroup]:
653
+ """Optimize execution order of groups"""
654
+ if len(groups) <= 1:
655
+ return groups
656
+
657
+ # Sort groups by priority and execution type
658
+ def group_score(group: ExecutionGroup) -> float:
659
+ # Calculate average priority of hooks in group
660
+ avg_priority = sum(h.priority_score for h in group.hooks) / len(group.hooks)
661
+
662
+ # Parallel groups get bonus for speed
663
+ parallel_bonus = 10 if group.execution_type == SchedulingDecision.PARALLEL else 0
664
+
665
+ # Smaller groups get bonus for better time management
666
+ size_bonus = max(0, 5 - len(group.hooks))
667
+
668
+ return avg_priority + parallel_bonus + size_bonus
669
+
670
+ # Sort by score (descending)
671
+ optimized_groups = sorted(groups, key=group_score, reverse=True)
672
+
673
+ return optimized_groups
674
+
675
+ def _update_scheduling_history(self, result: SchedulingResult, planning_time_ms: float) -> None:
676
+ """Update scheduling history for learning"""
677
+ with self._scheduling_lock:
678
+ history_entry: Dict[str, Any] = {
679
+ "timestamp": datetime.now().isoformat(),
680
+ "strategy": result.scheduling_strategy.value,
681
+ "planning_time_ms": planning_time_ms,
682
+ "total_hooks": len(result.scheduled_hooks),
683
+ "executed_hooks": sum(len(group) for group in result.execution_plan),
684
+ "skipped_hooks": len(result.skipped_hooks),
685
+ "deferred_hooks": len(result.deferred_hooks),
686
+ "estimated_time_ms": result.estimated_total_time_ms,
687
+ "estimated_tokens": result.estimated_total_tokens,
688
+ }
689
+
690
+ self._scheduling_history.append(history_entry)
691
+
692
+ # Keep history manageable
693
+ if len(self._scheduling_history) > 1000:
694
+ self._scheduling_history = self._scheduling_history[-500:]
695
+
696
+ def _update_strategy_performance(
697
+ self,
698
+ strategy: SchedulingStrategy,
699
+ result: SchedulingResult,
700
+ context: HookSchedulingContext,
701
+ ) -> None:
702
+ """Update strategy performance metrics"""
703
+ performance = self._strategy_performance[strategy]
704
+
705
+ # Update usage count
706
+ performance["usage_count"] += 1
707
+
708
+ # Calculate efficiency (higher is better)
709
+ total_hooks = len(result.scheduled_hooks)
710
+ executed_hooks = sum(len(group) for group in result.execution_plan)
711
+
712
+ if total_hooks > 0:
713
+ execution_ratio = executed_hooks / total_hooks
714
+
715
+ # Consider resource utilization
716
+ time_efficiency = min(1.0, result.estimated_total_time_ms / context.max_execution_time_ms)
717
+ token_efficiency = min(
718
+ 1.0,
719
+ result.estimated_total_tokens / max(1, context.available_token_budget),
720
+ )
721
+
722
+ # Overall efficiency
723
+ overall_efficiency = (execution_ratio * 0.5) + (time_efficiency * 0.3) + (token_efficiency * 0.2)
724
+
725
+ # Update rolling average
726
+ current_avg = performance["avg_efficiency"]
727
+ performance["avg_efficiency"] = (current_avg * 0.8) + (overall_efficiency * 0.2)
728
+
729
+ # Update success rate (assume successful if no critical errors)
730
+ # This would be updated with actual execution results
731
+ performance["success_rate"] = min(1.0, performance["success_rate"] * 0.95 + 0.05)
732
+
733
+ def get_scheduling_statistics(self) -> Dict[str, Any]:
734
+ """Get scheduling statistics and performance data"""
735
+ with self._scheduling_lock:
736
+ total_schedules = len(self._scheduling_history)
737
+
738
+ if total_schedules == 0:
739
+ return {
740
+ "total_schedules": 0,
741
+ "strategy_performance": {},
742
+ "recent_performance": [],
743
+ }
744
+
745
+ # Calculate strategy statistics
746
+ strategy_stats = {}
747
+ for strategy, performance in self._strategy_performance.items():
748
+ if performance["usage_count"] > 0:
749
+ strategy_stats[strategy.value] = {
750
+ "usage_count": performance["usage_count"],
751
+ "success_rate": performance["success_rate"],
752
+ "avg_efficiency": performance["avg_efficiency"],
753
+ "recommendation_score": performance["success_rate"] * performance["avg_efficiency"],
754
+ }
755
+
756
+ # Get recent performance
757
+ recent_performance = self._scheduling_history[-10:] if total_schedules >= 10 else self._scheduling_history
758
+
759
+ return {
760
+ "total_schedules": total_schedules,
761
+ "strategy_performance": strategy_stats,
762
+ "recent_performance": recent_performance,
763
+ "recommended_strategy": (
764
+ max(
765
+ strategy_stats.keys(),
766
+ key=lambda k: strategy_stats[k]["recommendation_score"],
767
+ )
768
+ if strategy_stats
769
+ else None
770
+ ),
771
+ }
772
+
773
+ def get_phase_optimization_insights(self, phase: Phase) -> Dict[str, Any]:
774
+ """Get insights for phase-specific optimization"""
775
+ phase_params = self._phase_parameters.get(phase, {})
776
+
777
+ # Analyze historical performance for this phase
778
+ phase_schedules = [
779
+ s
780
+ for s in self._scheduling_history
781
+ if any(phase.value.lower() in s.get("context", "").lower() for phase in [phase])
782
+ ]
783
+
784
+ insights: Dict[str, Any] = {
785
+ "phase": phase.value,
786
+ "parameters": phase_params,
787
+ "historical_schedules": len(phase_schedules),
788
+ "optimization_recommendations": [],
789
+ }
790
+
791
+ # Generate recommendations based on phase parameters
792
+ if phase_params.get("prefer_parallel", False):
793
+ recs_list = insights["optimization_recommendations"]
794
+ if isinstance(recs_list, list):
795
+ recs_list.append("This phase benefits from parallel hook execution")
796
+ else:
797
+ recs_list = insights["optimization_recommendations"]
798
+ if isinstance(recs_list, list):
799
+ recs_list.append("This phase prefers sequential hook execution for consistency")
800
+
801
+ if phase_params.get("token_budget_ratio", 0) > 0.2:
802
+ recs_list = insights["optimization_recommendations"]
803
+ if isinstance(recs_list, list):
804
+ recs_list.append("This phase requires significant token budget - consider token-efficient scheduling")
805
+
806
+ # Add strategy recommendations
807
+ strategy_stats = self.get_scheduling_statistics()["strategy_performance"]
808
+ best_strategy = (
809
+ max(strategy_stats.items(), key=lambda x: x[1]["recommendation_score"]) if strategy_stats else None
810
+ )
811
+
812
+ if best_strategy:
813
+ insights["recommended_strategy"] = best_strategy[0]
814
+ score = best_strategy[1]["recommendation_score"]
815
+ insights["strategy_rationale"] = f"Best performance with {best_strategy[0]} strategy (score: {score:.2f})"
816
+
817
+ return insights
818
+
819
+
820
+ # Convenience functions for common scheduling operations
821
+ async def schedule_session_start_hooks(
822
+ context: HookSchedulingContext, strategy: Optional[SchedulingStrategy] = None
823
+ ) -> SchedulingResult:
824
+ """Schedule SessionStart hooks with phase optimization"""
825
+ scheduler = PhaseOptimizedHookScheduler()
826
+ return await scheduler.schedule_hooks(HookEvent.SESSION_START, context, strategy)
827
+
828
+
829
+ async def schedule_pre_tool_hooks(
830
+ context: HookSchedulingContext, strategy: Optional[SchedulingStrategy] = None
831
+ ) -> SchedulingResult:
832
+ """Schedule PreToolUse hooks with phase optimization"""
833
+ scheduler = PhaseOptimizedHookScheduler()
834
+ return await scheduler.schedule_hooks(HookEvent.PRE_TOOL_USE, context, strategy)
835
+
836
+
837
+ def get_hook_scheduling_insights(phase: Phase) -> Dict[str, Any]:
838
+ """Get phase-specific hook scheduling insights"""
839
+ scheduler = PhaseOptimizedHookScheduler()
840
+ return scheduler.get_phase_optimization_insights(phase)
841
+
842
+
843
+ if __name__ == "__main__":
844
+ # Example usage and testing
845
+ async def test_phase_optimized_scheduler():
846
+ scheduler = PhaseOptimizedHookScheduler()
847
+
848
+ # Create test context
849
+ context = HookSchedulingContext(
850
+ event_type=HookEvent.SESSION_START,
851
+ current_phase=Phase.SPEC,
852
+ user_input="Creating new specification for user authentication",
853
+ available_token_budget=10000,
854
+ max_execution_time_ms=1000.0,
855
+ )
856
+
857
+ # Schedule hooks
858
+ result = await scheduler.schedule_hooks(HookEvent.SESSION_START, context)
859
+
860
+ print(f"Scheduled {len(result.execution_plan)} execution groups")
861
+ print(f"Estimated time: {result.estimated_total_time_ms:.1f}ms")
862
+ print(f"Estimated tokens: {result.estimated_total_tokens}")
863
+ print(f"Strategy: {result.scheduling_strategy.value}")
864
+
865
+ # Show insights
866
+ insights = scheduler.get_phase_optimization_insights(Phase.SPEC)
867
+ print("\nPhase insights for SPEC:")
868
+ for rec in insights.get("optimization_recommendations", []):
869
+ print(f" - {rec}")
870
+
871
+ # Show statistics
872
+ stats = scheduler.get_scheduling_statistics()
873
+ print("\nScheduling statistics:")
874
+ print(f" Total schedules: {stats['total_schedules']}")
875
+ if stats.get("recommended_strategy"):
876
+ print(f" Recommended strategy: {stats['recommended_strategy']}")
877
+
878
+ # Run test
879
+ asyncio.run(test_phase_optimized_scheduler())