moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Batch Questions Manager - Integrated Question System for MoAI Skills
|
|
3
|
+
|
|
4
|
+
Implements unified question collection, validation, and processing system
|
|
5
|
+
that consolidates question functionality from 5 different skills into one
|
|
6
|
+
cohesive module.
|
|
7
|
+
|
|
8
|
+
Author: MoAI-ADK
|
|
9
|
+
Version: 1.0.0
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any, Callable, Dict, List, Optional
|
|
19
|
+
|
|
20
|
+
# Configure logging
|
|
21
|
+
logging.basicConfig(level=logging.INFO)
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class QuestionType(Enum):
|
|
26
|
+
"""Question types supported by the system."""
|
|
27
|
+
|
|
28
|
+
SINGLE_CHOICE = "single_choice"
|
|
29
|
+
MULTI_CHOICE = "multi_choice"
|
|
30
|
+
TEXT_INPUT = "text_input"
|
|
31
|
+
BOOLEAN = "boolean"
|
|
32
|
+
NUMBER_INPUT = "number_input"
|
|
33
|
+
FILE_SELECT = "file_select"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ValidationRule(Enum):
|
|
37
|
+
"""Validation rules for responses."""
|
|
38
|
+
|
|
39
|
+
REQUIRED = "required"
|
|
40
|
+
MIN_LENGTH = "min_length"
|
|
41
|
+
MAX_LENGTH = "max_length"
|
|
42
|
+
REGEX = "regex"
|
|
43
|
+
CUSTOM = "custom"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class QuestionOption:
|
|
48
|
+
"""Represents a question option."""
|
|
49
|
+
|
|
50
|
+
label: str
|
|
51
|
+
value: str
|
|
52
|
+
description: Optional[str] = None
|
|
53
|
+
conditional_questions: Optional[List["Question"]] = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class ValidationConfig:
|
|
58
|
+
"""Configuration for response validation."""
|
|
59
|
+
|
|
60
|
+
rules: List[ValidationRule] = field(default_factory=list)
|
|
61
|
+
parameters: Dict[str, Any] = field(default_factory=dict)
|
|
62
|
+
error_message: Optional[str] = None
|
|
63
|
+
custom_validator: Optional[Callable] = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@dataclass
|
|
67
|
+
class Question:
|
|
68
|
+
"""Represents a single question in the batch."""
|
|
69
|
+
|
|
70
|
+
id: str
|
|
71
|
+
text: str
|
|
72
|
+
type: QuestionType
|
|
73
|
+
options: List[QuestionOption] = field(default_factory=list)
|
|
74
|
+
validation: Optional[ValidationConfig] = None
|
|
75
|
+
description: Optional[str] = None
|
|
76
|
+
required: bool = True
|
|
77
|
+
default_value: Any = None
|
|
78
|
+
conditional_on: Optional[Dict[str, Any]] = None # {"question_id": "expected_value"}
|
|
79
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@dataclass
|
|
83
|
+
class QuestionBatch:
|
|
84
|
+
"""Represents a batch of questions."""
|
|
85
|
+
|
|
86
|
+
id: str
|
|
87
|
+
title: str
|
|
88
|
+
description: str
|
|
89
|
+
questions: List[Question] = field(default_factory=list)
|
|
90
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
91
|
+
created_at: Optional[str] = None
|
|
92
|
+
updated_at: Optional[str] = None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@dataclass
|
|
96
|
+
class UserResponse:
|
|
97
|
+
"""Represents a user's response to a question."""
|
|
98
|
+
|
|
99
|
+
question_id: str
|
|
100
|
+
value: Any
|
|
101
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class BatchQuestionsManager:
|
|
105
|
+
"""
|
|
106
|
+
Unified question management system for MoAI skills.
|
|
107
|
+
|
|
108
|
+
Consolidates question functionality from:
|
|
109
|
+
- moai-project-batch-questions
|
|
110
|
+
- moai-project-config-manager
|
|
111
|
+
- moai-project-language-initializer
|
|
112
|
+
- moai-spec-intelligent-workflow
|
|
113
|
+
- moai-menu-project
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
|
117
|
+
"""Initialize the batch questions manager."""
|
|
118
|
+
self.config = config or {}
|
|
119
|
+
self.template_dir = Path(__file__).parent.parent / "templates" / "question-templates"
|
|
120
|
+
self.cache_dir = Path(__file__).parent.parent / "cache"
|
|
121
|
+
|
|
122
|
+
# Ensure directories exist
|
|
123
|
+
self.template_dir.mkdir(parents=True, exist_ok=True)
|
|
124
|
+
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
125
|
+
|
|
126
|
+
# Initialize template cache
|
|
127
|
+
self._template_cache = {}
|
|
128
|
+
|
|
129
|
+
# Load built-in templates
|
|
130
|
+
self._load_builtin_templates()
|
|
131
|
+
|
|
132
|
+
def create_batch(self, batch_config: Dict[str, Any]) -> QuestionBatch:
|
|
133
|
+
"""
|
|
134
|
+
Create a question batch from configuration.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
batch_config: Configuration dictionary for the batch
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
QuestionBatch: Created question batch
|
|
141
|
+
"""
|
|
142
|
+
questions = []
|
|
143
|
+
|
|
144
|
+
for q_config in batch_config.get("questions", []):
|
|
145
|
+
# Convert options
|
|
146
|
+
options = []
|
|
147
|
+
for opt_config in q_config.get("options", []):
|
|
148
|
+
option = QuestionOption(
|
|
149
|
+
label=opt_config["label"],
|
|
150
|
+
value=opt_config["value"],
|
|
151
|
+
description=opt_config.get("description"),
|
|
152
|
+
conditional_questions=self._parse_conditional_questions(
|
|
153
|
+
opt_config.get("conditional_questions", [])
|
|
154
|
+
),
|
|
155
|
+
)
|
|
156
|
+
options.append(option)
|
|
157
|
+
|
|
158
|
+
# Convert validation
|
|
159
|
+
validation = None
|
|
160
|
+
if "validation" in q_config:
|
|
161
|
+
val_config = q_config["validation"]
|
|
162
|
+
validation = ValidationConfig(
|
|
163
|
+
rules=[ValidationRule(rule) for rule in val_config.get("rules", [])],
|
|
164
|
+
parameters=val_config.get("parameters", {}),
|
|
165
|
+
error_message=val_config.get("error_message"),
|
|
166
|
+
custom_validator=val_config.get("custom_validator"),
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Create question
|
|
170
|
+
question = Question(
|
|
171
|
+
id=q_config["id"],
|
|
172
|
+
text=q_config["text"],
|
|
173
|
+
type=QuestionType(q_config["type"]),
|
|
174
|
+
options=options,
|
|
175
|
+
validation=validation,
|
|
176
|
+
description=q_config.get("description"),
|
|
177
|
+
required=q_config.get("required", True),
|
|
178
|
+
default_value=q_config.get("default_value"),
|
|
179
|
+
conditional_on=q_config.get("conditional_on"),
|
|
180
|
+
metadata=q_config.get("metadata", {}),
|
|
181
|
+
)
|
|
182
|
+
questions.append(question)
|
|
183
|
+
|
|
184
|
+
batch = QuestionBatch(
|
|
185
|
+
id=batch_config["id"],
|
|
186
|
+
title=batch_config["title"],
|
|
187
|
+
description=batch_config["description"],
|
|
188
|
+
questions=questions,
|
|
189
|
+
metadata=batch_config.get("metadata", {}),
|
|
190
|
+
created_at=batch_config.get("created_at"),
|
|
191
|
+
updated_at=batch_config.get("updated_at"),
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
return batch
|
|
195
|
+
|
|
196
|
+
def load_template(self, template_name: str) -> Optional[QuestionBatch]:
|
|
197
|
+
"""
|
|
198
|
+
Load a question template from file or cache.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
template_name: Name of the template to load
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
QuestionBatch: Loaded template or None if not found
|
|
205
|
+
"""
|
|
206
|
+
# Check cache first
|
|
207
|
+
if template_name in self._template_cache:
|
|
208
|
+
return self._template_cache[template_name]
|
|
209
|
+
|
|
210
|
+
# Load from file
|
|
211
|
+
template_file = self.template_dir / f"{template_name}.json"
|
|
212
|
+
if not template_file.exists():
|
|
213
|
+
logger.warning(f"Template not found: {template_name}")
|
|
214
|
+
return None
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
with open(template_file, "r", encoding="utf-8") as f:
|
|
218
|
+
template_config = json.load(f)
|
|
219
|
+
|
|
220
|
+
batch = self.create_batch(template_config)
|
|
221
|
+
|
|
222
|
+
# Cache the template
|
|
223
|
+
self._template_cache[template_name] = batch
|
|
224
|
+
|
|
225
|
+
return batch
|
|
226
|
+
|
|
227
|
+
except Exception as e:
|
|
228
|
+
logger.error(f"Error loading template {template_name}: {e}")
|
|
229
|
+
return None
|
|
230
|
+
|
|
231
|
+
def filter_questions(self, batch: QuestionBatch, context: Dict[str, Any]) -> List[Question]:
|
|
232
|
+
"""
|
|
233
|
+
Filter questions based on context and conditional logic.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
batch: Question batch to filter
|
|
237
|
+
context: Current context (previous answers, config values, etc.)
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
List[Question]: Filtered list of questions
|
|
241
|
+
"""
|
|
242
|
+
filtered_questions = []
|
|
243
|
+
|
|
244
|
+
for question in batch.questions:
|
|
245
|
+
# Check conditional logic
|
|
246
|
+
if question.conditional_on:
|
|
247
|
+
should_show = self._evaluate_condition(question.conditional_on, context)
|
|
248
|
+
if not should_show:
|
|
249
|
+
continue
|
|
250
|
+
|
|
251
|
+
filtered_questions.append(question)
|
|
252
|
+
|
|
253
|
+
return filtered_questions
|
|
254
|
+
|
|
255
|
+
def execute_batch(self, batch: QuestionBatch, context: Optional[Dict[str, Any]] = None) -> Dict[str, UserResponse]:
|
|
256
|
+
"""
|
|
257
|
+
Execute a question batch and collect responses.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
batch: Question batch to execute
|
|
261
|
+
context: Current context for conditional questions
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Dict[str, UserResponse]: Collected responses
|
|
265
|
+
"""
|
|
266
|
+
if context is None:
|
|
267
|
+
context = {}
|
|
268
|
+
|
|
269
|
+
# Filter questions based on context
|
|
270
|
+
questions = self.filter_questions(batch, context)
|
|
271
|
+
|
|
272
|
+
responses = {}
|
|
273
|
+
|
|
274
|
+
for question in questions:
|
|
275
|
+
# Check if question already has response in context
|
|
276
|
+
if question.id in context:
|
|
277
|
+
responses[question.id] = UserResponse(
|
|
278
|
+
question_id=question.id,
|
|
279
|
+
value=context[question.id],
|
|
280
|
+
metadata={"source": "context"},
|
|
281
|
+
)
|
|
282
|
+
continue
|
|
283
|
+
|
|
284
|
+
# Ask the question
|
|
285
|
+
response_value = self._ask_question(question)
|
|
286
|
+
|
|
287
|
+
# Validate response
|
|
288
|
+
if question.validation:
|
|
289
|
+
validation_result = self._validate_response(response_value, question.validation)
|
|
290
|
+
if not validation_result.is_valid:
|
|
291
|
+
# Handle validation error
|
|
292
|
+
raise ValueError(f"Validation failed for question {question.id}: {validation_result.error}")
|
|
293
|
+
|
|
294
|
+
responses[question.id] = UserResponse(
|
|
295
|
+
question_id=question.id,
|
|
296
|
+
value=response_value,
|
|
297
|
+
metadata={"source": "user_input"},
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
# Update context for subsequent questions
|
|
301
|
+
context[question.id] = response_value
|
|
302
|
+
|
|
303
|
+
return responses
|
|
304
|
+
|
|
305
|
+
def get_skill_specific_template(self, skill_name: str) -> Optional[QuestionBatch]:
|
|
306
|
+
"""
|
|
307
|
+
Get a skill-specific question template.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
skill_name: Name of the skill
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
QuestionBatch: Skill-specific template or None
|
|
314
|
+
"""
|
|
315
|
+
template_mapping = {
|
|
316
|
+
"moai-project-batch-questions": "project-batch-questions",
|
|
317
|
+
"moai-project-config-manager": "config-manager-setup",
|
|
318
|
+
"moai-project-language-initializer": "language-initializer",
|
|
319
|
+
"moai-spec-intelligent-workflow": "spec-workflow-setup",
|
|
320
|
+
"moai-menu-project": "menu-project-config",
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
template_name = template_mapping.get(skill_name)
|
|
324
|
+
if not template_name:
|
|
325
|
+
logger.warning(f"No template mapping for skill: {skill_name}")
|
|
326
|
+
return None
|
|
327
|
+
|
|
328
|
+
return self.load_template(template_name)
|
|
329
|
+
|
|
330
|
+
def process_responses_for_config(
|
|
331
|
+
self, responses: Dict[str, UserResponse], config_path: Optional[str] = None
|
|
332
|
+
) -> Dict[str, Any]:
|
|
333
|
+
"""
|
|
334
|
+
Process responses and generate configuration updates.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
responses: User responses to process
|
|
338
|
+
config_path: Path to existing config file (optional)
|
|
339
|
+
|
|
340
|
+
Returns:
|
|
341
|
+
Dict[str, Any]: Updated configuration
|
|
342
|
+
"""
|
|
343
|
+
# Start with existing config if provided
|
|
344
|
+
config = {}
|
|
345
|
+
if config_path and os.path.exists(config_path):
|
|
346
|
+
try:
|
|
347
|
+
with open(config_path, "r", encoding="utf-8") as f:
|
|
348
|
+
config = json.load(f)
|
|
349
|
+
except Exception as e:
|
|
350
|
+
logger.error(f"Error loading existing config: {e}")
|
|
351
|
+
|
|
352
|
+
# Process each response
|
|
353
|
+
for response in responses.values():
|
|
354
|
+
# Apply response to config based on metadata
|
|
355
|
+
config_path = response.metadata.get("config_path", response.question_id)
|
|
356
|
+
value = response.value
|
|
357
|
+
|
|
358
|
+
# Handle special cases
|
|
359
|
+
if isinstance(value, list) and len(value) == 1:
|
|
360
|
+
# Single selection in multi-choice format
|
|
361
|
+
value = value[0]
|
|
362
|
+
|
|
363
|
+
# Nested path handling (e.g., "git_strategy.mode")
|
|
364
|
+
if "." in config_path:
|
|
365
|
+
self._set_nested_value(config, config_path, value)
|
|
366
|
+
else:
|
|
367
|
+
config[config_path] = value
|
|
368
|
+
|
|
369
|
+
return config
|
|
370
|
+
|
|
371
|
+
def save_responses(self, responses: Dict[str, UserResponse], file_path: str) -> bool:
|
|
372
|
+
"""
|
|
373
|
+
Save responses to a file.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
responses: Responses to save
|
|
377
|
+
file_path: Path to save the responses
|
|
378
|
+
|
|
379
|
+
Returns:
|
|
380
|
+
bool: True if saved successfully
|
|
381
|
+
"""
|
|
382
|
+
try:
|
|
383
|
+
# Convert responses to serializable format
|
|
384
|
+
serializable_responses = {}
|
|
385
|
+
for resp in responses.values():
|
|
386
|
+
serializable_responses[resp.question_id] = {
|
|
387
|
+
"value": resp.value,
|
|
388
|
+
"metadata": resp.metadata,
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
392
|
+
json.dump(serializable_responses, f, indent=2, ensure_ascii=False)
|
|
393
|
+
|
|
394
|
+
return True
|
|
395
|
+
|
|
396
|
+
except Exception as e:
|
|
397
|
+
logger.error(f"Error saving responses: {e}")
|
|
398
|
+
return False
|
|
399
|
+
|
|
400
|
+
def _load_builtin_templates(self):
|
|
401
|
+
"""Load built-in question templates."""
|
|
402
|
+
builtin_templates = {
|
|
403
|
+
"project-initialization": self._create_project_init_template(),
|
|
404
|
+
"git-workflow-config": self._create_git_workflow_template(),
|
|
405
|
+
"quality-gates-setup": self._create_quality_gates_template(),
|
|
406
|
+
"skill-selection": self._create_skill_selection_template(),
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
for name, template in builtin_templates.items():
|
|
410
|
+
template_file = self.template_dir / f"{name}.json"
|
|
411
|
+
if not template_file.exists():
|
|
412
|
+
self._save_template_to_file(template, template_file)
|
|
413
|
+
|
|
414
|
+
def _create_project_init_template(self) -> Dict[str, Any]:
|
|
415
|
+
"""Create project initialization template."""
|
|
416
|
+
return {
|
|
417
|
+
"id": "project-initialization",
|
|
418
|
+
"title": "Project Initialization",
|
|
419
|
+
"description": "Configure your new project settings",
|
|
420
|
+
"questions": [
|
|
421
|
+
{
|
|
422
|
+
"id": "project.name",
|
|
423
|
+
"text": "What is your project name?",
|
|
424
|
+
"type": "text_input",
|
|
425
|
+
"required": True,
|
|
426
|
+
"validation": {
|
|
427
|
+
"rules": ["required", "min_length"],
|
|
428
|
+
"parameters": {"min_length": 2},
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"id": "project.type",
|
|
433
|
+
"text": "What type of project are you creating?",
|
|
434
|
+
"type": "single_choice",
|
|
435
|
+
"required": True,
|
|
436
|
+
"options": [
|
|
437
|
+
{"label": "Web Application", "value": "web"},
|
|
438
|
+
{"label": "API Service", "value": "api"},
|
|
439
|
+
{"label": "CLI Tool", "value": "cli"},
|
|
440
|
+
{"label": "Library", "value": "library"},
|
|
441
|
+
],
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"id": "project.language",
|
|
445
|
+
"text": "What programming language will you use?",
|
|
446
|
+
"type": "single_choice",
|
|
447
|
+
"required": True,
|
|
448
|
+
"options": [
|
|
449
|
+
{"label": "Python", "value": "python"},
|
|
450
|
+
{"label": "TypeScript", "value": "typescript"},
|
|
451
|
+
{"label": "JavaScript", "value": "javascript"},
|
|
452
|
+
{"label": "Go", "value": "go"},
|
|
453
|
+
{"label": "Rust", "value": "rust"},
|
|
454
|
+
],
|
|
455
|
+
},
|
|
456
|
+
],
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
def _create_git_workflow_template(self) -> Dict[str, Any]:
|
|
460
|
+
"""Create Git workflow configuration template."""
|
|
461
|
+
return {
|
|
462
|
+
"id": "git-workflow-config",
|
|
463
|
+
"title": "Git Workflow Configuration",
|
|
464
|
+
"description": "Configure your Git workflow preferences",
|
|
465
|
+
"questions": [
|
|
466
|
+
{
|
|
467
|
+
"id": "git_strategy.mode",
|
|
468
|
+
"text": "What Git workflow mode do you prefer?",
|
|
469
|
+
"type": "single_choice",
|
|
470
|
+
"required": True,
|
|
471
|
+
"options": [
|
|
472
|
+
{
|
|
473
|
+
"label": "Manual (local only)",
|
|
474
|
+
"value": "manual",
|
|
475
|
+
"description": "Work locally without automatic remote operations",
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
"label": "Personal (GitHub personal project)",
|
|
479
|
+
"value": "personal",
|
|
480
|
+
"description": "Automatic pushing to your personal GitHub repository",
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
"label": "Team (GitHub team project)",
|
|
484
|
+
"value": "team",
|
|
485
|
+
"description": "Team collaboration with pull requests and reviews",
|
|
486
|
+
},
|
|
487
|
+
],
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"id": "git_strategy.branch_creation.prompt_always",
|
|
491
|
+
"text": "Do you want to be prompted for branch creation?",
|
|
492
|
+
"type": "boolean",
|
|
493
|
+
"required": True,
|
|
494
|
+
"default_value": True,
|
|
495
|
+
"conditional_on": {"git_strategy.mode": ["personal", "team"]},
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
"id": "git_strategy.branch_creation.auto_enabled",
|
|
499
|
+
"text": "Enable automatic branch creation?",
|
|
500
|
+
"type": "boolean",
|
|
501
|
+
"required": True,
|
|
502
|
+
"default_value": False,
|
|
503
|
+
"conditional_on": {
|
|
504
|
+
"git_strategy.mode": ["personal", "team"],
|
|
505
|
+
"git_strategy.branch_creation.prompt_always": False,
|
|
506
|
+
},
|
|
507
|
+
},
|
|
508
|
+
],
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
def _create_quality_gates_template(self) -> Dict[str, Any]:
|
|
512
|
+
"""Create quality gates configuration template."""
|
|
513
|
+
return {
|
|
514
|
+
"id": "quality-gates-setup",
|
|
515
|
+
"title": "Quality Gates Configuration",
|
|
516
|
+
"description": "Configure quality standards and validation rules",
|
|
517
|
+
"questions": [
|
|
518
|
+
{
|
|
519
|
+
"id": "constitution.test_coverage_target",
|
|
520
|
+
"text": "What is your target test coverage percentage?",
|
|
521
|
+
"type": "number_input",
|
|
522
|
+
"required": True,
|
|
523
|
+
"default_value": 85,
|
|
524
|
+
"validation": {
|
|
525
|
+
"rules": ["min_value", "max_value"],
|
|
526
|
+
"parameters": {"min_value": 0, "max_value": 100},
|
|
527
|
+
},
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
"id": "constitution.enforce_tdd",
|
|
531
|
+
"text": "Enforce Test-Driven Development (TDD)?",
|
|
532
|
+
"type": "boolean",
|
|
533
|
+
"required": True,
|
|
534
|
+
"default_value": True,
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"id": "quality.auto_linting",
|
|
538
|
+
"text": "Enable automatic code linting?",
|
|
539
|
+
"type": "boolean",
|
|
540
|
+
"required": True,
|
|
541
|
+
"default_value": True,
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
"id": "quality.auto_formatting",
|
|
545
|
+
"text": "Enable automatic code formatting?",
|
|
546
|
+
"type": "boolean",
|
|
547
|
+
"required": True,
|
|
548
|
+
"default_value": True,
|
|
549
|
+
},
|
|
550
|
+
],
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
def _create_skill_selection_template(self) -> Dict[str, Any]:
|
|
554
|
+
"""Create skill selection template."""
|
|
555
|
+
return {
|
|
556
|
+
"id": "skill-selection",
|
|
557
|
+
"title": "Skill Selection",
|
|
558
|
+
"description": "Select MoAI skills to enable for your project",
|
|
559
|
+
"questions": [
|
|
560
|
+
{
|
|
561
|
+
"id": "skills.enabled",
|
|
562
|
+
"text": "Which skills would you like to enable?",
|
|
563
|
+
"type": "multi_choice",
|
|
564
|
+
"required": True,
|
|
565
|
+
"options": [
|
|
566
|
+
{
|
|
567
|
+
"label": "Python Language Support",
|
|
568
|
+
"value": "moai-lang-python",
|
|
569
|
+
"description": "Python-specific patterns and best practices",
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
"label": "TypeScript Support",
|
|
573
|
+
"value": "moai-lang-typescript",
|
|
574
|
+
"description": "TypeScript and JavaScript development tools",
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"label": "Backend Architecture",
|
|
578
|
+
"value": "moai-domain-backend",
|
|
579
|
+
"description": "API design and backend patterns",
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
"label": "Frontend Development",
|
|
583
|
+
"value": "moai-domain-frontend",
|
|
584
|
+
"description": "React, Vue, and frontend frameworks",
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"label": "Security Analysis",
|
|
588
|
+
"value": "moai-security-owasp",
|
|
589
|
+
"description": "OWASP security validation and best practices",
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"label": "Performance Engineering",
|
|
593
|
+
"value": "moai-performance-engineering",
|
|
594
|
+
"description": "Performance optimization and analysis",
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"label": "Documentation Generation",
|
|
598
|
+
"value": "moai-workflow-docs",
|
|
599
|
+
"description": "Automated documentation generation",
|
|
600
|
+
},
|
|
601
|
+
],
|
|
602
|
+
}
|
|
603
|
+
],
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
def _ask_question(self, question: Question) -> Any:
|
|
607
|
+
"""
|
|
608
|
+
Ask a single question to the user.
|
|
609
|
+
This is a placeholder for actual AskUserQuestion integration.
|
|
610
|
+
"""
|
|
611
|
+
# This would integrate with Claude Code's AskUserQuestion
|
|
612
|
+
# For now, return a mock response
|
|
613
|
+
if question.type == QuestionType.BOOLEAN:
|
|
614
|
+
return question.default_value or False
|
|
615
|
+
elif question.type == QuestionType.SINGLE_CHOICE and question.options:
|
|
616
|
+
return question.options[0].value
|
|
617
|
+
elif question.type == QuestionType.TEXT_INPUT:
|
|
618
|
+
return "default_response"
|
|
619
|
+
else:
|
|
620
|
+
return None
|
|
621
|
+
|
|
622
|
+
def _validate_response(self, value: Any, validation: ValidationConfig) -> "ValidationResult":
|
|
623
|
+
"""Validate a response value."""
|
|
624
|
+
# Placeholder for validation logic
|
|
625
|
+
return ValidationResult(is_valid=True, error=None)
|
|
626
|
+
|
|
627
|
+
def _evaluate_condition(self, condition: Dict[str, Any], context: Dict[str, Any]) -> bool:
|
|
628
|
+
"""Evaluate conditional logic for questions."""
|
|
629
|
+
# Simple implementation for now
|
|
630
|
+
for key, expected in condition.items():
|
|
631
|
+
if key not in context:
|
|
632
|
+
return False
|
|
633
|
+
|
|
634
|
+
actual = context[key]
|
|
635
|
+
if isinstance(expected, list):
|
|
636
|
+
if actual not in expected:
|
|
637
|
+
return False
|
|
638
|
+
elif actual != expected:
|
|
639
|
+
return False
|
|
640
|
+
|
|
641
|
+
return True
|
|
642
|
+
|
|
643
|
+
def _set_nested_value(self, config: Dict[str, Any], path: str, value: Any):
|
|
644
|
+
"""Set a nested value in the configuration dict."""
|
|
645
|
+
keys = path.split(".")
|
|
646
|
+
current = config
|
|
647
|
+
|
|
648
|
+
for key in keys[:-1]:
|
|
649
|
+
if key not in current:
|
|
650
|
+
current[key] = {}
|
|
651
|
+
current = current[key]
|
|
652
|
+
|
|
653
|
+
current[keys[-1]] = value
|
|
654
|
+
|
|
655
|
+
def _parse_conditional_questions(self, conditional_configs: List[Dict[str, Any]]) -> List[Question]:
|
|
656
|
+
"""Parse conditional questions from configuration."""
|
|
657
|
+
questions = []
|
|
658
|
+
for config in conditional_configs:
|
|
659
|
+
question = Question(
|
|
660
|
+
id=config["id"],
|
|
661
|
+
text=config["text"],
|
|
662
|
+
type=QuestionType(config["type"]),
|
|
663
|
+
options=[QuestionOption(opt["label"], opt["value"]) for opt in config.get("options", [])],
|
|
664
|
+
)
|
|
665
|
+
questions.append(question)
|
|
666
|
+
|
|
667
|
+
return questions
|
|
668
|
+
|
|
669
|
+
def _save_template_to_file(self, template: Dict[str, Any], file_path: Path):
|
|
670
|
+
"""Save a template to file."""
|
|
671
|
+
try:
|
|
672
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
673
|
+
json.dump(template, f, indent=2, ensure_ascii=False)
|
|
674
|
+
except Exception as e:
|
|
675
|
+
logger.error(f"Error saving template to {file_path}: {e}")
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
@dataclass
|
|
679
|
+
class ValidationResult:
|
|
680
|
+
"""Result of response validation."""
|
|
681
|
+
|
|
682
|
+
is_valid: bool
|
|
683
|
+
error: Optional[str] = None
|
|
684
|
+
warnings: List[str] = field(default_factory=list)
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
# Integration helper functions for MoAI skills
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
def create_project_initializer(config: Dict[str, Any]) -> BatchQuestionsManager:
|
|
691
|
+
"""Create a project initializer with standard templates."""
|
|
692
|
+
return BatchQuestionsManager(config)
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
def ask_skill_questions(skill_name: str, context: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
696
|
+
"""
|
|
697
|
+
Ask skill-specific questions and return responses.
|
|
698
|
+
|
|
699
|
+
Args:
|
|
700
|
+
skill_name: Name of the skill
|
|
701
|
+
context: Existing context for conditional questions
|
|
702
|
+
|
|
703
|
+
Returns:
|
|
704
|
+
Dict[str, Any]: User responses
|
|
705
|
+
"""
|
|
706
|
+
manager = BatchQuestionsManager()
|
|
707
|
+
template = manager.get_skill_specific_template(skill_name)
|
|
708
|
+
|
|
709
|
+
if not template:
|
|
710
|
+
logger.warning(f"No template found for skill: {skill_name}")
|
|
711
|
+
return {}
|
|
712
|
+
|
|
713
|
+
return manager.execute_batch(template, context or {})
|