moai-adk 0.10.1__py3-none-any.whl → 0.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (245) hide show
  1. moai_adk/core/project/phase_executor.py +4 -0
  2. moai_adk/core/tags/ci_validator.py +33 -3
  3. moai_adk/core/template_engine.py +6 -2
  4. moai_adk/templates/.github/workflows/moai-gitflow.yml +6 -1
  5. moai_adk/templates/.github/workflows/release.yml +6 -2
  6. moai_adk/templates/.github/workflows/tag-validation.yml +53 -8
  7. moai_adk/templates/CLAUDE.md +458 -67
  8. {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/METADATA +28 -13
  9. moai_adk-0.11.0.dist-info/RECORD +77 -0
  10. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  11. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  12. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  13. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  14. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -350
  15. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -273
  16. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  17. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  18. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -287
  19. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -287
  20. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -326
  21. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  22. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1189
  23. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -728
  24. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -545
  25. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -683
  26. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  27. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -209
  28. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -750
  29. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  30. moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +0 -102
  31. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -102
  32. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -108
  33. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -102
  34. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -102
  35. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  36. moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
  37. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  38. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -756
  39. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -198
  40. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  41. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  42. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -25
  43. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -175
  44. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -90
  45. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  46. moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +0 -102
  47. moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +0 -102
  48. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -120
  49. moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
  50. moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
  51. moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
  52. moai_adk/templates/.claude/settings.json +0 -144
  53. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  54. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  55. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  56. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  57. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  58. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  59. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  60. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  61. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  62. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  63. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  64. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  65. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  66. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  67. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  68. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  69. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  70. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  71. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  72. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  73. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  74. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  75. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  76. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  77. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  78. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  79. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  80. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  81. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  82. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  83. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  84. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  85. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  86. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  87. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  88. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  89. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  90. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  91. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  92. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
  93. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  94. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  95. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  96. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  97. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  98. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  99. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  100. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  101. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
  102. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  103. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  104. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  105. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  106. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  107. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -124
  108. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  109. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  110. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  111. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  112. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  113. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  114. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  115. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  116. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  117. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  118. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  119. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  120. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  121. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  122. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  123. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  124. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  125. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  126. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  127. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  128. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  129. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  130. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  131. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  132. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  133. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  134. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  135. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  136. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  137. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  138. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  139. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  140. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  141. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  142. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  143. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  144. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  145. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  146. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  147. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  148. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  149. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  150. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  151. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  152. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  153. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  154. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  155. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  156. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  157. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  158. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  159. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  160. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  161. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  162. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  163. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  164. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -124
  165. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  166. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  167. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -124
  168. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  169. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  170. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  171. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  172. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  173. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  174. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  175. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  176. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -123
  177. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  178. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  179. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -431
  180. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  181. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  182. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  183. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  184. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  185. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  186. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  187. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  188. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -124
  189. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  190. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  191. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -123
  192. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  193. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  194. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  195. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  196. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  197. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  198. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  199. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  200. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  201. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  202. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  203. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -127
  204. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  205. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  206. moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +0 -482
  207. moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -278
  208. moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  209. moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -477
  210. moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  211. moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  212. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  213. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  214. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -271
  215. moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  216. moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -583
  217. moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -526
  218. moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -465
  219. moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -328
  220. moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -312
  221. moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  222. moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -285
  223. moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -278
  224. moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -303
  225. moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
  226. moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -219
  227. moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -161
  228. moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
  229. moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
  230. moai_adk/templates/.moai/config.json +0 -113
  231. moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +0 -208
  232. moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +0 -369
  233. moai_adk/templates/.moai/memory/CLAUDE-RULES.md +0 -539
  234. moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
  235. moai_adk/templates/.moai/memory/ISSUE-LABEL-MAPPING.md +0 -150
  236. moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +0 -218
  237. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -330
  238. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  239. moai_adk/templates/.moai/project/product.md +0 -161
  240. moai_adk/templates/.moai/project/structure.md +0 -156
  241. moai_adk/templates/.moai/project/tech.md +0 -227
  242. moai_adk-0.10.1.dist-info/RECORD +0 -309
  243. {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/WHEEL +0 -0
  244. {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/entry_points.txt +0 -0
  245. {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,102 +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 signal
14
- import sys
15
- from pathlib import Path
16
- from typing import Any
17
-
18
- # Setup import path for shared modules
19
- HOOKS_DIR = Path(__file__).parent
20
- SHARED_DIR = HOOKS_DIR / "shared"
21
- if str(SHARED_DIR) not in sys.path:
22
- sys.path.insert(0, str(SHARED_DIR))
23
-
24
- from handlers import handle_session_start
25
-
26
-
27
- class HookTimeoutError(Exception):
28
- """Hook execution timeout exception"""
29
- pass
30
-
31
-
32
- def _timeout_handler(signum, frame):
33
- """Signal handler for 5-second timeout"""
34
- raise HookTimeoutError("Hook execution exceeded 5-second timeout")
35
-
36
-
37
- def main() -> None:
38
- """Main entry point for SessionStart hook
39
-
40
- Displays project information including:
41
- - Programming language
42
- - Git branch and status
43
- - SPEC progress (completed/total)
44
- - Recent checkpoints
45
-
46
- Exit Codes:
47
- 0: Success
48
- 1: Error (timeout, JSON parse failure, handler exception)
49
- """
50
- # Set 5-second timeout
51
- signal.signal(signal.SIGALRM, _timeout_handler)
52
- signal.alarm(5)
53
-
54
- try:
55
- # Read JSON payload from stdin
56
- input_data = sys.stdin.read()
57
- data = json.loads(input_data) if input_data.strip() else {}
58
-
59
- # Call handler
60
- result = handle_session_start(data)
61
-
62
- # Output result as JSON
63
- print(json.dumps(result.to_dict()))
64
- sys.exit(0)
65
-
66
- except HookTimeoutError:
67
- # Timeout - return minimal valid response
68
- timeout_response: dict[str, Any] = {
69
- "continue": True,
70
- "systemMessage": "⚠️ Session start timeout - continuing without project info"
71
- }
72
- print(json.dumps(timeout_response))
73
- print("SessionStart hook timeout after 5 seconds", file=sys.stderr)
74
- sys.exit(1)
75
-
76
- except json.JSONDecodeError as e:
77
- # JSON parse error
78
- error_response: dict[str, Any] = {
79
- "continue": True,
80
- "hookSpecificOutput": {"error": f"JSON parse error: {e}"}
81
- }
82
- print(json.dumps(error_response))
83
- print(f"SessionStart JSON parse error: {e}", file=sys.stderr)
84
- sys.exit(1)
85
-
86
- except Exception as e:
87
- # Unexpected error
88
- error_response: dict[str, Any] = {
89
- "continue": True,
90
- "hookSpecificOutput": {"error": f"SessionStart error: {e}"}
91
- }
92
- print(json.dumps(error_response))
93
- print(f"SessionStart unexpected error: {e}", file=sys.stderr)
94
- sys.exit(1)
95
-
96
- finally:
97
- # Always cancel alarm
98
- signal.alarm(0)
99
-
100
-
101
- if __name__ == "__main__":
102
- 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, .moai/memory/*.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
- ".moai/memory/development-guide.md",
102
- ".moai/memory/spec-metadata.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" → .moai/memory/spec-metadata.md
26
- - "/alfred:2-run" → .moai/memory/development-guide.md
27
- - "test" → tests/ (if directory exists)
28
-
29
- Examples:
30
- >>> get_jit_context("/alfred:1-plan", "/project")
31
- ['.moai/memory/spec-metadata.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": [".moai/memory/spec-metadata.md"],
53
- "/alfred:2-run": [".moai/memory/development-guide.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"]