moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -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 +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- 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 +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- 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 +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +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-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""Common utility functions for MoAI hooks
|
|
2
|
+
|
|
3
|
+
Consolidated fallback implementations used across multiple hooks.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
import statistics
|
|
8
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def format_duration(seconds: float) -> str:
|
|
12
|
+
"""Format duration in seconds to readable string.
|
|
13
|
+
|
|
14
|
+
Converts seconds to human-readable format (s, m, h).
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
seconds: Duration in seconds
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
Formatted duration string (e.g., "2.5m", "1.3h")
|
|
21
|
+
"""
|
|
22
|
+
if seconds < 60:
|
|
23
|
+
return f"{seconds:.1f}s"
|
|
24
|
+
minutes = seconds / 60
|
|
25
|
+
if minutes < 60:
|
|
26
|
+
return f"{minutes:.1f}m"
|
|
27
|
+
hours = minutes / 60
|
|
28
|
+
return f"{hours:.1f}h"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_summary_stats(values: List[float]) -> Dict[str, float]:
|
|
32
|
+
"""Get summary statistics for a list of values.
|
|
33
|
+
|
|
34
|
+
Calculates mean, min, max, and standard deviation.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
values: List of numeric values
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Dictionary with keys: mean, min, max, std
|
|
41
|
+
"""
|
|
42
|
+
if not values:
|
|
43
|
+
return {"mean": 0, "min": 0, "max": 0, "std": 0}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
"mean": statistics.mean(values),
|
|
47
|
+
"min": min(values),
|
|
48
|
+
"max": max(values),
|
|
49
|
+
"std": statistics.stdev(values) if len(values) > 1 else 0,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def is_root_whitelisted(filename: str, config: Dict[str, Any]) -> bool:
|
|
54
|
+
"""Check if file is allowed in project root.
|
|
55
|
+
|
|
56
|
+
Consolidated from pre_tool__document_management.py and session_end__auto_cleanup.py
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
filename: Name of the file
|
|
60
|
+
config: Configuration dictionary
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
True if file is whitelisted for root directory
|
|
64
|
+
"""
|
|
65
|
+
whitelist = config.get("document_management", {}).get("root_whitelist", [])
|
|
66
|
+
|
|
67
|
+
for pattern in whitelist:
|
|
68
|
+
# Convert glob pattern to regex
|
|
69
|
+
regex = pattern.replace("*", ".*").replace("?", ".")
|
|
70
|
+
if re.match(f"^{regex}$", filename):
|
|
71
|
+
return True
|
|
72
|
+
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_file_pattern_category(filename: str, config: Dict[str, Any]) -> Optional[Tuple[str, str]]:
|
|
77
|
+
"""Match filename against patterns to determine category.
|
|
78
|
+
|
|
79
|
+
Consolidated from pre_tool__document_management.py and session_end__auto_cleanup.py
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
filename: Name of the file to categorize
|
|
83
|
+
config: Configuration dictionary
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Tuple of (directory_type, category) or None if no match
|
|
87
|
+
"""
|
|
88
|
+
patterns = config.get("document_management", {}).get("file_patterns", {})
|
|
89
|
+
|
|
90
|
+
for dir_type, categories in patterns.items():
|
|
91
|
+
for category, pattern_list in categories.items():
|
|
92
|
+
for pattern in pattern_list:
|
|
93
|
+
# Convert glob pattern to regex
|
|
94
|
+
regex = pattern.replace("*", ".*").replace("?", ".")
|
|
95
|
+
if re.match(f"^{regex}$", filename):
|
|
96
|
+
return (dir_type, category)
|
|
97
|
+
|
|
98
|
+
return None
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def suggest_moai_location(filename: str, config: Dict[str, Any]) -> str:
|
|
102
|
+
"""Suggest appropriate .moai/ location based on file pattern.
|
|
103
|
+
|
|
104
|
+
Consolidated from pre_tool__document_management.py and session_end__auto_cleanup.py
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
filename: Name of the file
|
|
108
|
+
config: Configuration dictionary
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Suggested .moai/ path
|
|
112
|
+
"""
|
|
113
|
+
# Try pattern matching first
|
|
114
|
+
match = get_file_pattern_category(filename, config)
|
|
115
|
+
|
|
116
|
+
if match:
|
|
117
|
+
dir_type, category = match
|
|
118
|
+
base_dir = config.get("document_management", {}).get("directories", {}).get(dir_type, {}).get("base", "")
|
|
119
|
+
if base_dir:
|
|
120
|
+
return f"{base_dir}{category}/"
|
|
121
|
+
|
|
122
|
+
# Default fallback suggestions
|
|
123
|
+
if filename.endswith(".md"):
|
|
124
|
+
return ".moai/temp/work/"
|
|
125
|
+
elif filename.endswith((".sh", ".py", ".js")):
|
|
126
|
+
return ".moai/scripts/dev/"
|
|
127
|
+
elif filename.endswith((".tmp", ".temp", ".bak")):
|
|
128
|
+
return ".moai/temp/work/"
|
|
129
|
+
|
|
130
|
+
# Ultimate fallback
|
|
131
|
+
return ".moai/temp/work/"
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Configuration Manager for Alfred Hooks
|
|
3
|
+
|
|
4
|
+
Provides centralized configuration management with fallbacks and validation.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Dict, Optional
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
YAML_AVAILABLE = True
|
|
15
|
+
except ImportError:
|
|
16
|
+
YAML_AVAILABLE = False
|
|
17
|
+
|
|
18
|
+
from .path_utils import find_project_root
|
|
19
|
+
|
|
20
|
+
# Default configuration
|
|
21
|
+
DEFAULT_CONFIG = {
|
|
22
|
+
"hooks": {
|
|
23
|
+
"timeout_seconds": 5,
|
|
24
|
+
"timeout_ms": 5000,
|
|
25
|
+
"minimum_timeout_seconds": 1,
|
|
26
|
+
"graceful_degradation": True,
|
|
27
|
+
"exit_codes": {
|
|
28
|
+
"success": 0,
|
|
29
|
+
"error": 1,
|
|
30
|
+
"critical_error": 2,
|
|
31
|
+
"config_error": 3,
|
|
32
|
+
},
|
|
33
|
+
"messages": {
|
|
34
|
+
"timeout": {
|
|
35
|
+
"post_tool_use": "⚠️ PostToolUse timeout - continuing",
|
|
36
|
+
"session_end": "⚠️ SessionEnd cleanup timeout - session ending anyway",
|
|
37
|
+
"session_start": "⚠️ Session start timeout - continuing without project info",
|
|
38
|
+
},
|
|
39
|
+
"stderr": {
|
|
40
|
+
"timeout": {
|
|
41
|
+
"post_tool_use": "PostToolUse hook timeout after 5 seconds",
|
|
42
|
+
"session_end": "SessionEnd hook timeout after 5 seconds",
|
|
43
|
+
"session_start": "SessionStart hook timeout after 5 seconds",
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"config": {
|
|
47
|
+
"missing": "❌ Project configuration not found - run /moai:0-project",
|
|
48
|
+
"missing_fields": "⚠️ Missing configuration:",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
"cache": {
|
|
52
|
+
"directory": ".moai/cache",
|
|
53
|
+
"version_ttl_seconds": 1800,
|
|
54
|
+
"git_ttl_seconds": 10,
|
|
55
|
+
},
|
|
56
|
+
"git": {
|
|
57
|
+
"timeout_seconds": 2,
|
|
58
|
+
},
|
|
59
|
+
"project_search": {"max_depth": 10},
|
|
60
|
+
"network": {"test_host": "8.8.8.8", "test_port": 53, "timeout_seconds": 0.1},
|
|
61
|
+
"version_check": {
|
|
62
|
+
"pypi_url": "https://pypi.org/pypi/moai-adk/json",
|
|
63
|
+
"timeout_seconds": 1,
|
|
64
|
+
"cache_ttl_seconds": 86400,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
"language": {
|
|
68
|
+
"conversation_language": "en",
|
|
69
|
+
},
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class ConfigManager:
|
|
74
|
+
"""Configuration manager for Alfred hooks with validation and fallbacks."""
|
|
75
|
+
|
|
76
|
+
def __init__(self, config_path: Optional[Path] = None):
|
|
77
|
+
"""Initialize configuration manager.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
config_path: Path to configuration file (defaults to .moai/config/config.yaml or config.json)
|
|
81
|
+
"""
|
|
82
|
+
if config_path:
|
|
83
|
+
self.config_path = config_path
|
|
84
|
+
else:
|
|
85
|
+
# Auto-detect YAML (preferred) or JSON (fallback)
|
|
86
|
+
project_root = find_project_root()
|
|
87
|
+
yaml_path = project_root / ".moai" / "config" / "config.yaml"
|
|
88
|
+
json_path = project_root / ".moai" / "config" / "config.json"
|
|
89
|
+
|
|
90
|
+
if YAML_AVAILABLE and yaml_path.exists():
|
|
91
|
+
self.config_path = yaml_path
|
|
92
|
+
elif json_path.exists():
|
|
93
|
+
self.config_path = json_path
|
|
94
|
+
else:
|
|
95
|
+
# Default to YAML for new projects
|
|
96
|
+
self.config_path = yaml_path if YAML_AVAILABLE else json_path
|
|
97
|
+
|
|
98
|
+
self._config: Optional[Dict[str, Any]] = None
|
|
99
|
+
|
|
100
|
+
def load_config(self) -> Dict[str, Any]:
|
|
101
|
+
"""Load configuration from file with fallback to defaults.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Merged configuration dictionary
|
|
105
|
+
"""
|
|
106
|
+
if self._config is not None:
|
|
107
|
+
return self._config
|
|
108
|
+
|
|
109
|
+
# Load from file if exists
|
|
110
|
+
config = {}
|
|
111
|
+
if self.config_path.exists():
|
|
112
|
+
try:
|
|
113
|
+
with open(self.config_path, "r", encoding="utf-8") as f:
|
|
114
|
+
if self.config_path.suffix in [".yaml", ".yml"]:
|
|
115
|
+
if not YAML_AVAILABLE:
|
|
116
|
+
# Fall back to defaults if YAML not available
|
|
117
|
+
config = DEFAULT_CONFIG.copy()
|
|
118
|
+
else:
|
|
119
|
+
file_config = yaml.safe_load(f) or {}
|
|
120
|
+
config = self._merge_configs(DEFAULT_CONFIG.copy(), file_config)
|
|
121
|
+
else:
|
|
122
|
+
file_config = json.load(f)
|
|
123
|
+
config = self._merge_configs(DEFAULT_CONFIG.copy(), file_config)
|
|
124
|
+
except (
|
|
125
|
+
json.JSONDecodeError,
|
|
126
|
+
yaml.YAMLError if YAML_AVAILABLE else Exception,
|
|
127
|
+
IOError,
|
|
128
|
+
OSError,
|
|
129
|
+
):
|
|
130
|
+
# Use defaults if file is corrupted or unreadable
|
|
131
|
+
config = DEFAULT_CONFIG.copy()
|
|
132
|
+
else:
|
|
133
|
+
# Use defaults if file doesn't exist
|
|
134
|
+
config = DEFAULT_CONFIG.copy()
|
|
135
|
+
|
|
136
|
+
self._config = config
|
|
137
|
+
return config
|
|
138
|
+
|
|
139
|
+
def get(self, key_path: str, default: Any = None) -> Any:
|
|
140
|
+
"""Get configuration value using dot notation.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
key_path: Dot-separated path to configuration value
|
|
144
|
+
default: Default value if key not found
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Configuration value or default
|
|
148
|
+
"""
|
|
149
|
+
if not key_path:
|
|
150
|
+
return default
|
|
151
|
+
|
|
152
|
+
config = self.load_config()
|
|
153
|
+
keys = key_path.split(".")
|
|
154
|
+
current = config
|
|
155
|
+
|
|
156
|
+
for key in keys:
|
|
157
|
+
if isinstance(current, dict) and key in current:
|
|
158
|
+
current = current[key]
|
|
159
|
+
else:
|
|
160
|
+
return default
|
|
161
|
+
|
|
162
|
+
return current
|
|
163
|
+
|
|
164
|
+
def get_hooks_config(self) -> Dict[str, Any]:
|
|
165
|
+
"""Get hooks-specific configuration.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Hooks configuration dictionary
|
|
169
|
+
"""
|
|
170
|
+
return self.get("hooks", {})
|
|
171
|
+
|
|
172
|
+
def get_cache_config(self) -> Dict[str, Any]:
|
|
173
|
+
"""Get cache configuration.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Cache configuration dictionary
|
|
177
|
+
"""
|
|
178
|
+
return self.get("hooks.cache", {})
|
|
179
|
+
|
|
180
|
+
def get_project_search_config(self) -> Dict[str, Any]:
|
|
181
|
+
"""Get project search configuration.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Project search configuration dictionary
|
|
185
|
+
"""
|
|
186
|
+
return self.get("hooks.project_search", {})
|
|
187
|
+
|
|
188
|
+
def get_network_config(self) -> Dict[str, Any]:
|
|
189
|
+
"""Get network configuration.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
Network configuration dictionary
|
|
193
|
+
"""
|
|
194
|
+
return self.get("hooks.network", {})
|
|
195
|
+
|
|
196
|
+
def get_git_config(self) -> Dict[str, Any]:
|
|
197
|
+
"""Get git configuration.
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
Git configuration dictionary
|
|
201
|
+
"""
|
|
202
|
+
return self.get("hooks.git", {})
|
|
203
|
+
|
|
204
|
+
def get_language_config(self) -> Dict[str, Any]:
|
|
205
|
+
"""Get language configuration.
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Language configuration dictionary
|
|
209
|
+
"""
|
|
210
|
+
return self.get("language", {})
|
|
211
|
+
|
|
212
|
+
def get_message(self, category: str, subcategory: str = "", key: str = "") -> str:
|
|
213
|
+
"""Get message from messages configuration.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
category: Message category (e.g., 'stderr', 'timeout')
|
|
217
|
+
subcategory: Sub-category (e.g., 'timeout', 'config')
|
|
218
|
+
key: Message key (e.g., 'post_tool_use')
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
Message string
|
|
222
|
+
"""
|
|
223
|
+
if key:
|
|
224
|
+
message = self.get(f"hooks.messages.{category}.{subcategory}.{key}")
|
|
225
|
+
if message:
|
|
226
|
+
return str(message)
|
|
227
|
+
|
|
228
|
+
if subcategory:
|
|
229
|
+
message = self.get(f"hooks.messages.{category}.{subcategory}")
|
|
230
|
+
if isinstance(message, dict):
|
|
231
|
+
# Try to find any string value in the dict
|
|
232
|
+
for v in message.values():
|
|
233
|
+
if isinstance(v, str):
|
|
234
|
+
return v
|
|
235
|
+
elif message:
|
|
236
|
+
return str(message)
|
|
237
|
+
|
|
238
|
+
message = self.get(f"hooks.messages.{category}")
|
|
239
|
+
if message:
|
|
240
|
+
return str(message)
|
|
241
|
+
|
|
242
|
+
return "An error occurred"
|
|
243
|
+
|
|
244
|
+
def get_timeout_seconds(self, hook_type: str = "default") -> int:
|
|
245
|
+
"""Get timeout seconds for a specific hook type.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
hook_type: Type of hook (default, git, network, version_check)
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
Timeout seconds
|
|
252
|
+
"""
|
|
253
|
+
if hook_type == "git":
|
|
254
|
+
return self.get("hooks.git.timeout_seconds", 2)
|
|
255
|
+
elif hook_type == "network":
|
|
256
|
+
return self.get("hooks.network.timeout_seconds", 0.1)
|
|
257
|
+
elif hook_type == "version_check":
|
|
258
|
+
return self.get("hooks.version_check.timeout_seconds", 1)
|
|
259
|
+
else:
|
|
260
|
+
return self.get("hooks.timeout_seconds", 5)
|
|
261
|
+
|
|
262
|
+
def get_timeout_ms(self) -> int:
|
|
263
|
+
"""Get timeout milliseconds for hooks.
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Timeout milliseconds
|
|
267
|
+
"""
|
|
268
|
+
return self.get("hooks.timeout_ms", 5000)
|
|
269
|
+
|
|
270
|
+
def get_minimum_timeout_seconds(self) -> int:
|
|
271
|
+
"""Get minimum allowed timeout seconds.
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
Minimum timeout seconds
|
|
275
|
+
"""
|
|
276
|
+
return self.get("hooks.minimum_timeout_seconds", 1)
|
|
277
|
+
|
|
278
|
+
def get_graceful_degradation(self) -> bool:
|
|
279
|
+
"""Get graceful degradation setting.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
True if graceful degradation is enabled
|
|
283
|
+
"""
|
|
284
|
+
return self.get("hooks.graceful_degradation", True)
|
|
285
|
+
|
|
286
|
+
def get_exit_code(self, code_type: str = "success") -> int:
|
|
287
|
+
"""Get exit code for a specific type.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
code_type: Type of exit code (success, error, critical_error, config_error)
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
Exit code integer
|
|
294
|
+
"""
|
|
295
|
+
exit_codes = self.get("hooks.exit_codes", {})
|
|
296
|
+
return exit_codes.get(code_type, 0)
|
|
297
|
+
|
|
298
|
+
def update_config(self, updates: Dict[str, Any]) -> bool:
|
|
299
|
+
"""Update configuration and save to file.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
updates: Dictionary of updates to merge
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
True if successful, False otherwise
|
|
306
|
+
"""
|
|
307
|
+
try:
|
|
308
|
+
# Load current config
|
|
309
|
+
current = self.load_config()
|
|
310
|
+
|
|
311
|
+
# Merge updates
|
|
312
|
+
updated = self._merge_configs(current, updates)
|
|
313
|
+
|
|
314
|
+
# Create parent directory if needed
|
|
315
|
+
self.config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
316
|
+
|
|
317
|
+
# Write updated config
|
|
318
|
+
with open(self.config_path, "w", encoding="utf-8") as f:
|
|
319
|
+
json.dump(updated, f, indent=2)
|
|
320
|
+
|
|
321
|
+
# Clear cache to force reload
|
|
322
|
+
self._config = None
|
|
323
|
+
|
|
324
|
+
return True
|
|
325
|
+
except (IOError, OSError, json.JSONDecodeError):
|
|
326
|
+
return False
|
|
327
|
+
|
|
328
|
+
def validate_config(self) -> bool:
|
|
329
|
+
"""Validate configuration structure.
|
|
330
|
+
|
|
331
|
+
Returns:
|
|
332
|
+
True if configuration is valid, False otherwise
|
|
333
|
+
"""
|
|
334
|
+
config = self.load_config()
|
|
335
|
+
|
|
336
|
+
# Check that hooks exists and is a dict
|
|
337
|
+
if not isinstance(config.get("hooks"), dict):
|
|
338
|
+
return False
|
|
339
|
+
|
|
340
|
+
return True
|
|
341
|
+
|
|
342
|
+
def _merge_configs(self, base: Dict[str, Any], override: Dict[str, Any]) -> Dict[str, Any]:
|
|
343
|
+
"""Recursively merge two configuration dictionaries.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
base: Base configuration dictionary
|
|
347
|
+
override: Override configuration dictionary
|
|
348
|
+
|
|
349
|
+
Returns:
|
|
350
|
+
Merged configuration dictionary
|
|
351
|
+
"""
|
|
352
|
+
result = base.copy()
|
|
353
|
+
|
|
354
|
+
for key, value in override.items():
|
|
355
|
+
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
|
356
|
+
result[key] = self._merge_configs(result[key], value)
|
|
357
|
+
else:
|
|
358
|
+
result[key] = value
|
|
359
|
+
|
|
360
|
+
return result
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
# Module-level helper functions
|
|
364
|
+
_config_manager: Optional[ConfigManager] = None
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def get_config_manager(config_path: Optional[Path] = None) -> ConfigManager:
|
|
368
|
+
"""Get or create a ConfigManager instance.
|
|
369
|
+
|
|
370
|
+
Args:
|
|
371
|
+
config_path: Optional path to configuration file
|
|
372
|
+
|
|
373
|
+
Returns:
|
|
374
|
+
ConfigManager instance
|
|
375
|
+
"""
|
|
376
|
+
global _config_manager
|
|
377
|
+
if _config_manager is None or config_path is not None:
|
|
378
|
+
_config_manager = ConfigManager(config_path)
|
|
379
|
+
return _config_manager
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def get_config(key_path: str = "", config_path: Optional[Path] = None) -> Any:
|
|
383
|
+
"""Get configuration value.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
key_path: Optional dot-separated path to configuration value
|
|
387
|
+
config_path: Optional path to configuration file
|
|
388
|
+
|
|
389
|
+
Returns:
|
|
390
|
+
Configuration value or dictionary
|
|
391
|
+
"""
|
|
392
|
+
cm = get_config_manager(config_path)
|
|
393
|
+
if key_path:
|
|
394
|
+
return cm.get(key_path)
|
|
395
|
+
return cm.load_config()
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def get_timeout_seconds(hook_type: str = "default") -> int:
|
|
399
|
+
"""Get timeout seconds for a hook type.
|
|
400
|
+
|
|
401
|
+
Args:
|
|
402
|
+
hook_type: Type of hook
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
Timeout seconds
|
|
406
|
+
"""
|
|
407
|
+
return get_config_manager().get_timeout_seconds(hook_type)
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def get_timeout_ms() -> int:
|
|
411
|
+
"""Get timeout milliseconds.
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
Timeout milliseconds
|
|
415
|
+
"""
|
|
416
|
+
return get_config_manager().get_timeout_ms()
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def get_minimum_timeout_seconds() -> int:
|
|
420
|
+
"""Get minimum allowed timeout seconds.
|
|
421
|
+
|
|
422
|
+
Returns:
|
|
423
|
+
Minimum timeout seconds
|
|
424
|
+
"""
|
|
425
|
+
return get_config_manager().get_minimum_timeout_seconds()
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
def get_graceful_degradation() -> bool:
|
|
429
|
+
"""Get graceful degradation setting.
|
|
430
|
+
|
|
431
|
+
Returns:
|
|
432
|
+
True if enabled
|
|
433
|
+
"""
|
|
434
|
+
return get_config_manager().get_graceful_degradation()
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def get_exit_code(code_type: str = "success") -> int:
|
|
438
|
+
"""Get exit code for a type.
|
|
439
|
+
|
|
440
|
+
Args:
|
|
441
|
+
code_type: Type of exit code
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
Exit code
|
|
445
|
+
"""
|
|
446
|
+
return get_config_manager().get_exit_code(code_type)
|