moai-adk 0.4.10__tar.gz → 0.4.11__tar.gz

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 (268) hide show
  1. {moai_adk-0.4.10 → moai_adk-0.4.11}/PKG-INFO +39 -21
  2. {moai_adk-0.4.10 → moai_adk-0.4.11}/README.md +38 -20
  3. {moai_adk-0.4.10 → moai_adk-0.4.11}/pyproject.toml +1 -1
  4. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +1 -0
  5. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/core/__init__.py +2 -1
  6. moai_adk-0.4.11/src/moai_adk/templates/.claude/hooks/alfred/core/tags.py +198 -0
  7. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +34 -14
  8. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +1 -1
  9. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +2 -2
  10. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/CLAUDE.md +43 -20
  11. {moai_adk-0.4.10 → moai_adk-0.4.11}/.gitignore +0 -0
  12. {moai_adk-0.4.10 → moai_adk-0.4.11}/LICENSE +0 -0
  13. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/__init__.py +0 -0
  14. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/__main__.py +0 -0
  15. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/__init__.py +0 -0
  16. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/commands/__init__.py +0 -0
  17. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/commands/backup.py +0 -0
  18. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/commands/doctor.py +0 -0
  19. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/commands/init.py +0 -0
  20. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/commands/status.py +0 -0
  21. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/commands/update.py +0 -0
  22. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/main.py +0 -0
  23. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/prompts/__init__.py +0 -0
  24. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/cli/prompts/init_prompts.py +0 -0
  25. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/__init__.py +0 -0
  26. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/diagnostics/__init__.py +0 -0
  27. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/diagnostics/slash_commands.py +0 -0
  28. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/__init__.py +0 -0
  29. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/branch.py +0 -0
  30. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/branch_manager.py +0 -0
  31. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/checkpoint.py +0 -0
  32. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/commit.py +0 -0
  33. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/event_detector.py +0 -0
  34. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/git/manager.py +0 -0
  35. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/__init__.py +0 -0
  36. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/backup_utils.py +0 -0
  37. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/checker.py +0 -0
  38. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/detector.py +0 -0
  39. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/initializer.py +0 -0
  40. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/phase_executor.py +0 -0
  41. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/project/validator.py +0 -0
  42. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/quality/__init__.py +0 -0
  43. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/quality/trust_checker.py +0 -0
  44. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/quality/validators/__init__.py +0 -0
  45. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/quality/validators/base_validator.py +0 -0
  46. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/template/__init__.py +0 -0
  47. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/template/backup.py +0 -0
  48. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/template/config.py +0 -0
  49. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/template/languages.py +0 -0
  50. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/template/merger.py +0 -0
  51. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/core/template/processor.py +0 -0
  52. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -0
  53. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -0
  54. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -0
  55. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -0
  56. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -0
  57. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -0
  58. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -0
  59. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -0
  60. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -0
  61. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -0
  62. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -0
  63. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -0
  64. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/commands/alfred/0-project.md +0 -0
  65. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -0
  66. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/commands/alfred/2-run.md +0 -0
  67. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -0
  68. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -0
  69. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/README.md +0 -0
  70. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/core/checkpoint.py +0 -0
  71. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -0
  72. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -0
  73. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -0
  74. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -0
  75. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -0
  76. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -0
  77. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -0
  78. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -0
  79. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -0
  80. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/settings.json +0 -0
  81. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -0
  82. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -0
  83. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -0
  84. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -0
  85. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -0
  86. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -0
  87. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -0
  88. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -0
  89. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -0
  90. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -0
  91. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -0
  92. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -0
  93. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -0
  94. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -0
  95. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -0
  96. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -0
  97. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -0
  98. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -0
  99. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -0
  100. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -0
  101. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -0
  102. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -0
  103. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -0
  104. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -0
  105. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -0
  106. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -0
  107. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -0
  108. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -0
  109. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -0
  110. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -0
  111. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -0
  112. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -0
  113. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -0
  114. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -0
  115. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -0
  116. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -0
  117. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -0
  118. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -0
  119. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -0
  120. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -0
  121. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -0
  122. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -0
  123. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -0
  124. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -0
  125. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -0
  126. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -0
  127. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -0
  128. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -0
  129. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -0
  130. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -0
  131. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -0
  132. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -0
  133. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -0
  134. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -0
  135. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -0
  136. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -0
  137. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -0
  138. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -0
  139. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -0
  140. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -0
  141. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -0
  142. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -0
  143. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -0
  144. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -0
  145. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -0
  146. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -0
  147. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -0
  148. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -0
  149. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -0
  150. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -0
  151. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -0
  152. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -0
  153. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -0
  154. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -0
  155. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -0
  156. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -0
  157. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -0
  158. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -0
  159. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -0
  160. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -0
  161. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -0
  162. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -0
  163. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -0
  164. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -0
  165. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -0
  166. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -0
  167. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -0
  168. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -0
  169. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -0
  170. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -0
  171. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -0
  172. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -0
  173. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -0
  174. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -0
  175. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -0
  176. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -0
  177. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  178. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -0
  179. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -0
  180. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -0
  181. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -0
  182. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -0
  183. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -0
  184. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -0
  185. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -0
  186. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -0
  187. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -0
  188. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -0
  189. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -0
  190. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -0
  191. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -0
  192. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -0
  193. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -0
  194. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -0
  195. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -0
  196. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -0
  197. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -0
  198. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -0
  199. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -0
  200. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -0
  201. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -0
  202. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -0
  203. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -0
  204. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -0
  205. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -0
  206. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -0
  207. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -0
  208. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -0
  209. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -0
  210. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -0
  211. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -0
  212. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -0
  213. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -0
  214. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -0
  215. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -0
  216. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -0
  217. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -0
  218. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -0
  219. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -0
  220. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -0
  221. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -0
  222. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -0
  223. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -0
  224. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -0
  225. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -0
  226. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -0
  227. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -0
  228. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -0
  229. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -0
  230. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -0
  231. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -0
  232. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -0
  233. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +0 -0
  234. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -0
  235. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -0
  236. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -0
  237. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -0
  238. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -0
  239. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -0
  240. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -0
  241. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -0
  242. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -0
  243. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -0
  244. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -0
  245. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -0
  246. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -0
  247. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -0
  248. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -0
  249. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -0
  250. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -0
  251. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -0
  252. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -0
  253. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -0
  254. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -0
  255. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  256. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -0
  257. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.gitignore +0 -0
  258. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/config.json +0 -0
  259. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/memory/development-guide.md +0 -0
  260. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -0
  261. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/memory/spec-metadata.md +0 -0
  262. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/project/product.md +0 -0
  263. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/project/structure.md +0 -0
  264. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/.moai/project/tech.md +0 -0
  265. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/templates/__init__.py +0 -0
  266. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/utils/__init__.py +0 -0
  267. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/utils/banner.py +0 -0
  268. {moai_adk-0.4.10 → moai_adk-0.4.11}/src/moai_adk/utils/logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: moai-adk
