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
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SessionStart Hook: Enhanced Project Information
|
|
3
|
+
"""SessionStart Hook: Enhanced Project Information
|
|
4
|
+
|
|
5
|
+
Claude Code Event: SessionStart
|
|
6
|
+
Purpose: Display enhanced project status with Git info, test status, and SPEC progress
|
|
7
|
+
Execution: Triggered automatically when Claude Code session begins
|
|
8
|
+
|
|
9
|
+
Enhanced Features:
|
|
10
|
+
- Last commit information with relative time
|
|
11
|
+
- Test coverage and status
|
|
12
|
+
- Risk assessment
|
|
13
|
+
- Formatted output with clear sections
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import subprocess
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
# Setup import path for shared modules
|
|
23
|
+
HOOKS_DIR = Path(__file__).parent
|
|
24
|
+
SHARED_DIR = HOOKS_DIR / "shared"
|
|
25
|
+
if str(SHARED_DIR) not in sys.path:
|
|
26
|
+
sys.path.insert(0, str(SHARED_DIR))
|
|
27
|
+
|
|
28
|
+
# Try to import existing modules, provide fallbacks if not available
|
|
29
|
+
try:
|
|
30
|
+
from utils.timeout import CrossPlatformTimeout
|
|
31
|
+
from utils.timeout import TimeoutError as PlatformTimeoutError
|
|
32
|
+
except ImportError:
|
|
33
|
+
# Fallback timeout implementation
|
|
34
|
+
|
|
35
|
+
class CrossPlatformTimeout:
|
|
36
|
+
def __init__(self, seconds):
|
|
37
|
+
self.seconds = seconds
|
|
38
|
+
|
|
39
|
+
def start(self):
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
def cancel(self):
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
class PlatformTimeoutError(Exception):
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_git_info() -> dict[str, Any]:
|
|
50
|
+
"""Get comprehensive git information"""
|
|
51
|
+
try:
|
|
52
|
+
# Get current branch
|
|
53
|
+
branch = subprocess.run(
|
|
54
|
+
["git", "branch", "--show-current"],
|
|
55
|
+
capture_output=True,
|
|
56
|
+
text=True,
|
|
57
|
+
timeout=3
|
|
58
|
+
).stdout.strip()
|
|
59
|
+
|
|
60
|
+
# Get last commit hash and message
|
|
61
|
+
last_commit = subprocess.run(
|
|
62
|
+
["git", "log", "--pretty=format:%h %s", "-1"],
|
|
63
|
+
capture_output=True,
|
|
64
|
+
text=True,
|
|
65
|
+
timeout=3
|
|
66
|
+
).stdout.strip()
|
|
67
|
+
|
|
68
|
+
# Get commit time (relative)
|
|
69
|
+
commit_time = subprocess.run(
|
|
70
|
+
["git", "log", "--pretty=format:%ar", "-1"],
|
|
71
|
+
capture_output=True,
|
|
72
|
+
text=True,
|
|
73
|
+
timeout=3
|
|
74
|
+
).stdout.strip()
|
|
75
|
+
|
|
76
|
+
# Get number of changed files
|
|
77
|
+
changes = subprocess.run(
|
|
78
|
+
["git", "status", "--porcelain"],
|
|
79
|
+
capture_output=True,
|
|
80
|
+
text=True,
|
|
81
|
+
timeout=3
|
|
82
|
+
).stdout.strip()
|
|
83
|
+
num_changes = len(changes.splitlines()) if changes else 0
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
"branch": branch,
|
|
87
|
+
"last_commit": last_commit,
|
|
88
|
+
"commit_time": commit_time,
|
|
89
|
+
"changes": num_changes
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
except (subprocess.TimeoutExpired, subprocess.CalledProcessError, FileNotFoundError):
|
|
93
|
+
return {
|
|
94
|
+
"branch": "unknown",
|
|
95
|
+
"last_commit": "unknown",
|
|
96
|
+
"commit_time": "unknown",
|
|
97
|
+
"changes": 0
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def get_test_info() -> dict[str, Any]:
|
|
102
|
+
"""Get test coverage and status information"""
|
|
103
|
+
try:
|
|
104
|
+
# Try to get test coverage (basic check)
|
|
105
|
+
coverage_result = subprocess.run(
|
|
106
|
+
["python", "-m", "pytest", "--cov", "--tb=no", "-q"],
|
|
107
|
+
capture_output=True,
|
|
108
|
+
text=True,
|
|
109
|
+
timeout=10,
|
|
110
|
+
cwd=Path.cwd()
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Parse coverage from output (basic implementation)
|
|
114
|
+
coverage = "unknown"
|
|
115
|
+
if coverage_result.returncode == 0:
|
|
116
|
+
output = coverage_result.stdout
|
|
117
|
+
if "coverage:" in output.lower():
|
|
118
|
+
# Extract percentage from coverage output
|
|
119
|
+
import re
|
|
120
|
+
match = re.search(r'(\d+)%', output)
|
|
121
|
+
if match:
|
|
122
|
+
coverage = f"{match.group(1)}%"
|
|
123
|
+
|
|
124
|
+
# Determine test status
|
|
125
|
+
test_status = "✅" if coverage_result.returncode == 0 else "❌"
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
"coverage": coverage,
|
|
129
|
+
"status": test_status
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
except (subprocess.TimeoutExpired, subprocess.CalledProcessError, FileNotFoundError):
|
|
133
|
+
return {
|
|
134
|
+
"coverage": "unknown",
|
|
135
|
+
"status": "❓"
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def get_spec_progress() -> dict[str, Any]:
|
|
140
|
+
"""Get SPEC progress information"""
|
|
141
|
+
try:
|
|
142
|
+
specs_dir = Path.cwd() / ".moai" / "specs"
|
|
143
|
+
if not specs_dir.exists():
|
|
144
|
+
return {"completed": 0, "total": 0, "percentage": 0}
|
|
145
|
+
|
|
146
|
+
spec_folders = [d for d in specs_dir.iterdir() if d.is_dir() and d.name.startswith("SPEC-")]
|
|
147
|
+
total = len(spec_folders)
|
|
148
|
+
|
|
149
|
+
# Simple completion check - look for spec.md files
|
|
150
|
+
completed = sum(1 for folder in spec_folders if (folder / "spec.md").exists())
|
|
151
|
+
|
|
152
|
+
percentage = (completed / total * 100) if total > 0 else 0
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
"completed": completed,
|
|
156
|
+
"total": total,
|
|
157
|
+
"percentage": round(percentage, 0)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
except Exception:
|
|
161
|
+
return {"completed": 0, "total": 0, "percentage": 0}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def calculate_risk(git_info: dict, spec_progress: dict, test_info: dict) -> str:
|
|
165
|
+
"""Calculate overall project risk level"""
|
|
166
|
+
risk_score = 0
|
|
167
|
+
|
|
168
|
+
# Git changes contribute to risk
|
|
169
|
+
if git_info["changes"] > 20:
|
|
170
|
+
risk_score += 10
|
|
171
|
+
elif git_info["changes"] > 10:
|
|
172
|
+
risk_score += 5
|
|
173
|
+
|
|
174
|
+
# SPEC progress contributes to risk
|
|
175
|
+
if spec_progress["percentage"] < 50:
|
|
176
|
+
risk_score += 15
|
|
177
|
+
elif spec_progress["percentage"] < 80:
|
|
178
|
+
risk_score += 8
|
|
179
|
+
|
|
180
|
+
# Test status contributes to risk
|
|
181
|
+
if test_info["status"] != "✅":
|
|
182
|
+
risk_score += 12
|
|
183
|
+
elif test_info["coverage"] == "unknown":
|
|
184
|
+
risk_score += 5
|
|
185
|
+
|
|
186
|
+
# Determine risk level
|
|
187
|
+
if risk_score >= 20:
|
|
188
|
+
return "HIGH"
|
|
189
|
+
elif risk_score >= 10:
|
|
190
|
+
return "MEDIUM"
|
|
191
|
+
else:
|
|
192
|
+
return "LOW"
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def format_session_output() -> str:
|
|
196
|
+
"""Format the complete session start output"""
|
|
197
|
+
# Gather information
|
|
198
|
+
git_info = get_git_info()
|
|
199
|
+
test_info = get_test_info()
|
|
200
|
+
spec_progress = get_spec_progress()
|
|
201
|
+
risk_level = calculate_risk(git_info, spec_progress, test_info)
|
|
202
|
+
|
|
203
|
+
# Get MoAI version from config if available
|
|
204
|
+
moai_version = "unknown"
|
|
205
|
+
try:
|
|
206
|
+
config_path = Path.cwd() / ".moai" / "config.json"
|
|
207
|
+
if config_path.exists():
|
|
208
|
+
config = json.loads(config_path.read_text())
|
|
209
|
+
moai_version = config.get("moai", {}).get("version", "unknown")
|
|
210
|
+
except Exception:
|
|
211
|
+
pass
|
|
212
|
+
|
|
213
|
+
# Format output
|
|
214
|
+
output = [
|
|
215
|
+
"🚀 MoAI-ADK Session Started",
|
|
216
|
+
"",
|
|
217
|
+
"📊 Project Status:",
|
|
218
|
+
f"🗿 Version: {moai_version} | 🌿 {git_info['branch']} ({git_info['branch'][:8] if git_info['branch'] != 'unknown' else 'unknown'})",
|
|
219
|
+
f"📝 Changes: {git_info['changes']} | 🧪 Tests: {test_info['coverage']} {test_info['status']}",
|
|
220
|
+
f"📋 SPEC Progress: {spec_progress['completed']}/{spec_progress['total']} ({spec_progress['percentage']}%) | 🚨 Risk: {risk_level}",
|
|
221
|
+
f"🔨 Last: {git_info['last_commit']} ({git_info['commit_time']})"
|
|
222
|
+
]
|
|
223
|
+
|
|
224
|
+
return "\n".join(output)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def main() -> None:
|
|
228
|
+
"""Main entry point for enhanced SessionStart hook
|
|
229
|
+
|
|
230
|
+
Displays enhanced project information including:
|
|
231
|
+
- Programming language and version
|
|
232
|
+
- Git branch, changes, and last commit with time
|
|
233
|
+
- SPEC progress (completed/total)
|
|
234
|
+
- Test coverage and status
|
|
235
|
+
- Risk assessment
|
|
236
|
+
|
|
237
|
+
Exit Codes:
|
|
238
|
+
0: Success
|
|
239
|
+
1: Error (timeout, JSON parse failure, handler exception)
|
|
240
|
+
"""
|
|
241
|
+
# Set 5-second timeout
|
|
242
|
+
timeout = CrossPlatformTimeout(5)
|
|
243
|
+
timeout.start()
|
|
244
|
+
|
|
245
|
+
try:
|
|
246
|
+
# Read JSON payload from stdin (for compatibility)
|
|
247
|
+
input_data = sys.stdin.read()
|
|
248
|
+
data = json.loads(input_data) if input_data.strip() else {}
|
|
249
|
+
|
|
250
|
+
# Generate enhanced session output
|
|
251
|
+
session_output = format_session_output()
|
|
252
|
+
|
|
253
|
+
# Return as system message
|
|
254
|
+
result: dict[str, Any] = {
|
|
255
|
+
"continue": True,
|
|
256
|
+
"systemMessage": session_output
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
print(json.dumps(result))
|
|
260
|
+
sys.exit(0)
|
|
261
|
+
|
|
262
|
+
except PlatformTimeoutError:
|
|
263
|
+
# Timeout - return minimal valid response
|
|
264
|
+
timeout_response: dict[str, Any] = {
|
|
265
|
+
"continue": True,
|
|
266
|
+
"systemMessage": "⚠️ Session start timeout - continuing without project info",
|
|
267
|
+
}
|
|
268
|
+
print(json.dumps(timeout_response))
|
|
269
|
+
print("SessionStart hook timeout after 5 seconds", file=sys.stderr)
|
|
270
|
+
sys.exit(1)
|
|
271
|
+
|
|
272
|
+
except json.JSONDecodeError as e:
|
|
273
|
+
# JSON parse error
|
|
274
|
+
error_response: dict[str, Any] = {
|
|
275
|
+
"continue": True,
|
|
276
|
+
"hookSpecificOutput": {"error": f"JSON parse error: {e}"},
|
|
277
|
+
}
|
|
278
|
+
print(json.dumps(error_response))
|
|
279
|
+
print(f"SessionStart JSON parse error: {e}", file=sys.stderr)
|
|
280
|
+
sys.exit(1)
|
|
281
|
+
|
|
282
|
+
except Exception as e:
|
|
283
|
+
# Unexpected error
|
|
284
|
+
error_response: dict[str, Any] = {
|
|
285
|
+
"continue": True,
|
|
286
|
+
"hookSpecificOutput": {"error": f"SessionStart error: {e}"},
|
|
287
|
+
}
|
|
288
|
+
print(json.dumps(error_response))
|
|
289
|
+
print(f"SessionStart unexpected error: {e}", file=sys.stderr)
|
|
290
|
+
sys.exit(1)
|
|
291
|
+
|
|
292
|
+
finally:
|
|
293
|
+
# Always cancel timeout
|
|
294
|
+
timeout.cancel()
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
if __name__ == "__main__":
|
|
298
|
+
main()
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Core module for Alfred Hooks
|
|
3
|
+
|
|
4
|
+
Common type definitions and utility functions
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from typing import Any, Literal, NotRequired, TypedDict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class HookPayload(TypedDict):
|
|
12
|
+
"""Claude Code Hook event payload type definition
|
|
13
|
+
|
|
14
|
+
Data structure that Claude Code passes to the Hook script.
|
|
15
|
+
Use NotRequired because fields may vary depending on the event.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
cwd: str
|
|
19
|
+
userPrompt: NotRequired[str] # Includes only UserPromptSubmit events
|
|
20
|
+
tool: NotRequired[str] # PreToolUse/PostToolUse events
|
|
21
|
+
arguments: NotRequired[dict[str, Any]] # Tool arguments
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class HookResult:
|
|
26
|
+
"""Hook execution result following Claude Code standard schema.
|
|
27
|
+
|
|
28
|
+
Attributes conform to Claude Code Hook output specification:
|
|
29
|
+
https://docs.claude.com/en/docs/claude-code/hooks
|
|
30
|
+
|
|
31
|
+
Standard Fields (Claude Code schema - included in JSON output):
|
|
32
|
+
continue_execution: Allow execution to continue (default True)
|
|
33
|
+
suppress_output: Suppress hook output display (default False)
|
|
34
|
+
decision: "approve" or "block" operation (optional)
|
|
35
|
+
reason: Explanation for decision (optional)
|
|
36
|
+
permission_decision: "allow", "deny", or "ask" (optional)
|
|
37
|
+
system_message: Message displayed to user (top-level field)
|
|
38
|
+
|
|
39
|
+
Internal Fields (MoAI-ADK only - NOT in JSON output):
|
|
40
|
+
context_files: List of context files to load (internal use only)
|
|
41
|
+
suggestions: Suggestions for user (internal use only)
|
|
42
|
+
exit_code: Exit code for diagnostics (internal use only)
|
|
43
|
+
|
|
44
|
+
Note:
|
|
45
|
+
- systemMessage appears at TOP LEVEL in JSON output
|
|
46
|
+
- hookSpecificOutput is ONLY used for UserPromptSubmit events
|
|
47
|
+
- Internal fields are used for Python logic but not serialized to JSON
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# Claude Code standard fields
|
|
51
|
+
continue_execution: bool = True
|
|
52
|
+
suppress_output: bool = False
|
|
53
|
+
decision: Literal["approve", "block"] | None = None
|
|
54
|
+
reason: str | None = None
|
|
55
|
+
permission_decision: Literal["allow", "deny", "ask"] | None = None
|
|
56
|
+
|
|
57
|
+
# MoAI-ADK custom fields (wrapped in hookSpecificOutput)
|
|
58
|
+
system_message: str | None = None
|
|
59
|
+
context_files: list[str] = field(default_factory=list)
|
|
60
|
+
suggestions: list[str] = field(default_factory=list)
|
|
61
|
+
exit_code: int = 0
|
|
62
|
+
|
|
63
|
+
def to_dict(self) -> dict[str, Any]:
|
|
64
|
+
"""Convert to Claude Code standard Hook output schema.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Dictionary conforming to Claude Code Hook specification with:
|
|
68
|
+
- Top-level fields: continue, suppressOutput, decision, reason,
|
|
69
|
+
permissionDecision, systemMessage
|
|
70
|
+
- MoAI-ADK internal fields (context_files, suggestions, exit_code)
|
|
71
|
+
are NOT included in JSON output (used for internal logic only)
|
|
72
|
+
|
|
73
|
+
Examples:
|
|
74
|
+
>>> result = HookResult(continue_execution=True)
|
|
75
|
+
>>> result.to_dict()
|
|
76
|
+
{'continue': True}
|
|
77
|
+
|
|
78
|
+
>>> result = HookResult(decision="block", reason="Dangerous")
|
|
79
|
+
>>> result.to_dict()
|
|
80
|
+
{'decision': 'block', 'reason': 'Dangerous'}
|
|
81
|
+
|
|
82
|
+
>>> result = HookResult(system_message="Test")
|
|
83
|
+
>>> result.to_dict()
|
|
84
|
+
{'continue': True, 'systemMessage': 'Test'}
|
|
85
|
+
|
|
86
|
+
Note:
|
|
87
|
+
- systemMessage is a TOP-LEVEL field (not nested in hookSpecificOutput)
|
|
88
|
+
- hookSpecificOutput is ONLY used for UserPromptSubmit events
|
|
89
|
+
- context_files, suggestions, exit_code are internal-only fields
|
|
90
|
+
"""
|
|
91
|
+
output: dict[str, Any] = {}
|
|
92
|
+
|
|
93
|
+
# Add decision or continue flag
|
|
94
|
+
if self.decision:
|
|
95
|
+
output["decision"] = self.decision
|
|
96
|
+
else:
|
|
97
|
+
output["continue"] = self.continue_execution
|
|
98
|
+
|
|
99
|
+
# Add reason if provided (works with both decision and permissionDecision)
|
|
100
|
+
if self.reason:
|
|
101
|
+
output["reason"] = self.reason
|
|
102
|
+
|
|
103
|
+
# Add suppressOutput if True
|
|
104
|
+
if self.suppress_output:
|
|
105
|
+
output["suppressOutput"] = True
|
|
106
|
+
|
|
107
|
+
# Add permissionDecision if set
|
|
108
|
+
if self.permission_decision:
|
|
109
|
+
output["permissionDecision"] = self.permission_decision
|
|
110
|
+
|
|
111
|
+
# Add systemMessage at TOP LEVEL (required by Claude Code schema)
|
|
112
|
+
if self.system_message:
|
|
113
|
+
output["systemMessage"] = self.system_message
|
|
114
|
+
|
|
115
|
+
# Note: context_files, suggestions, exit_code are internal-only fields
|
|
116
|
+
# and are NOT included in the JSON output per Claude Code schema
|
|
117
|
+
|
|
118
|
+
return output
|
|
119
|
+
|
|
120
|
+
def to_user_prompt_submit_dict(self) -> dict[str, Any]:
|
|
121
|
+
"""UserPromptSubmit Hook-specific output format.
|
|
122
|
+
|
|
123
|
+
Claude Code requires a special schema for UserPromptSubmit events.
|
|
124
|
+
The result is wrapped in the standard Hook schema with hookSpecificOutput.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Claude Code UserPromptSubmit Hook Dictionary matching schema:
|
|
128
|
+
{
|
|
129
|
+
"continue": true,
|
|
130
|
+
"hookSpecificOutput": {
|
|
131
|
+
"hookEventName": "UserPromptSubmit",
|
|
132
|
+
"additionalContext": "string"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
Examples:
|
|
137
|
+
>>> result = HookResult(context_files=["tests/"])
|
|
138
|
+
>>> result.to_user_prompt_submit_dict()
|
|
139
|
+
{'continue': True, 'hookSpecificOutput': \
|
|
140
|
+
{'hookEventName': 'UserPromptSubmit', 'additionalContext': '📎 Context: tests/'}}
|
|
141
|
+
"""
|
|
142
|
+
# Convert context_files to additionalContext string
|
|
143
|
+
if self.context_files:
|
|
144
|
+
context_str = "\n".join([f"📎 Context: {f}" for f in self.context_files])
|
|
145
|
+
else:
|
|
146
|
+
context_str = ""
|
|
147
|
+
|
|
148
|
+
# Add system_message if there is one
|
|
149
|
+
if self.system_message:
|
|
150
|
+
if context_str:
|
|
151
|
+
context_str = f"{self.system_message}\n\n{context_str}"
|
|
152
|
+
else:
|
|
153
|
+
context_str = self.system_message
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
"continue": self.continue_execution,
|
|
157
|
+
"hookSpecificOutput": {
|
|
158
|
+
"hookEventName": "UserPromptSubmit",
|
|
159
|
+
"additionalContext": context_str,
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
__all__ = ["HookPayload", "HookResult"]
|
|
165
|
+
|
|
166
|
+
# Note: core module exports:
|
|
167
|
+
# - HookPayload, HookResult (type definitions)
|
|
168
|
+
# - project.py: detect_language, get_git_info, count_specs, get_project_language
|
|
169
|
+
# - context.py: get_jit_context
|
|
170
|
+
# - checkpoint.py: detect_risky_operation, create_checkpoint, log_checkpoint, list_checkpoints
|
|
@@ -56,7 +56,7 @@ def detect_risky_operation(tool_name: str, tool_args: dict[str, Any], cwd: str)
|
|
|
56
56
|
|
|
57
57
|
Risky Operations:
|
|
58
58
|
- Bash tool: rm -rf, git merge, git reset --hard, git rebase, script execution
|
|
59
|
-
- Edit/Write tool: CLAUDE.md, config.json, .
|
|
59
|
+
- Edit/Write tool: CLAUDE.md, config.json, .claude/skills/*.md
|
|
60
60
|
- MultiEdit tool: Edit ≥10 items File simultaneously
|
|
61
61
|
- Script execution: Python, Node, Java, Go, Rust, Dart, Swift, Kotlin, Shell scripts
|
|
62
62
|
|
|
@@ -98,8 +98,8 @@ def detect_risky_operation(tool_name: str, tool_args: dict[str, Any], cwd: str)
|
|
|
98
98
|
critical_files = [
|
|
99
99
|
"CLAUDE.md",
|
|
100
100
|
"config.json",
|
|
101
|
-
".
|
|
102
|
-
".
|
|
101
|
+
".claude/skills/moai-alfred-dev-guide/reference.md",
|
|
102
|
+
".claude/skills/moai-alfred-spec-metadata-extended/reference.md",
|
|
103
103
|
".moai/config.json",
|
|
104
104
|
]
|
|
105
105
|
|
|
@@ -22,13 +22,13 @@ def get_jit_context(prompt: str, cwd: str) -> list[str]:
|
|
|
22
22
|
If there is no matching pattern or file, an empty list []
|
|
23
23
|
|
|
24
24
|
Patterns:
|
|
25
|
-
- "/alfred:1-plan" → .
|
|
26
|
-
- "/alfred:2-run" → .
|
|
25
|
+
- "/alfred:1-plan" → .claude/skills/moai-alfred-spec-metadata-extended/reference.md
|
|
26
|
+
- "/alfred:2-run" → .claude/skills/moai-alfred-dev-guide/reference.md
|
|
27
27
|
- "test" → tests/ (if directory exists)
|
|
28
28
|
|
|
29
29
|
Examples:
|
|
30
30
|
>>> get_jit_context("/alfred:1-plan", "/project")
|
|
31
|
-
['.
|
|
31
|
+
['.claude/skills/moai-alfred-spec-metadata-extended/reference.md']
|
|
32
32
|
>>> get_jit_context("implement test", "/project")
|
|
33
33
|
['tests/']
|
|
34
34
|
>>> get_jit_context("unknown", "/project")
|
|
@@ -49,8 +49,8 @@ def get_jit_context(prompt: str, cwd: str) -> list[str]:
|
|
|
49
49
|
|
|
50
50
|
# Pattern matching
|
|
51
51
|
patterns = {
|
|
52
|
-
"/alfred:1-plan": [".
|
|
53
|
-
"/alfred:2-run": [".
|
|
52
|
+
"/alfred:1-plan": [".claude/skills/moai-alfred-spec-metadata-extended/reference.md"],
|
|
53
|
+
"/alfred:2-run": [".claude/skills/moai-alfred-dev-guide/reference.md"],
|
|
54
54
|
"test": ["tests/"],
|
|
55
55
|
}
|
|
56
56
|
|