moai-adk 0.8.0__py3-none-any.whl → 1.1.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 +267 -21
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +125 -0
- moai_adk/cli/commands/doctor.py +24 -6
- moai_adk/cli/commands/init.py +437 -57
- moai_adk/cli/commands/language.py +254 -0
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +15 -14
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +2195 -93
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +457 -108
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- 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 +448 -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 +788 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +648 -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/migration.py +148 -17
- moai_adk/core/config/unified.py +617 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/credentials.py +264 -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 +1920 -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 +422 -0
- moai_adk/core/git/event_detector.py +16 -7
- moai_adk/core/git/manager.py +91 -2
- 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 +578 -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 +666 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +389 -0
- moai_adk/core/migration/backup_manager.py +327 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +381 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +499 -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 +243 -0
- moai_adk/core/migration/version_migrator.py +263 -0
- moai_adk/core/model_allocator.py +241 -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 +13 -8
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +189 -22
- moai_adk/core/project/initializer.py +177 -29
- moai_adk/core/project/phase_executor.py +482 -48
- moai_adk/core/project/validator.py +22 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +66 -110
- 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 +953 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +168 -21
- moai_adk/core/template/config.py +141 -45
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +107 -32
- moai_adk/core/template/processor.py +1075 -74
- moai_adk/core/template_engine.py +319 -0
- moai_adk/core/template_variable_synchronizer.py +431 -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 +477 -0
- moai_adk/foundation/__init__.py +37 -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/__init__.py +376 -0
- moai_adk/foundation/git/commit_templates.py +557 -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/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1091 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +41 -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 +341 -0
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +359 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +490 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1218 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +682 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +963 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +407 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +722 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +748 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +661 -0
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +525 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +737 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +438 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +578 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1092 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +971 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +641 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +815 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +811 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +797 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +438 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1447 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +850 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1398 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +330 -0
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -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/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +41 -0
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/checkpoint.py +13 -37
- moai_adk/templates/.claude/hooks/moai/lib/common.py +161 -0
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +442 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +592 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +417 -0
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +219 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +777 -0
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -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/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +542 -0
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +894 -0
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1170 -0
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +643 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +177 -72
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +303 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +252 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +56 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +120 -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 +185 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +207 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +234 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +132 -281
- 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 +133 -77
- 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 +91 -78
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +955 -16
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +651 -18
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +234 -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/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 +189 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +327 -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 +225 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -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-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +739 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +670 -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-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -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 +467 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +420 -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 +221 -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 +242 -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-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +228 -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/patterns.md +22 -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-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +171 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -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 +239 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +311 -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 +180 -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-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +96 -77
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1226 -16
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1119 -14
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +80 -79
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +572 -16
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +388 -15
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +135 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +104 -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 +153 -80
- 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 +117 -80
- 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-javascript/SKILL.md +133 -79
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +960 -16
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1528 -17
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +100 -79
- 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 +135 -76
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1595 -16
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1309 -16
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +141 -341
- 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 +134 -76
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1141 -16
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1074 -17
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +136 -77
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1093 -16
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1010 -17
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +112 -78
- 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 +113 -75
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +620 -16
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +410 -17
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -83
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +905 -16
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +659 -17
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +115 -82
- 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 +145 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/modules/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/modules/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 +143 -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 +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +350 -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/modules/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 +175 -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-platform-auth0/SKILL.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +135 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +158 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +166 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +127 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +156 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +146 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +141 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +132 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +251 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/modules/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/modules/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +287 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -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 +1434 -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-spec/SKILL.md +337 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +270 -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 +269 -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 +269 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +263 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +327 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +313 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +265 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -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-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +468 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +1314 -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 +152 -13
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +64 -0
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -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/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +55 -0
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +59 -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/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +274 -246
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +9 -13
- moai_adk/utils/common.py +331 -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-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.8.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +1 -1
- moai_adk-1.1.0.dist-info/entry_points.txt +5 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -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-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-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/entry_points.txt +0 -2
- moai_adk-0.8.0.dist-info/licenses/LICENSE +0 -21
|
@@ -0,0 +1,1170 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SessionStart Hook: Enhanced Project Information
|
|
3
|
+
"""SessionStart Hook: Enhanced Project Information
|
|
4
|
+
|
|
5
|
+
Claude Code Event: SessionStart
|
|
6
|
+
Purpose: Display enhanced project status with Git info, test status, and SPEC progress
|
|
7
|
+
Execution: Triggered automatically when Claude Code session begins
|
|
8
|
+
|
|
9
|
+
Enhanced Features:
|
|
10
|
+
- Optimized timeout handling with unified manager
|
|
11
|
+
- Efficient Git operations with connection pooling and caching
|
|
12
|
+
- Enhanced error handling with graceful degradation
|
|
13
|
+
- Resource monitoring and cleanup
|
|
14
|
+
- Risk assessment with performance metrics
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import logging
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
# =============================================================================
|
|
27
|
+
# Windows UTF-8 Encoding Fix (Issue #249)
|
|
28
|
+
# Ensures emoji characters are properly displayed on Windows terminals
|
|
29
|
+
# =============================================================================
|
|
30
|
+
if sys.platform == "win32":
|
|
31
|
+
try:
|
|
32
|
+
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
33
|
+
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
|
|
34
|
+
except (AttributeError, OSError):
|
|
35
|
+
# Python < 3.7 or reconfigure not available
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
# =============================================================================
|
|
39
|
+
# Constants - Risk Assessment Thresholds
|
|
40
|
+
# =============================================================================
|
|
41
|
+
# These thresholds determine project risk level based on various factors
|
|
42
|
+
RISK_SCORE_HIGH = 20 # Score >= this is HIGH risk
|
|
43
|
+
RISK_SCORE_MEDIUM = 10 # Score >= this (and < HIGH) is MEDIUM risk
|
|
44
|
+
|
|
45
|
+
# Git changes thresholds for risk calculation
|
|
46
|
+
GIT_CHANGES_HIGH_THRESHOLD = 20 # Adds 10 to risk score
|
|
47
|
+
GIT_CHANGES_MEDIUM_THRESHOLD = 10 # Adds 5 to risk score
|
|
48
|
+
|
|
49
|
+
# SPEC progress thresholds
|
|
50
|
+
SPEC_PROGRESS_LOW = 50 # Below this adds 15 to risk score
|
|
51
|
+
SPEC_PROGRESS_MEDIUM = 80 # Below this adds 8 to risk score
|
|
52
|
+
|
|
53
|
+
# Risk score contributions
|
|
54
|
+
RISK_GIT_CHANGES_HIGH = 10
|
|
55
|
+
RISK_GIT_CHANGES_MEDIUM = 5
|
|
56
|
+
RISK_SPEC_LOW = 15
|
|
57
|
+
RISK_SPEC_MEDIUM = 8
|
|
58
|
+
RISK_TEST_FAILED = 12
|
|
59
|
+
RISK_COVERAGE_UNKNOWN = 5
|
|
60
|
+
|
|
61
|
+
# Setup message suppression period (days)
|
|
62
|
+
SETUP_MESSAGE_RESCAN_DAYS = 7
|
|
63
|
+
|
|
64
|
+
# =============================================================================
|
|
65
|
+
# Setup import path for shared modules
|
|
66
|
+
HOOKS_DIR = Path(__file__).parent
|
|
67
|
+
LIB_DIR = HOOKS_DIR / "lib"
|
|
68
|
+
if str(LIB_DIR) not in sys.path:
|
|
69
|
+
sys.path.insert(0, str(LIB_DIR))
|
|
70
|
+
|
|
71
|
+
# Import path utils for project root resolution
|
|
72
|
+
from lib.file_utils import check_file_size # noqa: E402
|
|
73
|
+
from lib.path_utils import find_project_root # noqa: E402
|
|
74
|
+
|
|
75
|
+
# Import unified timeout manager and Git operations manager
|
|
76
|
+
try:
|
|
77
|
+
from lib.git_operations_manager import GitOperationType, get_git_manager
|
|
78
|
+
from lib.timeout import TimeoutError as PlatformTimeoutError
|
|
79
|
+
from lib.unified_timeout_manager import (
|
|
80
|
+
HookTimeoutConfig,
|
|
81
|
+
HookTimeoutError,
|
|
82
|
+
TimeoutPolicy,
|
|
83
|
+
get_timeout_manager,
|
|
84
|
+
hook_timeout_context,
|
|
85
|
+
)
|
|
86
|
+
except ImportError:
|
|
87
|
+
# Fallback implementations if new modules not available
|
|
88
|
+
|
|
89
|
+
def get_timeout_manager():
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
def hook_timeout_context(hook_name, config=None):
|
|
93
|
+
import contextlib
|
|
94
|
+
|
|
95
|
+
@contextlib.contextmanager
|
|
96
|
+
def dummy_context():
|
|
97
|
+
yield
|
|
98
|
+
|
|
99
|
+
return dummy_context()
|
|
100
|
+
|
|
101
|
+
class HookTimeoutConfig: # type: ignore[no-redef]
|
|
102
|
+
def __init__(self, **kwargs):
|
|
103
|
+
pass
|
|
104
|
+
|
|
105
|
+
class TimeoutPolicy: # type: ignore[no-redef]
|
|
106
|
+
FAST = "fast"
|
|
107
|
+
NORMAL = "normal"
|
|
108
|
+
SLOW = "slow"
|
|
109
|
+
|
|
110
|
+
class HookTimeoutError(Exception): # type: ignore[no-redef]
|
|
111
|
+
pass
|
|
112
|
+
|
|
113
|
+
def get_git_manager():
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
class GitOperationType: # type: ignore[no-redef]
|
|
117
|
+
BRANCH = "branch"
|
|
118
|
+
LOG = "log"
|
|
119
|
+
STATUS = "status"
|
|
120
|
+
|
|
121
|
+
class PlatformTimeoutError(Exception): # type: ignore[no-redef]
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
# Import config cache
|
|
126
|
+
try:
|
|
127
|
+
from core.config_cache import get_cached_config, get_cached_spec_progress
|
|
128
|
+
except ImportError:
|
|
129
|
+
# Fallback to direct functions if cache not available
|
|
130
|
+
# Try PyYAML first, then use simple parser
|
|
131
|
+
try:
|
|
132
|
+
import yaml as yaml_fallback
|
|
133
|
+
|
|
134
|
+
HAS_YAML_FALLBACK = True
|
|
135
|
+
except ImportError:
|
|
136
|
+
HAS_YAML_FALLBACK = False
|
|
137
|
+
|
|
138
|
+
def _simple_yaml_parse(content: str) -> dict:
|
|
139
|
+
"""Simple YAML parser for basic key-value configs without PyYAML dependency.
|
|
140
|
+
|
|
141
|
+
Handles:
|
|
142
|
+
- Top-level keys with nested values
|
|
143
|
+
- String values (quoted or unquoted, including empty strings)
|
|
144
|
+
- Boolean values (true/false)
|
|
145
|
+
- Numeric values
|
|
146
|
+
- Comments (lines starting with # or inline after values)
|
|
147
|
+
|
|
148
|
+
Does NOT handle:
|
|
149
|
+
- Lists
|
|
150
|
+
- Complex nested structures beyond 2 levels
|
|
151
|
+
- Multi-line strings
|
|
152
|
+
"""
|
|
153
|
+
result = {}
|
|
154
|
+
current_section = None
|
|
155
|
+
lines = content.split("\n")
|
|
156
|
+
|
|
157
|
+
for line in lines:
|
|
158
|
+
# Skip empty lines and comments
|
|
159
|
+
stripped = line.strip()
|
|
160
|
+
if not stripped or stripped.startswith("#"):
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
# Count leading spaces for indentation
|
|
164
|
+
indent = len(line) - len(line.lstrip())
|
|
165
|
+
|
|
166
|
+
# Check if this is a key-value pair
|
|
167
|
+
if ":" in stripped:
|
|
168
|
+
key_part, _, value_part = stripped.partition(":")
|
|
169
|
+
key = key_part.strip()
|
|
170
|
+
value = value_part.strip()
|
|
171
|
+
|
|
172
|
+
# Track if value was explicitly quoted (including empty strings)
|
|
173
|
+
was_quoted = False
|
|
174
|
+
|
|
175
|
+
# Handle quoted strings first - extract value within quotes
|
|
176
|
+
if value.startswith('"'):
|
|
177
|
+
# Find the closing quote
|
|
178
|
+
close_quote = value.find('"', 1)
|
|
179
|
+
if close_quote > 0:
|
|
180
|
+
value = value[1:close_quote]
|
|
181
|
+
was_quoted = True
|
|
182
|
+
elif value == '""':
|
|
183
|
+
# Handle explicit empty string ""
|
|
184
|
+
value = ""
|
|
185
|
+
was_quoted = True
|
|
186
|
+
elif value.startswith("'"):
|
|
187
|
+
# Find the closing quote
|
|
188
|
+
close_quote = value.find("'", 1)
|
|
189
|
+
if close_quote > 0:
|
|
190
|
+
value = value[1:close_quote]
|
|
191
|
+
was_quoted = True
|
|
192
|
+
elif value == "''":
|
|
193
|
+
# Handle explicit empty string ''
|
|
194
|
+
value = ""
|
|
195
|
+
was_quoted = True
|
|
196
|
+
else:
|
|
197
|
+
# Remove inline comments for unquoted values
|
|
198
|
+
if "#" in value:
|
|
199
|
+
value = value.split("#")[0].strip()
|
|
200
|
+
|
|
201
|
+
# Top-level key (no indentation or minimal indentation)
|
|
202
|
+
if indent == 0:
|
|
203
|
+
if value or was_quoted:
|
|
204
|
+
# Simple key: value (including empty quoted strings)
|
|
205
|
+
result[key] = _parse_simple_value(value)
|
|
206
|
+
else:
|
|
207
|
+
# Section header (e.g., "user:", "language:")
|
|
208
|
+
current_section = key
|
|
209
|
+
result[current_section] = {}
|
|
210
|
+
elif current_section and indent > 0:
|
|
211
|
+
# Nested key under current section
|
|
212
|
+
if value or was_quoted:
|
|
213
|
+
# Store value (including empty quoted strings)
|
|
214
|
+
result[current_section][key] = _parse_simple_value(value)
|
|
215
|
+
else:
|
|
216
|
+
# Nested section (2-level nesting) - only when no value at all
|
|
217
|
+
result[current_section][key] = {}
|
|
218
|
+
|
|
219
|
+
return result
|
|
220
|
+
|
|
221
|
+
def _parse_simple_value(value: str):
|
|
222
|
+
"""Parse a simple value string into appropriate Python type."""
|
|
223
|
+
if not value:
|
|
224
|
+
return ""
|
|
225
|
+
|
|
226
|
+
# Boolean
|
|
227
|
+
if value.lower() == "true":
|
|
228
|
+
return True
|
|
229
|
+
if value.lower() == "false":
|
|
230
|
+
return False
|
|
231
|
+
|
|
232
|
+
# Numeric
|
|
233
|
+
try:
|
|
234
|
+
if "." in value:
|
|
235
|
+
return float(value)
|
|
236
|
+
return int(value)
|
|
237
|
+
except ValueError:
|
|
238
|
+
pass
|
|
239
|
+
|
|
240
|
+
return value
|
|
241
|
+
|
|
242
|
+
def _merge_configs(base: dict, override: dict) -> dict:
|
|
243
|
+
"""Recursively merge two configuration dictionaries."""
|
|
244
|
+
result = base.copy()
|
|
245
|
+
for key, value in override.items():
|
|
246
|
+
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
|
247
|
+
result[key] = _merge_configs(result[key], value)
|
|
248
|
+
else:
|
|
249
|
+
result[key] = value
|
|
250
|
+
return result
|
|
251
|
+
|
|
252
|
+
def _load_yaml_file(file_path: Path) -> dict:
|
|
253
|
+
"""Load a YAML file using PyYAML or simple parser."""
|
|
254
|
+
if not file_path.exists():
|
|
255
|
+
return {}
|
|
256
|
+
|
|
257
|
+
# Check file size before reading (H2: 10MB limit)
|
|
258
|
+
is_safe, error_msg = check_file_size(file_path)
|
|
259
|
+
if not is_safe:
|
|
260
|
+
# File too large or other error, skip loading
|
|
261
|
+
return {}
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
content = file_path.read_text(encoding="utf-8")
|
|
265
|
+
if HAS_YAML_FALLBACK:
|
|
266
|
+
return yaml_fallback.safe_load(content) or {}
|
|
267
|
+
else:
|
|
268
|
+
return _simple_yaml_parse(content)
|
|
269
|
+
except Exception:
|
|
270
|
+
return {}
|
|
271
|
+
|
|
272
|
+
def get_cached_config():
|
|
273
|
+
"""Load config with section file merging for complete configuration.
|
|
274
|
+
|
|
275
|
+
FIX #245/#243: Properly loads both config.yaml AND section files,
|
|
276
|
+
merging them to provide complete configuration data.
|
|
277
|
+
|
|
278
|
+
Priority (highest to lowest):
|
|
279
|
+
1. Section files (.moai/config/sections/*.yaml)
|
|
280
|
+
2. Main config file (.moai/config/config.yaml)
|
|
281
|
+
"""
|
|
282
|
+
project_root = find_project_root()
|
|
283
|
+
config_dir = project_root / ".moai" / "config"
|
|
284
|
+
|
|
285
|
+
# Start with main config file
|
|
286
|
+
main_config_path = config_dir / "config.yaml"
|
|
287
|
+
config = _load_yaml_file(main_config_path)
|
|
288
|
+
|
|
289
|
+
# If main config failed, try JSON fallback
|
|
290
|
+
if not config:
|
|
291
|
+
json_config_path = config_dir / "config.json"
|
|
292
|
+
if json_config_path.exists():
|
|
293
|
+
# Check file size before reading (H2: 10MB limit)
|
|
294
|
+
is_safe, _ = check_file_size(json_config_path)
|
|
295
|
+
if is_safe:
|
|
296
|
+
try:
|
|
297
|
+
config = json.loads(json_config_path.read_text(encoding="utf-8"))
|
|
298
|
+
except (json.JSONDecodeError, OSError):
|
|
299
|
+
config = {}
|
|
300
|
+
else:
|
|
301
|
+
config = {}
|
|
302
|
+
|
|
303
|
+
# Merge section files (they take priority for their specific keys)
|
|
304
|
+
sections_dir = config_dir / "sections"
|
|
305
|
+
if sections_dir.exists():
|
|
306
|
+
section_files = [
|
|
307
|
+
("user.yaml", "user"),
|
|
308
|
+
("language.yaml", "language"),
|
|
309
|
+
("git-strategy.yaml", "git_strategy"),
|
|
310
|
+
("project.yaml", "project"),
|
|
311
|
+
("quality.yaml", "quality"),
|
|
312
|
+
("system.yaml", "system"),
|
|
313
|
+
]
|
|
314
|
+
|
|
315
|
+
for filename, key in section_files:
|
|
316
|
+
section_path = sections_dir / filename
|
|
317
|
+
section_data = _load_yaml_file(section_path)
|
|
318
|
+
if section_data:
|
|
319
|
+
# Merge section data into config
|
|
320
|
+
config = _merge_configs(config, section_data)
|
|
321
|
+
|
|
322
|
+
return config if config else None
|
|
323
|
+
|
|
324
|
+
def get_cached_spec_progress():
|
|
325
|
+
"""Get SPEC progress information - FIXED to use YAML frontmatter parsing"""
|
|
326
|
+
# FIX #3: Use absolute path from find_project_root() to ensure current project only
|
|
327
|
+
project_root = find_project_root()
|
|
328
|
+
specs_dir = project_root / ".moai" / "specs"
|
|
329
|
+
|
|
330
|
+
if not specs_dir.exists():
|
|
331
|
+
return {"completed": 0, "total": 0, "percentage": 0}
|
|
332
|
+
try:
|
|
333
|
+
# Only scan SPEC folders in THIS project's .moai/specs/ directory
|
|
334
|
+
spec_folders = [d for d in specs_dir.iterdir() if d.is_dir() and d.name.startswith("SPEC-")]
|
|
335
|
+
total = len(spec_folders)
|
|
336
|
+
|
|
337
|
+
# FIX: Parse YAML frontmatter to check for status: completed
|
|
338
|
+
completed = 0
|
|
339
|
+
for folder in spec_folders:
|
|
340
|
+
spec_file = folder / "spec.md"
|
|
341
|
+
if not spec_file.exists():
|
|
342
|
+
continue
|
|
343
|
+
|
|
344
|
+
try:
|
|
345
|
+
# Read spec.md content
|
|
346
|
+
content = spec_file.read_text(encoding="utf-8")
|
|
347
|
+
|
|
348
|
+
# Parse YAML frontmatter (between --- delimiters)
|
|
349
|
+
if content.startswith("---"):
|
|
350
|
+
yaml_end = content.find("---", 3)
|
|
351
|
+
if yaml_end > 0:
|
|
352
|
+
yaml_content = content[3:yaml_end]
|
|
353
|
+
# Check for status: completed (with or without quotes)
|
|
354
|
+
if "status: completed" in yaml_content or 'status: "completed"' in yaml_content:
|
|
355
|
+
completed += 1
|
|
356
|
+
except (OSError, UnicodeDecodeError):
|
|
357
|
+
# File read failure or encoding error - considered incomplete
|
|
358
|
+
pass
|
|
359
|
+
|
|
360
|
+
percentage = (completed / total * 100) if total > 0 else 0
|
|
361
|
+
return {
|
|
362
|
+
"completed": completed,
|
|
363
|
+
"total": total,
|
|
364
|
+
"percentage": round(percentage, 0),
|
|
365
|
+
}
|
|
366
|
+
except (OSError, PermissionError):
|
|
367
|
+
# Directory access or permission errors
|
|
368
|
+
return {"completed": 0, "total": 0, "percentage": 0}
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def should_show_setup_messages() -> bool:
|
|
372
|
+
"""Determine whether to show setup completion messages (cached version).
|
|
373
|
+
|
|
374
|
+
Logic:
|
|
375
|
+
1. Read .moai/config/config.yaml (using cache)
|
|
376
|
+
2. Check session.suppress_setup_messages flag
|
|
377
|
+
3. If suppress_setup_messages is False, always show messages
|
|
378
|
+
4. If suppress_setup_messages is True:
|
|
379
|
+
- Check if more than 7 days have passed since suppression
|
|
380
|
+
- Show messages if time threshold exceeded
|
|
381
|
+
|
|
382
|
+
Uses ConfigCache to avoid repeated config file reads.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
bool: True if messages should be shown, False otherwise
|
|
386
|
+
"""
|
|
387
|
+
config = get_cached_config()
|
|
388
|
+
|
|
389
|
+
# If config doesn't exist, show messages
|
|
390
|
+
if not config:
|
|
391
|
+
return True
|
|
392
|
+
|
|
393
|
+
# Check project initialization status
|
|
394
|
+
if not config.get("project", {}).get("initialized", False):
|
|
395
|
+
return True
|
|
396
|
+
|
|
397
|
+
# Check suppress_setup_messages flag
|
|
398
|
+
session_config = config.get("session", {})
|
|
399
|
+
suppress = session_config.get("suppress_setup_messages", False)
|
|
400
|
+
|
|
401
|
+
if not suppress:
|
|
402
|
+
# Flag is False, show messages
|
|
403
|
+
return True
|
|
404
|
+
|
|
405
|
+
# Flag is True, check time threshold
|
|
406
|
+
suppressed_at_str = session_config.get("setup_messages_suppressed_at")
|
|
407
|
+
if not suppressed_at_str:
|
|
408
|
+
# No timestamp recorded, show messages
|
|
409
|
+
return True
|
|
410
|
+
|
|
411
|
+
try:
|
|
412
|
+
suppressed_at = datetime.fromisoformat(suppressed_at_str)
|
|
413
|
+
now = datetime.now(suppressed_at.tzinfo) if suppressed_at.tzinfo else datetime.now()
|
|
414
|
+
days_passed = (now - suppressed_at).days
|
|
415
|
+
|
|
416
|
+
# Show messages if threshold exceeded
|
|
417
|
+
return days_passed >= SETUP_MESSAGE_RESCAN_DAYS
|
|
418
|
+
except (ValueError, TypeError):
|
|
419
|
+
# If timestamp is invalid, show messages
|
|
420
|
+
return True
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def check_git_initialized() -> bool:
|
|
424
|
+
"""Check if git repository is initialized
|
|
425
|
+
|
|
426
|
+
Returns:
|
|
427
|
+
bool: True if .git directory exists, False otherwise
|
|
428
|
+
"""
|
|
429
|
+
try:
|
|
430
|
+
project_root = find_project_root()
|
|
431
|
+
git_dir = project_root / ".git"
|
|
432
|
+
return git_dir.exists() and git_dir.is_dir()
|
|
433
|
+
except Exception:
|
|
434
|
+
return False
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def get_git_info() -> dict[str, Any]:
|
|
438
|
+
"""Get comprehensive git information using optimized Git operations manager
|
|
439
|
+
|
|
440
|
+
FIXED: Handles git not initialized state properly
|
|
441
|
+
- Branch: Shows helpful message if git not initialized
|
|
442
|
+
- Last Commit: Shows helpful message if git not initialized or no commits
|
|
443
|
+
|
|
444
|
+
Uses connection pooling, caching, and parallel execution for optimal performance.
|
|
445
|
+
Falls back to basic implementation if Git manager unavailable.
|
|
446
|
+
"""
|
|
447
|
+
# FIX #1 and #4: Check if git is initialized first
|
|
448
|
+
if not check_git_initialized():
|
|
449
|
+
return {
|
|
450
|
+
"branch": "Git not initialized → Run 'moai-adk init' to set up Git repository",
|
|
451
|
+
"last_commit": "Git not initialized → Run 'moai-adk init' to set up Git repository",
|
|
452
|
+
"commit_time": "",
|
|
453
|
+
"changes": 0,
|
|
454
|
+
"git_initialized": False,
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
git_manager = get_git_manager()
|
|
458
|
+
if git_manager:
|
|
459
|
+
try:
|
|
460
|
+
# Use optimized Git manager
|
|
461
|
+
project_info = git_manager.get_project_info(use_cache=True)
|
|
462
|
+
branch = project_info.get("branch", "unknown")
|
|
463
|
+
last_commit = project_info.get("last_commit", "unknown")
|
|
464
|
+
|
|
465
|
+
# FIX #1: Handle empty branch (no commits yet)
|
|
466
|
+
if not branch or branch == "unknown":
|
|
467
|
+
branch = "No commits yet → Make your first commit"
|
|
468
|
+
|
|
469
|
+
# FIX #4: Handle no commits case
|
|
470
|
+
if not last_commit or last_commit == "unknown":
|
|
471
|
+
last_commit = "No commits yet"
|
|
472
|
+
|
|
473
|
+
return {
|
|
474
|
+
"branch": branch,
|
|
475
|
+
"last_commit": last_commit,
|
|
476
|
+
"commit_time": project_info.get("commit_time", "unknown"),
|
|
477
|
+
"changes": project_info.get("changes", 0),
|
|
478
|
+
"fetch_time": project_info.get("fetch_time", ""),
|
|
479
|
+
"git_initialized": True,
|
|
480
|
+
}
|
|
481
|
+
except Exception as e:
|
|
482
|
+
logging.warning(f"Git manager failed, falling back: {e}")
|
|
483
|
+
|
|
484
|
+
# Fallback to basic Git operations
|
|
485
|
+
try:
|
|
486
|
+
import concurrent.futures
|
|
487
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
488
|
+
|
|
489
|
+
# Define git commands to run in parallel
|
|
490
|
+
git_commands = [
|
|
491
|
+
(["git", "branch", "--show-current"], "branch"),
|
|
492
|
+
(["git", "rev-parse", "--abbrev-ref", "HEAD"], "head_ref"),
|
|
493
|
+
(["git", "rev-parse", "--short", "HEAD"], "head_commit"),
|
|
494
|
+
(["git", "log", "--pretty=format:%h %s", "-1"], "last_commit"),
|
|
495
|
+
(["git", "log", "--pretty=format:%ar", "-1"], "commit_time"),
|
|
496
|
+
(["git", "status", "--porcelain"], "changes_raw"),
|
|
497
|
+
]
|
|
498
|
+
|
|
499
|
+
# Execute git commands in parallel
|
|
500
|
+
results = {}
|
|
501
|
+
with ThreadPoolExecutor(max_workers=4) as executor:
|
|
502
|
+
# Submit all tasks
|
|
503
|
+
futures = {executor.submit(_run_git_command_fallback, cmd): key for cmd, key in git_commands}
|
|
504
|
+
|
|
505
|
+
# Collect results as they complete with overall timeout
|
|
506
|
+
# FIX #254: Add timeout to prevent infinite waiting on stuck git operations
|
|
507
|
+
try:
|
|
508
|
+
for future in as_completed(futures, timeout=8):
|
|
509
|
+
key = futures[future]
|
|
510
|
+
try:
|
|
511
|
+
results[key] = future.result()
|
|
512
|
+
except (TimeoutError, RuntimeError):
|
|
513
|
+
# Future execution timeout or runtime errors
|
|
514
|
+
results[key] = ""
|
|
515
|
+
except concurrent.futures.TimeoutError:
|
|
516
|
+
# Overall timeout exceeded - use whatever results we have
|
|
517
|
+
logging.warning("Git operations timeout after 8 seconds - using partial results")
|
|
518
|
+
# Collect any completed futures before timeout
|
|
519
|
+
for future, key in futures.items():
|
|
520
|
+
if future.done():
|
|
521
|
+
try:
|
|
522
|
+
if key not in results:
|
|
523
|
+
results[key] = future.result()
|
|
524
|
+
except (TimeoutError, RuntimeError):
|
|
525
|
+
results[key] = ""
|
|
526
|
+
|
|
527
|
+
# Process results with proper handling for empty values
|
|
528
|
+
branch = results.get("branch", "")
|
|
529
|
+
head_ref = results.get("head_ref", "")
|
|
530
|
+
head_commit = results.get("head_commit", "")
|
|
531
|
+
last_commit = results.get("last_commit", "")
|
|
532
|
+
|
|
533
|
+
# FIX: Detect detached HEAD state
|
|
534
|
+
if not branch and head_ref == "HEAD":
|
|
535
|
+
# Detached HEAD state - show commit hash
|
|
536
|
+
branch = f"HEAD detached at {head_commit}"
|
|
537
|
+
elif not branch:
|
|
538
|
+
# No commits yet
|
|
539
|
+
branch = "No commits yet → Make your first commit"
|
|
540
|
+
|
|
541
|
+
# FIX #4: Handle no commits case
|
|
542
|
+
if not last_commit:
|
|
543
|
+
last_commit = "No commits yet"
|
|
544
|
+
|
|
545
|
+
return {
|
|
546
|
+
"branch": branch,
|
|
547
|
+
"last_commit": last_commit,
|
|
548
|
+
"commit_time": results.get("commit_time", ""),
|
|
549
|
+
"changes": (len(results.get("changes_raw", "").splitlines()) if results.get("changes_raw") else 0),
|
|
550
|
+
"git_initialized": True,
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
except (RuntimeError, OSError, TimeoutError):
|
|
554
|
+
# ThreadPoolExecutor, git command, or timeout errors
|
|
555
|
+
return {
|
|
556
|
+
"branch": "Error reading git info",
|
|
557
|
+
"last_commit": "Error reading git info",
|
|
558
|
+
"commit_time": "",
|
|
559
|
+
"changes": 0,
|
|
560
|
+
"git_initialized": True,
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
def _run_git_command_fallback(cmd: list[str]) -> str:
|
|
565
|
+
"""Fallback git command execution"""
|
|
566
|
+
try:
|
|
567
|
+
import subprocess
|
|
568
|
+
|
|
569
|
+
result = subprocess.run(cmd, capture_output=True, text=True, timeout=3)
|
|
570
|
+
return result.stdout.strip() if result.returncode == 0 else ""
|
|
571
|
+
except (
|
|
572
|
+
subprocess.TimeoutExpired,
|
|
573
|
+
subprocess.SubprocessError,
|
|
574
|
+
FileNotFoundError,
|
|
575
|
+
OSError,
|
|
576
|
+
):
|
|
577
|
+
# Git command timeout, subprocess error, or git not found
|
|
578
|
+
return ""
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
def get_git_strategy_info(config: dict) -> dict:
|
|
582
|
+
"""Get git strategy information from config
|
|
583
|
+
|
|
584
|
+
FIX #2: NEW FEATURE - Display git strategy information
|
|
585
|
+
|
|
586
|
+
Args:
|
|
587
|
+
config: Configuration dictionary
|
|
588
|
+
|
|
589
|
+
Returns:
|
|
590
|
+
Dictionary with git_flow and auto_branch information
|
|
591
|
+
"""
|
|
592
|
+
if not config:
|
|
593
|
+
return {"git_flow": "unknown", "auto_branch": "unknown"}
|
|
594
|
+
|
|
595
|
+
git_strategy = config.get("git_strategy", {})
|
|
596
|
+
mode = git_strategy.get("mode", "manual")
|
|
597
|
+
|
|
598
|
+
# Get auto_branch setting from branch_creation config
|
|
599
|
+
branch_creation = git_strategy.get("branch_creation", {})
|
|
600
|
+
auto_enabled = branch_creation.get("auto_enabled", False)
|
|
601
|
+
|
|
602
|
+
# Determine auto_branch display
|
|
603
|
+
auto_branch_display = "Yes" if auto_enabled else "No"
|
|
604
|
+
|
|
605
|
+
return {"git_flow": mode, "auto_branch": auto_branch_display}
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
def _parse_version(version_str: str) -> tuple[int, ...]:
|
|
609
|
+
"""Parse version string to comparable tuple
|
|
610
|
+
|
|
611
|
+
Args:
|
|
612
|
+
version_str: Version string (e.g., "0.25.4")
|
|
613
|
+
|
|
614
|
+
Returns:
|
|
615
|
+
Tuple of integers for comparison (e.g., (0, 25, 4))
|
|
616
|
+
"""
|
|
617
|
+
try:
|
|
618
|
+
import re
|
|
619
|
+
|
|
620
|
+
clean = version_str.lstrip("v")
|
|
621
|
+
parts = [int(x) for x in re.split(r"[^\d]+", clean) if x.isdigit()]
|
|
622
|
+
return tuple(parts) if parts else (0,)
|
|
623
|
+
except (ValueError, AttributeError, TypeError):
|
|
624
|
+
# Version parsing errors (invalid format, None input, type mismatch)
|
|
625
|
+
return (0,)
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
def _is_newer_version(newer: str, older: str) -> bool:
|
|
629
|
+
"""Compare two versions (semantic versioning)
|
|
630
|
+
|
|
631
|
+
Args:
|
|
632
|
+
newer: Version that might be newer
|
|
633
|
+
older: Version that might be older
|
|
634
|
+
|
|
635
|
+
Returns:
|
|
636
|
+
True if newer > older
|
|
637
|
+
"""
|
|
638
|
+
newer_parts = _parse_version(newer)
|
|
639
|
+
older_parts = _parse_version(older)
|
|
640
|
+
return newer_parts > older_parts
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
def check_version_update() -> tuple[str, bool]:
|
|
644
|
+
"""Check if version update is available (fast version using cached data)
|
|
645
|
+
|
|
646
|
+
Reuses PyPI cache from Phase 1 (config_health_check.py).
|
|
647
|
+
Falls back to importlib.metadata for installed version.
|
|
648
|
+
|
|
649
|
+
Returns:
|
|
650
|
+
(status_indicator, has_update)
|
|
651
|
+
- status_indicator: "(latest)", "(dev)" or "⬆️ X.X.X available"
|
|
652
|
+
- has_update: True if update available
|
|
653
|
+
"""
|
|
654
|
+
try:
|
|
655
|
+
import importlib.metadata
|
|
656
|
+
|
|
657
|
+
# Get installed version (fast, ~6ms)
|
|
658
|
+
try:
|
|
659
|
+
installed_version = importlib.metadata.version("moai-adk")
|
|
660
|
+
except importlib.metadata.PackageNotFoundError:
|
|
661
|
+
return "(latest)", False
|
|
662
|
+
|
|
663
|
+
# Try to load cached PyPI version from Phase 1
|
|
664
|
+
version_cache_file = find_project_root() / ".moai" / "cache" / "version-check.json"
|
|
665
|
+
latest_version = None
|
|
666
|
+
|
|
667
|
+
if version_cache_file.exists():
|
|
668
|
+
try:
|
|
669
|
+
cache_data = json.loads(version_cache_file.read_text())
|
|
670
|
+
latest_version = cache_data.get("latest")
|
|
671
|
+
except (json.JSONDecodeError, OSError, UnicodeDecodeError):
|
|
672
|
+
# Cache file read or JSON parsing errors
|
|
673
|
+
pass
|
|
674
|
+
|
|
675
|
+
# If no cache or cache is stale, skip check (avoid slow subprocess)
|
|
676
|
+
if not latest_version:
|
|
677
|
+
return "(latest)", False
|
|
678
|
+
|
|
679
|
+
# Compare versions with semantic versioning
|
|
680
|
+
if _is_newer_version(latest_version, installed_version):
|
|
681
|
+
# PyPI has newer version (use update icon instead of warning)
|
|
682
|
+
return f"⬆️ {latest_version} available", True
|
|
683
|
+
elif _is_newer_version(installed_version, latest_version):
|
|
684
|
+
# Local version is newer (development version)
|
|
685
|
+
return "(dev)", False
|
|
686
|
+
else:
|
|
687
|
+
# Same version
|
|
688
|
+
return "(latest)", False
|
|
689
|
+
|
|
690
|
+
except (ImportError, AttributeError, TypeError):
|
|
691
|
+
# Import errors or unexpected type/attribute errors
|
|
692
|
+
return "(latest)", False
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
def get_test_info() -> dict[str, Any]:
|
|
696
|
+
"""Get test coverage and status information
|
|
697
|
+
|
|
698
|
+
NOTE: SessionStart hook must complete quickly (<0.5s).
|
|
699
|
+
Running pytest is too slow (5+ seconds), so we skip it and return unknown status.
|
|
700
|
+
Users can run tests manually with: pytest --cov
|
|
701
|
+
|
|
702
|
+
To check test status, use: /moai:test-status (future feature)
|
|
703
|
+
"""
|
|
704
|
+
# Skip pytest execution - it's too slow for SessionStart
|
|
705
|
+
return {"coverage": "unknown", "status": "❓"}
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
def get_spec_progress() -> dict[str, Any]:
|
|
709
|
+
"""Get SPEC progress information (cached version)
|
|
710
|
+
|
|
711
|
+
Uses ConfigCache to avoid repeated filesystem scans.
|
|
712
|
+
Cache is valid for 5 minutes or until .moai/specs/ is modified.
|
|
713
|
+
|
|
714
|
+
Returns:
|
|
715
|
+
Dict with keys: completed, total, percentage
|
|
716
|
+
"""
|
|
717
|
+
return get_cached_spec_progress()
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
def calculate_risk(git_info: dict, spec_progress: dict, test_info: dict) -> str:
|
|
721
|
+
"""Calculate overall project risk level using defined thresholds."""
|
|
722
|
+
risk_score = 0
|
|
723
|
+
|
|
724
|
+
# Git changes contribute to risk
|
|
725
|
+
if git_info["changes"] > GIT_CHANGES_HIGH_THRESHOLD:
|
|
726
|
+
risk_score += RISK_GIT_CHANGES_HIGH
|
|
727
|
+
elif git_info["changes"] > GIT_CHANGES_MEDIUM_THRESHOLD:
|
|
728
|
+
risk_score += RISK_GIT_CHANGES_MEDIUM
|
|
729
|
+
|
|
730
|
+
# SPEC progress contributes to risk
|
|
731
|
+
if spec_progress["percentage"] < SPEC_PROGRESS_LOW:
|
|
732
|
+
risk_score += RISK_SPEC_LOW
|
|
733
|
+
elif spec_progress["percentage"] < SPEC_PROGRESS_MEDIUM:
|
|
734
|
+
risk_score += RISK_SPEC_MEDIUM
|
|
735
|
+
|
|
736
|
+
# Test status contributes to risk
|
|
737
|
+
if test_info["status"] != "✅":
|
|
738
|
+
risk_score += RISK_TEST_FAILED
|
|
739
|
+
elif test_info["coverage"] == "unknown":
|
|
740
|
+
risk_score += RISK_COVERAGE_UNKNOWN
|
|
741
|
+
|
|
742
|
+
# Determine risk level
|
|
743
|
+
if risk_score >= RISK_SCORE_HIGH:
|
|
744
|
+
return "HIGH"
|
|
745
|
+
elif risk_score >= RISK_SCORE_MEDIUM:
|
|
746
|
+
return "MEDIUM"
|
|
747
|
+
else:
|
|
748
|
+
return "LOW"
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
def format_project_metadata() -> str:
|
|
752
|
+
"""Format project metadata information as a string.
|
|
753
|
+
|
|
754
|
+
Returns:
|
|
755
|
+
Formatted project metadata string with version and Git info
|
|
756
|
+
"""
|
|
757
|
+
moai_version = "unknown"
|
|
758
|
+
config = get_cached_config()
|
|
759
|
+
if config:
|
|
760
|
+
moai_version = config.get("moai", {}).get("version", "unknown")
|
|
761
|
+
|
|
762
|
+
version_status, _has_update = check_version_update()
|
|
763
|
+
return f"📦 Version: {moai_version} {version_status}"
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
def get_language_info(config: dict) -> dict:
|
|
767
|
+
"""Get language configuration information
|
|
768
|
+
|
|
769
|
+
Args:
|
|
770
|
+
config: Configuration dictionary
|
|
771
|
+
|
|
772
|
+
Returns:
|
|
773
|
+
Dictionary with language info including display name and status
|
|
774
|
+
"""
|
|
775
|
+
if not config:
|
|
776
|
+
return {
|
|
777
|
+
"conversation_language": "en",
|
|
778
|
+
"language_name": "English",
|
|
779
|
+
"status": "⚠️ No config",
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
lang_config = config.get("language", {})
|
|
783
|
+
conversation_lang = lang_config.get("conversation_language", "en")
|
|
784
|
+
lang_name = lang_config.get("conversation_language_name", "Unknown")
|
|
785
|
+
|
|
786
|
+
# Language status indicator (removed Active indicator for cleaner output)
|
|
787
|
+
return {"conversation_language": conversation_lang, "language_name": lang_name}
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
def load_user_personalization() -> dict:
|
|
791
|
+
"""Load user personalization settings using centralized language configuration resolver
|
|
792
|
+
|
|
793
|
+
FIX #5: Check for template variables and provide setup guidance
|
|
794
|
+
|
|
795
|
+
Uses the new LanguageConfigResolver which provides:
|
|
796
|
+
- Environment variable priority handling
|
|
797
|
+
- Configuration file integration
|
|
798
|
+
- Consistency validation and auto-correction
|
|
799
|
+
- Template variable export capabilities
|
|
800
|
+
|
|
801
|
+
Returns:
|
|
802
|
+
Dictionary with user personalization information
|
|
803
|
+
"""
|
|
804
|
+
try:
|
|
805
|
+
# Import the centralized language configuration resolver
|
|
806
|
+
from src.moai_adk.core.language_config_resolver import get_resolver
|
|
807
|
+
|
|
808
|
+
# Get resolver instance and resolve configuration
|
|
809
|
+
resolver = get_resolver(str(find_project_root()))
|
|
810
|
+
config = resolver.resolve_config()
|
|
811
|
+
|
|
812
|
+
# FIX #5: Check if USER_NAME is a template variable or empty
|
|
813
|
+
user_name = config.get("user_name", "")
|
|
814
|
+
has_valid_name = user_name and not user_name.startswith("{{") and not user_name.endswith("}}")
|
|
815
|
+
|
|
816
|
+
# Build personalization info using resolved configuration
|
|
817
|
+
personalization = {
|
|
818
|
+
"user_name": user_name if has_valid_name else "",
|
|
819
|
+
"conversation_language": config.get("conversation_language", "en"),
|
|
820
|
+
"conversation_language_name": config.get("conversation_language_name", "English"),
|
|
821
|
+
"agent_prompt_language": config.get("agent_prompt_language", "en"),
|
|
822
|
+
"is_korean": config.get("conversation_language") == "ko",
|
|
823
|
+
"has_personalization": has_valid_name,
|
|
824
|
+
"config_source": config.get("config_source", "default"),
|
|
825
|
+
"personalized_greeting": (resolver.get_personalized_greeting(config) if has_valid_name else ""),
|
|
826
|
+
"needs_setup": not has_valid_name, # FIX #5: Flag for setup guidance
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
# Export template variables for other system components
|
|
830
|
+
template_vars = resolver.export_template_variables(config)
|
|
831
|
+
|
|
832
|
+
# Store resolved configuration for session-wide access
|
|
833
|
+
personalization_cache_file = find_project_root() / ".moai" / "cache" / "personalization.json"
|
|
834
|
+
try:
|
|
835
|
+
personalization_cache_file.parent.mkdir(parents=True, exist_ok=True)
|
|
836
|
+
|
|
837
|
+
# Store both personalization info and template variables
|
|
838
|
+
cache_data = {
|
|
839
|
+
"personalization": personalization,
|
|
840
|
+
"template_variables": template_vars,
|
|
841
|
+
"resolved_at": datetime.now().isoformat(),
|
|
842
|
+
"config_source": config.get("config_source", "default"),
|
|
843
|
+
}
|
|
844
|
+
personalization_cache_file.write_text(json.dumps(cache_data, ensure_ascii=False, indent=2))
|
|
845
|
+
|
|
846
|
+
except (OSError, PermissionError):
|
|
847
|
+
# Cache write errors are non-critical
|
|
848
|
+
pass
|
|
849
|
+
|
|
850
|
+
return personalization
|
|
851
|
+
|
|
852
|
+
except ImportError:
|
|
853
|
+
# Fallback to basic implementation if resolver not available
|
|
854
|
+
import os
|
|
855
|
+
|
|
856
|
+
# Load config from cache or direct file
|
|
857
|
+
config = get_cached_config()
|
|
858
|
+
|
|
859
|
+
# Environment variables take priority
|
|
860
|
+
user_name = os.getenv("MOAI_USER_NAME")
|
|
861
|
+
conversation_lang = os.getenv("MOAI_CONVERSATION_LANG")
|
|
862
|
+
|
|
863
|
+
# Fallback to config file if environment variables not set
|
|
864
|
+
if user_name is None and config:
|
|
865
|
+
user_name = config.get("user", {}).get("name", "")
|
|
866
|
+
|
|
867
|
+
if conversation_lang is None and config:
|
|
868
|
+
conversation_lang = config.get("language", {}).get("conversation_language", "en")
|
|
869
|
+
|
|
870
|
+
# FIX #5: Check if USER_NAME is a template variable or empty
|
|
871
|
+
has_valid_name = user_name and not user_name.startswith("{{") and not user_name.endswith("}}")
|
|
872
|
+
|
|
873
|
+
# Get language name
|
|
874
|
+
lang_name_map = {
|
|
875
|
+
"ko": "Korean",
|
|
876
|
+
"en": "English",
|
|
877
|
+
"ja": "Japanese",
|
|
878
|
+
"zh": "Chinese",
|
|
879
|
+
"es": "Spanish",
|
|
880
|
+
"fr": "French",
|
|
881
|
+
"de": "German",
|
|
882
|
+
"ru": "Russian",
|
|
883
|
+
}
|
|
884
|
+
lang_name = lang_name_map.get(conversation_lang, "Unknown")
|
|
885
|
+
|
|
886
|
+
# Build personalization info
|
|
887
|
+
personalization = {
|
|
888
|
+
"user_name": user_name if has_valid_name else "",
|
|
889
|
+
"conversation_language": conversation_lang or "en",
|
|
890
|
+
"conversation_language_name": lang_name,
|
|
891
|
+
"is_korean": conversation_lang == "ko",
|
|
892
|
+
"has_personalization": has_valid_name,
|
|
893
|
+
"config_source": "fallback",
|
|
894
|
+
"personalized_greeting": (
|
|
895
|
+
f"{user_name}님"
|
|
896
|
+
if has_valid_name and conversation_lang == "ko"
|
|
897
|
+
else user_name
|
|
898
|
+
if has_valid_name
|
|
899
|
+
else ""
|
|
900
|
+
),
|
|
901
|
+
"needs_setup": not has_valid_name, # FIX #5: Flag for setup guidance
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
# Store for session-wide access
|
|
905
|
+
personalization_cache_file = find_project_root() / ".moai" / "cache" / "personalization.json"
|
|
906
|
+
try:
|
|
907
|
+
personalization_cache_file.parent.mkdir(parents=True, exist_ok=True)
|
|
908
|
+
personalization_cache_file.write_text(json.dumps(personalization, ensure_ascii=False, indent=2))
|
|
909
|
+
except (OSError, PermissionError):
|
|
910
|
+
# Cache write errors are non-critical
|
|
911
|
+
pass
|
|
912
|
+
|
|
913
|
+
return personalization
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
def format_session_output() -> str:
|
|
917
|
+
"""Format the complete session start output with proper line alignment (optimized).
|
|
918
|
+
|
|
919
|
+
Uses caches for config and SPEC progress to minimize file I/O.
|
|
920
|
+
Parallel git command execution for fast data gathering.
|
|
921
|
+
"""
|
|
922
|
+
# Gather information (in parallel for git, cached for config/SPEC)
|
|
923
|
+
git_info = get_git_info()
|
|
924
|
+
|
|
925
|
+
# Get config for language and version info
|
|
926
|
+
config = get_cached_config()
|
|
927
|
+
|
|
928
|
+
# Load user personalization settings
|
|
929
|
+
personalization = load_user_personalization()
|
|
930
|
+
|
|
931
|
+
# Get MoAI version from installed package (not config.json)
|
|
932
|
+
try:
|
|
933
|
+
from moai_adk import __version__ as installed_version
|
|
934
|
+
|
|
935
|
+
moai_version = installed_version
|
|
936
|
+
except ImportError:
|
|
937
|
+
# Fallback to config version if package import fails
|
|
938
|
+
moai_version = "unknown"
|
|
939
|
+
if config:
|
|
940
|
+
moai_version = config.get("moai", {}).get("version", "unknown")
|
|
941
|
+
|
|
942
|
+
# Get language info
|
|
943
|
+
lang_info = get_language_info(config)
|
|
944
|
+
|
|
945
|
+
# FIX #2: Get git strategy info
|
|
946
|
+
git_strategy = get_git_strategy_info(config)
|
|
947
|
+
|
|
948
|
+
# Check for version updates (uses Phase 1 cache)
|
|
949
|
+
version_status, _has_update = check_version_update()
|
|
950
|
+
|
|
951
|
+
# Format output with each item on separate line (reordered per user request)
|
|
952
|
+
output = [
|
|
953
|
+
"🚀 MoAI-ADK Session Started",
|
|
954
|
+
f" 📦 Version: {moai_version} {version_status}",
|
|
955
|
+
f" 🔄 Changes: {git_info['changes']}",
|
|
956
|
+
f" 🌿 Branch: {git_info['branch']}",
|
|
957
|
+
# FIX #2: Add Git Strategy information
|
|
958
|
+
f" 🔧 Github-Flow: {git_strategy['git_flow']} | Auto Branch: {git_strategy['auto_branch']}",
|
|
959
|
+
f" 🔨 Last Commit: {git_info['last_commit']}",
|
|
960
|
+
f" 🌐 Language: {lang_info['language_name']} ({lang_info['conversation_language']})",
|
|
961
|
+
]
|
|
962
|
+
|
|
963
|
+
# FIX #5: Add personalization or setup guidance (never show template variables)
|
|
964
|
+
# Multilingual support: ko, en, ja, zh
|
|
965
|
+
conv_lang = personalization.get("conversation_language", "en")
|
|
966
|
+
|
|
967
|
+
if personalization.get("needs_setup", False):
|
|
968
|
+
# Show setup guidance (based on conversation_language)
|
|
969
|
+
# Guide user to generate project documentation with /moai:0-project
|
|
970
|
+
setup_messages = {
|
|
971
|
+
"ko": " 👋 환영합니다! '/moai:0-project' 명령어로 프로젝트 문서를 생성해주세요",
|
|
972
|
+
"ja": " 👋 ようこそ!'/moai:0-project' コマンドでプロジェクトドキュメントを生成してください",
|
|
973
|
+
"zh": " 👋 欢迎!请运行 '/moai:0-project' 命令生成项目文档",
|
|
974
|
+
"en": " 👋 Welcome! Please run '/moai:0-project' to generate project documentation",
|
|
975
|
+
}
|
|
976
|
+
output.append(setup_messages.get(conv_lang, setup_messages["en"]))
|
|
977
|
+
elif personalization["has_personalization"]:
|
|
978
|
+
user_greeting = personalization.get("personalized_greeting", "")
|
|
979
|
+
user_name = personalization.get("user_name", "")
|
|
980
|
+
display_name = user_greeting if user_greeting else user_name
|
|
981
|
+
|
|
982
|
+
# Prevent duplicate honorifics (e.g., "님님" in Korean, "さんさん" in Japanese)
|
|
983
|
+
ko_suffix = "" if display_name.endswith("님") else "님"
|
|
984
|
+
ja_suffix = "" if display_name.endswith("さん") else "さん"
|
|
985
|
+
|
|
986
|
+
welcome_back_messages = {
|
|
987
|
+
"ko": f" 👋 다시 오신 것을 환영합니다, {display_name}{ko_suffix}!",
|
|
988
|
+
"ja": f" 👋 おかえりなさい、{display_name}{ja_suffix}!",
|
|
989
|
+
"zh": f" 👋 欢迎回来,{display_name}!",
|
|
990
|
+
"en": f" 👋 Welcome back, {display_name}!",
|
|
991
|
+
}
|
|
992
|
+
output.append(welcome_back_messages.get(conv_lang, welcome_back_messages["en"]))
|
|
993
|
+
|
|
994
|
+
# Configuration source is now handled silently for cleaner output
|
|
995
|
+
# Users can check configuration using dedicated tools if needed
|
|
996
|
+
|
|
997
|
+
return "\n".join(output)
|
|
998
|
+
|
|
999
|
+
|
|
1000
|
+
def main() -> None:
|
|
1001
|
+
"""Main entry point for enhanced SessionStart hook
|
|
1002
|
+
|
|
1003
|
+
Displays enhanced project information including:
|
|
1004
|
+
- Programming language and version
|
|
1005
|
+
- Git branch, changes, and last commit with time
|
|
1006
|
+
- Git strategy (mode and auto_branch setting)
|
|
1007
|
+
- SPEC progress (completed/total)
|
|
1008
|
+
- Test coverage and status
|
|
1009
|
+
- Risk assessment
|
|
1010
|
+
|
|
1011
|
+
Features:
|
|
1012
|
+
- Optimized timeout handling with unified manager
|
|
1013
|
+
- Enhanced error handling with graceful degradation
|
|
1014
|
+
- Resource monitoring and cleanup
|
|
1015
|
+
- Retry mechanisms for transient failures
|
|
1016
|
+
|
|
1017
|
+
Exit Codes:
|
|
1018
|
+
0: Success
|
|
1019
|
+
1: Error (timeout, JSON parse failure, handler exception)
|
|
1020
|
+
"""
|
|
1021
|
+
# Configure timeout for session start hook
|
|
1022
|
+
timeout_config = HookTimeoutConfig(
|
|
1023
|
+
policy=TimeoutPolicy.NORMAL,
|
|
1024
|
+
custom_timeout_ms=5000, # 5 seconds
|
|
1025
|
+
retry_count=1,
|
|
1026
|
+
retry_delay_ms=200,
|
|
1027
|
+
graceful_degradation=True,
|
|
1028
|
+
memory_limit_mb=100, # Optional memory limit
|
|
1029
|
+
)
|
|
1030
|
+
|
|
1031
|
+
def execute_session_start():
|
|
1032
|
+
"""Execute session start logic with proper error handling"""
|
|
1033
|
+
# Read JSON payload from stdin (for compatibility)
|
|
1034
|
+
# Handle Docker/non-interactive environments by checking TTY
|
|
1035
|
+
# Note: SessionStart hook receives session info but we don't need it currently
|
|
1036
|
+
input_data = sys.stdin.read() if not sys.stdin.isatty() else "{}"
|
|
1037
|
+
_ = json.loads(input_data) if input_data.strip() else {} # Explicitly ignore
|
|
1038
|
+
|
|
1039
|
+
# Check if setup messages should be shown
|
|
1040
|
+
show_messages = should_show_setup_messages()
|
|
1041
|
+
|
|
1042
|
+
# Generate enhanced session output (conditionally)
|
|
1043
|
+
session_output = format_session_output() if show_messages else ""
|
|
1044
|
+
|
|
1045
|
+
# Return as system message
|
|
1046
|
+
result: dict[str, Any] = {
|
|
1047
|
+
"continue": True,
|
|
1048
|
+
"systemMessage": session_output,
|
|
1049
|
+
"performance": {
|
|
1050
|
+
"git_manager_used": get_git_manager() is not None,
|
|
1051
|
+
"timeout_manager_used": get_timeout_manager() is not None,
|
|
1052
|
+
},
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
return result
|
|
1056
|
+
|
|
1057
|
+
# Use unified timeout manager if available
|
|
1058
|
+
timeout_manager = get_timeout_manager()
|
|
1059
|
+
if timeout_manager:
|
|
1060
|
+
try:
|
|
1061
|
+
result = timeout_manager.execute_with_timeout(
|
|
1062
|
+
"session_start__show_project_info",
|
|
1063
|
+
execute_session_start,
|
|
1064
|
+
config=timeout_config,
|
|
1065
|
+
)
|
|
1066
|
+
|
|
1067
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
1068
|
+
sys.exit(0)
|
|
1069
|
+
|
|
1070
|
+
except HookTimeoutError as e:
|
|
1071
|
+
# Enhanced timeout error handling
|
|
1072
|
+
timeout_response: dict[str, Any] = {
|
|
1073
|
+
"continue": True,
|
|
1074
|
+
"systemMessage": "⚠️ Session start timeout - continuing without project info",
|
|
1075
|
+
"error_details": {
|
|
1076
|
+
"hook_id": e.hook_id,
|
|
1077
|
+
"timeout_seconds": e.timeout_seconds,
|
|
1078
|
+
"execution_time": e.execution_time,
|
|
1079
|
+
"will_retry": e.will_retry,
|
|
1080
|
+
},
|
|
1081
|
+
}
|
|
1082
|
+
print(json.dumps(timeout_response, ensure_ascii=False))
|
|
1083
|
+
print(f"SessionStart hook timeout: {e}", file=sys.stderr)
|
|
1084
|
+
sys.exit(1)
|
|
1085
|
+
|
|
1086
|
+
except Exception as e:
|
|
1087
|
+
# Enhanced error handling with context
|
|
1088
|
+
error_response: dict[str, Any] = {
|
|
1089
|
+
"continue": True,
|
|
1090
|
+
"systemMessage": "⚠️ Session start encountered an error - continuing",
|
|
1091
|
+
"error_details": {
|
|
1092
|
+
"error_type": type(e).__name__,
|
|
1093
|
+
"message": str(e),
|
|
1094
|
+
"graceful_degradation": True,
|
|
1095
|
+
},
|
|
1096
|
+
}
|
|
1097
|
+
print(json.dumps(error_response, ensure_ascii=False))
|
|
1098
|
+
print(f"SessionStart error: {e}", file=sys.stderr)
|
|
1099
|
+
sys.exit(1)
|
|
1100
|
+
|
|
1101
|
+
else:
|
|
1102
|
+
# Fallback to legacy timeout handling
|
|
1103
|
+
try:
|
|
1104
|
+
from lib.timeout import CrossPlatformTimeout
|
|
1105
|
+
from lib.timeout import TimeoutError as PlatformTimeoutError
|
|
1106
|
+
|
|
1107
|
+
# Set 5-second timeout
|
|
1108
|
+
timeout = CrossPlatformTimeout(5)
|
|
1109
|
+
timeout.start()
|
|
1110
|
+
|
|
1111
|
+
try:
|
|
1112
|
+
result = execute_session_start()
|
|
1113
|
+
print(json.dumps(result))
|
|
1114
|
+
sys.exit(0)
|
|
1115
|
+
|
|
1116
|
+
except PlatformTimeoutError:
|
|
1117
|
+
# Timeout - return minimal valid response
|
|
1118
|
+
timeout_response_legacy: dict[str, Any] = {
|
|
1119
|
+
"continue": True,
|
|
1120
|
+
"systemMessage": "⚠️ Session start timeout - continuing without project info",
|
|
1121
|
+
}
|
|
1122
|
+
print(json.dumps(timeout_response_legacy))
|
|
1123
|
+
print("SessionStart hook timeout after 5 seconds", file=sys.stderr)
|
|
1124
|
+
sys.exit(1)
|
|
1125
|
+
|
|
1126
|
+
finally:
|
|
1127
|
+
# Always cancel timeout
|
|
1128
|
+
timeout.cancel()
|
|
1129
|
+
|
|
1130
|
+
except ImportError:
|
|
1131
|
+
# No timeout handling available
|
|
1132
|
+
try:
|
|
1133
|
+
result = execute_session_start()
|
|
1134
|
+
print(json.dumps(result))
|
|
1135
|
+
sys.exit(0)
|
|
1136
|
+
except Exception as e:
|
|
1137
|
+
print(
|
|
1138
|
+
json.dumps(
|
|
1139
|
+
{
|
|
1140
|
+
"continue": True,
|
|
1141
|
+
"systemMessage": "⚠️ Session start completed with errors",
|
|
1142
|
+
"error": str(e),
|
|
1143
|
+
}
|
|
1144
|
+
)
|
|
1145
|
+
)
|
|
1146
|
+
sys.exit(0)
|
|
1147
|
+
|
|
1148
|
+
except json.JSONDecodeError as e:
|
|
1149
|
+
# JSON parse error
|
|
1150
|
+
json_error_response: dict[str, Any] = {
|
|
1151
|
+
"continue": True,
|
|
1152
|
+
"hookSpecificOutput": {"error": f"JSON parse error: {e}"},
|
|
1153
|
+
}
|
|
1154
|
+
print(json.dumps(json_error_response))
|
|
1155
|
+
print(f"SessionStart JSON parse error: {e}", file=sys.stderr)
|
|
1156
|
+
sys.exit(1)
|
|
1157
|
+
|
|
1158
|
+
except Exception as e:
|
|
1159
|
+
# Unexpected error
|
|
1160
|
+
general_error_response: dict[str, Any] = {
|
|
1161
|
+
"continue": True,
|
|
1162
|
+
"hookSpecificOutput": {"error": f"SessionStart error: {e}"},
|
|
1163
|
+
}
|
|
1164
|
+
print(json.dumps(general_error_response))
|
|
1165
|
+
print(f"SessionStart unexpected error: {e}", file=sys.stderr)
|
|
1166
|
+
sys.exit(1)
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
if __name__ == "__main__":
|
|
1170
|
+
main()
|