moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
"""MoAI-ADK CLI Prompt Components
|
|
2
|
+
|
|
3
|
+
Modern interactive prompts using InquirerPy with fuzzy search support.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import Any, Callable, Dict, List, Optional, Sequence, Union
|
|
7
|
+
|
|
8
|
+
from InquirerPy import inquirer
|
|
9
|
+
from InquirerPy.base.control import Choice, Separator
|
|
10
|
+
from InquirerPy.utils import get_style
|
|
11
|
+
from InquirerPy.validator import EmptyInputValidator
|
|
12
|
+
|
|
13
|
+
from .theme import MOAI_THEME, SYMBOLS
|
|
14
|
+
|
|
15
|
+
# Pre-create InquirerPy compatible style
|
|
16
|
+
_INQUIRER_STYLE = get_style(MOAI_THEME, style_override=False)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def fuzzy_checkbox(
|
|
20
|
+
message: str,
|
|
21
|
+
choices: Sequence[Union[str, Dict[str, Any], Choice, Separator]],
|
|
22
|
+
default: Optional[List[Any]] = None,
|
|
23
|
+
instruction: str = "[Space] Toggle [Tab] Toggle All [Enter] Confirm [/] Search",
|
|
24
|
+
multiselect: bool = True,
|
|
25
|
+
marker: str = SYMBOLS["checkbox_selected"], # type: ignore[assignment]
|
|
26
|
+
marker_pl: str = " ",
|
|
27
|
+
border: bool = True,
|
|
28
|
+
height: Optional[int] = None,
|
|
29
|
+
max_height: int = 15,
|
|
30
|
+
validate: Optional[Callable[[List[Any]], bool]] = None,
|
|
31
|
+
invalid_message: str = "Please select at least one item",
|
|
32
|
+
keybindings: Optional[Dict[str, List[Dict[str, str]]]] = None,
|
|
33
|
+
) -> Optional[List[Any]]:
|
|
34
|
+
"""Display a fuzzy searchable checkbox prompt.
|
|
35
|
+
|
|
36
|
+
Allows users to search through choices while selecting multiple items.
|
|
37
|
+
Perfect for selecting files from a large list.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
message: Question to display
|
|
41
|
+
choices: List of choices (strings, dicts, or Choice objects)
|
|
42
|
+
default: Pre-selected values
|
|
43
|
+
instruction: Help text shown below prompt
|
|
44
|
+
multiselect: Allow multiple selections (always True for checkbox)
|
|
45
|
+
marker: Symbol for selected items
|
|
46
|
+
marker_pl: Placeholder for unselected items
|
|
47
|
+
border: Show border around choices
|
|
48
|
+
height: Fixed height (None for auto)
|
|
49
|
+
max_height: Maximum height when auto
|
|
50
|
+
validate: Custom validation function
|
|
51
|
+
invalid_message: Message when validation fails
|
|
52
|
+
keybindings: Custom key bindings
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
List of selected values, or None if cancelled
|
|
56
|
+
|
|
57
|
+
Example:
|
|
58
|
+
>>> files = fuzzy_checkbox(
|
|
59
|
+
... "Select files to restore:",
|
|
60
|
+
... choices=[
|
|
61
|
+
... {"name": "commands/auth.md", "value": "commands/auth.md"},
|
|
62
|
+
... {"name": "agents/backend.md", "value": "agents/backend.md"},
|
|
63
|
+
... ]
|
|
64
|
+
... )
|
|
65
|
+
"""
|
|
66
|
+
# Convert simple strings to Choice objects
|
|
67
|
+
processed_choices = _process_choices(list(choices), default)
|
|
68
|
+
|
|
69
|
+
# Set up default keybindings if not provided
|
|
70
|
+
if keybindings is None:
|
|
71
|
+
keybindings = {
|
|
72
|
+
"toggle": [{"key": "space"}],
|
|
73
|
+
"toggle-all": [{"key": "tab"}],
|
|
74
|
+
"toggle-all-true": [{"key": "a"}],
|
|
75
|
+
"toggle-all-false": [{"key": "n"}],
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
result = inquirer.fuzzy(
|
|
80
|
+
message=message,
|
|
81
|
+
choices=processed_choices,
|
|
82
|
+
multiselect=multiselect,
|
|
83
|
+
marker=marker,
|
|
84
|
+
marker_pl=marker_pl,
|
|
85
|
+
border=border,
|
|
86
|
+
info=True,
|
|
87
|
+
match_exact=False,
|
|
88
|
+
instruction=instruction,
|
|
89
|
+
long_instruction="",
|
|
90
|
+
max_height=max_height if height is None else height,
|
|
91
|
+
validate=validate,
|
|
92
|
+
invalid_message=invalid_message,
|
|
93
|
+
keybindings=keybindings, # type: ignore[arg-type]
|
|
94
|
+
style=_INQUIRER_STYLE,
|
|
95
|
+
qmark=SYMBOLS["pointer"],
|
|
96
|
+
amark=SYMBOLS["success"],
|
|
97
|
+
transformer=lambda x: f"{len(x)} selected" if isinstance(x, list) else x,
|
|
98
|
+
).execute()
|
|
99
|
+
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
except KeyboardInterrupt:
|
|
103
|
+
return None
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def fuzzy_select(
|
|
107
|
+
message: str,
|
|
108
|
+
choices: Sequence[Union[str, Dict[str, Any], Choice, Separator]],
|
|
109
|
+
default: Optional[Any] = None,
|
|
110
|
+
instruction: str = "[↑↓] Navigate [Enter] Select [/] Search",
|
|
111
|
+
border: bool = True,
|
|
112
|
+
max_height: int = 10,
|
|
113
|
+
) -> Optional[Any]:
|
|
114
|
+
"""Display a fuzzy searchable single-select prompt.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
message: Question to display
|
|
118
|
+
choices: List of choices
|
|
119
|
+
default: Pre-selected value
|
|
120
|
+
instruction: Help text
|
|
121
|
+
border: Show border around choices
|
|
122
|
+
max_height: Maximum display height
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Selected value, or None if cancelled
|
|
126
|
+
"""
|
|
127
|
+
processed_choices = _process_choices(list(choices), [default] if default else None)
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
result = inquirer.fuzzy(
|
|
131
|
+
message=message,
|
|
132
|
+
choices=processed_choices,
|
|
133
|
+
multiselect=False,
|
|
134
|
+
border=border,
|
|
135
|
+
info=True,
|
|
136
|
+
match_exact=False,
|
|
137
|
+
instruction=instruction,
|
|
138
|
+
max_height=max_height,
|
|
139
|
+
style=_INQUIRER_STYLE,
|
|
140
|
+
qmark=SYMBOLS["pointer"],
|
|
141
|
+
amark=SYMBOLS["success"],
|
|
142
|
+
).execute()
|
|
143
|
+
|
|
144
|
+
return result
|
|
145
|
+
|
|
146
|
+
except KeyboardInterrupt:
|
|
147
|
+
return None
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def styled_checkbox(
|
|
151
|
+
message: str,
|
|
152
|
+
choices: Sequence[Union[str, Dict[str, Any], Choice, Separator]],
|
|
153
|
+
default: Optional[List[Any]] = None,
|
|
154
|
+
instruction: str = "[Space] Toggle [a] All [n] None [Enter] Confirm",
|
|
155
|
+
cycle: bool = True,
|
|
156
|
+
) -> Optional[List[Any]]:
|
|
157
|
+
"""Display a styled checkbox prompt without fuzzy search.
|
|
158
|
+
|
|
159
|
+
Use this for shorter lists where fuzzy search isn't needed.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
message: Question to display
|
|
163
|
+
choices: List of choices
|
|
164
|
+
default: Pre-selected values
|
|
165
|
+
instruction: Help text
|
|
166
|
+
cycle: Whether to cycle through choices
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
List of selected values, or None if cancelled
|
|
170
|
+
"""
|
|
171
|
+
processed_choices = _process_choices(list(choices), default)
|
|
172
|
+
|
|
173
|
+
try:
|
|
174
|
+
result = inquirer.checkbox(
|
|
175
|
+
message=message,
|
|
176
|
+
choices=processed_choices,
|
|
177
|
+
cycle=cycle,
|
|
178
|
+
instruction=instruction,
|
|
179
|
+
style=_INQUIRER_STYLE,
|
|
180
|
+
qmark=SYMBOLS["pointer"],
|
|
181
|
+
amark=SYMBOLS["success"],
|
|
182
|
+
enabled_symbol=SYMBOLS["checkbox_selected"],
|
|
183
|
+
disabled_symbol=SYMBOLS["checkbox_unselected"],
|
|
184
|
+
transformer=lambda x: f"{len(x)} selected" if isinstance(x, list) else x,
|
|
185
|
+
).execute()
|
|
186
|
+
|
|
187
|
+
return result
|
|
188
|
+
|
|
189
|
+
except KeyboardInterrupt:
|
|
190
|
+
return None
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def styled_select(
|
|
194
|
+
message: str,
|
|
195
|
+
choices: Sequence[Union[str, Dict[str, Any], Choice, Separator]],
|
|
196
|
+
default: Optional[Any] = None,
|
|
197
|
+
instruction: str = "[↑↓] Navigate [Enter] Select",
|
|
198
|
+
cycle: bool = True,
|
|
199
|
+
) -> Optional[Any]:
|
|
200
|
+
"""Display a styled single-select prompt.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
message: Question to display
|
|
204
|
+
choices: List of choices
|
|
205
|
+
default: Pre-selected value
|
|
206
|
+
instruction: Help text
|
|
207
|
+
cycle: Whether to cycle through choices
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
Selected value, or None if cancelled
|
|
211
|
+
"""
|
|
212
|
+
processed_choices = _process_choices(list(choices), [default] if default else None)
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
result = inquirer.select(
|
|
216
|
+
message=message,
|
|
217
|
+
choices=processed_choices,
|
|
218
|
+
default=default,
|
|
219
|
+
cycle=cycle,
|
|
220
|
+
instruction=instruction,
|
|
221
|
+
style=_INQUIRER_STYLE,
|
|
222
|
+
qmark=SYMBOLS["pointer"],
|
|
223
|
+
amark=SYMBOLS["success"],
|
|
224
|
+
pointer=SYMBOLS["pointer"],
|
|
225
|
+
).execute()
|
|
226
|
+
|
|
227
|
+
return result
|
|
228
|
+
|
|
229
|
+
except KeyboardInterrupt:
|
|
230
|
+
return None
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def styled_input(
|
|
234
|
+
message: str,
|
|
235
|
+
default: str = "",
|
|
236
|
+
validate: Optional[Callable[[str], bool]] = None,
|
|
237
|
+
invalid_message: str = "Invalid input",
|
|
238
|
+
required: bool = True,
|
|
239
|
+
instruction: str = "",
|
|
240
|
+
) -> Optional[str]:
|
|
241
|
+
"""Display a styled text input prompt.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
message: Question to display
|
|
245
|
+
default: Default value
|
|
246
|
+
validate: Custom validation function
|
|
247
|
+
invalid_message: Message when validation fails
|
|
248
|
+
required: Whether input is required
|
|
249
|
+
instruction: Help text
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
User input, or None if cancelled
|
|
253
|
+
"""
|
|
254
|
+
validators = []
|
|
255
|
+
if required:
|
|
256
|
+
validators.append(EmptyInputValidator("This field is required"))
|
|
257
|
+
|
|
258
|
+
try:
|
|
259
|
+
result = inquirer.text(
|
|
260
|
+
message=message,
|
|
261
|
+
default=default,
|
|
262
|
+
validate=validate,
|
|
263
|
+
invalid_message=invalid_message,
|
|
264
|
+
instruction=instruction,
|
|
265
|
+
style=_INQUIRER_STYLE,
|
|
266
|
+
qmark=SYMBOLS["pointer"],
|
|
267
|
+
amark=SYMBOLS["success"],
|
|
268
|
+
).execute()
|
|
269
|
+
|
|
270
|
+
return result
|
|
271
|
+
|
|
272
|
+
except KeyboardInterrupt:
|
|
273
|
+
return None
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def styled_confirm(
|
|
277
|
+
message: str,
|
|
278
|
+
default: bool = True,
|
|
279
|
+
instruction: str = "[y/n]",
|
|
280
|
+
) -> Optional[bool]:
|
|
281
|
+
"""Display a styled confirmation prompt.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
message: Question to display
|
|
285
|
+
default: Default value (True = yes, False = no)
|
|
286
|
+
instruction: Help text
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
True/False, or None if cancelled
|
|
290
|
+
"""
|
|
291
|
+
try:
|
|
292
|
+
result = inquirer.confirm(
|
|
293
|
+
message=message,
|
|
294
|
+
default=default,
|
|
295
|
+
instruction=instruction,
|
|
296
|
+
style=_INQUIRER_STYLE,
|
|
297
|
+
qmark=SYMBOLS["pointer"],
|
|
298
|
+
amark=SYMBOLS["success"],
|
|
299
|
+
).execute()
|
|
300
|
+
|
|
301
|
+
return result
|
|
302
|
+
|
|
303
|
+
except KeyboardInterrupt:
|
|
304
|
+
return None
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _process_choices(
|
|
308
|
+
choices: List[Union[str, Dict[str, Any], Choice, Separator]],
|
|
309
|
+
defaults: Optional[List[Any]] = None,
|
|
310
|
+
) -> List[Union[Choice, Separator]]:
|
|
311
|
+
"""Process and normalize choices for InquirerPy prompts.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
choices: Raw choices list
|
|
315
|
+
defaults: Values that should be pre-selected
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
List of Choice/Separator objects
|
|
319
|
+
"""
|
|
320
|
+
defaults = defaults or []
|
|
321
|
+
processed: List[Union[Choice, Separator]] = []
|
|
322
|
+
|
|
323
|
+
for choice in choices:
|
|
324
|
+
if isinstance(choice, (Choice, Separator)):
|
|
325
|
+
# Already a Choice or Separator object
|
|
326
|
+
processed.append(choice)
|
|
327
|
+
|
|
328
|
+
elif isinstance(choice, dict):
|
|
329
|
+
# Dictionary with name/value
|
|
330
|
+
name = choice.get("name", choice.get("title", ""))
|
|
331
|
+
value = choice.get("value", name)
|
|
332
|
+
enabled = choice.get("enabled", value in defaults)
|
|
333
|
+
disabled = choice.get("disabled", False)
|
|
334
|
+
|
|
335
|
+
if disabled:
|
|
336
|
+
# Create a separator for disabled items
|
|
337
|
+
processed.append(Separator(line=name))
|
|
338
|
+
else:
|
|
339
|
+
processed.append(Choice(value=value, name=name, enabled=enabled))
|
|
340
|
+
|
|
341
|
+
elif isinstance(choice, str):
|
|
342
|
+
# Simple string
|
|
343
|
+
enabled = choice in defaults
|
|
344
|
+
processed.append(Choice(value=choice, name=choice, enabled=enabled))
|
|
345
|
+
|
|
346
|
+
return processed
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def create_grouped_choices(
|
|
350
|
+
groups: Dict[str, List[Dict[str, Any]]],
|
|
351
|
+
defaults: Optional[List[Any]] = None,
|
|
352
|
+
) -> List[Union[Choice, Separator]]:
|
|
353
|
+
"""Create grouped choices with separators for each category.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
groups: Dictionary mapping category names to lists of choices
|
|
357
|
+
defaults: Values that should be pre-selected
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
List of choices with category separators
|
|
361
|
+
|
|
362
|
+
Example:
|
|
363
|
+
>>> choices = create_grouped_choices({
|
|
364
|
+
... "Commands": [
|
|
365
|
+
... {"name": "auth.md", "value": "commands/auth.md"},
|
|
366
|
+
... {"name": "deploy.md", "value": "commands/deploy.md"},
|
|
367
|
+
... ],
|
|
368
|
+
... "Agents": [
|
|
369
|
+
... {"name": "backend.md", "value": "agents/backend.md"},
|
|
370
|
+
... ],
|
|
371
|
+
... })
|
|
372
|
+
"""
|
|
373
|
+
defaults = defaults or []
|
|
374
|
+
result: List[Union[Choice, Separator]] = []
|
|
375
|
+
|
|
376
|
+
for category, items in groups.items():
|
|
377
|
+
if items: # Only add category if it has items
|
|
378
|
+
# Add category separator
|
|
379
|
+
result.append(Separator(line=f"── {category} ──"))
|
|
380
|
+
|
|
381
|
+
# Add items in this category
|
|
382
|
+
for item in items:
|
|
383
|
+
name = item.get("name", item.get("title", ""))
|
|
384
|
+
value = item.get("value", name)
|
|
385
|
+
enabled = item.get("enabled", value in defaults)
|
|
386
|
+
|
|
387
|
+
result.append(Choice(value=value, name=f" {name}", enabled=enabled))
|
|
388
|
+
|
|
389
|
+
return result
|
moai_adk/cli/ui/theme.py
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""MoAI-ADK CLI Theme Configuration
|
|
2
|
+
|
|
3
|
+
Consistent styling for all CLI components using InquirerPy custom styles.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import Any, Dict, Optional
|
|
7
|
+
|
|
8
|
+
from rich.console import Console
|
|
9
|
+
|
|
10
|
+
_console = Console()
|
|
11
|
+
|
|
12
|
+
# Claude Code official colors + MoAI theme
|
|
13
|
+
MOAI_COLORS = {
|
|
14
|
+
"primary": "#DA7756", # Claude Code terra cotta - main brand color
|
|
15
|
+
"secondary": "#10B981", # Green - success/selected
|
|
16
|
+
"accent": "#DA7756", # Claude Code terra cotta - highlights
|
|
17
|
+
"info": "#3B82F6", # Blue - information
|
|
18
|
+
"warning": "#F59E0B", # Amber - warnings
|
|
19
|
+
"error": "#EF4444", # Red - errors
|
|
20
|
+
"muted": "#6B7280", # Gray - secondary text
|
|
21
|
+
"text": "#E5E7EB", # Light gray - primary text
|
|
22
|
+
"claude_terra": "#DA7756", # Claude Code official terra cotta
|
|
23
|
+
"claude_black": "#000000", # Claude Code official black
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# InquirerPy style configuration
|
|
27
|
+
MOAI_THEME: Dict[str, str] = {
|
|
28
|
+
# Question styling
|
|
29
|
+
"questionmark": f"fg:{MOAI_COLORS['primary']} bold",
|
|
30
|
+
"question": "bold",
|
|
31
|
+
"answered_question": "",
|
|
32
|
+
"answer": f"fg:{MOAI_COLORS['secondary']} bold",
|
|
33
|
+
"input": f"fg:{MOAI_COLORS['text']}",
|
|
34
|
+
"instruction": f"fg:{MOAI_COLORS['muted']}",
|
|
35
|
+
# Pointer and marker styling
|
|
36
|
+
"pointer": f"fg:{MOAI_COLORS['primary']} bold",
|
|
37
|
+
"checkbox": f"fg:{MOAI_COLORS['primary']}",
|
|
38
|
+
"selected": f"fg:{MOAI_COLORS['secondary']}",
|
|
39
|
+
"separator": f"fg:{MOAI_COLORS['muted']}",
|
|
40
|
+
# Fuzzy prompt styling
|
|
41
|
+
"fuzzy_prompt": f"fg:{MOAI_COLORS['primary']}",
|
|
42
|
+
"fuzzy_info": f"fg:{MOAI_COLORS['muted']}",
|
|
43
|
+
"fuzzy_border": f"fg:{MOAI_COLORS['muted']}",
|
|
44
|
+
"fuzzy_match": f"fg:{MOAI_COLORS['accent']} bold",
|
|
45
|
+
# Validator styling
|
|
46
|
+
"validator": "",
|
|
47
|
+
"marker": f"fg:{MOAI_COLORS['secondary']}",
|
|
48
|
+
"long_instruction": f"fg:{MOAI_COLORS['muted']}",
|
|
49
|
+
# Skipped question styling
|
|
50
|
+
"skipped": f"fg:{MOAI_COLORS['muted']}",
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Symbols for consistent UI (string symbols only for InquirerPy)
|
|
54
|
+
SYMBOLS: Dict[str, str] = {
|
|
55
|
+
"checkbox_selected": "●", # Filled circle for selected
|
|
56
|
+
"checkbox_unselected": "○", # Empty circle for unselected
|
|
57
|
+
"pointer": "❯", # Arrow pointer
|
|
58
|
+
"success": "✓",
|
|
59
|
+
"error": "✗",
|
|
60
|
+
"warning": "⚠",
|
|
61
|
+
"info": "ℹ",
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Spinner frames for Rich progress indicators
|
|
65
|
+
SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def get_styled_choice(
|
|
69
|
+
title: str,
|
|
70
|
+
value: Any,
|
|
71
|
+
enabled: bool = False,
|
|
72
|
+
description: Optional[str] = None,
|
|
73
|
+
) -> Dict[str, Any]:
|
|
74
|
+
"""Create a styled choice for InquirerPy prompts.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
title: Display text for the choice
|
|
78
|
+
value: Value returned when selected
|
|
79
|
+
enabled: Whether pre-selected (for checkbox)
|
|
80
|
+
description: Optional description shown below title
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Dictionary suitable for InquirerPy Choice
|
|
84
|
+
"""
|
|
85
|
+
choice: Dict[str, Any] = {
|
|
86
|
+
"name": title,
|
|
87
|
+
"value": value,
|
|
88
|
+
"enabled": enabled,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if description:
|
|
92
|
+
# Append description in muted color
|
|
93
|
+
choice["name"] = f"{title}\n {description}"
|
|
94
|
+
|
|
95
|
+
return choice
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def print_styled(
|
|
99
|
+
message: str,
|
|
100
|
+
style: str = "text",
|
|
101
|
+
bold: bool = False,
|
|
102
|
+
newline: bool = True,
|
|
103
|
+
) -> None:
|
|
104
|
+
"""Print styled text using MoAI theme colors.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
message: Text to print
|
|
108
|
+
style: One of 'primary', 'secondary', 'accent', 'info', 'warning', 'error', 'muted', 'text'
|
|
109
|
+
bold: Whether to make text bold
|
|
110
|
+
newline: Whether to add newline after message
|
|
111
|
+
"""
|
|
112
|
+
color = MOAI_COLORS.get(style, MOAI_COLORS["text"])
|
|
113
|
+
rich_style = f"[{color}]"
|
|
114
|
+
if bold:
|
|
115
|
+
rich_style = f"[bold {color}]"
|
|
116
|
+
|
|
117
|
+
_console.print(f"{rich_style}{message}[/]", end="\n" if newline else "")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def get_category_separator(category: str) -> Dict[str, Any]:
|
|
121
|
+
"""Create a styled category separator for grouping choices.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
category: Category name to display
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Separator dictionary for InquirerPy
|
|
128
|
+
"""
|
|
129
|
+
return {"value": None, "name": f"── {category} ──", "disabled": True}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Git Worktree CLI module for parallel SPEC development."""
|
|
2
|
+
|
|
3
|
+
from moai_adk.cli.worktree.exceptions import (
|
|
4
|
+
GitOperationError,
|
|
5
|
+
MergeConflictError,
|
|
6
|
+
RegistryInconsistencyError,
|
|
7
|
+
UncommittedChangesError,
|
|
8
|
+
WorktreeError,
|
|
9
|
+
WorktreeExistsError,
|
|
10
|
+
WorktreeNotFoundError,
|
|
11
|
+
)
|
|
12
|
+
from moai_adk.cli.worktree.manager import WorktreeManager
|
|
13
|
+
from moai_adk.cli.worktree.models import WorktreeInfo
|
|
14
|
+
from moai_adk.cli.worktree.registry import WorktreeRegistry
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"WorktreeManager",
|
|
18
|
+
"WorktreeRegistry",
|
|
19
|
+
"WorktreeInfo",
|
|
20
|
+
"WorktreeError",
|
|
21
|
+
"WorktreeExistsError",
|
|
22
|
+
"WorktreeNotFoundError",
|
|
23
|
+
"UncommittedChangesError",
|
|
24
|
+
"GitOperationError",
|
|
25
|
+
"MergeConflictError",
|
|
26
|
+
"RegistryInconsistencyError",
|
|
27
|
+
]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Standalone CLI entry point for moai-worktree command
|
|
2
|
+
|
|
3
|
+
This module provides a standalone entry point for the moai-worktree CLI,
|
|
4
|
+
allowing users to invoke worktree commands directly via `moai-worktree`
|
|
5
|
+
instead of `moai-adk worktree`.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
moai-worktree new SPEC-001
|
|
9
|
+
moai-worktree list
|
|
10
|
+
moai-worktree go SPEC-001
|
|
11
|
+
etc.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
# Import the worktree CLI group from the main module
|
|
17
|
+
from moai_adk.cli.worktree.cli import worktree
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def main() -> int:
|
|
21
|
+
"""Standalone entry point for moai-worktree CLI"""
|
|
22
|
+
try:
|
|
23
|
+
worktree(standalone_mode=False)
|
|
24
|
+
return 0
|
|
25
|
+
except Exception as e:
|
|
26
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
27
|
+
return 1
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if __name__ == "__main__":
|
|
31
|
+
sys.exit(main())
|