3
- Version: 0.4.10
3
+ Version: 0.4.11
4
4
  Summary: MoAI Agentic Development Kit - SPEC-First TDD with Alfred SuperAgent & Complete Skills v2.0
5
5
  Project-URL: Homepage, https://github.com/modu-ai/moai-adk
6
6
  Project-URL: Repository, https://github.com/modu-ai/moai-adk
@@ -190,7 +190,7 @@ uv tool install moai-adk
190
190
 
191
191
  # Verify installation
192
192
  moai-adk --version
193
- # Output: MoAI-ADK v0.4.10
193
+ # Output: MoAI-ADK v0.4.11
194
194
  ```
195
195
 
196
196
  Once installed, you can use the `moai-adk` command anywhere.
@@ -1108,7 +1108,7 @@ Hooks are **event-driven** scripts that trigger automatically at specific points
1108
1108
  #### 2. PreToolUse (Before Tool Execution)
1109
1109
 
1110
1110
  **Triggers**: Before executing file edits, Bash commands, or MultiEdit operations
1111
- **Purpose**: Detect risky operations and automatically create safety checkpoints
1111
+ **Purpose**: Detect risky operations and automatically create safety checkpoints + TAG Guard
1112
1112
 
1113
1113
  **Protection Against**:
1114
1114
  - `rm -rf` (file deletion)
@@ -1116,13 +1116,30 @@ Hooks are **event-driven** scripts that trigger automatically at specific points
1116
1116
  - Editing critical files (`CLAUDE.md`, `config.json`)
1117
1117
  - Mass edits (10+ files at once via MultiEdit)
1118
1118
 
1119
+ **TAG Guard (New in v0.4.11)**:
1120
+ Automatically detects missing @TAG annotations in changed files:
1121
+ - Scans staged, modified, and untracked files
1122
+ - Warns when SPEC/TEST/CODE/DOC files lack required @TAG markers
1123
+ - Configurable rules via `.moai/tag-rules.json`
1124
+ - Non-blocking (gentle reminder, doesn't stop execution)
1125
+
1119
1126
  **What You See**:
1120
1127
  ```
1121
1128
  🛡️ Checkpoint created: before-delete-20251023-143000
1122
1129
  Operation: delete
