moai-adk 0.8.0__py3-none-any.whl → 0.15.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/cli/commands/init.py +14 -2
- moai_adk/cli/commands/update.py +229 -60
- moai_adk/core/config/migration.py +1 -1
- moai_adk/core/issue_creator.py +313 -0
- moai_adk/core/project/detector.py +201 -12
- moai_adk/core/project/initializer.py +62 -1
- moai_adk/core/project/phase_executor.py +48 -6
- moai_adk/core/tags/__init__.py +86 -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/pre_commit_validator.py +393 -0
- moai_adk/core/tags/reporter.py +956 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/core/template_engine.py +268 -0
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +319 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +25 -2
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +24 -12
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +20 -13
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
- moai_adk/templates/.claude/agents/alfred/git-manager.md +47 -16
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +95 -15
- moai_adk/templates/.claude/agents/alfred/project-manager.md +78 -12
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +28 -5
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +30 -2
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +133 -13
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +104 -8
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +133 -16
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +27 -4
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +571 -0
- moai_adk/templates/.claude/commands/alfred/0-project.md +466 -125
- moai_adk/templates/.claude/commands/alfred/1-plan.md +208 -71
- moai_adk/templates/.claude/commands/alfred/2-run.md +276 -55
- moai_adk/templates/.claude/commands/alfred/3-sync.md +439 -53
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +149 -0
- moai_adk/templates/.claude/hooks/alfred/core/project.py +361 -29
- 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__log_changes.py +94 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +100 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +94 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +94 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/__init__.py +2 -2
- 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/{core → shared/core}/tags.py +55 -23
- 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/notification.py +154 -0
- moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/session.py +28 -15
- moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/tool.py +3 -6
- moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/user.py +19 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +112 -0
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
- moai_adk/templates/.claude/settings.json +5 -5
- 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/{.moai/memory/CLAUDE-AGENTS-GUIDE.md → .claude/skills/moai-alfred-agent-guide/reference.md} +34 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +56 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -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-gitflow-policy/SKILL.md +74 -0
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +269 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +19 -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-persona-roles/SKILL.md +198 -0
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +141 -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-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-reporting/SKILL.md +273 -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-session-state/SKILL.md +19 -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-spec-authoring → moai-alfred-spec-authoring}/examples/validate-spec.sh +3 -3
- 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-spec-metadata-extended/SKILL.md +115 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +348 -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-skill-descriptions/SKILL.md +19 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +4 -0
- moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/SKILL.md +3 -3
- 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-frontend/SKILL.md +17 -13
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +9 -6
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +15 -12
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +14 -12
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +14 -11
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +10 -8
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +15 -12
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +13 -11
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +16 -10
- moai_adk/templates/.claude/skills/moai-project-documentation.md +622 -0
- moai_adk/templates/.git-hooks/pre-push +143 -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 +206 -35
- 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/.moai/config.json +21 -2
- moai_adk/templates/CLAUDE.md +972 -78
- moai_adk/templates/workflows/go-tag-validation.yml +30 -0
- moai_adk/templates/workflows/javascript-tag-validation.yml +41 -0
- moai_adk/templates/workflows/python-tag-validation.yml +42 -0
- moai_adk/templates/workflows/typescript-tag-validation.yml +31 -0
- moai_adk/utils/banner.py +5 -5
- {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/METADATA +1518 -161
- {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/RECORD +183 -100
- moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
- 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/skills/moai-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -218
- 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/.github/ISSUE_TEMPLATE/spec.yml +0 -176
- 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/memory/config-schema.md +0 -444
- 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/templates/{.moai/memory/CONFIG-SCHEMA.md → .claude/skills/moai-alfred-config-schema/reference.md} +0 -0
- /moai_adk/templates/{.moai/memory/CLAUDE-PRACTICES.md → .claude/skills/moai-alfred-practices/reference.md} +0 -0
- /moai_adk/templates/{.moai/memory/CLAUDE-RULES.md → .claude/skills/moai-alfred-rules/reference.md} +0 -0
- /moai_adk/templates/{.moai/memory/SKILLS-DESCRIPTION-POLICY.md → .claude/skills/moai-cc-skill-descriptions/reference.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/CHECKLIST.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/EXAMPLES.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/INTERACTIVE-DISCOVERY.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/METADATA.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/PARALLEL-ANALYSIS-REPORT.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/PYTHON-VERSION-MATRIX.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/SKILL-FACTORY-WORKFLOW.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/SKILL-UPDATE-ADVISOR.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/STEP-BY-STEP-GUIDE.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/STRUCTURE.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/WEB-RESEARCH.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/reference.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/scripts/generate-structure.sh +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/scripts/validate-skill.sh +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/SKILL_TEMPLATE.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/examples-template.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/reference-template.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/scripts-template.sh +0 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/WHEEL +0 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
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()
|
|
@@ -0,0 +1,94 @@
|
|
|
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()
|
|
@@ -56,7 +56,7 @@ def detect_risky_operation(tool_name: str, tool_args: dict[str, Any], cwd: str)
|
|
|
56
56
|
|
|
57
57
|
Risky Operations:
|
|
58
58
|
- Bash tool: rm -rf, git merge, git reset --hard, git rebase, script execution
|
|
59
|
-
- Edit/Write tool: CLAUDE.md, config.json, .
|
|
59
|
+
- Edit/Write tool: CLAUDE.md, config.json, .claude/skills/*.md
|
|
60
60
|
- MultiEdit tool: Edit ≥10 items File simultaneously
|
|
61
61
|
- Script execution: Python, Node, Java, Go, Rust, Dart, Swift, Kotlin, Shell scripts
|
|
62
62
|
|
|
@@ -98,8 +98,8 @@ def detect_risky_operation(tool_name: str, tool_args: dict[str, Any], cwd: str)
|
|
|
98
98
|
critical_files = [
|
|
99
99
|
"CLAUDE.md",
|
|
100
100
|
"config.json",
|
|
101
|
-
".
|
|
102
|
-
".
|
|
101
|
+
".claude/skills/moai-alfred-dev-guide/reference.md",
|
|
102
|
+
".claude/skills/moai-alfred-spec-metadata-extended/reference.md",
|
|
103
103
|
".moai/config.json",
|
|
104
104
|
]
|
|
105
105
|
|
|
@@ -22,13 +22,13 @@ def get_jit_context(prompt: str, cwd: str) -> list[str]:
|
|
|
22
22
|
If there is no matching pattern or file, an empty list []
|
|
23
23
|
|
|
24
24
|
Patterns:
|
|
25
|
-
- "/alfred:1-plan" → .
|
|
26
|
-
- "/alfred:2-run" → .
|
|
25
|
+
- "/alfred:1-plan" → .claude/skills/moai-alfred-spec-metadata-extended/reference.md
|
|
26
|
+
- "/alfred:2-run" → .claude/skills/moai-alfred-dev-guide/reference.md
|
|
27
27
|
- "test" → tests/ (if directory exists)
|
|
28
28
|
|
|
29
29
|
Examples:
|
|
30
30
|
>>> get_jit_context("/alfred:1-plan", "/project")
|
|
31
|
-
['.
|
|
31
|
+
['.claude/skills/moai-alfred-spec-metadata-extended/reference.md']
|
|
32
32
|
>>> get_jit_context("implement test", "/project")
|
|
33
33
|
['tests/']
|
|
34
34
|
>>> get_jit_context("unknown", "/project")
|
|
@@ -49,8 +49,8 @@ def get_jit_context(prompt: str, cwd: str) -> list[str]:
|
|
|
49
49
|
|
|
50
50
|
# Pattern matching
|
|
51
51
|
patterns = {
|
|
52
|
-
"/alfred:1-plan": [".
|
|
53
|
-
"/alfred:2-run": [".
|
|
52
|
+
"/alfred:1-plan": [".claude/skills/moai-alfred-spec-metadata-extended/reference.md"],
|
|
53
|
+
"/alfred:2-run": [".claude/skills/moai-alfred-dev-guide/reference.md"],
|
|
54
54
|
"test": ["tests/"],
|
|
55
55
|
}
|
|
56
56
|
|