moai-adk 0.10.1__py3-none-any.whl → 0.11.0__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/core/project/phase_executor.py +4 -0
- moai_adk/core/tags/ci_validator.py +33 -3
- moai_adk/core/template_engine.py +6 -2
- moai_adk/templates/.github/workflows/moai-gitflow.yml +6 -1
- moai_adk/templates/.github/workflows/release.yml +6 -2
- moai_adk/templates/.github/workflows/tag-validation.yml +53 -8
- moai_adk/templates/CLAUDE.md +458 -67
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/METADATA +28 -13
- moai_adk-0.11.0.dist-info/RECORD +77 -0
- 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/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -350
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -273
- 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 -287
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -287
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -326
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1189
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -728
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -545
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -683
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -209
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -750
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +0 -102
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -102
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -102
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -102
- 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 -756
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -198
- 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 -25
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -175
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -90
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +0 -102
- moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +0 -102
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -120
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
- moai_adk/templates/.claude/settings.json +0 -144
- 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-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-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-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-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-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-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-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-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 -124
- 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 -124
- 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 -124
- 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 -123
- 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 -431
- 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 -124
- 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 -123
- 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 -127
- 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-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
- moai_adk/templates/.moai/config.json +0 -113
- moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +0 -208
- moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +0 -369
- moai_adk/templates/.moai/memory/CLAUDE-RULES.md +0 -539
- moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
- moai_adk/templates/.moai/memory/ISSUE-LABEL-MAPPING.md +0 -150
- moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +0 -218
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -330
- 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-0.10.1.dist-info/RECORD +0 -309
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/WHEEL +0 -0
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,90 +0,0 @@
|
|
|
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"
|
|
58
|
-
f" Operation: {operation_type}"
|
|
59
|
-
)
|
|
60
|
-
return HookResult(system_message=system_message, continue_execution=True)
|
|
61
|
-
except Exception:
|
|
62
|
-
# Do not fail the hook if risk detection errors out
|
|
63
|
-
pass
|
|
64
|
-
|
|
65
|
-
# TAG Guard (gentle): warn when recent changes miss @TAG
|
|
66
|
-
issues = scan_recent_changes_for_missing_tags(cwd)
|
|
67
|
-
if issues:
|
|
68
|
-
# Summarize first few issues for display
|
|
69
|
-
preview = "\n".join(
|
|
70
|
-
f" - {i.path} → 기대 태그: {i.expected}" for i in issues[:5]
|
|
71
|
-
)
|
|
72
|
-
more = "" if len(issues) <= 5 else f"\n (외 {len(issues)-5}건 더 존재)"
|
|
73
|
-
msg = (
|
|
74
|
-
"⚠️ TAG 누락 감지: 생성/수정한 파일 중 @TAG가 없는 항목이 있습니다.\n"
|
|
75
|
-
f"{preview}{more}\n"
|
|
76
|
-
"권장 조치:\n"
|
|
77
|
-
" 1) SPEC/TEST/CODE/DOC 유형에 맞는 @TAG를 파일 상단 주석이나 헤더에 추가\n"
|
|
78
|
-
" 2) rg로 확인: rg '@(SPEC|TEST|CODE|DOC):' -n <경로>\n"
|
|
79
|
-
)
|
|
80
|
-
return HookResult(system_message=msg, continue_execution=True)
|
|
81
|
-
|
|
82
|
-
return HookResult(continue_execution=True)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def handle_post_tool_use(payload: HookPayload) -> HookResult:
|
|
86
|
-
"""PostToolUse event handler (default implementation)"""
|
|
87
|
-
return HookResult()
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
__all__ = ["handle_pre_tool_use", "handle_post_tool_use"]
|
|
@@ -1,61 +0,0 @@
|
|
|
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"]
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# @CODE:HOOKS-CLARITY-001 | SPEC: Individual hook files for better UX
|
|
3
|
-
"""Stop Hook: Handle Execution Interruption
|
|
4
|
-
|
|
5
|
-
Claude Code Event: Stop
|
|
6
|
-
Purpose: Handle graceful shutdown when execution is interrupted by user
|
|
7
|
-
Execution: Triggered when user stops Claude Code execution (Ctrl+C, stop button)
|
|
8
|
-
|
|
9
|
-
Output: Continue execution (currently a stub for future enhancements)
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import signal
|
|
14
|
-
import sys
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
# Setup import path for shared modules
|
|
19
|
-
HOOKS_DIR = Path(__file__).parent
|
|
20
|
-
SHARED_DIR = HOOKS_DIR / "shared"
|
|
21
|
-
if str(SHARED_DIR) not in sys.path:
|
|
22
|
-
sys.path.insert(0, str(SHARED_DIR))
|
|
23
|
-
|
|
24
|
-
from handlers import handle_stop
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class HookTimeoutError(Exception):
|
|
28
|
-
"""Hook execution timeout exception"""
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _timeout_handler(signum, frame):
|
|
33
|
-
"""Signal handler for 5-second timeout"""
|
|
34
|
-
raise HookTimeoutError("Hook execution exceeded 5-second timeout")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def main() -> None:
|
|
38
|
-
"""Main entry point for Stop hook
|
|
39
|
-
|
|
40
|
-
Currently a stub for future functionality:
|
|
41
|
-
- Save partial work before interruption
|
|
42
|
-
- Create recovery checkpoint
|
|
43
|
-
- Log interruption reason and context
|
|
44
|
-
- Notify external systems of stop event
|
|
45
|
-
|
|
46
|
-
Exit Codes:
|
|
47
|
-
0: Success
|
|
48
|
-
1: Error (timeout, JSON parse failure, handler exception)
|
|
49
|
-
"""
|
|
50
|
-
# Set 5-second timeout
|
|
51
|
-
signal.signal(signal.SIGALRM, _timeout_handler)
|
|
52
|
-
signal.alarm(5)
|
|
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_stop(data)
|
|
61
|
-
|
|
62
|
-
# Output result as JSON
|
|
63
|
-
print(json.dumps(result.to_dict()))
|
|
64
|
-
sys.exit(0)
|
|
65
|
-
|
|
66
|
-
except HookTimeoutError:
|
|
67
|
-
# Timeout - return minimal valid response
|
|
68
|
-
timeout_response: dict[str, Any] = {
|
|
69
|
-
"continue": True,
|
|
70
|
-
"systemMessage": "⚠️ Stop handler timeout"
|
|
71
|
-
}
|
|
72
|
-
print(json.dumps(timeout_response))
|
|
73
|
-
print("Stop hook timeout after 5 seconds", file=sys.stderr)
|
|
74
|
-
sys.exit(1)
|
|
75
|
-
|
|
76
|
-
except json.JSONDecodeError as e:
|
|
77
|
-
# JSON parse error
|
|
78
|
-
error_response: dict[str, Any] = {
|
|
79
|
-
"continue": True,
|
|
80
|
-
"hookSpecificOutput": {"error": f"JSON parse error: {e}"}
|
|
81
|
-
}
|
|
82
|
-
print(json.dumps(error_response))
|
|
83
|
-
print(f"Stop JSON parse error: {e}", file=sys.stderr)
|
|
84
|
-
sys.exit(1)
|
|
85
|
-
|
|
86
|
-
except Exception as e:
|
|
87
|
-
# Unexpected error
|
|
88
|
-
error_response: dict[str, Any] = {
|
|
89
|
-
"continue": True,
|
|
90
|
-
"hookSpecificOutput": {"error": f"Stop error: {e}"}
|
|
91
|
-
}
|
|
92
|
-
print(json.dumps(error_response))
|
|
93
|
-
print(f"Stop unexpected error: {e}", file=sys.stderr)
|
|
94
|
-
sys.exit(1)
|
|
95
|
-
|
|
96
|
-
finally:
|
|
97
|
-
# Always cancel alarm
|
|
98
|
-
signal.alarm(0)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if __name__ == "__main__":
|
|
102
|
-
main()
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# @CODE:HOOKS-CLARITY-001 | SPEC: Individual hook files for better UX
|
|
3
|
-
"""SubagentStop Hook: Handle Sub-agent Termination
|
|
4
|
-
|
|
5
|
-
Claude Code Event: SubagentStop
|
|
6
|
-
Purpose: Handle cleanup when a sub-agent execution completes or is terminated
|
|
7
|
-
Execution: Triggered when Task tool completes (sub-agent finishes)
|
|
8
|
-
|
|
9
|
-
Output: Continue execution (currently a stub for future enhancements)
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import signal
|
|
14
|
-
import sys
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
# Setup import path for shared modules
|
|
19
|
-
HOOKS_DIR = Path(__file__).parent
|
|
20
|
-
SHARED_DIR = HOOKS_DIR / "shared"
|
|
21
|
-
if str(SHARED_DIR) not in sys.path:
|
|
22
|
-
sys.path.insert(0, str(SHARED_DIR))
|
|
23
|
-
|
|
24
|
-
from handlers import handle_subagent_stop
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class HookTimeoutError(Exception):
|
|
28
|
-
"""Hook execution timeout exception"""
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _timeout_handler(signum, frame):
|
|
33
|
-
"""Signal handler for 5-second timeout"""
|
|
34
|
-
raise HookTimeoutError("Hook execution exceeded 5-second timeout")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def main() -> None:
|
|
38
|
-
"""Main entry point for SubagentStop hook
|
|
39
|
-
|
|
40
|
-
Currently a stub for future functionality:
|
|
41
|
-
- Collect sub-agent execution metrics
|
|
42
|
-
- Log sub-agent results and errors
|
|
43
|
-
- Update workflow state based on sub-agent outcome
|
|
44
|
-
- Trigger follow-up actions based on results
|
|
45
|
-
|
|
46
|
-
Exit Codes:
|
|
47
|
-
0: Success
|
|
48
|
-
1: Error (timeout, JSON parse failure, handler exception)
|
|
49
|
-
"""
|
|
50
|
-
# Set 5-second timeout
|
|
51
|
-
signal.signal(signal.SIGALRM, _timeout_handler)
|
|
52
|
-
signal.alarm(5)
|
|
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_subagent_stop(data)
|
|
61
|
-
|
|
62
|
-
# Output result as JSON
|
|
63
|
-
print(json.dumps(result.to_dict()))
|
|
64
|
-
sys.exit(0)
|
|
65
|
-
|
|
66
|
-
except HookTimeoutError:
|
|
67
|
-
# Timeout - return minimal valid response
|
|
68
|
-
timeout_response: dict[str, Any] = {
|
|
69
|
-
"continue": True,
|
|
70
|
-
"systemMessage": "⚠️ SubagentStop handler timeout"
|
|
71
|
-
}
|
|
72
|
-
print(json.dumps(timeout_response))
|
|
73
|
-
print("SubagentStop hook timeout after 5 seconds", file=sys.stderr)
|
|
74
|
-
sys.exit(1)
|
|
75
|
-
|
|
76
|
-
except json.JSONDecodeError as e:
|
|
77
|
-
# JSON parse error
|
|
78
|
-
error_response: dict[str, Any] = {
|
|
79
|
-
"continue": True,
|
|
80
|
-
"hookSpecificOutput": {"error": f"JSON parse error: {e}"}
|
|
81
|
-
}
|
|
82
|
-
print(json.dumps(error_response))
|
|
83
|
-
print(f"SubagentStop JSON parse error: {e}", file=sys.stderr)
|
|
84
|
-
sys.exit(1)
|
|
85
|
-
|
|
86
|
-
except Exception as e:
|
|
87
|
-
# Unexpected error
|
|
88
|
-
error_response: dict[str, Any] = {
|
|
89
|
-
"continue": True,
|
|
90
|
-
"hookSpecificOutput": {"error": f"SubagentStop error: {e}"}
|
|
91
|
-
}
|
|
92
|
-
print(json.dumps(error_response))
|
|
93
|
-
print(f"SubagentStop unexpected error: {e}", file=sys.stderr)
|
|
94
|
-
sys.exit(1)
|
|
95
|
-
|
|
96
|
-
finally:
|
|
97
|
-
# Always cancel alarm
|
|
98
|
-
signal.alarm(0)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if __name__ == "__main__":
|
|
102
|
-
main()
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# @CODE:HOOKS-CLARITY-001 | 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 signal
|
|
14
|
-
import sys
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
# Setup import path for shared modules
|
|
19
|
-
HOOKS_DIR = Path(__file__).parent
|
|
20
|
-
SHARED_DIR = HOOKS_DIR / "shared"
|
|
21
|
-
if str(SHARED_DIR) not in sys.path:
|
|
22
|
-
sys.path.insert(0, str(SHARED_DIR))
|
|
23
|
-
|
|
24
|
-
from handlers import handle_user_prompt_submit
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class HookTimeoutError(Exception):
|
|
28
|
-
"""Hook execution timeout exception"""
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _timeout_handler(signum, frame):
|
|
33
|
-
"""Signal handler for 5-second timeout"""
|
|
34
|
-
raise HookTimeoutError("Hook execution exceeded 5-second timeout")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def main() -> None:
|
|
38
|
-
"""Main entry point for UserPromptSubmit hook
|
|
39
|
-
|
|
40
|
-
Analyzes user prompt patterns and recommends relevant documents:
|
|
41
|
-
- /alfred:1-plan → spec-metadata.md
|
|
42
|
-
- /alfred:2-run → development-guide.md
|
|
43
|
-
- @TAG mentions → TAG documentation
|
|
44
|
-
- SPEC references → related SPEC files
|
|
45
|
-
|
|
46
|
-
Exit Codes:
|
|
47
|
-
0: Success
|
|
48
|
-
1: Error (timeout, JSON parse failure, handler exception)
|
|
49
|
-
|
|
50
|
-
Note: Uses special output schema for UserPromptSubmit:
|
|
51
|
-
{
|
|
52
|
-
"continue": true,
|
|
53
|
-
"hookSpecificOutput": {
|
|
54
|
-
"hookEventName": "UserPromptSubmit",
|
|
55
|
-
"additionalContext": "Document path suggestions..."
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
"""
|
|
59
|
-
# Set 5-second timeout
|
|
60
|
-
signal.signal(signal.SIGALRM, _timeout_handler)
|
|
61
|
-
signal.alarm(5)
|
|
62
|
-
|
|
63
|
-
try:
|
|
64
|
-
# Read JSON payload from stdin
|
|
65
|
-
input_data = sys.stdin.read()
|
|
66
|
-
data = json.loads(input_data) if input_data.strip() else {}
|
|
67
|
-
|
|
68
|
-
# Call handler
|
|
69
|
-
result = handle_user_prompt_submit(data)
|
|
70
|
-
|
|
71
|
-
# Output result using UserPromptSubmit-specific schema
|
|
72
|
-
print(json.dumps(result.to_user_prompt_submit_dict()))
|
|
73
|
-
sys.exit(0)
|
|
74
|
-
|
|
75
|
-
except HookTimeoutError:
|
|
76
|
-
# Timeout - return minimal valid response
|
|
77
|
-
timeout_response: dict[str, Any] = {
|
|
78
|
-
"continue": True,
|
|
79
|
-
"hookSpecificOutput": {
|
|
80
|
-
"hookEventName": "UserPromptSubmit",
|
|
81
|
-
"additionalContext": "⚠️ JIT context timeout - continuing without suggestions"
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
print(json.dumps(timeout_response))
|
|
85
|
-
print("UserPromptSubmit hook timeout after 5 seconds", file=sys.stderr)
|
|
86
|
-
sys.exit(1)
|
|
87
|
-
|
|
88
|
-
except json.JSONDecodeError as e:
|
|
89
|
-
# JSON parse error
|
|
90
|
-
error_response: dict[str, Any] = {
|
|
91
|
-
"continue": True,
|
|
92
|
-
"hookSpecificOutput": {
|
|
93
|
-
"hookEventName": "UserPromptSubmit",
|
|
94
|
-
"error": f"JSON parse error: {e}"
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
print(json.dumps(error_response))
|
|
98
|
-
print(f"UserPromptSubmit JSON parse error: {e}", file=sys.stderr)
|
|
99
|
-
sys.exit(1)
|
|
100
|
-
|
|
101
|
-
except Exception as e:
|
|
102
|
-
# Unexpected error
|
|
103
|
-
error_response: dict[str, Any] = {
|
|
104
|
-
"continue": True,
|
|
105
|
-
"hookSpecificOutput": {
|
|
106
|
-
"hookEventName": "UserPromptSubmit",
|
|
107
|
-
"error": f"UserPromptSubmit error: {e}"
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
print(json.dumps(error_response))
|
|
111
|
-
print(f"UserPromptSubmit unexpected error: {e}", file=sys.stderr)
|
|
112
|
-
sys.exit(1)
|
|
113
|
-
|
|
114
|
-
finally:
|
|
115
|
-
# Always cancel alarm
|
|
116
|
-
signal.alarm(0)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if __name__ == "__main__":
|
|
120
|
-
main()
|