1123
1130
  ```
1124
1131
 
1125
- **Why It Matters**: Prevents data loss from mistakes. You can always restore from the checkpoint if something goes wrong.
1132
+ Or when TAGs are missing:
1133
+ ```
1134
+ ⚠️ TAG 누락 감지: 생성/수정한 파일 중 @TAG가 없는 항목이 있습니다.
1135
+ - src/auth/service.py → 기대 태그: @CODE:
1136
+ - tests/test_auth.py → 기대 태그: @TEST:
1137
+ 권장 조치:
1138
+ 1) SPEC/TEST/CODE/DOC 유형에 맞는 @TAG를 파일 상단 주석이나 헤더에 추가
1139
+ 2) rg로 확인: rg '@(SPEC|TEST|CODE|DOC):' -n <경로>
1140
+ ```
1141
+
1142
+ **Why It Matters**: Prevents data loss from mistakes and ensures @TAG traceability. You can always restore from the checkpoint if something goes wrong.
1126
1143
 
1127
1144
  #### 3. UserPromptSubmit (Prompt Input)
1128
1145
 
@@ -1185,7 +1202,7 @@ If you need to temporarily disable hooks, edit `.claude/settings.json`:
1185
1202
  | Hook | Status | Feature |
1186
1203
  |------|--------|---------|
1187
1204
  | **SessionStart** | ✅ Active | Project status summary (language, Git, SPEC progress, checkpoints) |
1188
- | **PreToolUse** | ✅ Active | Risk detection + auto checkpoint (critical-delete, delete, merge, script) |
1205
+ | **PreToolUse** | ✅ Active | Risk detection + auto checkpoint (critical-delete, delete, merge, script) + **TAG Guard** (missing @TAG detection) |
1189
1206
  | **UserPromptSubmit** | ✅ Active | JIT context loading (auto-load related SPEC, tests, code, docs) |
1190
1207
  | **PostToolUse** | ✅ Active | Auto-run tests after code changes (9 languages: Python, TS, JS, Go, Rust, Java, Kotlin, Swift, Dart) |
1191
1208
  | **SessionEnd** | ✅ Active | Session cleanup and state saving |
@@ -1219,18 +1236,18 @@ If you need to temporarily disable hooks, edit `.claude/settings.json`:
1219
1236
 
1220
1237
  ---
1221
1238
 
1222
- ## v0.4 Series Updates (New!)
1239
+ ## Latest Updates (New!)
1223
1240
 
1224
1241
  | Version | Key Features | Date |
1225
1242
  | ---------- | ------------------------------------------------------------------------------------ | ---------- |
1243
+ | **v0.4.11** | ✨ TAG Guard system + CLAUDE.md formatting improvements + Code cleanup | 2025-10-23 |
1226
1244
  | **v0.4.10** | 🔧 Hook robustness improvements + Bilingual documentation + Template language config | 2025-10-23 |
1227
1245
  | **v0.4.9** | 🎯 Hook JSON schema validation fixes + Comprehensive tests (468/468 passing) | 2025-10-23 |
1228
1246
  | **v0.4.8** | 🚀 Release automation + PyPI deployment + Skills refinement | 2025-10-23 |
1229
1247
  | **v0.4.7** | 📖 Korean language optimization + SPEC-First principle documentation | 2025-10-22 |
1230
1248
  | **v0.4.6** | 🎉 Complete Skills v2.0 (100% Production-Ready) + 85,000 lines official docs + 300+ TDD examples | 2025-10-22 |
1231
- | **v0.4.5** | ✅ CI/CD fixes + Multi-language README + Deployment cleanup | 2025-10-22 |
1232
1249
 
1233
- > 📦 **Install Now**: `pip install moai-adk==0.4.10` or `uv tool install moai-adk==0.4.10`
1250
+ > 📦 **Install Now**: `pip install moai-adk==0.4.11` or `uv tool install moai-adk==0.4.11`
1234
1251
 
1235
1252
  ---
1236
1253
 
@@ -1254,24 +1271,24 @@ Let’s build a Mini Kanban Board web application designed to help you master Mo
1254
1271
 
1255
1272
  ```mermaid
1256
1273
  gantt
1257
- title Mini Kanban Board 4week plan
1274
+ title Mini Kanban Board - 4-week plan
1258
1275
  dateFormat YYYY-MM-DD
1259
1276
 
1260
1277
  section Phase 1: Backend Basics
1261
- CH07: Define SPEC-001~004 :active, ch07-spec, 2025-11-03, 1d
1262
- CH07: Implement SpecScanner (TDD) :active, ch07-impl, 2025-11-04, 1d
1278
+ Define SPEC-001-004 :active, ch07-spec, 2025-11-03, 1d
1279
+ Implement SpecScanner (TDD) :active, ch07-impl, 2025-11-04, 1d
1263
1280
 
1264
1281
  section Phase 2: Backend Advanced
1265
- CH08: Implement REST API :active, ch08-api, 2025-11-05, 1d
1266
- CH08: WebSocket + File Watch :active, ch08-ws, 2025-11-06, 1d
1282
+ Implement REST API :active, ch08-api, 2025-11-05, 1d
1283
+ WebSocket + File Watch :active, ch08-ws, 2025-11-06, 1d
1267
1284
 
1268
1285
  section Phase 3: Frontend Basics
1269
- CH09: React init + SPEC-009~012 :active, ch09-spec, 2025-11-10, 1d
1270
- CH09: Kanban Board (TDD) :active, ch09-impl, 2025-11-11, 1d
1286
+ React init + SPEC-009-012 :active, ch09-spec, 2025-11-10, 1d
1287
+ Kanban Board (TDD) :active, ch09-impl, 2025-11-11, 1d
1271
1288
 
1272
1289
  section Phase 4: Advanced + Deploy
