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,87 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# @CODE:HOOK-TOOL-001 | SPEC: TBD | TEST: tests/hooks/test_handlers.py
|
|
3
|
+
"""Tool usage handlers
|
|
4
|
+
|
|
5
|
+
PreToolUse, PostToolUse event handling
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from core import HookPayload, HookResult
|
|
9
|
+
from core.checkpoint import create_checkpoint, detect_risky_operation
|
|
10
|
+
from core.tags import scan_recent_changes_for_missing_tags
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def handle_pre_tool_use(payload: HookPayload) -> HookResult:
|
|
14
|
+
"""PreToolUse event handler (Event-Driven Checkpoint integration)
|
|
15
|
+
|
|
16
|
+
Automatically creates checkpoints before dangerous operations.
|
|
17
|
+
Called before using the Claude Code tool, it notifies the user when danger is detected.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
payload: Claude Code event payload
|
|
21
|
+
(includes tool, arguments, cwd keys)
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
HookResult(
|
|
25
|
+
system_message=checkpoint creation notification (when danger is detected);
|
|
26
|
+
continue_execution=True (always continue operation)
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
Checkpoint Triggers:
|
|
30
|
+
- Bash: rm -rf, git merge, git reset --hard
|
|
31
|
+
- Edit/Write: CLAUDE.md, config.json
|
|
32
|
+
- MultiEdit: ≥10 files
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
Bash tool (rm -rf) detection:
|
|
36
|
+
→ "🛡️ Checkpoint created: before-delete-20251015-143000"
|
|
37
|
+
|
|
38
|
+
Notes:
|
|
39
|
+
- Return continue_execution=True even after detection of danger (continue operation)
|
|
40
|
+
- Work continues even when checkpoint fails (ignores)
|
|
41
|
+
- Transparent background operation
|
|
42
|
+
|
|
43
|
+
@TAG:CHECKPOINT-EVENT-001
|
|
44
|
+
"""
|
|
45
|
+
tool_name = payload.get("tool", "")
|
|
46
|
+
tool_args = payload.get("arguments", {})
|
|
47
|
+
cwd = payload.get("cwd", ".")
|
|
48
|
+
|
|
49
|
+
# Dangerous operation detection (best-effort)
|
|
50
|
+
try:
|
|
51
|
+
is_risky, operation_type = detect_risky_operation(tool_name, tool_args, cwd)
|
|
52
|
+
# Create checkpoint when danger is detected
|
|
53
|
+
if is_risky:
|
|
54
|
+
checkpoint_branch = create_checkpoint(cwd, operation_type)
|
|
55
|
+
if checkpoint_branch != "checkpoint-failed":
|
|
56
|
+
system_message = (
|
|
57
|
+
f"🛡️ Checkpoint created: {checkpoint_branch}\n Operation: {operation_type}"
|
|
58
|
+
)
|
|
59
|
+
return HookResult(system_message=system_message, continue_execution=True)
|
|
60
|
+
except Exception:
|
|
61
|
+
# Do not fail the hook if risk detection errors out
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
# TAG Guard (gentle): warn when recent changes miss @TAG
|
|
65
|
+
issues = scan_recent_changes_for_missing_tags(cwd)
|
|
66
|
+
if issues:
|
|
67
|
+
# Summarize first few issues for display
|
|
68
|
+
preview = "\n".join(f" - {i.path} → 기대 태그: {i.expected}" for i in issues[:5])
|
|
69
|
+
more = "" if len(issues) <= 5 else f"\n (외 {len(issues) - 5}건 더 존재)"
|
|
70
|
+
msg = (
|
|
71
|
+
"⚠️ TAG 누락 감지: 생성/수정한 파일 중 @TAG가 없는 항목이 있습니다.\n"
|
|
72
|
+
f"{preview}{more}\n"
|
|
73
|
+
"권장 조치:\n"
|
|
74
|
+
" 1) SPEC/TEST/CODE/DOC 유형에 맞는 @TAG를 파일 상단 주석이나 헤더에 추가\n"
|
|
75
|
+
" 2) rg로 확인: rg '@(SPEC|TEST|CODE|DOC):' -n <경로>\n"
|
|
76
|
+
)
|
|
77
|
+
return HookResult(system_message=msg, continue_execution=True)
|
|
78
|
+
|
|
79
|
+
return HookResult(continue_execution=True)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def handle_post_tool_use(payload: HookPayload) -> HookResult:
|
|
83
|
+
"""PostToolUse event handler (default implementation)"""
|
|
84
|
+
return HookResult()
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
__all__ = ["handle_pre_tool_use", "handle_post_tool_use"]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""User interaction handlers
|
|
3
|
+
|
|
4
|
+
Handling the UserPromptSubmit event
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from core import HookPayload, HookResult
|
|
11
|
+
from core.context import get_jit_context
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def handle_user_prompt_submit(payload: HookPayload) -> HookResult:
|
|
15
|
+
"""UserPromptSubmit event handler
|
|
16
|
+
|
|
17
|
+
Analyze user prompts and automatically add relevant documents into context.
|
|
18
|
+
Follow the just-in-time (JIT) retrieval principle to load only the documents you need.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
payload: Claude Code event payload
|
|
22
|
+
(includes userPrompt, cwd keys)
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
HookResult(
|
|
26
|
+
system_message=Number of Files loaded (or None),
|
|
27
|
+
context_files=Recommended document path list
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
TDD History:
|
|
31
|
+
- RED: JIT document loading scenario testing
|
|
32
|
+
- GREEN: Recommend documents by calling get_jit_context()
|
|
33
|
+
- REFACTOR: Message conditional display (only when there is a file)
|
|
34
|
+
- UPDATE: Migrated to Claude Code standard Hook schema with snake_case fields
|
|
35
|
+
- FEATURE: Command execution logging for tracking double-run debugging
|
|
36
|
+
"""
|
|
37
|
+
user_prompt = payload.get("userPrompt", "")
|
|
38
|
+
cwd = payload.get("cwd", ".")
|
|
39
|
+
context_files = get_jit_context(user_prompt, cwd)
|
|
40
|
+
|
|
41
|
+
# Command execution logging (DEBUG feature for tracking invocations)
|
|
42
|
+
if user_prompt.startswith("/alfred:"):
|
|
43
|
+
try:
|
|
44
|
+
log_dir = Path(cwd) / ".moai" / "logs"
|
|
45
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
46
|
+
|
|
47
|
+
log_file = log_dir / "command-invocations.log"
|
|
48
|
+
timestamp = datetime.now().isoformat()
|
|
49
|
+
|
|
50
|
+
with open(log_file, "a", encoding="utf-8") as f:
|
|
51
|
+
f.write(f"{timestamp} | {user_prompt}\n")
|
|
52
|
+
except Exception:
|
|
53
|
+
# Silently fail if logging fails (don't interrupt main flow)
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
system_message = f"📎 Loaded {len(context_files)} context file(s)" if context_files else None
|
|
57
|
+
|
|
58
|
+
return HookResult(system_message=system_message, context_files=context_files)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
__all__ = ["handle_user_prompt_submit"]
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# @CODE:HOOKS-CLARITY-DOCS | SPEC: Individual hook files for better UX
|
|
3
|
+
"""UserPromptSubmit Hook: Just-In-Time Document Loading
|
|
4
|
+
|
|
5
|
+
Claude Code Event: UserPromptSubmit
|
|
6
|
+
Purpose: Analyze user prompt and recommend relevant documents to load into context
|
|
7
|
+
Execution: Triggered when user submits a prompt
|
|
8
|
+
|
|
9
|
+
Output: additionalContext with document path suggestions
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
# Setup import path for shared modules
|
|
18
|
+
HOOKS_DIR = Path(__file__).parent
|
|
19
|
+
SHARED_DIR = HOOKS_DIR / "shared"
|
|
20
|
+
if str(SHARED_DIR) not in sys.path:
|
|
21
|
+
sys.path.insert(0, str(SHARED_DIR))
|
|
22
|
+
|
|
23
|
+
from handlers import handle_user_prompt_submit # noqa: E402
|
|
24
|
+
from utils.timeout import CrossPlatformTimeout # noqa: E402
|
|
25
|
+
from utils.timeout import TimeoutError as PlatformTimeoutError # noqa: E402
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def main() -> None:
|
|
29
|
+
"""Main entry point for UserPromptSubmit hook
|
|
30
|
+
|
|
31
|
+
Analyzes user prompt patterns and recommends relevant documents:
|
|
32
|
+
- /alfred:1-plan → spec-metadata.md
|
|
33
|
+
- /alfred:2-run → development-guide.md
|
|
34
|
+
- @TAG mentions → TAG documentation
|
|
35
|
+
- SPEC references → related SPEC files
|
|
36
|
+
|
|
37
|
+
Exit Codes:
|
|
38
|
+
0: Success
|
|
39
|
+
1: Error (timeout, JSON parse failure, handler exception)
|
|
40
|
+
|
|
41
|
+
Note: Uses special output schema for UserPromptSubmit:
|
|
42
|
+
{
|
|
43
|
+
"continue": true,
|
|
44
|
+
"hookSpecificOutput": {
|
|
45
|
+
"hookEventName": "UserPromptSubmit",
|
|
46
|
+
"additionalContext": "Document path suggestions..."
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
"""
|
|
50
|
+
# Set 5-second timeout
|
|
51
|
+
timeout = CrossPlatformTimeout(5)
|
|
52
|
+
timeout.start()
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
# Read JSON payload from stdin
|
|
56
|
+
input_data = sys.stdin.read()
|
|
57
|
+
data = json.loads(input_data) if input_data.strip() else {}
|
|
58
|
+
|
|
59
|
+
# Call handler
|
|
60
|
+
result = handle_user_prompt_submit(data)
|
|
61
|
+
|
|
62
|
+
# Output result using UserPromptSubmit-specific schema
|
|
63
|
+
print(json.dumps(result.to_user_prompt_submit_dict()))
|
|
64
|
+
sys.exit(0)
|
|
65
|
+
|
|
66
|
+
except PlatformTimeoutError:
|
|
67
|
+
# Timeout - return minimal valid response
|
|
68
|
+
timeout_response: dict[str, Any] = {
|
|
69
|
+
"continue": True,
|
|
70
|
+
"hookSpecificOutput": {
|
|
71
|
+
"hookEventName": "UserPromptSubmit",
|
|
72
|
+
"additionalContext": "⚠️ JIT context timeout - continuing without suggestions",
|
|
73
|
+
},
|
|
74
|
+
}
|
|
75
|
+
print(json.dumps(timeout_response))
|
|
76
|
+
print("UserPromptSubmit hook timeout after 5 seconds", file=sys.stderr)
|
|
77
|
+
sys.exit(1)
|
|
78
|
+
|
|
79
|
+
except json.JSONDecodeError as e:
|
|
80
|
+
# JSON parse error
|
|
81
|
+
error_response: dict[str, Any] = {
|
|
82
|
+
"continue": True,
|
|
83
|
+
"hookSpecificOutput": {
|
|
84
|
+
"hookEventName": "UserPromptSubmit",
|
|
85
|
+
"error": f"JSON parse error: {e}",
|
|
86
|
+
},
|
|
87
|
+
}
|
|
88
|
+
print(json.dumps(error_response))
|
|
89
|
+
print(f"UserPromptSubmit JSON parse error: {e}", file=sys.stderr)
|
|
90
|
+
sys.exit(1)
|
|
91
|
+
|
|
92
|
+
except Exception as e:
|
|
93
|
+
# Unexpected error
|
|
94
|
+
error_response: dict[str, Any] = {
|
|
95
|
+
"continue": True,
|
|
96
|
+
"hookSpecificOutput": {
|
|
97
|
+
"hookEventName": "UserPromptSubmit",
|
|
98
|
+
"error": f"UserPromptSubmit error: {e}",
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
print(json.dumps(error_response))
|
|
102
|
+
print(f"UserPromptSubmit unexpected error: {e}", file=sys.stderr)
|
|
103
|
+
sys.exit(1)
|
|
104
|
+
|
|
105
|
+
finally:
|
|
106
|
+
# Always cancel alarm
|
|
107
|
+
timeout.cancel()
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
if __name__ == "__main__":
|
|
111
|
+
main()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Utility modules for Alfred hooks."""
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Hook Configuration Utilities
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
Hook 관련 설정 및 유틸리티 함수들
|
|
6
|
+
- Hook timeout 설정 로드
|
|
7
|
+
- Graceful degradation 설정 확인
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import logging
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def load_hook_timeout() -> int:
|
|
18
|
+
"""
|
|
19
|
+
.moai/config.json에서 Hook timeout 설정 로드
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
int: timeout 값 (밀리초), 설정이 없으면 기본값 5000 반환
|
|
23
|
+
"""
|
|
24
|
+
try:
|
|
25
|
+
config_path = Path(".moai/config.json")
|
|
26
|
+
if not config_path.exists():
|
|
27
|
+
return 5000 # 기본값
|
|
28
|
+
|
|
29
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
30
|
+
config = json.load(f)
|
|
31
|
+
|
|
32
|
+
# hooks 섹션에서 timeout_ms 값 가져오기
|
|
33
|
+
hooks_config = config.get("hooks", {})
|
|
34
|
+
timeout_ms = hooks_config.get("timeout_ms", 5000)
|
|
35
|
+
|
|
36
|
+
return int(timeout_ms)
|
|
37
|
+
except (json.JSONDecodeError, FileNotFoundError, KeyError, ValueError):
|
|
38
|
+
logger.warning("Failed to load hook timeout from config, using default 5000ms")
|
|
39
|
+
return 5000
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def get_graceful_degradation() -> bool:
|
|
43
|
+
"""
|
|
44
|
+
.moai/config.json에서 graceful_degradation 설정 로드
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
bool: graceful_degradation 설정값, 설정이 없으면 기본값 True 반환
|
|
48
|
+
"""
|
|
49
|
+
try:
|
|
50
|
+
config_path = Path(".moai/config.json")
|
|
51
|
+
if not config_path.exists():
|
|
52
|
+
return True # 기본값
|
|
53
|
+
|
|
54
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
55
|
+
config = json.load(f)
|
|
56
|
+
|
|
57
|
+
# hooks 섹션에서 graceful_degradation 값 가져오기
|
|
58
|
+
hooks_config = config.get("hooks", {})
|
|
59
|
+
return hooks_config.get("graceful_degradation", True)
|
|
60
|
+
except (json.JSONDecodeError, FileNotFoundError, KeyError):
|
|
61
|
+
logger.warning("Failed to load graceful_degradation from config, using default True")
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def get_hook_execution_config() -> dict:
|
|
66
|
+
"""
|
|
67
|
+
Hook 실행 관련 모든 설정 로드
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
dict: Hook 설정 딕셔너리
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
config_path = Path(".moai/config.json")
|
|
74
|
+
if not config_path.exists():
|
|
75
|
+
return {
|
|
76
|
+
"timeout_ms": 5000,
|
|
77
|
+
"graceful_degradation": True
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
81
|
+
config = json.load(f)
|
|
82
|
+
|
|
83
|
+
hooks_config = config.get("hooks", {})
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
"timeout_ms": hooks_config.get("timeout_ms", 5000),
|
|
87
|
+
"graceful_degradation": hooks_config.get("graceful_degradation", True)
|
|
88
|
+
}
|
|
89
|
+
except (json.JSONDecodeError, FileNotFoundError):
|
|
90
|
+
logger.warning("Failed to load hook config, using defaults")
|
|
91
|
+
return {
|
|
92
|
+
"timeout_ms": 5000,
|
|
93
|
+
"graceful_degradation": True
|
|
94
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# @CODE:TIMEOUT-001 | SPEC: SPEC-TIMEOUT-HANDLING-001
|
|
3
|
+
"""Cross-Platform Timeout Handler for Windows & Unix Compatibility
|
|
4
|
+
|
|
5
|
+
Provides a unified timeout mechanism that works on both Windows (threading-based)
|
|
6
|
+
and Unix/POSIX systems (signal-based).
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
- Windows: threading.Timer with exception injection
|
|
10
|
+
- Unix/POSIX: signal.SIGALRM (traditional approach)
|
|
11
|
+
- Both: Context manager for clean cancellation
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import platform
|
|
15
|
+
import signal
|
|
16
|
+
import threading
|
|
17
|
+
from contextlib import contextmanager
|
|
18
|
+
from typing import Callable, Optional
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TimeoutError(Exception):
|
|
22
|
+
"""Timeout exception raised when deadline exceeded"""
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CrossPlatformTimeout:
|
|
27
|
+
"""Cross-platform timeout handler supporting Windows and Unix.
|
|
28
|
+
|
|
29
|
+
Windows: Uses threading.Timer to schedule timeout exception
|
|
30
|
+
Unix: Uses signal.SIGALRM for timeout handling
|
|
31
|
+
|
|
32
|
+
Usage:
|
|
33
|
+
# Context manager (recommended)
|
|
34
|
+
with CrossPlatformTimeout(5):
|
|
35
|
+
long_running_operation()
|
|
36
|
+
|
|
37
|
+
# Manual control
|
|
38
|
+
timeout = CrossPlatformTimeout(5)
|
|
39
|
+
timeout.start()
|
|
40
|
+
try:
|
|
41
|
+
long_running_operation()
|
|
42
|
+
finally:
|
|
43
|
+
timeout.cancel()
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, timeout_seconds: float, callback: Optional[Callable] = None):
|
|
47
|
+
"""Initialize timeout with duration in seconds.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
timeout_seconds: Timeout duration in seconds (float or int)
|
|
51
|
+
callback: Optional callback to execute before raising TimeoutError
|
|
52
|
+
"""
|
|
53
|
+
# Convert float to int for signal.alarm()
|
|
54
|
+
self.timeout_seconds = timeout_seconds
|
|
55
|
+
self.timeout_seconds_int = max(1, int(timeout_seconds)) # signal.alarm requires >=1
|
|
56
|
+
self.callback = callback
|
|
57
|
+
self.timer: Optional[threading.Timer] = None
|
|
58
|
+
self._is_windows = platform.system() == "Windows"
|
|
59
|
+
self._old_handler = None
|
|
60
|
+
|
|
61
|
+
def start(self) -> None:
|
|
62
|
+
"""Start timeout countdown."""
|
|
63
|
+
# Handle zero/negative timeouts
|
|
64
|
+
if self.timeout_seconds <= 0:
|
|
65
|
+
if self.timeout_seconds == 0:
|
|
66
|
+
# Zero timeout: raise immediately
|
|
67
|
+
if self.callback:
|
|
68
|
+
self.callback()
|
|
69
|
+
raise TimeoutError("Timeout of 0 seconds exceeded immediately")
|
|
70
|
+
else:
|
|
71
|
+
# Negative timeout: don't timeout at all
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
if self._is_windows:
|
|
75
|
+
self._start_windows_timeout()
|
|
76
|
+
else:
|
|
77
|
+
self._start_unix_timeout()
|
|
78
|
+
|
|
79
|
+
def cancel(self) -> None:
|
|
80
|
+
"""Cancel timeout (must call before timeout expires)."""
|
|
81
|
+
if self._is_windows:
|
|
82
|
+
self._cancel_windows_timeout()
|
|
83
|
+
else:
|
|
84
|
+
self._cancel_unix_timeout()
|
|
85
|
+
|
|
86
|
+
def _start_windows_timeout(self) -> None:
|
|
87
|
+
"""Windows: Use threading.Timer to raise exception."""
|
|
88
|
+
def timeout_handler():
|
|
89
|
+
if self.callback:
|
|
90
|
+
self.callback()
|
|
91
|
+
raise TimeoutError(
|
|
92
|
+
f"Operation exceeded {self.timeout_seconds}s timeout (Windows threading)"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
self.timer = threading.Timer(self.timeout_seconds, timeout_handler)
|
|
96
|
+
self.timer.daemon = True
|
|
97
|
+
self.timer.start()
|
|
98
|
+
|
|
99
|
+
def _cancel_windows_timeout(self) -> None:
|
|
100
|
+
"""Windows: Cancel timer thread."""
|
|
101
|
+
if self.timer:
|
|
102
|
+
self.timer.cancel()
|
|
103
|
+
self.timer = None
|
|
104
|
+
|
|
105
|
+
def _start_unix_timeout(self) -> None:
|
|
106
|
+
"""Unix/POSIX: Use signal.SIGALRM for timeout."""
|
|
107
|
+
def signal_handler(signum, frame):
|
|
108
|
+
if self.callback:
|
|
109
|
+
try:
|
|
110
|
+
self.callback()
|
|
111
|
+
except Exception:
|
|
112
|
+
# Ignore callback exceptions, timeout error takes precedence
|
|
113
|
+
pass
|
|
114
|
+
raise TimeoutError(
|
|
115
|
+
f"Operation exceeded {self.timeout_seconds}s timeout (Unix signal)"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Save old handler to restore later
|
|
119
|
+
self._old_handler = signal.signal(signal.SIGALRM, signal_handler)
|
|
120
|
+
# Use integer timeout_seconds_int for signal.alarm()
|
|
121
|
+
signal.alarm(self.timeout_seconds_int)
|
|
122
|
+
|
|
123
|
+
def _cancel_unix_timeout(self) -> None:
|
|
124
|
+
"""Unix/POSIX: Cancel alarm and restore old handler."""
|
|
125
|
+
signal.alarm(0) # Cancel pending alarm
|
|
126
|
+
if self._old_handler is not None:
|
|
127
|
+
signal.signal(signal.SIGALRM, self._old_handler)
|
|
128
|
+
self._old_handler = None
|
|
129
|
+
|
|
130
|
+
def __enter__(self):
|
|
131
|
+
"""Context manager entry."""
|
|
132
|
+
self.start()
|
|
133
|
+
return self
|
|
134
|
+
|
|
135
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
136
|
+
"""Context manager exit - always cancel."""
|
|
137
|
+
self.cancel()
|
|
138
|
+
return False # Don't suppress exceptions
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@contextmanager
|
|
142
|
+
def timeout_context(timeout_seconds: float, callback: Optional[Callable] = None):
|
|
143
|
+
"""Decorator/context manager for timeout.
|
|
144
|
+
|
|
145
|
+
Usage:
|
|
146
|
+
with timeout_context(5):
|
|
147
|
+
slow_function()
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
timeout_seconds: Timeout duration in seconds (float or int)
|
|
151
|
+
callback: Optional callback to execute before raising TimeoutError
|
|
152
|
+
|
|
153
|
+
Yields:
|
|
154
|
+
CrossPlatformTimeout instance
|
|
155
|
+
"""
|
|
156
|
+
timeout = CrossPlatformTimeout(timeout_seconds, callback=callback)
|
|
157
|
+
timeout.start()
|
|
158
|
+
try:
|
|
159
|
+
yield timeout
|
|
160
|
+
finally:
|
|
161
|
+
timeout.cancel()
|