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,488 @@
|
|
|
1
|
+
"""Interactive Checkbox UI for MoAI-ADK Custom Element Restoration
|
|
2
|
+
|
|
3
|
+
This module provides an enhanced interactive CLI interface with checkbox-style selection,
|
|
4
|
+
arrow key navigation, and proper element preservation during updates.
|
|
5
|
+
|
|
6
|
+
Key Features:
|
|
7
|
+
- Arrow key navigation (↑↓) to move between elements
|
|
8
|
+
- Spacebar to toggle selection with [x] checkbox markers
|
|
9
|
+
- Category grouping (Agents, Commands, Skills, Hooks)
|
|
10
|
+
- Preserve unselected elements (fixes disappearing issue)
|
|
11
|
+
- Real-time selection status display
|
|
12
|
+
- Keyboard shortcuts for convenience
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import curses
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any, Dict, List, Optional, Set
|
|
18
|
+
|
|
19
|
+
from .custom_element_scanner import create_custom_element_scanner
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class InteractiveCheckboxUI:
|
|
23
|
+
"""Interactive checkbox-based CLI interface for element selection.
|
|
24
|
+
|
|
25
|
+
Provides an enhanced user experience with:
|
|
26
|
+
- Arrow key navigation
|
|
27
|
+
- Checkbox-style selection with [x] markers
|
|
28
|
+
- Category grouping and organization
|
|
29
|
+
- Real-time feedback and status updates
|
|
30
|
+
- Keyboard shortcuts for power users
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, project_path: str | Path):
|
|
34
|
+
"""Initialize the interactive checkbox UI.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
project_path: Path to the MoAI-ADK project directory
|
|
38
|
+
"""
|
|
39
|
+
self.project_path = Path(project_path).resolve()
|
|
40
|
+
self.scanner = create_custom_element_scanner(self.project_path)
|
|
41
|
+
self.selected_indices: Set[int] = set()
|
|
42
|
+
self.current_index = 0
|
|
43
|
+
|
|
44
|
+
def prompt_user_selection(self, backup_available: bool = True) -> Optional[List[str]]:
|
|
45
|
+
"""Launch interactive checkbox selection interface.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
backup_available: Whether backup is available for restoration
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
List of selected element paths, or None if cancelled
|
|
52
|
+
"""
|
|
53
|
+
# Get custom elements organized by category
|
|
54
|
+
elements_by_category = self._get_elements_by_category()
|
|
55
|
+
flattened_elements = self._flatten_elements(elements_by_category)
|
|
56
|
+
|
|
57
|
+
if not flattened_elements:
|
|
58
|
+
print("\n✅ No custom elements found in project.")
|
|
59
|
+
print(" All elements are part of the official MoAI-ADK template.")
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
if not backup_available:
|
|
63
|
+
print("\n⚠️ No backup available. Cannot restore custom elements.")
|
|
64
|
+
print("💡 Run 'moai-adk update' without --force to create a backup first.")
|
|
65
|
+
return None
|
|
66
|
+
|
|
67
|
+
# Launch curses interface
|
|
68
|
+
try:
|
|
69
|
+
selected_indices = self._run_curses_interface(flattened_elements, elements_by_category)
|
|
70
|
+
except ImportError:
|
|
71
|
+
# Curses not available, use enhanced fallback immediately
|
|
72
|
+
print("\n📱 Terminal doesn't support interactive mode, using enhanced selection...")
|
|
73
|
+
return self._fallback_selection(flattened_elements)
|
|
74
|
+
except Exception as e:
|
|
75
|
+
# Fallback to simple selection if curses fails
|
|
76
|
+
print(f"\n⚠️ Interactive mode failed: {e}")
|
|
77
|
+
print("Falling back to enhanced selection mode...")
|
|
78
|
+
return self._fallback_selection(flattened_elements)
|
|
79
|
+
|
|
80
|
+
if selected_indices is None:
|
|
81
|
+
print("\n⚠️ Selection cancelled.")
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
# Convert indices to element paths
|
|
85
|
+
selected_paths = []
|
|
86
|
+
for idx in selected_indices:
|
|
87
|
+
if 0 <= idx < len(flattened_elements):
|
|
88
|
+
selected_paths.append(flattened_elements[idx]["path"])
|
|
89
|
+
|
|
90
|
+
if not selected_paths:
|
|
91
|
+
print("\n⚠️ No elements selected for restoration.")
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
return selected_paths
|
|
95
|
+
|
|
96
|
+
def _get_elements_by_category(self) -> Dict[str, List[Dict]]:
|
|
97
|
+
"""Organize custom elements by category.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Dictionary mapping category names to lists of elements
|
|
101
|
+
"""
|
|
102
|
+
custom_elements = self.scanner.scan_custom_elements()
|
|
103
|
+
organized: Dict[str, List[Dict[str, Any]]] = {
|
|
104
|
+
"Agents": [],
|
|
105
|
+
"Commands": [],
|
|
106
|
+
"Skills": [],
|
|
107
|
+
"Hooks": [],
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# Add skills (which are directories)
|
|
111
|
+
if "skills" in custom_elements:
|
|
112
|
+
for skill in custom_elements["skills"]:
|
|
113
|
+
skill_name = skill.name
|
|
114
|
+
# Add indicator for template vs custom skills
|
|
115
|
+
if hasattr(skill, "is_template") and skill.is_template:
|
|
116
|
+
skill_name = f"{skill.name} (template)"
|
|
117
|
+
else:
|
|
118
|
+
skill_name = f"{skill.name} (custom)"
|
|
119
|
+
|
|
120
|
+
organized["Skills"].append({"name": skill_name, "path": str(skill.path), "type": "skill"})
|
|
121
|
+
|
|
122
|
+
# Add file-based elements
|
|
123
|
+
for element_type in ["agents", "commands", "hooks"]:
|
|
124
|
+
if element_type in custom_elements:
|
|
125
|
+
category_name = element_type.capitalize()
|
|
126
|
+
for element_path in custom_elements[element_type]:
|
|
127
|
+
element_name = Path(element_path).name
|
|
128
|
+
organized[category_name].append(
|
|
129
|
+
{
|
|
130
|
+
"name": element_name,
|
|
131
|
+
"path": str(element_path),
|
|
132
|
+
"type": element_type.rstrip("s"), # Remove plural 's'
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Remove empty categories
|
|
137
|
+
return {k: v for k, v in organized.items() if v}
|
|
138
|
+
|
|
139
|
+
def _flatten_elements(self, elements_by_category: Dict[str, List[Dict]]) -> List[Dict]:
|
|
140
|
+
"""Flatten categorized elements into a single list with display info.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
elements_by_category: Dictionary of categorized elements
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Flattened list with display information
|
|
147
|
+
"""
|
|
148
|
+
flattened = []
|
|
149
|
+
for category, elements in elements_by_category.items():
|
|
150
|
+
# Add category header
|
|
151
|
+
flattened.append(
|
|
152
|
+
{
|
|
153
|
+
"type": "header",
|
|
154
|
+
"text": f"{category} ({len(elements)})",
|
|
155
|
+
"category": category,
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
# Add elements
|
|
159
|
+
for element in elements:
|
|
160
|
+
flattened.append(
|
|
161
|
+
{
|
|
162
|
+
"type": "element",
|
|
163
|
+
"name": element["name"],
|
|
164
|
+
"path": element["path"],
|
|
165
|
+
"category": element["type"],
|
|
166
|
+
}
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return flattened
|
|
170
|
+
|
|
171
|
+
def _run_curses_interface(self, elements: List[Dict], elements_by_category: Dict) -> Optional[Set[int]]:
|
|
172
|
+
"""Run the curses-based interactive interface.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
elements: Flattened list of elements and headers
|
|
176
|
+
elements_by_category: Categorized elements for reference
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Set of selected indices, or None if cancelled
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
def interface(stdscr):
|
|
183
|
+
# Initialize curses
|
|
184
|
+
curses.curs_set(0) # Hide cursor
|
|
185
|
+
curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) # Selected
|
|
186
|
+
curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE) # Header
|
|
187
|
+
curses.init_pair(3, curses.COLOR_GREEN, curses.COLOR_BLACK) # Success
|
|
188
|
+
curses.init_pair(4, curses.COLOR_YELLOW, curses.COLOR_BLACK) # Warning
|
|
189
|
+
|
|
190
|
+
stdscr.clear()
|
|
191
|
+
stdscr.refresh()
|
|
192
|
+
|
|
193
|
+
# Main input loop
|
|
194
|
+
while True:
|
|
195
|
+
self._display_interface(stdscr, elements, elements_by_category)
|
|
196
|
+
key = stdscr.getch()
|
|
197
|
+
|
|
198
|
+
if key == curses.KEY_UP:
|
|
199
|
+
self._navigate_up(elements)
|
|
200
|
+
elif key == curses.KEY_DOWN:
|
|
201
|
+
self._navigate_down(elements)
|
|
202
|
+
elif key == ord(" "):
|
|
203
|
+
self._toggle_selection(elements)
|
|
204
|
+
elif key == ord("a") or key == ord("A"):
|
|
205
|
+
self._select_all(elements)
|
|
206
|
+
elif key == ord("n") or key == ord("N"):
|
|
207
|
+
self._select_none(elements)
|
|
208
|
+
elif key == ord("\n") or key == ord("\r"):
|
|
209
|
+
# Confirm selection
|
|
210
|
+
if self._confirm_selection(stdscr, elements):
|
|
211
|
+
return self.selected_indices
|
|
212
|
+
elif key == ord("q") or key == ord("Q") or key == 27: # 27 = ESC
|
|
213
|
+
# Quit
|
|
214
|
+
return None
|
|
215
|
+
|
|
216
|
+
# Run curses interface
|
|
217
|
+
return curses.wrapper(interface)
|
|
218
|
+
|
|
219
|
+
def _display_interface(self, stdscr, elements: List[Dict], elements_by_category: Dict) -> None:
|
|
220
|
+
"""Display the interactive interface.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
stdscr: Curses window
|
|
224
|
+
elements: Flattened list of elements and headers
|
|
225
|
+
elements_by_category: Categorized elements for reference
|
|
226
|
+
"""
|
|
227
|
+
stdscr.clear()
|
|
228
|
+
h, w = stdscr.getmaxyx()
|
|
229
|
+
|
|
230
|
+
# Title
|
|
231
|
+
title = "🔍 Custom Elements Restoration"
|
|
232
|
+
stdscr.addstr(1, (w - len(title)) // 2, title, curses.A_BOLD)
|
|
233
|
+
|
|
234
|
+
# Instructions
|
|
235
|
+
instructions = ["↑↓ Navigate | Space Toggle | A:All N:None | Enter:Confirm | Q/ESC:Cancel"]
|
|
236
|
+
for i, instruction in enumerate(instructions):
|
|
237
|
+
stdscr.addstr(3, 2, instruction)
|
|
238
|
+
|
|
239
|
+
# Separator
|
|
240
|
+
stdscr.addstr(4, 0, "─" * w)
|
|
241
|
+
|
|
242
|
+
# Display elements with checkboxes
|
|
243
|
+
y_offset = 6
|
|
244
|
+
for i, element in enumerate(elements):
|
|
245
|
+
if y_offset >= h - 3: # Leave space for status bar
|
|
246
|
+
break
|
|
247
|
+
|
|
248
|
+
if element["type"] == "header":
|
|
249
|
+
# Category header
|
|
250
|
+
header_text = f"📁 {element['text']}"
|
|
251
|
+
stdscr.addstr(y_offset, 2, header_text, curses.color_pair(2) | curses.A_BOLD)
|
|
252
|
+
y_offset += 1
|
|
253
|
+
else:
|
|
254
|
+
# Element with checkbox
|
|
255
|
+
is_selected = i in self.selected_indices
|
|
256
|
+
is_current = i == self.current_index
|
|
257
|
+
|
|
258
|
+
checkbox = "[x]" if is_selected else "[ ]"
|
|
259
|
+
display_name = element["name"][:40] # Truncate long names
|
|
260
|
+
|
|
261
|
+
line = f"{checkbox} {display_name}"
|
|
262
|
+
|
|
263
|
+
if is_current:
|
|
264
|
+
stdscr.addstr(y_offset, 4, line, curses.color_pair(1) | curses.A_BOLD)
|
|
265
|
+
else:
|
|
266
|
+
stdscr.addstr(y_offset, 4, line)
|
|
267
|
+
|
|
268
|
+
y_offset += 1
|
|
269
|
+
|
|
270
|
+
# Status bar
|
|
271
|
+
selected_count = len(
|
|
272
|
+
[i for i, el in enumerate(elements) if el["type"] == "element" and i in self.selected_indices]
|
|
273
|
+
)
|
|
274
|
+
total_count = len([el for el in elements if el["type"] == "element"])
|
|
275
|
+
status = f"Selected: {selected_count}/{total_count} | Use Space to toggle, Enter to confirm"
|
|
276
|
+
stdscr.addstr(h - 2, 2, status, curses.A_REVERSE)
|
|
277
|
+
|
|
278
|
+
stdscr.refresh()
|
|
279
|
+
|
|
280
|
+
def _navigate_up(self, elements: List[Dict]) -> None:
|
|
281
|
+
"""Move cursor up to previous element.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
elements: List of elements to navigate
|
|
285
|
+
"""
|
|
286
|
+
# Find previous element index
|
|
287
|
+
new_index = self.current_index - 1
|
|
288
|
+
while new_index >= 0:
|
|
289
|
+
if elements[new_index]["type"] == "element":
|
|
290
|
+
self.current_index = new_index
|
|
291
|
+
break
|
|
292
|
+
new_index -= 1
|
|
293
|
+
|
|
294
|
+
def _navigate_down(self, elements: List[Dict]) -> None:
|
|
295
|
+
"""Move cursor down to next element.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
elements: List of elements to navigate
|
|
299
|
+
"""
|
|
300
|
+
# Find next element index
|
|
301
|
+
new_index = self.current_index + 1
|
|
302
|
+
while new_index < len(elements):
|
|
303
|
+
if elements[new_index]["type"] == "element":
|
|
304
|
+
self.current_index = new_index
|
|
305
|
+
break
|
|
306
|
+
new_index += 1
|
|
307
|
+
|
|
308
|
+
def _toggle_selection(self, elements: List[Dict]) -> None:
|
|
309
|
+
"""Toggle selection for current element.
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
elements: List of elements
|
|
313
|
+
"""
|
|
314
|
+
if elements[self.current_index]["type"] == "element":
|
|
315
|
+
if self.current_index in self.selected_indices:
|
|
316
|
+
self.selected_indices.remove(self.current_index)
|
|
317
|
+
else:
|
|
318
|
+
self.selected_indices.add(self.current_index)
|
|
319
|
+
|
|
320
|
+
def _select_all(self, elements: List[Dict]) -> None:
|
|
321
|
+
"""Select all elements.
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
elements: List of elements
|
|
325
|
+
"""
|
|
326
|
+
for i, element in enumerate(elements):
|
|
327
|
+
if element["type"] == "element":
|
|
328
|
+
self.selected_indices.add(i)
|
|
329
|
+
|
|
330
|
+
def _select_none(self, elements: List[Dict]) -> None:
|
|
331
|
+
"""Clear selection for all elements.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
elements: List of elements
|
|
335
|
+
"""
|
|
336
|
+
self.selected_indices.clear()
|
|
337
|
+
|
|
338
|
+
def _confirm_selection(self, stdscr, elements: List[Dict]) -> bool:
|
|
339
|
+
"""Show confirmation dialog.
|
|
340
|
+
|
|
341
|
+
Args:
|
|
342
|
+
stdscr: Curses window
|
|
343
|
+
elements: List of elements
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
True if confirmed, False otherwise
|
|
347
|
+
"""
|
|
348
|
+
selected_paths = []
|
|
349
|
+
for idx in self.selected_indices:
|
|
350
|
+
if 0 <= idx < len(elements) and elements[idx]["type"] == "element":
|
|
351
|
+
selected_paths.append(elements[idx]["name"])
|
|
352
|
+
|
|
353
|
+
if not selected_paths:
|
|
354
|
+
return False
|
|
355
|
+
|
|
356
|
+
h, w = stdscr.getmaxyx()
|
|
357
|
+
|
|
358
|
+
# Clear screen for confirmation
|
|
359
|
+
stdscr.clear()
|
|
360
|
+
stdscr.addstr(1, (w - 20) // 2, "Confirm Selection", curses.A_BOLD)
|
|
361
|
+
stdscr.addstr(3, 2, f"Selected {len(selected_paths)} elements:")
|
|
362
|
+
|
|
363
|
+
for i, path in enumerate(selected_paths[:10]): # Show max 10 items
|
|
364
|
+
if i >= h - 8:
|
|
365
|
+
break
|
|
366
|
+
stdscr.addstr(5 + i, 4, f"• {path}")
|
|
367
|
+
|
|
368
|
+
if len(selected_paths) > 10:
|
|
369
|
+
stdscr.addstr(h - 4, 4, f"... and {len(selected_paths) - 10} more")
|
|
370
|
+
|
|
371
|
+
stdscr.addstr(h - 3, 2, "Confirm restoration? (Y/n): ")
|
|
372
|
+
stdscr.refresh()
|
|
373
|
+
|
|
374
|
+
key = stdscr.getch()
|
|
375
|
+
return key in [ord("y"), ord("Y"), ord("\n"), ord("\r")]
|
|
376
|
+
|
|
377
|
+
def _fallback_selection(self, flattened_elements: List[Dict]) -> Optional[List[str]]:
|
|
378
|
+
"""Fallback selection method when curses is not available.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
flattened_elements: List of elements to select from
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
List of selected paths or None if cancelled
|
|
385
|
+
"""
|
|
386
|
+
print("\n" + "=" * 60)
|
|
387
|
+
print("🔍 Custom Elements Detected (Simple Mode)")
|
|
388
|
+
print("=" * 60)
|
|
389
|
+
print("These elements are not part of the official MoAI-ADK template:")
|
|
390
|
+
print()
|
|
391
|
+
|
|
392
|
+
element_list = [el for el in flattened_elements if el["type"] == "element"]
|
|
393
|
+
for i, element in enumerate(element_list, 1):
|
|
394
|
+
print(f" {i:2d}. [{element['category']}] {element['name']}")
|
|
395
|
+
|
|
396
|
+
print("\n💡 Selection Instructions:")
|
|
397
|
+
print(" • Enter numbers separated by commas (e.g., 1,3,5)")
|
|
398
|
+
print(" • Use 'all' to select all elements")
|
|
399
|
+
print(" • Press Enter with empty input to cancel")
|
|
400
|
+
|
|
401
|
+
try:
|
|
402
|
+
user_input = input("\nSelect elements to restore: ").strip()
|
|
403
|
+
except (KeyboardInterrupt, EOFError):
|
|
404
|
+
print("\n⚠️ Selection cancelled.")
|
|
405
|
+
return None
|
|
406
|
+
|
|
407
|
+
if not user_input:
|
|
408
|
+
return None
|
|
409
|
+
|
|
410
|
+
if user_input.lower() == "all":
|
|
411
|
+
return [el["path"] for el in element_list]
|
|
412
|
+
|
|
413
|
+
# Parse numbers
|
|
414
|
+
selected_paths = []
|
|
415
|
+
try:
|
|
416
|
+
indices = [int(x.strip()) for x in user_input.split(",")]
|
|
417
|
+
for idx in indices:
|
|
418
|
+
if 1 <= idx <= len(element_list):
|
|
419
|
+
selected_paths.append(element_list[idx - 1]["path"])
|
|
420
|
+
else:
|
|
421
|
+
print(f"⚠️ Invalid number: {idx}")
|
|
422
|
+
except ValueError:
|
|
423
|
+
print("⚠️ Invalid input. Please enter numbers separated by commas.")
|
|
424
|
+
return None
|
|
425
|
+
|
|
426
|
+
return selected_paths if selected_paths else None
|
|
427
|
+
|
|
428
|
+
def confirm_selection(self, selected_elements: List[str]) -> bool:
|
|
429
|
+
"""Confirm user's selection before proceeding with restoration.
|
|
430
|
+
|
|
431
|
+
Args:
|
|
432
|
+
selected_elements: List of selected element paths
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
True if user confirms, False otherwise
|
|
436
|
+
"""
|
|
437
|
+
print("\n📋 Selection Summary:")
|
|
438
|
+
print("-" * 40)
|
|
439
|
+
|
|
440
|
+
for i, element_path in enumerate(selected_elements, 1):
|
|
441
|
+
element_name = Path(element_path).name
|
|
442
|
+
element_type = self._get_element_type(element_path)
|
|
443
|
+
print(f" {i}. {element_name} ({element_type})")
|
|
444
|
+
|
|
445
|
+
print("-" * 40)
|
|
446
|
+
print(f"Total elements selected: {len(selected_elements)}")
|
|
447
|
+
|
|
448
|
+
try:
|
|
449
|
+
confirm = input("\nConfirm restoration? (y/N): ").strip().lower()
|
|
450
|
+
return confirm in ["y", "yes"]
|
|
451
|
+
except (KeyboardInterrupt, EOFError):
|
|
452
|
+
print("\n⚠️ Restoration cancelled.")
|
|
453
|
+
return False
|
|
454
|
+
|
|
455
|
+
def _get_element_type(self, element_path: str) -> str:
|
|
456
|
+
"""Get element type from path.
|
|
457
|
+
|
|
458
|
+
Args:
|
|
459
|
+
element_path: Path to element
|
|
460
|
+
|
|
461
|
+
Returns:
|
|
462
|
+
Element type string (agent, command, skill, hook)
|
|
463
|
+
"""
|
|
464
|
+
path = Path(element_path)
|
|
465
|
+
parts = path.parts
|
|
466
|
+
|
|
467
|
+
if "agents" in parts:
|
|
468
|
+
return "agent"
|
|
469
|
+
elif "commands" in parts:
|
|
470
|
+
return "command"
|
|
471
|
+
elif "skills" in parts:
|
|
472
|
+
return "skill"
|
|
473
|
+
elif "hooks" in parts:
|
|
474
|
+
return "hook"
|
|
475
|
+
else:
|
|
476
|
+
return "unknown"
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
def create_interactive_checkbox_ui(project_path: str | Path) -> InteractiveCheckboxUI:
|
|
480
|
+
"""Factory function to create an InteractiveCheckboxUI.
|
|
481
|
+
|
|
482
|
+
Args:
|
|
483
|
+
project_path: Path to the MoAI-ADK project directory
|
|
484
|
+
|
|
485
|
+
Returns:
|
|
486
|
+
Configured InteractiveCheckboxUI instance
|
|
487
|
+
"""
|
|
488
|
+
return InteractiveCheckboxUI(Path(project_path).resolve())
|