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 @@
|
|
|
1
|
+
"""Project module: initialization and management"""
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Backup utility module (SPEC-INIT-003 v0.3.0)
|
|
2
|
+
|
|
3
|
+
Selective backup strategy:
|
|
4
|
+
- Back up only the required files (OR condition)
|
|
5
|
+
- Backup path: .moai-backups/backup/ (v0.4.2)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
# Backup targets (OR condition - back up when any exist)
|
|
11
|
+
BACKUP_TARGETS = [
|
|
12
|
+
".moai/config/config.json",
|
|
13
|
+
".moai/project/",
|
|
14
|
+
".moai/memory/",
|
|
15
|
+
".claude/",
|
|
16
|
+
".github/",
|
|
17
|
+
"CLAUDE.md",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
# User data protection paths (excluded from backups)
|
|
21
|
+
PROTECTED_PATHS = [
|
|
22
|
+
".moai/specs/",
|
|
23
|
+
".moai/reports/",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def has_any_moai_files(project_path: Path) -> bool:
|
|
28
|
+
"""Check whether any MoAI-ADK files exist (OR condition).
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
project_path: Project path.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
True when any backup target exists.
|
|
35
|
+
"""
|
|
36
|
+
for target in BACKUP_TARGETS:
|
|
37
|
+
target_path = project_path / target
|
|
38
|
+
if target_path.exists():
|
|
39
|
+
return True
|
|
40
|
+
return False
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_backup_targets(project_path: Path) -> list[str]:
|
|
44
|
+
"""Return existing backup targets.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
project_path: Project path.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
List of backup targets that exist.
|
|
51
|
+
"""
|
|
52
|
+
targets: list[str] = []
|
|
53
|
+
for target in BACKUP_TARGETS:
|
|
54
|
+
target_path = project_path / target
|
|
55
|
+
if target_path.exists():
|
|
56
|
+
targets.append(target)
|
|
57
|
+
return targets
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def is_protected_path(rel_path: Path) -> bool:
|
|
61
|
+
"""Check whether the path is protected.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
rel_path: Relative path.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
True when the path should be excluded from backups.
|
|
68
|
+
"""
|
|
69
|
+
rel_str = str(rel_path).replace("\\", "/")
|
|
70
|
+
return any(rel_str.startswith(p.lstrip("./").rstrip("/")) for p in PROTECTED_PATHS)
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"""System requirements validation module.
|
|
2
|
+
|
|
3
|
+
Checks whether required and optional tools are installed.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import platform
|
|
7
|
+
import shutil
|
|
8
|
+
import subprocess
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SystemChecker:
|
|
14
|
+
"""Validate system requirements."""
|
|
15
|
+
|
|
16
|
+
REQUIRED_TOOLS: dict[str, str] = {
|
|
17
|
+
"git": "git --version",
|
|
18
|
+
"python": "python3 --version",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
OPTIONAL_TOOLS: dict[str, str] = {
|
|
22
|
+
"gh": "gh --version",
|
|
23
|
+
"docker": "docker --version",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
LANGUAGE_TOOLS: dict[str, dict[str, list[str]]] = {
|
|
27
|
+
"python": {
|
|
28
|
+
"required": ["python3", "pip"],
|
|
29
|
+
"recommended": ["pytest", "mypy", "ruff"],
|
|
30
|
+
"optional": ["black", "pylint"],
|
|
31
|
+
},
|
|
32
|
+
"typescript": {
|
|
33
|
+
"required": ["node", "npm"],
|
|
34
|
+
"recommended": ["vitest", "biome"],
|
|
35
|
+
"optional": ["typescript", "eslint"],
|
|
36
|
+
},
|
|
37
|
+
"javascript": {
|
|
38
|
+
"required": ["node", "npm"],
|
|
39
|
+
"recommended": ["jest", "eslint"],
|
|
40
|
+
"optional": ["prettier", "webpack"],
|
|
41
|
+
},
|
|
42
|
+
"java": {
|
|
43
|
+
"required": ["java", "javac"],
|
|
44
|
+
"recommended": ["maven", "gradle"],
|
|
45
|
+
"optional": ["junit", "checkstyle"],
|
|
46
|
+
},
|
|
47
|
+
"go": {
|
|
48
|
+
"required": ["go"],
|
|
49
|
+
"recommended": ["golangci-lint", "gofmt"],
|
|
50
|
+
"optional": ["delve", "gopls"],
|
|
51
|
+
},
|
|
52
|
+
"rust": {
|
|
53
|
+
"required": ["rustc", "cargo"],
|
|
54
|
+
"recommended": ["rustfmt", "clippy"],
|
|
55
|
+
"optional": ["rust-analyzer", "cargo-audit"],
|
|
56
|
+
},
|
|
57
|
+
"dart": {
|
|
58
|
+
"required": ["dart"],
|
|
59
|
+
"recommended": ["flutter", "dart_test"],
|
|
60
|
+
"optional": ["dartfmt", "dartanalyzer"],
|
|
61
|
+
},
|
|
62
|
+
"swift": {
|
|
63
|
+
"required": ["swift", "swiftc"],
|
|
64
|
+
"recommended": ["xcrun", "swift-format"],
|
|
65
|
+
"optional": ["swiftlint", "sourcekit-lsp"],
|
|
66
|
+
},
|
|
67
|
+
"kotlin": {
|
|
68
|
+
"required": ["kotlin", "kotlinc"],
|
|
69
|
+
"recommended": ["gradle", "ktlint"],
|
|
70
|
+
"optional": ["detekt", "kotlin-language-server"],
|
|
71
|
+
},
|
|
72
|
+
"csharp": {
|
|
73
|
+
"required": ["dotnet"],
|
|
74
|
+
"recommended": ["msbuild", "nuget"],
|
|
75
|
+
"optional": ["csharpier", "roslyn"],
|
|
76
|
+
},
|
|
77
|
+
"php": {
|
|
78
|
+
"required": ["php"],
|
|
79
|
+
"recommended": ["composer", "phpunit"],
|
|
80
|
+
"optional": ["psalm", "phpstan"],
|
|
81
|
+
},
|
|
82
|
+
"ruby": {
|
|
83
|
+
"required": ["ruby", "gem"],
|
|
84
|
+
"recommended": ["bundler", "rspec"],
|
|
85
|
+
"optional": ["rubocop", "solargraph"],
|
|
86
|
+
},
|
|
87
|
+
"elixir": {
|
|
88
|
+
"required": ["elixir", "mix"],
|
|
89
|
+
"recommended": ["hex", "dialyzer"],
|
|
90
|
+
"optional": ["credo", "ex_unit"],
|
|
91
|
+
},
|
|
92
|
+
"scala": {
|
|
93
|
+
"required": ["scala", "scalac"],
|
|
94
|
+
"recommended": ["sbt", "scalatest"],
|
|
95
|
+
"optional": ["scalafmt", "metals"],
|
|
96
|
+
},
|
|
97
|
+
"clojure": {
|
|
98
|
+
"required": ["clojure", "clj"],
|
|
99
|
+
"recommended": ["leiningen", "clojure.test"],
|
|
100
|
+
"optional": ["cider", "clj-kondo"],
|
|
101
|
+
},
|
|
102
|
+
"haskell": {
|
|
103
|
+
"required": ["ghc", "ghci"],
|
|
104
|
+
"recommended": ["cabal", "stack"],
|
|
105
|
+
"optional": ["hlint", "haskell-language-server"],
|
|
106
|
+
},
|
|
107
|
+
"c": {
|
|
108
|
+
"required": ["gcc", "make"],
|
|
109
|
+
"recommended": ["clang", "cmake"],
|
|
110
|
+
"optional": ["gdb", "valgrind"],
|
|
111
|
+
},
|
|
112
|
+
"cpp": {
|
|
113
|
+
"required": ["g++", "make"],
|
|
114
|
+
"recommended": ["clang++", "cmake"],
|
|
115
|
+
"optional": ["gdb", "cppcheck"],
|
|
116
|
+
},
|
|
117
|
+
"lua": {
|
|
118
|
+
"required": ["lua"],
|
|
119
|
+
"recommended": ["luarocks", "busted"],
|
|
120
|
+
"optional": ["luacheck", "lua-language-server"],
|
|
121
|
+
},
|
|
122
|
+
"ocaml": {
|
|
123
|
+
"required": ["ocaml", "opam"],
|
|
124
|
+
"recommended": ["dune", "ocamlformat"],
|
|
125
|
+
"optional": ["merlin", "ocp-indent"],
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
def check_all(self) -> dict[str, bool]:
|
|
130
|
+
"""Validate every tool.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Dictionary mapping tool names to availability.
|
|
134
|
+
"""
|
|
135
|
+
result = {}
|
|
136
|
+
|
|
137
|
+
# Check required tools
|
|
138
|
+
for tool, command in self.REQUIRED_TOOLS.items():
|
|
139
|
+
result[tool] = self._check_tool(command)
|
|
140
|
+
|
|
141
|
+
# Check optional tools
|
|
142
|
+
for tool, command in self.OPTIONAL_TOOLS.items():
|
|
143
|
+
result[tool] = self._check_tool(command)
|
|
144
|
+
|
|
145
|
+
return result
|
|
146
|
+
|
|
147
|
+
def _check_tool(self, command: str) -> bool:
|
|
148
|
+
"""Check an individual tool.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
command: Command to run (e.g., "git --version").
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
True when the tool is available.
|
|
155
|
+
"""
|
|
156
|
+
if not command:
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
try:
|
|
160
|
+
# Extract the tool name (first token)
|
|
161
|
+
tool_name = command.split()[0]
|
|
162
|
+
# Determine availability via shutil.which
|
|
163
|
+
return shutil.which(tool_name) is not None
|
|
164
|
+
except Exception:
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
def check_language_tools(self, language: str | None) -> dict[str, bool]:
|
|
168
|
+
"""Validate toolchains by language.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
language: Programming language name (e.g., "python", "typescript").
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
Dictionary mapping tool names to availability.
|
|
175
|
+
"""
|
|
176
|
+
# Guard clause: no language specified
|
|
177
|
+
if not language:
|
|
178
|
+
return {}
|
|
179
|
+
|
|
180
|
+
language_lower = language.lower()
|
|
181
|
+
|
|
182
|
+
# Guard clause: unsupported language
|
|
183
|
+
if language_lower not in self.LANGUAGE_TOOLS:
|
|
184
|
+
return {}
|
|
185
|
+
|
|
186
|
+
# Retrieve tool configuration for the language
|
|
187
|
+
tools_config = self.LANGUAGE_TOOLS[language_lower]
|
|
188
|
+
|
|
189
|
+
# Evaluate tools by category and collect results
|
|
190
|
+
result: dict[str, bool] = {}
|
|
191
|
+
for category in ["required", "recommended", "optional"]:
|
|
192
|
+
tools = tools_config.get(category, [])
|
|
193
|
+
for tool in tools:
|
|
194
|
+
result[tool] = self._is_tool_available(tool)
|
|
195
|
+
|
|
196
|
+
return result
|
|
197
|
+
|
|
198
|
+
def _is_tool_available(self, tool: str) -> bool:
|
|
199
|
+
"""Check whether a tool is available (helper).
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
tool: Tool name.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
True when the tool is available.
|
|
206
|
+
"""
|
|
207
|
+
return shutil.which(tool) is not None
|
|
208
|
+
|
|
209
|
+
def get_tool_version(self, tool: str | None) -> str | None:
|
|
210
|
+
"""Retrieve tool version information.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
tool: Tool name (for example, "python3", "node").
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
Version string or None when the tool is unavailable.
|
|
217
|
+
"""
|
|
218
|
+
# Guard clause: unspecified or unavailable tool
|
|
219
|
+
if not tool or not self._is_tool_available(tool):
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
try:
|
|
223
|
+
# Call the tool with --version to obtain the version string
|
|
224
|
+
result = subprocess.run(
|
|
225
|
+
[tool, "--version"],
|
|
226
|
+
capture_output=True,
|
|
227
|
+
text=True,
|
|
228
|
+
timeout=2, # 2-second timeout to respect performance constraints
|
|
229
|
+
check=False,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
# Return the version when the command succeeds
|
|
233
|
+
if result.returncode == 0 and result.stdout:
|
|
234
|
+
return self._extract_version_line(result.stdout)
|
|
235
|
+
|
|
236
|
+
return None
|
|
237
|
+
|
|
238
|
+
except (subprocess.TimeoutExpired, OSError):
|
|
239
|
+
# Gracefully handle timeout and OS errors
|
|
240
|
+
return None
|
|
241
|
+
|
|
242
|
+
def _extract_version_line(self, version_output: str) -> str:
|
|
243
|
+
"""Extract the first line from version output (helper).
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
version_output: Output captured from the --version command.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
First line containing version information.
|
|
250
|
+
"""
|
|
251
|
+
return version_output.strip().split("\n")[0]
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def check_environment() -> dict[str, bool]:
|
|
255
|
+
"""Validate the overall environment (used by the CLI doctor command).
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
Mapping from check description to boolean status.
|
|
259
|
+
"""
|
|
260
|
+
return {
|
|
261
|
+
"Python >= 3.11": sys.version_info >= (3, 11),
|
|
262
|
+
"Git installed": shutil.which("git") is not None,
|
|
263
|
+
"Project structure (.moai/)": Path(".moai").exists(),
|
|
264
|
+
"Config file (.moai/config/config.yaml)": Path(".moai/config/config.yaml").exists(),
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def get_platform_specific_message(unix_message: str, windows_message: str) -> str:
|
|
269
|
+
"""Return platform-specific message.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
unix_message: Message for Unix/Linux/macOS.
|
|
273
|
+
windows_message: Message for Windows.
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
Platform-appropriate message.
|
|
277
|
+
|
|
278
|
+
Examples:
|
|
279
|
+
>>> get_platform_specific_message("chmod 755 .moai", "Check directory permissions")
|
|
280
|
+
'chmod 755 .moai' # on Unix/Linux/macOS
|
|
281
|
+
>>> get_platform_specific_message("chmod 755 .moai", "Check directory permissions")
|
|
282
|
+
'Check directory permissions' # on Windows
|
|
283
|
+
"""
|
|
284
|
+
if platform.system() == "Windows":
|
|
285
|
+
return windows_message
|
|
286
|
+
return unix_message
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def get_permission_fix_message(path: str) -> str:
|
|
290
|
+
"""Get platform-specific permission fix message.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
path: Path to fix permissions for.
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
Platform-specific fix instructions.
|
|
297
|
+
"""
|
|
298
|
+
if platform.system() == "Windows":
|
|
299
|
+
return f"Run with administrator privileges or verify permissions in the properties of the '{path}' directory"
|
|
300
|
+
return f"Run 'chmod 755 {path}' and try again"
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
# TEST: tests/unit/test_language_detector_extended.py
|
|
2
|
+
"""Language detector module.
|
|
3
|
+
|
|
4
|
+
Automatically detects 20 programming languages.
|
|
5
|
+
|
|
6
|
+
Extended detection supports:
|
|
7
|
+
- 11 new languages: Ruby, PHP, Java, Rust, Dart, Swift, Kotlin, C#, C, C++, Shell
|
|
8
|
+
- 5 build tool detection: Maven, Gradle, CMake, SPM, dotnet
|
|
9
|
+
- Package manager detection: bundle, composer, cargo
|
|
10
|
+
- Priority conflict resolution for multi-language projects
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class LanguageDetector:
|
|
17
|
+
"""Automatically detect up to 20 programming languages.
|
|
18
|
+
|
|
19
|
+
Prioritizes framework-specific files (e.g., Laravel, Django) over
|
|
20
|
+
generic language files to improve accuracy in mixed-language projects.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
LANGUAGE_PATTERNS = {
|
|
24
|
+
# Priority order (highest to lowest):
|
|
25
|
+
# 1. Rust, 2. Dart, 3. Swift, 4. Kotlin, 5. C#, 6. Java, 7. Ruby, 8. PHP
|
|
26
|
+
# 9. Go, 10. Python, 11. TypeScript, 12. JavaScript, 13. C++, 14. C, 15. Shell
|
|
27
|
+
"rust": ["*.rs", "Cargo.toml"],
|
|
28
|
+
"dart": ["*.dart", "pubspec.yaml"],
|
|
29
|
+
"swift": ["*.swift", "Package.swift"],
|
|
30
|
+
"kotlin": ["*.kt", "build.gradle.kts"],
|
|
31
|
+
"csharp": ["*.cs", "*.csproj"],
|
|
32
|
+
"java": ["*.java", "pom.xml", "build.gradle"],
|
|
33
|
+
# Ruby moved for priority (Rails detection)
|
|
34
|
+
"ruby": [
|
|
35
|
+
"*.rb",
|
|
36
|
+
"Gemfile",
|
|
37
|
+
"Gemfile.lock", # Bundler: lock file (unique to Ruby)
|
|
38
|
+
"config/routes.rb", # Rails: routing file (unique identifier)
|
|
39
|
+
"app/controllers/", # Rails: controller directory
|
|
40
|
+
"Rakefile", # Rails/Ruby: task file
|
|
41
|
+
],
|
|
42
|
+
# PHP after Ruby (Laravel detection)
|
|
43
|
+
"php": [
|
|
44
|
+
"*.php",
|
|
45
|
+
"composer.json",
|
|
46
|
+
"artisan", # Laravel: CLI tool (unique identifier)
|
|
47
|
+
"app/", # Laravel: application directory
|
|
48
|
+
"bootstrap/laravel.php", # Laravel: bootstrap file
|
|
49
|
+
],
|
|
50
|
+
"go": ["*.go", "go.mod"],
|
|
51
|
+
"python": ["*.py", "pyproject.toml", "requirements.txt", "setup.py"],
|
|
52
|
+
"typescript": ["*.ts", "tsconfig.json"],
|
|
53
|
+
"javascript": ["*.js", "package.json"],
|
|
54
|
+
"cpp": ["*.cpp", "CMakeLists.txt"],
|
|
55
|
+
"c": ["*.c", "Makefile"],
|
|
56
|
+
"shell": ["*.sh", "*.bash"],
|
|
57
|
+
# Additional languages (lower priority)
|
|
58
|
+
"elixir": ["*.ex", "mix.exs"],
|
|
59
|
+
"scala": ["*.scala", "build.sbt"],
|
|
60
|
+
"clojure": ["*.clj", "project.clj"],
|
|
61
|
+
"haskell": ["*.hs", "*.cabal"],
|
|
62
|
+
"lua": ["*.lua"],
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
def detect(self, path: str | Path = ".") -> str | None:
|
|
66
|
+
"""Detect a single language (in priority order).
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
path: Directory to inspect.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Detected language name (lowercase) or None.
|
|
73
|
+
"""
|
|
74
|
+
path = Path(path)
|
|
75
|
+
|
|
76
|
+
# Inspect each language in priority order
|
|
77
|
+
for language, patterns in self.LANGUAGE_PATTERNS.items():
|
|
78
|
+
if self._check_patterns(path, patterns):
|
|
79
|
+
return language
|
|
80
|
+
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
def detect_multiple(self, path: str | Path = ".") -> list[str]:
|
|
84
|
+
"""Detect multiple languages.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
path: Directory to inspect.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
List of all detected language names.
|
|
91
|
+
"""
|
|
92
|
+
path = Path(path)
|
|
93
|
+
detected = []
|
|
94
|
+
|
|
95
|
+
for language, patterns in self.LANGUAGE_PATTERNS.items():
|
|
96
|
+
if self._check_patterns(path, patterns):
|
|
97
|
+
detected.append(language)
|
|
98
|
+
|
|
99
|
+
return detected
|
|
100
|
+
|
|
101
|
+
def _check_patterns(self, path: Path, patterns: list[str]) -> bool:
|
|
102
|
+
"""Check whether any pattern matches.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
path: Directory to inspect.
|
|
106
|
+
patterns: List of glob patterns.
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
True when any pattern matches.
|
|
110
|
+
"""
|
|
111
|
+
for pattern in patterns:
|
|
112
|
+
# Extension pattern (e.g., *.py)
|
|
113
|
+
if pattern.startswith("*."):
|
|
114
|
+
if list(path.rglob(pattern)):
|
|
115
|
+
return True
|
|
116
|
+
# Specific file name (e.g., pyproject.toml)
|
|
117
|
+
else:
|
|
118
|
+
if (path / pattern).exists():
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
def get_workflow_template_path(self, language: str) -> str:
|
|
124
|
+
"""Get the GitHub Actions workflow template path for a language.
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
language: Programming language name (lowercase).
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Workflow template file path relative to templates directory.
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
ValueError: If language is not supported for workflows.
|
|
135
|
+
"""
|
|
136
|
+
# Language-specific workflow template mapping
|
|
137
|
+
workflow_templates = {
|
|
138
|
+
"python": "python-tag-validation.yml",
|
|
139
|
+
"javascript": "javascript-tag-validation.yml",
|
|
140
|
+
"typescript": "typescript-tag-validation.yml",
|
|
141
|
+
"go": "go-tag-validation.yml",
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if language not in workflow_templates:
|
|
145
|
+
raise ValueError(f"Language '{language}' is not supported for workflows")
|
|
146
|
+
|
|
147
|
+
return workflow_templates[language]
|
|
148
|
+
|
|
149
|
+
def detect_package_manager(self, path: str | Path = ".") -> str | None:
|
|
150
|
+
"""Detect the package manager for the detected language.
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
path: Directory to inspect.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
Package manager name or None if not detected.
|
|
158
|
+
"""
|
|
159
|
+
path = Path(path)
|
|
160
|
+
|
|
161
|
+
# Ruby
|
|
162
|
+
if (path / "Gemfile").exists():
|
|
163
|
+
return "bundle"
|
|
164
|
+
|
|
165
|
+
# PHP
|
|
166
|
+
if (path / "composer.json").exists():
|
|
167
|
+
return "composer"
|
|
168
|
+
|
|
169
|
+
# Java/Kotlin
|
|
170
|
+
if (path / "pom.xml").exists():
|
|
171
|
+
return "maven"
|
|
172
|
+
if (path / "build.gradle").exists() or (path / "build.gradle.kts").exists():
|
|
173
|
+
return "gradle"
|
|
174
|
+
|
|
175
|
+
# Rust
|
|
176
|
+
if (path / "Cargo.toml").exists():
|
|
177
|
+
return "cargo"
|
|
178
|
+
|
|
179
|
+
# Dart/Flutter
|
|
180
|
+
if (path / "pubspec.yaml").exists():
|
|
181
|
+
return "dart_pub"
|
|
182
|
+
|
|
183
|
+
# Swift
|
|
184
|
+
if (path / "Package.swift").exists():
|
|
185
|
+
return "spm"
|
|
186
|
+
|
|
187
|
+
# C#
|
|
188
|
+
if list(path.glob("*.csproj")) or list(path.glob("*.sln")):
|
|
189
|
+
return "dotnet"
|
|
190
|
+
|
|
191
|
+
# Python
|
|
192
|
+
if (path / "pyproject.toml").exists():
|
|
193
|
+
return "pip"
|
|
194
|
+
|
|
195
|
+
# JavaScript/TypeScript (check in priority order)
|
|
196
|
+
# Check for lock files and package managers
|
|
197
|
+
if (path / "bun.lockb").exists():
|
|
198
|
+
return "bun"
|
|
199
|
+
elif (path / "pnpm-lock.yaml").exists():
|
|
200
|
+
return "pnpm"
|
|
201
|
+
elif (path / "yarn.lock").exists():
|
|
202
|
+
return "yarn"
|
|
203
|
+
elif (path / "package-lock.json").exists():
|
|
204
|
+
return "npm"
|
|
205
|
+
elif (path / "package.json").exists():
|
|
206
|
+
# Default to npm for package.json without lock files
|
|
207
|
+
return "npm"
|
|
208
|
+
|
|
209
|
+
# Go
|
|
210
|
+
if (path / "go.mod").exists():
|
|
211
|
+
return "go_modules"
|
|
212
|
+
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
def detect_build_tool(self, path: str | Path = ".", language: str | None = None) -> str | None:
|
|
216
|
+
"""Detect the build tool for the detected language.
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
path: Directory to inspect.
|
|
221
|
+
language: Optional language hint for disambiguation.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
Build tool name or None if not detected.
|
|
225
|
+
"""
|
|
226
|
+
path = Path(path)
|
|
227
|
+
|
|
228
|
+
# C/C++
|
|
229
|
+
if (path / "CMakeLists.txt").exists():
|
|
230
|
+
return "cmake"
|
|
231
|
+
if (path / "Makefile").exists():
|
|
232
|
+
return "make"
|
|
233
|
+
|
|
234
|
+
# Java/Kotlin
|
|
235
|
+
if language in ["java", "kotlin"]:
|
|
236
|
+
if (path / "pom.xml").exists():
|
|
237
|
+
return "maven"
|
|
238
|
+
if (path / "build.gradle").exists() or (path / "build.gradle.kts").exists():
|
|
239
|
+
return "gradle"
|
|
240
|
+
|
|
241
|
+
# Rust
|
|
242
|
+
if (path / "Cargo.toml").exists():
|
|
243
|
+
return "cargo"
|
|
244
|
+
|
|
245
|
+
# Swift
|
|
246
|
+
if (path / "Package.swift").exists():
|
|
247
|
+
return "spm"
|
|
248
|
+
if list(path.glob("*.xcodeproj")) or list(path.glob("*.xcworkspace")):
|
|
249
|
+
return "xcode"
|
|
250
|
+
|
|
251
|
+
# C#
|
|
252
|
+
if list(path.glob("*.csproj")) or list(path.glob("*.sln")):
|
|
253
|
+
return "dotnet"
|
|
254
|
+
|
|
255
|
+
return None
|
|
256
|
+
|
|
257
|
+
def get_supported_languages_for_workflows(self) -> list[str]:
|
|
258
|
+
"""Get the list of languages with dedicated CI/CD workflow support.
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
List of supported language names (15 total).
|
|
263
|
+
"""
|
|
264
|
+
return [
|
|
265
|
+
"python",
|
|
266
|
+
"javascript",
|
|
267
|
+
"typescript",
|
|
268
|
+
"go",
|
|
269
|
+
"ruby",
|
|
270
|
+
"php",
|
|
271
|
+
"java",
|
|
272
|
+
"rust",
|
|
273
|
+
"dart",
|
|
274
|
+
"swift",
|
|
275
|
+
"kotlin",
|
|
276
|
+
"csharp",
|
|
277
|
+
"c",
|
|
278
|
+
"cpp",
|
|
279
|
+
"shell",
|
|
280
|
+
]
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def detect_project_language(path: str | Path = ".") -> str | None:
|
|
284
|
+
"""Detect the project language (helper).
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
path: Directory to inspect (default: current directory).
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
Detected language name (lowercase) or None.
|
|
291
|
+
"""
|
|
292
|
+
detector = LanguageDetector()
|
|
293
|
+
return detector.detect(path)
|