moai-adk 0.15.0__py3-none-any.whl → 0.25.4__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 -2
- moai_adk/__main__.py +85 -2
- moai_adk/cli/__init__.py +0 -1
- moai_adk/cli/commands/__init__.py +0 -1
- moai_adk/cli/commands/analyze.py +127 -0
- moai_adk/cli/commands/backup.py +5 -3
- moai_adk/cli/commands/doctor.py +35 -11
- moai_adk/cli/commands/improve_user_experience.py +348 -0
- moai_adk/cli/commands/init.py +150 -23
- moai_adk/cli/commands/language.py +269 -0
- moai_adk/cli/commands/migrate.py +158 -0
- moai_adk/cli/commands/status.py +13 -12
- moai_adk/cli/commands/update.py +364 -60
- moai_adk/cli/commands/validate_links.py +118 -0
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +79 -82
- moai_adk/core/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +439 -0
- moai_adk/core/claude_integration.py +421 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +346 -0
- moai_adk/core/config/migration.py +133 -12
- moai_adk/core/context_manager.py +279 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/error_recovery_system.py +1289 -0
- moai_adk/core/git/__init__.py +0 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +4 -4
- moai_adk/core/git/checkpoint.py +1 -5
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +0 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +169 -0
- moai_adk/core/integration/integration_tester.py +225 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +28 -18
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_validator.py +556 -0
- moai_adk/core/mcp/setup.py +113 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/backup_manager.py +208 -0
- moai_adk/core/migration/file_migrator.py +218 -0
- moai_adk/core/migration/version_detector.py +143 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +318 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +3 -3
- moai_adk/core/project/detector.py +20 -40
- moai_adk/core/project/initializer.py +42 -17
- moai_adk/core/project/phase_executor.py +415 -58
- moai_adk/core/project/validator.py +6 -25
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +64 -110
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/rollback_manager.py +993 -0
- moai_adk/core/session_manager.py +667 -0
- moai_adk/core/spec/confidence_scoring.py +749 -0
- moai_adk/core/spec/ears_template_engine.py +1182 -0
- moai_adk/core/spec/quality_validator.py +721 -0
- moai_adk/core/spec_status_manager.py +488 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +41 -1
- moai_adk/core/template/config.py +11 -12
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +79 -22
- moai_adk/core/template/processor.py +614 -40
- moai_adk/core/template_engine.py +36 -27
- moai_adk/foundation/git/commit_templates.py +565 -0
- moai_adk/foundation/trust/trust_principles.py +725 -0
- moai_adk/foundation/trust/validation_checklist.py +1678 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +107 -0
- moai_adk/statusline/config.py +364 -0
- moai_adk/statusline/enhanced_output_style_detector.py +364 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +228 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +327 -0
- moai_adk/statusline/update_checker.py +135 -0
- moai_adk/statusline/version_reader.py +647 -0
- moai_adk/templates/.git-hooks/pre-commit +66 -0
- moai_adk/templates/.git-hooks/pre-push +116 -4
- moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
- moai_adk/templates/.gitignore +44 -0
- moai_adk/templates/.mcp.json +22 -0
- moai_adk/templates/CLAUDE.md +450 -1071
- moai_adk/utils/__init__.py +0 -1
- moai_adk/utils/banner.py +0 -1
- moai_adk/utils/common.py +308 -0
- moai_adk/utils/link_validator.py +249 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +210 -0
- moai_adk/utils/user_experience.py +531 -0
- moai_adk-0.25.4.dist-info/METADATA +2279 -0
- moai_adk-0.25.4.dist-info/RECORD +112 -0
- moai_adk/core/tags/__init__.py +0 -86
- moai_adk/core/tags/ci_validator.py +0 -463
- moai_adk/core/tags/cli.py +0 -283
- moai_adk/core/tags/generator.py +0 -109
- moai_adk/core/tags/inserter.py +0 -99
- moai_adk/core/tags/mapper.py +0 -126
- moai_adk/core/tags/parser.py +0 -76
- moai_adk/core/tags/pre_commit_validator.py +0 -393
- moai_adk/core/tags/reporter.py +0 -956
- moai_adk/core/tags/tags.py +0 -149
- moai_adk/core/tags/validator.py +0 -897
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -392
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1525
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -802
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -709
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1009
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
- moai_adk/templates/.claude/settings.json +0 -144
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
- moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
- moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
- moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
- moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
- moai_adk/templates/.github/workflows/release.yml +0 -118
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/tag-report.yml +0 -269
- moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
- moai_adk/templates/.moai/config.json +0 -115
- moai_adk/templates/workflows/go-tag-validation.yml +0 -30
- moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
- moai_adk/templates/workflows/python-tag-validation.yml +0 -42
- moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
- moai_adk-0.15.0.dist-info/METADATA +0 -3079
- moai_adk-0.15.0.dist-info/RECORD +0 -365
- {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
- {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# @CODE:HOOKS-CLARITY-CLEAN | SPEC: Individual hook files for better UX
|
|
3
|
-
"""SessionEnd Hook: Session Cleanup and Finalization
|
|
4
|
-
|
|
5
|
-
Claude Code Event: SessionEnd
|
|
6
|
-
Purpose: Clean up resources and finalize session when Claude Code exits
|
|
7
|
-
Execution: Triggered when Claude Code session ends
|
|
8
|
-
|
|
9
|
-
Output: Continue execution (currently a stub for future enhancements)
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import sys
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from typing import Any
|
|
16
|
-
|
|
17
|
-
from utils.timeout import CrossPlatformTimeout
|
|
18
|
-
from utils.timeout import TimeoutError as PlatformTimeoutError
|
|
19
|
-
|
|
20
|
-
# Setup import path for shared modules
|
|
21
|
-
HOOKS_DIR = Path(__file__).parent
|
|
22
|
-
SHARED_DIR = HOOKS_DIR / "shared"
|
|
23
|
-
if str(SHARED_DIR) not in sys.path:
|
|
24
|
-
sys.path.insert(0, str(SHARED_DIR))
|
|
25
|
-
|
|
26
|
-
from handlers import handle_session_end
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def main() -> None:
|
|
30
|
-
"""Main entry point for SessionEnd hook
|
|
31
|
-
|
|
32
|
-
Currently a stub for future functionality:
|
|
33
|
-
- Clear temporary caches
|
|
34
|
-
- Save session metrics
|
|
35
|
-
- Upload analytics (if enabled)
|
|
36
|
-
- Cleanup background processes
|
|
37
|
-
|
|
38
|
-
Exit Codes:
|
|
39
|
-
0: Success
|
|
40
|
-
1: Error (timeout, JSON parse failure, handler exception)
|
|
41
|
-
"""
|
|
42
|
-
# Set 5-second timeout
|
|
43
|
-
timeout = CrossPlatformTimeout(5)
|
|
44
|
-
timeout.start()
|
|
45
|
-
|
|
46
|
-
try:
|
|
47
|
-
# Read JSON payload from stdin
|
|
48
|
-
input_data = sys.stdin.read()
|
|
49
|
-
data = json.loads(input_data) if input_data.strip() else {}
|
|
50
|
-
|
|
51
|
-
# Call handler
|
|
52
|
-
result = handle_session_end(data)
|
|
53
|
-
|
|
54
|
-
# Output result as JSON
|
|
55
|
-
print(json.dumps(result.to_dict()))
|
|
56
|
-
sys.exit(0)
|
|
57
|
-
|
|
58
|
-
except PlatformTimeoutError:
|
|
59
|
-
# Timeout - return minimal valid response
|
|
60
|
-
timeout_response: dict[str, Any] = {
|
|
61
|
-
"continue": True,
|
|
62
|
-
"systemMessage": "⚠️ SessionEnd cleanup timeout - session ending anyway",
|
|
63
|
-
}
|
|
64
|
-
print(json.dumps(timeout_response))
|
|
65
|
-
print("SessionEnd hook timeout after 5 seconds", file=sys.stderr)
|
|
66
|
-
sys.exit(1)
|
|
67
|
-
|
|
68
|
-
except json.JSONDecodeError as e:
|
|
69
|
-
# JSON parse error
|
|
70
|
-
error_response: dict[str, Any] = {
|
|
71
|
-
"continue": True,
|
|
72
|
-
"hookSpecificOutput": {"error": f"JSON parse error: {e}"},
|
|
73
|
-
}
|
|
74
|
-
print(json.dumps(error_response))
|
|
75
|
-
print(f"SessionEnd JSON parse error: {e}", file=sys.stderr)
|
|
76
|
-
sys.exit(1)
|
|
77
|
-
|
|
78
|
-
except Exception as e:
|
|
79
|
-
# Unexpected error
|
|
80
|
-
error_response: dict[str, Any] = {
|
|
81
|
-
"continue": True,
|
|
82
|
-
"hookSpecificOutput": {"error": f"SessionEnd error: {e}"},
|
|
83
|
-
}
|
|
84
|
-
print(json.dumps(error_response))
|
|
85
|
-
print(f"SessionEnd unexpected error: {e}", file=sys.stderr)
|
|
86
|
-
sys.exit(1)
|
|
87
|
-
|
|
88
|
-
finally:
|
|
89
|
-
# Always cancel alarm
|
|
90
|
-
timeout.cancel()
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if __name__ == "__main__":
|
|
94
|
-
main()
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# @CODE:HOOKS-CLARITY-001 | SPEC: Individual hook files for better UX
|
|
3
|
-
"""SessionStart Hook: Show Project Information
|
|
4
|
-
|
|
5
|
-
Claude Code Event: SessionStart
|
|
6
|
-
Purpose: Display project status, language, Git info, and SPEC progress when session starts
|
|
7
|
-
Execution: Triggered automatically when Claude Code session begins
|
|
8
|
-
|
|
9
|
-
Output: System message with formatted project summary
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import sys
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from typing import Any
|
|
16
|
-
|
|
17
|
-
from utils.timeout import CrossPlatformTimeout
|
|
18
|
-
from utils.timeout import TimeoutError as PlatformTimeoutError
|
|
19
|
-
|
|
20
|
-
# Setup import path for shared modules
|
|
21
|
-
HOOKS_DIR = Path(__file__).parent
|
|
22
|
-
SHARED_DIR = HOOKS_DIR / "shared"
|
|
23
|
-
if str(SHARED_DIR) not in sys.path:
|
|
24
|
-
sys.path.insert(0, str(SHARED_DIR))
|
|
25
|
-
|
|
26
|
-
from handlers import handle_session_start
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def main() -> None:
|
|
30
|
-
"""Main entry point for SessionStart hook
|
|
31
|
-
|
|
32
|
-
Displays project information including:
|
|
33
|
-
- Programming language
|
|
34
|
-
- Git branch and status
|
|
35
|
-
- SPEC progress (completed/total)
|
|
36
|
-
- Recent checkpoints
|
|
37
|
-
|
|
38
|
-
Exit Codes:
|
|
39
|
-
0: Success
|
|
40
|
-
1: Error (timeout, JSON parse failure, handler exception)
|
|
41
|
-
"""
|
|
42
|
-
# Set 5-second timeout
|
|
43
|
-
timeout = CrossPlatformTimeout(5)
|
|
44
|
-
timeout.start()
|
|
45
|
-
|
|
46
|
-
try:
|
|
47
|
-
# Read JSON payload from stdin
|
|
48
|
-
input_data = sys.stdin.read()
|
|
49
|
-
data = json.loads(input_data) if input_data.strip() else {}
|
|
50
|
-
|
|
51
|
-
# Call handler
|
|
52
|
-
result = handle_session_start(data)
|
|
53
|
-
|
|
54
|
-
# Output result as JSON
|
|
55
|
-
print(json.dumps(result.to_dict()))
|
|
56
|
-
sys.exit(0)
|
|
57
|
-
|
|
58
|
-
except PlatformTimeoutError:
|
|
59
|
-
# Timeout - return minimal valid response
|
|
60
|
-
timeout_response: dict[str, Any] = {
|
|
61
|
-
"continue": True,
|
|
62
|
-
"systemMessage": "⚠️ Session start timeout - continuing without project info",
|
|
63
|
-
}
|
|
64
|
-
print(json.dumps(timeout_response))
|
|
65
|
-
print("SessionStart hook timeout after 5 seconds", file=sys.stderr)
|
|
66
|
-
sys.exit(1)
|
|
67
|
-
|
|
68
|
-
except json.JSONDecodeError as e:
|
|
69
|
-
# JSON parse error
|
|
70
|
-
error_response: dict[str, Any] = {
|
|
71
|
-
"continue": True,
|
|
72
|
-
"hookSpecificOutput": {"error": f"JSON parse error: {e}"},
|
|
73
|
-
}
|
|
74
|
-
print(json.dumps(error_response))
|
|
75
|
-
print(f"SessionStart JSON parse error: {e}", file=sys.stderr)
|
|
76
|
-
sys.exit(1)
|
|
77
|
-
|
|
78
|
-
except Exception as e:
|
|
79
|
-
# Unexpected error
|
|
80
|
-
error_response: dict[str, Any] = {
|
|
81
|
-
"continue": True,
|
|
82
|
-
"hookSpecificOutput": {"error": f"SessionStart error: {e}"},
|
|
83
|
-
}
|
|
84
|
-
print(json.dumps(error_response))
|
|
85
|
-
print(f"SessionStart unexpected error: {e}", file=sys.stderr)
|
|
86
|
-
sys.exit(1)
|
|
87
|
-
|
|
88
|
-
finally:
|
|
89
|
-
# Always cancel alarm
|
|
90
|
-
timeout.cancel()
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if __name__ == "__main__":
|
|
94
|
-
main()
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Core module for Alfred Hooks
|
|
3
|
-
|
|
4
|
-
Common type definitions and utility functions
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from dataclasses import 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
|
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Event-Driven Checkpoint system
|
|
3
|
-
|
|
4
|
-
Detect risky tasks and create automatic checkpoints
|
|
5
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import json
|
|
9
|
-
import re
|
|
10
|
-
import subprocess
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
# Script execution pattern for each language supported by MoAI-ADK
|
|
16
|
-
# Python, TypeScript, Java, Go, Rust, Dart, Swift, Kotlin + Shell
|
|
17
|
-
SCRIPT_EXECUTION_PATTERN = re.compile(
|
|
18
|
-
r"\b("
|
|
19
|
-
# Python ecosystem
|
|
20
|
-
r"python3?|pytest|pip|uv|"
|
|
21
|
-
# JavaScript/TypeScript ecosystem
|
|
22
|
-
r"node|npm|npx|yarn|bun|tsx|ts-node|vitest|jest|"
|
|
23
|
-
# Java ecosystem
|
|
24
|
-
r"java|javac|mvn|gradle|"
|
|
25
|
-
# Go
|
|
26
|
-
r"go|"
|
|
27
|
-
# Rust
|
|
28
|
-
r"cargo|"
|
|
29
|
-
# Dart/Flutter
|
|
30
|
-
r"dart|flutter|"
|
|
31
|
-
# Swift
|
|
32
|
-
r"swift|xcodebuild|"
|
|
33
|
-
# Kotlin
|
|
34
|
-
r"kotlinc?|"
|
|
35
|
-
# Shell scripts and build tools
|
|
36
|
-
r"bash|sh|zsh|fish|make"
|
|
37
|
-
r")\b"
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def detect_risky_operation(tool_name: str, tool_args: dict[str, Any], cwd: str) -> tuple[bool, str]:
|
|
42
|
-
"""Risk task detection (for Event-Driven Checkpoint)
|
|
43
|
-
|
|
44
|
-
Claude Code tool automatically detects dangerous tasks before use.
|
|
45
|
-
When a risk is detected, a checkpoint is automatically created to enable rollback.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
tool_name: Name of the Claude Code tool (Bash, Edit, Write, MultiEdit)
|
|
49
|
-
tool_args: Tool argument dictionary
|
|
50
|
-
cwd: Project root directory path
|
|
51
|
-
|
|
52
|
-
Returns:
|
|
53
|
-
(is_risky, operation_type) tuple
|
|
54
|
-
- is_risky: Whether the operation is dangerous (bool)
|
|
55
|
-
- operation_type: operation type (str: delete, merge, script, critical-file, refactor)
|
|
56
|
-
|
|
57
|
-
Risky Operations:
|
|
58
|
-
- Bash tool: rm -rf, git merge, git reset --hard, git rebase, script execution
|
|
59
|
-
- Edit/Write tool: CLAUDE.md, config.json, .claude/skills/*.md
|
|
60
|
-
- MultiEdit tool: Edit ≥10 items File simultaneously
|
|
61
|
-
- Script execution: Python, Node, Java, Go, Rust, Dart, Swift, Kotlin, Shell scripts
|
|
62
|
-
|
|
63
|
-
Examples:
|
|
64
|
-
>>> detect_risky_operation("Bash", {"command": "rm -rf src/"}, ".")
|
|
65
|
-
(True, 'delete')
|
|
66
|
-
>>> detect_risky_operation("Edit", {"file_path": "CLAUDE.md"}, ".")
|
|
67
|
-
(True, 'critical-file')
|
|
68
|
-
>>> detect_risky_operation("Read", {"file_path": "test.py"}, ".")
|
|
69
|
-
(False, '')
|
|
70
|
-
|
|
71
|
-
Notes:
|
|
72
|
-
- Minimize false positives: ignore safe operations
|
|
73
|
-
- Performance: lightweight string matching (< 1ms)
|
|
74
|
-
- Extensibility: Easily added to the patterns dictionary
|
|
75
|
-
|
|
76
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
77
|
-
"""
|
|
78
|
-
# Bash tool: Detect dangerous commands
|
|
79
|
-
if tool_name == "Bash":
|
|
80
|
-
command = tool_args.get("command", "")
|
|
81
|
-
|
|
82
|
-
# Mass Delete
|
|
83
|
-
if any(pattern in command for pattern in ["rm -rf", "git rm"]):
|
|
84
|
-
return (True, "delete")
|
|
85
|
-
|
|
86
|
-
# Git merge/reset/rebase
|
|
87
|
-
if any(pattern in command for pattern in ["git merge", "git reset --hard", "git rebase"]):
|
|
88
|
-
return (True, "merge")
|
|
89
|
-
|
|
90
|
-
# Execute external script (potentially destructive)
|
|
91
|
-
if any(command.startswith(prefix) for prefix in ["python ", "node ", "bash ", "sh "]):
|
|
92
|
-
return (True, "script")
|
|
93
|
-
|
|
94
|
-
# Edit/Write tool: Detect important files
|
|
95
|
-
if tool_name in ("Edit", "Write"):
|
|
96
|
-
file_path = tool_args.get("file_path", "")
|
|
97
|
-
|
|
98
|
-
critical_files = [
|
|
99
|
-
"CLAUDE.md",
|
|
100
|
-
"config.json",
|
|
101
|
-
".claude/skills/moai-alfred-dev-guide/reference.md",
|
|
102
|
-
".claude/skills/moai-alfred-spec-metadata-extended/reference.md",
|
|
103
|
-
".moai/config.json",
|
|
104
|
-
]
|
|
105
|
-
|
|
106
|
-
if any(cf in file_path for cf in critical_files):
|
|
107
|
-
return (True, "critical-file")
|
|
108
|
-
|
|
109
|
-
# MultiEdit tool: Detect large edits
|
|
110
|
-
if tool_name == "MultiEdit":
|
|
111
|
-
edits = tool_args.get("edits", [])
|
|
112
|
-
if len(edits) >= 10:
|
|
113
|
-
return (True, "refactor")
|
|
114
|
-
|
|
115
|
-
return (False, "")
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def create_checkpoint(cwd: str, operation_type: str) -> str:
|
|
119
|
-
"""Create checkpoint (Git local branch)
|
|
120
|
-
|
|
121
|
-
Automatically creates checkpoints before dangerous operations.
|
|
122
|
-
Prevent remote repository contamination by creating a Git local branch.
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
cwd: Project root directory path
|
|
126
|
-
operation_type: operation type (delete, merge, script, etc.)
|
|
127
|
-
|
|
128
|
-
Returns:
|
|
129
|
-
checkpoint_branch: Created branch name
|
|
130
|
-
Returns "checkpoint-failed" on failure
|
|
131
|
-
|
|
132
|
-
Branch Naming:
|
|
133
|
-
before-{operation}-{YYYYMMDD-HHMMSS}
|
|
134
|
-
Example: before-delete-20251015-143000
|
|
135
|
-
|
|
136
|
-
Examples:
|
|
137
|
-
>>> create_checkpoint(".", "delete")
|
|
138
|
-
'before-delete-20251015-143000'
|
|
139
|
-
|
|
140
|
-
Notes:
|
|
141
|
-
- Create only local branch (no remote push)
|
|
142
|
-
- Fallback in case of Git error (ignore and continue)
|
|
143
|
-
- Do not check dirty working directory (allow uncommitted changes)
|
|
144
|
-
- Automatically record checkpoint logs (.moai/checkpoints.log)
|
|
145
|
-
|
|
146
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
147
|
-
"""
|
|
148
|
-
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
149
|
-
branch_name = f"before-{operation_type}-{timestamp}"
|
|
150
|
-
|
|
151
|
-
try:
|
|
152
|
-
# Create a new local branch from the current branch (without checking out)
|
|
153
|
-
subprocess.run(
|
|
154
|
-
["git", "branch", branch_name],
|
|
155
|
-
cwd=cwd,
|
|
156
|
-
check=True,
|
|
157
|
-
capture_output=True,
|
|
158
|
-
text=True,
|
|
159
|
-
timeout=2,
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
# Checkpoint log records
|
|
163
|
-
log_checkpoint(cwd, branch_name, operation_type)
|
|
164
|
-
|
|
165
|
-
return branch_name
|
|
166
|
-
|
|
167
|
-
except (subprocess.CalledProcessError, subprocess.TimeoutExpired, FileNotFoundError):
|
|
168
|
-
# Fallback (ignore) in case of Git error
|
|
169
|
-
return "checkpoint-failed"
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def log_checkpoint(cwd: str, branch_name: str, operation_type: str) -> None:
|
|
173
|
-
"""Checkpoint log records (.moai/checkpoints.log)
|
|
174
|
-
|
|
175
|
-
Checkpoint creation history is recorded in JSON Lines format.
|
|
176
|
-
SessionStart reads this log to display a list of checkpoints.
|
|
177
|
-
|
|
178
|
-
Args:
|
|
179
|
-
cwd: Project root directory path
|
|
180
|
-
branch_name: Created checkpoint branch name
|
|
181
|
-
operation_type: operation type
|
|
182
|
-
|
|
183
|
-
Log Format (JSON Lines):
|
|
184
|
-
{"timestamp": "2025-10-15T14:30:00", "branch": "before-delete-...", "operation": "delete"}
|
|
185
|
-
|
|
186
|
-
Examples:
|
|
187
|
-
>>> log_checkpoint(".", "before-delete-20251015-143000", "delete")
|
|
188
|
-
# Add 1 line to .moai/checkpoints.log
|
|
189
|
-
|
|
190
|
-
Notes:
|
|
191
|
-
- If the file does not exist, it is automatically created.
|
|
192
|
-
- Record in append mode (preserve existing logs)
|
|
193
|
-
- Ignored in case of failure (not critical)
|
|
194
|
-
|
|
195
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
196
|
-
"""
|
|
197
|
-
log_file = Path(cwd) / ".moai" / "checkpoints.log"
|
|
198
|
-
|
|
199
|
-
try:
|
|
200
|
-
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
201
|
-
|
|
202
|
-
log_entry = {
|
|
203
|
-
"timestamp": datetime.now().isoformat(),
|
|
204
|
-
"branch": branch_name,
|
|
205
|
-
"operation": operation_type,
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
with log_file.open("a") as f:
|
|
209
|
-
f.write(json.dumps(log_entry) + "\n")
|
|
210
|
-
|
|
211
|
-
except (OSError, PermissionError):
|
|
212
|
-
# Ignore log failures (not critical)
|
|
213
|
-
pass
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
def list_checkpoints(cwd: str, max_count: int = 10) -> list[dict[str, str]]:
|
|
217
|
-
"""Checkpoint list (parsing .moai/checkpoints.log)
|
|
218
|
-
|
|
219
|
-
Returns a list of recently created checkpoints.
|
|
220
|
-
Used in the SessionStart, /alfred:0-project restore command.
|
|
221
|
-
|
|
222
|
-
Args:
|
|
223
|
-
cwd: Project root directory path
|
|
224
|
-
max_count: Maximum number to return (default 10 items)
|
|
225
|
-
|
|
226
|
-
Returns:
|
|
227
|
-
Checkpoint list (most recent)
|
|
228
|
-
[{"timestamp": "...", "branch": "...", "operation": "..."}, ...]
|
|
229
|
-
|
|
230
|
-
Examples:
|
|
231
|
-
>>> list_checkpoints(".")
|
|
232
|
-
[
|
|
233
|
-
{"timestamp": "2025-10-15T14:30:00", "branch": "before-delete-...", "operation": "delete"},
|
|
234
|
-
{"timestamp": "2025-10-15T14:25:00", "branch": "before-merge-...", "operation": "merge"},
|
|
235
|
-
]
|
|
236
|
-
|
|
237
|
-
Notes:
|
|
238
|
-
- If there is no log file, an empty list is returned.
|
|
239
|
-
- Ignore lines where JSON parsing fails
|
|
240
|
-
- Return only the latest max_count
|
|
241
|
-
|
|
242
|
-
@TAG:CHECKPOINT-EVENT-001
|
|
243
|
-
"""
|
|
244
|
-
log_file = Path(cwd) / ".moai" / "checkpoints.log"
|
|
245
|
-
|
|
246
|
-
if not log_file.exists():
|
|
247
|
-
return []
|
|
248
|
-
|
|
249
|
-
checkpoints = []
|
|
250
|
-
|
|
251
|
-
try:
|
|
252
|
-
with log_file.open("r") as f:
|
|
253
|
-
for line in f:
|
|
254
|
-
try:
|
|
255
|
-
checkpoints.append(json.loads(line.strip()))
|
|
256
|
-
except json.JSONDecodeError:
|
|
257
|
-
# Ignore lines where parsing failed
|
|
258
|
-
pass
|
|
259
|
-
except (OSError, PermissionError):
|
|
260
|
-
return []
|
|
261
|
-
|
|
262
|
-
# Return only the most recent max_count items (in order of latest)
|
|
263
|
-
return checkpoints[-max_count:]
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
__all__ = [
|
|
267
|
-
"detect_risky_operation",
|
|
268
|
-
"create_checkpoint",
|
|
269
|
-
"log_checkpoint",
|
|
270
|
-
"list_checkpoints",
|
|
271
|
-
]
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Context Engineering utilities
|
|
3
|
-
|
|
4
|
-
JIT (Just-in-Time) Retrieval
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def get_jit_context(prompt: str, cwd: str) -> list[str]:
|
|
11
|
-
"""JIT Context Retrieval based on prompt.
|
|
12
|
-
|
|
13
|
-
Analyze user prompts and automatically recommend relevant documents.
|
|
14
|
-
Alfred commands and keyword-based pattern matching load only the documents you need.
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
prompt: Prompt for user input (case is irrelevant)
|
|
18
|
-
cwd: Project root directory path
|
|
19
|
-
|
|
20
|
-
Returns:
|
|
21
|
-
List of recommended document paths (relative paths).
|
|
22
|
-
If there is no matching pattern or file, an empty list []
|
|
23
|
-
|
|
24
|
-
Patterns:
|
|
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
|
-
- "test" → tests/ (if directory exists)
|
|
28
|
-
|
|
29
|
-
Examples:
|
|
30
|
-
>>> get_jit_context("/alfred:1-plan", "/project")
|
|
31
|
-
['.claude/skills/moai-alfred-spec-metadata-extended/reference.md']
|
|
32
|
-
>>> get_jit_context("implement test", "/project")
|
|
33
|
-
['tests/']
|
|
34
|
-
>>> get_jit_context("unknown", "/project")
|
|
35
|
-
[]
|
|
36
|
-
|
|
37
|
-
Notes:
|
|
38
|
-
- Context Engineering: Compliance with JIT Retrieval principles
|
|
39
|
-
- Minimize initial context burden by loading only necessary documents
|
|
40
|
-
- Return after checking whether file exists
|
|
41
|
-
|
|
42
|
-
TDD History:
|
|
43
|
-
- RED: 18 items scenario testing (command matching, keywords, empty results)
|
|
44
|
-
- GREEN: Pattern matching dictionary-based implementation
|
|
45
|
-
- REFACTOR: Expandable pattern structure, file existence validation added
|
|
46
|
-
"""
|
|
47
|
-
context_files = []
|
|
48
|
-
cwd_path = Path(cwd)
|
|
49
|
-
|
|
50
|
-
# Pattern matching
|
|
51
|
-
patterns = {
|
|
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
|
-
"test": ["tests/"],
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
for pattern, files in patterns.items():
|
|
58
|
-
if pattern in prompt.lower():
|
|
59
|
-
for file in files:
|
|
60
|
-
file_path = cwd_path / file
|
|
61
|
-
if file_path.exists():
|
|
62
|
-
context_files.append(file)
|
|
63
|
-
|
|
64
|
-
return context_files
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
__all__ = ["get_jit_context"]
|