moai-adk 0.15.1__py3-none-any.whl ā 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -6
- moai_adk/__main__.py +136 -21
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +17 -5
- moai_adk/cli/commands/init.py +105 -47
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +8 -13
- moai_adk/cli/commands/update.py +1734 -65
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +144 -91
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +0 -1
- 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 +6 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +147 -16
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- 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 +8 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +2 -10
- moai_adk/core/git/checkpoint.py +1 -7
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +91 -2
- 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 +20 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +485 -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 +481 -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 +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +17 -39
- moai_adk/core/project/initializer.py +170 -33
- moai_adk/core/project/phase_executor.py +398 -68
- moai_adk/core/project/validator.py +7 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +37 -101
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- 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 +0 -1
- moai_adk/core/template/backup.py +82 -17
- moai_adk/core/template/config.py +112 -40
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +75 -26
- moai_adk/core/template/processor.py +750 -72
- moai_adk/core/template_engine.py +90 -48
- 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 +373 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +264 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +383 -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 +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/{alfred/shared/core ā moai/lib}/checkpoint.py +9 -36
- 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/{alfred/shared/core ā moai/lib}/project.py +63 -44
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/{alfred/core ā moai/lib}/timeout.py +40 -16
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +78 -50
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +312 -283
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +291 -94
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +469 -101
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +220 -13
- 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 +0 -1
- moai_adk/templates/.gitignore +197 -13
- moai_adk/templates/.mcp.json +20 -0
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +310 -1050
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +7 -11
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/{templates/.claude/hooks/alfred/utils ā utils}/timeout.py +8 -9
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.15.1.dist-info ā moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.15.1.dist-info ā moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -80
- moai_adk/core/tags/__init__.py +0 -86
- moai_adk/core/tags/ci_validator.py +0 -463
- moai_adk/core/tags/cli.py +0 -283
- moai_adk/core/tags/generator.py +0 -109
- moai_adk/core/tags/inserter.py +0 -99
- moai_adk/core/tags/mapper.py +0 -126
- moai_adk/core/tags/parser.py +0 -76
- moai_adk/core/tags/pre_commit_validator.py +0 -393
- moai_adk/core/tags/reporter.py +0 -956
- moai_adk/core/tags/tags.py +0 -149
- moai_adk/core/tags/validator.py +0 -897
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
- moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
- moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
- moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
- moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -419
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
- moai_adk/templates/.github/workflows/release.yml +0 -118
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/tag-report.yml +0 -269
- moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
- moai_adk/templates/.moai/config.json +0 -115
- moai_adk/templates/workflows/go-tag-validation.yml +0 -30
- moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
- moai_adk/templates/workflows/python-tag-validation.yml +0 -42
- moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
- moai_adk-0.15.1.dist-info/METADATA +0 -3094
- moai_adk-0.15.1.dist-info/RECORD +0 -365
- {moai_adk-0.15.1.dist-info ā moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
"""Selective Restorer for MoAI-ADK Custom Elements
|
|
2
|
+
|
|
3
|
+
This module provides functionality to restore selected custom elements from backup
|
|
4
|
+
during MoAI-ADK updates. It handles safe file restoration with conflict detection
|
|
5
|
+
and detailed reporting of restoration results.
|
|
6
|
+
|
|
7
|
+
Key Features:
|
|
8
|
+
- Preserves unselected elements (fixes disappearing issue)
|
|
9
|
+
- Only overwrites/creates selected elements from backup
|
|
10
|
+
- Never deletes existing files that aren't being restored
|
|
11
|
+
- Maintains all other custom elements intact
|
|
12
|
+
- Safe restoration with rollback capabilities
|
|
13
|
+
|
|
14
|
+
The restorer works with the existing MoAI-ADK backup system and ensures that
|
|
15
|
+
only explicitly selected elements are modified, preserving all other files.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import logging
|
|
19
|
+
import shutil
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SelectiveRestorer:
|
|
27
|
+
"""Restores selected custom elements from backup.
|
|
28
|
+
|
|
29
|
+
This class handles the actual file restoration process, copying selected elements
|
|
30
|
+
from backup to their original locations with proper conflict handling and reporting.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, project_path: Path, backup_path: Optional[Path] = None):
|
|
34
|
+
"""Initialize the selective restorer.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
project_path: Path to the MoAI-ADK project directory
|
|
38
|
+
backup_path: Path to the backup directory (auto-detected if not provided)
|
|
39
|
+
"""
|
|
40
|
+
self.project_path = project_path
|
|
41
|
+
self.backup_path = backup_path or self._find_latest_backup()
|
|
42
|
+
self.restoration_log: List[Dict[str, str]] = []
|
|
43
|
+
|
|
44
|
+
def _find_latest_backup(self) -> Optional[Path]:
|
|
45
|
+
"""Find the latest backup directory.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Path to the latest backup directory, or None if no backup found
|
|
49
|
+
"""
|
|
50
|
+
# Look for .moai-backups directory
|
|
51
|
+
backups_dir = self.project_path / ".moai-backups"
|
|
52
|
+
if not backups_dir.exists():
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
# Find all backup directories and sort by modification time
|
|
56
|
+
backup_dirs = []
|
|
57
|
+
for item in backups_dir.iterdir():
|
|
58
|
+
if item.is_dir() and item.name.startswith("pre-update-backup_"):
|
|
59
|
+
backup_dirs.append((item.stat().st_mtime, item))
|
|
60
|
+
|
|
61
|
+
if not backup_dirs:
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
# Return the most recent backup
|
|
65
|
+
backup_dirs.sort(reverse=True)
|
|
66
|
+
return backup_dirs[0][1] # Return the Path object
|
|
67
|
+
|
|
68
|
+
def restore_elements(self, selected_elements: List[str]) -> Tuple[bool, Dict[str, Any]]:
|
|
69
|
+
"""Restore selected custom elements from backup.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
selected_elements: List of element paths to restore
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Tuple of (success_status, restoration_stats)
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
>>> restorer = SelectiveRestorer("/project")
|
|
79
|
+
>>> success, stats = restorer.restore_elements([
|
|
80
|
+
... ".claude/agents/my-agent.md",
|
|
81
|
+
... ".claude/skills/my-skill/"
|
|
82
|
+
... ])
|
|
83
|
+
>>> print(f"Restoration {'success' if success else 'failed'}: {stats}")
|
|
84
|
+
"""
|
|
85
|
+
if not selected_elements:
|
|
86
|
+
logger.info("No elements selected for restoration.")
|
|
87
|
+
return True, {"total": 0, "success": 0, "failed": 0}
|
|
88
|
+
|
|
89
|
+
print(f"\nš Restoring {len(selected_elements)} selected elements...")
|
|
90
|
+
print("-" * 50)
|
|
91
|
+
|
|
92
|
+
# Group elements by type for organized restoration
|
|
93
|
+
element_groups = self._group_elements_by_type(selected_elements)
|
|
94
|
+
|
|
95
|
+
# Track restoration statistics
|
|
96
|
+
stats: Dict[str, Any] = {"total": 0, "success": 0, "failed": 0, "by_type": {}}
|
|
97
|
+
|
|
98
|
+
# Restore each type of element
|
|
99
|
+
for element_type, elements in element_groups.items():
|
|
100
|
+
print(f"\nš Restoring {element_type}s...")
|
|
101
|
+
type_stats = self._restore_element_type(element_type, elements)
|
|
102
|
+
by_type: Dict[str, Dict[str, int]] = stats["by_type"]
|
|
103
|
+
by_type[element_type] = type_stats
|
|
104
|
+
total_count: int = stats["total"]
|
|
105
|
+
success_count: int = stats["success"]
|
|
106
|
+
failed_count: int = stats["failed"]
|
|
107
|
+
stats["total"] = total_count + type_stats["total"]
|
|
108
|
+
stats["success"] = success_count + type_stats["success"]
|
|
109
|
+
stats["failed"] = failed_count + type_stats["failed"]
|
|
110
|
+
|
|
111
|
+
# Display final summary
|
|
112
|
+
self._display_restoration_summary(stats)
|
|
113
|
+
|
|
114
|
+
# Log restoration details
|
|
115
|
+
self._log_restoration_details(selected_elements, stats)
|
|
116
|
+
|
|
117
|
+
is_success: bool = stats["failed"] == 0
|
|
118
|
+
if is_success:
|
|
119
|
+
logger.info(f"Successfully restored {stats['success']} elements")
|
|
120
|
+
else:
|
|
121
|
+
logger.warning(f"Failed to restore {stats['failed']} elements")
|
|
122
|
+
|
|
123
|
+
return is_success, stats
|
|
124
|
+
|
|
125
|
+
def _group_elements_by_type(self, selected_elements: List[str]) -> Dict[str, List[Path]]:
|
|
126
|
+
"""Group selected elements by their type.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
selected_elements: List of element paths
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Dictionary with element types as keys and lists of element paths as values
|
|
133
|
+
"""
|
|
134
|
+
groups: Dict[str, List[Path]] = {
|
|
135
|
+
"agents": [],
|
|
136
|
+
"commands": [],
|
|
137
|
+
"skills": [],
|
|
138
|
+
"hooks": [],
|
|
139
|
+
"unknown": [],
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
for element_path in selected_elements:
|
|
143
|
+
path = Path(element_path)
|
|
144
|
+
parts = path.parts
|
|
145
|
+
|
|
146
|
+
if "agents" in parts:
|
|
147
|
+
groups["agents"].append(path)
|
|
148
|
+
elif "commands" in parts and "moai" in parts:
|
|
149
|
+
groups["commands"].append(path)
|
|
150
|
+
elif "commands" in parts:
|
|
151
|
+
groups["commands"].append(path)
|
|
152
|
+
elif "skills" in parts:
|
|
153
|
+
groups["skills"].append(path)
|
|
154
|
+
elif "hooks" in parts and "moai" in parts:
|
|
155
|
+
groups["hooks"].append(path)
|
|
156
|
+
elif "hooks" in parts:
|
|
157
|
+
groups["hooks"].append(path)
|
|
158
|
+
else:
|
|
159
|
+
logger.warning(f"Unknown element type for: {element_path}")
|
|
160
|
+
groups["unknown"].append(path)
|
|
161
|
+
|
|
162
|
+
return groups
|
|
163
|
+
|
|
164
|
+
def _restore_element_type(self, element_type: str, elements: List[Path]) -> Dict[str, int]:
|
|
165
|
+
"""Restore elements of a specific type.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
element_type: Type of elements to restore
|
|
169
|
+
elements: List of element paths to restore
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Statistics for this restoration type
|
|
173
|
+
"""
|
|
174
|
+
stats = {"total": len(elements), "success": 0, "failed": 0}
|
|
175
|
+
|
|
176
|
+
for element_path in elements:
|
|
177
|
+
try:
|
|
178
|
+
success = self._restore_single_element(element_path, element_type)
|
|
179
|
+
if success:
|
|
180
|
+
stats["success"] += 1
|
|
181
|
+
print(f" ā {element_path.name}")
|
|
182
|
+
else:
|
|
183
|
+
stats["failed"] += 1
|
|
184
|
+
print(f" ā Failed: {element_path.name}")
|
|
185
|
+
except Exception as e:
|
|
186
|
+
stats["failed"] += 1
|
|
187
|
+
print(f" ā Error: {element_path.name} - {e}")
|
|
188
|
+
logger.error(f"Error restoring {element_path}: {e}")
|
|
189
|
+
|
|
190
|
+
return stats
|
|
191
|
+
|
|
192
|
+
def _normalize_element_path(self, element_path: Path) -> Optional[Path]:
|
|
193
|
+
"""Normalize element path to be relative to project structure.
|
|
194
|
+
|
|
195
|
+
Handles both absolute and relative paths correctly:
|
|
196
|
+
- Absolute paths: extracts the relevant portion (.claude/ or .moai/)
|
|
197
|
+
- Relative paths: validates and returns as-is
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
element_path: Path to normalize (can be absolute or relative)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Normalized relative path, or None if normalization fails
|
|
204
|
+
"""
|
|
205
|
+
element_str = str(element_path)
|
|
206
|
+
|
|
207
|
+
# Handle absolute paths
|
|
208
|
+
if element_path.is_absolute():
|
|
209
|
+
# Extract .claude/ or .moai/ portion from absolute paths
|
|
210
|
+
for safe_prefix in [".claude/", ".moai/"]:
|
|
211
|
+
if safe_prefix in element_str:
|
|
212
|
+
try:
|
|
213
|
+
# Split on the safe prefix and take the portion after it
|
|
214
|
+
_, relative_part = element_str.split(safe_prefix, 1)
|
|
215
|
+
# Reconstruct the relative path
|
|
216
|
+
normalized_path = Path(safe_prefix.rstrip("/")) / relative_part
|
|
217
|
+
logger.debug(f"Normalized absolute path {element_path} -> {normalized_path}")
|
|
218
|
+
return normalized_path
|
|
219
|
+
except (ValueError, IndexError):
|
|
220
|
+
logger.warning(f"Failed to extract relative path from {element_path}")
|
|
221
|
+
continue
|
|
222
|
+
|
|
223
|
+
# If no safe prefix found in absolute path, this is suspicious
|
|
224
|
+
logger.error(f"Absolute path {element_path} doesn't contain .claude/ or .moai/ prefixes")
|
|
225
|
+
return None
|
|
226
|
+
|
|
227
|
+
# Handle relative paths
|
|
228
|
+
else:
|
|
229
|
+
# Ensure relative path starts with .claude or .moai
|
|
230
|
+
if not (element_str.startswith(".claude/") or element_str.startswith(".moai/")):
|
|
231
|
+
logger.error(f"Relative path {element_path} must start with .claude/ or .moai/")
|
|
232
|
+
return None
|
|
233
|
+
|
|
234
|
+
logger.debug(f"Relative path already normalized: {element_path}")
|
|
235
|
+
return element_path
|
|
236
|
+
|
|
237
|
+
def _validate_element_path(self, relative_path: Path) -> bool:
|
|
238
|
+
"""Validate an element path for security and correctness.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
relative_path: Relative path to validate
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
True if path is valid and safe, False otherwise
|
|
245
|
+
"""
|
|
246
|
+
path_str = str(relative_path)
|
|
247
|
+
|
|
248
|
+
# Security check: prevent path traversal attacks
|
|
249
|
+
if ".." in path_str:
|
|
250
|
+
logger.error(f"Path traversal attempt detected in: {path_str}")
|
|
251
|
+
return False
|
|
252
|
+
|
|
253
|
+
# Ensure path starts with allowed prefixes
|
|
254
|
+
allowed_prefixes = [".claude/", ".moai/"]
|
|
255
|
+
if not any(path_str.startswith(prefix) for prefix in allowed_prefixes):
|
|
256
|
+
logger.error(f"Path {path_str} doesn't start with allowed prefix: {allowed_prefixes}")
|
|
257
|
+
return False
|
|
258
|
+
|
|
259
|
+
# Additional validation: check for suspicious patterns
|
|
260
|
+
suspicious_patterns = ["//", "~", "$"]
|
|
261
|
+
for pattern in suspicious_patterns:
|
|
262
|
+
if pattern in path_str:
|
|
263
|
+
logger.warning(f"Suspicious pattern '{pattern}' found in path: {path_str}")
|
|
264
|
+
|
|
265
|
+
return True
|
|
266
|
+
|
|
267
|
+
def _restore_single_element(self, element_path: Path, element_type: str) -> bool:
|
|
268
|
+
"""Restore a single element from backup.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
element_path: Path to restore the element to (can be absolute or relative)
|
|
272
|
+
element_type: Type of element (for target directory creation)
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
True if restoration succeeded, False otherwise
|
|
276
|
+
"""
|
|
277
|
+
# Normalize element path to get relative path within project structure
|
|
278
|
+
relative_path = self._normalize_element_path(element_path)
|
|
279
|
+
if relative_path is None:
|
|
280
|
+
logger.error(f"Failed to normalize element path: {element_path}")
|
|
281
|
+
return False
|
|
282
|
+
|
|
283
|
+
# Validate the normalized path for security
|
|
284
|
+
if not self._validate_element_path(relative_path):
|
|
285
|
+
logger.error(f"Invalid element path: {relative_path}")
|
|
286
|
+
return False
|
|
287
|
+
|
|
288
|
+
# Create absolute target path
|
|
289
|
+
target_path = self.project_path / relative_path
|
|
290
|
+
backup_source = self.backup_path / relative_path
|
|
291
|
+
|
|
292
|
+
# Ensure backup source exists
|
|
293
|
+
if not backup_source.exists():
|
|
294
|
+
logger.warning(f"Backup not found for: {relative_path}")
|
|
295
|
+
return False
|
|
296
|
+
|
|
297
|
+
# Create target directory if needed
|
|
298
|
+
target_dir = target_path.parent
|
|
299
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
300
|
+
|
|
301
|
+
# Handle conflicts
|
|
302
|
+
if target_path.exists():
|
|
303
|
+
if not self._handle_file_conflict(target_path, backup_source):
|
|
304
|
+
logger.warning(f"Conflict handling failed for: {relative_path}")
|
|
305
|
+
return False
|
|
306
|
+
|
|
307
|
+
# Perform the restoration
|
|
308
|
+
try:
|
|
309
|
+
if backup_source.is_dir():
|
|
310
|
+
# For directories (skills)
|
|
311
|
+
shutil.copytree(backup_source, target_path, dirs_exist_ok=True)
|
|
312
|
+
else:
|
|
313
|
+
# For files
|
|
314
|
+
shutil.copy2(backup_source, target_path)
|
|
315
|
+
|
|
316
|
+
# Record successful restoration
|
|
317
|
+
self.restoration_log.append(
|
|
318
|
+
{
|
|
319
|
+
"path": str(element_path),
|
|
320
|
+
"type": element_type,
|
|
321
|
+
"status": "success",
|
|
322
|
+
"timestamp": str(backup_source.stat().st_mtime),
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
logger.info(f"Restored: {relative_path}")
|
|
327
|
+
return True
|
|
328
|
+
|
|
329
|
+
except Exception as e:
|
|
330
|
+
logger.error(f"Failed to restore {relative_path}: {e}")
|
|
331
|
+
return False
|
|
332
|
+
|
|
333
|
+
def _handle_file_conflict(self, target_path: Path, backup_source: Path) -> bool:
|
|
334
|
+
"""Handle file or directory conflict during restoration.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
target_path: Path to target file/directory (existing)
|
|
338
|
+
backup_source: Path to backup source file/directory
|
|
339
|
+
|
|
340
|
+
Returns:
|
|
341
|
+
True if conflict handled successfully, False otherwise
|
|
342
|
+
"""
|
|
343
|
+
try:
|
|
344
|
+
# Handle directory conflicts (skills are directories)
|
|
345
|
+
if target_path.is_dir() and backup_source.is_dir():
|
|
346
|
+
# Directories - backup target directory and return True
|
|
347
|
+
backup_target = target_path.parent / f"{target_path.name}.backup_dir"
|
|
348
|
+
try:
|
|
349
|
+
if backup_target.exists():
|
|
350
|
+
shutil.rmtree(backup_target)
|
|
351
|
+
shutil.copytree(target_path, backup_target, dirs_exist_ok=True)
|
|
352
|
+
logger.debug(f"Backed up directory: {target_path} -> {backup_target}")
|
|
353
|
+
return True
|
|
354
|
+
except Exception as e:
|
|
355
|
+
logger.error(f"Failed to backup directory {target_path}: {e}")
|
|
356
|
+
return False
|
|
357
|
+
|
|
358
|
+
# Handle file conflicts
|
|
359
|
+
if not target_path.is_file() or not backup_source.is_file():
|
|
360
|
+
# Mixed types or non-existent, skip comparison
|
|
361
|
+
logger.debug(f"Skipping conflict check for non-file: {target_path}")
|
|
362
|
+
return True
|
|
363
|
+
|
|
364
|
+
# Compare file contents
|
|
365
|
+
target_content = target_path.read_text(encoding="utf-8", errors="ignore")
|
|
366
|
+
backup_content = backup_source.read_text(encoding="utf-8", errors="ignore")
|
|
367
|
+
|
|
368
|
+
if target_content == backup_content:
|
|
369
|
+
# Files are identical, no conflict
|
|
370
|
+
logger.debug(f"No conflict detected for: {target_path}")
|
|
371
|
+
return True
|
|
372
|
+
|
|
373
|
+
# Files differ, prompt for action
|
|
374
|
+
print(f"\nā ļø Conflict detected for: {target_path.name}")
|
|
375
|
+
print(" Target file exists and differs from backup")
|
|
376
|
+
|
|
377
|
+
# For now, we'll backup the target and restore the backup
|
|
378
|
+
backup_target = target_path.with_suffix(".backup")
|
|
379
|
+
try:
|
|
380
|
+
shutil.copy2(target_path, backup_target)
|
|
381
|
+
print(f" Backed up to: {backup_target.name}")
|
|
382
|
+
logger.info(f"Backed up conflicting file: {backup_target}")
|
|
383
|
+
return True
|
|
384
|
+
except Exception as e:
|
|
385
|
+
logger.error(f"Failed to backup conflicting file {target_path}: {e}")
|
|
386
|
+
return False
|
|
387
|
+
|
|
388
|
+
except Exception as e:
|
|
389
|
+
logger.error(f"Error handling file conflict for {target_path}: {e}")
|
|
390
|
+
return False
|
|
391
|
+
|
|
392
|
+
def _display_restoration_summary(self, stats: Dict[str, int]) -> None:
|
|
393
|
+
"""Display summary of restoration results.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
stats: Restoration statistics dictionary
|
|
397
|
+
"""
|
|
398
|
+
print("\n" + "=" * 50)
|
|
399
|
+
print("š Restoration Complete")
|
|
400
|
+
print("=" * 50)
|
|
401
|
+
print(f"Total elements: {stats['total']}")
|
|
402
|
+
print(f"ā
Successfully restored: {stats['success']}")
|
|
403
|
+
|
|
404
|
+
if stats["failed"] > 0:
|
|
405
|
+
print(f"ā Failed to restore: {stats['failed']}")
|
|
406
|
+
|
|
407
|
+
# Show breakdown by type
|
|
408
|
+
if "by_type" in stats:
|
|
409
|
+
print("\nš By Type:")
|
|
410
|
+
by_type_stats: Dict[str, Dict[str, int]] = stats["by_type"] # type: ignore[assignment]
|
|
411
|
+
for element_type, type_stats in by_type_stats.items():
|
|
412
|
+
if type_stats["total"] > 0:
|
|
413
|
+
status_icon = "ā
" if type_stats["failed"] == 0 else "ā"
|
|
414
|
+
print(f" {element_type.title()}: {type_stats['success']}/{type_stats['total']} {status_icon}")
|
|
415
|
+
|
|
416
|
+
def _log_restoration_details(self, selected_elements: List[str], stats: Dict[str, int]) -> None:
|
|
417
|
+
"""Log detailed restoration information for debugging.
|
|
418
|
+
|
|
419
|
+
Args:
|
|
420
|
+
selected_elements: List of elements that were selected for restoration
|
|
421
|
+
stats: Restoration statistics
|
|
422
|
+
"""
|
|
423
|
+
logger.info(
|
|
424
|
+
f"Restoration completed - Total: {stats['total']}, Success: {stats['success']}, Failed: {stats['failed']}"
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
if stats["failed"] > 0:
|
|
428
|
+
failed_elements = [elem for elem in selected_elements if not self._was_restoration_successful(Path(elem))]
|
|
429
|
+
logger.warning(f"Failed elements: {failed_elements}")
|
|
430
|
+
|
|
431
|
+
# Log all restoration attempts from the log
|
|
432
|
+
for entry in self.restoration_log:
|
|
433
|
+
if entry["status"] == "success":
|
|
434
|
+
logger.debug(f"ā Restored: {entry['path']} ({entry['type']})")
|
|
435
|
+
else:
|
|
436
|
+
logger.warning(f"ā Failed: {entry['path']} ({entry['type']})")
|
|
437
|
+
|
|
438
|
+
def _was_restoration_successful(self, element_path: Path) -> bool:
|
|
439
|
+
"""Check if an element was successfully restored.
|
|
440
|
+
|
|
441
|
+
Args:
|
|
442
|
+
element_path: Path to check
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
True if element was restored successfully
|
|
446
|
+
"""
|
|
447
|
+
for entry in self.restoration_log:
|
|
448
|
+
if str(Path(entry["path"])) == str(element_path) and entry["status"] == "success":
|
|
449
|
+
return True
|
|
450
|
+
return False
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
def create_selective_restorer(project_path: str | Path, backup_path: Optional[Path] = None) -> SelectiveRestorer:
|
|
454
|
+
"""Factory function to create a SelectiveRestorer.
|
|
455
|
+
|
|
456
|
+
Args:
|
|
457
|
+
project_path: Path to the MoAI-ADK project directory
|
|
458
|
+
backup_path: Path to backup directory (auto-detected if not provided)
|
|
459
|
+
|
|
460
|
+
Returns:
|
|
461
|
+
Configured SelectiveRestorer instance
|
|
462
|
+
|
|
463
|
+
Example:
|
|
464
|
+
>>> restorer = create_selective_restorer("/path/to/project")
|
|
465
|
+
>>> success, stats = restorer.restore_elements([
|
|
466
|
+
... ".claude/agents/my-agent.md"
|
|
467
|
+
... ])
|
|
468
|
+
>>> print(f"Restoration result: {'success' if success else 'failed'}")
|
|
469
|
+
"""
|
|
470
|
+
return SelectiveRestorer(Path(project_path).resolve(), backup_path)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Template utilities for MoAI-ADK migration system.
|
|
2
|
+
|
|
3
|
+
This module provides utility functions for working with MoAI-ADK templates,
|
|
4
|
+
including functions to get template element names for comparison with user-created elements.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Set
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _get_template_skill_names() -> Set[str]:
|
|
12
|
+
"""Get skill names from the fresh installation template.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
Set of skill directory names found in the template
|
|
16
|
+
"""
|
|
17
|
+
template_path = Path(__file__).parent.parent.parent / "templates" / ".claude" / "skills"
|
|
18
|
+
skill_names = set()
|
|
19
|
+
|
|
20
|
+
if template_path.exists():
|
|
21
|
+
for skill_dir in template_path.iterdir():
|
|
22
|
+
if skill_dir.is_dir() and skill_dir.name.startswith("moai-"):
|
|
23
|
+
skill_names.add(skill_dir.name)
|
|
24
|
+
|
|
25
|
+
return skill_names
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _get_template_command_names() -> Set[str]:
|
|
29
|
+
"""Get command names from the fresh installation template.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Set of command file names found in the template
|
|
33
|
+
"""
|
|
34
|
+
template_path = Path(__file__).parent.parent.parent / "templates" / ".claude" / "commands" / "moai"
|
|
35
|
+
command_names = set()
|
|
36
|
+
|
|
37
|
+
if template_path.exists():
|
|
38
|
+
for cmd_file in template_path.glob("*.md"):
|
|
39
|
+
command_names.add(cmd_file.name)
|
|
40
|
+
|
|
41
|
+
return command_names
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _get_template_agent_names() -> Set[str]:
|
|
45
|
+
"""Get agent names from the fresh installation template.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Set of agent file names found in the template
|
|
49
|
+
"""
|
|
50
|
+
template_path = Path(__file__).parent.parent.parent / "templates" / ".claude" / "agents"
|
|
51
|
+
agent_names = set()
|
|
52
|
+
|
|
53
|
+
if template_path.exists():
|
|
54
|
+
for agent_file in template_path.rglob("*.md"):
|
|
55
|
+
if agent_file.parent.name == "moai":
|
|
56
|
+
agent_names.add(agent_file.name)
|
|
57
|
+
|
|
58
|
+
return agent_names
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _get_template_hook_names() -> Set[str]:
|
|
62
|
+
"""Get hook names from the fresh installation template.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Set of hook file names found in the template
|
|
66
|
+
"""
|
|
67
|
+
template_path = Path(__file__).parent.parent.parent / "templates" / ".claude" / "hooks" / "moai"
|
|
68
|
+
hook_names = set()
|
|
69
|
+
|
|
70
|
+
if template_path.exists():
|
|
71
|
+
for hook_file in template_path.rglob("*.py"):
|
|
72
|
+
hook_names.add(hook_file.name)
|
|
73
|
+
|
|
74
|
+
return hook_names
|