moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -224,9 +224,7 @@ class RollbackManager:
|
|
|
224
224
|
restored_files=[],
|
|
225
225
|
)
|
|
226
226
|
|
|
227
|
-
def rollback_research_integration(
|
|
228
|
-
self, component_type: str = None, component_name: str = None
|
|
229
|
-
) -> RollbackResult:
|
|
227
|
+
def rollback_research_integration(self, component_type: str = None, component_name: str = None) -> RollbackResult:
|
|
230
228
|
"""
|
|
231
229
|
Specialized rollback for research integration changes
|
|
232
230
|
|
|
@@ -237,15 +235,11 @@ class RollbackManager:
|
|
|
237
235
|
Returns:
|
|
238
236
|
RollbackResult with operation details
|
|
239
237
|
"""
|
|
240
|
-
logger.info(
|
|
241
|
-
f"Rolling back research integration: {component_type}:{component_name}"
|
|
242
|
-
)
|
|
238
|
+
logger.info(f"Rolling back research integration: {component_type}:{component_name}")
|
|
243
239
|
|
|
244
240
|
try:
|
|
245
241
|
# Find relevant rollback points for research integration
|
|
246
|
-
research_rollback_points = self._find_research_rollback_points(
|
|
247
|
-
component_type, component_name
|
|
248
|
-
)
|
|
242
|
+
research_rollback_points = self._find_research_rollback_points(component_type, component_name)
|
|
249
243
|
|
|
250
244
|
if not research_rollback_points:
|
|
251
245
|
return RollbackResult(
|
|
@@ -256,9 +250,7 @@ class RollbackManager:
|
|
|
256
250
|
)
|
|
257
251
|
|
|
258
252
|
# Use the most recent suitable rollback point
|
|
259
|
-
latest_rollback = max(
|
|
260
|
-
research_rollback_points, key=lambda x: x["timestamp"]
|
|
261
|
-
)
|
|
253
|
+
latest_rollback = max(research_rollback_points, key=lambda x: x["timestamp"])
|
|
262
254
|
|
|
263
255
|
# Perform targeted rollback
|
|
264
256
|
restored_files, failed_files = self._perform_research_rollback(
|
|
@@ -273,7 +265,8 @@ class RollbackManager:
|
|
|
273
265
|
return RollbackResult(
|
|
274
266
|
success=success,
|
|
275
267
|
rollback_point_id=latest_rollback["id"],
|
|
276
|
-
message=f"Research integration rollback
|
|
268
|
+
message=f"Research integration rollback "
|
|
269
|
+
f"{'completed successfully' if success else 'completed with errors'}",
|
|
277
270
|
restored_files=restored_files,
|
|
278
271
|
failed_files=failed_files or [],
|
|
279
272
|
validation_results=validation_results,
|
|
@@ -322,10 +315,12 @@ class RollbackManager:
|
|
|
322
315
|
Returns:
|
|
323
316
|
Validation results with system health information
|
|
324
317
|
"""
|
|
318
|
+
issues: List[str] = []
|
|
319
|
+
recommendations: List[str] = []
|
|
325
320
|
validation_results = {
|
|
326
321
|
"system_healthy": True,
|
|
327
|
-
"issues":
|
|
328
|
-
"recommendations":
|
|
322
|
+
"issues": issues,
|
|
323
|
+
"recommendations": recommendations,
|
|
329
324
|
"rollback_points_count": len(self.registry),
|
|
330
325
|
"backup_size": self._calculate_backup_size(),
|
|
331
326
|
"last_rollback": None,
|
|
@@ -342,48 +337,38 @@ class RollbackManager:
|
|
|
342
337
|
|
|
343
338
|
for dir_path in required_dirs:
|
|
344
339
|
if not dir_path.exists():
|
|
345
|
-
|
|
346
|
-
f"Missing backup directory: {dir_path}"
|
|
347
|
-
)
|
|
340
|
+
issues.append(f"Missing backup directory: {dir_path}")
|
|
348
341
|
validation_results["system_healthy"] = False
|
|
349
342
|
|
|
350
343
|
# Validate rollback points
|
|
351
|
-
invalid_rollback_points = []
|
|
344
|
+
invalid_rollback_points: List[str] = []
|
|
352
345
|
for rollback_id, rollback_data in self.registry.items():
|
|
353
346
|
backup_path = Path(rollback_data["backup_path"])
|
|
354
347
|
if not backup_path.exists():
|
|
355
348
|
invalid_rollback_points.append(rollback_id)
|
|
356
349
|
|
|
357
350
|
if invalid_rollback_points:
|
|
358
|
-
|
|
359
|
-
f"Invalid rollback points: {invalid_rollback_points}"
|
|
360
|
-
)
|
|
351
|
+
issues.append(f"Invalid rollback points: {invalid_rollback_points}")
|
|
361
352
|
validation_results["system_healthy"] = False
|
|
362
353
|
|
|
363
354
|
# Check available disk space
|
|
364
|
-
backup_size = validation_results["backup_size"]
|
|
355
|
+
backup_size: int = validation_results["backup_size"] # type: ignore[assignment]
|
|
365
356
|
free_space = shutil.disk_usage(self.backup_root).free
|
|
366
357
|
if backup_size > free_space * 0.8: # Using more than 80% of free space
|
|
367
|
-
|
|
368
|
-
"Consider cleaning up old rollback points"
|
|
369
|
-
)
|
|
358
|
+
recommendations.append("Consider cleaning up old rollback points")
|
|
370
359
|
|
|
371
360
|
# Check last rollback
|
|
372
361
|
if self.registry:
|
|
373
|
-
last_rollback = max(
|
|
374
|
-
self.registry.values(), key=lambda x: x["timestamp"]
|
|
375
|
-
)
|
|
362
|
+
last_rollback = max(self.registry.values(), key=lambda x: x["timestamp"])
|
|
376
363
|
validation_results["last_rollback"] = last_rollback["timestamp"]
|
|
377
364
|
|
|
378
365
|
except Exception as e:
|
|
379
366
|
validation_results["system_healthy"] = False
|
|
380
|
-
|
|
367
|
+
issues.append(f"Validation error: {str(e)}")
|
|
381
368
|
|
|
382
369
|
return validation_results
|
|
383
370
|
|
|
384
|
-
def cleanup_old_rollbacks(
|
|
385
|
-
self, keep_count: int = 10, dry_run: bool = True
|
|
386
|
-
) -> Dict[str, Any]:
|
|
371
|
+
def cleanup_old_rollbacks(self, keep_count: int = 10, dry_run: bool = True) -> Dict[str, Any]:
|
|
387
372
|
"""
|
|
388
373
|
Clean up old rollback points
|
|
389
374
|
|
|
@@ -406,10 +391,7 @@ class RollbackManager:
|
|
|
406
391
|
"dry_run": True,
|
|
407
392
|
"would_delete_count": len(to_delete),
|
|
408
393
|
"would_keep_count": len(to_keep),
|
|
409
|
-
"would_free_space": sum(
|
|
410
|
-
self._get_directory_size(Path(rp["backup_path"]))
|
|
411
|
-
for rp in to_delete
|
|
412
|
-
),
|
|
394
|
+
"would_free_space": sum(self._get_directory_size(Path(rp["backup_path"])) for rp in to_delete),
|
|
413
395
|
}
|
|
414
396
|
|
|
415
397
|
# Perform actual cleanup
|
|
@@ -429,9 +411,7 @@ class RollbackManager:
|
|
|
429
411
|
deleted_count += 1
|
|
430
412
|
|
|
431
413
|
except Exception as e:
|
|
432
|
-
logger.warning(
|
|
433
|
-
f"Failed to delete rollback point {rollback_point['id']}: {str(e)}"
|
|
434
|
-
)
|
|
414
|
+
logger.warning(f"Failed to delete rollback point {rollback_point['id']}: {str(e)}")
|
|
435
415
|
|
|
436
416
|
# Save updated registry
|
|
437
417
|
self._save_registry()
|
|
@@ -446,14 +426,14 @@ class RollbackManager:
|
|
|
446
426
|
def _generate_rollback_id(self) -> str:
|
|
447
427
|
"""Generate unique rollback point ID"""
|
|
448
428
|
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
449
|
-
random_suffix = hashlib.md5(os.urandom(4)).hexdigest()[:8]
|
|
429
|
+
random_suffix = hashlib.md5(os.urandom(4), usedforsecurity=False).hexdigest()[:8]
|
|
450
430
|
return f"rollback_{timestamp}_{random_suffix}"
|
|
451
431
|
|
|
452
432
|
def _load_registry(self) -> Dict[str, Any]:
|
|
453
433
|
"""Load rollback registry from file"""
|
|
454
434
|
if self.registry_file.exists():
|
|
455
435
|
try:
|
|
456
|
-
with open(self.registry_file, "r") as f:
|
|
436
|
+
with open(self.registry_file, "r", encoding="utf-8") as f:
|
|
457
437
|
return json.load(f)
|
|
458
438
|
except Exception as e:
|
|
459
439
|
logger.warning(f"Failed to load rollback registry: {str(e)}")
|
|
@@ -463,8 +443,8 @@ class RollbackManager:
|
|
|
463
443
|
def _save_registry(self):
|
|
464
444
|
"""Save rollback registry to file"""
|
|
465
445
|
try:
|
|
466
|
-
with open(self.registry_file, "w") as f:
|
|
467
|
-
json.dump(self.registry, f, indent=2, default=str)
|
|
446
|
+
with open(self.registry_file, "w", encoding="utf-8") as f:
|
|
447
|
+
json.dump(self.registry, f, indent=2, default=str, ensure_ascii=False)
|
|
468
448
|
except Exception as e:
|
|
469
449
|
logger.error(f"Failed to save rollback registry: {str(e)}")
|
|
470
450
|
raise
|
|
@@ -487,9 +467,7 @@ class RollbackManager:
|
|
|
487
467
|
# Backup .claude/settings.local.json
|
|
488
468
|
local_settings_file = self.project_root / ".claude" / "settings.local.json"
|
|
489
469
|
if local_settings_file.exists():
|
|
490
|
-
shutil.copy2(
|
|
491
|
-
local_settings_file, config_backup_path / "settings.local.json"
|
|
492
|
-
)
|
|
470
|
+
shutil.copy2(local_settings_file, config_backup_path / "settings.local.json")
|
|
493
471
|
|
|
494
472
|
return str(config_backup_path)
|
|
495
473
|
|
|
@@ -537,18 +515,17 @@ class RollbackManager:
|
|
|
537
515
|
with open(file_path, "rb") as f:
|
|
538
516
|
# Update hash with file content and path
|
|
539
517
|
checksum_hash.update(f.read())
|
|
540
|
-
checksum_hash.update(
|
|
541
|
-
str(file_path.relative_to(backup_dir)).encode()
|
|
542
|
-
)
|
|
518
|
+
checksum_hash.update(str(file_path.relative_to(backup_dir)).encode())
|
|
543
519
|
|
|
544
520
|
return checksum_hash.hexdigest()
|
|
545
521
|
|
|
546
522
|
def _validate_rollback_point(self, rollback_point: RollbackPoint) -> Dict[str, Any]:
|
|
547
523
|
"""Validate rollback point before restoration"""
|
|
524
|
+
warnings: List[str] = []
|
|
548
525
|
validation_result = {
|
|
549
526
|
"valid": True,
|
|
550
527
|
"message": "Rollback point is valid",
|
|
551
|
-
"warnings":
|
|
528
|
+
"warnings": warnings,
|
|
552
529
|
}
|
|
553
530
|
|
|
554
531
|
try:
|
|
@@ -562,9 +539,7 @@ class RollbackManager:
|
|
|
562
539
|
# Verify checksum
|
|
563
540
|
current_checksum = self._calculate_backup_checksum(backup_path)
|
|
564
541
|
if current_checksum != rollback_point.checksum:
|
|
565
|
-
|
|
566
|
-
"Backup checksum mismatch - possible corruption"
|
|
567
|
-
)
|
|
542
|
+
warnings.append("Backup checksum mismatch - possible corruption")
|
|
568
543
|
|
|
569
544
|
# Check essential files exist
|
|
570
545
|
required_files = [
|
|
@@ -574,9 +549,7 @@ class RollbackManager:
|
|
|
574
549
|
|
|
575
550
|
missing_files = [f for f in required_files if not f.exists()]
|
|
576
551
|
if missing_files:
|
|
577
|
-
|
|
578
|
-
f"Missing backup files: {missing_files}"
|
|
579
|
-
)
|
|
552
|
+
warnings.append(f"Missing backup files: {missing_files}")
|
|
580
553
|
|
|
581
554
|
except Exception as e:
|
|
582
555
|
validation_result["valid"] = False
|
|
@@ -584,13 +557,11 @@ class RollbackManager:
|
|
|
584
557
|
|
|
585
558
|
return validation_result
|
|
586
559
|
|
|
587
|
-
def _perform_rollback(
|
|
588
|
-
self, rollback_point: RollbackPoint
|
|
589
|
-
) -> Tuple[List[str], List[str]]:
|
|
560
|
+
def _perform_rollback(self, rollback_point: RollbackPoint) -> Tuple[List[str], List[str]]:
|
|
590
561
|
"""Perform the actual rollback operation"""
|
|
591
562
|
backup_path = Path(rollback_point.backup_path)
|
|
592
|
-
restored_files = []
|
|
593
|
-
failed_files = []
|
|
563
|
+
restored_files: List[str] = []
|
|
564
|
+
failed_files: List[str] = []
|
|
594
565
|
|
|
595
566
|
try:
|
|
596
567
|
# Restore configuration
|
|
@@ -598,51 +569,43 @@ class RollbackManager:
|
|
|
598
569
|
if config_backup.exists():
|
|
599
570
|
for config_file in config_backup.rglob("*"):
|
|
600
571
|
if config_file.is_file():
|
|
601
|
-
target_path = (
|
|
602
|
-
self.project_root
|
|
603
|
-
/ ".moai"
|
|
604
|
-
/ config_file.relative_to(config_backup)
|
|
605
|
-
)
|
|
572
|
+
target_path = self.project_root / ".moai" / config_file.relative_to(config_backup)
|
|
606
573
|
target_path.parent.mkdir(parents=True, exist_ok=True)
|
|
607
574
|
try:
|
|
608
575
|
shutil.copy2(config_file, target_path)
|
|
609
576
|
restored_files.append(str(target_path))
|
|
610
577
|
except Exception as e:
|
|
611
|
-
failed_files.append(
|
|
578
|
+
failed_files.append(f"{target_path}: {str(e)}")
|
|
612
579
|
|
|
613
580
|
# Restore research components
|
|
614
581
|
research_backup = backup_path / "research"
|
|
615
582
|
if research_backup.exists():
|
|
616
583
|
for research_file in research_backup.rglob("*"):
|
|
617
584
|
if research_file.is_file():
|
|
618
|
-
target_path = self.project_root / research_file.relative_to(
|
|
619
|
-
research_backup
|
|
620
|
-
)
|
|
585
|
+
target_path = self.project_root / research_file.relative_to(research_backup)
|
|
621
586
|
target_path.parent.mkdir(parents=True, exist_ok=True)
|
|
622
587
|
try:
|
|
623
588
|
shutil.copy2(research_file, target_path)
|
|
624
589
|
restored_files.append(str(target_path))
|
|
625
590
|
except Exception as e:
|
|
626
|
-
failed_files.append(
|
|
591
|
+
failed_files.append(f"{target_path}: {str(e)}")
|
|
627
592
|
|
|
628
593
|
# Restore code files
|
|
629
594
|
code_backup = backup_path / "code"
|
|
630
595
|
if code_backup.exists():
|
|
631
596
|
for code_file in code_backup.rglob("*"):
|
|
632
597
|
if code_file.is_file():
|
|
633
|
-
target_path = self.project_root / code_file.relative_to(
|
|
634
|
-
code_backup
|
|
635
|
-
)
|
|
598
|
+
target_path = self.project_root / code_file.relative_to(code_backup)
|
|
636
599
|
target_path.parent.mkdir(parents=True, exist_ok=True)
|
|
637
600
|
try:
|
|
638
601
|
shutil.copy2(code_file, target_path)
|
|
639
602
|
restored_files.append(str(target_path))
|
|
640
603
|
except Exception as e:
|
|
641
|
-
failed_files.append(
|
|
604
|
+
failed_files.append(f"{target_path}: {str(e)}")
|
|
642
605
|
|
|
643
606
|
except Exception as e:
|
|
644
607
|
logger.error(f"Rollback operation failed: {str(e)}")
|
|
645
|
-
failed_files.append(
|
|
608
|
+
failed_files.append(f"rollback_operation: {str(e)}")
|
|
646
609
|
|
|
647
610
|
return restored_files, failed_files
|
|
648
611
|
|
|
@@ -656,11 +619,11 @@ class RollbackManager:
|
|
|
656
619
|
backup_path = Path(rollback_point["backup_path"])
|
|
657
620
|
research_backup = backup_path / "research"
|
|
658
621
|
|
|
659
|
-
restored_files = []
|
|
660
|
-
failed_files = []
|
|
622
|
+
restored_files: List[str] = []
|
|
623
|
+
failed_files: List[str] = []
|
|
661
624
|
|
|
662
625
|
if not research_backup.exists():
|
|
663
|
-
failed_files.append(
|
|
626
|
+
failed_files.append("research_backup: Research backup not found")
|
|
664
627
|
return restored_files, failed_files
|
|
665
628
|
|
|
666
629
|
try:
|
|
@@ -679,9 +642,7 @@ class RollbackManager:
|
|
|
679
642
|
shutil.copy2(component_file, target_file)
|
|
680
643
|
restored_files.append(str(target_file))
|
|
681
644
|
else:
|
|
682
|
-
failed_files.append(
|
|
683
|
-
(component_name, "Component file not found in backup")
|
|
684
|
-
)
|
|
645
|
+
failed_files.append(f"{component_name}: Component file not found in backup")
|
|
685
646
|
else:
|
|
686
647
|
# Restore entire component type
|
|
687
648
|
if target_dir.exists():
|
|
@@ -689,9 +650,7 @@ class RollbackManager:
|
|
|
689
650
|
shutil.copytree(component_backup_dir, target_dir)
|
|
690
651
|
restored_files.append(str(target_dir))
|
|
691
652
|
else:
|
|
692
|
-
failed_files.append(
|
|
693
|
-
(component_type, "Component type not found in backup")
|
|
694
|
-
)
|
|
653
|
+
failed_files.append(f"{component_type}: Component type not found in backup")
|
|
695
654
|
else:
|
|
696
655
|
# Restore all research components
|
|
697
656
|
for research_dir in research_backup.iterdir():
|
|
@@ -704,16 +663,17 @@ class RollbackManager:
|
|
|
704
663
|
|
|
705
664
|
except Exception as e:
|
|
706
665
|
logger.error(f"Research rollback failed: {str(e)}")
|
|
707
|
-
failed_files.append(
|
|
666
|
+
failed_files.append(f"research_rollback: {str(e)}")
|
|
708
667
|
|
|
709
668
|
return restored_files, failed_files
|
|
710
669
|
|
|
711
670
|
def _validate_system_after_rollback(self) -> Dict[str, Any]:
|
|
712
671
|
"""Validate system state after rollback"""
|
|
672
|
+
issues: List[str] = []
|
|
713
673
|
validation_results = {
|
|
714
674
|
"config_valid": True,
|
|
715
675
|
"research_valid": True,
|
|
716
|
-
"issues":
|
|
676
|
+
"issues": issues,
|
|
717
677
|
}
|
|
718
678
|
|
|
719
679
|
try:
|
|
@@ -721,14 +681,14 @@ class RollbackManager:
|
|
|
721
681
|
config_file = self.project_root / ".moai" / "config" / "config.json"
|
|
722
682
|
if config_file.exists():
|
|
723
683
|
try:
|
|
724
|
-
with open(config_file, "r") as f:
|
|
684
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
725
685
|
json.load(f) # Validate JSON syntax
|
|
726
686
|
except json.JSONDecodeError:
|
|
727
687
|
validation_results["config_valid"] = False
|
|
728
|
-
|
|
688
|
+
issues.append("Invalid JSON in config.json")
|
|
729
689
|
else:
|
|
730
690
|
validation_results["config_valid"] = False
|
|
731
|
-
|
|
691
|
+
issues.append("config.json not found")
|
|
732
692
|
|
|
733
693
|
# Validate research components
|
|
734
694
|
for research_dir in self.research_dirs:
|
|
@@ -740,23 +700,22 @@ class RollbackManager:
|
|
|
740
700
|
f.read() # Validate file can be read
|
|
741
701
|
except Exception as e:
|
|
742
702
|
validation_results["research_valid"] = False
|
|
743
|
-
|
|
744
|
-
f"Cannot read {file_path}: {str(e)}"
|
|
745
|
-
)
|
|
703
|
+
issues.append(f"Cannot read {file_path}: {str(e)}")
|
|
746
704
|
|
|
747
705
|
except Exception as e:
|
|
748
|
-
|
|
706
|
+
issues.append(f"Validation error: {str(e)}")
|
|
749
707
|
|
|
750
708
|
return validation_results
|
|
751
709
|
|
|
752
710
|
def _validate_research_components(self) -> Dict[str, Any]:
|
|
753
711
|
"""Validate research components after rollback"""
|
|
712
|
+
issues: List[str] = []
|
|
754
713
|
validation_results = {
|
|
755
714
|
"skills_valid": True,
|
|
756
715
|
"agents_valid": True,
|
|
757
716
|
"commands_valid": True,
|
|
758
717
|
"hooks_valid": True,
|
|
759
|
-
"issues":
|
|
718
|
+
"issues": issues,
|
|
760
719
|
}
|
|
761
720
|
|
|
762
721
|
component_checks = [
|
|
@@ -772,9 +731,7 @@ class RollbackManager:
|
|
|
772
731
|
files = list(component_path.rglob("*.md"))
|
|
773
732
|
if not files:
|
|
774
733
|
validation_results[f"{component_key}_valid"] = False
|
|
775
|
-
|
|
776
|
-
f"{component_name} directory is empty"
|
|
777
|
-
)
|
|
734
|
+
issues.append(f"{component_name} directory is empty")
|
|
778
735
|
|
|
779
736
|
# Validate file content
|
|
780
737
|
for file_path in files[:5]: # Check first 5 files
|
|
@@ -783,19 +740,13 @@ class RollbackManager:
|
|
|
783
740
|
content = f.read()
|
|
784
741
|
if not content.strip():
|
|
785
742
|
validation_results[f"{component_key}_valid"] = False
|
|
786
|
-
|
|
787
|
-
f"Empty file: {file_path}"
|
|
788
|
-
)
|
|
743
|
+
issues.append(f"Empty file: {file_path}")
|
|
789
744
|
except Exception as e:
|
|
790
745
|
validation_results[f"{component_key}_valid"] = False
|
|
791
|
-
|
|
792
|
-
f"Cannot read {file_path}: {str(e)}"
|
|
793
|
-
)
|
|
746
|
+
issues.append(f"Cannot read {file_path}: {str(e)}")
|
|
794
747
|
else:
|
|
795
748
|
validation_results[f"{component_key}_valid"] = False
|
|
796
|
-
|
|
797
|
-
f"{component_name} directory not found"
|
|
798
|
-
)
|
|
749
|
+
issues.append(f"{component_name} directory not found")
|
|
799
750
|
|
|
800
751
|
return validation_results
|
|
801
752
|
|
|
@@ -833,9 +784,7 @@ class RollbackManager:
|
|
|
833
784
|
"""Mark rollback point as used in registry"""
|
|
834
785
|
if rollback_id in self.registry:
|
|
835
786
|
self.registry[rollback_id]["used"] = True
|
|
836
|
-
self.registry[rollback_id]["used_timestamp"] = datetime.now(
|
|
837
|
-
timezone.utc
|
|
838
|
-
).isoformat()
|
|
787
|
+
self.registry[rollback_id]["used_timestamp"] = datetime.now(timezone.utc).isoformat()
|
|
839
788
|
self._save_registry()
|
|
840
789
|
|
|
841
790
|
def _cleanup_partial_backup(self, rollback_id: str):
|
|
@@ -883,37 +832,25 @@ def main():
|
|
|
883
832
|
|
|
884
833
|
# List rollback points
|
|
885
834
|
list_parser = subparsers.add_parser("list", help="List rollback points")
|
|
886
|
-
list_parser.add_argument(
|
|
887
|
-
"--limit", type=int, default=10, help="Maximum number to show"
|
|
888
|
-
)
|
|
835
|
+
list_parser.add_argument("--limit", type=int, default=10, help="Maximum number to show")
|
|
889
836
|
|
|
890
837
|
# Perform rollback
|
|
891
838
|
rollback_parser = subparsers.add_parser("rollback", help="Rollback to point")
|
|
892
839
|
rollback_parser.add_argument("rollback_id", help="Rollback point ID")
|
|
893
|
-
rollback_parser.add_argument(
|
|
894
|
-
"--no-validate", action="store_true", help="Skip validation"
|
|
895
|
-
)
|
|
840
|
+
rollback_parser.add_argument("--no-validate", action="store_true", help="Skip validation")
|
|
896
841
|
|
|
897
842
|
# Research rollback
|
|
898
|
-
research_parser = subparsers.add_parser(
|
|
899
|
-
|
|
900
|
-
)
|
|
901
|
-
research_parser.add_argument(
|
|
902
|
-
"--type", help="Component type (skills, agents, commands, hooks)"
|
|
903
|
-
)
|
|
843
|
+
research_parser = subparsers.add_parser("research-rollback", help="Rollback research components")
|
|
844
|
+
research_parser.add_argument("--type", help="Component type (skills, agents, commands, hooks)")
|
|
904
845
|
research_parser.add_argument("--name", help="Component name")
|
|
905
846
|
|
|
906
847
|
# Validate system
|
|
907
|
-
|
|
848
|
+
subparsers.add_parser("validate", help="Validate rollback system")
|
|
908
849
|
|
|
909
850
|
# Cleanup
|
|
910
|
-
cleanup_parser = subparsers.add_parser(
|
|
911
|
-
"cleanup", help="Cleanup old rollback points"
|
|
912
|
-
)
|
|
851
|
+
cleanup_parser = subparsers.add_parser("cleanup", help="Cleanup old rollback points")
|
|
913
852
|
cleanup_parser.add_argument("--keep", type=int, default=10, help="Number to keep")
|
|
914
|
-
cleanup_parser.add_argument(
|
|
915
|
-
"--execute", action="store_true", help="Execute cleanup (default: dry run)"
|
|
916
|
-
)
|
|
853
|
+
cleanup_parser.add_argument("--execute", action="store_true", help="Execute cleanup (default: dry run)")
|
|
917
854
|
|
|
918
855
|
args = parser.parse_args()
|
|
919
856
|
|
|
@@ -926,9 +863,7 @@ def main():
|
|
|
926
863
|
|
|
927
864
|
try:
|
|
928
865
|
if args.command == "create":
|
|
929
|
-
rollback_id = rollback_manager.create_rollback_point(
|
|
930
|
-
args.description, args.changes
|
|
931
|
-
)
|
|
866
|
+
rollback_id = rollback_manager.create_rollback_point(args.description, args.changes)
|
|
932
867
|
print(f"Rollback point created: {rollback_id}")
|
|
933
868
|
|
|
934
869
|
elif args.command == "list":
|
|
@@ -939,9 +874,7 @@ def main():
|
|
|
939
874
|
print(f" {rp['id']} - {rp['description']} ({status})")
|
|
940
875
|
|
|
941
876
|
elif args.command == "rollback":
|
|
942
|
-
result = rollback_manager.rollback_to_point(
|
|
943
|
-
args.rollback_id, validate_before=not args.no_validate
|
|
944
|
-
)
|
|
877
|
+
result = rollback_manager.rollback_to_point(args.rollback_id, validate_before=not args.no_validate)
|
|
945
878
|
if result.success:
|
|
946
879
|
print("Rollback completed successfully")
|
|
947
880
|
print(f"Restored {len(result.restored_files)} files")
|
|
@@ -949,9 +882,7 @@ def main():
|
|
|
949
882
|
print(f"Rollback failed: {result.message}")
|
|
950
883
|
|
|
951
884
|
elif args.command == "research-rollback":
|
|
952
|
-
result = rollback_manager.rollback_research_integration(
|
|
953
|
-
args.type, args.name
|
|
954
|
-
)
|
|
885
|
+
result = rollback_manager.rollback_research_integration(args.type, args.name)
|
|
955
886
|
if result.success:
|
|
956
887
|
print("Research rollback completed successfully")
|
|
957
888
|
else:
|
|
@@ -959,9 +890,7 @@ def main():
|
|
|
959
890
|
|
|
960
891
|
elif args.command == "validate":
|
|
961
892
|
validation = rollback_manager.validate_rollback_system()
|
|
962
|
-
print(
|
|
963
|
-
f"Rollback system health: {'HEALTHY' if validation['system_healthy'] else 'UNHEALTHY'}"
|
|
964
|
-
)
|
|
893
|
+
print(f"Rollback system health: {'HEALTHY' if validation['system_healthy'] else 'UNHEALTHY'}")
|
|
965
894
|
if validation["issues"]:
|
|
966
895
|
print("Issues found:")
|
|
967
896
|
for issue in validation["issues"]:
|
|
@@ -972,13 +901,9 @@ def main():
|
|
|
972
901
|
print(f" - {rec}")
|
|
973
902
|
|
|
974
903
|
elif args.command == "cleanup":
|
|
975
|
-
result = rollback_manager.
|
|
976
|
-
args.keep, dry_run=not args.execute
|
|
977
|
-
)
|
|
904
|
+
result = rollback_manager.cleanup_old_rollbacks(args.keep, dry_run=not args.execute)
|
|
978
905
|
if result["dry_run"]:
|
|
979
|
-
print(
|
|
980
|
-
f"Dry run: Would delete {result['would_delete_count']} rollback points"
|
|
981
|
-
)
|
|
906
|
+
print(f"Dry run: Would delete {result['would_delete_count']} rollback points")
|
|
982
907
|
print(f"Would free {result['would_free_space'] / 1024 / 1024:.1f} MB")
|
|
983
908
|
else:
|
|
984
909
|
print(f"Deleted {result['deleted_count']} rollback points")
|
moai_adk/core/session_manager.py
CHANGED
|
@@ -57,12 +57,8 @@ class SessionManager:
|
|
|
57
57
|
"""
|
|
58
58
|
# Default paths
|
|
59
59
|
project_root = Path.cwd()
|
|
60
|
-
self._session_file =
|
|
61
|
-
|
|
62
|
-
)
|
|
63
|
-
self._transcript_dir = (
|
|
64
|
-
transcript_dir or project_root / ".moai" / "logs" / "agent-transcripts"
|
|
65
|
-
)
|
|
60
|
+
self._session_file = session_file or project_root / ".moai" / "memory" / "agent-sessions.json"
|
|
61
|
+
self._transcript_dir = transcript_dir or project_root / ".moai" / "logs" / "agent-transcripts"
|
|
66
62
|
|
|
67
63
|
# Ensure directories exist
|
|
68
64
|
self._session_file.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -86,9 +82,7 @@ class SessionManager:
|
|
|
86
82
|
self._sessions = data.get("sessions", {})
|
|
87
83
|
self._chains = data.get("chains", {})
|
|
88
84
|
self._metadata = data.get("metadata", {})
|
|
89
|
-
logger.info(
|
|
90
|
-
f"Loaded {len(self._sessions)} sessions from {self._session_file}"
|
|
91
|
-
)
|
|
85
|
+
logger.info(f"Loaded {len(self._sessions)} sessions from {self._session_file}")
|
|
92
86
|
except json.JSONDecodeError as e:
|
|
93
87
|
logger.warning(f"Failed to load sessions: {e}")
|
|
94
88
|
self._sessions = {}
|
|
@@ -158,9 +152,7 @@ class SessionManager:
|
|
|
158
152
|
# Persist to disk
|
|
159
153
|
self._save_sessions()
|
|
160
154
|
|
|
161
|
-
logger.info(
|
|
162
|
-
f"Registered agent result: {agent_name} (agentId: {agent_id[:8]}..., chain: {chain_id})"
|
|
163
|
-
)
|
|
155
|
+
logger.info(f"Registered agent result: {agent_name} (agentId: {agent_id[:8]}..., chain: {chain_id})")
|
|
164
156
|
|
|
165
157
|
def get_resume_id(
|
|
166
158
|
self,
|
|
@@ -192,10 +184,7 @@ class SessionManager:
|
|
|
192
184
|
if chain_id:
|
|
193
185
|
metadata = self._metadata.get(agent_id, {})
|
|
194
186
|
if metadata.get("chain_id") != chain_id:
|
|
195
|
-
logger.debug(
|
|
196
|
-
f"Chain mismatch: {agent_name} was in {metadata.get('chain_id')}, "
|
|
197
|
-
f"requested {chain_id}"
|
|
198
|
-
)
|
|
187
|
+
logger.debug(f"Chain mismatch: {agent_name} was in {metadata.get('chain_id')}, requested {chain_id}")
|
|
199
188
|
return None
|
|
200
189
|
|
|
201
190
|
logger.info(f"Resume ID for {agent_name}: {agent_id[:8]}...")
|
|
@@ -236,17 +225,13 @@ class SessionManager:
|
|
|
236
225
|
resume_count = metadata.get("resume_count", 0)
|
|
237
226
|
|
|
238
227
|
if resume_count >= 5: # Max resume depth from config
|
|
239
|
-
logger.warning(
|
|
240
|
-
f"{agent_name} has been resumed {resume_count} times, starting new session"
|
|
241
|
-
)
|
|
228
|
+
logger.warning(f"{agent_name} has been resumed {resume_count} times, starting new session")
|
|
242
229
|
return False
|
|
243
230
|
|
|
244
231
|
# Heuristic: Check if tasks are related
|
|
245
232
|
# (This can be enhanced with semantic similarity)
|
|
246
233
|
task_keywords_match = any(
|
|
247
|
-
keyword in current_task.lower()
|
|
248
|
-
for keyword in previous_task.lower().split()
|
|
249
|
-
if len(keyword) > 4
|
|
234
|
+
keyword in current_task.lower() for keyword in previous_task.lower().split() if len(keyword) > 4
|
|
250
235
|
)
|
|
251
236
|
|
|
252
237
|
if task_keywords_match:
|
|
@@ -442,9 +427,7 @@ class SessionManager:
|
|
|
442
427
|
with open(chains_file, "w", encoding="utf-8") as f:
|
|
443
428
|
json.dump(chains_data, f, indent=2, ensure_ascii=False)
|
|
444
429
|
|
|
445
|
-
logger.info(
|
|
446
|
-
f"Created workflow chain: {chain_id} with {len(agent_sequence)} agents"
|
|
447
|
-
)
|
|
430
|
+
logger.info(f"Created workflow chain: {chain_id} with {len(agent_sequence)} agents")
|
|
448
431
|
|
|
449
432
|
|
|
450
433
|
# Global instance (singleton pattern)
|
|
@@ -647,9 +630,10 @@ if __name__ == "__main__":
|
|
|
647
630
|
}
|
|
648
631
|
|
|
649
632
|
for expert_name, data in experts_results.items():
|
|
633
|
+
agent_id_value: str = data["agent_id"] # type: ignore[assignment]
|
|
650
634
|
manager.register_agent_result(
|
|
651
635
|
agent_name=expert_name,
|
|
652
|
-
agent_id=
|
|
636
|
+
agent_id=agent_id_value,
|
|
653
637
|
result={k: v for k, v in data.items() if k != "agent_id"},
|
|
654
638
|
chain_id="SPEC-AUTH-001-review",
|
|
655
639
|
)
|