1273
- CH10: E2E + CI/CD :active, ch10-e2e, 2025-11-12, 1d
1274
- CH10: Docker Compose + Optimize :active, ch10-deploy, 2025-11-13, 1d
1290
+ E2E + CI/CD :active, ch10-e2e, 2025-11-12, 1d
1291
+ Docker Compose + Optimize :active, ch10-deploy, 2025-11-13, 1d
1275
1292
  ```
1276
1293
 
1277
1294
  ### 16‑SPEC Roadmap
@@ -1522,8 +1539,8 @@ cd frontend
1522
1539
  | ------------------------ | ------------------------------------------------------- |
1523
1540
  | **GitHub Repository** | https://github.com/modu-ai/moai-adk |
1524
1541
  | **Issues & Discussions** | https://github.com/modu-ai/moai-adk/issues |
1525
- | **PyPI Package** | https://pypi.org/project/moai-adk/ (Latest: v0.4.6) |
1526
- | **Latest Release** | https://github.com/modu-ai/moai-adk/releases/tag/v0.4.6 |
1542
+ | **PyPI Package** | https://pypi.org/project/moai-adk/ (Latest: v0.4.11) |
1543
+ | **Latest Release** | https://github.com/modu-ai/moai-adk/releases/tag/v0.4.11 |
1527
1544
  | **Documentation** | See `.moai/`, `.claude/`, `docs/` within project |
1528
1545
 
1529
1546
  ---
@@ -1544,11 +1561,12 @@ Start a new experience of **trustworthy AI development** with Alfred! 🤖
1544
1561
 
1545
1562
  ---
1546
1563
 
1547
- **MoAI-ADK v0.4.10** — SPEC-First TDD with AI SuperAgent & Complete Skills v2.0
1564
+ **MoAI-ADK v0.4.11** — SPEC-First TDD with AI SuperAgent & Complete Skills v2.0 + TAG Guard
1548
1565
  - 📦 PyPI: https://pypi.org/project/moai-adk/
1549
1566
  - 🏠 GitHub: https://github.com/modu-ai/moai-adk
1550
1567
  - 📝 License: MIT
1551
1568
  - ⭐ Skills: 55+ Production-Ready Guides
1552
- - ✅ Tests: 468/468 Passing (86% coverage)
1569
+ - ✅ Tests: 467/476 Passing (85.60% coverage)
1570
+ - 🏷️ TAG Guard: Automatic @TAG validation in PreToolUse Hook
1553
1571
 
1554
1572
  ---
@@ -151,7 +151,7 @@ uv tool install moai-adk
151
151
 
152
152
  # Verify installation
153
153
  moai-adk --version
154
- # Output: MoAI-ADK v0.4.10
154
+ # Output: MoAI-ADK v0.4.11
155
155
  ```
156
156
 
157
157
  Once installed, you can use the `moai-adk` command anywhere.
@@ -1069,7 +1069,7 @@ Hooks are **event-driven** scripts that trigger automatically at specific points
1069
1069
  #### 2. PreToolUse (Before Tool Execution)
1070
1070
 
1071
1071
  **Triggers**: Before executing file edits, Bash commands, or MultiEdit operations
1072
- **Purpose**: Detect risky operations and automatically create safety checkpoints
1072
+ **Purpose**: Detect risky operations and automatically create safety checkpoints + TAG Guard
1073
1073
 
1074
1074
  **Protection Against**:
1075
1075
  - `rm -rf` (file deletion)
@@ -1077,13 +1077,30 @@ Hooks are **event-driven** scripts that trigger automatically at specific points
1077
1077
  - Editing critical files (`CLAUDE.md`, `config.json`)
1078
1078
  - Mass edits (10+ files at once via MultiEdit)
1079
1079
 
