moai-adk 0.8.0__py3-none-any.whl → 0.34.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.
- moai_adk/__init__.py +2 -6
- moai_adk/__main__.py +136 -21
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +17 -5
- moai_adk/cli/commands/init.py +118 -48
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +8 -13
- moai_adk/cli/commands/update.py +1978 -149
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +144 -91
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +148 -17
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +2 -10
- moai_adk/core/git/checkpoint.py +1 -7
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +91 -2
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -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 +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +189 -22
- moai_adk/core/project/initializer.py +218 -27
- moai_adk/core/project/phase_executor.py +416 -44
- moai_adk/core/project/validator.py +7 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +37 -101
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +82 -17
- moai_adk/core/template/config.py +112 -40
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +75 -26
- moai_adk/core/template/processor.py +750 -72
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +670 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +509 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1020 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1384 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/checkpoint.py +10 -37
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1075 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +78 -50
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +313 -283
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +610 -1525
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +423 -619
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +295 -95
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +817 -16
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +532 -17
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +470 -97
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +955 -16
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +651 -18
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +618 -93
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +446 -91
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +346 -94
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +906 -16
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +721 -15
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +352 -91
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +851 -16
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +278 -18
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +344 -86
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +993 -16
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +549 -18
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +617 -96
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +364 -314
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +849 -496
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +731 -243
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +545 -89
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +650 -87
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +341 -93
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +646 -16
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +491 -18
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +463 -89
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +620 -16
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +410 -17
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +486 -112
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +905 -16
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +659 -17
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +333 -92
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1076 -16
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +718 -21
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1462 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +206 -36
- moai_adk/templates/.gitignore +194 -13
- moai_adk/templates/.mcp.json +31 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +151 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +81 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +634 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +170 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +87 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +571 -244
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +9 -13
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.34.0.dist-info/METADATA +2999 -0
- moai_adk-0.34.0.dist-info/RECORD +463 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/WHEEL +1 -1
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -80
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -293
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -196
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -207
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -375
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -343
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -246
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -320
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -837
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -272
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -265
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -311
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -352
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1184
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -665
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -488
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -623
- 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/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -416
- moai_adk/templates/.claude/hooks/alfred/core/tags.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -161
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -90
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -42
- 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-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-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-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-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 -113
- 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/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- 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-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-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- 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/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- 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-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 -218
- 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/.github/ISSUE_TEMPLATE/spec.yml +0 -176
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -256
- moai_adk/templates/.moai/config.json +0 -96
- 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/CONFIG-SCHEMA.md +0 -444
- 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/SKILLS-DESCRIPTION-POLICY.md +0 -218
- 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-0.8.0.dist-info/METADATA +0 -1722
- moai_adk-0.8.0.dist-info/RECORD +0 -282
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,862 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""SessionEnd Hook: Cleanup and state saving on session end
|
|
4
|
+
|
|
5
|
+
Performs the following tasks on session end:
|
|
6
|
+
- Clean up temporary files and cache
|
|
7
|
+
- Save session metrics (for productivity analysis)
|
|
8
|
+
- Save work state snapshot (ensure work continuity)
|
|
9
|
+
- Warn uncommitted changes
|
|
10
|
+
- Generate session summary
|
|
11
|
+
|
|
12
|
+
Features:
|
|
13
|
+
- Clean up old temporary files
|
|
14
|
+
- Clean up cache files
|
|
15
|
+
- Collect and save session metrics
|
|
16
|
+
- Work state snapshot (current SPEC, TodoWrite items, etc.)
|
|
17
|
+
- Detect uncommitted Git changes
|
|
18
|
+
- Generate session summary message
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import json
|
|
22
|
+
import logging
|
|
23
|
+
import shutil
|
|
24
|
+
import subprocess
|
|
25
|
+
import sys
|
|
26
|
+
import time
|
|
27
|
+
from datetime import datetime, timedelta
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import Any, Dict, List, Optional
|
|
30
|
+
|
|
31
|
+
# Add module path
|
|
32
|
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "src"))
|
|
33
|
+
|
|
34
|
+
from lib.path_utils import find_project_root # noqa: E402
|
|
35
|
+
|
|
36
|
+
# Import unified timeout manager and Git operations manager
|
|
37
|
+
try:
|
|
38
|
+
from lib.common import ( # noqa: E402
|
|
39
|
+
format_duration,
|
|
40
|
+
get_summary_stats,
|
|
41
|
+
is_root_whitelisted,
|
|
42
|
+
suggest_moai_location,
|
|
43
|
+
)
|
|
44
|
+
from lib.config_manager import ConfigManager # noqa: E402
|
|
45
|
+
from lib.config_validator import ValidationIssue, get_config_validator
|
|
46
|
+
from lib.git_operations_manager import GitOperationType, get_git_manager
|
|
47
|
+
from lib.unified_timeout_manager import (
|
|
48
|
+
HookTimeoutConfig,
|
|
49
|
+
HookTimeoutError,
|
|
50
|
+
TimeoutPolicy,
|
|
51
|
+
get_timeout_manager,
|
|
52
|
+
hook_timeout_context,
|
|
53
|
+
)
|
|
54
|
+
except ImportError:
|
|
55
|
+
# Fallback implementations if new modules not available
|
|
56
|
+
def get_timeout_manager():
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
def hook_timeout_context(hook_name, config=None):
|
|
60
|
+
import contextlib
|
|
61
|
+
|
|
62
|
+
@contextlib.contextmanager
|
|
63
|
+
def dummy_context():
|
|
64
|
+
yield
|
|
65
|
+
|
|
66
|
+
return dummy_context()
|
|
67
|
+
|
|
68
|
+
class HookTimeoutConfig: # type: ignore[no-redef]
|
|
69
|
+
def __init__(self, **kwargs):
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
class TimeoutPolicy: # type: ignore[no-redef]
|
|
73
|
+
FAST = "fast"
|
|
74
|
+
NORMAL = "normal"
|
|
75
|
+
SLOW = "slow"
|
|
76
|
+
|
|
77
|
+
class HookTimeoutError(Exception): # type: ignore[no-redef]
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
def get_git_manager():
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
class GitOperationType: # type: ignore[no-redef]
|
|
84
|
+
STATUS = "status"
|
|
85
|
+
LOG = "log"
|
|
86
|
+
|
|
87
|
+
def get_config_validator():
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
class ValidationIssue: # type: ignore[no-redef]
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
ConfigManager = None # type: ignore
|
|
94
|
+
# Fallback implementations if module not found
|
|
95
|
+
import statistics
|
|
96
|
+
|
|
97
|
+
def format_duration(seconds):
|
|
98
|
+
"""Format duration in seconds to readable string"""
|
|
99
|
+
if seconds < 60:
|
|
100
|
+
return f"{seconds:.1f}s"
|
|
101
|
+
minutes = seconds / 60
|
|
102
|
+
if minutes < 60:
|
|
103
|
+
return f"{minutes:.1f}m"
|
|
104
|
+
hours = minutes / 60
|
|
105
|
+
return f"{hours:.1f}h"
|
|
106
|
+
|
|
107
|
+
def get_summary_stats(values):
|
|
108
|
+
"""Get summary statistics for a list of values"""
|
|
109
|
+
if not values:
|
|
110
|
+
return {"mean": 0, "min": 0, "max": 0, "std": 0}
|
|
111
|
+
return {
|
|
112
|
+
"mean": statistics.mean(values),
|
|
113
|
+
"min": min(values),
|
|
114
|
+
"max": max(values),
|
|
115
|
+
"std": statistics.stdev(values) if len(values) > 1 else 0,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
logger = logging.getLogger(__name__)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def load_hook_timeout() -> int:
|
|
123
|
+
"""Load hook timeout from config.json (default: 5000ms)
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Timeout in milliseconds
|
|
127
|
+
"""
|
|
128
|
+
try:
|
|
129
|
+
config_file = Path(".moai/config/config.yaml")
|
|
130
|
+
if config_file.exists():
|
|
131
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
132
|
+
config: Dict[str, Any] = json.load(f)
|
|
133
|
+
return config.get("hooks", {}).get("timeout_ms", 5000)
|
|
134
|
+
except Exception:
|
|
135
|
+
pass
|
|
136
|
+
return 5000
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def get_graceful_degradation() -> bool:
|
|
140
|
+
"""Load graceful_degradation setting from config.json (default: true)
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Whether graceful degradation is enabled
|
|
144
|
+
"""
|
|
145
|
+
try:
|
|
146
|
+
config_file = Path(".moai/config/config.yaml")
|
|
147
|
+
if config_file.exists():
|
|
148
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
149
|
+
config: Dict[str, Any] = json.load(f)
|
|
150
|
+
return config.get("hooks", {}).get("graceful_degradation", True)
|
|
151
|
+
except Exception:
|
|
152
|
+
pass
|
|
153
|
+
return True
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def cleanup_old_files(config: Dict[str, Any]) -> Dict[str, int]:
|
|
157
|
+
"""Clean up old files
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
config: Configuration dictionary
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
Statistics of cleaned files
|
|
164
|
+
"""
|
|
165
|
+
stats = {"temp_cleaned": 0, "cache_cleaned": 0, "total_cleaned": 0}
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
cleanup_config = config.get("auto_cleanup", {})
|
|
169
|
+
if not cleanup_config.get("enabled", True):
|
|
170
|
+
return stats
|
|
171
|
+
|
|
172
|
+
cleanup_days = cleanup_config.get("cleanup_days", 7)
|
|
173
|
+
cutoff_date = datetime.now() - timedelta(days=cleanup_days)
|
|
174
|
+
|
|
175
|
+
# Clean up temporary files
|
|
176
|
+
temp_dir = Path(".moai/temp")
|
|
177
|
+
if temp_dir.exists():
|
|
178
|
+
stats["temp_cleaned"] = cleanup_directory(temp_dir, cutoff_date, None, patterns=["*"])
|
|
179
|
+
|
|
180
|
+
# Clean up cache files
|
|
181
|
+
cache_dir = Path(".moai/cache")
|
|
182
|
+
if cache_dir.exists():
|
|
183
|
+
stats["cache_cleaned"] = cleanup_directory(cache_dir, cutoff_date, None, patterns=["*"])
|
|
184
|
+
|
|
185
|
+
stats["total_cleaned"] = stats["temp_cleaned"] + stats["cache_cleaned"]
|
|
186
|
+
|
|
187
|
+
except Exception as e:
|
|
188
|
+
logger.error(f"File cleanup failed: {e}")
|
|
189
|
+
|
|
190
|
+
return stats
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def cleanup_directory(
|
|
194
|
+
directory: Path,
|
|
195
|
+
cutoff_date: datetime,
|
|
196
|
+
max_files: Optional[int],
|
|
197
|
+
patterns: List[str],
|
|
198
|
+
) -> int:
|
|
199
|
+
"""Clean up directory files
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
directory: Target directory
|
|
203
|
+
cutoff_date: Cutoff date threshold
|
|
204
|
+
max_files: Maximum number of files to keep
|
|
205
|
+
patterns: List of file patterns to delete
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Number of deleted files
|
|
209
|
+
"""
|
|
210
|
+
if not directory.exists():
|
|
211
|
+
return 0
|
|
212
|
+
|
|
213
|
+
cleaned_count = 0
|
|
214
|
+
|
|
215
|
+
try:
|
|
216
|
+
# Collect files matching patterns
|
|
217
|
+
files_to_check: list[Path] = []
|
|
218
|
+
for pattern in patterns:
|
|
219
|
+
files_to_check.extend(directory.glob(pattern))
|
|
220
|
+
|
|
221
|
+
# Sort by date (oldest first)
|
|
222
|
+
files_to_check.sort(key=lambda f: f.stat().st_mtime)
|
|
223
|
+
|
|
224
|
+
# Delete files
|
|
225
|
+
for file_path in files_to_check:
|
|
226
|
+
try:
|
|
227
|
+
# Check file modification time
|
|
228
|
+
file_mtime = datetime.fromtimestamp(file_path.stat().st_mtime)
|
|
229
|
+
|
|
230
|
+
# Delete if before cutoff date
|
|
231
|
+
if file_mtime < cutoff_date:
|
|
232
|
+
if file_path.is_file():
|
|
233
|
+
file_path.unlink()
|
|
234
|
+
cleaned_count += 1
|
|
235
|
+
elif file_path.is_dir():
|
|
236
|
+
shutil.rmtree(file_path)
|
|
237
|
+
cleaned_count += 1
|
|
238
|
+
|
|
239
|
+
except Exception as e:
|
|
240
|
+
logger.warning(f"Failed to delete {file_path}: {e}")
|
|
241
|
+
continue
|
|
242
|
+
|
|
243
|
+
except Exception as e:
|
|
244
|
+
logger.error(f"Directory cleanup failed for {directory}: {e}")
|
|
245
|
+
|
|
246
|
+
return cleaned_count
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def save_session_metrics(payload: Dict[str, Any]) -> bool:
|
|
250
|
+
"""Save session metrics (P0-1)
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
payload: Hook payload
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
Success status
|
|
257
|
+
"""
|
|
258
|
+
try:
|
|
259
|
+
# Create logs directory
|
|
260
|
+
logs_dir = Path(".moai/logs/sessions")
|
|
261
|
+
logs_dir.mkdir(parents=True, exist_ok=True)
|
|
262
|
+
|
|
263
|
+
# Collect session information
|
|
264
|
+
session_metrics = {
|
|
265
|
+
"session_id": datetime.now().strftime("%Y-%m-%d-%H%M%S"),
|
|
266
|
+
"end_time": datetime.now().isoformat(),
|
|
267
|
+
"cwd": str(find_project_root()),
|
|
268
|
+
"files_modified": count_modified_files(),
|
|
269
|
+
"git_commits": count_recent_commits(),
|
|
270
|
+
"specs_worked_on": extract_specs_from_memory(),
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
# Save session metrics
|
|
274
|
+
session_file = logs_dir / f"session-{session_metrics['session_id']}.json"
|
|
275
|
+
with open(session_file, "w", encoding="utf-8") as f:
|
|
276
|
+
json.dump(session_metrics, f, indent=2, ensure_ascii=False)
|
|
277
|
+
|
|
278
|
+
logger.info(f"Session metrics saved: {session_file}")
|
|
279
|
+
return True
|
|
280
|
+
|
|
281
|
+
except Exception as e:
|
|
282
|
+
logger.error(f"Failed to save session metrics: {e}")
|
|
283
|
+
return False
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
287
|
+
"""Save work state snapshot (P0-2)
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
payload: Hook payload
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
Success status
|
|
294
|
+
"""
|
|
295
|
+
try:
|
|
296
|
+
# Create memory directory
|
|
297
|
+
memory_dir = Path(".moai/memory")
|
|
298
|
+
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
299
|
+
|
|
300
|
+
# Collect work state
|
|
301
|
+
work_state = {
|
|
302
|
+
"last_updated": datetime.now().isoformat(),
|
|
303
|
+
"current_branch": get_current_branch(),
|
|
304
|
+
"uncommitted_changes": check_uncommitted_changes(),
|
|
305
|
+
"uncommitted_files": count_uncommitted_files(),
|
|
306
|
+
"specs_in_progress": extract_specs_from_memory(),
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
# Save state
|
|
310
|
+
state_file = memory_dir / "last-session-state.json"
|
|
311
|
+
with open(state_file, "w", encoding="utf-8") as f:
|
|
312
|
+
json.dump(work_state, f, indent=2, ensure_ascii=False)
|
|
313
|
+
|
|
314
|
+
logger.info(f"Work state saved: {state_file}")
|
|
315
|
+
return True
|
|
316
|
+
|
|
317
|
+
except Exception as e:
|
|
318
|
+
logger.error(f"Failed to save work state: {e}")
|
|
319
|
+
return False
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def check_uncommitted_changes() -> Optional[str]:
|
|
323
|
+
"""Warn uncommitted changes (P0-3) using optimized Git operations
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
Warning message or None
|
|
327
|
+
"""
|
|
328
|
+
git_manager = get_git_manager()
|
|
329
|
+
if git_manager:
|
|
330
|
+
try:
|
|
331
|
+
# Use optimized Git manager
|
|
332
|
+
from lib.git_operations_manager import GitCommand
|
|
333
|
+
|
|
334
|
+
status_result = git_manager.execute_git_command(
|
|
335
|
+
GitCommand(
|
|
336
|
+
operation_type=GitOperationType.STATUS,
|
|
337
|
+
args=["status", "--porcelain"],
|
|
338
|
+
cache_ttl_seconds=5, # Short TTL for status
|
|
339
|
+
timeout_seconds=3,
|
|
340
|
+
)
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
if status_result.success:
|
|
344
|
+
uncommitted = status_result.stdout.strip()
|
|
345
|
+
if uncommitted:
|
|
346
|
+
line_count = len(uncommitted.split("\n"))
|
|
347
|
+
return f"⚠️ {line_count} uncommitted files detected - Consider committing or stashing changes"
|
|
348
|
+
|
|
349
|
+
except Exception as e:
|
|
350
|
+
logger.warning(f"Git manager failed for uncommitted changes check: {e}")
|
|
351
|
+
|
|
352
|
+
# Fallback to direct Git command
|
|
353
|
+
try:
|
|
354
|
+
result = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True, timeout=1)
|
|
355
|
+
|
|
356
|
+
if result.returncode == 0:
|
|
357
|
+
uncommitted = result.stdout.strip()
|
|
358
|
+
if uncommitted:
|
|
359
|
+
line_count = len(uncommitted.split("\n"))
|
|
360
|
+
return f"⚠️ {line_count} uncommitted files detected - Consider committing or stashing changes"
|
|
361
|
+
|
|
362
|
+
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
363
|
+
pass
|
|
364
|
+
except Exception as e:
|
|
365
|
+
logger.warning(f"Failed to check uncommitted changes: {e}")
|
|
366
|
+
|
|
367
|
+
return None
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def get_current_branch() -> Optional[str]:
|
|
371
|
+
"""Get current Git branch name using optimized Git operations
|
|
372
|
+
|
|
373
|
+
Returns:
|
|
374
|
+
Branch name or None if query fails
|
|
375
|
+
"""
|
|
376
|
+
git_manager = get_git_manager()
|
|
377
|
+
if git_manager:
|
|
378
|
+
try:
|
|
379
|
+
from lib.git_operations_manager import GitCommand
|
|
380
|
+
|
|
381
|
+
branch_result = git_manager.execute_git_command(
|
|
382
|
+
GitCommand(
|
|
383
|
+
operation_type=GitOperationType.BRANCH,
|
|
384
|
+
args=["rev-parse", "--abbrev-ref", "HEAD"],
|
|
385
|
+
cache_ttl_seconds=30,
|
|
386
|
+
timeout_seconds=3,
|
|
387
|
+
)
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
if branch_result.success:
|
|
391
|
+
return branch_result.stdout.strip()
|
|
392
|
+
|
|
393
|
+
except Exception as e:
|
|
394
|
+
logger.warning(f"Git manager failed for branch query: {e}")
|
|
395
|
+
|
|
396
|
+
# Fallback to direct Git command
|
|
397
|
+
try:
|
|
398
|
+
result = subprocess.run(
|
|
399
|
+
["git", "rev-parse", "--abbrev-ref", "HEAD"],
|
|
400
|
+
capture_output=True,
|
|
401
|
+
text=True,
|
|
402
|
+
timeout=1,
|
|
403
|
+
)
|
|
404
|
+
if result.returncode == 0:
|
|
405
|
+
return result.stdout.strip()
|
|
406
|
+
except Exception:
|
|
407
|
+
pass
|
|
408
|
+
|
|
409
|
+
return None
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def count_modified_files() -> int:
|
|
413
|
+
"""Count number of modified files using optimized Git operations"""
|
|
414
|
+
git_manager = get_git_manager()
|
|
415
|
+
if git_manager:
|
|
416
|
+
try:
|
|
417
|
+
from lib.git_operations_manager import GitCommand
|
|
418
|
+
|
|
419
|
+
status_result = git_manager.execute_git_command(
|
|
420
|
+
GitCommand(
|
|
421
|
+
operation_type=GitOperationType.STATUS,
|
|
422
|
+
args=["status", "--porcelain"],
|
|
423
|
+
cache_ttl_seconds=5,
|
|
424
|
+
timeout_seconds=3,
|
|
425
|
+
)
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
if status_result.success:
|
|
429
|
+
return len([line for line in status_result.stdout.strip().split("\n") if line])
|
|
430
|
+
|
|
431
|
+
except Exception as e:
|
|
432
|
+
logger.warning(f"Git manager failed for file count: {e}")
|
|
433
|
+
|
|
434
|
+
# Fallback to direct Git command
|
|
435
|
+
try:
|
|
436
|
+
result = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True, timeout=1)
|
|
437
|
+
if result.returncode == 0:
|
|
438
|
+
return len([line for line in result.stdout.strip().split("\n") if line])
|
|
439
|
+
except Exception:
|
|
440
|
+
pass
|
|
441
|
+
|
|
442
|
+
return 0
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def count_uncommitted_files() -> int:
|
|
446
|
+
"""Count number of uncommitted files"""
|
|
447
|
+
return count_modified_files()
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
def count_recent_commits() -> int:
|
|
451
|
+
"""Count recent commits (during this session) using optimized Git operations"""
|
|
452
|
+
git_manager = get_git_manager()
|
|
453
|
+
if git_manager:
|
|
454
|
+
try:
|
|
455
|
+
from lib.git_operations_manager import GitCommand
|
|
456
|
+
|
|
457
|
+
log_result = git_manager.execute_git_command(
|
|
458
|
+
GitCommand(
|
|
459
|
+
operation_type=GitOperationType.LOG,
|
|
460
|
+
args=["rev-list", "--since=1 hour", "HEAD"],
|
|
461
|
+
cache_ttl_seconds=60, # Cache for 1 minute
|
|
462
|
+
timeout_seconds=5,
|
|
463
|
+
)
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
if log_result.success:
|
|
467
|
+
commits = [line for line in log_result.stdout.strip().split("\n") if line]
|
|
468
|
+
return len(commits)
|
|
469
|
+
|
|
470
|
+
except Exception as e:
|
|
471
|
+
logger.warning(f"Git manager failed for recent commits: {e}")
|
|
472
|
+
|
|
473
|
+
# Fallback to direct Git command
|
|
474
|
+
try:
|
|
475
|
+
result = subprocess.run(
|
|
476
|
+
["git", "rev-list", "--since=1 hour", "HEAD"],
|
|
477
|
+
capture_output=True,
|
|
478
|
+
text=True,
|
|
479
|
+
timeout=1,
|
|
480
|
+
)
|
|
481
|
+
if result.returncode == 0:
|
|
482
|
+
commits = [line for line in result.stdout.strip().split("\n") if line]
|
|
483
|
+
return len(commits)
|
|
484
|
+
except Exception:
|
|
485
|
+
pass
|
|
486
|
+
|
|
487
|
+
return 0
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
def extract_specs_from_memory() -> List[str]:
|
|
491
|
+
"""Extract SPEC information from memory"""
|
|
492
|
+
specs = []
|
|
493
|
+
|
|
494
|
+
try:
|
|
495
|
+
# Query recent SPECs from command_execution_state.json
|
|
496
|
+
state_file = Path(".moai/memory/command-execution-state.json")
|
|
497
|
+
if state_file.exists():
|
|
498
|
+
with open(state_file, "r", encoding="utf-8") as f:
|
|
499
|
+
state_data = json.load(f)
|
|
500
|
+
|
|
501
|
+
# Extract recent SPEC IDs
|
|
502
|
+
if "last_specs" in state_data:
|
|
503
|
+
specs = state_data["last_specs"][:3] # Latest 3
|
|
504
|
+
|
|
505
|
+
except Exception as e:
|
|
506
|
+
logger.warning(f"Failed to extract specs from memory: {e}")
|
|
507
|
+
|
|
508
|
+
return specs
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
# Note: is_root_whitelisted, get_file_pattern_category, and suggest_moai_location
|
|
512
|
+
# are now imported from lib.common (consolidated from duplicate implementations)
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
def scan_root_violations(config: Dict[str, Any]) -> List[Dict[str, str]]:
|
|
516
|
+
"""Scan project root for document management violations
|
|
517
|
+
|
|
518
|
+
Args:
|
|
519
|
+
config: Configuration dictionary
|
|
520
|
+
|
|
521
|
+
Returns:
|
|
522
|
+
List of violation dictionaries with file info and suggested location
|
|
523
|
+
"""
|
|
524
|
+
violations = []
|
|
525
|
+
|
|
526
|
+
try:
|
|
527
|
+
# Get project root
|
|
528
|
+
project_root = Path(".moai/config/config.yaml").parent.parent
|
|
529
|
+
if not project_root.exists():
|
|
530
|
+
project_root = find_project_root()
|
|
531
|
+
|
|
532
|
+
# Scan root directory
|
|
533
|
+
for item in project_root.iterdir():
|
|
534
|
+
# Skip directories (except backup directories)
|
|
535
|
+
if item.is_dir():
|
|
536
|
+
# Check for backup directories
|
|
537
|
+
if item.name.endswith("-backup") or item.name.endswith("_backup") or "_backup_" in item.name:
|
|
538
|
+
suggested = suggest_moai_location(item.name, config)
|
|
539
|
+
violations.append(
|
|
540
|
+
{
|
|
541
|
+
"file": item.name + "/",
|
|
542
|
+
"type": "directory",
|
|
543
|
+
"suggested": suggested,
|
|
544
|
+
}
|
|
545
|
+
)
|
|
546
|
+
continue
|
|
547
|
+
|
|
548
|
+
# Skip hidden files and directories
|
|
549
|
+
if item.name.startswith("."):
|
|
550
|
+
continue
|
|
551
|
+
|
|
552
|
+
# Check if whitelisted
|
|
553
|
+
if is_root_whitelisted(item.name, config):
|
|
554
|
+
continue
|
|
555
|
+
|
|
556
|
+
# Not whitelisted - add to violations
|
|
557
|
+
suggested = suggest_moai_location(item.name, config)
|
|
558
|
+
violations.append({"file": item.name, "type": "file", "suggested": suggested})
|
|
559
|
+
|
|
560
|
+
except Exception as e:
|
|
561
|
+
logger.warning(f"Failed to scan root violations: {e}")
|
|
562
|
+
|
|
563
|
+
return violations
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
def generate_migration_report(violations: List[Dict[str, str]]) -> str:
|
|
567
|
+
"""Generate migration suggestions report
|
|
568
|
+
|
|
569
|
+
Args:
|
|
570
|
+
violations: List of violations
|
|
571
|
+
|
|
572
|
+
Returns:
|
|
573
|
+
Formatted report string
|
|
574
|
+
"""
|
|
575
|
+
if not violations:
|
|
576
|
+
return ""
|
|
577
|
+
|
|
578
|
+
report_lines = [
|
|
579
|
+
"\n⚠️ Document Management Violations Detected",
|
|
580
|
+
f" Found {len(violations)} misplaced file(s) in project root:\n",
|
|
581
|
+
]
|
|
582
|
+
|
|
583
|
+
for idx, violation in enumerate(violations, 1):
|
|
584
|
+
file_display = violation["file"]
|
|
585
|
+
suggested = violation["suggested"]
|
|
586
|
+
report_lines.append(f" {idx}. {file_display} → {suggested}")
|
|
587
|
+
|
|
588
|
+
report_lines.append("\n Action: Move files to suggested locations or update root_whitelist")
|
|
589
|
+
report_lines.append(' Guide: Skill("moai-core-document-management")')
|
|
590
|
+
|
|
591
|
+
return "\n".join(report_lines)
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
def generate_session_summary(
|
|
595
|
+
cleanup_stats: Dict[str, int], work_state: Dict[str, Any], violations_count: int = 0
|
|
596
|
+
) -> str:
|
|
597
|
+
"""Generate session summary (P1-3)
|
|
598
|
+
|
|
599
|
+
Args:
|
|
600
|
+
cleanup_stats: Cleanup statistics
|
|
601
|
+
work_state: Work state
|
|
602
|
+
violations_count: Number of document management violations
|
|
603
|
+
|
|
604
|
+
Returns:
|
|
605
|
+
Summary message
|
|
606
|
+
"""
|
|
607
|
+
summary_lines = ["✅ Session Ended"]
|
|
608
|
+
|
|
609
|
+
try:
|
|
610
|
+
# Work information
|
|
611
|
+
specs = work_state.get("specs_in_progress", [])
|
|
612
|
+
if specs:
|
|
613
|
+
summary_lines.append(f" • Worked on: {', '.join(specs)}")
|
|
614
|
+
|
|
615
|
+
# File modification information
|
|
616
|
+
files_modified = work_state.get("uncommitted_files", 0)
|
|
617
|
+
if files_modified > 0:
|
|
618
|
+
summary_lines.append(f" • Files modified: {files_modified}")
|
|
619
|
+
|
|
620
|
+
# Cleanup information
|
|
621
|
+
total_cleaned = cleanup_stats.get("total_cleaned", 0)
|
|
622
|
+
if total_cleaned > 0:
|
|
623
|
+
summary_lines.append(f" • Cleaned: {total_cleaned} temp files")
|
|
624
|
+
|
|
625
|
+
# Document management violations
|
|
626
|
+
if violations_count > 0:
|
|
627
|
+
summary_lines.append(f" ⚠️ {violations_count} root violations detected (see below)")
|
|
628
|
+
|
|
629
|
+
except Exception as e:
|
|
630
|
+
logger.warning(f"Failed to generate session summary: {e}")
|
|
631
|
+
|
|
632
|
+
return "\n".join(summary_lines)
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
def execute_session_end_workflow() -> tuple[Dict[str, Any], str]:
|
|
636
|
+
"""Execute the session end workflow with proper error handling"""
|
|
637
|
+
start_time = time.time()
|
|
638
|
+
|
|
639
|
+
# Load configuration
|
|
640
|
+
if ConfigManager:
|
|
641
|
+
config = ConfigManager().load_config()
|
|
642
|
+
else:
|
|
643
|
+
config = {}
|
|
644
|
+
|
|
645
|
+
# Generate hook payload (simple version)
|
|
646
|
+
payload = {"cwd": str(find_project_root())}
|
|
647
|
+
|
|
648
|
+
results = {
|
|
649
|
+
"hook": "session_end__auto_cleanup",
|
|
650
|
+
"success": True,
|
|
651
|
+
"execution_time_seconds": 0,
|
|
652
|
+
"cleanup_stats": {"total_cleaned": 0},
|
|
653
|
+
"work_state_saved": False,
|
|
654
|
+
"session_metrics_saved": False,
|
|
655
|
+
"uncommitted_warning": None,
|
|
656
|
+
"session_summary": "",
|
|
657
|
+
"timestamp": datetime.now().isoformat(),
|
|
658
|
+
"performance": {
|
|
659
|
+
"git_manager_used": get_git_manager() is not None,
|
|
660
|
+
"timeout_manager_used": get_timeout_manager() is not None,
|
|
661
|
+
"config_validator_used": get_config_validator() is not None,
|
|
662
|
+
},
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
try:
|
|
666
|
+
# P0-1: Save session metrics
|
|
667
|
+
if save_session_metrics(payload):
|
|
668
|
+
results["session_metrics_saved"] = True
|
|
669
|
+
|
|
670
|
+
# P0-2: Save work state snapshot
|
|
671
|
+
work_state = {}
|
|
672
|
+
if save_work_state(payload):
|
|
673
|
+
results["work_state_saved"] = True
|
|
674
|
+
work_state = {
|
|
675
|
+
"uncommitted_files": count_uncommitted_files(),
|
|
676
|
+
"specs_in_progress": extract_specs_from_memory(),
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
# P0-3: Warn uncommitted changes
|
|
680
|
+
uncommitted_warning = check_uncommitted_changes()
|
|
681
|
+
if uncommitted_warning:
|
|
682
|
+
results["uncommitted_warning"] = uncommitted_warning
|
|
683
|
+
|
|
684
|
+
# P1-1: Clean up temporary files
|
|
685
|
+
cleanup_stats = cleanup_old_files(config)
|
|
686
|
+
results["cleanup_stats"] = cleanup_stats
|
|
687
|
+
|
|
688
|
+
# P1-2: Document Management - Scan root violations
|
|
689
|
+
violations = []
|
|
690
|
+
migration_report = ""
|
|
691
|
+
doc_mgmt = config.get("document_management", {})
|
|
692
|
+
if doc_mgmt.get("enabled", True):
|
|
693
|
+
violations = scan_root_violations(config)
|
|
694
|
+
if violations:
|
|
695
|
+
migration_report = generate_migration_report(violations)
|
|
696
|
+
results["document_violations"] = {
|
|
697
|
+
"count": len(violations),
|
|
698
|
+
"violations": violations,
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
# P1-3: Generate session summary
|
|
702
|
+
session_summary = generate_session_summary(cleanup_stats, work_state, len(violations))
|
|
703
|
+
results["session_summary"] = session_summary
|
|
704
|
+
|
|
705
|
+
# Add migration report to summary if violations exist
|
|
706
|
+
if migration_report:
|
|
707
|
+
results["migration_report"] = migration_report
|
|
708
|
+
|
|
709
|
+
# Record execution time
|
|
710
|
+
execution_time = time.time() - start_time
|
|
711
|
+
results["execution_time_seconds"] = round(execution_time, 2)
|
|
712
|
+
|
|
713
|
+
return results, migration_report
|
|
714
|
+
|
|
715
|
+
except Exception as e:
|
|
716
|
+
results["success"] = False
|
|
717
|
+
results["error"] = str(e)
|
|
718
|
+
results["execution_time_seconds"] = round(time.time() - start_time, 2)
|
|
719
|
+
return results, ""
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
def main() -> None:
|
|
723
|
+
"""Main function
|
|
724
|
+
|
|
725
|
+
SessionEnd Hook entry point for cleanup and work state tracking.
|
|
726
|
+
Cleans up temporary files, saves session metrics, and warns uncommitted changes.
|
|
727
|
+
|
|
728
|
+
Features:
|
|
729
|
+
- Optimized timeout handling with unified manager
|
|
730
|
+
- Enhanced error handling with graceful degradation
|
|
731
|
+
- Resource monitoring and cleanup
|
|
732
|
+
- Performance optimization with Git operations manager
|
|
733
|
+
|
|
734
|
+
Returns:
|
|
735
|
+
None
|
|
736
|
+
"""
|
|
737
|
+
# Configure timeout for session end hook
|
|
738
|
+
timeout_config = HookTimeoutConfig(
|
|
739
|
+
policy=TimeoutPolicy.NORMAL,
|
|
740
|
+
custom_timeout_ms=5000, # 5 seconds
|
|
741
|
+
retry_count=1,
|
|
742
|
+
retry_delay_ms=500,
|
|
743
|
+
graceful_degradation=True,
|
|
744
|
+
memory_limit_mb=150, # Higher memory limit for cleanup operations
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
# Use unified timeout manager if available
|
|
748
|
+
timeout_manager = get_timeout_manager()
|
|
749
|
+
if timeout_manager:
|
|
750
|
+
try:
|
|
751
|
+
results, migration_report = timeout_manager.execute_with_timeout(
|
|
752
|
+
"session_end__auto_cleanup",
|
|
753
|
+
execute_session_end_workflow,
|
|
754
|
+
config=timeout_config,
|
|
755
|
+
)
|
|
756
|
+
|
|
757
|
+
# Print results
|
|
758
|
+
output_lines = [json.dumps(results, ensure_ascii=False, indent=2)]
|
|
759
|
+
|
|
760
|
+
# Print migration report separately for visibility
|
|
761
|
+
if migration_report:
|
|
762
|
+
output_lines.append(migration_report)
|
|
763
|
+
|
|
764
|
+
print("\n".join(output_lines))
|
|
765
|
+
|
|
766
|
+
except HookTimeoutError as e:
|
|
767
|
+
# Enhanced timeout error handling
|
|
768
|
+
timeout_response = {
|
|
769
|
+
"hook": "session_end__auto_cleanup",
|
|
770
|
+
"success": False,
|
|
771
|
+
"error": f"Hook execution timeout: {str(e)}",
|
|
772
|
+
"error_details": {
|
|
773
|
+
"hook_id": e.hook_id,
|
|
774
|
+
"timeout_seconds": e.timeout_seconds,
|
|
775
|
+
"execution_time": e.execution_time,
|
|
776
|
+
"will_retry": e.will_retry,
|
|
777
|
+
},
|
|
778
|
+
"graceful_degradation": True,
|
|
779
|
+
"timestamp": datetime.now().isoformat(),
|
|
780
|
+
}
|
|
781
|
+
timeout_response["message"] = "Hook timeout but continuing due to graceful degradation"
|
|
782
|
+
print(json.dumps(timeout_response, ensure_ascii=False, indent=2))
|
|
783
|
+
|
|
784
|
+
except Exception as e:
|
|
785
|
+
# Enhanced error handling with context
|
|
786
|
+
error_response = {
|
|
787
|
+
"hook": "session_end__auto_cleanup",
|
|
788
|
+
"success": False,
|
|
789
|
+
"error": f"Hook execution failed: {str(e)}",
|
|
790
|
+
"error_details": {
|
|
791
|
+
"error_type": type(e).__name__,
|
|
792
|
+
"message": str(e),
|
|
793
|
+
"graceful_degradation": True,
|
|
794
|
+
},
|
|
795
|
+
"timestamp": datetime.now().isoformat(),
|
|
796
|
+
}
|
|
797
|
+
error_response["message"] = "Hook failed but continuing due to graceful degradation"
|
|
798
|
+
print(json.dumps(error_response, ensure_ascii=False, indent=2))
|
|
799
|
+
|
|
800
|
+
else:
|
|
801
|
+
# Fallback to legacy timeout handling
|
|
802
|
+
try:
|
|
803
|
+
timeout_seconds = load_hook_timeout() / 1000
|
|
804
|
+
graceful_degradation = get_graceful_degradation()
|
|
805
|
+
|
|
806
|
+
# Legacy timeout implementation
|
|
807
|
+
import signal
|
|
808
|
+
|
|
809
|
+
def timeout_handler(signum, frame):
|
|
810
|
+
raise TimeoutError("Hook execution timeout")
|
|
811
|
+
|
|
812
|
+
signal.signal(signal.SIGALRM, timeout_handler)
|
|
813
|
+
signal.alarm(int(timeout_seconds))
|
|
814
|
+
|
|
815
|
+
try:
|
|
816
|
+
results, migration_report = execute_session_end_workflow()
|
|
817
|
+
|
|
818
|
+
# Print results
|
|
819
|
+
output_lines = [json.dumps(results, ensure_ascii=False, indent=2)]
|
|
820
|
+
|
|
821
|
+
# Print migration report separately for visibility
|
|
822
|
+
if migration_report:
|
|
823
|
+
output_lines.append(migration_report)
|
|
824
|
+
|
|
825
|
+
print("\n".join(output_lines))
|
|
826
|
+
|
|
827
|
+
finally:
|
|
828
|
+
signal.alarm(0) # Clear timeout
|
|
829
|
+
|
|
830
|
+
except TimeoutError as e:
|
|
831
|
+
# Handle timeout with graceful degradation
|
|
832
|
+
result = {
|
|
833
|
+
"hook": "session_end__auto_cleanup",
|
|
834
|
+
"success": False,
|
|
835
|
+
"error": f"Hook execution timeout: {str(e)}",
|
|
836
|
+
"graceful_degradation": graceful_degradation,
|
|
837
|
+
"timestamp": datetime.now().isoformat(),
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
if graceful_degradation:
|
|
841
|
+
result["message"] = "Hook timeout but continuing due to graceful degradation"
|
|
842
|
+
|
|
843
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
844
|
+
|
|
845
|
+
except Exception as e:
|
|
846
|
+
# Handle exceptions with graceful degradation
|
|
847
|
+
result = {
|
|
848
|
+
"hook": "session_end__auto_cleanup",
|
|
849
|
+
"success": False,
|
|
850
|
+
"error": f"Hook execution failed: {str(e)}",
|
|
851
|
+
"graceful_degradation": graceful_degradation,
|
|
852
|
+
"timestamp": datetime.now().isoformat(),
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
if graceful_degradation:
|
|
856
|
+
result["message"] = "Hook failed but continuing due to graceful degradation"
|
|
857
|
+
|
|
858
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
if __name__ == "__main__":
|
|
862
|
+
main()
|