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
moai_adk/core/mcp/setup.py
CHANGED
|
@@ -52,9 +52,7 @@ class MCPSetupManager:
|
|
|
52
52
|
# Convert "command": "npx", "args": ["-y", "pkg"]
|
|
53
53
|
# to "command": "cmd", "args": ["/c", "npx", "-y", "pkg"]
|
|
54
54
|
server_config["command"] = "cmd"
|
|
55
|
-
server_config["args"] = ["/c", "npx"] + server_config.get(
|
|
56
|
-
"args", []
|
|
57
|
-
)
|
|
55
|
+
server_config["args"] = ["/c", "npx"] + server_config.get("args", [])
|
|
58
56
|
else:
|
|
59
57
|
server_config["command"] = adapted_command
|
|
60
58
|
|
|
@@ -89,9 +87,7 @@ class MCPSetupManager:
|
|
|
89
87
|
|
|
90
88
|
# Show platform info
|
|
91
89
|
if self.is_windows:
|
|
92
|
-
console.print(
|
|
93
|
-
"🪟 Windows platform detected - npx commands wrapped with 'cmd /c'"
|
|
94
|
-
)
|
|
90
|
+
console.print("🪟 Windows platform detected - npx commands wrapped with 'cmd /c'")
|
|
95
91
|
|
|
96
92
|
console.print(f"📋 Configured servers: {', '.join(server_names)}")
|
|
97
93
|
return True
|
|
@@ -103,11 +99,18 @@ class MCPSetupManager:
|
|
|
103
99
|
console.print(f"❌ Failed to copy MCP configuration: {e}")
|
|
104
100
|
return False
|
|
105
101
|
|
|
106
|
-
def setup_mcp_servers(self, selected_servers: list[str]) -> bool:
|
|
107
|
-
"""
|
|
108
|
-
if not selected_servers:
|
|
109
|
-
console.print("ℹ️ No MCP servers selected")
|
|
110
|
-
return True
|
|
102
|
+
def setup_mcp_servers(self, selected_servers: list[str] | None = None) -> bool:
|
|
103
|
+
"""Copy MCP server template to project
|
|
111
104
|
|
|
112
|
-
|
|
105
|
+
This method copies ALL MCP servers from the package template to .mcp.json.
|
|
106
|
+
Server selection happens in settings.local.json via enabledMcpjsonServers array.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
selected_servers: Deprecated parameter (ignored, kept for backward compatibility)
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
True if setup successful, False otherwise
|
|
113
|
+
"""
|
|
114
|
+
# This method now only copies the full template
|
|
115
|
+
# User selection is done via settings.local.json
|
|
113
116
|
return self.copy_template_mcp_config()
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
"""Claude Code Headless-based Merge Analyzer
|
|
2
|
+
|
|
3
|
+
Analyzes template merge differences using Claude Code headless mode
|
|
4
|
+
for intelligent backup vs new template comparison and recommendations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
import re
|
|
10
|
+
import subprocess
|
|
11
|
+
from difflib import unified_diff
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
import click
|
|
16
|
+
from rich.console import Console
|
|
17
|
+
from rich.live import Live
|
|
18
|
+
from rich.spinner import Spinner
|
|
19
|
+
from rich.table import Table
|
|
20
|
+
|
|
21
|
+
console = Console()
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class MergeAnalyzer:
|
|
26
|
+
"""Merge analyzer using Claude Code for intelligent template merge analysis
|
|
27
|
+
|
|
28
|
+
Compares backed-up user configurations with new templates,
|
|
29
|
+
analyzes them using Claude AI, and provides merge recommendations.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
# Primary files to analyze
|
|
33
|
+
ANALYZED_FILES = [
|
|
34
|
+
"CLAUDE.md",
|
|
35
|
+
".claude/settings.json",
|
|
36
|
+
".moai/config/config.json",
|
|
37
|
+
".gitignore",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
# Claude headless execution settings
|
|
41
|
+
CLAUDE_TIMEOUT = 120 # Maximum 2 minutes
|
|
42
|
+
CLAUDE_MODEL = "claude-haiku-4-5-20251001" # Latest Haiku (cost optimized)
|
|
43
|
+
CLAUDE_TOOLS = ["Read", "Glob", "Grep"] # Read-only tools
|
|
44
|
+
|
|
45
|
+
def __init__(self, project_path: Path):
|
|
46
|
+
"""Initialize analyzer with project path."""
|
|
47
|
+
self.project_path = project_path
|
|
48
|
+
|
|
49
|
+
def analyze_merge(self, backup_path: Path, template_path: Path) -> dict[str, Any]:
|
|
50
|
+
"""Perform merge analysis using Claude Code headless mode
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
backup_path: Path to backed-up configuration directory
|
|
54
|
+
template_path: Path to new template directory
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Dictionary containing analysis results:
|
|
58
|
+
- files: List of changes by file
|
|
59
|
+
- safe_to_auto_merge: Whether auto-merge is safe
|
|
60
|
+
- user_action_required: Whether user intervention is needed
|
|
61
|
+
- summary: Overall summary
|
|
62
|
+
- error: Error message (if any)
|
|
63
|
+
"""
|
|
64
|
+
# 1. Collect files to compare
|
|
65
|
+
diff_files = self._collect_diff_files(backup_path, template_path)
|
|
66
|
+
|
|
67
|
+
# 2. Create Claude headless prompt
|
|
68
|
+
prompt = self._create_analysis_prompt(backup_path, template_path, diff_files)
|
|
69
|
+
|
|
70
|
+
# 3. Run Claude Code headless (show spinner)
|
|
71
|
+
spinner = Spinner("dots", text="[cyan]Running Claude Code analysis...[/cyan]")
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
with Live(spinner, refresh_per_second=12):
|
|
75
|
+
result = subprocess.run(
|
|
76
|
+
self._build_claude_command(),
|
|
77
|
+
input=prompt,
|
|
78
|
+
capture_output=True,
|
|
79
|
+
text=True,
|
|
80
|
+
timeout=self.CLAUDE_TIMEOUT,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if result.returncode == 0:
|
|
84
|
+
# Use new response parsing method
|
|
85
|
+
analysis = self._parse_claude_response(result.stdout)
|
|
86
|
+
if "error" not in analysis:
|
|
87
|
+
console.print("[green]✅ Analysis complete[/green]")
|
|
88
|
+
return analysis
|
|
89
|
+
else:
|
|
90
|
+
console.print(f"[yellow]⚠️ Analysis failed: {analysis.get('summary', 'Unknown error')}[/yellow]")
|
|
91
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
92
|
+
else:
|
|
93
|
+
# Use improved error detection
|
|
94
|
+
error_msg = self._detect_claude_errors(result.stderr)
|
|
95
|
+
console.print(f"[yellow]⚠️ Claude execution error: {error_msg}[/yellow]")
|
|
96
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
97
|
+
|
|
98
|
+
except subprocess.TimeoutExpired:
|
|
99
|
+
console.print("[yellow]⚠️ Claude analysis timeout (exceeded 120 seconds)[/yellow]")
|
|
100
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
101
|
+
except FileNotFoundError:
|
|
102
|
+
console.print("[red]❌ Claude Code not found.[/red]")
|
|
103
|
+
console.print("[cyan] Install Claude Code: https://claude.com/claude-code[/cyan]")
|
|
104
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
105
|
+
|
|
106
|
+
def ask_user_confirmation(self, analysis: dict[str, Any]) -> bool:
|
|
107
|
+
"""Display analysis results and request user confirmation
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
analysis: Result from analyze_merge()
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
True: Proceed, False: Cancel
|
|
114
|
+
"""
|
|
115
|
+
# 1. Display analysis results
|
|
116
|
+
self._display_analysis(analysis)
|
|
117
|
+
|
|
118
|
+
# 2. User confirmation
|
|
119
|
+
if analysis.get("user_action_required", False):
|
|
120
|
+
console.print(
|
|
121
|
+
"\n⚠️ User intervention required. Please review the following:",
|
|
122
|
+
style="warning",
|
|
123
|
+
)
|
|
124
|
+
for file_info in analysis.get("files", []):
|
|
125
|
+
if file_info.get("conflict_severity") in ["medium", "high"]:
|
|
126
|
+
console.print(
|
|
127
|
+
f" • {file_info['filename']}: {file_info.get('note', '')}",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# 3. Confirmation prompt
|
|
131
|
+
proceed = click.confirm(
|
|
132
|
+
"\nProceed with merge?",
|
|
133
|
+
default=analysis.get("safe_to_auto_merge", False),
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
return proceed
|
|
137
|
+
|
|
138
|
+
def _collect_diff_files(self, backup_path: Path, template_path: Path) -> dict[str, dict[str, Any]]:
|
|
139
|
+
"""Collect differences between backup and template files
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
Dictionary with diff information per file
|
|
143
|
+
"""
|
|
144
|
+
diff_files = {}
|
|
145
|
+
|
|
146
|
+
for file_name in self.ANALYZED_FILES:
|
|
147
|
+
backup_file = backup_path / file_name
|
|
148
|
+
template_file = template_path / file_name
|
|
149
|
+
|
|
150
|
+
if not backup_file.exists() and not template_file.exists():
|
|
151
|
+
continue
|
|
152
|
+
|
|
153
|
+
diff_info = {
|
|
154
|
+
"backup_exists": backup_file.exists(),
|
|
155
|
+
"template_exists": template_file.exists(),
|
|
156
|
+
"has_diff": False,
|
|
157
|
+
"diff_lines": 0,
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if backup_file.exists() and template_file.exists():
|
|
161
|
+
backup_content = backup_file.read_text(encoding="utf-8")
|
|
162
|
+
template_content = template_file.read_text(encoding="utf-8")
|
|
163
|
+
|
|
164
|
+
if backup_content != template_content:
|
|
165
|
+
diff = list(
|
|
166
|
+
unified_diff(
|
|
167
|
+
backup_content.splitlines(),
|
|
168
|
+
template_content.splitlines(),
|
|
169
|
+
lineterm="",
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
diff_info["has_diff"] = True
|
|
173
|
+
diff_info["diff_lines"] = len(diff)
|
|
174
|
+
|
|
175
|
+
diff_files[file_name] = diff_info
|
|
176
|
+
|
|
177
|
+
return diff_files
|
|
178
|
+
|
|
179
|
+
def _create_analysis_prompt(
|
|
180
|
+
self,
|
|
181
|
+
backup_path: Path,
|
|
182
|
+
template_path: Path,
|
|
183
|
+
diff_files: dict[str, dict[str, Any]],
|
|
184
|
+
) -> str:
|
|
185
|
+
"""Generate Claude headless analysis prompt
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
Analysis prompt to send to Claude
|
|
189
|
+
"""
|
|
190
|
+
return f"""You are a MoAI-ADK configuration file merge expert.
|
|
191
|
+
|
|
192
|
+
## Context
|
|
193
|
+
- Backed-up user configuration: {backup_path}
|
|
194
|
+
- New template: {template_path}
|
|
195
|
+
- Files to analyze: {", ".join(self.ANALYZED_FILES)}
|
|
196
|
+
|
|
197
|
+
## Files to Analyze
|
|
198
|
+
{self._format_diff_summary(diff_files)}
|
|
199
|
+
|
|
200
|
+
## Analysis Tasks
|
|
201
|
+
Analyze the following items and provide a JSON response:
|
|
202
|
+
|
|
203
|
+
1. Identify changes per file
|
|
204
|
+
2. Assess conflict risk (low/medium/high)
|
|
205
|
+
3. Merge recommendations (use_template/keep_existing/smart_merge)
|
|
206
|
+
4. Overall safety assessment
|
|
207
|
+
|
|
208
|
+
## Response Format (JSON)
|
|
209
|
+
{{
|
|
210
|
+
"files": [
|
|
211
|
+
{{
|
|
212
|
+
"filename": "CLAUDE.md",
|
|
213
|
+
"changes": "Description of changes",
|
|
214
|
+
"recommendation": "use_template|keep_existing|smart_merge",
|
|
215
|
+
"conflict_severity": "low|medium|high",
|
|
216
|
+
"note": "Additional notes (optional)"
|
|
217
|
+
}}
|
|
218
|
+
],
|
|
219
|
+
"safe_to_auto_merge": true/false,
|
|
220
|
+
"user_action_required": true/false,
|
|
221
|
+
"summary": "Whether merge is safe and why",
|
|
222
|
+
"risk_assessment": "Risk assessment"
|
|
223
|
+
}}
|
|
224
|
+
|
|
225
|
+
## Merge Rules Reference
|
|
226
|
+
- CLAUDE.md: Preserve Project Information section
|
|
227
|
+
- settings.json: Merge env variables, prioritize template permissions.deny
|
|
228
|
+
- config.json: Preserve user metadata, update schema
|
|
229
|
+
- .gitignore: Additions only (preserve existing items)
|
|
230
|
+
|
|
231
|
+
## Additional Considerations
|
|
232
|
+
- Assess risk of user customization loss
|
|
233
|
+
- Determine if force overwriting Alfred infrastructure files
|
|
234
|
+
- Review rollback possibilities
|
|
235
|
+
"""
|
|
236
|
+
|
|
237
|
+
def _display_analysis(self, analysis: dict[str, Any]) -> None:
|
|
238
|
+
"""Display analysis results in Rich format"""
|
|
239
|
+
# Title
|
|
240
|
+
console.print("\n📊 Merge Analysis Results (Claude Code)", style="bold")
|
|
241
|
+
|
|
242
|
+
# Summary
|
|
243
|
+
summary = analysis.get("summary", "No analysis results")
|
|
244
|
+
console.print(f"\n📝 {summary}")
|
|
245
|
+
|
|
246
|
+
# Risk assessment
|
|
247
|
+
risk_assessment = analysis.get("risk_assessment", "")
|
|
248
|
+
if risk_assessment:
|
|
249
|
+
risk_style = "green" if "safe" in risk_assessment.lower() else "yellow"
|
|
250
|
+
console.print(f"⚠️ Risk Level: {risk_assessment}", style=risk_style)
|
|
251
|
+
|
|
252
|
+
# Changes by file table
|
|
253
|
+
files_list = analysis.get("files")
|
|
254
|
+
if files_list and isinstance(files_list, list):
|
|
255
|
+
table = Table(title="Changes by File")
|
|
256
|
+
table.add_column("File", style="cyan")
|
|
257
|
+
table.add_column("Changes", style="white")
|
|
258
|
+
table.add_column("Recommendation", style="yellow")
|
|
259
|
+
table.add_column("Risk", style="red")
|
|
260
|
+
|
|
261
|
+
for file_info in files_list:
|
|
262
|
+
# Ensure file_info is a dictionary
|
|
263
|
+
if not isinstance(file_info, dict):
|
|
264
|
+
continue
|
|
265
|
+
|
|
266
|
+
severity_style = {
|
|
267
|
+
"low": "green",
|
|
268
|
+
"medium": "yellow",
|
|
269
|
+
"high": "red",
|
|
270
|
+
}.get(file_info.get("conflict_severity", "low"), "white")
|
|
271
|
+
|
|
272
|
+
table.add_row(
|
|
273
|
+
file_info.get("filename", "?"),
|
|
274
|
+
file_info.get("changes", "")[:30],
|
|
275
|
+
file_info.get("recommendation", "?"),
|
|
276
|
+
file_info.get("conflict_severity", "?"),
|
|
277
|
+
style=severity_style,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
console.print(table)
|
|
281
|
+
|
|
282
|
+
# Additional details
|
|
283
|
+
for file_info in files_list:
|
|
284
|
+
# Ensure file_info is a dictionary
|
|
285
|
+
if not isinstance(file_info, dict):
|
|
286
|
+
continue
|
|
287
|
+
|
|
288
|
+
if file_info.get("note"):
|
|
289
|
+
console.print(
|
|
290
|
+
f"\n💡 {file_info['filename']}: {file_info['note']}",
|
|
291
|
+
style="dim",
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
def _parse_claude_response(self, response_text: str) -> dict[str, Any]:
|
|
295
|
+
"""Parse Claude Code response supporting both v1.x and v2.0+ formats.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
response_text: Raw response text from Claude Code
|
|
299
|
+
|
|
300
|
+
Returns:
|
|
301
|
+
Parsed analysis dictionary
|
|
302
|
+
"""
|
|
303
|
+
try:
|
|
304
|
+
# First try direct JSON parsing (v1.x format)
|
|
305
|
+
return json.loads(response_text)
|
|
306
|
+
except json.JSONDecodeError:
|
|
307
|
+
# Try v2.0+ wrapped format
|
|
308
|
+
try:
|
|
309
|
+
# Look for JSON in the response
|
|
310
|
+
if '"type":' in response_text and '"result":' in response_text:
|
|
311
|
+
# Parse the wrapped v2.0+ format
|
|
312
|
+
response_obj = json.loads(response_text)
|
|
313
|
+
if "result" in response_obj:
|
|
314
|
+
result_text = response_obj["result"]
|
|
315
|
+
|
|
316
|
+
# Try to extract JSON from the result field
|
|
317
|
+
if isinstance(result_text, str):
|
|
318
|
+
# Look for JSON blocks in the result
|
|
319
|
+
if "```json" in result_text:
|
|
320
|
+
# Extract JSON from code block
|
|
321
|
+
start = result_text.find("```json") + 7
|
|
322
|
+
end = result_text.find("```", start)
|
|
323
|
+
if end != -1:
|
|
324
|
+
json_text = result_text[start:end].strip()
|
|
325
|
+
return json.loads(json_text)
|
|
326
|
+
elif result_text.strip().startswith("{"):
|
|
327
|
+
# Try direct JSON parsing
|
|
328
|
+
return json.loads(result_text)
|
|
329
|
+
else:
|
|
330
|
+
# Try to find JSON pattern in text
|
|
331
|
+
json_match = re.search(r"\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}", result_text)
|
|
332
|
+
if json_match:
|
|
333
|
+
try:
|
|
334
|
+
return json.loads(json_match.group(0))
|
|
335
|
+
except json.JSONDecodeError:
|
|
336
|
+
pass
|
|
337
|
+
|
|
338
|
+
# Fallback: try to find any JSON in the text
|
|
339
|
+
json_match = re.search(r"\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}", response_text)
|
|
340
|
+
if json_match:
|
|
341
|
+
return json.loads(json_match.group(0))
|
|
342
|
+
|
|
343
|
+
except (json.JSONDecodeError, KeyError, TypeError) as e:
|
|
344
|
+
console.print(f"[yellow]⚠️ Failed to parse Claude v2.0+ response: {e}[/yellow]")
|
|
345
|
+
logger.warning(f"Claude response parsing failed: {e}")
|
|
346
|
+
|
|
347
|
+
# If all parsing attempts fail, return error structure
|
|
348
|
+
logger.error(f"Could not parse Claude response. Raw response: {response_text[:500]}...")
|
|
349
|
+
return {
|
|
350
|
+
"files": [],
|
|
351
|
+
"safe_to_auto_merge": False,
|
|
352
|
+
"user_action_required": True,
|
|
353
|
+
"summary": "Failed to parse Claude response",
|
|
354
|
+
"risk_assessment": "High - Response parsing failed",
|
|
355
|
+
"error": "response_parse_failed",
|
|
356
|
+
"raw_response": response_text[:500] if response_text else "",
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
def _detect_claude_errors(self, stderr: str) -> str:
|
|
360
|
+
"""Detect and interpret Claude Code specific errors.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
stderr: Standard error output from Claude Code
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
User-friendly error message
|
|
367
|
+
"""
|
|
368
|
+
if not stderr:
|
|
369
|
+
return ""
|
|
370
|
+
|
|
371
|
+
error_lower = stderr.lower()
|
|
372
|
+
|
|
373
|
+
if "model not found" in error_lower or "unknown model" in error_lower:
|
|
374
|
+
return f"Claude model '{self.CLAUDE_MODEL}' not found. Please check available models with 'claude --models'"
|
|
375
|
+
|
|
376
|
+
if "permission denied" in error_lower:
|
|
377
|
+
return "Permission denied. Check file permissions and Claude Code access rights."
|
|
378
|
+
|
|
379
|
+
if "timeout" in error_lower:
|
|
380
|
+
return f"Claude analysis timed out after {self.CLAUDE_TIMEOUT} seconds. Consider increasing timeout."
|
|
381
|
+
|
|
382
|
+
if "file not found" in error_lower:
|
|
383
|
+
return "Required files not found. Check project structure and file paths."
|
|
384
|
+
|
|
385
|
+
if "invalid argument" in error_lower or "unknown option" in error_lower:
|
|
386
|
+
return "Invalid Claude Code arguments. This might be a version compatibility issue."
|
|
387
|
+
|
|
388
|
+
# Return generic error if no specific pattern matches
|
|
389
|
+
return f"Claude Code error: {stderr[:200]}"
|
|
390
|
+
|
|
391
|
+
def _build_claude_command(self) -> list[str]:
|
|
392
|
+
"""Build Claude Code headless command (based on official v4.0+)
|
|
393
|
+
|
|
394
|
+
Claude Code CLI official options:
|
|
395
|
+
- -p: Non-interactive headless mode
|
|
396
|
+
- --model: Explicit model selection (Haiku)
|
|
397
|
+
- --output-format: JSON response format
|
|
398
|
+
- --tools: Read-only tools only (space-separated - POSIX standard)
|
|
399
|
+
- --permission-mode: Auto-approval (background task)
|
|
400
|
+
|
|
401
|
+
Returns:
|
|
402
|
+
List of Claude CLI command arguments
|
|
403
|
+
"""
|
|
404
|
+
# Tools list space-separated (POSIX standard, officially recommended)
|
|
405
|
+
tools_str = " ".join(self.CLAUDE_TOOLS)
|
|
406
|
+
|
|
407
|
+
return [
|
|
408
|
+
"claude",
|
|
409
|
+
"-p", # Non-interactive headless mode
|
|
410
|
+
"--model",
|
|
411
|
+
self.CLAUDE_MODEL, # Explicit model specification (Haiku)
|
|
412
|
+
"--output-format",
|
|
413
|
+
"json", # Single JSON response
|
|
414
|
+
"--tools",
|
|
415
|
+
tools_str, # Space-separated (Read Glob Grep)
|
|
416
|
+
"--permission-mode",
|
|
417
|
+
"dontAsk", # Auto-approval (safe, read-only)
|
|
418
|
+
]
|
|
419
|
+
|
|
420
|
+
def _format_diff_summary(self, diff_files: dict[str, dict[str, Any]]) -> str:
|
|
421
|
+
"""Format diff_files for prompt"""
|
|
422
|
+
summary = []
|
|
423
|
+
for file_name, info in diff_files.items():
|
|
424
|
+
if info["backup_exists"] and info["template_exists"]:
|
|
425
|
+
status = f"✏️ Modified ({info['diff_lines']} lines)" if info["has_diff"] else "✓ Identical"
|
|
426
|
+
elif info["backup_exists"]:
|
|
427
|
+
status = "❌ Deleted from template"
|
|
428
|
+
else:
|
|
429
|
+
status = "✨ New file (from template)"
|
|
430
|
+
|
|
431
|
+
summary.append(f"- {file_name}: {status}")
|
|
432
|
+
|
|
433
|
+
return "\n".join(summary)
|
|
434
|
+
|
|
435
|
+
def _fallback_analysis(
|
|
436
|
+
self,
|
|
437
|
+
backup_path: Path,
|
|
438
|
+
template_path: Path,
|
|
439
|
+
diff_files: dict[str, dict[str, Any]],
|
|
440
|
+
) -> dict[str, Any]:
|
|
441
|
+
"""Fallback analysis when Claude call fails (difflib-based)
|
|
442
|
+
|
|
443
|
+
Returns basic analysis results when Claude is unavailable
|
|
444
|
+
"""
|
|
445
|
+
console.print(
|
|
446
|
+
"⚠️ Claude Code unavailable. Using fallback analysis.",
|
|
447
|
+
style="yellow",
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
files_analysis = []
|
|
451
|
+
has_high_risk = False
|
|
452
|
+
|
|
453
|
+
for file_name, info in diff_files.items():
|
|
454
|
+
if not info["has_diff"]:
|
|
455
|
+
continue
|
|
456
|
+
|
|
457
|
+
# Simple risk assessment
|
|
458
|
+
severity = "low"
|
|
459
|
+
if file_name in [".claude/settings.json", ".moai/config/config.json"]:
|
|
460
|
+
severity = "medium" if info["diff_lines"] > 10 else "low"
|
|
461
|
+
|
|
462
|
+
files_analysis.append(
|
|
463
|
+
{
|
|
464
|
+
"filename": file_name,
|
|
465
|
+
"changes": f"{info['diff_lines']} lines changed",
|
|
466
|
+
"recommendation": "smart_merge",
|
|
467
|
+
"conflict_severity": severity,
|
|
468
|
+
}
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
if severity == "high":
|
|
472
|
+
has_high_risk = True
|
|
473
|
+
|
|
474
|
+
return {
|
|
475
|
+
"files": files_analysis,
|
|
476
|
+
"safe_to_auto_merge": not has_high_risk,
|
|
477
|
+
"user_action_required": has_high_risk,
|
|
478
|
+
"summary": f"{len(files_analysis)} files changed (fallback analysis)",
|
|
479
|
+
"risk_assessment": ("High - Claude unavailable, manual review recommended" if has_high_risk else "Low"),
|
|
480
|
+
"fallback": True,
|
|
481
|
+
}
|