moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"""User Selection UI for MoAI-ADK Custom Element Restoration
|
|
2
|
+
|
|
3
|
+
This module provides enhanced CLI-based user interface for selecting custom elements
|
|
4
|
+
to restore from backup during MoAI-ADK updates. It features:
|
|
5
|
+
|
|
6
|
+
- Interactive checkbox selection with arrow key navigation (preferred)
|
|
7
|
+
- Fallback to numbered selection when curses is not available
|
|
8
|
+
- Category grouping (Agents, Commands, Skills, Hooks)
|
|
9
|
+
- Proper element preservation (unselected elements remain intact)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, Dict, List, Optional
|
|
14
|
+
|
|
15
|
+
from .custom_element_scanner import create_custom_element_scanner
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class UserSelectionUI:
|
|
19
|
+
"""Enhanced CLI-based user interface for selecting custom elements to restore.
|
|
20
|
+
|
|
21
|
+
This class provides an improved CLI interface with interactive checkbox selection
|
|
22
|
+
when available, falling back to numbered selection when curses is not supported.
|
|
23
|
+
It properly preserves unselected elements and includes all categories.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, project_path: str | Path):
|
|
27
|
+
"""Initialize the user selection UI.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
project_path: Path to the MoAI-ADK project directory
|
|
31
|
+
"""
|
|
32
|
+
self.project_path = Path(project_path).resolve()
|
|
33
|
+
self.scanner = create_custom_element_scanner(self.project_path)
|
|
34
|
+
|
|
35
|
+
# Try to import interactive UI, fall back to basic UI if not available
|
|
36
|
+
try:
|
|
37
|
+
from .interactive_checkbox_ui import create_interactive_checkbox_ui
|
|
38
|
+
|
|
39
|
+
self.interactive_ui = create_interactive_checkbox_ui(self.project_path)
|
|
40
|
+
self.use_interactive = True
|
|
41
|
+
except Exception:
|
|
42
|
+
self.interactive_ui = None
|
|
43
|
+
self.use_interactive = False
|
|
44
|
+
|
|
45
|
+
def prompt_user_selection(self, backup_available: bool = True) -> Optional[List[str]]:
|
|
46
|
+
"""Prompt user to select custom elements for restoration.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
backup_available: Whether backup is available for restoration
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
List of selected element paths, or None if no selection made
|
|
53
|
+
or no elements available
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
>>> ui = UserSelectionUI("/project")
|
|
57
|
+
>>> selected = ui.prompt_user_selection()
|
|
58
|
+
>>> print(f"Selected {len(selected)} elements")
|
|
59
|
+
"""
|
|
60
|
+
# Try interactive UI first
|
|
61
|
+
if self.use_interactive and self.interactive_ui:
|
|
62
|
+
try:
|
|
63
|
+
return self.interactive_ui.prompt_user_selection(backup_available)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
print(f"⚠️ Interactive UI failed: {e}")
|
|
66
|
+
print("Falling back to basic selection mode...")
|
|
67
|
+
|
|
68
|
+
# Fallback to basic selection
|
|
69
|
+
return self._basic_selection_mode(backup_available)
|
|
70
|
+
|
|
71
|
+
def _basic_selection_mode(self, backup_available: bool) -> Optional[List[str]]:
|
|
72
|
+
"""Basic numbered selection mode (fallback when interactive UI not available).
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
backup_available: Whether backup is available for restoration
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
List of selected element paths, or None if cancelled
|
|
79
|
+
"""
|
|
80
|
+
# Get custom elements organized by category
|
|
81
|
+
elements_by_category = self._get_elements_by_category()
|
|
82
|
+
|
|
83
|
+
# No custom elements found
|
|
84
|
+
if not any(elements_by_category.values()):
|
|
85
|
+
print("\n✅ No custom elements found in project.")
|
|
86
|
+
print(" All elements are part of the official MoAI-ADK template.")
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
# Display elements by category
|
|
90
|
+
print("\n" + "=" * 60)
|
|
91
|
+
print("🔍 Custom Elements Detected (Basic Mode)")
|
|
92
|
+
print("=" * 60)
|
|
93
|
+
print("These elements are not part of the official MoAI-ADK template:")
|
|
94
|
+
print()
|
|
95
|
+
|
|
96
|
+
element_index = 1
|
|
97
|
+
element_map = {} # Map index to element path
|
|
98
|
+
|
|
99
|
+
for category, elements in elements_by_category.items():
|
|
100
|
+
if not elements:
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
print(f"\n📁 {category} ({len(elements)}):")
|
|
104
|
+
for element in elements:
|
|
105
|
+
status = "✓ Available" if backup_available else "⚠ No backup"
|
|
106
|
+
print(f" {element_index:2d}. {element['name']:<35} {status}")
|
|
107
|
+
element_map[element_index] = element["path"]
|
|
108
|
+
element_index += 1
|
|
109
|
+
|
|
110
|
+
# Show selection instructions
|
|
111
|
+
print()
|
|
112
|
+
if not backup_available:
|
|
113
|
+
print("⚠️ No backup available. Cannot restore custom elements.")
|
|
114
|
+
print("💡 Run 'moai-adk update' without --force to create a backup first.")
|
|
115
|
+
return None
|
|
116
|
+
|
|
117
|
+
print("💡 Selection Instructions:")
|
|
118
|
+
print(" • Enter numbers separated by commas (e.g., 1,3,5)")
|
|
119
|
+
print(" • Use 'all' to select all elements")
|
|
120
|
+
print(" • Press Enter with empty input to cancel")
|
|
121
|
+
|
|
122
|
+
# Get user input
|
|
123
|
+
try:
|
|
124
|
+
user_input = input("\nSelect elements to restore: ").strip()
|
|
125
|
+
except (KeyboardInterrupt, EOFError):
|
|
126
|
+
print("\n⚠️ Selection cancelled.")
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
# Process user input
|
|
130
|
+
if not user_input:
|
|
131
|
+
print("No elements selected.")
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
# Check for "all" shortcut
|
|
135
|
+
if user_input.lower() == "all":
|
|
136
|
+
all_elements = list(element_map.values())
|
|
137
|
+
# Ask for confirmation when selecting all elements
|
|
138
|
+
if self.confirm_selection(all_elements):
|
|
139
|
+
return all_elements
|
|
140
|
+
else:
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
# Parse numbered selection
|
|
144
|
+
selected_elements = []
|
|
145
|
+
try:
|
|
146
|
+
indices = [int(x.strip()) for x in user_input.split(",") if x.strip()]
|
|
147
|
+
for idx in indices:
|
|
148
|
+
if idx in element_map:
|
|
149
|
+
selected_elements.append(element_map[idx])
|
|
150
|
+
else:
|
|
151
|
+
print(f"⚠️ Invalid number: {idx}")
|
|
152
|
+
except ValueError:
|
|
153
|
+
print("⚠️ Invalid input. Please enter numbers separated by commas.")
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
if not selected_elements:
|
|
157
|
+
print("No valid selections made.")
|
|
158
|
+
return None
|
|
159
|
+
|
|
160
|
+
# Ask for confirmation
|
|
161
|
+
if self.confirm_selection(selected_elements):
|
|
162
|
+
return selected_elements
|
|
163
|
+
else:
|
|
164
|
+
return None
|
|
165
|
+
|
|
166
|
+
def _get_elements_by_category(self) -> Dict[str, List[Dict]]:
|
|
167
|
+
"""Organize custom elements by category.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
Dictionary mapping category names to lists of elements
|
|
171
|
+
"""
|
|
172
|
+
custom_elements = self.scanner.scan_custom_elements()
|
|
173
|
+
organized: Dict[str, List[Dict[str, Any]]] = {
|
|
174
|
+
"Agents": [],
|
|
175
|
+
"Commands": [],
|
|
176
|
+
"Skills": [],
|
|
177
|
+
"Hooks": [],
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
# Add skills (which are directories)
|
|
181
|
+
if "skills" in custom_elements:
|
|
182
|
+
for skill in custom_elements["skills"]:
|
|
183
|
+
organized["Skills"].append({"name": skill.name, "path": str(skill.path), "type": "skill"})
|
|
184
|
+
|
|
185
|
+
# Add file-based elements
|
|
186
|
+
for element_type in ["agents", "commands", "hooks"]:
|
|
187
|
+
if element_type in custom_elements:
|
|
188
|
+
category_name = element_type.capitalize()
|
|
189
|
+
for element_path in custom_elements[element_type]:
|
|
190
|
+
element_name = Path(element_path).name
|
|
191
|
+
organized[category_name].append(
|
|
192
|
+
{
|
|
193
|
+
"name": element_name,
|
|
194
|
+
"path": str(element_path),
|
|
195
|
+
"type": element_type.rstrip("s"), # Remove plural 's'
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
return organized
|
|
200
|
+
|
|
201
|
+
def _parse_selection(self, user_input: str, custom_elements: List[Dict[str, str]]) -> List[str]:
|
|
202
|
+
"""Parse user selection input with enhanced support for multiple separators.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
user_input: User's input string (can use commas, spaces, semicolons, etc.)
|
|
206
|
+
custom_elements: List of available custom elements
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
List of selected element paths
|
|
210
|
+
"""
|
|
211
|
+
selected_paths = []
|
|
212
|
+
|
|
213
|
+
# Enhanced parsing: handle multiple separator types (comma, space, semicolon, backslash)
|
|
214
|
+
import re
|
|
215
|
+
|
|
216
|
+
# Split by common separators and clean up
|
|
217
|
+
selections = re.split(r"[,\s;\\]+", user_input.strip())
|
|
218
|
+
selections = [s.strip() for s in selections if s.strip()]
|
|
219
|
+
|
|
220
|
+
for selection in selections:
|
|
221
|
+
try:
|
|
222
|
+
# Parse as number
|
|
223
|
+
index = int(selection)
|
|
224
|
+
# Find element with this index (1-based)
|
|
225
|
+
for element in custom_elements:
|
|
226
|
+
if element["index"] == index:
|
|
227
|
+
selected_paths.append(element["path"])
|
|
228
|
+
break
|
|
229
|
+
else:
|
|
230
|
+
print(f"⚠️ Invalid selection: {selection} (not in available list)")
|
|
231
|
+
except ValueError:
|
|
232
|
+
# Try to parse as element name (for enhanced UX)
|
|
233
|
+
found = False
|
|
234
|
+
for element in custom_elements:
|
|
235
|
+
if (
|
|
236
|
+
selection.lower() in element["name"].lower()
|
|
237
|
+
or selection.lower() in element["display_name"].lower()
|
|
238
|
+
):
|
|
239
|
+
selected_paths.append(element["path"])
|
|
240
|
+
found = True
|
|
241
|
+
break
|
|
242
|
+
|
|
243
|
+
if not found:
|
|
244
|
+
print(f"⚠️ Invalid selection: {selection} (not a number or matching element name)")
|
|
245
|
+
|
|
246
|
+
return selected_paths
|
|
247
|
+
|
|
248
|
+
def confirm_selection(self, selected_elements: List[str]) -> bool:
|
|
249
|
+
"""Confirm user's selection before proceeding with restoration.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
selected_elements: List of selected element paths
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
True if user confirms, False otherwise
|
|
256
|
+
"""
|
|
257
|
+
print("\n📋 Selection Summary:")
|
|
258
|
+
print("-" * 40)
|
|
259
|
+
for i, element_path in enumerate(selected_elements, 1):
|
|
260
|
+
element_name = Path(element_path).name
|
|
261
|
+
element_type = self._get_element_type(element_path)
|
|
262
|
+
print(f" {i}. {element_name} ({element_type})")
|
|
263
|
+
|
|
264
|
+
print("-" * 40)
|
|
265
|
+
print(f"Total elements selected: {len(selected_elements)}")
|
|
266
|
+
|
|
267
|
+
try:
|
|
268
|
+
confirm = input("\nConfirm restoration? (y/N): ").strip().lower()
|
|
269
|
+
return confirm in ["y", "yes", ""]
|
|
270
|
+
except (KeyboardInterrupt, EOFError):
|
|
271
|
+
print("\n⚠️ Restoration cancelled.")
|
|
272
|
+
return False
|
|
273
|
+
|
|
274
|
+
def _get_element_type(self, element_path: str) -> str:
|
|
275
|
+
"""Get element type from path.
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
element_path: Path to element
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
Element type string (agent, command, skill, hook)
|
|
282
|
+
"""
|
|
283
|
+
path = Path(element_path)
|
|
284
|
+
parts = path.parts
|
|
285
|
+
|
|
286
|
+
if "agents" in parts:
|
|
287
|
+
return "agent"
|
|
288
|
+
elif "commands" in parts:
|
|
289
|
+
return "command"
|
|
290
|
+
elif "skills" in parts:
|
|
291
|
+
return "skill"
|
|
292
|
+
elif "hooks" in parts:
|
|
293
|
+
return "hook"
|
|
294
|
+
else:
|
|
295
|
+
return "unknown"
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def display_selection_instructions():
|
|
299
|
+
"""Display instructions for using the enhanced selection interface."""
|
|
300
|
+
print(
|
|
301
|
+
"""
|
|
302
|
+
📖 Enhanced Selection Instructions:
|
|
303
|
+
• Enter numbers separated by spaces, commas, semicolons (e.g., 1 3,4 or 1;3\\4)
|
|
304
|
+
• Use 'all' to select all elements
|
|
305
|
+
• Try partial names for convenience (e.g., 'yoda' or 'agent')
|
|
306
|
+
• Press Enter with empty input to cancel
|
|
307
|
+
• Use Ctrl+C to interrupt selection
|
|
308
|
+
|
|
309
|
+
📂 Element Types:
|
|
310
|
+
• agent: Custom agent for specific tasks
|
|
311
|
+
• command: Custom slash command for workflows
|
|
312
|
+
• skill: Custom skill with enhanced capabilities
|
|
313
|
+
• hook: Custom hook for system integration
|
|
314
|
+
|
|
315
|
+
💡 Pro Tips:
|
|
316
|
+
• Mixed separators work: "1,3;5\\7"
|
|
317
|
+
• Partial name matching: "my-agen" matches "my-agent"
|
|
318
|
+
• Case insensitive: "YODA" matches "yoda"
|
|
319
|
+
"""
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def create_user_selection_ui(project_path: str | Path) -> UserSelectionUI:
|
|
324
|
+
"""Factory function to create a UserSelectionUI.
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
project_path: Path to the MoAI-ADK project directory
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
Configured UserSelectionUI instance
|
|
331
|
+
|
|
332
|
+
Example:
|
|
333
|
+
>>> ui = create_user_selection_ui("/path/to/project")
|
|
334
|
+
>>> selected = ui.prompt_user_selection()
|
|
335
|
+
>>> if selected:
|
|
336
|
+
>>> ui.confirm_selection(selected)
|
|
337
|
+
"""
|
|
338
|
+
return UserSelectionUI(Path(project_path).resolve())
|
|
@@ -8,7 +8,7 @@ which migrations are needed.
|
|
|
8
8
|
import json
|
|
9
9
|
import logging
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import
|
|
11
|
+
from typing import Any, Dict
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
@@ -27,9 +27,7 @@ class VersionDetector:
|
|
|
27
27
|
self.old_config = self.project_root / ".moai" / "config.json"
|
|
28
28
|
self.new_config = self.project_root / ".moai" / "config" / "config.json"
|
|
29
29
|
self.old_statusline = self.project_root / ".claude" / "statusline-config.yaml"
|
|
30
|
-
self.new_statusline =
|
|
31
|
-
self.project_root / ".moai" / "config" / "statusline-config.yaml"
|
|
32
|
-
)
|
|
30
|
+
self.new_statusline = self.project_root / ".moai" / "config" / "statusline-config.yaml"
|
|
33
31
|
|
|
34
32
|
def detect_version(self) -> str:
|
|
35
33
|
"""
|
|
@@ -76,7 +74,7 @@ class VersionDetector:
|
|
|
76
74
|
# Version 0.23.0 or earlier needs migration
|
|
77
75
|
return True
|
|
78
76
|
|
|
79
|
-
def get_migration_plan(self) -> Dict[str,
|
|
77
|
+
def get_migration_plan(self) -> Dict[str, Any]:
|
|
80
78
|
"""
|
|
81
79
|
Get detailed migration plan
|
|
82
80
|
|
|
@@ -88,7 +86,7 @@ class VersionDetector:
|
|
|
88
86
|
"cleanup": ["old_file1", "old_file2"]
|
|
89
87
|
}
|
|
90
88
|
"""
|
|
91
|
-
plan = {"move": [], "create": [], "cleanup": []}
|
|
89
|
+
plan: Dict[str, Any] = {"move": [], "create": [], "cleanup": []}
|
|
92
90
|
|
|
93
91
|
if not self.needs_migration():
|
|
94
92
|
return plan
|
|
@@ -120,13 +118,11 @@ class VersionDetector:
|
|
|
120
118
|
if self.old_config.exists():
|
|
121
119
|
plan["cleanup"].append(str(self.old_config.relative_to(self.project_root)))
|
|
122
120
|
if self.old_statusline.exists():
|
|
123
|
-
plan["cleanup"].append(
|
|
124
|
-
str(self.old_statusline.relative_to(self.project_root))
|
|
125
|
-
)
|
|
121
|
+
plan["cleanup"].append(str(self.old_statusline.relative_to(self.project_root)))
|
|
126
122
|
|
|
127
123
|
return plan
|
|
128
124
|
|
|
129
|
-
def get_version_info(self) -> Dict[str,
|
|
125
|
+
def get_version_info(self) -> Dict[str, Any]:
|
|
130
126
|
"""
|
|
131
127
|
Get detailed version information
|
|
132
128
|
|
|
@@ -7,7 +7,7 @@ and cleanup processes for automatic project upgrades.
|
|
|
7
7
|
|
|
8
8
|
import logging
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Dict
|
|
10
|
+
from typing import Any, Dict
|
|
11
11
|
|
|
12
12
|
from .backup_manager import BackupManager
|
|
13
13
|
from .file_migrator import FileMigrator
|
|
@@ -49,7 +49,7 @@ class VersionMigrator:
|
|
|
49
49
|
"""
|
|
50
50
|
return self.detector.needs_migration()
|
|
51
51
|
|
|
52
|
-
def get_migration_info(self) -> Dict[str,
|
|
52
|
+
def get_migration_info(self) -> Dict[str, Any]:
|
|
53
53
|
"""
|
|
54
54
|
Get detailed migration information
|
|
55
55
|
|
|
@@ -191,7 +191,7 @@ class VersionMigrator:
|
|
|
191
191
|
logger.debug("All verification checks passed")
|
|
192
192
|
return True
|
|
193
193
|
|
|
194
|
-
def check_status(self) -> Dict[str,
|
|
194
|
+
def check_status(self) -> Dict[str, Any]:
|
|
195
195
|
"""
|
|
196
196
|
Check migration status and return detailed information
|
|
197
197
|
|
|
@@ -85,12 +85,12 @@ class CacheSystem:
|
|
|
85
85
|
|
|
86
86
|
def _cleanup_expired_files(self) -> None:
|
|
87
87
|
"""Remove expired cache files."""
|
|
88
|
-
|
|
88
|
+
time.time()
|
|
89
89
|
for file_name in os.listdir(self.cache_dir):
|
|
90
90
|
if file_name.endswith(self.file_extension):
|
|
91
91
|
file_path = os.path.join(self.cache_dir, file_name)
|
|
92
92
|
try:
|
|
93
|
-
with open(file_path, "r") as f:
|
|
93
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
94
94
|
data = json.load(f)
|
|
95
95
|
|
|
96
96
|
if self._is_expired(data):
|
|
@@ -105,8 +105,8 @@ class CacheSystem:
|
|
|
105
105
|
def _write_data(self, file_path: str, data: Dict[str, Any]) -> None:
|
|
106
106
|
"""Write data to file with error handling."""
|
|
107
107
|
try:
|
|
108
|
-
with open(file_path, "w") as f:
|
|
109
|
-
json.dump(data, f, indent=2)
|
|
108
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
109
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
110
110
|
except (OSError, TypeError) as e:
|
|
111
111
|
raise OSError(f"Failed to write cache file {file_path}: {e}")
|
|
112
112
|
|
|
@@ -116,7 +116,7 @@ class CacheSystem:
|
|
|
116
116
|
return None
|
|
117
117
|
|
|
118
118
|
try:
|
|
119
|
-
with open(file_path, "r") as f:
|
|
119
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
120
120
|
return json.load(f)
|
|
121
121
|
except (json.JSONDecodeError, OSError):
|
|
122
122
|
# File is corrupted, remove it
|
|
@@ -242,16 +242,14 @@ class CacheSystem:
|
|
|
242
242
|
count = 0
|
|
243
243
|
for file_name in os.listdir(self.cache_dir):
|
|
244
244
|
if file_name.endswith(self.file_extension):
|
|
245
|
-
|
|
245
|
+
os.path.join(self.cache_dir, file_name)
|
|
246
246
|
key = file_name[: -len(self.file_extension)] # Remove extension
|
|
247
247
|
|
|
248
248
|
if self.exists(key):
|
|
249
249
|
count += 1
|
|
250
250
|
return count
|
|
251
251
|
|
|
252
|
-
def set_if_not_exists(
|
|
253
|
-
self, key: str, value: Any, ttl: Optional[float] = None
|
|
254
|
-
) -> bool:
|
|
252
|
+
def set_if_not_exists(self, key: str, value: Any, ttl: Optional[float] = None) -> bool:
|
|
255
253
|
"""
|
|
256
254
|
Set a value only if the key doesn't exist.
|
|
257
255
|
|
|
@@ -298,7 +296,7 @@ class CacheSystem:
|
|
|
298
296
|
"""
|
|
299
297
|
total_files = 0
|
|
300
298
|
expired_files = 0
|
|
301
|
-
|
|
299
|
+
time.time()
|
|
302
300
|
|
|
303
301
|
for file_name in os.listdir(self.cache_dir):
|
|
304
302
|
if file_name.endswith(self.file_extension):
|