1080
+ **TAG Guard (New in v0.4.11)**:
1081
+ Automatically detects missing @TAG annotations in changed files:
1082
+ - Scans staged, modified, and untracked files
1083
+ - Warns when SPEC/TEST/CODE/DOC files lack required @TAG markers
1084
+ - Configurable rules via `.moai/tag-rules.json`
1085
+ - Non-blocking (gentle reminder, doesn't stop execution)
1086
+
1080
1087
  **What You See**:
1081
1088
  ```
1082
1089
  🛡️ Checkpoint created: before-delete-20251023-143000
1083
1090
  Operation: delete
1084
1091
  ```
1085
1092
 
1086
- **Why It Matters**: Prevents data loss from mistakes. You can always restore from the checkpoint if something goes wrong.
1093
+ Or when TAGs are missing:
1094
+ ```
1095
+ ⚠️ TAG 누락 감지: 생성/수정한 파일 중 @TAG가 없는 항목이 있습니다.
1096
+ - src/auth/service.py → 기대 태그: @CODE:
1097
+ - tests/test_auth.py → 기대 태그: @TEST:
1098
+ 권장 조치:
1099
+ 1) SPEC/TEST/CODE/DOC 유형에 맞는 @TAG를 파일 상단 주석이나 헤더에 추가
1100
+ 2) rg로 확인: rg '@(SPEC|TEST|CODE|DOC):' -n <경로>
1101
+ ```
1102
+
1103
+ **Why It Matters**: Prevents data loss from mistakes and ensures @TAG traceability. You can always restore from the checkpoint if something goes wrong.
1087
1104
 
1088
1105
  #### 3. UserPromptSubmit (Prompt Input)
1089
1106
 
@@ -1146,7 +1163,7 @@ If you need to temporarily disable hooks, edit `.claude/settings.json`:
1146
1163
  | Hook | Status | Feature |
1147
1164
  |------|--------|---------|
1148
1165
  | **SessionStart** | ✅ Active | Project status summary (language, Git, SPEC progress, checkpoints) |
1149
- | **PreToolUse** | ✅ Active | Risk detection + auto checkpoint (critical-delete, delete, merge, script) |
1166
+ | **PreToolUse** | ✅ Active | Risk detection + auto checkpoint (critical-delete, delete, merge, script) + **TAG Guard** (missing @TAG detection) |
1150
1167
  | **UserPromptSubmit** | ✅ Active | JIT context loading (auto-load related SPEC, tests, code, docs) |
1151
1168
  | **PostToolUse** | ✅ Active | Auto-run tests after code changes (9 languages: Python, TS, JS, Go, Rust, Java, Kotlin, Swift, Dart) |
1152
1169
  | **SessionEnd** | ✅ Active | Session cleanup and state saving |
@@ -1180,18 +1197,18 @@ If you need to temporarily disable hooks, edit `.claude/settings.json`:
1180
1197
 
1181
1198
  ---
1182
1199
 
1183
- ## v0.4 Series Updates (New!)
1200
+ ## Latest Updates (New!)
1184
1201
 
1185
1202
  | Version | Key Features | Date |
1186
1203
  | ---------- | ------------------------------------------------------------------------------------ | ---------- |
1204
+ | **v0.4.11** | ✨ TAG Guard system + CLAUDE.md formatting improvements + Code cleanup | 2025-10-23 |
1187
1205
  | **v0.4.10** | 🔧 Hook robustness improvements + Bilingual documentation + Template language config | 2025-10-23 |
1188
1206
  | **v0.4.9** | 🎯 Hook JSON schema validation fixes + Comprehensive tests (468/468 passing) | 2025-10-23 |
1189
1207
  | **v0.4.8** | 🚀 Release automation + PyPI deployment + Skills refinement | 2025-10-23 |
1190
1208
  | **v0.4.7** | 📖 Korean language optimization + SPEC-First principle documentation | 2025-10-22 |
1191
1209
  | **v0.4.6** | 🎉 Complete Skills v2.0 (100% Production-Ready) + 85,000 lines official docs + 300+ TDD examples | 2025-10-22 |
1192
- | **v0.4.5** | ✅ CI/CD fixes + Multi-language README + Deployment cleanup | 2025-10-22 |
1193
1210
 
1194
- > 📦 **Install Now**: `pip install moai-adk==0.4.10` or `uv tool install moai-adk==0.4.10`
1211
+ > 📦 **Install Now**: `pip install moai-adk==0.4.11` or `uv tool install moai-adk==0.4.11`
1195
1212
 
1196
1213
  ---
1197
1214
 
@@ -1215,24 +1232,24 @@ Let’s build a Mini Kanban Board web application designed to help you master Mo
1215
1232
 
1216
1233
  ```mermaid
1217
1234
  gantt
1218
- title Mini Kanban Board 4week plan
1235
+ title Mini Kanban Board - 4-week plan
1219
1236
  dateFormat YYYY-MM-DD
1220
1237
 
1221
1238
  section Phase 1: Backend Basics
1222
- CH07: Define SPEC-001~004 :active, ch07-spec, 2025-11-03, 1d
1223
- CH07: Implement SpecScanner (TDD) :active, ch07-impl, 2025-11-04, 1d
1239
+ Define SPEC-001-004 :active, ch07-spec, 2025-11-03, 1d
1240
+ Implement SpecScanner (TDD) :active, ch07-impl, 2025-11-04, 1d
1224
1241
 
1225
1242
  section Phase 2: Backend Advanced
1226
- CH08: Implement REST API :active, ch08-api, 2025-11-05, 1d
1227
- CH08: WebSocket + File Watch :active, ch08-ws, 2025-11-06, 1d
1243
+ Implement REST API :active, ch08-api, 2025-11-05, 1d
1244
+ WebSocket + File Watch :active, ch08-ws, 2025-11-06, 1d
1228
1245
 
1229
1246
  section Phase 3: Frontend Basics
1230
- CH09: React init + SPEC-009~012 :active, ch09-spec, 2025-11-10, 1d
1231
- CH09: Kanban Board (TDD) :active, ch09-impl, 2025-11-11, 1d
1247
+ React init + SPEC-009-012 :active, ch09-spec, 2025-11-10, 1d
1248
+ Kanban Board (TDD) :active, ch09-impl, 2025-11-11, 1d
1232
1249
 
1233
1250
  section Phase 4: Advanced + Deploy
1234
- CH10: E2E + CI/CD :active, ch10-e2e, 2025-11-12, 1d
1235
- CH10: Docker Compose + Optimize :active, ch10-deploy, 2025-11-13, 1d
1251
+ E2E + CI/CD :active, ch10-e2e, 2025-11-12, 1d
1252
+ Docker Compose + Optimize :active, ch10-deploy, 2025-11-13, 1d
1236
1253
  ```
1237
1254
 
1238
1255
  ### 16‑SPEC Roadmap
@@ -1483,8 +1500,8 @@ cd frontend
1483
1500
  | ------------------------ | ------------------------------------------------------- |
1484
1501
  | **GitHub Repository** | https://github.com/modu-ai/moai-adk |
1485
1502
  | **Issues & Discussions** | https://github.com/modu-ai/moai-adk/issues |
1486
- | **PyPI Package** | https://pypi.org/project/moai-adk/ (Latest: v0.4.6) |
1487
- | **Latest Release** | https://github.com/modu-ai/moai-adk/releases/tag/v0.4.6 |
1503
+ | **PyPI Package** | https://pypi.org/project/moai-adk/ (Latest: v0.4.11) |
1504
+ | **Latest Release** | https://github.com/modu-ai/moai-adk/releases/tag/v0.4.11 |
1488
1505
  | **Documentation** | See `.moai/`, `.claude/`, `docs/` within project |
1489
1506
 
1490
1507
  ---
@@ -1505,11 +1522,12 @@ Start a new experience of **trustworthy AI development** with Alfred! 🤖
1505
1522
 
1506
1523
  ---
1507
1524
 
1508
- **MoAI-ADK v0.4.10** — SPEC-First TDD with AI SuperAgent & Complete Skills v2.0
1525
+ **MoAI-ADK v0.4.11** — SPEC-First TDD with AI SuperAgent & Complete Skills v2.0 + TAG Guard
1509
1526
  - 📦 PyPI: https://pypi.org/project/moai-adk/
1510
1527
  - 🏠 GitHub: https://github.com/modu-ai/moai-adk
1511
1528
  - 📝 License: MIT
1512
1529
  - ⭐ Skills: 55+ Production-Ready Guides
1513
- - ✅ Tests: 468/468 Passing (86% coverage)
1530
+ - ✅ Tests: 467/476 Passing (85.60% coverage)
1531
+ - 🏷️ TAG Guard: Automatic @TAG validation in PreToolUse Hook
1514
1532
 
1515
1533
  ---
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "moai-adk"
3
- version = "0.4.10"
3
+ version = "0.4.11"
4
4
  description = "MoAI Agentic Development Kit - SPEC-First TDD with Alfred SuperAgent & Complete Skills v2.0"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -55,6 +55,7 @@ Setup sys.path for package imports
55
55
  import json
56
56
  import sys
57
57
  from pathlib import Path
58
+ from typing import Any
58
59
 
59
60
  from core import HookResult
60
61
  from handlers import (
@@ -136,7 +136,8 @@ class HookResult:
136
136
  Examples:
137
137
  >>> result = HookResult(context_files=["tests/"])
138
138
  >>> result.to_user_prompt_submit_dict()
139
- {'continue': True, 'hookSpecificOutput': {'hookEventName': 'UserPromptSubmit', 'additionalContext': '📎 Context: tests/'}}
139
+ {'continue': True, 'hookSpecificOutput': \
140
+ {'hookEventName': 'UserPromptSubmit', 'additionalContext': '📎 Context: tests/'}}
140
141
  """
141
142
  # Convert context_files to additionalContext string
142
143
  if self.context_files:
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env python3
2
+ # @CODE:HOOK-TAG-001 | SPEC: TBD | TEST: tests/hooks/test_tag_validation.py
3
+ """TAG validation helpers for MoAI-ADK hooks
4
+
5
+ Fast checks used by PreToolUse/PostToolUse to nudge users when
6
+ new or modified files are missing required @TAG annotations.
7
+
8
+ Configurable rules with sensible defaults:
9
+ - Load patterns from .moai/tag-rules.json if present.
10
+ - Otherwise, apply default glob patterns (folder names are not hard-coded only).
11
+
12
+ Defaults (order matters; first match wins):
13
+ 1) SPEC
14
+ - .moai/specs/**
15
+ - **/SPEC-*/spec.md
16
+ 2) TEST
17
+ - **/*_test.py, **/test_*.py, **/*.test.* (ts,tsx,js,jsx,go,rs)
18
+ - **/*.spec.* (ts,tsx,js,jsx)
19
+ - tests/**
20
+ 3) DOC
21
+ - docs/**/*.md, **/README.md, **/*.api.md
22
+ 4) CODE
23
+ - Source extensions: .py,.ts,.tsx,.js,.jsx,.go,.rs,.java,.kt,.rb,.php,.c,.cpp,.cs,.swift,.scala
24
+ - Excluding TEST patterns
25
+
26
+ Notes:
27
+ - Best-effort: skip binary/large files and non-target paths
28
+ - Do not block execution; return a list of issues for messaging
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import fnmatch
34
+ import json
35
+ import subprocess
36
+ from dataclasses import dataclass
37
+ from pathlib import Path
38
+ from typing import Iterable, List, Optional
39
+
40
+ DEFAULT_CODE_EXTS = (
41
+ ".py", ".ts", ".tsx", ".js", ".jsx", ".go", ".rs",
42
+ ".java", ".kt", ".rb", ".php", ".c", ".cpp", ".cs",
43
+ ".swift", ".scala"
44
+ )
45
+
46
+
47
+ @dataclass
48
+ class TagIssue:
49
+ path: str
50
+ expected: str # one of @SPEC, @TEST, @CODE, @DOC
51
+ reason: str
52
+
53
+
54
+ @dataclass
55
+ class Rule:
56
+ include: List[str]
57
+ expect: str # '@SPEC:' | '@TEST:' | '@CODE:' | '@DOC:'
58
+ exclude: List[str]
59
+
60
+
61
+ def _load_rules(cwd: str) -> List[Rule]:
62
+ """Load tag rules from .moai/tag-rules.json or return defaults.
63
+
64
+ Schema example:
65
+ {
66
+ "rules": [
67
+ {"include": ["**/*_test.py", "**/*.test.ts"], "expect": "@TEST:", "exclude": []},
68
+ {"include": ["docs/**/*.md", "**/README.md"], "expect": "@DOC:", "exclude": []}
69
+ ]
70
+ }
71
+ """
72
+ cfg = Path(cwd) / ".moai" / "tag-rules.json"
73
+ if cfg.exists():
74
+ try:
75
+ data = json.loads(cfg.read_text(encoding="utf-8"))
76
+ items = data.get("rules", [])
77
+ rules: List[Rule] = []
78
+ for it in items:
79
+ include = list(it.get("include", []))
80
+ expect = str(it.get("expect", ""))
81
+ exclude = list(it.get("exclude", []))
82
+ if include and expect in ("@SPEC:", "@TEST:", "@CODE:", "@DOC:"):
83
+ rules.append(Rule(include=include, expect=expect, exclude=exclude))
84
+ if rules:
85
+ return rules
86
+ except Exception:
87
+ pass
88
+
89
+ # Defaults (ordered)
90
+ return [
91
+ Rule(
92
+ include=[".moai/specs/**", "**/SPEC-*/spec.md"],
93
+ expect="@SPEC:",
94
+ exclude=[]
95
+ ),
96
+ Rule(
97
+ include=[
98
+ "**/*_test.py", "**/test_*.py", "**/*.test.ts",
99
+ "**/*.test.tsx", "**/*.test.js", "**/*.test.jsx",
100
+ "**/*.test.go", "**/*.test.rs", "**/*.spec.ts",
101
+ "**/*.spec.tsx", "tests/**"
102
+ ],
103
+ expect="@TEST:",
104
+ exclude=[".claude/**"]
105
+ ),
106
+ Rule(
107
+ include=["docs/**/*.md", "**/README.md", "**/*.api.md"],
108
+ expect="@DOC:",
109
+ exclude=[".claude/**"]
110
+ ),
111
+ Rule(
112
+ include=["**/*"],
113
+ expect="@CODE:",
114
+ exclude=[
115
+ "tests/**", "docs/**", ".moai/**", ".claude/**",
116
+ "**/*.md", "**/*.json", "**/*.yml", "**/*.yaml",
117
+ "**/*.toml", "**/*.lock", "**/*.svg", "**/*.png",
118
+ "**/*.jpg", "**/*.jpeg", "**/*.gif"
119
+ ]
120
+ ),
121
+ ]
122
+
123
+
124
+ def _match_any(path: str, patterns: List[str]) -> bool:
125
+ return any(fnmatch.fnmatch(path, pat) for pat in patterns)
126
+
127
+
128
+ def _needs_tag_str(path_str: str, rules: List[Rule]) -> Optional[str]:
129
+ p = path_str
130
+ for rule in rules:
131
+ if _match_any(p, rule.include) and not _match_any(p, rule.exclude):
132
+ if rule.expect == "@CODE:":
133
+ # CODE: limit to source-like extensions to reduce noise
134
+ if not any(p.endswith(ext) for ext in DEFAULT_CODE_EXTS):
135
+ continue
136
+ return rule.expect
137
+ return None
138
+
139
+
140
+ def _has_tag(content: str, expected: str) -> bool:
141
+ return expected in content
142
+
143
+
144
+ def _iter_recent_changes(cwd: str) -> Iterable[Path]:
145
+ root = Path(cwd)
146
+ try:
147
+ # Staged files
148
+ r1 = subprocess.run(
149
+ ["git", "diff", "--name-only", "--cached"],
150
+ cwd=cwd, capture_output=True, text=True, timeout=1
151
+ )
152
+ # Modified (unstaged) tracked files
153
+ r2 = subprocess.run(
154
+ ["git", "ls-files", "-m"],
155
+ cwd=cwd, capture_output=True, text=True, timeout=1
156
+ )
157
+ # Untracked (other) files respecting .gitignore
158
+ r3 = subprocess.run(
159
+ ["git", "ls-files", "-o", "--exclude-standard"],
160
+ cwd=cwd, capture_output=True, text=True, timeout=1
161
+ )
162
+ names = set()
163
+ if r1.returncode == 0:
164
+ names.update([line.strip() for line in r1.stdout.splitlines() if line.strip()])
165
+ if r2.returncode == 0:
166
+ names.update([line.strip() for line in r2.stdout.splitlines() if line.strip()])
167
+ if r3.returncode == 0:
168
+ names.update([line.strip() for line in r3.stdout.splitlines() if line.strip()])
169
+ for n in names:
170
+ p = (root / n).resolve()
171
+ if p.is_file():
172
+ yield p
173
+ except Exception:
174
+ return []
175
+
176
+
177
+ def scan_recent_changes_for_missing_tags(cwd: str) -> list[TagIssue]:
178
+ issues: list[TagIssue] = []
179
+ rules = _load_rules(cwd)
180
+ root = Path(cwd).resolve()
181
+ for path in _iter_recent_changes(cwd):
182
+ try:
183
+ content = path.read_text(encoding="utf-8", errors="ignore")
184
+ except Exception:
185
+ continue
186
+ # compute relative path once and use for matching/excluding
187
+ try:
188
+ rel = path.resolve().relative_to(root)
189
+ rel_s = rel.as_posix()
190
+ except Exception:
191
+ rel_s = path.name
192
+
193
+ expected = _needs_tag_str(rel_s, rules)
194
+ if not expected:
195
+ continue
196
+ if not _has_tag(content, expected):
197
+ issues.append(TagIssue(path=rel_s, expected=expected, reason="missing tag"))
198
+ return issues
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env python3
2
+ # @CODE:HOOK-TOOL-001 | SPEC: TBD | TEST: tests/hooks/test_handlers.py
2
3
  """Tool usage handlers
