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.
- moai_adk/__init__.py +1 -1
- moai_adk/__main__.py +74 -1
- moai_adk/cli/commands/__init__.py +1 -1
- moai_adk/cli/commands/analyze.py +119 -0
- moai_adk/cli/commands/backup.py +25 -1
- moai_adk/cli/commands/doctor.py +31 -5
- moai_adk/cli/commands/improve_user_experience.py +307 -0
- moai_adk/cli/commands/init.py +111 -10
- moai_adk/cli/commands/status.py +33 -3
- moai_adk/cli/commands/update.py +921 -130
- moai_adk/cli/commands/validate_links.py +120 -0
- moai_adk/cli/prompts/init_prompts.py +22 -87
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +388 -0
- moai_adk/core/analysis/tag_chain_analyzer.py +344 -0
- moai_adk/core/analysis/tag_chain_repair.py +879 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/migration.py +235 -0
- moai_adk/core/git/__init__.py +1 -1
- moai_adk/core/git/branch.py +1 -1
- moai_adk/core/git/commit.py +1 -1
- moai_adk/core/git/manager.py +1 -1
- moai_adk/core/issue_creator.py +313 -0
- moai_adk/core/mcp/setup.py +56 -0
- moai_adk/core/mcp/setup_old.py +296 -0
- moai_adk/core/project/backup_utils.py +1 -1
- moai_adk/core/project/checker.py +2 -2
- moai_adk/core/project/detector.py +211 -12
- moai_adk/core/project/initializer.py +85 -15
- moai_adk/core/project/phase_executor.py +76 -13
- moai_adk/core/project/validator.py +13 -13
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +1 -1
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/tags/__init__.py +86 -0
- moai_adk/core/tags/auto_corrector.py +693 -0
- moai_adk/core/tags/ci_validator.py +463 -0
- moai_adk/core/tags/cli.py +283 -0
- moai_adk/core/tags/generator.py +109 -0
- moai_adk/core/tags/inserter.py +99 -0
- moai_adk/core/tags/mapper.py +126 -0
- moai_adk/core/tags/parser.py +76 -0
- moai_adk/core/tags/policy_validator.py +580 -0
- moai_adk/core/tags/pre_commit_validator.py +421 -0
- moai_adk/core/tags/reporter.py +956 -0
- moai_adk/core/tags/rollback_manager.py +525 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/core/template/__init__.py +1 -1
- moai_adk/core/template/backup.py +1 -1
- moai_adk/core/template/merger.py +50 -1
- moai_adk/core/template/processor.py +119 -13
- moai_adk/core/template_engine.py +268 -0
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +348 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +209 -944
- moai_adk/templates/.claude/agents/alfred/database-expert.md +352 -0
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +34 -5
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +38 -8
- moai_adk/templates/.claude/agents/alfred/format-expert.md +469 -0
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
- moai_adk/templates/.claude/agents/alfred/git-manager.md +128 -9
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +104 -6
- moai_adk/templates/.claude/agents/alfred/project-manager.md +88 -16
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +36 -9
- moai_adk/templates/.claude/agents/alfred/security-expert.md +270 -0
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +865 -0
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +214 -43
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +111 -9
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +309 -160
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +36 -7
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +605 -0
- moai_adk/templates/.claude/commands/alfred/0-project.md +393 -966
- moai_adk/templates/.claude/commands/alfred/1-plan.md +651 -367
- moai_adk/templates/.claude/commands/alfred/2-run.md +388 -241
- moai_adk/templates/.claude/commands/alfred/3-sync.md +1921 -410
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +153 -0
- moai_adk/templates/.claude/commands/alfred/release-new.md +3604 -0
- moai_adk/templates/.claude/hooks/alfred/core/project.py +484 -20
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +14 -6
- moai_adk/templates/.claude/hooks/alfred/post_tool__enable_streaming_ui.py +50 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +93 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__tag_auto_corrector.py +407 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +99 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__realtime_tag_monitor.py +335 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__tag_policy_validator.py +325 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +93 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__auto_cleanup.py +580 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +298 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +170 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +3 -3
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +5 -5
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +230 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/daily_analysis.py +351 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +174 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +87 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +61 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +111 -0
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
- moai_adk/templates/.claude/hooks/alfred/utils/hook_config.py +94 -0
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
- moai_adk/templates/.claude/output-styles/alfred/alfred-moai-adk-beginner.md +267 -0
- moai_adk/templates/.claude/output-styles/alfred/keating-personal-tutor.md +440 -0
- moai_adk/templates/.claude/output-styles/alfred/r2d2-agentic-coding.md +583 -0
- moai_adk/templates/.claude/settings.json +96 -14
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +70 -0
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +242 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/SKILL.md +237 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/examples.md +871 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/reference.md +653 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/README.md +162 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/SKILL.md +227 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/examples.md +354 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/reference.md +158 -0
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/SKILL.md +179 -79
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/examples.md +117 -0
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/scripts/pre-review-check.sh +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +132 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +444 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +405 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +51 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +355 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +239 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +286 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +126 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +229 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +150 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +87 -73
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/README.md +42 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/SKILL.md +429 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/examples.md +520 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/reference.md +405 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +89 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +122 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +369 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +508 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +481 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +100 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +77 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +265 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +539 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +84 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +137 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +219 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +161 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +541 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +622 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +19 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +211 -0
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +269 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +32 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +26 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +21 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +252 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +24 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +199 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +39 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +18 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +263 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +30 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +482 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +303 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +524 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +477 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +429 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +391 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +431 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +577 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +273 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +466 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +583 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +526 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +608 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +328 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +312 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +245 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +285 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +278 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +303 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +15 -0
- moai_adk/templates/.claude/skills/moai-change-logger/SKILL.md +563 -0
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +802 -0
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +1238 -0
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +673 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +234 -43
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +1633 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +660 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +97 -69
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +97 -72
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +97 -74
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +102 -73
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +97 -73
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +97 -67
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +97 -79
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +97 -71
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +265 -64
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +1064 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +1047 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +87 -78
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +87 -70
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +87 -86
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +80 -62
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +207 -50
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +90 -71
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +78 -58
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +78 -51
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/.!11330!examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +253 -32
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +1099 -0
- moai_adk/templates/.claude/skills/moai-jit-docs-enhanced/SKILL.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +98 -76
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +2358 -70
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +2962 -68
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +1898 -70
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +1465 -68
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +2364 -66
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +32 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +1630 -69
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +89 -61
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +735 -66
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +624 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +316 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +97 -73
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +98 -73
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +1834 -70
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +99 -74
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +97 -74
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +1959 -69
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-template/SKILL.md +348 -0
- moai_adk/templates/.claude/skills/moai-lang-template/VARIABLES.md +98 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +1230 -66
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +34 -0
- moai_adk/templates/.claude/skills/moai-learning-optimizer/SKILL.md +575 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/README.md +50 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/SKILL.md +304 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/examples.md +417 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/README.md +87 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/SKILL.md +552 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/examples.md +1109 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/reference.md +514 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/validate.py +106 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/README.md +11 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/SKILL.md +622 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/examples.md +20 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/reference.md +12 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/README.md +152 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/SKILL.md +285 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/examples.md +333 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/reference.md +386 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/README.md +49 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/examples.md +58 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/reference.md +123 -0
- moai_adk/templates/.claude/skills/moai-session-info/SKILL.md +314 -0
- moai_adk/templates/.claude/skills/moai-streaming-ui/SKILL.md +552 -0
- moai_adk/templates/.claude/skills/moai-tag-policy-validator/SKILL.md +570 -0
- moai_adk/templates/.git-hooks/pre-commit +66 -0
- moai_adk/templates/.git-hooks/pre-push +255 -0
- moai_adk/templates/.github/workflows/c-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/go-tag-validation.yml +130 -0
- moai_adk/templates/.github/workflows/java-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +135 -0
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/moai-gitflow.yml +166 -3
- moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +188 -0
- moai_adk/templates/.github/workflows/php-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/python-tag-validation.yml +118 -0
- moai_adk/templates/.github/workflows/release.yml +118 -0
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +338 -0
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/tag-report.yml +269 -0
- moai_adk/templates/.github/workflows/tag-validation.yml +186 -0
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +154 -0
- moai_adk/templates/.mcp.json +31 -0
- moai_adk/templates/.moai/config.json +80 -7
- moai_adk/templates/CLAUDE.md +562 -546
- moai_adk/utils/banner.py +5 -5
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +235 -0
- moai_adk/utils/logger.py +8 -8
- moai_adk/utils/user_experience.py +451 -0
- moai_adk-0.20.1.dist-info/METADATA +233 -0
- moai_adk-0.20.1.dist-info/RECORD +404 -0
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -156
- moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -85
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -92
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -70
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -41
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -636
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -692
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -470
- moai_adk/templates/.claude/skills/moai-alfred-debugger-pro/SKILL.md +0 -103
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -103
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -95
- moai_adk/templates/.claude/skills/moai-alfred-performance-optimizer/SKILL.md +0 -105
- moai_adk/templates/.claude/skills/moai-alfred-refactoring-coach/SKILL.md +0 -97
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -97
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -90
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -99
- moai_adk/templates/.claude/skills/moai-alfred-tui-survey/SKILL.md +0 -87
- moai_adk/templates/.claude/skills/moai-alfred-tui-survey/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-claude-code/SKILL.md +0 -94
- moai_adk/templates/.claude/skills/moai-claude-code/examples.md +0 -513
- moai_adk/templates/.claude/skills/moai-claude-code/reference.md +0 -433
- moai_adk/templates/.claude/skills/moai-claude-code/templates/agent-full.md +0 -332
- moai_adk/templates/.claude/skills/moai-claude-code/templates/command-full.md +0 -384
- moai_adk/templates/.claude/skills/moai-claude-code/templates/plugin-full.json +0 -363
- moai_adk/templates/.claude/skills/moai-claude-code/templates/settings-full.json +0 -595
- moai_adk/templates/.claude/skills/moai-claude-code/templates/skill-full.md +0 -496
- moai_adk/templates/.claude/skills/moai-lang-clojure/SKILL.md +0 -100
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +0 -99
- moai_adk/templates/.claude/skills/moai-lang-haskell/SKILL.md +0 -100
- moai_adk/templates/.claude/skills/moai-lang-julia/SKILL.md +0 -98
- moai_adk/templates/.claude/skills/moai-lang-lua/SKILL.md +0 -98
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
- moai_adk/templates/.moai/memory/development-guide.md +0 -344
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- moai_adk/templates/.moai/project/product.md +0 -161
- moai_adk/templates/.moai/project/structure.md +0 -156
- moai_adk/templates/.moai/project/tech.md +0 -227
- moai_adk/templates/__init__.py +0 -2
- moai_adk-0.4.5.dist-info/METADATA +0 -369
- moai_adk-0.4.5.dist-info/RECORD +0 -152
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/WHEEL +0 -0
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
# Alfred Hooks System
|
|
2
|
-
|
|
3
|
-
**Event-Driven Context Management for MoAI-ADK**
|
|
4
|
-
|
|
5
|
-
Alfred Hooks integrates with Claude Code's event system to automatically manage project context, create checkpoints before risky operations, and provide just-in-time (JIT) document loading.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 📐 Architecture
|
|
10
|
-
|
|
11
|
-
### Modular Design (9 Files, ≤284 LOC each)
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
.claude/hooks/alfred/
|
|
15
|
-
├── alfred_hooks.py # Main entry point (CLI router)
|
|
16
|
-
├── core/ # Core business logic
|
|
17
|
-
│ ├── __init__.py # Type definitions (HookPayload, HookResult)
|
|
18
|
-
│ ├── project.py # Language detection, Git info, SPEC counting
|
|
19
|
-
│ ├── context.py # JIT retrieval, workflow context
|
|
20
|
-
│ ├── checkpoint.py # Event-driven checkpoint creation
|
|
21
|
-
│ └── tags.py # TAG search, verification, caching
|
|
22
|
-
└── handlers/ # Event handlers
|
|
23
|
-
├── __init__.py # Handler exports
|
|
24
|
-
├── session.py # SessionStart, SessionEnd
|
|
25
|
-
├── user.py # UserPromptSubmit
|
|
26
|
-
├── tool.py # PreToolUse, PostToolUse
|
|
27
|
-
└── notification.py # Notification, Stop, SubagentStop
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### Design Principles
|
|
31
|
-
|
|
32
|
-
- **Single Responsibility**: Each module has one clear responsibility
|
|
33
|
-
- **Separation of Concerns**: core (business logic) vs handlers (event processing)
|
|
34
|
-
- **CODE-FIRST**: Scan code directly without intermediate cache (mtime Based invalidation)
|
|
35
|
-
- **Context Engineering**: Minimize initial context burden with JIT Retrieval
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## 🎯 Core Modules
|
|
40
|
-
|
|
41
|
-
### `core/project.py` (284 LOC)
|
|
42
|
-
|
|
43
|
-
**Project metadata and language detection**
|
|
44
|
-
|
|
45
|
-
```python
|
|
46
|
-
# Public API
|
|
47
|
-
detect_language(cwd: str) -> str
|
|
48
|
-
get_project_language(cwd: str) -> str
|
|
49
|
-
get_git_info(cwd: str) -> dict[str, Any]
|
|
50
|
-
count_specs(cwd: str) -> dict[str, int]
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
**Features**:
|
|
54
|
-
- Automatic detection of 20 languages (Python, TypeScript, Java, Go, Rust, etc.)
|
|
55
|
-
- `.moai/config.json` First, fallback to auto-detection
|
|
56
|
-
- Check Git information (branch, commit, changes)
|
|
57
|
-
- SPEC progress calculation (total, completed, percentage)
|
|
58
|
-
|
|
59
|
-
### `core/context.py` (110 LOC)
|
|
60
|
-
|
|
61
|
-
**JIT Context Retrieval and Workflow Management**
|
|
62
|
-
|
|
63
|
-
```python
|
|
64
|
-
# Public API
|
|
65
|
-
get_jit_context(prompt: str, cwd: str) -> list[str]
|
|
66
|
-
save_phase_context(phase: str, data: Any, ttl: int = 600)
|
|
67
|
-
load_phase_context(phase: str, ttl: int = 600) -> Any | None
|
|
68
|
-
clear_workflow_context()
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Features**:
|
|
72
|
-
- Automatically recommend documents based on prompt analysis
|
|
73
|
-
- `/alfred:1-plan` → `spec-metadata.md`
|
|
74
|
-
- `/alfred:2-run` → `development-guide.md`
|
|
75
|
-
- Context caching for each workflow step (TTL 10 minutes)
|
|
76
|
-
- Compliance with Anthropic Context Engineering principles
|
|
77
|
-
|
|
78
|
-
### `core/checkpoint.py` (244 LOC)
|
|
79
|
-
|
|
80
|
-
**Event-Driven Checkpoint Automation**
|
|
81
|
-
|
|
82
|
-
```python
|
|
83
|
-
# Public API
|
|
84
|
-
detect_risky_operation(tool: str, args: dict, cwd: str) -> tuple[bool, str]
|
|
85
|
-
create_checkpoint(cwd: str, operation: str) -> str
|
|
86
|
-
log_checkpoint(cwd: str, branch: str, description: str)
|
|
87
|
-
list_checkpoints(cwd: str, max_count: int = 10) -> list[dict]
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Features**:
|
|
91
|
-
- Automatic detection of dangerous tasks:
|
|
92
|
-
- Bash: `rm -rf`, `git merge`, `git reset --hard`
|
|
93
|
-
- Edit/Write: `CLAUDE.md`, `config.json`
|
|
94
|
-
- MultiEdit: ≥10 files
|
|
95
|
-
- Automatic creation of Git checkpoint: `checkpoint/before-{operation}-{timestamp}`
|
|
96
|
-
- Checkpoint history management and recovery guide
|
|
97
|
-
|
|
98
|
-
### `core/tags.py` (244 LOC)
|
|
99
|
-
|
|
100
|
-
**CODE-FIRST TAG SYSTEM**
|
|
101
|
-
|
|
102
|
-
```python
|
|
103
|
-
# Public API
|
|
104
|
-
search_tags(pattern: str, scope: list[str], cache_ttl: int = 60) -> list[dict]
|
|
105
|
-
verify_tag_chain(tag_id: str) -> dict[str, Any]
|
|
106
|
-
find_all_tags_by_type(tag_type: str) -> dict[str, list[str]]
|
|
107
|
-
suggest_tag_reuse(keyword: str) -> list[str]
|
|
108
|
-
get_library_version(library: str, cache_ttl: int = 86400) -> str | None
|
|
109
|
-
set_library_version(library: str, version: str)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**Features**:
|
|
113
|
-
- ripgrep-based TAG search (parsing JSON output)
|
|
114
|
-
- mtime-based cache invalidation (CODE-FIRST guaranteed)
|
|
115
|
-
- TAG chain verification (@SPEC → @TEST → @CODE completeness check)
|
|
116
|
-
- Library version caching (TTL 24 hours)
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 🎬 Event Handlers
|
|
121
|
-
|
|
122
|
-
### `handlers/session.py`
|
|
123
|
-
|
|
124
|
-
**SessionStart, SessionEnd handlers**
|
|
125
|
-
|
|
126
|
-
- **SessionStart**: Display project information
|
|
127
|
-
- Language, Git status, SPEC progress, recent checkpoint
|
|
128
|
-
- Display directly to user with `systemMessage` field
|
|
129
|
-
- **SessionEnd**: Cleanup task (stub)
|
|
130
|
-
|
|
131
|
-
### `handlers/user.py`
|
|
132
|
-
|
|
133
|
-
**UserPromptSubmit Handler**
|
|
134
|
-
|
|
135
|
-
- Return list of JIT Context recommended documents
|
|
136
|
-
- Analyze user prompt patterns and load related documents
|
|
137
|
-
|
|
138
|
-
### `handlers/tool.py`
|
|
139
|
-
|
|
140
|
-
**PreToolUse, PostToolUse handlers**
|
|
141
|
-
|
|
142
|
-
- **PreToolUse**: Automatic checkpoint creation when dangerous operation is detected
|
|
143
|
-
- **PostToolUse**: Post-processing operation (stub)
|
|
144
|
-
|
|
145
|
-
### `handlers/notification.py`
|
|
146
|
-
|
|
147
|
-
**Notification, Stop, SubagentStop handlers**
|
|
148
|
-
|
|
149
|
-
- Basic implementation (stub, can be expanded in the future)
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## 🧪 Testing
|
|
154
|
-
|
|
155
|
-
### Test Suite
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
# Run all tests
|
|
159
|
-
uv run pytest tests/unit/test_alfred_hooks_*.py -v --no-cov
|
|
160
|
-
|
|
161
|
-
# Run specific module tests
|
|
162
|
-
uv run pytest tests/unit/test_alfred_hooks_core_tags.py -v
|
|
163
|
-
uv run pytest tests/unit/test_alfred_hooks_core_context.py -v
|
|
164
|
-
uv run pytest tests/unit/test_alfred_hooks_core_project.py -v
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### Test Coverage (18 tests)
|
|
168
|
-
|
|
169
|
-
- ✅ **tags.py**: 7 tests (cache, TAG verification, version management)
|
|
170
|
-
- ✅ **context.py**: 5 tests (JIT, workflow context)
|
|
171
|
-
- ✅ **project.py**: 6 tests (language detection, Git, SPEC count)
|
|
172
|
-
|
|
173
|
-
### Test Structure
|
|
174
|
-
|
|
175
|
-
```python
|
|
176
|
-
# Dynamic module loading for isolated testing
|
|
177
|
-
def _load_{module}_module(module_name: str):
|
|
178
|
-
repo_root = Path(__file__).resolve().parents[2]
|
|
179
|
-
hooks_dir = repo_root / ".claude" / "hooks" / "alfred"
|
|
180
|
-
sys.path.insert(0, str(hooks_dir))
|
|
181
|
-
|
|
182
|
-
module_path = hooks_dir / "core" / "{module}.py"
|
|
183
|
-
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
|
184
|
-
# ...
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## 🔄 Migration from moai_hooks.py
|
|
190
|
-
|
|
191
|
-
### Before (Monolithic)
|
|
192
|
-
|
|
193
|
-
- **1 file**: 1233 LOC
|
|
194
|
-
- **Issues**:
|
|
195
|
-
- All functions concentrated in one file
|
|
196
|
-
- Difficult to test, complex to maintain
|
|
197
|
-
- Unclear separation of responsibilities
|
|
198
|
-
|
|
199
|
-
### After (Modular)
|
|
200
|
-
|
|
201
|
-
- **9 files**: ≤284 LOC each
|
|
202
|
-
- **Benefits**:
|
|
203
|
-
- Clear separation of responsibilities (SRP)
|
|
204
|
-
- Independent module testing possible
|
|
205
|
-
- Easy to expand, easy to maintain
|
|
206
|
-
- Compliance with Context Engineering principles
|
|
207
|
-
|
|
208
|
-
### Breaking Changes
|
|
209
|
-
|
|
210
|
-
**None** - External APIs remain the same.
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## 📚 References
|
|
215
|
-
|
|
216
|
-
### Internal Documents
|
|
217
|
-
|
|
218
|
-
- **CLAUDE.md**: MoAI-ADK User Guide
|
|
219
|
-
- **.moai/memory/development-guide.md**: SPEC-First TDD Workflow
|
|
220
|
-
- **.moai/memory/spec-metadata.md**: SPEC metadata standard
|
|
221
|
-
|
|
222
|
-
### External Resources
|
|
223
|
-
|
|
224
|
-
- [Claude Code Hooks Documentation](https://docs.claude.com/en/docs/claude-code)
|
|
225
|
-
- [Anthropic Context Engineering](https://docs.anthropic.com/claude/docs/context-engineering)
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
**Last Updated**: 2025-10-16
|
|
230
|
-
**Author**: @Alfred (MoAI-ADK SuperAgent)
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# @CODE:HOOKS-REFACTOR-001 | SPEC: SPEC-HOOKS-REFACTOR-001.md
|
|
3
|
-
"""Alfred Hooks - Main entry point for MoAI-ADK Claude Code Hooks
|
|
4
|
-
|
|
5
|
-
A main entry point that routes Claude Code events to the appropriate handlers.
|
|
6
|
-
|
|
7
|
-
🏗️ Architecture:
|
|
8
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
9
|
-
│ alfred_hooks.py (Router) │
|
|
10
|
-
├─────────────────────────────────────────────────────────────┤
|
|
11
|
-
│ - CLI argument parsing │
|
|
12
|
-
│ - JSON I/O (stdin/stdout) │
|
|
13
|
-
│ - Event routing to handlers │
|
|
14
|
-
└─────────────────────────────────────────────────────────────┘
|
|
15
|
-
▼
|
|
16
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
17
|
-
│ handlers/ (Event Handlers) │
|
|
18
|
-
├─────────────────────────────────────────────────────────────┤
|
|
19
|
-
│ - session.py: SessionStart, SessionEnd │
|
|
20
|
-
│ - user.py: UserPromptSubmit │
|
|
21
|
-
│ - tool.py: PreToolUse, PostToolUse │
|
|
22
|
-
│ - notification.py: Notification, Stop, SubagentStop │
|
|
23
|
-
└─────────────────────────────────────────────────────────────┘
|
|
24
|
-
▼
|
|
25
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
26
|
-
│ core/ (Business Logic) │
|
|
27
|
-
├─────────────────────────────────────────────────────────────┤
|
|
28
|
-
│ - project.py: Language detection, Git info, SPEC progress │
|
|
29
|
-
│ - context.py: JIT Retrieval, workflow context │
|
|
30
|
-
│ - checkpoint.py: Event-Driven Checkpoint system │
|
|
31
|
-
│ - tags.py: TAG search/verification, library version cache │
|
|
32
|
-
└─────────────────────────────────────────────────────────────┘
|
|
33
|
-
|
|
34
|
-
🛠️ Usage:
|
|
35
|
-
python alfred_hooks.py <event_name> < payload.json
|
|
36
|
-
|
|
37
|
-
📣 Supported Events:
|
|
38
|
-
- SessionStart: Start Session (display project status)
|
|
39
|
-
- UserPromptSubmit: Prompt submission (JIT document loading)
|
|
40
|
-
- PreToolUse: Before using the tool (automatically creates checkpoint)
|
|
41
|
-
- SessionEnd, PostToolUse, Notification, Stop, SubagentStop
|
|
42
|
-
|
|
43
|
-
🚦 Exit Codes:
|
|
44
|
-
- 0: Success
|
|
45
|
-
- 1: Error (no arguments, JSON parsing failure, exception thrown)
|
|
46
|
-
|
|
47
|
-
🧪 TDD History:
|
|
48
|
-
- RED: Module separation design, event routing test
|
|
49
|
-
- GREEN: 1233 LOC → 9 items Module separation implementation (SRP compliance)
|
|
50
|
-
- REFACTOR: Import optimization, enhanced error handling
|
|
51
|
-
|
|
52
|
-
Setup sys.path for package imports
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
import json
|
|
56
|
-
import sys
|
|
57
|
-
from pathlib import Path
|
|
58
|
-
|
|
59
|
-
from core import HookResult
|
|
60
|
-
from handlers import (
|
|
61
|
-
handle_notification,
|
|
62
|
-
handle_post_tool_use,
|
|
63
|
-
handle_pre_tool_use,
|
|
64
|
-
handle_session_end,
|
|
65
|
-
handle_session_start,
|
|
66
|
-
handle_stop,
|
|
67
|
-
handle_subagent_stop,
|
|
68
|
-
handle_user_prompt_submit,
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
# Add the hooks directory to sys.path to enable package imports
|
|
72
|
-
HOOKS_DIR = Path(__file__).parent
|
|
73
|
-
if str(HOOKS_DIR) not in sys.path:
|
|
74
|
-
sys.path.insert(0, str(HOOKS_DIR))
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def main() -> None:
|
|
78
|
-
"""Main entry point - Claude Code Hook script
|
|
79
|
-
|
|
80
|
-
Receives the event name as a CLI argument and reads the JSON payload through stdin.
|
|
81
|
-
Calls the handler appropriate for the event and outputs the results to stdout as JSON.
|
|
82
|
-
|
|
83
|
-
🛠️ Usage:
|
|
84
|
-
python alfred_hooks.py <event_name> < payload.json
|
|
85
|
-
|
|
86
|
-
📣 Supported Events:
|
|
87
|
-
- SessionStart: Start Session (display project status)
|
|
88
|
-
- UserPromptSubmit: Prompt submission (JIT document loading)
|
|
89
|
-
- SessionEnd, PreToolUse, PostToolUse, Notification, Stop, SubagentStop
|
|
90
|
-
|
|
91
|
-
🚦 Exit Codes:
|
|
92
|
-
- 0: Success
|
|
93
|
-
- 1: Error (no arguments, JSON parsing failure, exception thrown)
|
|
94
|
-
|
|
95
|
-
📝 Examples:
|
|
96
|
-
$ echo '{"cwd": "."}' | python alfred_hooks.py SessionStart
|
|
97
|
-
{"message": "🚀 MoAI-ADK Session Started\\n...", ...}
|
|
98
|
-
|
|
99
|
-
🗒️ Notes:
|
|
100
|
-
- Claude Code is automatically called (no need for direct user execution)
|
|
101
|
-
- JSON I/O processing through stdin/stdout
|
|
102
|
-
- Print error message to stderr
|
|
103
|
-
- UserPromptSubmit uses a special output schema (hookEventName + additionalContext)
|
|
104
|
-
|
|
105
|
-
🧪 TDD History:
|
|
106
|
-
- RED: Event routing, JSON I/O, error handling testing
|
|
107
|
-
- GREEN: Handler map-based routing implementation
|
|
108
|
-
- REFACTOR: Error message clarification, exit code standardization, UserPromptSubmit schema separation
|
|
109
|
-
"""
|
|
110
|
-
# Check for event argument
|
|
111
|
-
if len(sys.argv) < 2:
|
|
112
|
-
print("Usage: alfred_hooks.py <event>", file=sys.stderr)
|
|
113
|
-
sys.exit(1)
|
|
114
|
-
|
|
115
|
-
event_name = sys.argv[1]
|
|
116
|
-
|
|
117
|
-
try:
|
|
118
|
-
# Read JSON from stdin
|
|
119
|
-
input_data = sys.stdin.read()
|
|
120
|
-
data = json.loads(input_data)
|
|
121
|
-
|
|
122
|
-
cwd = data.get("cwd", ".")
|
|
123
|
-
|
|
124
|
-
# Route to appropriate handler
|
|
125
|
-
handlers = {
|
|
126
|
-
"SessionStart": handle_session_start,
|
|
127
|
-
"UserPromptSubmit": handle_user_prompt_submit,
|
|
128
|
-
"SessionEnd": handle_session_end,
|
|
129
|
-
"PreToolUse": handle_pre_tool_use,
|
|
130
|
-
"PostToolUse": handle_post_tool_use,
|
|
131
|
-
"Notification": handle_notification,
|
|
132
|
-
"Stop": handle_stop,
|
|
133
|
-
"SubagentStop": handle_subagent_stop,
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
handler = handlers.get(event_name)
|
|
137
|
-
result = handler({"cwd": cwd, **data}) if handler else HookResult()
|
|
138
|
-
|
|
139
|
-
# UserPromptSubmit uses a special output schema
|
|
140
|
-
if event_name == "UserPromptSubmit":
|
|
141
|
-
print(json.dumps(result.to_user_prompt_submit_dict()))
|
|
142
|
-
else:
|
|
143
|
-
print(json.dumps(result.to_dict()))
|
|
144
|
-
|
|
145
|
-
sys.exit(0)
|
|
146
|
-
|
|
147
|
-
except json.JSONDecodeError as e:
|
|
148
|
-
print(f"JSON parse error: {e}", file=sys.stderr)
|
|
149
|
-
sys.exit(1)
|
|
150
|
-
except Exception as e:
|
|
151
|
-
print(f"Unexpected error: {e}", file=sys.stderr)
|
|
152
|
-
sys.exit(1)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if __name__ == "__main__":
|
|
156
|
-
main()
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Core module for Alfred Hooks
|
|
3
|
-
|
|
4
|
-
Common type definitions and utility functions
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from dataclasses import asdict, dataclass, field
|
|
8
|
-
from typing import Any, NotRequired, TypedDict
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class HookPayload(TypedDict):
|
|
12
|
-
"""Claude Code Hook event payload type definition
|
|
13
|
-
|
|
14
|
-
Data structure that Claude Code passes to the Hook script.
|
|
15
|
-
Use NotRequired because fields may vary depending on the event.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
cwd: str
|
|
19
|
-
userPrompt: NotRequired[str] # Includes only UserPromptSubmit events
|
|
20
|
-
tool: NotRequired[str] # PreToolUse/PostToolUse events
|
|
21
|
-
arguments: NotRequired[dict[str, Any]] # Tool arguments
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@dataclass
|
|
25
|
-
class HookResult:
|
|
26
|
-
"""Hook execution result"""
|
|
27
|
-
|
|
28
|
-
message: str | None = None
|
|
29
|
-
systemMessage: str | None = None # Message displayed directly to the user # noqa: N815
|
|
30
|
-
blocked: bool = False
|
|
31
|
-
contextFiles: list[str] = field(default_factory=list) # noqa: N815
|
|
32
|
-
suggestions: list[str] = field(default_factory=list)
|
|
33
|
-
exitCode: int = 0 # noqa: N815
|
|
34
|
-
|
|
35
|
-
def to_dict(self) -> dict[str, Any]:
|
|
36
|
-
"""Dictionary conversion for general Hook"""
|
|
37
|
-
return asdict(self)
|
|
38
|
-
|
|
39
|
-
def to_user_prompt_submit_dict(self) -> dict[str, Any]:
|
|
40
|
-
"""UserPromptSubmit Hook-specific output format
|
|
41
|
-
|
|
42
|
-
Claude Code requires a special schema for UserPromptSubmit:
|
|
43
|
-
{
|
|
44
|
-
"hookEventName": "UserPromptSubmit",
|
|
45
|
-
"additionalContext": "string (required)"
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
Returns:
|
|
49
|
-
Claude Code UserPromptSubmit Hook Dictionary matching schema
|
|
50
|
-
|
|
51
|
-
Examples:
|
|
52
|
-
>>> result = HookResult(contextFiles=["tests/"])
|
|
53
|
-
>>> result.to_user_prompt_submit_dict()
|
|
54
|
-
{'hookEventName': 'UserPromptSubmit', 'additionalContext': '📎 Context: tests/'}
|
|
55
|
-
"""
|
|
56
|
-
# Convert contextFiles to additionalContext string
|
|
57
|
-
if self.contextFiles:
|
|
58
|
-
context_str = "\n".join([f"📎 Context: {f}" for f in self.contextFiles])
|
|
59
|
-
else:
|
|
60
|
-
context_str = ""
|
|
61
|
-
|
|
62
|
-
# Add message if there is one
|
|
63
|
-
if self.message:
|
|
64
|
-
if context_str:
|
|
65
|
-
context_str = f"{self.message}\n\n{context_str}"
|
|
66
|
-
else:
|
|
67
|
-
context_str = self.message
|
|
68
|
-
|
|
69
|
-
# If the string is empty, use default
|
|
70
|
-
if not context_str:
|
|
71
|
-
context_str = ""
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
"hookEventName": "UserPromptSubmit",
|
|
75
|
-
"additionalContext": context_str
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
__all__ = ["HookPayload", "HookResult"]
|
|
80
|
-
|
|
81
|
-
# Note: core module exports:
|
|
82
|
-
# - HookPayload, HookResult (type definitions)
|
|
83
|
-
# - project.py: detect_language, get_git_info, count_specs, get_project_language
|
|
84
|
-
# - context.py: get_jit_context
|
|
85
|
-
# - checkpoint.py: detect_risky_operation, create_checkpoint, log_checkpoint, list_checkpoints
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Notification and control handlers
|
|
3
|
-
|
|
4
|
-
Notification, Stop, SubagentStop event handling
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from core import HookPayload, HookResult
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def handle_notification(payload: HookPayload) -> HookResult:
|
|
11
|
-
"""Notification event handler (default implementation)"""
|
|
12
|
-
return HookResult()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def handle_stop(payload: HookPayload) -> HookResult:
|
|
16
|
-
"""Stop event handler (default implementation)"""
|
|
17
|
-
return HookResult()
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def handle_subagent_stop(payload: HookPayload) -> HookResult:
|
|
21
|
-
"""SubagentStop event handler (default implementation)"""
|
|
22
|
-
return HookResult()
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
__all__ = ["handle_notification", "handle_stop", "handle_subagent_stop"]
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Session event handlers
|
|
3
|
-
|
|
4
|
-
SessionStart, SessionEnd event handling
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from core import HookPayload, HookResult
|
|
8
|
-
from core.checkpoint import list_checkpoints
|
|
9
|
-
from core.project import count_specs, detect_language, get_git_info
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def handle_session_start(payload: HookPayload) -> HookResult:
|
|
13
|
-
"""SessionStart event handler (with Checkpoint list)
|
|
14
|
-
|
|
15
|
-
When Claude Code Session starts, it displays a summary of project status.
|
|
16
|
-
You can check the language, Git status, SPEC progress, and checkpoint list at a glance.
|
|
17
|
-
|
|
18
|
-
Args:
|
|
19
|
-
payload: Claude Code event payload (cwd key required)
|
|
20
|
-
|
|
21
|
-
Returns:
|
|
22
|
-
HookResult(message=project status summary message, systemMessage=for user display)
|
|
23
|
-
|
|
24
|
-
Message Format:
|
|
25
|
-
🚀 MoAI-ADK Session Started
|
|
26
|
-
Language: {language}
|
|
27
|
-
Branch: {branch} ({commit hash})
|
|
28
|
-
Changes: {Number of Changed Files}
|
|
29
|
-
SPEC Progress: {Complete}/{Total} ({percent}%)
|
|
30
|
-
Checkpoints: {number} available (showing the latest 3 items)
|
|
31
|
-
|
|
32
|
-
Note:
|
|
33
|
-
- Claude Code processes SessionStart in several stages (clear → compact)
|
|
34
|
-
- Display message only at “compact” stage to prevent duplicate output
|
|
35
|
-
- "clear" step returns empty result (invisible to user)
|
|
36
|
-
|
|
37
|
-
TDD History:
|
|
38
|
-
- RED: Session startup message format test
|
|
39
|
-
- GREEN: Generate status message by combining helper functions
|
|
40
|
-
- REFACTOR: Improved message format, improved readability, added checkpoint list
|
|
41
|
-
- FIX: Prevent duplicate output of clear step (only compact step is displayed)
|
|
42
|
-
|
|
43
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
44
|
-
"""
|
|
45
|
-
# Claude Code SessionStart runs in several stages (clear, compact, etc.)
|
|
46
|
-
# Ignore the "clear" stage and output messages only at the "compact" stage
|
|
47
|
-
event_phase = payload.get("phase", "")
|
|
48
|
-
if event_phase == "clear":
|
|
49
|
-
return HookResult() # returns an empty result (prevents duplicate output)
|
|
50
|
-
|
|
51
|
-
cwd = payload.get("cwd", ".")
|
|
52
|
-
language = detect_language(cwd)
|
|
53
|
-
git_info = get_git_info(cwd)
|
|
54
|
-
specs = count_specs(cwd)
|
|
55
|
-
checkpoints = list_checkpoints(cwd, max_count=10)
|
|
56
|
-
|
|
57
|
-
branch = git_info.get("branch", "N/A")
|
|
58
|
-
commit = git_info.get("commit", "N/A")[:7]
|
|
59
|
-
changes = git_info.get("changes", 0)
|
|
60
|
-
spec_progress = f"{specs['completed']}/{specs['total']}"
|
|
61
|
-
|
|
62
|
-
# systemMessage: displayed directly to the user
|
|
63
|
-
lines = [
|
|
64
|
-
"🚀 MoAI-ADK Session Started",
|
|
65
|
-
f" Language: {language}",
|
|
66
|
-
f" Branch: {branch} ({commit})",
|
|
67
|
-
f" Changes: {changes}",
|
|
68
|
-
f" SPEC Progress: {spec_progress} ({specs['percentage']}%)",
|
|
69
|
-
]
|
|
70
|
-
|
|
71
|
-
# Add Checkpoint list (show only the latest 3 items)
|
|
72
|
-
if checkpoints:
|
|
73
|
-
lines.append(f" Checkpoints: {len(checkpoints)} available")
|
|
74
|
-
for cp in reversed(checkpoints[-3:]): # Latest 3 items
|
|
75
|
-
branch_short = cp["branch"].replace("before-", "")
|
|
76
|
-
lines.append(f" - {branch_short}")
|
|
77
|
-
lines.append(" Restore: /alfred:0-project restore")
|
|
78
|
-
|
|
79
|
-
system_message = "\n".join(lines)
|
|
80
|
-
|
|
81
|
-
return HookResult(
|
|
82
|
-
message=system_message, # for Claude context
|
|
83
|
-
systemMessage=system_message, # For user display
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def handle_session_end(payload: HookPayload) -> HookResult:
|
|
88
|
-
"""SessionEnd event handler (default implementation)"""
|
|
89
|
-
return HookResult()
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
__all__ = ["handle_session_start", "handle_session_end"]
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Tool usage handlers
|
|
3
|
-
|
|
4
|
-
PreToolUse, PostToolUse event handling
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from core import HookPayload, HookResult
|
|
8
|
-
from core.checkpoint import create_checkpoint, detect_risky_operation
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def handle_pre_tool_use(payload: HookPayload) -> HookResult:
|
|
12
|
-
"""PreToolUse event handler (Event-Driven Checkpoint integration)
|
|
13
|
-
|
|
14
|
-
Automatically creates checkpoints before dangerous operations.
|
|
15
|
-
Called before using the Claude Code tool, it notifies the user when danger is detected.
|
|
16
|
-
|
|
17
|
-
Args:
|
|
18
|
-
payload: Claude Code event payload
|
|
19
|
-
(includes tool, arguments, cwd keys)
|
|
20
|
-
|
|
21
|
-
Returns:
|
|
22
|
-
HookResult(
|
|
23
|
-
message=checkpoint creation notification (when danger is detected);
|
|
24
|
-
blocked=False (always continue operation)
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
Checkpoint Triggers:
|
|
28
|
-
- Bash: rm -rf, git merge, git reset --hard
|
|
29
|
-
- Edit/Write: CLAUDE.md, config.json
|
|
30
|
-
- MultiEdit: ≥10 files
|
|
31
|
-
|
|
32
|
-
Examples:
|
|
33
|
-
Bash tool (rm -rf) detection:
|
|
34
|
-
→ "🛡️ Checkpoint created: before-delete-20251015-143000"
|
|
35
|
-
|
|
36
|
-
Notes:
|
|
37
|
-
- Return blocked=False even after detection of danger (continue operation)
|
|
38
|
-
- Work continues even when checkpoint fails (ignores)
|
|
39
|
-
- Transparent background operation
|
|
40
|
-
|
|
41
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
42
|
-
"""
|
|
43
|
-
tool_name = payload.get("tool", "")
|
|
44
|
-
tool_args = payload.get("arguments", {})
|
|
45
|
-
cwd = payload.get("cwd", ".")
|
|
46
|
-
|
|
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
|
-
message = (
|
|
56
|
-
f"🛡️ Checkpoint created: {checkpoint_branch}\n"
|
|
57
|
-
f" Operation: {operation_type}"
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
return HookResult(message=message, blocked=False)
|
|
61
|
-
|
|
62
|
-
return HookResult(blocked=False)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def handle_post_tool_use(payload: HookPayload) -> HookResult:
|
|
66
|
-
"""PostToolUse event handler (default implementation)"""
|
|
67
|
-
return HookResult()
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
__all__ = ["handle_pre_tool_use", "handle_post_tool_use"]
|