moai-adk 0.15.1__py3-none-any.whl → 0.25.4__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 (417) hide show
  1. moai_adk/__init__.py +1 -2
  2. moai_adk/__main__.py +85 -2
  3. moai_adk/cli/__init__.py +0 -1
  4. moai_adk/cli/commands/__init__.py +0 -1
  5. moai_adk/cli/commands/analyze.py +127 -0
  6. moai_adk/cli/commands/backup.py +5 -3
  7. moai_adk/cli/commands/doctor.py +35 -11
  8. moai_adk/cli/commands/improve_user_experience.py +348 -0
  9. moai_adk/cli/commands/init.py +150 -23
  10. moai_adk/cli/commands/language.py +269 -0
  11. moai_adk/cli/commands/migrate.py +158 -0
  12. moai_adk/cli/commands/status.py +13 -12
  13. moai_adk/cli/commands/update.py +364 -60
  14. moai_adk/cli/commands/validate_links.py +118 -0
  15. moai_adk/cli/main.py +3 -2
  16. moai_adk/cli/prompts/init_prompts.py +79 -82
  17. moai_adk/core/__init__.py +0 -1
  18. moai_adk/core/analysis/__init__.py +9 -0
  19. moai_adk/core/analysis/session_analyzer.py +439 -0
  20. moai_adk/core/claude_integration.py +421 -0
  21. moai_adk/core/command_helpers.py +270 -0
  22. moai_adk/core/config/__init__.py +6 -0
  23. moai_adk/core/config/auto_spec_config.py +346 -0
  24. moai_adk/core/config/migration.py +133 -12
  25. moai_adk/core/context_manager.py +279 -0
  26. moai_adk/core/diagnostics/slash_commands.py +0 -1
  27. moai_adk/core/error_recovery_system.py +1289 -0
  28. moai_adk/core/git/__init__.py +0 -1
  29. moai_adk/core/git/branch.py +0 -1
  30. moai_adk/core/git/branch_manager.py +4 -4
  31. moai_adk/core/git/checkpoint.py +1 -5
  32. moai_adk/core/git/commit.py +0 -1
  33. moai_adk/core/git/event_detector.py +3 -5
  34. moai_adk/core/git/manager.py +0 -1
  35. moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
  36. moai_adk/core/integration/__init__.py +22 -0
  37. moai_adk/core/integration/engine.py +169 -0
  38. moai_adk/core/integration/integration_tester.py +225 -0
  39. moai_adk/core/integration/models.py +88 -0
  40. moai_adk/core/integration/utils.py +211 -0
  41. moai_adk/core/issue_creator.py +28 -18
  42. moai_adk/core/language_config.py +202 -0
  43. moai_adk/core/language_validator.py +556 -0
  44. moai_adk/core/mcp/setup.py +113 -0
  45. moai_adk/core/migration/__init__.py +18 -0
  46. moai_adk/core/migration/backup_manager.py +208 -0
  47. moai_adk/core/migration/file_migrator.py +218 -0
  48. moai_adk/core/migration/version_detector.py +143 -0
  49. moai_adk/core/migration/version_migrator.py +228 -0
  50. moai_adk/core/performance/__init__.py +6 -0
  51. moai_adk/core/performance/cache_system.py +318 -0
  52. moai_adk/core/performance/parallel_processor.py +116 -0
  53. moai_adk/core/project/__init__.py +0 -1
  54. moai_adk/core/project/backup_utils.py +2 -7
  55. moai_adk/core/project/checker.py +3 -3
  56. moai_adk/core/project/detector.py +20 -40
  57. moai_adk/core/project/initializer.py +42 -17
  58. moai_adk/core/project/phase_executor.py +415 -58
  59. moai_adk/core/project/validator.py +6 -25
  60. moai_adk/core/quality/__init__.py +1 -1
  61. moai_adk/core/quality/trust_checker.py +64 -110
  62. moai_adk/core/quality/validators/__init__.py +1 -1
  63. moai_adk/core/quality/validators/base_validator.py +1 -1
  64. moai_adk/core/rollback_manager.py +993 -0
  65. moai_adk/core/session_manager.py +667 -0
  66. moai_adk/core/spec/confidence_scoring.py +749 -0
  67. moai_adk/core/spec/ears_template_engine.py +1182 -0
  68. moai_adk/core/spec/quality_validator.py +721 -0
  69. moai_adk/core/spec_status_manager.py +488 -0
  70. moai_adk/core/template/__init__.py +0 -1
  71. moai_adk/core/template/backup.py +41 -1
  72. moai_adk/core/template/config.py +11 -12
  73. moai_adk/core/template/languages.py +0 -1
  74. moai_adk/core/template/merger.py +79 -22
  75. moai_adk/core/template/processor.py +614 -40
  76. moai_adk/core/template_engine.py +36 -27
  77. moai_adk/foundation/git/commit_templates.py +565 -0
  78. moai_adk/foundation/trust/trust_principles.py +725 -0
  79. moai_adk/foundation/trust/validation_checklist.py +1678 -0
  80. moai_adk/statusline/__init__.py +38 -0
  81. moai_adk/statusline/alfred_detector.py +107 -0
  82. moai_adk/statusline/config.py +364 -0
  83. moai_adk/statusline/enhanced_output_style_detector.py +364 -0
  84. moai_adk/statusline/git_collector.py +190 -0
  85. moai_adk/statusline/main.py +228 -0
  86. moai_adk/statusline/metrics_tracker.py +78 -0
  87. moai_adk/statusline/renderer.py +327 -0
  88. moai_adk/statusline/update_checker.py +135 -0
  89. moai_adk/statusline/version_reader.py +647 -0
  90. moai_adk/templates/.git-hooks/pre-commit +66 -0
  91. moai_adk/templates/.git-hooks/pre-push +116 -4
  92. moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
  93. moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
  94. moai_adk/templates/.gitignore +44 -0
  95. moai_adk/templates/.mcp.json +22 -0
  96. moai_adk/templates/CLAUDE.md +450 -1071
  97. moai_adk/utils/__init__.py +0 -1
  98. moai_adk/utils/banner.py +0 -1
  99. moai_adk/utils/common.py +308 -0
  100. moai_adk/utils/link_validator.py +249 -0
  101. moai_adk/utils/logger.py +4 -9
  102. moai_adk/utils/safe_file_reader.py +210 -0
  103. moai_adk/utils/user_experience.py +531 -0
  104. moai_adk-0.25.4.dist-info/METADATA +2279 -0
  105. moai_adk-0.25.4.dist-info/RECORD +112 -0
  106. moai_adk/core/tags/__init__.py +0 -86
  107. moai_adk/core/tags/ci_validator.py +0 -463
  108. moai_adk/core/tags/cli.py +0 -283
  109. moai_adk/core/tags/generator.py +0 -109
  110. moai_adk/core/tags/inserter.py +0 -99
  111. moai_adk/core/tags/mapper.py +0 -126
  112. moai_adk/core/tags/parser.py +0 -76
  113. moai_adk/core/tags/pre_commit_validator.py +0 -393
  114. moai_adk/core/tags/reporter.py +0 -956
  115. moai_adk/core/tags/tags.py +0 -149
  116. moai_adk/core/tags/validator.py +0 -897
  117. moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
  118. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  119. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  120. moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
  121. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  122. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
  123. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  124. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
  125. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
  126. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  127. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  128. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
  129. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
  130. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
  131. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  132. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
  133. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
  134. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
  135. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
  136. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
  137. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  138. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
  139. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
  140. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
  141. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  142. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
  143. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
  144. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
  145. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
  146. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
  147. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  148. moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
  149. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  150. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
  151. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
  152. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  153. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  154. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
  155. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
  156. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
  157. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  158. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
  159. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
  160. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
  161. moai_adk/templates/.claude/settings.json +0 -144
  162. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
  163. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
  164. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
  165. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
  166. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
  167. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
  168. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
  169. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
  170. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
  171. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
  172. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
  173. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
  174. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  175. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  176. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  177. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
  178. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
  179. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
  180. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  181. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  182. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  183. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
  184. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
  185. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
  186. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  187. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  188. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  189. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
  190. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
  191. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
  192. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  193. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  194. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  195. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
  196. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
  197. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
  198. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
  199. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
  200. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
  201. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
  202. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
  203. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
  204. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
  205. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
  206. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
  207. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
  208. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
  209. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
  210. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
  211. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
  212. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
  213. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
  214. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
  215. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
  216. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
  217. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
  218. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
  219. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  220. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  221. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  222. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  223. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  224. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  225. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
  226. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
  227. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
  228. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  229. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  230. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  231. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
  232. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  233. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  234. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  235. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  236. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  237. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  238. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  239. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  240. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  241. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  242. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  243. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  244. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  245. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  246. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  247. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  248. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
  249. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
  250. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
  251. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
  252. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
  253. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  254. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
  255. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  256. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  257. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  258. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  259. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
  260. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  261. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
  262. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
  263. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
  264. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
  265. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
  266. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  267. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
  268. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
  269. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
  270. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  271. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  272. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
  273. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
  274. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
  275. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
  276. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  277. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  278. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  279. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  280. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  281. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  282. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  283. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  284. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
  285. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  286. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  287. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  288. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  289. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  290. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
  291. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  292. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  293. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  294. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  295. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  296. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  297. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  298. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  299. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  300. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  301. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  302. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  303. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  304. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  305. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  306. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  307. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  308. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  309. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  310. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  311. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  312. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  313. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  314. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  315. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  316. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  317. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  318. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  319. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  320. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  321. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  322. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  323. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  324. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  325. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  326. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  327. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  328. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  329. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  330. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  331. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  332. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  333. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  334. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  335. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  336. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  337. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  338. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  339. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  340. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  341. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  342. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  343. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  344. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  345. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  346. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  347. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
  348. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  349. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  350. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
  351. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  352. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  353. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  354. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  355. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  356. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  357. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  358. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  359. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
  360. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  361. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  362. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
  363. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  364. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  365. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  366. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  367. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  368. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  369. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  370. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  371. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
  372. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  373. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  374. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
  375. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  376. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  377. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  378. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  379. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  380. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  381. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  382. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  383. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  384. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  385. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  386. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
  387. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  388. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  389. moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
  390. moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
  391. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
  392. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
  393. moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
  394. moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
  395. moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
  396. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
  397. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
  398. moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
  399. moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
  400. moai_adk/templates/.github/workflows/release.yml +0 -118
  401. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
  402. moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
  403. moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
  404. moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
  405. moai_adk/templates/.github/workflows/tag-report.yml +0 -269
  406. moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
  407. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
  408. moai_adk/templates/.moai/config.json +0 -115
  409. moai_adk/templates/workflows/go-tag-validation.yml +0 -30
  410. moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
  411. moai_adk/templates/workflows/python-tag-validation.yml +0 -42
  412. moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
  413. moai_adk-0.15.1.dist-info/METADATA +0 -3094
  414. moai_adk-0.15.1.dist-info/RECORD +0 -365
  415. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
  416. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
  417. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1289 @@