3
4
 
4
5
  PreToolUse, PostToolUse event handling
@@ -6,6 +7,7 @@ PreToolUse, PostToolUse event handling
6
7
 
7
8
  from core import HookPayload, HookResult
8
9
  from core.checkpoint import create_checkpoint, detect_risky_operation
10
+ from core.tags import scan_recent_changes_for_missing_tags
9
11
 
10
12
 
11
13
  def handle_pre_tool_use(payload: HookPayload) -> HookResult:
@@ -44,20 +46,38 @@ def handle_pre_tool_use(payload: HookPayload) -> HookResult:
44
46
  tool_args = payload.get("arguments", {})
45
47
  cwd = payload.get("cwd", ".")
46
48
 
47
- # Dangerous operation detection
48
- is_risky, operation_type = detect_risky_operation(tool_name, tool_args, cwd)
49
-
50
- # Create checkpoint when danger is detected
51
- if is_risky:
52
- checkpoint_branch = create_checkpoint(cwd, operation_type)
53
-
54
- if checkpoint_branch != "checkpoint-failed":
55
- system_message = (
56
- f"🛡️ Checkpoint created: {checkpoint_branch}\n"
57
- f" Operation: {operation_type}"
58
- )
59
-
60
- return HookResult(system_message=system_message, continue_execution=True)
49
+ # Dangerous operation detection (best-effort)
50
+ try:
51
+ is_risky, operation_type = detect_risky_operation(tool_name, tool_args, cwd)
52
+ # Create checkpoint when danger is detected
53
+ if is_risky:
54
+ checkpoint_branch = create_checkpoint(cwd, operation_type)
55
+ if checkpoint_branch != "checkpoint-failed":
56
+ system_message = (
57
+ f"🛡️ Checkpoint created: {checkpoint_branch}\n"
58
+ f" Operation: {operation_type}"
59
+ )
60
+ return HookResult(system_message=system_message, continue_execution=True)
61
+ except Exception:
62
+ # Do not fail the hook if risk detection errors out
63
+ pass
64
+
65
+ # TAG Guard (gentle): warn when recent changes miss @TAG
66
+ issues = scan_recent_changes_for_missing_tags(cwd)
67
+ if issues:
68
+ # Summarize first few issues for display
69
+ preview = "\n".join(
70
+ f" - {i.path} → 기대 태그: {i.expected}" for i in issues[:5]
71
+ )
72
+ more = "" if len(issues) <= 5 else f"\n (외 {len(issues)-5}건 더 존재)"
73
+ msg = (
74
+ "⚠️ TAG 누락 감지: 생성/수정한 파일 중 @TAG가 없는 항목이 있습니다.\n"
75
+ f"{preview}{more}\n"
76
+ "권장 조치:\n"
77
+ " 1) SPEC/TEST/CODE/DOC 유형에 맞는 @TAG를 파일 상단 주석이나 헤더에 추가\n"
78
+ " 2) rg로 확인: rg '@(SPEC|TEST|CODE|DOC):' -n <경로>\n"
79
+ )
80
+ return HookResult(system_message=msg, continue_execution=True)
61
81
 
62
82
  return HookResult(continue_execution=True)
63
83
 
@@ -23,7 +23,7 @@ HOOKS_DIR = Path(__file__).parent
23
23
  if str(HOOKS_DIR) not in sys.path:
24
24
  sys.path.insert(0, str(HOOKS_DIR))
25
25
 
26
- from core import HookResult
26
+ from core import HookResult # noqa: E402
27
27
 
28
28
 
29
29
  def test_basic_output():
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env python3
2
+ # @CODE:HOOK-BASH-001 | SPEC: TBD | TEST: tests/hooks/test_bash_validation.py
2
3
  # Bash command validator (from Context7 official docs)
3
4
  import json
4
5
  import re
@@ -14,11 +15,10 @@ BLOCKED = [
14
15
  try:
15
16
  data = json.load(sys.stdin)
16
17
  cmd = data.get("tool_input", {}).get("command", "")
17
-
18
18
  for pattern, msg in BLOCKED:
19
19
  if re.search(pattern, cmd):
20
20
  print(f"🔴 {msg}", file=sys.stderr)
21
21
  sys.exit(2)
22
22
  sys.exit(0)
23
- except:
23
+ except Exception:
24
24
  sys.exit(0)