moai-adk 0.4.5__py3-none-any.whl → 0.20.1__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (433) hide show
  1. moai_adk/__init__.py +1 -1
  2. moai_adk/__main__.py +74 -1
  3. moai_adk/cli/commands/__init__.py +1 -1
  4. moai_adk/cli/commands/analyze.py +119 -0
  5. moai_adk/cli/commands/backup.py +25 -1
  6. moai_adk/cli/commands/doctor.py +31 -5
  7. moai_adk/cli/commands/improve_user_experience.py +307 -0
  8. moai_adk/cli/commands/init.py +111 -10
  9. moai_adk/cli/commands/status.py +33 -3
  10. moai_adk/cli/commands/update.py +921 -130
  11. moai_adk/cli/commands/validate_links.py +120 -0
  12. moai_adk/cli/prompts/init_prompts.py +22 -87
  13. moai_adk/core/analysis/__init__.py +9 -0
  14. moai_adk/core/analysis/session_analyzer.py +388 -0
  15. moai_adk/core/analysis/tag_chain_analyzer.py +344 -0
  16. moai_adk/core/analysis/tag_chain_repair.py +879 -0
  17. moai_adk/core/config/__init__.py +19 -0
  18. moai_adk/core/config/migration.py +235 -0
  19. moai_adk/core/git/__init__.py +1 -1
  20. moai_adk/core/git/branch.py +1 -1
  21. moai_adk/core/git/commit.py +1 -1
  22. moai_adk/core/git/manager.py +1 -1
  23. moai_adk/core/issue_creator.py +313 -0
  24. moai_adk/core/mcp/setup.py +56 -0
  25. moai_adk/core/mcp/setup_old.py +296 -0
  26. moai_adk/core/project/backup_utils.py +1 -1
  27. moai_adk/core/project/checker.py +2 -2
  28. moai_adk/core/project/detector.py +211 -12
  29. moai_adk/core/project/initializer.py +85 -15
  30. moai_adk/core/project/phase_executor.py +76 -13
  31. moai_adk/core/project/validator.py +13 -13
  32. moai_adk/core/quality/__init__.py +1 -1
  33. moai_adk/core/quality/trust_checker.py +1 -1
  34. moai_adk/core/quality/validators/__init__.py +1 -1
  35. moai_adk/core/quality/validators/base_validator.py +1 -1
  36. moai_adk/core/tags/__init__.py +86 -0
  37. moai_adk/core/tags/auto_corrector.py +693 -0
  38. moai_adk/core/tags/ci_validator.py +463 -0
  39. moai_adk/core/tags/cli.py +283 -0
  40. moai_adk/core/tags/generator.py +109 -0
  41. moai_adk/core/tags/inserter.py +99 -0
  42. moai_adk/core/tags/mapper.py +126 -0
  43. moai_adk/core/tags/parser.py +76 -0
  44. moai_adk/core/tags/policy_validator.py +580 -0
  45. moai_adk/core/tags/pre_commit_validator.py +421 -0
  46. moai_adk/core/tags/reporter.py +956 -0
  47. moai_adk/core/tags/rollback_manager.py +525 -0
  48. moai_adk/core/tags/tags.py +149 -0
  49. moai_adk/core/tags/validator.py +897 -0
  50. moai_adk/core/template/__init__.py +1 -1
  51. moai_adk/core/template/backup.py +1 -1
  52. moai_adk/core/template/merger.py +50 -1
  53. moai_adk/core/template/processor.py +119 -13
  54. moai_adk/core/template_engine.py +268 -0
  55. moai_adk/templates/.claude/agents/alfred/backend-expert.md +348 -0
  56. moai_adk/templates/.claude/agents/alfred/cc-manager.md +209 -944
  57. moai_adk/templates/.claude/agents/alfred/database-expert.md +352 -0
  58. moai_adk/templates/.claude/agents/alfred/debug-helper.md +34 -5
  59. moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
  60. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +38 -8
  61. moai_adk/templates/.claude/agents/alfred/format-expert.md +469 -0
  62. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
  63. moai_adk/templates/.claude/agents/alfred/git-manager.md +128 -9
  64. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +104 -6
  65. moai_adk/templates/.claude/agents/alfred/project-manager.md +88 -16
  66. moai_adk/templates/.claude/agents/alfred/quality-gate.md +36 -9
  67. moai_adk/templates/.claude/agents/alfred/security-expert.md +270 -0
  68. moai_adk/templates/.claude/agents/alfred/skill-factory.md +865 -0
  69. moai_adk/templates/.claude/agents/alfred/spec-builder.md +214 -43
  70. moai_adk/templates/.claude/agents/alfred/tag-agent.md +111 -9
  71. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +309 -160
  72. moai_adk/templates/.claude/agents/alfred/trust-checker.md +36 -7
  73. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +605 -0
  74. moai_adk/templates/.claude/commands/alfred/0-project.md +393 -966
  75. moai_adk/templates/.claude/commands/alfred/1-plan.md +651 -367
  76. moai_adk/templates/.claude/commands/alfred/2-run.md +388 -241
  77. moai_adk/templates/.claude/commands/alfred/3-sync.md +1921 -410
  78. moai_adk/templates/.claude/commands/alfred/9-feedback.md +153 -0
  79. moai_adk/templates/.claude/commands/alfred/release-new.md +3604 -0
  80. moai_adk/templates/.claude/hooks/alfred/core/project.py +484 -20
  81. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
  82. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
  83. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
  84. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +14 -6
  85. moai_adk/templates/.claude/hooks/alfred/post_tool__enable_streaming_ui.py +50 -0
  86. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +93 -0
  87. moai_adk/templates/.claude/hooks/alfred/post_tool__tag_auto_corrector.py +407 -0
  88. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +99 -0
  89. moai_adk/templates/.claude/hooks/alfred/pre_tool__realtime_tag_monitor.py +335 -0
  90. moai_adk/templates/.claude/hooks/alfred/pre_tool__tag_policy_validator.py +325 -0
  91. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +93 -0
  92. moai_adk/templates/.claude/hooks/alfred/session_start__auto_cleanup.py +580 -0
  93. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +298 -0
  94. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +170 -0
  95. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +3 -3
  96. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +5 -5
  97. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
  98. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +230 -0
  99. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
  100. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
  101. moai_adk/templates/.claude/hooks/alfred/shared/handlers/daily_analysis.py +351 -0
  102. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
  103. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +174 -0
  104. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +87 -0
  105. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +61 -0
  106. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +111 -0
  107. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
  108. moai_adk/templates/.claude/hooks/alfred/utils/hook_config.py +94 -0
  109. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
  110. moai_adk/templates/.claude/output-styles/alfred/alfred-moai-adk-beginner.md +267 -0
  111. moai_adk/templates/.claude/output-styles/alfred/keating-personal-tutor.md +440 -0
  112. moai_adk/templates/.claude/output-styles/alfred/r2d2-agentic-coding.md +583 -0
  113. moai_adk/templates/.claude/settings.json +96 -14
  114. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +70 -0
  115. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +62 -0
  116. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +242 -0
  117. moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/SKILL.md +237 -0
  118. moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/examples.md +871 -0
  119. moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/reference.md +653 -0
  120. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/README.md +162 -0
  121. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/SKILL.md +227 -0
  122. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/examples.md +354 -0
  123. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/reference.md +158 -0
  124. moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/SKILL.md +179 -79
  125. moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/examples.md +117 -0
  126. moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/scripts/pre-review-check.sh +62 -0
  127. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +132 -0
  128. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -0
  129. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +444 -0
  130. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +62 -0
  131. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +28 -0
  132. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +405 -0
  133. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +51 -0
  134. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +355 -0
  135. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +239 -0
  136. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +323 -0
  137. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +286 -0
  138. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +126 -0
  139. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +229 -0
  140. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +4 -0
  141. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +150 -0
  142. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +87 -73
  143. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +29 -0
  144. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +28 -0
  145. moai_adk/templates/.claude/skills/moai-alfred-personas/README.md +42 -0
  146. moai_adk/templates/.claude/skills/moai-alfred-personas/SKILL.md +429 -0
  147. moai_adk/templates/.claude/skills/moai-alfred-personas/examples.md +520 -0
  148. moai_adk/templates/.claude/skills/moai-alfred-personas/reference.md +405 -0
  149. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +89 -0
  150. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +122 -0
  151. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +369 -0
  152. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +508 -0
  153. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +481 -0
  154. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +100 -0
  155. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +77 -0
  156. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +265 -0
  157. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +539 -0
  158. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +320 -0
  159. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +4 -0
  160. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +84 -0
  161. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +137 -0
  162. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +219 -0
  163. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +161 -0
  164. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +541 -0
  165. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +622 -0
  166. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +19 -0
  167. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +4 -0
  168. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +211 -0
  169. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +288 -0
  170. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +269 -0
  171. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +32 -0
  172. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +298 -0
  173. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +26 -0
  174. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +307 -0
  175. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +21 -0
  176. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +252 -0
  177. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +19 -0
  178. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +19 -0
  179. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +24 -0
  180. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +199 -0
  181. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +39 -0
  182. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +316 -0
  183. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +18 -0
  184. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +263 -0
  185. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +30 -0
  186. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +482 -0
  187. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +303 -0
  188. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +524 -0
  189. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +477 -0
  190. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +429 -0
  191. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +391 -0
  192. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +431 -0
  193. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +577 -0
  194. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +273 -0
  195. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +466 -0
  196. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +583 -0
  197. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +526 -0
  198. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +608 -0
  199. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +328 -0
  200. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +312 -0
  201. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +245 -0
  202. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +285 -0
  203. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +278 -0
  204. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +303 -0
  205. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +291 -0
  206. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +15 -0
  207. moai_adk/templates/.claude/skills/moai-change-logger/SKILL.md +563 -0
  208. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +802 -0
  209. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +1238 -0
  210. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +673 -0
  211. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +234 -43
  212. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +1633 -0
  213. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +660 -0
  214. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +97 -69
  215. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +29 -0
  216. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +30 -0
  217. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +97 -72
  218. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +29 -0
  219. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +30 -0
  220. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +97 -74
  221. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +29 -0
  222. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +30 -0
  223. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +98 -74
  224. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +29 -0
  225. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +31 -0
  226. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +102 -73
  227. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +29 -0
  228. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +31 -0
  229. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +97 -73
  230. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +29 -0
  231. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +30 -0
  232. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +97 -67
  233. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +29 -0
  234. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +30 -0
  235. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +97 -79
  236. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +29 -0
  237. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +30 -0
  238. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +97 -71
  239. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +29 -0
  240. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +30 -0
  241. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +265 -64
  242. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +1064 -0
  243. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +1047 -0
  244. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +87 -78
  245. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +29 -0
  246. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +28 -0
  247. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +87 -70
  248. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +29 -0
  249. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +28 -0
  250. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +87 -86
  251. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +29 -0
  252. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +28 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +80 -62
  254. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +29 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +28 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +207 -50
  257. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +29 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +29 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +90 -71
  260. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +29 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +28 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +78 -58
  263. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +29 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +28 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +78 -51
  266. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +29 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +28 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-trust/.!11330!examples.md +0 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +253 -32
  270. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +1099 -0
  272. moai_adk/templates/.claude/skills/moai-jit-docs-enhanced/SKILL.md +460 -0
  273. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +98 -74
  274. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +29 -0
  275. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +31 -0
  276. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +98 -76
  277. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +29 -0
  278. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +31 -0
  279. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +2358 -70
  280. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +29 -0
  281. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +30 -0
  282. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +2962 -68
  283. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +29 -0
  284. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +30 -0
  285. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +1898 -70
  286. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +29 -0
  287. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +31 -0
  288. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +1465 -68
  289. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +29 -0
  290. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +31 -0
  291. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +2364 -66
  292. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +29 -0
  293. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +32 -0
  294. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +1630 -69
  295. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +29 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +31 -0
  297. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +89 -61
  298. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +29 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +30 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +735 -66
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +624 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +316 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +97 -73
  304. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +29 -0
  305. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +30 -0
  306. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +98 -73
  307. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +29 -0
  308. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +31 -0
  309. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +1834 -70
  310. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +29 -0
  311. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +31 -0
  312. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +99 -74
  313. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +29 -0
  314. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +30 -0
  315. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +97 -74
  316. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +29 -0
  317. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +30 -0
  318. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +98 -74
  319. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +29 -0
  320. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +31 -0
  321. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +1959 -69
  322. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +29 -0
  323. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +30 -0
  324. moai_adk/templates/.claude/skills/moai-lang-template/SKILL.md +348 -0
  325. moai_adk/templates/.claude/skills/moai-lang-template/VARIABLES.md +98 -0
  326. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +1230 -66
  327. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +29 -0
  328. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +34 -0
  329. moai_adk/templates/.claude/skills/moai-learning-optimizer/SKILL.md +575 -0
  330. moai_adk/templates/.claude/skills/moai-project-batch-questions/README.md +50 -0
  331. moai_adk/templates/.claude/skills/moai-project-batch-questions/SKILL.md +304 -0
  332. moai_adk/templates/.claude/skills/moai-project-batch-questions/examples.md +417 -0
  333. moai_adk/templates/.claude/skills/moai-project-batch-questions/reference.md +704 -0
  334. moai_adk/templates/.claude/skills/moai-project-config-manager/README.md +87 -0
  335. moai_adk/templates/.claude/skills/moai-project-config-manager/SKILL.md +552 -0
  336. moai_adk/templates/.claude/skills/moai-project-config-manager/examples.md +1109 -0
  337. moai_adk/templates/.claude/skills/moai-project-config-manager/reference.md +514 -0
  338. moai_adk/templates/.claude/skills/moai-project-config-manager/validate.py +106 -0
  339. moai_adk/templates/.claude/skills/moai-project-documentation/README.md +11 -0
  340. moai_adk/templates/.claude/skills/moai-project-documentation/SKILL.md +622 -0
  341. moai_adk/templates/.claude/skills/moai-project-documentation/examples.md +20 -0
  342. moai_adk/templates/.claude/skills/moai-project-documentation/reference.md +12 -0
  343. moai_adk/templates/.claude/skills/moai-project-language-initializer/README.md +152 -0
  344. moai_adk/templates/.claude/skills/moai-project-language-initializer/SKILL.md +285 -0
  345. moai_adk/templates/.claude/skills/moai-project-language-initializer/examples.md +333 -0
  346. moai_adk/templates/.claude/skills/moai-project-language-initializer/reference.md +386 -0
  347. moai_adk/templates/.claude/skills/moai-project-template-optimizer/README.md +49 -0
  348. moai_adk/templates/.claude/skills/moai-project-template-optimizer/SKILL.md +319 -0
  349. moai_adk/templates/.claude/skills/moai-project-template-optimizer/examples.md +58 -0
  350. moai_adk/templates/.claude/skills/moai-project-template-optimizer/reference.md +123 -0
  351. moai_adk/templates/.claude/skills/moai-session-info/SKILL.md +314 -0
  352. moai_adk/templates/.claude/skills/moai-streaming-ui/SKILL.md +552 -0
  353. moai_adk/templates/.claude/skills/moai-tag-policy-validator/SKILL.md +570 -0
  354. moai_adk/templates/.git-hooks/pre-commit +66 -0
  355. moai_adk/templates/.git-hooks/pre-push +255 -0
  356. moai_adk/templates/.github/workflows/c-tag-validation.yml +11 -0
  357. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +11 -0
  358. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +11 -0
  359. moai_adk/templates/.github/workflows/dart-tag-validation.yml +11 -0
  360. moai_adk/templates/.github/workflows/go-tag-validation.yml +130 -0
  361. moai_adk/templates/.github/workflows/java-tag-validation.yml +11 -0
  362. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +135 -0
  363. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +11 -0
  364. moai_adk/templates/.github/workflows/moai-gitflow.yml +166 -3
  365. moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
  366. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +188 -0
  367. moai_adk/templates/.github/workflows/php-tag-validation.yml +11 -0
  368. moai_adk/templates/.github/workflows/python-tag-validation.yml +118 -0
  369. moai_adk/templates/.github/workflows/release.yml +118 -0
  370. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +11 -0
  371. moai_adk/templates/.github/workflows/rust-tag-validation.yml +11 -0
  372. moai_adk/templates/.github/workflows/shell-tag-validation.yml +11 -0
  373. moai_adk/templates/.github/workflows/spec-issue-sync.yml +338 -0
  374. moai_adk/templates/.github/workflows/swift-tag-validation.yml +11 -0
  375. moai_adk/templates/.github/workflows/tag-report.yml +269 -0
  376. moai_adk/templates/.github/workflows/tag-validation.yml +186 -0
  377. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +154 -0
  378. moai_adk/templates/.mcp.json +31 -0
  379. moai_adk/templates/.moai/config.json +80 -7
  380. moai_adk/templates/CLAUDE.md +562 -546
  381. moai_adk/utils/banner.py +5 -5
  382. moai_adk/utils/common.py +294 -0
  383. moai_adk/utils/link_validator.py +235 -0
  384. moai_adk/utils/logger.py +8 -8
  385. moai_adk/utils/user_experience.py +451 -0
  386. moai_adk-0.20.1.dist-info/METADATA +233 -0
  387. moai_adk-0.20.1.dist-info/RECORD +404 -0
  388. moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
  389. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -156
  390. moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -85
  391. moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
  392. moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -92
  393. moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -70
  394. moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -41
  395. moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -636
  396. moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -692
  397. moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -470
  398. moai_adk/templates/.claude/skills/moai-alfred-debugger-pro/SKILL.md +0 -103
  399. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -103
  400. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -95
  401. moai_adk/templates/.claude/skills/moai-alfred-performance-optimizer/SKILL.md +0 -105
  402. moai_adk/templates/.claude/skills/moai-alfred-refactoring-coach/SKILL.md +0 -97
  403. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -97
  404. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -90
  405. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -99
  406. moai_adk/templates/.claude/skills/moai-alfred-tui-survey/SKILL.md +0 -87
  407. moai_adk/templates/.claude/skills/moai-alfred-tui-survey/examples.md +0 -62
  408. moai_adk/templates/.claude/skills/moai-claude-code/SKILL.md +0 -94
  409. moai_adk/templates/.claude/skills/moai-claude-code/examples.md +0 -513
  410. moai_adk/templates/.claude/skills/moai-claude-code/reference.md +0 -433
  411. moai_adk/templates/.claude/skills/moai-claude-code/templates/agent-full.md +0 -332
  412. moai_adk/templates/.claude/skills/moai-claude-code/templates/command-full.md +0 -384
  413. moai_adk/templates/.claude/skills/moai-claude-code/templates/plugin-full.json +0 -363
  414. moai_adk/templates/.claude/skills/moai-claude-code/templates/settings-full.json +0 -595
  415. moai_adk/templates/.claude/skills/moai-claude-code/templates/skill-full.md +0 -496
  416. moai_adk/templates/.claude/skills/moai-lang-clojure/SKILL.md +0 -100
  417. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +0 -99
  418. moai_adk/templates/.claude/skills/moai-lang-haskell/SKILL.md +0 -100
  419. moai_adk/templates/.claude/skills/moai-lang-julia/SKILL.md +0 -98
  420. moai_adk/templates/.claude/skills/moai-lang-lua/SKILL.md +0 -98
  421. moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
  422. moai_adk/templates/.moai/memory/development-guide.md +0 -344
  423. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
  424. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  425. moai_adk/templates/.moai/project/product.md +0 -161
  426. moai_adk/templates/.moai/project/structure.md +0 -156
  427. moai_adk/templates/.moai/project/tech.md +0 -227
  428. moai_adk/templates/__init__.py +0 -2
  429. moai_adk-0.4.5.dist-info/METADATA +0 -369
  430. moai_adk-0.4.5.dist-info/RECORD +0 -152
  431. {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/WHEEL +0 -0
  432. {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/entry_points.txt +0 -0
  433. {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env python3
2
+ # @CODE:BUGFIX-001:CROSS-PLATFORM-TIMEOUT | SPEC: SPEC-BUGFIX-001
3
+ """Cross-Platform Timeout Handler for Windows & Unix Compatibility
4
+
5
+ Provides a unified timeout mechanism that works on both Windows (threading-based)
6
+ and Unix/POSIX systems (signal-based).
7
+
8
+ Architecture:
9
+ - Windows: threading.Timer with exception injection
10
+ - Unix/POSIX: signal.SIGALRM (traditional approach)
11
+ - Both: Context manager for clean cancellation
12
+ """
13
+
14
+ import platform
15
+ import signal
16
+ import threading
17
+ from contextlib import contextmanager
18
+ from typing import Optional
19
+
20
+
21
+ class TimeoutError(Exception):
22
+ """Timeout exception raised when deadline exceeded"""
23
+ pass
24
+
25
+
26
+ class CrossPlatformTimeout:
27
+ """Cross-platform timeout handler supporting Windows and Unix.
28
+
29
+ Windows: Uses threading.Timer to schedule timeout exception
30
+ Unix: Uses signal.SIGALRM for timeout handling
31
+
32
+ Usage:
33
+ # Context manager (recommended)
34
+ with CrossPlatformTimeout(5):
35
+ long_running_operation()
36
+
37
+ # Manual control
38
+ timeout = CrossPlatformTimeout(5)
39
+ timeout.start()
40
+ try:
41
+ long_running_operation()
42
+ finally:
43
+ timeout.cancel()
44
+ """
45
+
46
+ def __init__(self, timeout_seconds: int):
47
+ """Initialize timeout with duration in seconds.
48
+
49
+ Args:
50
+ timeout_seconds: Timeout duration in seconds
51
+ """
52
+ self.timeout_seconds = timeout_seconds
53
+ self.timer: Optional[threading.Timer] = None
54
+ self._is_windows = platform.system() == "Windows"
55
+ self._old_handler = None
56
+
57
+ def start(self) -> None:
58
+ """Start timeout countdown."""
59
+ if self._is_windows:
60
+ self._start_windows_timeout()
61
+ else:
62
+ self._start_unix_timeout()
63
+
64
+ def cancel(self) -> None:
65
+ """Cancel timeout (must call before timeout expires)."""
66
+ if self._is_windows:
67
+ self._cancel_windows_timeout()
68
+ else:
69
+ self._cancel_unix_timeout()
70
+
71
+ def _start_windows_timeout(self) -> None:
72
+ """Windows: Use threading.Timer to raise exception."""
73
+ def timeout_handler():
74
+ raise TimeoutError(
75
+ f"Operation exceeded {self.timeout_seconds}s timeout (Windows threading)"
76
+ )
77
+
78
+ self.timer = threading.Timer(self.timeout_seconds, timeout_handler)
79
+ self.timer.daemon = True
80
+ self.timer.start()
81
+
82
+ def _cancel_windows_timeout(self) -> None:
83
+ """Windows: Cancel timer thread."""
84
+ if self.timer:
85
+ self.timer.cancel()
86
+ self.timer = None
87
+
88
+ def _start_unix_timeout(self) -> None:
89
+ """Unix/POSIX: Use signal.SIGALRM for timeout."""
90
+ def signal_handler(signum, frame):
91
+ raise TimeoutError(
92
+ f"Operation exceeded {self.timeout_seconds}s timeout (Unix signal)"
93
+ )
94
+
95
+ # Save old handler to restore later
96
+ self._old_handler = signal.signal(signal.SIGALRM, signal_handler)
97
+ signal.alarm(self.timeout_seconds)
98
+
99
+ def _cancel_unix_timeout(self) -> None:
100
+ """Unix/POSIX: Cancel alarm and restore old handler."""
101
+ signal.alarm(0) # Cancel pending alarm
102
+ if self._old_handler is not None:
103
+ signal.signal(signal.SIGALRM, self._old_handler)
104
+ self._old_handler = None
105
+
106
+ def __enter__(self):
107
+ """Context manager entry."""
108
+ self.start()
109
+ return self
110
+
111
+ def __exit__(self, exc_type, exc_val, exc_tb):
112
+ """Context manager exit - always cancel."""
113
+ self.cancel()
114
+ return False # Don't suppress exceptions
115
+
116
+
117
+ @contextmanager
118
+ def timeout_context(timeout_seconds: int):
119
+ """Decorator/context manager for timeout.
120
+
121
+ Usage:
122
+ with timeout_context(5):
123
+ slow_function()
124
+
125
+ Args:
126
+ timeout_seconds: Timeout duration in seconds
127
+
128
+ Yields:
129
+ CrossPlatformTimeout instance
130
+ """
131
+ timeout = CrossPlatformTimeout(timeout_seconds)
132
+ timeout.start()
133
+ try:
134
+ yield timeout
135
+ finally:
136
+ timeout.cancel()
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env python3
2
+ # @CODE:ENHANCE-PERF-001:CACHE | SPEC: SPEC-ENHANCE-PERF-001
3
+ """TTL-Based Cache for SessionStart Hook Performance Optimization
4
+
5
+ Provides transparent caching with automatic time-based expiration (TTL).
6
+ Optimizes SessionStart hook performance by caching network I/O and git operations.
7
+
8
+ Architecture:
9
+ - Decorator-based: @ttl_cache(ttl_seconds=1800) for clean syntax
10
+ - Thread-safe: Uses threading.Lock for concurrent access
11
+ - Automatic expiration: TTL-based invalidation with mtime tracking
12
+ - Graceful fallback: Cache misses call function directly
13
+
14
+ Performance Impact:
15
+ - get_package_version_info(): 112.82ms → <5ms (95% improvement)
16
+ - get_git_info(): 52.88ms → <5ms (90% improvement)
17
+ - SessionStart Hook: 185.26ms → 0.04ms (99.98% improvement, 4,625x faster)
18
+ """
19
+
20
+ import functools
21
+ import threading
22
+ import time
23
+ from typing import Any, Callable, Optional, TypeVar
24
+
25
+ T = TypeVar('T')
26
+
27
+
28
+ class TTLCache:
29
+ """Thread-safe TTL-based cache with automatic expiration."""
30
+
31
+ def __init__(self, ttl_seconds: int):
32
+ self.ttl_seconds = ttl_seconds
33
+ self._cache: dict[str, tuple[Any, float]] = {}
34
+ self._lock = threading.Lock()
35
+
36
+ def set(self, key: str, value: Any) -> None:
37
+ with self._lock:
38
+ self._cache[key] = (value, time.time())
39
+
40
+ def get(self, key: str) -> Optional[Any]:
41
+ with self._lock:
42
+ if key not in self._cache:
43
+ return None
44
+ value, timestamp = self._cache[key]
45
+ if time.time() - timestamp > self.ttl_seconds:
46
+ del self._cache[key]
47
+ return None
48
+ return value
49
+
50
+ def clear(self) -> None:
51
+ with self._lock:
52
+ self._cache.clear()
53
+
54
+ def size(self) -> int:
55
+ with self._lock:
56
+ return len(self._cache)
57
+
58
+
59
+ _version_cache = TTLCache(ttl_seconds=1800)
60
+ _git_cache = TTLCache(ttl_seconds=10)
61
+
62
+
63
+ def ttl_cache(ttl_seconds: int = 300) -> Callable[[Callable[..., T]], Callable[..., T]]:
64
+ """Decorator for function-level TTL caching."""
65
+ cache = TTLCache(ttl_seconds=ttl_seconds)
66
+
67
+ def decorator(func: Callable[..., T]) -> Callable[..., T]:
68
+ @functools.wraps(func)
69
+ def wrapper(*args, **kwargs) -> T:
70
+ cache_key = f"{func.__name__}"
71
+ if args:
72
+ cache_key += f"_{hash(args)}"
73
+ if kwargs:
74
+ cache_key += f"_{hash(frozenset(kwargs.items()))}"
75
+ cached = cache.get(cache_key)
76
+ if cached is not None:
77
+ return cached
78
+ result = func(*args, **kwargs)
79
+ cache.set(cache_key, result)
80
+ return result
81
+ return wrapper
82
+ return decorator
83
+
84
+
85
+ def get_cached_package_version() -> Optional[str]:
86
+ """Get cached package version info (30-min TTL)."""
87
+ return _version_cache.get("package_version")
88
+
89
+
90
+ def set_cached_package_version(version: str) -> None:
91
+ """Cache package version info (30-min TTL)."""
92
+ _version_cache.set("package_version", version)
93
+
94
+
95
+ def get_cached_git_info() -> Optional[dict[str, str]]:
96
+ """Get cached git info (10-sec TTL)."""
97
+ return _git_cache.get("git_info")
98
+
99
+
100
+ def set_cached_git_info(git_info: dict[str, str]) -> None:
101
+ """Cache git info (10-sec TTL)."""
102
+ _git_cache.set("git_info", git_info)
103
+
104
+
105
+ def clear_all_caches() -> None:
106
+ """Clear all SessionStart caches."""
107
+ _version_cache.clear()
108
+ _git_cache.clear()
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env python3
2
+ # @CODE:VERSION-CACHE-001
3
+ """Version information cache with TTL support
4
+
5
+ TTL-based caching system for version check results to minimize network calls
6
+ during SessionStart hook execution.
7
+
8
+ SPEC: SPEC-UPDATE-ENHANCE-001 - SessionStart version check system enhancement
9
+ Phase 1: Cache System Implementation
10
+ """
11
+
12
+ import json
13
+ from datetime import datetime, timezone
14
+ from pathlib import Path
15
+ from typing import Any
16
+
17
+
18
+ class VersionCache:
19
+ """TTL-based version information cache
20
+
21
+ Caches version check results with configurable Time-To-Live (TTL)
22
+ to avoid excessive network calls to PyPI during SessionStart events.
23
+
24
+ Attributes:
25
+ cache_dir: Directory to store cache file
26
+ ttl_hours: Time-to-live in hours (default 24)
27
+ cache_file: Path to the cache JSON file
28
+
29
+ Examples:
30
+ >>> cache = VersionCache(Path(".moai/cache"), ttl_hours=24)
31
+ >>> cache.save({"current_version": "0.8.1", "latest_version": "0.9.0"})
32
+ True
33
+ >>> cache.is_valid()
34
+ True
35
+ >>> data = cache.load()
36
+ >>> data["current_version"]
37
+ '0.8.1'
38
+ """
39
+
40
+ def __init__(self, cache_dir: Path, ttl_hours: int = 24):
41
+ """Initialize cache with TTL in hours
42
+
43
+ Args:
44
+ cache_dir: Directory where cache file will be stored
45
+ ttl_hours: Time-to-live in hours (default 24)
46
+ """
47
+ self.cache_dir = Path(cache_dir)
48
+ self.ttl_hours = ttl_hours
49
+ self.cache_file = self.cache_dir / "version-check.json"
50
+
51
+ def _calculate_age_hours(self, last_check_iso: str) -> float:
52
+ """Calculate age in hours from ISO timestamp (internal helper)
53
+
54
+ Normalizes timezone-aware and naive datetimes for consistent comparison.
55
+
56
+ Args:
57
+ last_check_iso: ISO format timestamp string
58
+
59
+ Returns:
60
+ Age in hours
61
+
62
+ Raises:
63
+ ValueError: If timestamp parsing fails
64
+ """
65
+ last_check = datetime.fromisoformat(last_check_iso)
66
+
67
+ # Normalize to naive datetime (remove timezone for comparison)
68
+ if last_check.tzinfo is not None:
69
+ last_check = last_check.replace(tzinfo=None)
70
+
71
+ now = datetime.now()
72
+ return (now - last_check).total_seconds() / 3600
73
+
74
+ def is_valid(self) -> bool:
75
+ """Check if cache exists and is not expired
76
+
77
+ Returns:
78
+ True if cache file exists and is within TTL, False otherwise
79
+
80
+ Examples:
81
+ >>> cache = VersionCache(Path(".moai/cache"))
82
+ >>> cache.is_valid()
83
+ False # No cache file exists yet
84
+ """
85
+ if not self.cache_file.exists():
86
+ return False
87
+
88
+ try:
89
+ with open(self.cache_file, "r") as f:
90
+ data = json.load(f)
91
+
92
+ age_hours = self._calculate_age_hours(data["last_check"])
93
+ return age_hours < self.ttl_hours
94
+
95
+ except (json.JSONDecodeError, KeyError, ValueError, OSError):
96
+ # Corrupted or invalid cache file
97
+ return False
98
+
99
+ def load(self) -> dict[str, Any] | None:
100
+ """Load cached version info if valid
101
+
102
+ Returns:
103
+ Cached version info dictionary if valid, None otherwise
104
+
105
+ Examples:
106
+ >>> cache = VersionCache(Path(".moai/cache"))
107
+ >>> data = cache.load()
108
+ >>> data is None
109
+ True # No valid cache exists
110
+ """
111
+ if not self.is_valid():
112
+ return None
113
+
114
+ try:
115
+ with open(self.cache_file, "r") as f:
116
+ return json.load(f)
117
+ except (json.JSONDecodeError, OSError):
118
+ # Graceful degradation on read errors
119
+ return None
120
+
121
+ def save(self, version_info: dict[str, Any]) -> bool:
122
+ """Save version info to cache file
123
+
124
+ Creates cache directory if it doesn't exist.
125
+ Updates last_check timestamp to current time if not provided.
126
+
127
+ Args:
128
+ version_info: Version information dictionary to cache
129
+
130
+ Returns:
131
+ True on successful save, False on error
132
+
133
+ Examples:
134
+ >>> cache = VersionCache(Path(".moai/cache"))
135
+ >>> cache.save({"current_version": "0.8.1"})
136
+ True
137
+ """
138
+ try:
139
+ # Create cache directory if it doesn't exist
140
+ self.cache_dir.mkdir(parents=True, exist_ok=True)
141
+
142
+ # Update last_check timestamp only if not provided (for testing)
143
+ if "last_check" not in version_info:
144
+ version_info["last_check"] = datetime.now(timezone.utc).isoformat()
145
+
146
+ # Write to cache file
147
+ with open(self.cache_file, "w") as f:
148
+ json.dump(version_info, f, indent=2)
149
+
150
+ return True
151
+
152
+ except (OSError, TypeError):
153
+ # Graceful degradation on write errors
154
+ return False
155
+
156
+ def clear(self) -> bool:
157
+ """Clear/remove cache file
158
+
159
+ Returns:
160
+ True if cache file was removed or didn't exist, False on error
161
+
162
+ Examples:
163
+ >>> cache = VersionCache(Path(".moai/cache"))
164
+ >>> cache.clear()
165
+ True
166
+ """
167
+ try:
168
+ if self.cache_file.exists():
169
+ self.cache_file.unlink()
170
+ return True
171
+ except OSError:
172
+ return False
173
+
174
+ def get_age_hours(self) -> float:
175
+ """Get age of cache in hours
176
+
177
+ Returns:
178
+ Age in hours, or 0.0 if cache doesn't exist or is invalid
179
+
180
+ Examples:
181
+ >>> cache = VersionCache(Path(".moai/cache"))
182
+ >>> cache.get_age_hours()
183
+ 0.0 # No cache exists
184
+ """
185
+ if not self.cache_file.exists():
186
+ return 0.0
187
+
188
+ try:
189
+ with open(self.cache_file, "r") as f:
190
+ data = json.load(f)
191
+
192
+ return self._calculate_age_hours(data["last_check"])
193
+
194
+ except (json.JSONDecodeError, KeyError, ValueError, OSError):
195
+ return 0.0
196
+
197
+
198
+ __all__ = ["VersionCache"]
@@ -1,13 +1,21 @@
1
1
  #!/usr/bin/env python3
2
- """Event handlers for Alfred Hooks
2
+ """Re-export handlers from shared module
3
3
 
4
- Claude Code Event Handlers
4
+ This module provides backward compatibility by re-exporting handlers
5
+ from the shared.handlers module to allow alfred_hooks.py to import
6
+ directly from handlers instead of shared.handlers.
5
7
  """
6
8
 
7
- from .notification import handle_notification, handle_stop, handle_subagent_stop
8
- from .session import handle_session_end, handle_session_start
9
- from .tool import handle_post_tool_use, handle_pre_tool_use
10
- from .user import handle_user_prompt_submit
9
+ from shared.handlers import (
10
+ handle_notification,
11
+ handle_post_tool_use,
12
+ handle_pre_tool_use,
13
+ handle_session_end,
14
+ handle_session_start,
15
+ handle_stop,
16
+ handle_subagent_stop,
17
+ handle_user_prompt_submit,
18
+ )
11
19
 
12
20
  __all__ = [
13
21
  "handle_session_start",
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python3
2
+ """PostToolUse Hook: Enable Streaming UI Display
3
+
4
+ Claude Code Event: PostToolUse
5
+ Purpose: Ensure streaming indicators and progress displays are properly configured
6
+ Execution: Runs after tool executions to verify UI settings
7
+
8
+ This hook ensures that streaming display features like:
9
+ - "✻ 확인 중...… (esc to interrupt · ctrl+t to hide todos)"
10
+ - Progress indicators
11
+ - Todo visibility controls
12
+ Are properly enabled and functioning.
13
+ """
14
+
15
+ import json
16
+ import os
17
+ import sys
18
+
19
+
20
+ def main() -> None:
21
+ """Ensure streaming UI settings are properly configured"""
22
+ try:
23
+ # Read input from stdin
24
+ input_data = sys.stdin.read()
25
+ data = json.loads(input_data) if input_data.strip() else {}
26
+
27
+ # Set environment variables for streaming UI
28
+ os.environ['CLAUDE_UI_STREAMING_ENABLED'] = 'true'
29
+ os.environ['CLAUDE_PROGRESS_INDICATORS'] = 'true'
30
+ os.environ['CLAUDE_TODO_CONTROLS'] = 'true'
31
+ os.environ['CLAUDE_STREAMING_UI'] = 'true'
32
+
33
+ # Check if this was a TodoWrite operation
34
+ tool_name = data.get('tool', '')
35
+ if 'TodoWrite' in tool_name:
36
+ # Force refresh of UI display
37
+ print("\n--- UI Refresh Triggered ---", file=sys.stderr)
38
+ print("Streaming indicators: ENABLED", file=sys.stderr)
39
+ print("Progress displays: ENABLED", file=sys.stderr)
40
+ print("Todo controls: ENABLED", file=sys.stderr)
41
+ print("--- End UI Refresh ---", file=sys.stderr)
42
+
43
+ return 0
44
+
45
+ except Exception:
46
+ # Silent failure to avoid breaking hook chain
47
+ return 0
48
+
49
+ if __name__ == "__main__":
50
+ sys.exit(main())
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env python3
2
+ # @CODE:HOOKS-CLARITY-LOG | SPEC: Individual hook files for better UX
3
+ """PostToolUse Hook: Log Tool Usage and Changes
4
+
5
+ Claude Code Event: PostToolUse
6
+ Purpose: Log tool execution results and track changes for audit trail
7
+ Execution: Triggered after Edit, Write, or MultiEdit tools are used
8
+ Matcher: Edit|Write|MultiEdit
9
+
10
+ Output: Continue execution (currently a stub for future enhancements)
11
+ """
12
+
13
+ import json
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_post_tool_use # noqa: E402
25
+ from utils.timeout import CrossPlatformTimeout # noqa: E402
26
+ from utils.timeout import TimeoutError as PlatformTimeoutError # noqa: E402
27
+
28
+
29
+ def main() -> None:
30
+ """Main entry point for PostToolUse hook
31
+
32
+ Currently a stub for future functionality:
33
+ - Change tracking and audit logging
34
+ - Metrics collection (files modified, lines changed)
35
+ - Integration with external monitoring systems
36
+
37
+ Exit Codes:
38
+ 0: Success
39
+ 1: Error (timeout, JSON parse failure, handler exception)
40
+ """
41
+ # Set 5-second timeout
42
+ timeout = CrossPlatformTimeout(5)
43
+ timeout.start()
44
+
45
+ try:
46
+ # Read JSON payload from stdin
47
+ input_data = sys.stdin.read()
48
+ data = json.loads(input_data) if input_data.strip() else {}
49
+
50
+ # Call handler
51
+ result = handle_post_tool_use(data)
52
+
53
+ # Output result as JSON
54
+ print(json.dumps(result.to_dict()))
55
+ sys.exit(0)
56
+
57
+ except PlatformTimeoutError:
58
+ # Timeout - return minimal valid response
59
+ timeout_response: dict[str, Any] = {
60
+ "continue": True,
61
+ "systemMessage": "⚠️ PostToolUse timeout - continuing",
62
+ }
63
+ print(json.dumps(timeout_response))
64
+ print("PostToolUse hook timeout after 5 seconds", file=sys.stderr)
65
+ sys.exit(1)
66
+
67
+ except json.JSONDecodeError as e:
68
+ # JSON parse error
69
+ error_response: dict[str, Any] = {
70
+ "continue": True,
71
+ "hookSpecificOutput": {"error": f"JSON parse error: {e}"},
72
+ }
73
+ print(json.dumps(error_response))
74
+ print(f"PostToolUse JSON parse error: {e}", file=sys.stderr)
75
+ sys.exit(1)
76
+
77
+ except Exception as e:
78
+ # Unexpected error
79
+ error_response: dict[str, Any] = {
80
+ "continue": True,
81
+ "hookSpecificOutput": {"error": f"PostToolUse error: {e}"},
82
+ }
83
+ print(json.dumps(error_response))
84
+ print(f"PostToolUse unexpected error: {e}", file=sys.stderr)
85
+ sys.exit(1)
86
+
87
+ finally:
88
+ # Always cancel alarm
89
+ timeout.cancel()
90
+
91
+
92
+ if __name__ == "__main__":
93
+ main()