1
+ """
2
+ Comprehensive Error Handling & Recovery System for Research Workflows
3
+
4
+ Provides:
5
+ - Error detection and classification
6
+ - Recovery procedures and fallback mechanisms
7
+ - Integration with research hooks, agents, and skills
8
+ - Documentation of error handling procedures
9
+ - Troubleshooting guides and automated recovery
10
+
11
+ Features:
12
+ - Multi-level error handling (critical, warning, info)
13
+ - Automatic recovery mechanisms
14
+ - Manual recovery procedures
15
+ - Error logging and tracking
16
+ - System health monitoring
17
+ - Emergency recovery procedures
18
+ """
19
+
20
+ import json
21
+ import logging
22
+ import sys
23
+ import threading
24
+ import time
25
+ import traceback
26
+ from dataclasses import asdict, dataclass
27
+ from datetime import datetime, timezone
28
+ from enum import Enum
29
+ from pathlib import Path
30
+ from typing import Any, Callable, Dict, List, Optional
31
+
32
+ # Configure comprehensive logging
33
+ logging.basicConfig(
34
+ level=logging.INFO,
35
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
36
+ handlers=[
37
+ logging.FileHandler("/tmp/moai_error_recovery.log"),
38
+ logging.StreamHandler(sys.stdout),
39
+ ],
40
+ )
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+
45
+ class ErrorSeverity(Enum):
46
+ """Error severity levels"""
47
+
48
+ CRITICAL = "critical" # System failure, immediate attention required
49
+ HIGH = "high" # Major functionality impacted
50
+ MEDIUM = "medium" # Partial functionality impacted
51
+ LOW = "low" # Minor issue, can be deferred
52
+ INFO = "info" # Informational message
53
+
54
+
55
+ class ErrorCategory(Enum):
56
+ """Error categories for classification"""
57
+
58
+ SYSTEM = "system" # System-level errors
59
+ CONFIGURATION = "configuration" # Configuration errors
60
+ RESEARCH = "research" # Research workflow errors
61
+ INTEGRATION = "integration" # Integration errors
62
+ COMMUNICATION = "communication" # Agent/communication errors
63
+ VALIDATION = "validation" # Validation errors
64
+ PERFORMANCE = "performance" # Performance issues
65
+ RESOURCE = "resource" # Resource exhaustion
66
+ NETWORK = "network" # Network-related errors
67
+ USER_INPUT = "user_input" # User input errors
68
+
69
+
70
+ @dataclass
71
+ class ErrorReport:
72
+ """Comprehensive error report structure"""
73
+
74
+ id: str
75
+ timestamp: datetime
76
+ severity: ErrorSeverity
77
+ category: ErrorCategory
78
+ message: str
79
+ details: Dict[str, Any]
80
+ stack_trace: Optional[str]
81
+ context: Dict[str, Any]
82
+ recovery_attempted: bool = False
83
+ recovery_successful: bool = False
84
+ resolution_message: Optional[str] = None
85
+
86
+
87
+ @dataclass
88
+ class RecoveryAction:
89
+ """Recovery action definition"""
90
+
91
+ name: str
92
+ description: str
93
+ action_type: str # "automatic", "manual", "assisted"
94
+ severity_filter: List[ErrorSeverity]
95
+ category_filter: List[ErrorCategory]
96
+ handler: Callable
97
+ timeout: Optional[float] = None
98
+ max_attempts: int = 3
99
+ success_criteria: Optional[str] = None
100
+
101
+
102
+ @dataclass
103
+ class RecoveryResult:
104
+ """Result of recovery action"""
105
+
106
+ success: bool
107
+ action_name: str
108
+ message: str
109
+ duration: float
110
+ details: Dict[str, Any] = None
111
+ next_actions: List[str] = None
112
+
113
+
114
+ class ErrorRecoverySystem:
115
+ """Comprehensive error handling and recovery system"""
116
+
117
+ def __init__(self, project_root: Path = None):
118
+ self.project_root = project_root or Path.cwd()
119
+ self.error_log_dir = self.project_root / ".moai" / "error_logs"
120
+ self.error_log_dir.mkdir(parents=True, exist_ok=True)
121
+
122
+ # Error tracking
123
+ self.active_errors: Dict[str, ErrorReport] = {}
124
+ self.error_history: List[ErrorReport] = []
125
+ self.recovery_actions: Dict[str, RecoveryAction] = {}
126
+ self.error_stats: Dict[str, Any] = {
127
+ "total_errors": 0,
128
+ "by_severity": {},
129
+ "by_category": {},
130
+ "recovery_success_rate": 0.0,
131
+ }
132
+
133
+ # System health monitoring
134
+ self.system_health = {
135
+ "status": "healthy",
136
+ "last_check": datetime.now(timezone.utc),
137
+ "issues": [],
138
+ "metrics": {},
139
+ }
140
+
141
+ # Initialize recovery actions
142
+ self._initialize_recovery_actions()
143
+
144
+ # Background monitoring thread
145
+ self.monitoring_active = True
146
+ self.monitor_thread = threading.Thread(
147
+ target=self._background_monitoring, daemon=True
148
+ )
149
+ self.monitor_thread.start()
150
+
151
+ logger.info("Error Recovery System initialized")
152
+
153
+ def handle_error(
154
+ self,
155
+ error: Exception,
156
+ context: Dict[str, Any] = None,
157
+ severity: ErrorSeverity = ErrorSeverity.MEDIUM,
158
+ category: ErrorCategory = ErrorCategory.SYSTEM,
159
+ ) -> ErrorReport:
160
+ """
161
+ Handle an error with comprehensive logging and recovery
162
+
163
+ Args:
164
+ error: Exception that occurred
165
+ context: Additional context information
166
+ severity: Error severity level
167
+ category: Error category
168
+
169
+ Returns:
170
+ ErrorReport with handling details
171
+ """
172
+ error_id = self._generate_error_id()
173
+ timestamp = datetime.now(timezone.utc)
174
+
175
+ # Create error report
176
+ error_report = ErrorReport(
177
+ id=error_id,
178
+ timestamp=timestamp,
179
+ severity=severity,
180
+ category=category,
181
+ message=str(error),
182
+ details={
183
+ "exception_type": type(error).__name__,
184
+ "exception_module": type(error).__module__,
185
+ "error_code": getattr(error, "code", None),
186
+ },
187
+ stack_trace=traceback.format_exc(),
188
+ context=context or {},
189
+ recovery_attempted=False,
190
+ recovery_successful=False,
191
+ )
192
+
193
+ # Log error
194
+ self._log_error(error_report)
195
+
196
+ # Update statistics
197
+ self._update_error_stats(error_report)
198
+
199
+ # Store error
200
+ self.active_errors[error_id] = error_report
201
+ self.error_history.append(error_report)
202
+
203
+ # Attempt automatic recovery
204
+ if severity in [ErrorSeverity.CRITICAL, ErrorSeverity.HIGH]:
205
+ recovery_result = self._attempt_automatic_recovery(error_report)
206
+ error_report.recovery_attempted = True
207
+ error_report.recovery_successful = recovery_result.success
208
+ error_report.resolution_message = recovery_result.message
209
+
210
+ if recovery_result.success:
211
+ logger.info(f"Automatic recovery successful for error {error_id}")
212
+ self.active_errors.pop(error_id, None)
213
+ else:
214
+ logger.warning(
215
+ f"Automatic recovery failed for error {error_id}: {recovery_result.message}"
216
+ )
217
+
218
+ # Update system health
219
+ self._update_system_health()
220
+
221
+ return error_report
222
+
223
+ def register_recovery_action(self, action: RecoveryAction):
224
+ """
225
+ Register a new recovery action
226
+
227
+ Args:
228
+ action: RecoveryAction definition
229
+ """
230
+ self.recovery_actions[action.name] = action
231
+ logger.info(f"Registered recovery action: {action.name}")
232
+
233
+ def attempt_manual_recovery(
234
+ self, error_id: str, action_name: str, parameters: Dict[str, Any] = None
235
+ ) -> RecoveryResult:
236
+ """
237
+ Attempt manual recovery for a specific error
238
+
239
+ Args:
240
+ error_id: ID of error to recover
241
+ action_name: Name of recovery action to attempt
242
+ parameters: Additional parameters for recovery
243
+
244
+ Returns:
245
+ RecoveryResult with operation details
246
+ """
247
+ if error_id not in self.active_errors:
248
+ return RecoveryResult(
249
+ success=False,
250
+ action_name=action_name,
251
+ message=f"Error {error_id} not found in active errors",
252
+ )
253
+
254
+ if action_name not in self.recovery_actions:
255
+ return RecoveryResult(
256
+ success=False,
257
+ action_name=action_name,
258
+ message=f"Recovery action {action_name} not found",
259
+ )
260
+
261
+ error_report = self.active_errors[error_id]
262
+ recovery_action = self.recovery_actions[action_name]
263
+
264
+ logger.info(f"Attempting manual recovery {action_name} for error {error_id}")
265
+
266
+ try:
267
+ start_time = time.time()
268
+
269
+ # Execute recovery action
270
+ result = recovery_action.handler(error_report, parameters or {})
271
+
272
+ duration = time.time() - start_time
273
+
274
+ if result:
275
+ recovery_result = RecoveryResult(
276
+ success=True,
277
+ action_name=action_name,
278
+ message="Manual recovery completed successfully",
279
+ duration=duration,
280
+ details={"result": result},
281
+ )
282
+
283
+ # Update error report
284
+ error_report.recovery_successful = True
285
+ error_report.resolution_message = recovery_result.message
286
+
287
+ # Remove from active errors
288
+ self.active_errors.pop(error_id, None)
289
+
290
+ else:
291
+ recovery_result = RecoveryResult(
292
+ success=False,
293
+ action_name=action_name,
294
+ message="Manual recovery returned unsuccessful result",
295
+ duration=duration,
296
+ )
297
+
298
+ except Exception as e:
299
+ duration = time.time() - start_time
300
+ recovery_result = RecoveryResult(
301
+ success=False,
302
+ action_name=action_name,
303
+ message=f"Manual recovery failed: {str(e)}",
304
+ duration=duration,
305
+ details={"exception": str(e)},
306
+ )
307
+
308
+ return recovery_result
309
+
310
+ def get_system_health(self) -> Dict[str, Any]:
311
+ """
312
+ Get current system health status
313
+
314
+ Returns:
315
+ System health information
316
+ """
317
+ self._update_system_health()
318
+
319
+ return {
320
+ "status": self.system_health["status"],
321
+ "last_check": self.system_health["last_check"].isoformat(),
322
+ "active_errors": len(self.active_errors),
323
+ "total_errors": len(self.error_history),
324
+ "error_stats": self.error_stats.copy(),
325
+ "issues": self.system_health["issues"].copy(),
326
+ "metrics": self.system_health["metrics"].copy(),
327
+ "recovery_actions_available": len(self.recovery_actions),
328
+ }
329
+
330
+ def get_error_summary(self, limit: int = 50) -> Dict[str, Any]:
331
+ """
332
+ Get summary of recent errors
333
+
334
+ Args:
335
+ limit: Maximum number of errors to include
336
+
337
+ Returns:
338
+ Error summary information
339
+ """
340
+ recent_errors = self.error_history[-limit:]
341
+
342
+ # Categorize errors
343
+ by_severity = {}
344
+ by_category = {}
345
+
346
+ for error in recent_errors:
347
+ # By severity
348
+ severity = error.severity.value
349
+ if severity not in by_severity:
350
+ by_severity[severity] = []
351
+ by_severity[severity].append(error.id)
352
+
353
+ # By category
354
+ category = error.category.value
355
+ if category not in by_category:
356
+ by_category[category] = []
357
+ by_category[category].append(error.id)
358
+
359
+ # Common error patterns
360
+ error_patterns = self._identify_error_patterns(recent_errors)
361
+
362
+ return {
363
+ "total_recent_errors": len(recent_errors),
364
+ "active_errors": len(self.active_errors),
365
+ "by_severity": {k: len(v) for k, v in by_severity.items()},
366
+ "by_category": {k: len(v) for k, v in by_category.items()},
367
+ "common_patterns": error_patterns,
368
+ "recovery_rate": self._calculate_recovery_rate(recent_errors),
369
+ "recent_errors": [
370
+ {
371
+ "id": error.id,
372
+ "timestamp": error.timestamp.isoformat(),
373
+ "severity": error.severity.value,
374
+ "category": error.category.value,
375
+ "message": error.message,
376
+ "recovered": error.recovery_successful,
377
+ }
378
+ for error in recent_errors[-10:] # Last 10 errors
379
+ ],
380
+ }
381
+
382
+ def generate_troubleshooting_guide(self) -> Dict[str, Any]:
383
+ """
384
+ Generate troubleshooting guide based on error history
385
+
386
+ Returns:
387
+ Troubleshooting guide with solutions
388
+ """
389
+ guide = {
390
+ "generated_at": datetime.now(timezone.utc).isoformat(),
391
+ "common_issues": [],
392
+ "recovery_procedures": {},
393
+ "prevention_tips": [],
394
+ "emergency_procedures": [],
395
+ }
396
+
397
+ # Analyze common issues
398
+ error_patterns = self._identify_error_patterns(self.error_history)
399
+ for pattern, frequency in error_patterns.items():
400
+ if frequency > 2: # Issues that occurred more than twice
401
+ guide["common_issues"].append(
402
+ {
403
+ "pattern": pattern,
404
+ "frequency": frequency,
405
+ "severity": self._get_pattern_severity(pattern),
406
+ "solutions": self._get_solutions_for_pattern(pattern),
407
+ }
408
+ )
409
+
410
+ # Generate recovery procedures
411
+ for action_name, action in self.recovery_actions.items():
412
+ guide["recovery_procedures"][action_name] = {
413
+ "description": action.description,
414
+ "type": action.action_type,
415
+ "for_severities": [s.value for s in action.severity_filter],
416
+ "for_categories": [c.value for c in action.category_filter],
417
+ }
418
+
419
+ # Prevention tips
420
+ guide["prevention_tips"] = self._generate_prevention_tips()
421
+
422
+ # Emergency procedures
423
+ guide["emergency_procedures"] = self._generate_emergency_procedures()
424
+
425
+ return guide
426
+
427
+ def cleanup_old_errors(self, days_to_keep: int = 30) -> Dict[str, Any]:
428
+ """
429
+ Clean up old error records
430
+
431
+ Args:
432
+ days_to_keep: Number of days to keep error records
433
+
434
+ Returns:
435
+ Cleanup operation results
436
+ """
437
+ cutoff_date = datetime.now(timezone.utc) - timedelta(days=days_to_keep)
438
+
439
+ old_errors = [e for e in self.error_history if e.timestamp < cutoff_date]
440
+ removed_count = len(old_errors)
441
+
442
+ # Keep only recent errors
443
+ self.error_history = [
444
+ e for e in self.error_history if e.timestamp >= cutoff_date
445
+ ]
446
+
447
+ # Save updated error history
448
+ self._save_error_history()
449
+
450
+ logger.info(f"Cleaned up {removed_count} old error records")
451
+
452
+ return {
453
+ "removed_count": removed_count,
454
+ "remaining_count": len(self.error_history),
455
+ "cutoff_date": cutoff_date.isoformat(),
456
+ }
457
+
458
+ def _initialize_recovery_actions(self):
459
+ """Initialize default recovery actions"""
460
+ # System recovery actions
461
+ self.register_recovery_action(
462
+ RecoveryAction(
463
+ name="restart_research_engines",
464
+ description="Restart research engines and clear caches",
465
+ action_type="automatic",
466
+ severity_filter=[ErrorSeverity.HIGH, ErrorSeverity.CRITICAL],
467
+ category_filter=[ErrorCategory.RESEARCH, ErrorCategory.SYSTEM],
468
+ handler=self._restart_research_engines,
469
+ timeout=30.0,
470
+ )
471
+ )
472
+
473
+ self.register_recovery_action(
474
+ RecoveryAction(
475
+ name="restore_config_backup",
476
+ description="Restore configuration from last known good backup",
477
+ action_type="automatic",
478
+ severity_filter=[ErrorSeverity.CRITICAL],
479
+ category_filter=[ErrorCategory.CONFIGURATION],
480
+ handler=self._restore_config_backup,
481
+ timeout=15.0,
482
+ )
483
+ )
484
+
485
+ self.register_recovery_action(
486
+ RecoveryAction(
487
+ name="clear_agent_cache",
488
+ description="Clear agent communication cache and reset connections",
489
+ action_type="automatic",
490
+ severity_filter=[ErrorSeverity.MEDIUM, ErrorSeverity.HIGH],
491
+ category_filter=[ErrorCategory.COMMUNICATION],
492
+ handler=self._clear_agent_cache,
493
+ timeout=10.0,
494
+ )
495
+ )
496
+
497
+ self.register_recovery_action(
498
+ RecoveryAction(
499
+ name="validate_research_integrity",
500
+ description="Validate research component integrity and repair if needed",
501
+ action_type="assisted",
502
+ severity_filter=[ErrorSeverity.HIGH],
503
+ category_filter=[ErrorCategory.RESEARCH, ErrorCategory.VALIDATION],
504
+ handler=self._validate_research_integrity,
505
+ timeout=60.0,
506
+ )
507
+ )
508
+
509
+ self.register_recovery_action(
510
+ RecoveryAction(
511
+ name="rollback_last_changes",
512
+ description="Rollback last research integration changes",
513
+ action_type="manual",
514
+ severity_filter=[ErrorSeverity.CRITICAL],
515
+ category_filter=[ErrorCategory.INTEGRATION, ErrorCategory.RESEARCH],
516
+ handler=self._rollback_last_changes,
517
+ timeout=45.0,
518
+ )
519
+ )
520
+
521
+ self.register_recovery_action(
522
+ RecoveryAction(
523
+ name="reset_system_state",
524
+ description="Reset system to known good state",
525
+ action_type="manual",
526
+ severity_filter=[ErrorSeverity.CRITICAL],
527
+ category_filter=[ErrorCategory.SYSTEM],
528
+ handler=self._reset_system_state,
529
+ timeout=120.0,
530
+ )
531
+ )
532
+
533
+ # Performance recovery actions
534
+ self.register_recovery_action(
535
+ RecoveryAction(
536
+ name="optimize_performance",
537
+ description="Optimize system performance and clear bottlenecks",
538
+ action_type="automatic",
539
+ severity_filter=[ErrorSeverity.MEDIUM],
540
+ category_filter=[ErrorCategory.PERFORMANCE],
541
+ handler=self._optimize_performance,
542
+ timeout=30.0,
543
+ )
544
+ )
545
+
546
+ # Resource recovery actions
547
+ self.register_recovery_action(
548
+ RecoveryAction(
549
+ name="free_resources",
550
+ description="Free up system resources and memory",
551
+ action_type="automatic",
552
+ severity_filter=[ErrorSeverity.MEDIUM, ErrorSeverity.HIGH],
553
+ category_filter=[ErrorCategory.RESOURCE],
554
+ handler=self._free_resources,
555
+ timeout=20.0,
556
+ )
557
+ )
558
+
559
+ def _attempt_automatic_recovery(self, error_report: ErrorReport) -> RecoveryResult:
560
+ """Attempt automatic recovery for an error"""
561
+ suitable_actions = []
562
+
563
+ # Find suitable recovery actions
564
+ for action_name, action in self.recovery_actions.items():
565
+ if (
566
+ action.action_type == "automatic"
567
+ and error_report.severity in action.severity_filter
568
+ and error_report.category in action.category_filter
569
+ ):
570
+ suitable_actions.append(action)
571
+
572
+ # Try actions in order of priority
573
+ for action in suitable_actions:
574
+ try:
575
+ logger.info(f"Attempting automatic recovery: {action.name}")
576
+
577
+ start_time = time.time()
578
+ result = action.handler(error_report, {})
579
+ duration = time.time() - start_time
580
+
581
+ if result:
582
+ return RecoveryResult(
583
+ success=True,
584
+ action_name=action.name,
585
+ message=f"Automatic recovery successful: {action.name}",
586
+ duration=duration,
587
+ details={"result": result},
588
+ )
589
+
590
+ except Exception as e:
591
+ logger.warning(f"Recovery action {action.name} failed: {str(e)}")
592
+ continue
593
+
594
+ return RecoveryResult(
595
+ success=False,
596
+ action_name="none",
597
+ message="No suitable automatic recovery action succeeded",
598
+ )
599
+
600
+ def _restart_research_engines(
601
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
602
+ ) -> bool:
603
+ """Restart research engines and clear caches"""
604
+ try:
605
+ logger.info("Restarting research engines...")
606
+
607
+ # Clear research engine caches
608
+ cache_dirs = [
609
+ self.project_root / ".moai" / "cache",
610
+ self.project_root / ".claude" / "cache",
611
+ ]
612
+
613
+ for cache_dir in cache_dirs:
614
+ if cache_dir.exists():
615
+ import shutil
616
+
617
+ shutil.rmtree(cache_dir)
618
+ cache_dir.mkdir(parents=True, exist_ok=True)
619
+
620
+ # Reset research engine state
621
+ research_state_file = self.project_root / ".moai" / "research_state.json"
622
+ if research_state_file.exists():
623
+ research_state_file.unlink()
624
+
625
+ # Reinitialize research components
626
+ self._reinitialize_research_components()
627
+
628
+ logger.info("Research engines restarted successfully")
629
+ return True
630
+
631
+ except Exception as e:
632
+ logger.error(f"Failed to restart research engines: {str(e)}")
633
+ return False
634
+
635
+ def _restore_config_backup(
636
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
637
+ ) -> bool:
638
+ """Restore configuration from backup"""
639
+ try:
640
+ logger.info("Restoring configuration from backup...")
641
+
642
+ backup_dir = self.project_root / ".moai" / "config_backups"
643
+ if not backup_dir.exists():
644
+ logger.warning("No configuration backup directory found")
645
+ return False
646
+
647
+ # Find most recent backup
648
+ backup_files = list(backup_dir.glob("config_*.json"))
649
+ if not backup_files:
650
+ logger.warning("No configuration backups found")
651
+ return False
652
+
653
+ latest_backup = max(backup_files, key=lambda f: f.stat().st_mtime)
654
+
655
+ # Restore configuration
656
+ config_file = self.project_root / ".moai" / "config" / "config.json"
657
+ import shutil
658
+
659
+ shutil.copy2(latest_backup, config_file)
660
+
661
+ logger.info(f"Configuration restored from {latest_backup}")
662
+ return True
663
+
664
+ except Exception as e:
665
+ logger.error(f"Failed to restore configuration: {str(e)}")
666
+ return False
667
+
668
+ def _clear_agent_cache(
669
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
670
+ ) -> bool:
671
+ """Clear agent communication cache"""
672
+ try:
673
+ logger.info("Clearing agent cache...")
674
+
675
+ # Clear agent state files
676
+ agent_state_dir = self.project_root / ".moai" / "agent_state"
677
+ if agent_state_dir.exists():
678
+ import shutil
679
+
680
+ shutil.rmtree(agent_state_dir)
681
+ agent_state_dir.mkdir(parents=True, exist_ok=True)
682
+
683
+ # Reset communication channels
684
+ comm_cache_dir = self.project_root / ".moai" / "comm_cache"
685
+ if comm_cache_dir.exists():
686
+ import shutil
687
+
688
+ shutil.rmtree(comm_cache_dir)
689
+ comm_cache_dir.mkdir(parents=True, exist_ok=True)
690
+
691
+ logger.info("Agent cache cleared successfully")
692
+ return True
693
+
694
+ except Exception as e:
695
+ logger.error(f"Failed to clear agent cache: {str(e)}")
696
+ return False
697
+
698
+ def _validate_research_integrity(
699
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
700
+ ) -> Dict[str, Any]:
701
+ """Validate research component integrity"""
702
+ validation_results = {
703
+ "skills_valid": True,
704
+ "agents_valid": True,
705
+ "commands_valid": True,
706
+ "hooks_valid": True,
707
+ "issues_found": [],
708
+ "repairs_made": [],
709
+ }
710
+
711
+ try:
712
+ logger.info("Validating research integrity...")
713
+
714
+ # Validate skills
715
+ skills_dir = self.project_root / ".claude" / "skills"
716
+ if skills_dir.exists():
717
+ for skill_file in skills_dir.glob("*.md"):
718
+ if not self._validate_skill_file(skill_file):
719
+ validation_results["skills_valid"] = False
720
+ validation_results["issues_found"].append(
721
+ f"Invalid skill file: {skill_file}"
722
+ )
723
+
724
+ # Attempt repair
725
+ if self._repair_skill_file(skill_file):
726
+ validation_results["repairs_made"].append(
727
+ f"Repaired: {skill_file}"
728
+ )
729
+
730
+ # Validate agents
731
+ agents_dir = self.project_root / ".claude" / "agents" / "alfred"
732
+ if agents_dir.exists():
733
+ for agent_file in agents_dir.glob("*.md"):
734
+ if not self._validate_agent_file(agent_file):
735
+ validation_results["agents_valid"] = False
736
+ validation_results["issues_found"].append(
737
+ f"Invalid agent file: {agent_file}"
738
+ )
739
+
740
+ # Validate commands
741
+ commands_dir = self.project_root / ".claude" / "commands" / "alfred"
742
+ if commands_dir.exists():
743
+ for command_file in commands_dir.glob("*.md"):
744
+ if not self._validate_command_file(command_file):
745
+ validation_results["commands_valid"] = False
746
+ validation_results["issues_found"].append(
747
+ f"Invalid command file: {command_file}"
748
+ )
749
+
750
+ logger.info(
751
+ f"Research integrity validation completed. Issues: {len(validation_results['issues_found'])}, Repairs: {len(validation_results['repairs_made'])}"
752
+ )
753
+
754
+ except Exception as e:
755
+ logger.error(f"Research integrity validation failed: {str(e)}")
756
+ validation_results["validation_error"] = str(e)
757
+
758
+ return validation_results
759
+
760
+ def _rollback_last_changes(
761
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
762
+ ) -> bool:
763
+ """Rollback last research integration changes"""
764
+ try:
765
+ logger.info("Rolling back last research changes...")
766
+
767
+ # Import rollback manager
768
+ sys.path.insert(0, str(self.project_root / "src"))
769
+ from moai_adk.core.rollback_manager import RollbackManager
770
+
771
+ rollback_manager = RollbackManager(self.project_root)
772
+
773
+ # Find latest rollback point for research integration
774
+ rollback_points = rollback_manager.list_rollback_points(limit=5)
775
+ if not rollback_points:
776
+ logger.warning("No rollback points available")
777
+ return False
778
+
779
+ # Use the most recent rollback point
780
+ latest_rollback = rollback_points[0]
781
+ result = rollback_manager.rollback_to_point(latest_rollback["id"])
782
+
783
+ if result.success:
784
+ logger.info(f"Successfully rolled back to {latest_rollback['id']}")
785
+ return True
786
+ else:
787
+ logger.error(f"Rollback failed: {result.message}")
788
+ return False
789
+
790
+ except Exception as e:
791
+ logger.error(f"Rollback operation failed: {str(e)}")
792
+ return False
793
+
794
+ def _reset_system_state(
795
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
796
+ ) -> bool:
797
+ """Reset system to known good state"""
798
+ try:
799
+ logger.info("Resetting system to known good state...")
800
+
801
+ # Clear all caches
802
+ cache_dirs = [
803
+ self.project_root / ".moai" / "cache",
804
+ self.project_root / ".claude" / "cache",
805
+ self.project_root / ".moai" / "agent_state",
806
+ self.project_root / ".moai" / "comm_cache",
807
+ ]
808
+
809
+ for cache_dir in cache_dirs:
810
+ if cache_dir.exists():
811
+ import shutil
812
+
813
+ shutil.rmtree(cache_dir)
814
+ cache_dir.mkdir(parents=True, exist_ok=True)
815
+
816
+ # Reset error state
817
+ self.active_errors.clear()
818
+
819
+ # Reinitialize core components
820
+ self._reinitialize_core_components()
821
+
822
+ logger.info("System state reset completed")
823
+ return True
824
+
825
+ except Exception as e:
826
+ logger.error(f"System state reset failed: {str(e)}")
827
+ return False
828
+
829
+ def _optimize_performance(
830
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
831
+ ) -> bool:
832
+ """Optimize system performance"""
833
+ try:
834
+ logger.info("Optimizing system performance...")
835
+
836
+ # Clear temporary files
837
+ temp_dirs = [
838
+ self.project_root / ".moai" / "temp",
839
+ self.project_root / ".claude" / "temp",
840
+ ]
841
+
842
+ for temp_dir in temp_dirs:
843
+ if temp_dir.exists():
844
+ import shutil
845
+
846
+ shutil.rmtree(temp_dir)
847
+
848
+ # Optimize database connections if applicable
849
+ self._optimize_connections()
850
+
851
+ # Clear memory caches
852
+ import gc
853
+
854
+ gc.collect()
855
+
856
+ logger.info("Performance optimization completed")
857
+ return True
858
+
859
+ except Exception as e:
860
+ logger.error(f"Performance optimization failed: {str(e)}")
861
+ return False
862
+
863
+ def _free_resources(
864
+ self, error_report: ErrorReport, parameters: Dict[str, Any]
865
+ ) -> bool:
866
+ """Free up system resources"""
867
+ try:
868
+ logger.info("Freeing up system resources...")
869
+
870
+ # Clear memory caches
871
+ import gc
872
+
873
+ gc.collect()
874
+
875
+ # Close any open file handles
876
+ self._close_file_handles()
877
+
878
+ # Terminate any hanging processes
879
+ self._terminate_hanging_processes()
880
+
881
+ logger.info("Resource cleanup completed")
882
+ return True
883
+
884
+ except Exception as e:
885
+ logger.error(f"Resource cleanup failed: {str(e)}")
886
+ return False
887
+
888
+ def _generate_error_id(self) -> str:
889
+ """Generate unique error ID"""
890
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
891
+ random_suffix = hashlib.md5(os.urandom(4)).hexdigest()[:6]
892
+ return f"ERR_{timestamp}_{random_suffix}"
893
+
894
+ def _log_error(self, error_report: ErrorReport):
895
+ """Log error to file and system"""
896
+ # Log to file
897
+ error_file = self.error_log_dir / f"error_{error_report.id}.json"
898
+ try:
899
+ with open(error_file, "w") as f:
900
+ json.dump(asdict(error_report), f, indent=2, default=str)
901
+ except Exception as e:
902
+ logger.error(f"Failed to log error to file: {str(e)}")
903
+
904
+ # Log to system
905
+ log_level = {
906
+ ErrorSeverity.CRITICAL: logging.CRITICAL,
907
+ ErrorSeverity.HIGH: logging.ERROR,
908
+ ErrorSeverity.MEDIUM: logging.WARNING,
909
+ ErrorSeverity.LOW: logging.INFO,
910
+ ErrorSeverity.INFO: logging.INFO,
911
+ }.get(error_report.severity, logging.WARNING)
912
+
913
+ logger.log(log_level, f"Error {error_report.id}: {error_report.message}")
914
+
915
+ def _update_error_stats(self, error_report: ErrorReport):
916
+ """Update error statistics"""
917
+ self.error_stats["total_errors"] += 1
918
+
919
+ # By severity
920
+ severity = error_report.severity.value
921
+ if severity not in self.error_stats["by_severity"]:
922
+ self.error_stats["by_severity"][severity] = 0
923
+ self.error_stats["by_severity"][severity] += 1
924
+
925
+ # By category
926
+ category = error_report.category.value
927
+ if category not in self.error_stats["by_category"]:
928
+ self.error_stats["by_category"][category] = 0
929
+ self.error_stats["by_category"][category] += 1
930
+
931
+ def _update_system_health(self):
932
+ """Update system health status"""
933
+ current_time = datetime.now(timezone.utc)
934
+
935
+ # Determine system status
936
+ critical_errors = [
937
+ e
938
+ for e in self.active_errors.values()
939
+ if e.severity == ErrorSeverity.CRITICAL
940
+ ]
941
+ high_errors = [
942
+ e for e in self.active_errors.values() if e.severity == ErrorSeverity.HIGH
943
+ ]
944
+
945
+ if critical_errors:
946
+ self.system_health["status"] = "critical"
947
+ elif high_errors:
948
+ self.system_health["status"] = "degraded"
949
+ elif len(self.active_errors) > 5:
950
+ self.system_health["status"] = "warning"
951
+ else:
952
+ self.system_health["status"] = "healthy"
953
+
954
+ # Update metrics
955
+ self.system_health["last_check"] = current_time
956
+ self.system_health["metrics"] = {
957
+ "active_errors": len(self.active_errors),
958
+ "total_errors": len(self.error_history),
959
+ "recovery_success_rate": self._calculate_recovery_rate(self.error_history),
960
+ }
961
+
962
+ # Identify issues
963
+ self.system_health["issues"] = [
964
+ {
965
+ "type": "active_errors",
966
+ "count": len(self.active_errors),
967
+ "severity_distribution": {
968
+ severity: len(
969
+ [
970
+ e
971
+ for e in self.active_errors.values()
972
+ if e.severity.value == severity
973
+ ]
974
+ )
975
+ for severity in set(
976
+ e.severity.value for e in self.active_errors.values()
977
+ )
978
+ },
979
+ }
980
+ ]
981
+
982
+ def _background_monitoring(self):
983
+ """Background monitoring thread"""
984
+ while self.monitoring_active:
985
+ try:
986
+ # Check system health every 30 seconds
987
+ time.sleep(30)
988
+ self._update_system_health()
989
+
990
+ # Check for error patterns that need attention
991
+ self._check_error_patterns()
992
+
993
+ except Exception as e:
994
+ logger.error(f"Background monitoring error: {str(e)}")
995
+
996
+ def _check_error_patterns(self):
997
+ """Check for concerning error patterns"""
998
+ recent_errors = [
999
+ e
1000
+ for e in self.error_history
1001
+ if (datetime.now(timezone.utc) - e.timestamp).total_seconds() < 300
1002
+ ] # Last 5 minutes
1003
+
1004
+ # Check for error bursts
1005
+ if len(recent_errors) > 10:
1006
+ logger.warning(
1007
+ f"High error rate detected: {len(recent_errors)} errors in last 5 minutes"
1008
+ )
1009
+
1010
+ # Check for repeated errors
1011
+ error_messages = [e.message for e in recent_errors]
1012
+ message_counts = {}
1013
+ for msg in error_messages:
1014
+ message_counts[msg] = message_counts.get(msg, 0) + 1
1015
+
1016
+ repeated_errors = [msg for msg, count in message_counts.items() if count > 3]
1017
+ if repeated_errors:
1018
+ logger.warning(f"Repeated errors detected: {repeated_errors}")
1019
+
1020
+ def _calculate_recovery_rate(self, errors: List[ErrorReport]) -> float:
1021
+ """Calculate recovery success rate"""
1022
+ if not errors:
1023
+ return 0.0
1024
+
1025
+ recovered_errors = [e for e in errors if e.recovery_successful]
1026
+ return len(recovered_errors) / len(errors)
1027
+
1028
+ def _identify_error_patterns(self, errors: List[ErrorReport]) -> Dict[str, int]:
1029
+ """Identify common error patterns"""
1030
+ patterns = {}
1031
+
1032
+ for error in errors:
1033
+ # Pattern by exception type
1034
+ pattern = f"{error.category.value}:{error.details.get('exception_type', 'unknown')}"
1035
+ patterns[pattern] = patterns.get(pattern, 0) + 1
1036
+
1037
+ return patterns
1038
+
1039
+ def _get_pattern_severity(self, pattern: str) -> str:
1040
+ """Get typical severity for an error pattern"""
1041
+ severity_map = {
1042
+ "research:Exception": "high",
1043
+ "system:Exception": "critical",
1044
+ "configuration:Exception": "high",
1045
+ "communication:Exception": "medium",
1046
+ "validation:Exception": "medium",
1047
+ }
1048
+
1049
+ for key, severity in severity_map.items():
1050
+ if key in pattern:
1051
+ return severity
1052
+
1053
+ return "medium"
1054
+
1055
+ def _get_solutions_for_pattern(self, pattern: str) -> List[str]:
1056
+ """Get common solutions for error pattern"""
1057
+ solutions = {
1058
+ "research:Exception": [
1059
+ "Restart research engines",
1060
+ "Clear research cache",
1061
+ "Validate research components",
1062
+ ],
1063
+ "system:Exception": [
1064
+ "Check system resources",
1065
+ "Restart system components",
1066
+ "Verify system configuration",
1067
+ ],
1068
+ "configuration:Exception": [
1069
+ "Restore configuration backup",
1070
+ "Validate configuration syntax",
1071
+ "Check configuration permissions",
1072
+ ],
1073
+ }
1074
+
1075
+ for key, sols in solutions.items():
1076
+ if key in pattern:
1077
+ return sols
1078
+
1079
+ return ["Contact system administrator", "Check system logs"]
1080
+
1081
+ def _generate_prevention_tips(self) -> List[str]:
1082
+ """Generate prevention tips based on error history"""
1083
+ tips = []
1084
+
1085
+ # Add tips based on common error categories
1086
+ category_counts = {}
1087
+ for error in self.error_history:
1088
+ category = error.category.value
1089
+ category_counts[category] = category_counts.get(category, 0) + 1
1090
+
1091
+ if category_counts.get("configuration", 0) > 5:
1092
+ tips.append("Regularly validate configuration files before making changes")
1093
+
1094
+ if category_counts.get("research", 0) > 5:
1095
+ tips.append(
1096
+ "Monitor research engine performance and clear caches regularly"
1097
+ )
1098
+
1099
+ if category_counts.get("communication", 0) > 5:
1100
+ tips.append("Ensure stable network connections for agent communication")
1101
+
1102
+ return tips
1103
+
1104
+ def _generate_emergency_procedures(self) -> List[Dict[str, str]]:
1105
+ """Generate emergency recovery procedures"""
1106
+ return [
1107
+ {
1108
+ "condition": "System completely unresponsive",
1109
+ "procedure": "Use system_reset recovery action to restore to known good state",
1110
+ },
1111
+ {
1112
+ "condition": "Critical research engine failure",
1113
+ "procedure": "Rollback last research changes using rollback_last_changes action",
1114
+ },
1115
+ {
1116
+ "condition": "Configuration corruption",
1117
+ "procedure": "Restore configuration from backup using restore_config_backup action",
1118
+ },
1119
+ {
1120
+ "condition": "Multiple agent communication failures",
1121
+ "procedure": "Clear agent cache and restart communication channels",
1122
+ },
1123
+ ]
1124
+
1125
+ # Helper methods for component validation and repair
1126
+ def _validate_skill_file(self, skill_file: Path) -> bool:
1127
+ """Validate skill file format"""
1128
+ try:
1129
+ with open(skill_file, "r", encoding="utf-8") as f:
1130
+ content = f.read()
1131
+
1132
+ # Basic validation
1133
+ return "---" in content and len(content) > 100
1134
+ except:
1135
+ return False
1136
+
1137
+ def _validate_agent_file(self, agent_file: Path) -> bool:
1138
+ """Validate agent file format"""
1139
+ try:
1140
+ with open(agent_file, "r", encoding="utf-8") as f:
1141
+ content = f.read()
1142
+
1143
+ return "role:" in content and len(content) > 200
1144
+ except:
1145
+ return False
1146
+
1147
+ def _validate_command_file(self, command_file: Path) -> bool:
1148
+ """Validate command file format"""
1149
+ try:
1150
+ with open(command_file, "r", encoding="utf-8") as f:
1151
+ content = f.read()
1152
+
1153
+ return "name:" in content and "allowed-tools:" in content
1154
+ except:
1155
+ return False
1156
+
1157
+ def _repair_skill_file(self, skill_file: Path) -> bool:
1158
+ """Attempt to repair skill file"""
1159
+ try:
1160
+ # Basic repair - ensure file has minimum required content
1161
+ with open(skill_file, "r", encoding="utf-8") as f:
1162
+ content = f.read()
1163
+
1164
+ if not content.startswith("---"):
1165
+ content = f"---\nname: {skill_file.stem}\ndescription: Repaired skill file\n---\n\n{content}"
1166
+
1167
+ with open(skill_file, "w", encoding="utf-8") as f:
1168
+ f.write(content)
1169
+
1170
+ return True
1171
+ except:
1172
+ return False
1173
+
1174
+ def _reinitialize_research_components(self):
1175
+ """Reinitialize research components"""
1176
+ # Implementation would depend on specific research components
1177
+ pass
1178
+
1179
+ def _reinitialize_core_components(self):
1180
+ """Reinitialize core system components"""
1181
+ # Implementation would depend on specific core components
1182
+ pass
1183
+
1184
+ def _optimize_connections(self):
1185
+ """Optimize database/network connections"""
1186
+ # Implementation would depend on specific connection types
1187
+ pass
1188
+
1189
+ def _close_file_handles(self):
1190
+ """Close open file handles"""
1191
+ import gc
1192
+
1193
+ gc.collect() # Force garbage collection to close file handles
1194
+
1195
+ def _terminate_hanging_processes(self):
1196
+ """Terminate hanging processes"""
1197
+ # Implementation would identify and terminate hanging processes
1198
+ pass
1199
+
1200
+ def _save_error_history(self):
1201
+ """Save error history to file"""
1202
+ history_file = self.error_log_dir / "error_history.json"
1203
+ try:
1204
+ with open(history_file, "w") as f:
1205
+ json.dump(
1206
+ [asdict(e) for e in self.error_history], f, indent=2, default=str
1207
+ )
1208
+ except Exception as e:
1209
+ logger.error(f"Failed to save error history: {str(e)}")
1210
+
1211
+
1212
+ # Global error recovery system instance
1213
+ _error_recovery_system = None
1214
+
1215
+
1216
+ def get_error_recovery_system(project_root: Path = None) -> ErrorRecoverySystem:
1217
+ """Get or create global error recovery system instance"""
1218
+ global _error_recovery_system
1219
+ if _error_recovery_system is None:
1220
+ _error_recovery_system = ErrorRecoverySystem(project_root)
1221
+ return _error_recovery_system
1222
+
1223
+
1224
+ def handle_error(
1225
+ error: Exception,
1226
+ context: Dict[str, Any] = None,
1227
+ severity: ErrorSeverity = ErrorSeverity.MEDIUM,
1228
+ category: ErrorCategory = ErrorCategory.SYSTEM,
1229
+ ) -> ErrorReport:
1230
+ """Convenience function to handle errors using global system"""
1231
+ return get_error_recovery_system().handle_error(error, context, severity, category)
1232
+
1233
+
1234
+ # Decorator for automatic error handling
1235
+ def error_handler(
1236
+ severity: ErrorSeverity = ErrorSeverity.MEDIUM,
1237
+ category: ErrorCategory = ErrorCategory.SYSTEM,
1238
+ context: Dict[str, Any] = None,
1239
+ ):
1240
+ """Decorator for automatic error handling"""
1241
+
1242
+ def decorator(func):
1243
+ def wrapper(*args, **kwargs):
1244
+ try:
1245
+ return func(*args, **kwargs)
1246
+ except Exception as e:
1247
+ error_context = {
1248
+ "function": func.__name__,
1249
+ "module": func.__module__,
1250
+ "args": str(args)[:100], # Limit length
1251
+ "kwargs": str(kwargs)[:100],
1252
+ **(context or {}),
1253
+ }
1254
+ handle_error(e, error_context, severity, category)
1255
+ raise
1256
+
1257
+ return wrapper
1258
+
1259
+ return decorator
1260
+
1261
+
1262
+ if __name__ == "__main__":
1263
+ # Demo usage
1264
+ recovery_system = ErrorRecoverySystem()
1265
+
1266
+ print("Error Recovery System Demo")
1267
+ print("=" * 50)
1268
+
1269
+ # Simulate some errors
1270
+ try:
1271
+ raise ValueError("This is a test error for demonstration")
1272
+ except Exception as e:
1273
+ error_report = recovery_system.handle_error(
1274
+ e,
1275
+ context={"demo": True},
1276
+ severity=ErrorSeverity.MEDIUM,
1277
+ category=ErrorCategory.SYSTEM,
1278
+ )
1279
+ print(f"Handled error: {error_report.id}")
1280
+
1281
+ # Show system health
1282
+ health = recovery_system.get_system_health()
1283
+ print(f"System health: {health['status']}")
1284
+
1285
+ # Show error summary
1286
+ summary = recovery_system.get_error_summary()
1287
+ print(f"Total errors: {summary['total_recent_errors']}")
1288
+
1289
+ print("\nError Recovery System demo completed")