moai-adk 0.15.0__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 -392
  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 -1525
  134. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -802
  135. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -709
  136. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1009
  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.0.dist-info/METADATA +0 -3079
  414. moai_adk-0.15.0.dist-info/RECORD +0 -365
  415. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
  416. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
  417. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
@@ -1,94 +0,0 @@
1
- #!/usr/bin/env python3
2
- # @CODE:HOOKS-CLARITY-CLEAN | SPEC: Individual hook files for better UX
3
- """SessionEnd Hook: Session Cleanup and Finalization
4
-
5
- Claude Code Event: SessionEnd
6
- Purpose: Clean up resources and finalize session when Claude Code exits
7
- Execution: Triggered when Claude Code session ends
8
-
9
- Output: Continue execution (currently a stub for future enhancements)
10
- """
11
-
12
- import json
13
- import sys
14
- from pathlib import Path
15
- from typing import Any
16
-
17
- from utils.timeout import CrossPlatformTimeout
18
- from utils.timeout import TimeoutError as PlatformTimeoutError
19
-
20
- # Setup import path for shared modules
21
- HOOKS_DIR = Path(__file__).parent
22
- SHARED_DIR = HOOKS_DIR / "shared"
23
- if str(SHARED_DIR) not in sys.path:
24
- sys.path.insert(0, str(SHARED_DIR))
25
-
26
- from handlers import handle_session_end
27
-
28
-
29
- def main() -> None:
30
- """Main entry point for SessionEnd hook
31
-
32
- Currently a stub for future functionality:
33
- - Clear temporary caches
34
- - Save session metrics
35
- - Upload analytics (if enabled)
36
- - Cleanup background processes
37
-
38
- Exit Codes:
39
- 0: Success
40
- 1: Error (timeout, JSON parse failure, handler exception)
41
- """
42
- # Set 5-second timeout
43
- timeout = CrossPlatformTimeout(5)
44
- timeout.start()
45
-
46
- try:
47
- # Read JSON payload from stdin
48
- input_data = sys.stdin.read()
49
- data = json.loads(input_data) if input_data.strip() else {}
50
-
51
- # Call handler
52
- result = handle_session_end(data)
53
-
54
- # Output result as JSON
55
- print(json.dumps(result.to_dict()))
56
- sys.exit(0)
57
-
58
- except PlatformTimeoutError:
59
- # Timeout - return minimal valid response
60
- timeout_response: dict[str, Any] = {
61
- "continue": True,
62
- "systemMessage": "⚠️ SessionEnd cleanup timeout - session ending anyway",
63
- }
64
- print(json.dumps(timeout_response))
65
- print("SessionEnd hook timeout after 5 seconds", file=sys.stderr)
66
- sys.exit(1)
67
-
68
- except json.JSONDecodeError as e:
69
- # JSON parse error
70
- error_response: dict[str, Any] = {
71
- "continue": True,
72
- "hookSpecificOutput": {"error": f"JSON parse error: {e}"},
73
- }
74
- print(json.dumps(error_response))
75
- print(f"SessionEnd JSON parse error: {e}", file=sys.stderr)
76
- sys.exit(1)
77
-
78
- except Exception as e:
79
- # Unexpected error
80
- error_response: dict[str, Any] = {
81
- "continue": True,
82
- "hookSpecificOutput": {"error": f"SessionEnd error: {e}"},
83
- }
84
- print(json.dumps(error_response))
85
- print(f"SessionEnd unexpected error: {e}", file=sys.stderr)
86
- sys.exit(1)
87
-
88
- finally:
89
- # Always cancel alarm
90
- timeout.cancel()
91
-
92
-
93
- if __name__ == "__main__":
94
- main()
@@ -1,94 +0,0 @@
1
- #!/usr/bin/env python3
2
- # @CODE:HOOKS-CLARITY-001 | SPEC: Individual hook files for better UX
3
- """SessionStart Hook: Show Project Information
4
-
5
- Claude Code Event: SessionStart
6
- Purpose: Display project status, language, Git info, and SPEC progress when session starts
7
- Execution: Triggered automatically when Claude Code session begins
8
-
9
- Output: System message with formatted project summary
10
- """
11
-
12
- import json
13
- import sys
14
- from pathlib import Path
15
- from typing import Any
16
-
17
- from utils.timeout import CrossPlatformTimeout
18
- from utils.timeout import TimeoutError as PlatformTimeoutError
19
-
20
- # Setup import path for shared modules
21
- HOOKS_DIR = Path(__file__).parent
22
- SHARED_DIR = HOOKS_DIR / "shared"
23
- if str(SHARED_DIR) not in sys.path:
24
- sys.path.insert(0, str(SHARED_DIR))
25
-
26
- from handlers import handle_session_start
27
-
28
-
29
- def main() -> None:
30
- """Main entry point for SessionStart hook
31
-
32
- Displays project information including:
33
- - Programming language
34
- - Git branch and status
35
- - SPEC progress (completed/total)
36
- - Recent checkpoints
37
-
38
- Exit Codes:
39
- 0: Success
40
- 1: Error (timeout, JSON parse failure, handler exception)
41
- """
42
- # Set 5-second timeout
43
- timeout = CrossPlatformTimeout(5)
44
- timeout.start()
45
-
46
- try:
47
- # Read JSON payload from stdin
48
- input_data = sys.stdin.read()
49
- data = json.loads(input_data) if input_data.strip() else {}
50
-
51
- # Call handler
52
- result = handle_session_start(data)
53
-
54
- # Output result as JSON
55
- print(json.dumps(result.to_dict()))
56
- sys.exit(0)
57
-
58
- except PlatformTimeoutError:
59
- # Timeout - return minimal valid response
60
- timeout_response: dict[str, Any] = {
61
- "continue": True,
62
- "systemMessage": "⚠️ Session start timeout - continuing without project info",
63
- }
64
- print(json.dumps(timeout_response))
65
- print("SessionStart hook timeout after 5 seconds", file=sys.stderr)
66
- sys.exit(1)
67
-
68
- except json.JSONDecodeError as e:
69
- # JSON parse error
70
- error_response: dict[str, Any] = {
71
- "continue": True,
72
- "hookSpecificOutput": {"error": f"JSON parse error: {e}"},
73
- }
74
- print(json.dumps(error_response))
75
- print(f"SessionStart JSON parse error: {e}", file=sys.stderr)
76
- sys.exit(1)
77
-
78
- except Exception as e:
79
- # Unexpected error
80
- error_response: dict[str, Any] = {
81
- "continue": True,
82
- "hookSpecificOutput": {"error": f"SessionStart error: {e}"},
83
- }
84
- print(json.dumps(error_response))
85
- print(f"SessionStart unexpected error: {e}", file=sys.stderr)
86
- sys.exit(1)
87
-
88
- finally:
89
- # Always cancel alarm
90
- timeout.cancel()
91
-
92
-
93
- if __name__ == "__main__":
94
- main()
@@ -1,170 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Core module for Alfred Hooks
3
-
4
- Common type definitions and utility functions
5
- """
6
-
7
- from dataclasses import dataclass, field
8
- from typing import Any, Literal, NotRequired, TypedDict
9
-
10
-
11
- class HookPayload(TypedDict):
12
- """Claude Code Hook event payload type definition
13
-
14
- Data structure that Claude Code passes to the Hook script.
15
- Use NotRequired because fields may vary depending on the event.
16
- """
17
-
18
- cwd: str
19
- userPrompt: NotRequired[str] # Includes only UserPromptSubmit events
20
- tool: NotRequired[str] # PreToolUse/PostToolUse events
21
- arguments: NotRequired[dict[str, Any]] # Tool arguments
22
-
23
-
24
- @dataclass
25
- class HookResult:
26
- """Hook execution result following Claude Code standard schema.
27
-
28
- Attributes conform to Claude Code Hook output specification:
29
- https://docs.claude.com/en/docs/claude-code/hooks
30
-
31
- Standard Fields (Claude Code schema - included in JSON output):
32
- continue_execution: Allow execution to continue (default True)
33
- suppress_output: Suppress hook output display (default False)
34
- decision: "approve" or "block" operation (optional)
35
- reason: Explanation for decision (optional)
36
- permission_decision: "allow", "deny", or "ask" (optional)
37
- system_message: Message displayed to user (top-level field)
38
-
39
- Internal Fields (MoAI-ADK only - NOT in JSON output):
40
- context_files: List of context files to load (internal use only)
41
- suggestions: Suggestions for user (internal use only)
42
- exit_code: Exit code for diagnostics (internal use only)
43
-
44
- Note:
45
- - systemMessage appears at TOP LEVEL in JSON output
46
- - hookSpecificOutput is ONLY used for UserPromptSubmit events
47
- - Internal fields are used for Python logic but not serialized to JSON
48
- """
49
-
50
- # Claude Code standard fields
51
- continue_execution: bool = True
52
- suppress_output: bool = False
53
- decision: Literal["approve", "block"] | None = None
54
- reason: str | None = None
55
- permission_decision: Literal["allow", "deny", "ask"] | None = None
56
-
57
- # MoAI-ADK custom fields (wrapped in hookSpecificOutput)
58
- system_message: str | None = None
59
- context_files: list[str] = field(default_factory=list)
60
- suggestions: list[str] = field(default_factory=list)
61
- exit_code: int = 0
62
-
63
- def to_dict(self) -> dict[str, Any]:
64
- """Convert to Claude Code standard Hook output schema.
65
-
66
- Returns:
67
- Dictionary conforming to Claude Code Hook specification with:
68
- - Top-level fields: continue, suppressOutput, decision, reason,
69
- permissionDecision, systemMessage
70
- - MoAI-ADK internal fields (context_files, suggestions, exit_code)
71
- are NOT included in JSON output (used for internal logic only)
72
-
73
- Examples:
74
- >>> result = HookResult(continue_execution=True)
75
- >>> result.to_dict()
76
- {'continue': True}
77
-
78
- >>> result = HookResult(decision="block", reason="Dangerous")
79
- >>> result.to_dict()
80
- {'decision': 'block', 'reason': 'Dangerous'}
81
-
82
- >>> result = HookResult(system_message="Test")
83
- >>> result.to_dict()
84
- {'continue': True, 'systemMessage': 'Test'}
85
-
86
- Note:
87
- - systemMessage is a TOP-LEVEL field (not nested in hookSpecificOutput)
88
- - hookSpecificOutput is ONLY used for UserPromptSubmit events
89
- - context_files, suggestions, exit_code are internal-only fields
90
- """
91
- output: dict[str, Any] = {}
92
-
93
- # Add decision or continue flag
94
- if self.decision:
95
- output["decision"] = self.decision
96
- else:
97
- output["continue"] = self.continue_execution
98
-
99
- # Add reason if provided (works with both decision and permissionDecision)
100
- if self.reason:
101
- output["reason"] = self.reason
102
-
103
- # Add suppressOutput if True
104
- if self.suppress_output:
105
- output["suppressOutput"] = True
106
-
107
- # Add permissionDecision if set
108
- if self.permission_decision:
109
- output["permissionDecision"] = self.permission_decision
110
-
111
- # Add systemMessage at TOP LEVEL (required by Claude Code schema)
112
- if self.system_message:
113
- output["systemMessage"] = self.system_message
114
-
115
- # Note: context_files, suggestions, exit_code are internal-only fields
116
- # and are NOT included in the JSON output per Claude Code schema
117
-
118
- return output
119
-
120
- def to_user_prompt_submit_dict(self) -> dict[str, Any]:
121
- """UserPromptSubmit Hook-specific output format.
122
-
123
- Claude Code requires a special schema for UserPromptSubmit events.
124
- The result is wrapped in the standard Hook schema with hookSpecificOutput.
125
-
126
- Returns:
127
- Claude Code UserPromptSubmit Hook Dictionary matching schema:
128
- {
129
- "continue": true,
130
- "hookSpecificOutput": {
131
- "hookEventName": "UserPromptSubmit",
132
- "additionalContext": "string"
133
- }
134
- }
135
-
136
- Examples:
137
- >>> result = HookResult(context_files=["tests/"])
138
- >>> result.to_user_prompt_submit_dict()
139
- {'continue': True, 'hookSpecificOutput': \
140
- {'hookEventName': 'UserPromptSubmit', 'additionalContext': '📎 Context: tests/'}}
141
- """
142
- # Convert context_files to additionalContext string
143
- if self.context_files:
144
- context_str = "\n".join([f"📎 Context: {f}" for f in self.context_files])
145
- else:
146
- context_str = ""
147
-
148
- # Add system_message if there is one
149
- if self.system_message:
150
- if context_str:
151
- context_str = f"{self.system_message}\n\n{context_str}"
152
- else:
153
- context_str = self.system_message
154
-
155
- return {
156
- "continue": self.continue_execution,
157
- "hookSpecificOutput": {
158
- "hookEventName": "UserPromptSubmit",
159
- "additionalContext": context_str,
160
- },
161
- }
162
-
163
-
164
- __all__ = ["HookPayload", "HookResult"]
165
-
166
- # Note: core module exports:
167
- # - HookPayload, HookResult (type definitions)
168
- # - project.py: detect_language, get_git_info, count_specs, get_project_language
169
- # - context.py: get_jit_context
170
- # - checkpoint.py: detect_risky_operation, create_checkpoint, log_checkpoint, list_checkpoints
@@ -1,271 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Event-Driven Checkpoint system
3
-
4
- Detect risky tasks and create automatic checkpoints
5
- @TAG:CHECKPOINT-EVENT-001
6
- """
7
-
8
- import json
9
- import re
10
- import subprocess
11
- from datetime import datetime
12
- from pathlib import Path
13
- from typing import Any
14
-
15
- # Script execution pattern for each language supported by MoAI-ADK
16
- # Python, TypeScript, Java, Go, Rust, Dart, Swift, Kotlin + Shell
17
- SCRIPT_EXECUTION_PATTERN = re.compile(
18
- r"\b("
19
- # Python ecosystem
20
- r"python3?|pytest|pip|uv|"
21
- # JavaScript/TypeScript ecosystem
22
- r"node|npm|npx|yarn|bun|tsx|ts-node|vitest|jest|"
23
- # Java ecosystem
24
- r"java|javac|mvn|gradle|"
25
- # Go
26
- r"go|"
27
- # Rust
28
- r"cargo|"
29
- # Dart/Flutter
30
- r"dart|flutter|"
31
- # Swift
32
- r"swift|xcodebuild|"
33
- # Kotlin
34
- r"kotlinc?|"
35
- # Shell scripts and build tools
36
- r"bash|sh|zsh|fish|make"
37
- r")\b"
38
- )
39
-
40
-
41
- def detect_risky_operation(tool_name: str, tool_args: dict[str, Any], cwd: str) -> tuple[bool, str]:
42
- """Risk task detection (for Event-Driven Checkpoint)
43
-
44
- Claude Code tool automatically detects dangerous tasks before use.
45
- When a risk is detected, a checkpoint is automatically created to enable rollback.
46
-
47
- Args:
48
- tool_name: Name of the Claude Code tool (Bash, Edit, Write, MultiEdit)
49
- tool_args: Tool argument dictionary
50
- cwd: Project root directory path
51
-
52
- Returns:
53
- (is_risky, operation_type) tuple
54
- - is_risky: Whether the operation is dangerous (bool)
55
- - operation_type: operation type (str: delete, merge, script, critical-file, refactor)
56
-
57
- Risky Operations:
58
- - Bash tool: rm -rf, git merge, git reset --hard, git rebase, script execution
59
- - Edit/Write tool: CLAUDE.md, config.json, .claude/skills/*.md
60
- - MultiEdit tool: Edit ≥10 items File simultaneously
61
- - Script execution: Python, Node, Java, Go, Rust, Dart, Swift, Kotlin, Shell scripts
62
-
63
- Examples:
64
- >>> detect_risky_operation("Bash", {"command": "rm -rf src/"}, ".")
65
- (True, 'delete')
66
- >>> detect_risky_operation("Edit", {"file_path": "CLAUDE.md"}, ".")
67
- (True, 'critical-file')
68
- >>> detect_risky_operation("Read", {"file_path": "test.py"}, ".")
69
- (False, '')
70
-
71
- Notes:
72
- - Minimize false positives: ignore safe operations
73
- - Performance: lightweight string matching (< 1ms)
74
- - Extensibility: Easily added to the patterns dictionary
75
-
76
- @TAG:CHECKPOINT-EVENT-001
77
- """
78
- # Bash tool: Detect dangerous commands
79
- if tool_name == "Bash":
80
- command = tool_args.get("command", "")
81
-
82
- # Mass Delete
83
- if any(pattern in command for pattern in ["rm -rf", "git rm"]):
84
- return (True, "delete")
85
-
86
- # Git merge/reset/rebase
87
- if any(pattern in command for pattern in ["git merge", "git reset --hard", "git rebase"]):
88
- return (True, "merge")
89
-
90
- # Execute external script (potentially destructive)
91
- if any(command.startswith(prefix) for prefix in ["python ", "node ", "bash ", "sh "]):
92
- return (True, "script")
93
-
94
- # Edit/Write tool: Detect important files
95
- if tool_name in ("Edit", "Write"):
96
- file_path = tool_args.get("file_path", "")
97
-
98
- critical_files = [
99
- "CLAUDE.md",
100
- "config.json",
101
- ".claude/skills/moai-alfred-dev-guide/reference.md",
102
- ".claude/skills/moai-alfred-spec-metadata-extended/reference.md",
103
- ".moai/config.json",
104
- ]
105
-
106
- if any(cf in file_path for cf in critical_files):
107
- return (True, "critical-file")
108
-
109
- # MultiEdit tool: Detect large edits
110
- if tool_name == "MultiEdit":
111
- edits = tool_args.get("edits", [])
112
- if len(edits) >= 10:
113
- return (True, "refactor")
114
-
115
- return (False, "")
116
-
117
-
118
- def create_checkpoint(cwd: str, operation_type: str) -> str:
119
- """Create checkpoint (Git local branch)
120
-
121
- Automatically creates checkpoints before dangerous operations.
122
- Prevent remote repository contamination by creating a Git local branch.
123
-
124
- Args:
125
- cwd: Project root directory path
126
- operation_type: operation type (delete, merge, script, etc.)
127
-
128
- Returns:
129
- checkpoint_branch: Created branch name
130
- Returns "checkpoint-failed" on failure
131
-
132
- Branch Naming:
133
- before-{operation}-{YYYYMMDD-HHMMSS}
134
- Example: before-delete-20251015-143000
135
-
136
- Examples:
137
- >>> create_checkpoint(".", "delete")
138
- 'before-delete-20251015-143000'
139
-
140
- Notes:
141
- - Create only local branch (no remote push)
142
- - Fallback in case of Git error (ignore and continue)
143
- - Do not check dirty working directory (allow uncommitted changes)
144
- - Automatically record checkpoint logs (.moai/checkpoints.log)
145
-
146
- @TAG:CHECKPOINT-EVENT-001
147
- """
148
- timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
149
- branch_name = f"before-{operation_type}-{timestamp}"
150
-
151
- try:
152
- # Create a new local branch from the current branch (without checking out)
153
- subprocess.run(
154
- ["git", "branch", branch_name],
155
- cwd=cwd,
156
- check=True,
157
- capture_output=True,
158
- text=True,
159
- timeout=2,
160
- )
161
-
162
- # Checkpoint log records
163
- log_checkpoint(cwd, branch_name, operation_type)
164
-
165
- return branch_name
166
-
167
- except (subprocess.CalledProcessError, subprocess.TimeoutExpired, FileNotFoundError):
168
- # Fallback (ignore) in case of Git error
169
- return "checkpoint-failed"
170
-
171
-
172
- def log_checkpoint(cwd: str, branch_name: str, operation_type: str) -> None:
173
- """Checkpoint log records (.moai/checkpoints.log)
174
-
175
- Checkpoint creation history is recorded in JSON Lines format.
176
- SessionStart reads this log to display a list of checkpoints.
177
-
178
- Args:
179
- cwd: Project root directory path
180
- branch_name: Created checkpoint branch name
181
- operation_type: operation type
182
-
183
- Log Format (JSON Lines):
184
- {"timestamp": "2025-10-15T14:30:00", "branch": "before-delete-...", "operation": "delete"}
185
-
186
- Examples:
187
- >>> log_checkpoint(".", "before-delete-20251015-143000", "delete")
188
- # Add 1 line to .moai/checkpoints.log
189
-
190
- Notes:
191
- - If the file does not exist, it is automatically created.
192
- - Record in append mode (preserve existing logs)
193
- - Ignored in case of failure (not critical)
194
-
195
- @TAG:CHECKPOINT-EVENT-001
196
- """
197
- log_file = Path(cwd) / ".moai" / "checkpoints.log"
198
-
199
- try:
200
- log_file.parent.mkdir(parents=True, exist_ok=True)
201
-
202
- log_entry = {
203
- "timestamp": datetime.now().isoformat(),
204
- "branch": branch_name,
205
- "operation": operation_type,
206
- }
207
-
208
- with log_file.open("a") as f:
209
- f.write(json.dumps(log_entry) + "\n")
210
-
211
- except (OSError, PermissionError):
212
- # Ignore log failures (not critical)
213
- pass
214
-
215
-
216
- def list_checkpoints(cwd: str, max_count: int = 10) -> list[dict[str, str]]:
217
- """Checkpoint list (parsing .moai/checkpoints.log)
218
-
219
- Returns a list of recently created checkpoints.
220
- Used in the SessionStart, /alfred:0-project restore command.
221
-
222
- Args:
223
- cwd: Project root directory path
224
- max_count: Maximum number to return (default 10 items)
225
-
226
- Returns:
227
- Checkpoint list (most recent)
228
- [{"timestamp": "...", "branch": "...", "operation": "..."}, ...]
229
-
230
- Examples:
231
- >>> list_checkpoints(".")
232
- [
233
- {"timestamp": "2025-10-15T14:30:00", "branch": "before-delete-...", "operation": "delete"},
234
- {"timestamp": "2025-10-15T14:25:00", "branch": "before-merge-...", "operation": "merge"},
235
- ]
236
-
237
- Notes:
238
- - If there is no log file, an empty list is returned.
239
- - Ignore lines where JSON parsing fails
240
- - Return only the latest max_count
241
-
242
- @TAG:CHECKPOINT-EVENT-001
243
- """
244
- log_file = Path(cwd) / ".moai" / "checkpoints.log"
245
-
246
- if not log_file.exists():
247
- return []
248
-
249
- checkpoints = []
250
-
251
- try:
252
- with log_file.open("r") as f:
253
- for line in f:
254
- try:
255
- checkpoints.append(json.loads(line.strip()))
256
- except json.JSONDecodeError:
257
- # Ignore lines where parsing failed
258
- pass
259
- except (OSError, PermissionError):
260
- return []
261
-
262
- # Return only the most recent max_count items (in order of latest)
263
- return checkpoints[-max_count:]
264
-
265
-
266
- __all__ = [
267
- "detect_risky_operation",
268
- "create_checkpoint",
269
- "log_checkpoint",
270
- "list_checkpoints",
271
- ]
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Context Engineering utilities
3
-
4
- JIT (Just-in-Time) Retrieval
5
- """
6
-
7
- from pathlib import Path
8
-
9
-
10
- def get_jit_context(prompt: str, cwd: str) -> list[str]:
11
- """JIT Context Retrieval based on prompt.
12
-
13
- Analyze user prompts and automatically recommend relevant documents.
14
- Alfred commands and keyword-based pattern matching load only the documents you need.
15
-
16
- Args:
17
- prompt: Prompt for user input (case is irrelevant)
18
- cwd: Project root directory path
19
-
20
- Returns:
21
- List of recommended document paths (relative paths).
22
- If there is no matching pattern or file, an empty list []
23
-
24
- Patterns:
25
- - "/alfred:1-plan" → .claude/skills/moai-alfred-spec-metadata-extended/reference.md
26
- - "/alfred:2-run" → .claude/skills/moai-alfred-dev-guide/reference.md
27
- - "test" → tests/ (if directory exists)
28
-
29
- Examples:
30
- >>> get_jit_context("/alfred:1-plan", "/project")
31
- ['.claude/skills/moai-alfred-spec-metadata-extended/reference.md']
32
- >>> get_jit_context("implement test", "/project")
33
- ['tests/']
34
- >>> get_jit_context("unknown", "/project")
35
- []
36
-
37
- Notes:
38
- - Context Engineering: Compliance with JIT Retrieval principles
39
- - Minimize initial context burden by loading only necessary documents
40
- - Return after checking whether file exists
41
-
42
- TDD History:
43
- - RED: 18 items scenario testing (command matching, keywords, empty results)
44
- - GREEN: Pattern matching dictionary-based implementation
45
- - REFACTOR: Expandable pattern structure, file existence validation added
46
- """
47
- context_files = []
48
- cwd_path = Path(cwd)
49
-
50
- # Pattern matching
51
- patterns = {
52
- "/alfred:1-plan": [".claude/skills/moai-alfred-spec-metadata-extended/reference.md"],
53
- "/alfred:2-run": [".claude/skills/moai-alfred-dev-guide/reference.md"],
54
- "test": ["tests/"],
55
- }
56
-
57
- for pattern, files in patterns.items():
58
- if pattern in prompt.lower():
59
- for file in files:
60
- file_path = cwd_path / file
61
- if file_path.exists():
62
- context_files.append(file)
63
-
64
- return context_files
65
-
66
-
67
- __all__ = ["get_jit_context"]