moai-adk 0.25.4__py3-none-any.whl → 0.32.8__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 +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- 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 +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- 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 +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- 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 +4 -12
- 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 +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- 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/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -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 +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -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-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -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-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -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-foundation-claude/SKILL.md +201 -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-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -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 +346 -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-quality/SKILL.md +362 -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-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -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 +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -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-shadcn/SKILL.md +370 -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-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -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 +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -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/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -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 +71 -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-templates/SKILL.md +374 -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-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -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/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/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 +410 -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 +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -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 +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MoAI-ADK Language Configuration Resolver
|
|
3
|
+
|
|
4
|
+
Centralized system for resolving language configuration from multiple sources:
|
|
5
|
+
1. Environment variables (highest priority)
|
|
6
|
+
2. Configuration file (.moai/config/config.json)
|
|
7
|
+
3. Default values (fallback)
|
|
8
|
+
|
|
9
|
+
This module provides a unified interface for all language-related configuration
|
|
10
|
+
needs across the MoAI-ADK system.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Dict, Optional
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
import yaml
|
|
20
|
+
|
|
21
|
+
YAML_AVAILABLE = True
|
|
22
|
+
except ImportError:
|
|
23
|
+
YAML_AVAILABLE = False
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class LanguageConfigResolver:
|
|
27
|
+
"""
|
|
28
|
+
Resolves language configuration from environment variables and config files
|
|
29
|
+
with proper priority handling and validation.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
# Dynamic language name generation - no fixed language map
|
|
33
|
+
# All languages are supported dynamically based on language codes
|
|
34
|
+
|
|
35
|
+
# Default configuration
|
|
36
|
+
DEFAULT_CONFIG = {
|
|
37
|
+
"user_name": "",
|
|
38
|
+
"conversation_language": "en",
|
|
39
|
+
"conversation_language_name": "English",
|
|
40
|
+
"agent_prompt_language": "en",
|
|
41
|
+
"git_commit_messages": "en",
|
|
42
|
+
"code_comments": "en",
|
|
43
|
+
"documentation": "en",
|
|
44
|
+
"error_messages": "en",
|
|
45
|
+
"config_source": "default",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
def __init__(self, project_root: Optional[str] = None):
|
|
49
|
+
"""
|
|
50
|
+
Initialize the resolver with project root path.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
project_root: Root directory of the project. If None, uses current working directory.
|
|
54
|
+
"""
|
|
55
|
+
self.project_root = Path(project_root) if project_root else Path.cwd()
|
|
56
|
+
|
|
57
|
+
# Auto-detect YAML (preferred) or JSON (fallback)
|
|
58
|
+
yaml_path = self.project_root / ".moai" / "config" / "config.yaml"
|
|
59
|
+
json_path = self.project_root / ".moai" / "config" / "config.json"
|
|
60
|
+
|
|
61
|
+
if YAML_AVAILABLE and yaml_path.exists():
|
|
62
|
+
self.config_file_path = yaml_path
|
|
63
|
+
elif json_path.exists():
|
|
64
|
+
self.config_file_path = json_path
|
|
65
|
+
else:
|
|
66
|
+
# Default to YAML for new projects
|
|
67
|
+
self.config_file_path = yaml_path if YAML_AVAILABLE else json_path
|
|
68
|
+
|
|
69
|
+
self._cached_config: Optional[Dict[str, Any]] = None
|
|
70
|
+
|
|
71
|
+
def resolve_config(self, force_refresh: bool = False) -> Dict[str, Any]:
|
|
72
|
+
"""
|
|
73
|
+
Resolve the complete language configuration from all sources.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
force_refresh: Force refresh of cached configuration
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Dictionary containing resolved language configuration
|
|
80
|
+
"""
|
|
81
|
+
if self._cached_config is None or force_refresh:
|
|
82
|
+
self._cached_config = self._build_config()
|
|
83
|
+
|
|
84
|
+
return self._cached_config.copy()
|
|
85
|
+
|
|
86
|
+
def _build_config(self) -> Dict[str, Any]:
|
|
87
|
+
"""
|
|
88
|
+
Build configuration by merging sources with proper priority.
|
|
89
|
+
|
|
90
|
+
Priority Order:
|
|
91
|
+
1. Environment variables (highest)
|
|
92
|
+
2. Configuration file
|
|
93
|
+
3. Default values (lowest)
|
|
94
|
+
"""
|
|
95
|
+
# Start with defaults
|
|
96
|
+
config = self.DEFAULT_CONFIG.copy()
|
|
97
|
+
|
|
98
|
+
# Load config file if exists
|
|
99
|
+
file_config = self._load_config_file()
|
|
100
|
+
if file_config:
|
|
101
|
+
config.update(file_config)
|
|
102
|
+
|
|
103
|
+
# Override with environment variables (highest priority)
|
|
104
|
+
env_config = self._load_env_config()
|
|
105
|
+
if env_config:
|
|
106
|
+
config.update(env_config)
|
|
107
|
+
config["config_source"] = "environment"
|
|
108
|
+
elif file_config:
|
|
109
|
+
config["config_source"] = "config_file"
|
|
110
|
+
else:
|
|
111
|
+
config["config_source"] = "default"
|
|
112
|
+
|
|
113
|
+
# Ensure consistency
|
|
114
|
+
config = self._ensure_consistency(config)
|
|
115
|
+
|
|
116
|
+
return config
|
|
117
|
+
|
|
118
|
+
def _load_config_file(self) -> Optional[Dict[str, Any]]:
|
|
119
|
+
"""
|
|
120
|
+
Load configuration from .moai/config/config.yaml or config.json file.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Configuration dictionary or None if file doesn't exist
|
|
124
|
+
"""
|
|
125
|
+
try:
|
|
126
|
+
if not self.config_file_path.exists():
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
with open(self.config_file_path, "r", encoding="utf-8") as f:
|
|
130
|
+
if self.config_file_path.suffix in [".yaml", ".yml"]:
|
|
131
|
+
if not YAML_AVAILABLE:
|
|
132
|
+
print(f"Warning: PyYAML not available, skipping {self.config_file_path}")
|
|
133
|
+
return None
|
|
134
|
+
full_config = yaml.safe_load(f) or {}
|
|
135
|
+
else:
|
|
136
|
+
full_config = json.load(f)
|
|
137
|
+
|
|
138
|
+
# Extract only relevant fields
|
|
139
|
+
config = {}
|
|
140
|
+
|
|
141
|
+
# User name
|
|
142
|
+
user_config = full_config.get("user", {})
|
|
143
|
+
if "name" in user_config:
|
|
144
|
+
config["user_name"] = user_config["name"]
|
|
145
|
+
|
|
146
|
+
# GitHub profile name (stored separately, not as user name fallback)
|
|
147
|
+
github_config = full_config.get("github", {})
|
|
148
|
+
if "profile_name" in github_config:
|
|
149
|
+
config["github_profile_name"] = github_config["profile_name"]
|
|
150
|
+
|
|
151
|
+
# Language settings
|
|
152
|
+
language_config = full_config.get("language", {})
|
|
153
|
+
if "conversation_language" in language_config:
|
|
154
|
+
config["conversation_language"] = language_config["conversation_language"]
|
|
155
|
+
|
|
156
|
+
if "conversation_language_name" in language_config:
|
|
157
|
+
config["conversation_language_name"] = language_config["conversation_language_name"]
|
|
158
|
+
|
|
159
|
+
if "agent_prompt_language" in language_config:
|
|
160
|
+
config["agent_prompt_language"] = language_config["agent_prompt_language"]
|
|
161
|
+
|
|
162
|
+
if "git_commit_messages" in language_config:
|
|
163
|
+
config["git_commit_messages"] = language_config["git_commit_messages"]
|
|
164
|
+
|
|
165
|
+
if "code_comments" in language_config:
|
|
166
|
+
config["code_comments"] = language_config["code_comments"]
|
|
167
|
+
|
|
168
|
+
if "documentation" in language_config:
|
|
169
|
+
config["documentation"] = language_config["documentation"]
|
|
170
|
+
|
|
171
|
+
if "error_messages" in language_config:
|
|
172
|
+
config["error_messages"] = language_config["error_messages"]
|
|
173
|
+
|
|
174
|
+
return config
|
|
175
|
+
|
|
176
|
+
except (
|
|
177
|
+
json.JSONDecodeError,
|
|
178
|
+
yaml.YAMLError if YAML_AVAILABLE else Exception,
|
|
179
|
+
IOError,
|
|
180
|
+
KeyError,
|
|
181
|
+
) as e:
|
|
182
|
+
# Log error but don't fail - fall back to defaults
|
|
183
|
+
print(f"Warning: Failed to load config file {self.config_file_path}: {e}")
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
def _load_env_config(self) -> Optional[Dict[str, Any]]:
|
|
187
|
+
"""
|
|
188
|
+
Load configuration from environment variables.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Configuration dictionary or None if no environment variables set
|
|
192
|
+
"""
|
|
193
|
+
env_config = {}
|
|
194
|
+
|
|
195
|
+
# User name
|
|
196
|
+
user_name = os.getenv("MOAI_USER_NAME")
|
|
197
|
+
if user_name:
|
|
198
|
+
env_config["user_name"] = user_name
|
|
199
|
+
|
|
200
|
+
# Conversation language
|
|
201
|
+
conv_lang = os.getenv("MOAI_CONVERSATION_LANG")
|
|
202
|
+
if conv_lang:
|
|
203
|
+
env_config["conversation_language"] = conv_lang
|
|
204
|
+
|
|
205
|
+
# Agent prompt language
|
|
206
|
+
agent_lang = os.getenv("MOAI_AGENT_PROMPT_LANG")
|
|
207
|
+
if agent_lang:
|
|
208
|
+
env_config["agent_prompt_language"] = agent_lang
|
|
209
|
+
|
|
210
|
+
# Language name (if not provided, will be auto-generated)
|
|
211
|
+
lang_name = os.getenv("MOAI_CONVERSATION_LANG_NAME")
|
|
212
|
+
if lang_name:
|
|
213
|
+
env_config["conversation_language_name"] = lang_name
|
|
214
|
+
|
|
215
|
+
return env_config if env_config else None
|
|
216
|
+
|
|
217
|
+
def _ensure_consistency(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
218
|
+
"""
|
|
219
|
+
Ensure configuration consistency and auto-generate derived values.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
config: Configuration dictionary to normalize
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Normalized configuration dictionary
|
|
226
|
+
"""
|
|
227
|
+
# Always auto-generate language name based on conversation language
|
|
228
|
+
conv_lang = config.get("conversation_language", "en")
|
|
229
|
+
config["conversation_language_name"] = self.get_language_name(conv_lang)
|
|
230
|
+
|
|
231
|
+
# Ensure agent prompt language defaults to conversation language
|
|
232
|
+
if not config.get("agent_prompt_language"):
|
|
233
|
+
config["agent_prompt_language"] = conv_lang
|
|
234
|
+
|
|
235
|
+
# Validate language codes - all languages are now supported dynamically
|
|
236
|
+
# No validation needed - all language codes are accepted
|
|
237
|
+
|
|
238
|
+
return config
|
|
239
|
+
|
|
240
|
+
def get_language_name(self, language_code: str) -> str:
|
|
241
|
+
"""
|
|
242
|
+
Get display name for a language code dynamically.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
language_code: Language code (two-letter or three-letter)
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
Display name for the language (English name)
|
|
249
|
+
"""
|
|
250
|
+
if not language_code:
|
|
251
|
+
return "Unknown"
|
|
252
|
+
|
|
253
|
+
# Common language name mappings for well-known codes
|
|
254
|
+
common_names = {
|
|
255
|
+
"ko": "Korean",
|
|
256
|
+
"en": "English",
|
|
257
|
+
"ja": "Japanese",
|
|
258
|
+
"zh": "Chinese",
|
|
259
|
+
"es": "Spanish",
|
|
260
|
+
"fr": "French",
|
|
261
|
+
"de": "German",
|
|
262
|
+
"ru": "Russian",
|
|
263
|
+
"pt": "Portuguese",
|
|
264
|
+
"it": "Italian",
|
|
265
|
+
"ar": "Arabic",
|
|
266
|
+
"hi": "Hindi",
|
|
267
|
+
"th": "Thai",
|
|
268
|
+
"vi": "Vietnamese",
|
|
269
|
+
"id": "Indonesian",
|
|
270
|
+
"ms": "Malay",
|
|
271
|
+
"tr": "Turkish",
|
|
272
|
+
"pl": "Polish",
|
|
273
|
+
"nl": "Dutch",
|
|
274
|
+
"sv": "Swedish",
|
|
275
|
+
"da": "Danish",
|
|
276
|
+
"no": "Norwegian",
|
|
277
|
+
"fi": "Finnish",
|
|
278
|
+
"he": "Hebrew",
|
|
279
|
+
"el": "Greek",
|
|
280
|
+
"hu": "Hungarian",
|
|
281
|
+
"cs": "Czech",
|
|
282
|
+
"sk": "Slovak",
|
|
283
|
+
"ro": "Romanian",
|
|
284
|
+
"bg": "Bulgarian",
|
|
285
|
+
"hr": "Croatian",
|
|
286
|
+
"sr": "Serbian",
|
|
287
|
+
"sl": "Slovenian",
|
|
288
|
+
"et": "Estonian",
|
|
289
|
+
"lv": "Latvian",
|
|
290
|
+
"lt": "Lithuanian",
|
|
291
|
+
"uk": "Ukrainian",
|
|
292
|
+
"be": "Belarusian",
|
|
293
|
+
"ka": "Georgian",
|
|
294
|
+
"am": "Amharic",
|
|
295
|
+
"sw": "Swahili",
|
|
296
|
+
"zu": "Zulu",
|
|
297
|
+
"af": "Afrikaans",
|
|
298
|
+
"is": "Icelandic",
|
|
299
|
+
"mt": "Maltese",
|
|
300
|
+
"cy": "Welsh",
|
|
301
|
+
"ga": "Irish",
|
|
302
|
+
"gd": "Scottish Gaelic",
|
|
303
|
+
"eu": "Basque",
|
|
304
|
+
"ca": "Catalan",
|
|
305
|
+
"gl": "Galician",
|
|
306
|
+
"mk": "Macedonian",
|
|
307
|
+
"sq": "Albanian",
|
|
308
|
+
"bn": "Bengali",
|
|
309
|
+
"ta": "Tamil",
|
|
310
|
+
"te": "Telugu",
|
|
311
|
+
"ml": "Malayalam",
|
|
312
|
+
"kn": "Kannada",
|
|
313
|
+
"gu": "Gujarati",
|
|
314
|
+
"pa": "Punjabi",
|
|
315
|
+
"mr": "Marathi",
|
|
316
|
+
"ne": "Nepali",
|
|
317
|
+
"si": "Sinhala",
|
|
318
|
+
"my": "Myanmar (Burmese)",
|
|
319
|
+
"km": "Khmer",
|
|
320
|
+
"lo": "Lao",
|
|
321
|
+
"mn": "Mongolian",
|
|
322
|
+
"hy": "Armenian",
|
|
323
|
+
"az": "Azerbaijani",
|
|
324
|
+
"kk": "Kazakh",
|
|
325
|
+
"ky": "Kyrgyz",
|
|
326
|
+
"uz": "Uzbek",
|
|
327
|
+
"tg": "Tajik",
|
|
328
|
+
"tk": "Turkmen",
|
|
329
|
+
"ps": "Pashto",
|
|
330
|
+
"sd": "Sindhi",
|
|
331
|
+
"ur": "Urdu",
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
# Normalize language code
|
|
335
|
+
normalized_code = self._standardize_language_code(language_code.lower())
|
|
336
|
+
|
|
337
|
+
# Return known name or generate from language code
|
|
338
|
+
if normalized_code in common_names:
|
|
339
|
+
return common_names[normalized_code]
|
|
340
|
+
else:
|
|
341
|
+
# Generate English name from language code (capitalize first letter)
|
|
342
|
+
return normalized_code.title() if normalized_code else "Unknown"
|
|
343
|
+
|
|
344
|
+
def _standardize_language_code(self, language_code: str) -> str:
|
|
345
|
+
"""
|
|
346
|
+
Standardize language code to common format.
|
|
347
|
+
|
|
348
|
+
Args:
|
|
349
|
+
language_code: Input language code
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
Standardized language code
|
|
353
|
+
"""
|
|
354
|
+
if not language_code:
|
|
355
|
+
return ""
|
|
356
|
+
|
|
357
|
+
# Handle common variations
|
|
358
|
+
code = language_code.lower().strip()
|
|
359
|
+
|
|
360
|
+
# Convert common variants to standard codes
|
|
361
|
+
standardizations = {
|
|
362
|
+
"zh-cn": "zh",
|
|
363
|
+
"zh-tw": "zh",
|
|
364
|
+
"zh-hk": "zh",
|
|
365
|
+
"en-us": "en",
|
|
366
|
+
"en-gb": "en",
|
|
367
|
+
"ko-kr": "ko",
|
|
368
|
+
"ja-jp": "ja",
|
|
369
|
+
"es-es": "es",
|
|
370
|
+
"es-mx": "es",
|
|
371
|
+
"pt-br": "pt",
|
|
372
|
+
"pt-pt": "pt",
|
|
373
|
+
"fr-fr": "fr",
|
|
374
|
+
"de-de": "de",
|
|
375
|
+
"it-it": "it",
|
|
376
|
+
"ru-ru": "ru",
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return standardizations.get(code, code[:2]) # Return first 2 chars if not in standardizations
|
|
380
|
+
|
|
381
|
+
def is_korean_language(self, config: Optional[Dict[str, Any]] = None) -> bool:
|
|
382
|
+
"""
|
|
383
|
+
Check if the resolved configuration uses Korean language.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
config: Optional configuration dictionary. If None, uses resolved config.
|
|
387
|
+
|
|
388
|
+
Returns:
|
|
389
|
+
True if Korean language, False otherwise
|
|
390
|
+
"""
|
|
391
|
+
if config is None:
|
|
392
|
+
config = self.resolve_config()
|
|
393
|
+
|
|
394
|
+
return config.get("conversation_language") == "ko"
|
|
395
|
+
|
|
396
|
+
def get_personalized_greeting(self, config: Optional[Dict[str, Any]] = None) -> str:
|
|
397
|
+
"""
|
|
398
|
+
Get personalized greeting based on user name and language.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
config: Optional configuration dictionary. If None, uses resolved config.
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
Personalized greeting string
|
|
405
|
+
"""
|
|
406
|
+
if config is None:
|
|
407
|
+
config = self.resolve_config()
|
|
408
|
+
|
|
409
|
+
user_name = config.get("user_name", "").strip()
|
|
410
|
+
is_korean = self.is_korean_language(config)
|
|
411
|
+
|
|
412
|
+
if user_name:
|
|
413
|
+
if is_korean:
|
|
414
|
+
return f"{user_name}님"
|
|
415
|
+
else:
|
|
416
|
+
return user_name
|
|
417
|
+
|
|
418
|
+
return ""
|
|
419
|
+
|
|
420
|
+
def export_template_variables(self, config: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
|
|
421
|
+
"""
|
|
422
|
+
Export configuration as template variables for substitution.
|
|
423
|
+
|
|
424
|
+
Args:
|
|
425
|
+
config: Optional configuration dictionary. If None, uses resolved config.
|
|
426
|
+
|
|
427
|
+
Returns:
|
|
428
|
+
Dictionary of template variables
|
|
429
|
+
"""
|
|
430
|
+
if config is None:
|
|
431
|
+
config = self.resolve_config()
|
|
432
|
+
|
|
433
|
+
return {
|
|
434
|
+
"CONVERSATION_LANGUAGE": config["conversation_language"],
|
|
435
|
+
"CONVERSATION_LANGUAGE_NAME": config["conversation_language_name"],
|
|
436
|
+
"AGENT_PROMPT_LANGUAGE": config["agent_prompt_language"],
|
|
437
|
+
"GIT_COMMIT_MESSAGES_LANGUAGE": config["git_commit_messages"],
|
|
438
|
+
"CODE_COMMENTS_LANGUAGE": config["code_comments"],
|
|
439
|
+
"DOCUMENTATION_LANGUAGE": config["documentation"],
|
|
440
|
+
"ERROR_MESSAGES_LANGUAGE": config["error_messages"],
|
|
441
|
+
"USER_NAME": config["user_name"],
|
|
442
|
+
"PERSONALIZED_GREETING": self.get_personalized_greeting(config),
|
|
443
|
+
"CONFIG_SOURCE": config["config_source"],
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
def clear_cache(self):
|
|
447
|
+
"""Clear any cached configuration."""
|
|
448
|
+
self._cached_config = None
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
# Global resolver instance
|
|
452
|
+
_resolver_instance: Optional[LanguageConfigResolver] = None
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def get_resolver(project_root: Optional[str] = None) -> LanguageConfigResolver:
|
|
456
|
+
"""
|
|
457
|
+
Get the global language configuration resolver instance.
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
project_root: Project root directory
|
|
461
|
+
|
|
462
|
+
Returns:
|
|
463
|
+
LanguageConfigResolver instance
|
|
464
|
+
"""
|
|
465
|
+
global _resolver_instance
|
|
466
|
+
|
|
467
|
+
if _resolver_instance is None or (project_root and project_root != str(_resolver_instance.project_root)):
|
|
468
|
+
_resolver_instance = LanguageConfigResolver(project_root)
|
|
469
|
+
|
|
470
|
+
return _resolver_instance
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def resolve_language_config(project_root: Optional[str] = None, force_refresh: bool = False) -> Dict[str, Any]:
|
|
474
|
+
"""
|
|
475
|
+
Convenience function to resolve language configuration.
|
|
476
|
+
|
|
477
|
+
Args:
|
|
478
|
+
project_root: Project root directory
|
|
479
|
+
force_refresh: Force refresh of cached configuration
|
|
480
|
+
|
|
481
|
+
Returns:
|
|
482
|
+
Resolved language configuration
|
|
483
|
+
"""
|
|
484
|
+
resolver = get_resolver(project_root)
|
|
485
|
+
return resolver.resolve_config(force_refresh)
|
|
@@ -8,31 +8,32 @@ Provides comprehensive language validation capabilities for programming language
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import Any, Dict, List, Optional, Set, Tuple
|
|
10
10
|
|
|
11
|
+
|
|
11
12
|
# Language detector functionality removed due to missing dependency
|
|
12
13
|
# Using simplified language detection for now
|
|
13
14
|
def get_all_supported_languages():
|
|
14
15
|
"""Get all supported programming languages."""
|
|
15
16
|
return {"python", "javascript", "typescript", "java", "go", "rust", "cpp", "c"}
|
|
16
17
|
|
|
18
|
+
|
|
17
19
|
def get_language_by_file_extension(extension: str) -> Optional[str]:
|
|
18
20
|
"""Get programming language by file extension."""
|
|
19
|
-
from pathlib import Path
|
|
20
21
|
|
|
21
22
|
# Handle Path objects and strings
|
|
22
|
-
if hasattr(extension,
|
|
23
|
+
if hasattr(extension, "suffix"):
|
|
23
24
|
# Path object
|
|
24
25
|
ext = extension.suffix.lower()
|
|
25
26
|
else:
|
|
26
27
|
# String - extract extension
|
|
27
28
|
ext = str(extension).lower()
|
|
28
|
-
if not ext.startswith(
|
|
29
|
+
if not ext.startswith("."):
|
|
29
30
|
# Extract extension from filename
|
|
30
|
-
if
|
|
31
|
-
ext =
|
|
31
|
+
if "." in ext:
|
|
32
|
+
ext = "." + ext.split(".")[-1]
|
|
32
33
|
else:
|
|
33
|
-
ext =
|
|
34
|
+
ext = ""
|
|
34
35
|
|
|
35
|
-
EXTENSION_MAP = {
|
|
36
|
+
EXTENSION_MAP = { # noqa: N806 - intentional constant naming
|
|
36
37
|
".py": "python",
|
|
37
38
|
".js": "javascript",
|
|
38
39
|
".ts": "typescript",
|
|
@@ -46,17 +47,20 @@ def get_language_by_file_extension(extension: str) -> Optional[str]:
|
|
|
46
47
|
}
|
|
47
48
|
return EXTENSION_MAP.get(ext)
|
|
48
49
|
|
|
50
|
+
|
|
49
51
|
def is_code_directory(path: str) -> bool:
|
|
50
52
|
"""Check if directory is a code directory."""
|
|
51
53
|
code_dirs = {"src", "lib", "app", "components", "modules", "packages"}
|
|
52
54
|
return any(dir_name in path for dir_name in code_dirs)
|
|
53
55
|
|
|
56
|
+
|
|
54
57
|
LANGUAGE_DIRECTORY_MAP = {
|
|
55
58
|
"python": ["src", "tests", "examples"],
|
|
56
59
|
"javascript": ["src", "lib", "packages"],
|
|
57
60
|
"typescript": ["src", "lib", "packages"],
|
|
58
61
|
}
|
|
59
62
|
|
|
63
|
+
|
|
60
64
|
def get_exclude_patterns():
|
|
61
65
|
"""Get patterns to exclude from language detection."""
|
|
62
66
|
return ["*.pyc", "*.pyo", "__pycache__", ".git", "node_modules", ".venv"]
|
|
@@ -127,8 +131,8 @@ class LanguageValidator:
|
|
|
127
131
|
self.supported_languages = set(lang.lower() for lang in supported_languages)
|
|
128
132
|
|
|
129
133
|
# Compile regex patterns for efficient matching
|
|
130
|
-
self._directory_patterns = {}
|
|
131
|
-
self._exclude_patterns_cache = {}
|
|
134
|
+
self._directory_patterns: Dict[str, Any] = {}
|
|
135
|
+
self._exclude_patterns_cache: Dict[str, Any] = {}
|
|
132
136
|
|
|
133
137
|
# Initialize analysis cache for statistics tracking
|
|
134
138
|
self._analysis_cache = {
|
|
@@ -137,9 +141,7 @@ class LanguageValidator:
|
|
|
137
141
|
"supported_languages_found": 0,
|
|
138
142
|
}
|
|
139
143
|
|
|
140
|
-
def _validate_and_normalize_input(
|
|
141
|
-
self, value: Any, input_type: str
|
|
142
|
-
) -> Optional[Any]:
|
|
144
|
+
def _validate_and_normalize_input(self, value: Any, input_type: str) -> Optional[Any]:
|
|
143
145
|
"""
|
|
144
146
|
Validate and normalize input values.
|
|
145
147
|
|
|
@@ -243,11 +245,11 @@ class LanguageValidator:
|
|
|
243
245
|
if normalized_lang in LANGUAGE_DIRECTORY_MAP:
|
|
244
246
|
dirs = LANGUAGE_DIRECTORY_MAP[normalized_lang].copy()
|
|
245
247
|
# Add trailing slash for consistency with test expectations
|
|
246
|
-
return [f"{dir}/" if not dir.endswith(
|
|
248
|
+
return [f"{dir}/" if not dir.endswith("/") else dir for dir in dirs]
|
|
247
249
|
|
|
248
250
|
# Return default Python directories as fallback with trailing slashes
|
|
249
251
|
default_dirs = LANGUAGE_DIRECTORY_MAP.get("python", [])
|
|
250
|
-
return [f"{dir}/" if not dir.endswith(
|
|
252
|
+
return [f"{dir}/" if not dir.endswith("/") else dir for dir in default_dirs]
|
|
251
253
|
|
|
252
254
|
def get_file_extensions(self, language: str) -> List[str]:
|
|
253
255
|
"""
|
|
@@ -324,7 +326,7 @@ class LanguageValidator:
|
|
|
324
326
|
return config_patterns[filename]
|
|
325
327
|
|
|
326
328
|
# Extract extension and try normal detection
|
|
327
|
-
|
|
329
|
+
Path(filename).suffix.lower()
|
|
328
330
|
return self.detect_language_from_extension(filename)
|
|
329
331
|
|
|
330
332
|
def validate_file_extension(self, file_path: Any, language: str) -> bool:
|
|
@@ -376,9 +378,7 @@ class LanguageValidator:
|
|
|
376
378
|
|
|
377
379
|
return language.strip().lower()
|
|
378
380
|
|
|
379
|
-
def validate_project_configuration(
|
|
380
|
-
self, config: Dict[str, Any]
|
|
381
|
-
) -> Tuple[bool, List[str]]:
|
|
381
|
+
def validate_project_configuration(self, config: Dict[str, Any]) -> Tuple[bool, List[str]]:
|
|
382
382
|
"""
|
|
383
383
|
Validate project configuration for language support.
|
|
384
384
|
|
|
@@ -425,18 +425,13 @@ class LanguageValidator:
|
|
|
425
425
|
return False, issues
|
|
426
426
|
|
|
427
427
|
# Additional validation for empty strings and whitespace-only names
|
|
428
|
-
if (
|
|
429
|
-
isinstance(project_config["name"], str)
|
|
430
|
-
and not project_config["name"].strip()
|
|
431
|
-
):
|
|
428
|
+
if isinstance(project_config["name"], str) and not project_config["name"].strip():
|
|
432
429
|
issues.append("Project name cannot be empty or contain only whitespace")
|
|
433
430
|
return False, issues
|
|
434
431
|
|
|
435
432
|
return True, issues
|
|
436
433
|
|
|
437
|
-
def validate_project_structure(
|
|
438
|
-
self, project_files: Dict[str, bool], language: str
|
|
439
|
-
) -> Tuple[bool, List[str]]:
|
|
434
|
+
def validate_project_structure(self, project_files: Dict[str, bool], language: str) -> Tuple[bool, List[str]]:
|
|
440
435
|
"""
|
|
441
436
|
Validate project structure for a specific language.
|
|
442
437
|
|
|
@@ -448,12 +443,8 @@ class LanguageValidator:
|
|
|
448
443
|
Tuple of (is_valid, issues) where is_valid is boolean and issues is list of strings.
|
|
449
444
|
"""
|
|
450
445
|
if self.auto_validate:
|
|
451
|
-
validated_project_files = self._validate_and_normalize_input(
|
|
452
|
-
|
|
453
|
-
)
|
|
454
|
-
validated_language = self._validate_and_normalize_input(
|
|
455
|
-
language, "language"
|
|
456
|
-
)
|
|
446
|
+
validated_project_files = self._validate_and_normalize_input(project_files, "dict")
|
|
447
|
+
validated_language = self._validate_and_normalize_input(language, "language")
|
|
457
448
|
if validated_project_files is None or validated_language is None:
|
|
458
449
|
return False, ["Invalid input format for project structure validation"]
|
|
459
450
|
|
|
@@ -461,7 +452,7 @@ class LanguageValidator:
|
|
|
461
452
|
expected_dirs = self.get_expected_directories(language)
|
|
462
453
|
|
|
463
454
|
# Group files by directory
|
|
464
|
-
files_by_dir = {}
|
|
455
|
+
files_by_dir: Dict[str, List[str]] = {}
|
|
465
456
|
for file_path, is_source in project_files.items():
|
|
466
457
|
if is_source: # Only validate source files
|
|
467
458
|
dir_path = str(Path(file_path).parent) + "/"
|
|
@@ -478,18 +469,14 @@ class LanguageValidator:
|
|
|
478
469
|
break
|
|
479
470
|
|
|
480
471
|
if not found_files_in_dir and expected_dir != "{package_name}/":
|
|
481
|
-
issues.append(
|
|
482
|
-
f"No source files found in expected directory: {expected_dir}"
|
|
483
|
-
)
|
|
472
|
+
issues.append(f"No source files found in expected directory: {expected_dir}")
|
|
484
473
|
|
|
485
474
|
# Check for files in unexpected directories
|
|
486
|
-
|
|
487
|
-
exclude_patterns = get_exclude_patterns(config)
|
|
488
|
-
|
|
475
|
+
# Note: Using simplified check since is_code_directory signature changed
|
|
489
476
|
for file_path, is_source in project_files.items():
|
|
490
477
|
if is_source:
|
|
491
|
-
|
|
492
|
-
if not is_code_directory(
|
|
478
|
+
path_str = str(file_path)
|
|
479
|
+
if not is_code_directory(path_str):
|
|
493
480
|
issues.append(f"Source file in unexpected location: {file_path}")
|
|
494
481
|
|
|
495
482
|
return len(issues) == 0, issues
|
|
@@ -511,7 +498,7 @@ class LanguageValidator:
|
|
|
511
498
|
else:
|
|
512
499
|
validated_files = files
|
|
513
500
|
|
|
514
|
-
stats = {}
|
|
501
|
+
stats: Dict[str, int] = {}
|
|
515
502
|
total_files = 0
|
|
516
503
|
detected_extensions = set()
|
|
517
504
|
|