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,982 @@
|
|
|
1
|
+
# Integration Patterns Module
|
|
2
|
+
|
|
3
|
+
Purpose: Comprehensive integration patterns for moai-worktree with MoAI-ADK workflow, development tools, and external systems.
|
|
4
|
+
|
|
5
|
+
Version: 1.0.0
|
|
6
|
+
Last Updated: 2025-11-29
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Quick Reference (30 seconds)
|
|
11
|
+
|
|
12
|
+
Integration Points:
|
|
13
|
+
- MoAI-ADK Workflow: Seamless integration with `/moai:1-plan`, `/moai:2-run`, `/moai:3-sync`
|
|
14
|
+
- Development Tools: IDEs, editors, terminal emulators, and development servers
|
|
15
|
+
- Git Workflows: Branch management, CI/CD pipelines, and code review processes
|
|
16
|
+
- Team Collaboration: Shared worktrees, code sharing, and coordination patterns
|
|
17
|
+
|
|
18
|
+
Core Integration Pattern:
|
|
19
|
+
```bash
|
|
20
|
+
# Plan Phase - Automatic worktree creation
|
|
21
|
+
/moai:1-plan "User Authentication" → auto-creates SPEC-001 worktree
|
|
22
|
+
|
|
23
|
+
# Development Phase - Isolated development
|
|
24
|
+
cd $(moai-worktree go SPEC-001)
|
|
25
|
+
/moai:2-run SPEC-001
|
|
26
|
+
|
|
27
|
+
# Sync Phase - Clean integration
|
|
28
|
+
moai-worktree sync SPEC-001
|
|
29
|
+
/moai:3-sync SPEC-001
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## MoAI-ADK Workflow Integration
|
|
35
|
+
|
|
36
|
+
### Plan Phase Integration (`/moai:1-plan`)
|
|
37
|
+
|
|
38
|
+
Automatic Worktree Creation:
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
# Integration in /moai:1-plan command
|
|
42
|
+
def create_worktree_after_spec(spec_id: str, spec_title: str) -> None:
|
|
43
|
+
"""Create worktree automatically after SPEC creation."""
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
# Create worktree with automatic branching
|
|
47
|
+
branch_name = f"feature/SPEC-{spec_id}-{spec_title.lower().replace(' ', '-')}"
|
|
48
|
+
|
|
49
|
+
result = subprocess.run([
|
|
50
|
+
"moai-worktree", "new", spec_id, spec_title,
|
|
51
|
+
"--branch", branch_name,
|
|
52
|
+
"--template", "spec-development"
|
|
53
|
+
], capture_output=True, text=True)
|
|
54
|
+
|
|
55
|
+
if result.returncode == 0:
|
|
56
|
+
print(f" Created worktree: {spec_id}")
|
|
57
|
+
print(f" Branch: {branch_name}")
|
|
58
|
+
print(f" Path: {extract_worktree_path(result.stdout)}")
|
|
59
|
+
|
|
60
|
+
print("\nNext steps:")
|
|
61
|
+
print(f"1. Switch to worktree: moai-worktree switch {spec_id}")
|
|
62
|
+
print(f"2. Or use shell eval: eval $(moai-worktree go {spec_id})")
|
|
63
|
+
print(f"3. Start development: /moai:2-run {spec_id}")
|
|
64
|
+
else:
|
|
65
|
+
print(f" Worktree creation failed: {result.stderr}")
|
|
66
|
+
|
|
67
|
+
except Exception as e:
|
|
68
|
+
print(f" Error creating worktree: {e}")
|
|
69
|
+
|
|
70
|
+
# Enhanced /moai:1-plan output with worktree information
|
|
71
|
+
def display_worktree_integration_info(spec_id: str, spec_title: str) -> None:
|
|
72
|
+
"""Display comprehensive worktree integration guidance."""
|
|
73
|
+
|
|
74
|
+
print(f"""
|
|
75
|
+
Worktree Integration for SPEC-{spec_id}
|
|
76
|
+
|
|
77
|
+
Worktree Information:
|
|
78
|
+
SPEC ID: {spec_id}
|
|
79
|
+
Title: {spec_title}
|
|
80
|
+
Branch: feature/SPEC-{spec_id}-{spec_title.lower().replace(' ', '-')}
|
|
81
|
+
Path: ~/workflows/{os.path.basename(os.getcwd())}/SPEC-{spec_id}
|
|
82
|
+
|
|
83
|
+
Quick Start Options:
|
|
84
|
+
1. Switch to worktree: moai-worktree switch SPEC-{spec_id}
|
|
85
|
+
2. Shell integration: eval $(moai-worktree go SPEC-{spec_id})
|
|
86
|
+
3. Start development: cd $(moai-worktree go SPEC-{spec_id}) && /moai:2-run SPEC-{spec_id}
|
|
87
|
+
|
|
88
|
+
Development Workflow:
|
|
89
|
+
Phase 1: SPEC created
|
|
90
|
+
Phase 2: → Worktree ready for development
|
|
91
|
+
Phase 3: → Implement with /moai:2-run
|
|
92
|
+
Phase 4: → Sync with /moai:3-sync
|
|
93
|
+
Phase 5: → Clean up with moai-worktree clean
|
|
94
|
+
|
|
95
|
+
Advanced Options:
|
|
96
|
+
• Create with custom template: moai-worktree new {spec_id} "{spec_title}" --template <template>
|
|
97
|
+
• Create from develop branch: moai-worktree new {spec_id} "{spec_title}" --base develop
|
|
98
|
+
• Create with shallow clone: moai-worktree new {spec_id} "{spec_title}" --shallow
|
|
99
|
+
""")
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Template-Based SPEC Development:
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
# SPEC development template configuration
|
|
106
|
+
SPEC_DEVELOPMENT_TEMPLATE = {
|
|
107
|
+
"setup_commands": [
|
|
108
|
+
"echo 'Setting up SPEC development environment...'",
|
|
109
|
+
"npm run setup:spec 2>/dev/null || echo 'No npm setup required'",
|
|
110
|
+
"python -m pip install -r requirements-dev.txt 2>/dev/null || echo 'No Python requirements'",
|
|
111
|
+
"echo 'Environment ready for SPEC development'"
|
|
112
|
+
],
|
|
113
|
+
"files": {
|
|
114
|
+
".spec-config": """
|
|
115
|
+
# SPEC Development Configuration
|
|
116
|
+
SPEC_ID={spec_id}
|
|
117
|
+
SPEC_TITLE={spec_title}
|
|
118
|
+
DEV_MODE=spec
|
|
119
|
+
LOG_LEVEL=debug
|
|
120
|
+
""",
|
|
121
|
+
".vscode/tasks.json": """{
|
|
122
|
+
"version": "2.0.0",
|
|
123
|
+
"tasks": [
|
|
124
|
+
{{
|
|
125
|
+
"label": "Run SPEC Tests",
|
|
126
|
+
"type": "shell",
|
|
127
|
+
"command": "/moai:2-run {spec_id}",
|
|
128
|
+
"group": "test",
|
|
129
|
+
"presentation": {{
|
|
130
|
+
"echo": true,
|
|
131
|
+
"reveal": "always",
|
|
132
|
+
"focus": false,
|
|
133
|
+
"panel": "shared"
|
|
134
|
+
}}
|
|
135
|
+
}}
|
|
136
|
+
]
|
|
137
|
+
}}"""
|
|
138
|
+
},
|
|
139
|
+
"env_vars": {
|
|
140
|
+
"SPEC_MODE": "true",
|
|
141
|
+
"DEVELOPMENT_SPEC": spec_id,
|
|
142
|
+
"SPEC_BRANCH": f"feature/SPEC-{spec_id}"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Development Phase Integration (`/moai:2-run`)
|
|
148
|
+
|
|
149
|
+
Worktree-Aware TDD Implementation:
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
# Enhanced manager-tdd for worktree environments
|
|
153
|
+
class WorktreeAwareTDDManager:
|
|
154
|
+
def __init__(self, spec_id: str):
|
|
155
|
+
self.spec_id = spec_id
|
|
156
|
+
self.worktree_path = self._detect_worktree_path()
|
|
157
|
+
self.is_worktree_env = self._is_in_worktree()
|
|
158
|
+
|
|
159
|
+
def _detect_worktree_path(self) -> Optional[Path]:
|
|
160
|
+
"""Detect if running in worktree environment."""
|
|
161
|
+
current_path = Path.cwd()
|
|
162
|
+
|
|
163
|
+
# Check if current directory is a worktree
|
|
164
|
+
if current_path.name.startswith("SPEC-"):
|
|
165
|
+
return current_path
|
|
166
|
+
|
|
167
|
+
# Check if parent is worktrees directory
|
|
168
|
+
if "worktrees" in current_path.parts:
|
|
169
|
+
for i, part in enumerate(current_path.parts):
|
|
170
|
+
if part == "worktrees" and i + 1 < len(current_path.parts):
|
|
171
|
+
spec_part = current_path.parts[i + 1]
|
|
172
|
+
if spec_part.startswith("SPEC-"):
|
|
173
|
+
return current_path / spec_part
|
|
174
|
+
|
|
175
|
+
return None
|
|
176
|
+
|
|
177
|
+
def execute_tdd_in_worktree(self) -> TDDResult:
|
|
178
|
+
"""Execute TDD cycle in worktree context."""
|
|
179
|
+
|
|
180
|
+
if not self.is_worktree_env:
|
|
181
|
+
print(f" Not in worktree environment. Consider running in worktree:")
|
|
182
|
+
print(f" moai-worktree switch {self.spec_id}")
|
|
183
|
+
print(f" or: eval $(moai-worktree go {self.spec_id})")
|
|
184
|
+
|
|
185
|
+
# TDD execution with worktree awareness
|
|
186
|
+
result = self._run_tdd_cycle()
|
|
187
|
+
|
|
188
|
+
# Update worktree metadata
|
|
189
|
+
if self.worktree_path:
|
|
190
|
+
self._update_worktree_metadata(result)
|
|
191
|
+
|
|
192
|
+
return result
|
|
193
|
+
|
|
194
|
+
def _update_worktree_metadata(self, tdd_result: TDDResult) -> None:
|
|
195
|
+
"""Update worktree metadata after TDD execution."""
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
# Update registry with TDD results
|
|
199
|
+
subprocess.run([
|
|
200
|
+
"moai-worktree", "config", "set",
|
|
201
|
+
f"last_tdd_result.{self.spec_id}",
|
|
202
|
+
json.dumps(tdd_result.to_dict())
|
|
203
|
+
], check=False)
|
|
204
|
+
|
|
205
|
+
# Update last access time
|
|
206
|
+
subprocess.run([
|
|
207
|
+
"moai-worktree", "status", self.spec_id, "--update-access"
|
|
208
|
+
], check=False)
|
|
209
|
+
|
|
210
|
+
except Exception as e:
|
|
211
|
+
print(f" Failed to update worktree metadata: {e}")
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Sync Phase Integration (`/moai:3-sync`)
|
|
215
|
+
|
|
216
|
+
Automated Worktree Synchronization:
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
# Enhanced /moai:3-sync with worktree integration
|
|
220
|
+
class WorktreeSyncManager:
|
|
221
|
+
def sync_spec_with_worktree(self, spec_id: str) -> SyncResult:
|
|
222
|
+
"""Synchronize SPEC development with main repository."""
|
|
223
|
+
|
|
224
|
+
# Check if worktree exists
|
|
225
|
+
worktree_info = self._get_worktree_info(spec_id)
|
|
226
|
+
if not worktree_info:
|
|
227
|
+
print(f" No worktree found for {spec_id}")
|
|
228
|
+
print(f" Create with: moai-worktree new {spec_id}")
|
|
229
|
+
return SyncResult(skipped=True, reason="No worktree")
|
|
230
|
+
|
|
231
|
+
# Sync worktree with base branch
|
|
232
|
+
print(f" Syncing worktree {spec_id}...")
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
sync_result = subprocess.run([
|
|
236
|
+
"moai-worktree", "sync", spec_id,
|
|
237
|
+
"--auto-resolve",
|
|
238
|
+
"--include", "src/", "docs/", "tests/"
|
|
239
|
+
], capture_output=True, text=True)
|
|
240
|
+
|
|
241
|
+
if sync_result.returncode == 0:
|
|
242
|
+
print(f" Worktree {spec_id} synchronized successfully")
|
|
243
|
+
|
|
244
|
+
# Continue with regular sync process
|
|
245
|
+
return self._perform_regular_sync(spec_id, worktree_info)
|
|
246
|
+
else:
|
|
247
|
+
print(f" Worktree sync failed: {sync_result.stderr}")
|
|
248
|
+
return SyncResult(success=False, error=sync_result.stderr)
|
|
249
|
+
|
|
250
|
+
except Exception as e:
|
|
251
|
+
print(f" Error syncing worktree: {e}")
|
|
252
|
+
return SyncResult(success=False, error=str(e))
|
|
253
|
+
|
|
254
|
+
def _perform_regular_sync(self, spec_id: str, worktree_info: dict) -> SyncResult:
|
|
255
|
+
"""Perform regular documentation sync after worktree sync."""
|
|
256
|
+
|
|
257
|
+
# Collect changes from worktree
|
|
258
|
+
worktree_path = worktree_info['path']
|
|
259
|
+
|
|
260
|
+
# Extract documentation updates
|
|
261
|
+
docs_updates = self._extract_documentation_updates(worktree_path)
|
|
262
|
+
|
|
263
|
+
# Generate updated documentation
|
|
264
|
+
updated_docs = self._generate_updated_documentation(spec_id, docs_updates)
|
|
265
|
+
|
|
266
|
+
# Create pull request if needed
|
|
267
|
+
if worktree_info.get('git_info', {}).get('commits_ahead', 0) > 0:
|
|
268
|
+
self._create_pull_request_for_spec(spec_id, worktree_info)
|
|
269
|
+
|
|
270
|
+
return SyncResult(
|
|
271
|
+
success=True,
|
|
272
|
+
worktree_synced=True,
|
|
273
|
+
documentation_updated=updated_docs
|
|
274
|
+
)
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Automated Cleanup Integration
|
|
278
|
+
|
|
279
|
+
Post-PR Cleanup Workflow:
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
# Automatic cleanup after successful integration
|
|
283
|
+
def cleanup_completed_spec(spec_id: str, merge_status: str) -> None:
|
|
284
|
+
"""Clean up worktree after successful SPEC integration."""
|
|
285
|
+
|
|
286
|
+
if merge_status == "merged":
|
|
287
|
+
print(f" SPEC {spec_id} successfully merged!")
|
|
288
|
+
|
|
289
|
+
# Offer cleanup options
|
|
290
|
+
cleanup_choice = input("""
|
|
291
|
+
Clean up worktree options:
|
|
292
|
+
1. Remove worktree (recommended)
|
|
293
|
+
2. Keep worktree for reference
|
|
294
|
+
3. Archive worktree
|
|
295
|
+
4. Skip cleanup
|
|
296
|
+
|
|
297
|
+
Choice [1-4]: """)
|
|
298
|
+
|
|
299
|
+
if cleanup_choice == "1":
|
|
300
|
+
# Remove worktree
|
|
301
|
+
result = subprocess.run([
|
|
302
|
+
"moai-worktree", "remove", spec_id, "--force"
|
|
303
|
+
], capture_output=True, text=True)
|
|
304
|
+
|
|
305
|
+
if result.returncode == 0:
|
|
306
|
+
print(f" Worktree {spec_id} removed successfully")
|
|
307
|
+
else:
|
|
308
|
+
print(f" Error removing worktree: {result.stderr}")
|
|
309
|
+
|
|
310
|
+
elif cleanup_choice == "3":
|
|
311
|
+
# Archive worktree
|
|
312
|
+
archive_path = f"~/workflows/archives/{spec_id}-{datetime.now().strftime('%Y%m%d')}"
|
|
313
|
+
subprocess.run([
|
|
314
|
+
"moai-worktree", "remove", spec_id, "--backup"
|
|
315
|
+
], capture_output=True, text=True)
|
|
316
|
+
|
|
317
|
+
print(f" Worktree {spec_id} archived to {archive_path}")
|
|
318
|
+
|
|
319
|
+
# Update registry
|
|
320
|
+
subprocess.run([
|
|
321
|
+
"moai-worktree", "config", "set",
|
|
322
|
+
f"completed_specs.{spec_id}", json.dumps({
|
|
323
|
+
"merged_at": datetime.utcnow().isoformat(),
|
|
324
|
+
"cleanup_action": cleanup_choice
|
|
325
|
+
})
|
|
326
|
+
], check=False)
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Development Tools Integration
|
|
332
|
+
|
|
333
|
+
### IDE Integration
|
|
334
|
+
|
|
335
|
+
VS Code Multi-Root Workspace:
|
|
336
|
+
|
|
337
|
+
```json
|
|
338
|
+
// .vscode/workspaces.json - Auto-generated
|
|
339
|
+
{
|
|
340
|
+
"version": "0.1.0",
|
|
341
|
+
"folders": [
|
|
342
|
+
{
|
|
343
|
+
"name": "Main Repository",
|
|
344
|
+
"path": "."
|
|
345
|
+
}
|
|
346
|
+
],
|
|
347
|
+
"extensions": {
|
|
348
|
+
"recommendations": [
|
|
349
|
+
"ms-vscode.vscode-typescript-next",
|
|
350
|
+
"ms-python.python",
|
|
351
|
+
"bradlc.vscode-tailwindcss"
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
"launch": {
|
|
355
|
+
"version": "0.2.0",
|
|
356
|
+
"configurations": []
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Dynamic Workspace Generator:
|
|
362
|
+
|
|
363
|
+
```python
|
|
364
|
+
# generate_vscode_workspace.py
|
|
365
|
+
def generate_workspace_with_worktrees():
|
|
366
|
+
"""Generate VS Code workspace including all active worktrees."""
|
|
367
|
+
|
|
368
|
+
worktrees = get_active_worktrees()
|
|
369
|
+
workspace_config = {
|
|
370
|
+
"version": "0.1.0",
|
|
371
|
+
"folders": [
|
|
372
|
+
{
|
|
373
|
+
"name": "Main Repository",
|
|
374
|
+
"path": "."
|
|
375
|
+
}
|
|
376
|
+
],
|
|
377
|
+
"extensions": {
|
|
378
|
+
"recommendations": get_workspace_extensions()
|
|
379
|
+
},
|
|
380
|
+
"launch": {
|
|
381
|
+
"version": "0.2.0",
|
|
382
|
+
"configurations": []
|
|
383
|
+
},
|
|
384
|
+
"tasks": {
|
|
385
|
+
"version": "2.0.0",
|
|
386
|
+
"tasks": []
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
# Add worktree folders
|
|
391
|
+
for worktree in worktrees:
|
|
392
|
+
workspace_config["folders"].append({
|
|
393
|
+
"name": f"SPEC-{worktree['id']}",
|
|
394
|
+
"path": worktree['path']
|
|
395
|
+
})
|
|
396
|
+
|
|
397
|
+
# Add worktree-specific tasks
|
|
398
|
+
workspace_config["tasks"]["tasks"].extend(
|
|
399
|
+
generate_worktree_tasks(worktree)
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
# Write workspace file
|
|
403
|
+
with open(".vscode/workspaces.json", "w") as f:
|
|
404
|
+
json.dump(workspace_config, f, indent=2)
|
|
405
|
+
|
|
406
|
+
print(" VS Code workspace updated with worktrees")
|
|
407
|
+
|
|
408
|
+
def generate_worktree_tasks(worktree: dict) -> List[dict]:
|
|
409
|
+
"""Generate VS Code tasks for specific worktree."""
|
|
410
|
+
|
|
411
|
+
spec_id = worktree['id']
|
|
412
|
+
worktree_path = worktree['path']
|
|
413
|
+
|
|
414
|
+
return [
|
|
415
|
+
{
|
|
416
|
+
"label": f"Run SPEC-{spec_id} Tests",
|
|
417
|
+
"type": "shell",
|
|
418
|
+
"command": f"cd {worktree_path} && /moai:2-run {spec_id}",
|
|
419
|
+
"group": "test",
|
|
420
|
+
"presentation": {
|
|
421
|
+
"echo": true,
|
|
422
|
+
"reveal": "always",
|
|
423
|
+
"focus": false,
|
|
424
|
+
"panel": "shared"
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"label": f"Sync SPEC-{spec_id}",
|
|
429
|
+
"type": "shell",
|
|
430
|
+
"command": f"moai-worktree sync {spec_id}",
|
|
431
|
+
"group": "build"
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"label": f"Switch to SPEC-{spec_id}",
|
|
435
|
+
"type": "shell",
|
|
436
|
+
"command": f"moai-worktree switch {spec_id}",
|
|
437
|
+
"group": "navigation"
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Terminal Integration
|
|
443
|
+
|
|
444
|
+
Enhanced Shell Profile:
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
# ~/.bashrc or ~/.zshrc - Worktree integration
|
|
448
|
+
|
|
449
|
+
# Worktree completion
|
|
450
|
+
_moai_worktree_completion() {
|
|
451
|
+
local worktrees=($(moai-worktree list --format json 2>/dev/null | jq -r '.worktrees[].id' 2>/dev/null))
|
|
452
|
+
COMPREPLY=($(compgen -W "${worktrees[*]}" "${COMP_WORDS[COMP_CWORD]}"))
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
complete -F _moai_worktree_completion moai-worktree
|
|
456
|
+
|
|
457
|
+
# Worktree-aware prompt
|
|
458
|
+
update_prompt_with_worktree() {
|
|
459
|
+
if [ -f "../.moai-worktree-registry.json" ]; then
|
|
460
|
+
local spec_id=$(basename $(pwd) 2>/dev/null | grep '^SPEC-' || echo "")
|
|
461
|
+
if [ -n "$spec_id" ]; then
|
|
462
|
+
export WORKTREE_SPEC=$spec_id
|
|
463
|
+
export PS1="\[\033[36m\]$spec_id\[\033[0m\]:$PS1"
|
|
464
|
+
fi
|
|
465
|
+
else
|
|
466
|
+
unset WORKTREE_SPEC
|
|
467
|
+
fi
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
PROMPT_COMMAND=update_prompt_with_worktree
|
|
471
|
+
|
|
472
|
+
# Worktree navigation aliases
|
|
473
|
+
alias mw='moai-worktree'
|
|
474
|
+
alias mwl='moai-worktree list'
|
|
475
|
+
alias mws='moai-worktree switch'
|
|
476
|
+
alias mwg='eval $(moai-worktree go'
|
|
477
|
+
alias mwsync='moai-worktree sync'
|
|
478
|
+
alias mwclean='moai-worktree clean'
|
|
479
|
+
|
|
480
|
+
# Quick worktree functions
|
|
481
|
+
mwnew() {
|
|
482
|
+
local spec_id="$1"
|
|
483
|
+
local description="$2"
|
|
484
|
+
moai-worktree new "$spec_id" "$description"
|
|
485
|
+
moai-worktree switch "$spec_id"
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
mwdev() {
|
|
489
|
+
local spec_id="$1"
|
|
490
|
+
moai-worktree switch "$spec_id"
|
|
491
|
+
/moai:2-run "$spec_id"
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
mwpush() {
|
|
495
|
+
local spec_id="${1:-$WORKTREE_SPEC}"
|
|
496
|
+
if [ -n "$spec_id" ]; then
|
|
497
|
+
moai-worktree sync "$spec_id"
|
|
498
|
+
cd $(moai-worktree go "$spec_id")
|
|
499
|
+
git push origin "feature/SPEC-$spec_id"
|
|
500
|
+
else
|
|
501
|
+
echo "No SPEC ID provided or detected"
|
|
502
|
+
fi
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Git Integration
|
|
507
|
+
|
|
508
|
+
Enhanced Git Hooks:
|
|
509
|
+
|
|
510
|
+
```bash
|
|
511
|
+
# .git/hooks/post-checkout
|
|
512
|
+
#!/bin/bash
|
|
513
|
+
echo "Post-checkout hook: Checking worktree status"
|
|
514
|
+
|
|
515
|
+
# Check if we're in a worktree
|
|
516
|
+
if [ -f "../.moai-worktree-registry.json" ]; then
|
|
517
|
+
SPEC_ID=$(basename $(pwd))
|
|
518
|
+
echo "Switched to worktree: $SPEC_ID"
|
|
519
|
+
|
|
520
|
+
# Update last access time
|
|
521
|
+
moai-worktree status "$SPEC_ID" --update-access 2>/dev/null || true
|
|
522
|
+
|
|
523
|
+
# Check if sync is needed
|
|
524
|
+
SYNC_STATUS=$(moai-worktree status "$SPEC_ID" --sync-check 2>/dev/null || echo "unknown")
|
|
525
|
+
if echo "$SYNC_STATUS" | grep -q "needs sync"; then
|
|
526
|
+
echo " Worktree needs synchronization"
|
|
527
|
+
echo " Run: moai-worktree sync $SPEC_ID"
|
|
528
|
+
fi
|
|
529
|
+
|
|
530
|
+
# Load worktree-specific environment
|
|
531
|
+
if [ -f ".worktree-env" ]; then
|
|
532
|
+
echo "Loading worktree environment..."
|
|
533
|
+
source .worktree-env
|
|
534
|
+
fi
|
|
535
|
+
fi
|
|
536
|
+
|
|
537
|
+
# .git/hooks/pre-push
|
|
538
|
+
#!/bin/bash
|
|
539
|
+
echo "Pre-push hook: Validating worktree state"
|
|
540
|
+
|
|
541
|
+
# Check if we're pushing from a worktree
|
|
542
|
+
if [ -f "../.moai-worktree-registry.json" ]; then
|
|
543
|
+
SPEC_ID=$(basename $(pwd))
|
|
544
|
+
echo "Pushing from worktree: $SPEC_ID"
|
|
545
|
+
|
|
546
|
+
# Check for uncommitted changes
|
|
547
|
+
if ! git diff --quiet || ! git diff --cached --quiet; then
|
|
548
|
+
echo " Uncommitted changes detected"
|
|
549
|
+
echo " Commit changes before pushing or use --force"
|
|
550
|
+
exit 1
|
|
551
|
+
fi
|
|
552
|
+
|
|
553
|
+
# Check if worktree is synced with base
|
|
554
|
+
SYNC_STATUS=$(moai-worktree status "$SPEC_ID" --sync-check 2>/dev/null || echo "unknown")
|
|
555
|
+
if echo "$SYNC_STATUS" | grep -q "behind"; then
|
|
556
|
+
echo " Worktree is behind base branch"
|
|
557
|
+
echo " Run: moai-worktree sync $SPEC_ID"
|
|
558
|
+
echo " Continue anyway? (y/N)"
|
|
559
|
+
read -r response
|
|
560
|
+
if [[ ! "$response" =~ ^[Yy]$ ]]; then
|
|
561
|
+
exit 1
|
|
562
|
+
fi
|
|
563
|
+
fi
|
|
564
|
+
|
|
565
|
+
# Update worktree metadata
|
|
566
|
+
moai-worktree config set "last_push.$SPEC_ID" "$(date -Iseconds)" 2>/dev/null || true
|
|
567
|
+
fi
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
572
|
+
## Team Collaboration Integration
|
|
573
|
+
|
|
574
|
+
### Shared Worktree Patterns
|
|
575
|
+
|
|
576
|
+
Team Worktree Registry:
|
|
577
|
+
|
|
578
|
+
```python
|
|
579
|
+
# Shared registry configuration
|
|
580
|
+
class TeamWorktreeRegistry:
|
|
581
|
+
def __init__(self, team_name: str, shared_registry_path: str):
|
|
582
|
+
self.team_name = team_name
|
|
583
|
+
self.shared_registry_path = Path(shared_registry_path)
|
|
584
|
+
self.local_registry_path = Path.home() / "worktrees" / team_name / ".moai-worktree-registry.json"
|
|
585
|
+
|
|
586
|
+
def sync_with_team_registry(self) -> None:
|
|
587
|
+
"""Synchronize local registry with team shared registry."""
|
|
588
|
+
|
|
589
|
+
try:
|
|
590
|
+
# Fetch latest team registry
|
|
591
|
+
if self.shared_registry_path.exists():
|
|
592
|
+
team_registry = self.load_registry(self.shared_registry_path)
|
|
593
|
+
local_registry = self.load_registry(self.local_registry_path)
|
|
594
|
+
|
|
595
|
+
# Merge registries
|
|
596
|
+
merged_registry = self.merge_registries(team_registry, local_registry)
|
|
597
|
+
|
|
598
|
+
# Save merged registry
|
|
599
|
+
self.save_registry(merged_registry, self.local_registry_path)
|
|
600
|
+
|
|
601
|
+
print(f" Synced with team registry: {self.team_name}")
|
|
602
|
+
|
|
603
|
+
except Exception as e:
|
|
604
|
+
print(f" Failed to sync with team registry: {e}")
|
|
605
|
+
|
|
606
|
+
def share_worktree_with_team(self, spec_id: str, share_config: dict) -> None:
|
|
607
|
+
"""Share worktree configuration with team."""
|
|
608
|
+
|
|
609
|
+
# Update team registry
|
|
610
|
+
team_registry = self.load_registry(self.shared_registry_path)
|
|
611
|
+
|
|
612
|
+
worktree_info = team_registry['worktrees'].get(spec_id, {})
|
|
613
|
+
worktree_info.update({
|
|
614
|
+
'shared_with': share_config.get('team_members', []),
|
|
615
|
+
'share_level': share_config.get('level', 'read-only'),
|
|
616
|
+
'shared_at': datetime.utcnow().isoformat(),
|
|
617
|
+
'shared_by': os.getenv('USER', 'unknown')
|
|
618
|
+
})
|
|
619
|
+
|
|
620
|
+
team_registry['worktrees'][spec_id] = worktree_info
|
|
621
|
+
self.save_registry(team_registry, self.shared_registry_path)
|
|
622
|
+
|
|
623
|
+
print(f" Worktree {spec_id} shared with team")
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
Collaborative Development Workflow:
|
|
627
|
+
|
|
628
|
+
```bash
|
|
629
|
+
# Team collaboration script
|
|
630
|
+
collaborative_development() {
|
|
631
|
+
local spec_id="$1"
|
|
632
|
+
local team_members="$2" # Comma-separated list
|
|
633
|
+
|
|
634
|
+
echo "Setting up collaborative development for $spec_id..."
|
|
635
|
+
|
|
636
|
+
# Create shared worktree
|
|
637
|
+
moai-worktree new "$spec_id" "Team Collaborative Development" --template collaborative
|
|
638
|
+
|
|
639
|
+
# Configure team access
|
|
640
|
+
IFS=',' read -ra MEMBERS <<< "$team_members"
|
|
641
|
+
for member in "${MEMBERS[@]}"; do
|
|
642
|
+
moai-worktree config set "team_access.$spec_id.$member" "read-write"
|
|
643
|
+
echo " Granted read-write access to $member"
|
|
644
|
+
done
|
|
645
|
+
|
|
646
|
+
# Create shared configuration
|
|
647
|
+
cd $(moai-worktree go "$spec_id")
|
|
648
|
+
|
|
649
|
+
cat > .team-config << EOF
|
|
650
|
+
team_members: [$(echo "$team_members" | sed 's/,/, /g')]
|
|
651
|
+
collaboration_mode: active
|
|
652
|
+
shared_branch: feature/SPEC-$spec_id-collaborative
|
|
653
|
+
review_required: true
|
|
654
|
+
EOF
|
|
655
|
+
|
|
656
|
+
echo " Team collaboration setup completed"
|
|
657
|
+
echo "Team members can now join with:"
|
|
658
|
+
echo " moai-worktree join $spec_id --team-member <name>"
|
|
659
|
+
}
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
---
|
|
663
|
+
|
|
664
|
+
## External System Integration
|
|
665
|
+
|
|
666
|
+
### CI/CD Pipeline Integration
|
|
667
|
+
|
|
668
|
+
GitHub Actions Worktree Integration:
|
|
669
|
+
|
|
670
|
+
```yaml
|
|
671
|
+
# .github/workflows/worktree-integration.yml
|
|
672
|
+
name: Worktree Integration CI
|
|
673
|
+
|
|
674
|
+
on:
|
|
675
|
+
push:
|
|
676
|
+
branches: [ "feature/SPEC-*" ]
|
|
677
|
+
pull_request:
|
|
678
|
+
branches: [ "main", "develop" ]
|
|
679
|
+
|
|
680
|
+
jobs:
|
|
681
|
+
detect-spec:
|
|
682
|
+
runs-on: ubuntu-latest
|
|
683
|
+
outputs:
|
|
684
|
+
spec-id: ${{ steps.spec.outputs.id }}
|
|
685
|
+
spec-title: ${{ steps.spec.outputs.title }}
|
|
686
|
+
is-worktree-branch: ${{ steps.spec.outputs.is-worktree }}
|
|
687
|
+
steps:
|
|
688
|
+
- uses: actions/checkout@v3
|
|
689
|
+
|
|
690
|
+
- name: Detect SPEC information
|
|
691
|
+
id: spec
|
|
692
|
+
run: |
|
|
693
|
+
if [[ "${{ github.ref }}" == refs/heads/feature/SPEC-* ]]; then
|
|
694
|
+
SPEC_ID=$(echo "${{ github.ref }}" | sed 's/.*feature\/SPEC-\([0-9]*\).*/SPEC-\1/')
|
|
695
|
+
SPEC_TITLE=$(echo "${{ github.ref }}" | sed 's/.*feature\/SPEC-[0-9]*-\(.*\)/\1/')
|
|
696
|
+
echo "id=$SPEC_ID" >> $GITHUB_OUTPUT
|
|
697
|
+
echo "title=$SPEC_TITLE" >> $GITHUB_OUTPUT
|
|
698
|
+
echo "is-worktree=true" >> $GITHUB_OUTPUT
|
|
699
|
+
else
|
|
700
|
+
echo "id=none" >> $GITHUB_OUTPUT
|
|
701
|
+
echo "title=none" >> $GITHUB_OUTPUT
|
|
702
|
+
echo "is-worktree=false" >> $GITHUB_OUTPUT
|
|
703
|
+
fi
|
|
704
|
+
|
|
705
|
+
worktree-tests:
|
|
706
|
+
needs: detect-spec
|
|
707
|
+
if: needs.detect-spec.outputs.is-worktree == 'true'
|
|
708
|
+
runs-on: ubuntu-latest
|
|
709
|
+
strategy:
|
|
710
|
+
matrix:
|
|
711
|
+
test-type: [unit, integration, e2e]
|
|
712
|
+
steps:
|
|
713
|
+
- uses: actions/checkout@v3
|
|
714
|
+
with:
|
|
715
|
+
fetch-depth: 0
|
|
716
|
+
|
|
717
|
+
- name: Setup worktree environment
|
|
718
|
+
run: |
|
|
719
|
+
SPEC_ID="${{ needs.detect-spec.outputs.spec-id }}"
|
|
720
|
+
echo "Setting up worktree for $SPEC_ID"
|
|
721
|
+
|
|
722
|
+
# Create worktree directory structure
|
|
723
|
+
mkdir -p ./worktrees/$SPEC_ID
|
|
724
|
+
|
|
725
|
+
# Checkout worktree branch
|
|
726
|
+
git checkout "feature/SPEC-${SPEC_ID#SPEC-}-*" 2>/dev/null || git checkout main
|
|
727
|
+
|
|
728
|
+
# Copy source files to simulate worktree
|
|
729
|
+
mkdir -p ./worktrees/$SPEC_ID/src
|
|
730
|
+
cp -r src/* ./worktrees/$SPEC_ID/src/
|
|
731
|
+
|
|
732
|
+
# Setup test environment
|
|
733
|
+
cd ./worktrees/$SPEC_ID
|
|
734
|
+
|
|
735
|
+
if [ -f "../requirements.txt" ]; then
|
|
736
|
+
pip install -r ../requirements.txt
|
|
737
|
+
fi
|
|
738
|
+
|
|
739
|
+
if [ -f "../package.json" ]; then
|
|
740
|
+
npm install
|
|
741
|
+
fi
|
|
742
|
+
|
|
743
|
+
- name: Run ${{ matrix.test-type }} tests
|
|
744
|
+
run: |
|
|
745
|
+
cd ./worktrees/${{ needs.detect-spec.outputs.spec-id }}
|
|
746
|
+
|
|
747
|
+
case "${{ matrix.test-type }}" in
|
|
748
|
+
unit)
|
|
749
|
+
python -m pytest tests/unit/ -v || npm test -- --coverage
|
|
750
|
+
;;
|
|
751
|
+
integration)
|
|
752
|
+
python -m pytest tests/integration/ -v || npm run test:integration
|
|
753
|
+
;;
|
|
754
|
+
e2e)
|
|
755
|
+
npm run test:e2e || python -m pytest tests/e2e/ -v
|
|
756
|
+
;;
|
|
757
|
+
esac
|
|
758
|
+
|
|
759
|
+
- name: Upload test results
|
|
760
|
+
uses: actions/upload-artifact@v3
|
|
761
|
+
if: always()
|
|
762
|
+
with:
|
|
763
|
+
name: test-results-${{ matrix.test-type }}-${{ needs.detect-spec.outputs.spec-id }}
|
|
764
|
+
path: |
|
|
765
|
+
./worktrees/${{ needs.detect-spec.outputs.spec-id }}/test-results/
|
|
766
|
+
./worktrees/${{ needs.detect-spec.outputs.spec-id }}/coverage/
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
### Monitoring and Analytics Integration
|
|
770
|
+
|
|
771
|
+
Worktree Usage Analytics:
|
|
772
|
+
|
|
773
|
+
```python
|
|
774
|
+
# Worktree analytics collector
|
|
775
|
+
class WorktreeAnalytics:
|
|
776
|
+
def __init__(self, registry_path: Path):
|
|
777
|
+
self.registry_path = registry_path
|
|
778
|
+
|
|
779
|
+
def collect_usage_metrics(self) -> dict:
|
|
780
|
+
"""Collect comprehensive usage metrics."""
|
|
781
|
+
|
|
782
|
+
registry = self.load_registry()
|
|
783
|
+
worktrees = registry.get('worktrees', {})
|
|
784
|
+
|
|
785
|
+
metrics = {
|
|
786
|
+
'timestamp': datetime.utcnow().isoformat(),
|
|
787
|
+
'total_worktrees': len(worktrees),
|
|
788
|
+
'active_worktrees': len([w for w in worktrees.values() if w.get('status') == 'active']),
|
|
789
|
+
'disk_usage': self.calculate_total_disk_usage(worktrees),
|
|
790
|
+
'sync_frequency': self.calculate_sync_frequency(worktrees),
|
|
791
|
+
'developer_activity': self.analyze_developer_activity(worktrees),
|
|
792
|
+
'performance_metrics': self.collect_performance_metrics(worktrees)
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
return metrics
|
|
796
|
+
|
|
797
|
+
def export_analytics(self, output_format: str = 'json') -> str:
|
|
798
|
+
"""Export analytics in specified format."""
|
|
799
|
+
|
|
800
|
+
metrics = self.collect_usage_metrics()
|
|
801
|
+
|
|
802
|
+
if output_format == 'json':
|
|
803
|
+
return json.dumps(metrics, indent=2)
|
|
804
|
+
elif output_format == 'csv':
|
|
805
|
+
return self.convert_to_csv(metrics)
|
|
806
|
+
elif output_format == 'prometheus':
|
|
807
|
+
return self.convert_to_prometheus(metrics)
|
|
808
|
+
else:
|
|
809
|
+
raise ValueError(f"Unsupported format: {output_format}")
|
|
810
|
+
|
|
811
|
+
def send_to_monitoring_system(self, metrics: dict) -> None:
|
|
812
|
+
"""Send metrics to external monitoring system."""
|
|
813
|
+
|
|
814
|
+
# Example: Send to Prometheus Pushgateway
|
|
815
|
+
import requests
|
|
816
|
+
|
|
817
|
+
pushgateway_url = os.getenv('PROMETHEUS_PUSHGATEWAY_URL')
|
|
818
|
+
if pushgateway_url:
|
|
819
|
+
try:
|
|
820
|
+
response = requests.post(
|
|
821
|
+
f"{pushgateway_url}/metrics/job/worktree-analytics",
|
|
822
|
+
data=self.convert_to_prometheus(metrics),
|
|
823
|
+
headers={'Content-Type': 'text/plain'}
|
|
824
|
+
)
|
|
825
|
+
|
|
826
|
+
if response.status_code == 200:
|
|
827
|
+
print(" Metrics sent to monitoring system")
|
|
828
|
+
else:
|
|
829
|
+
print(f" Failed to send metrics: {response.status_code}")
|
|
830
|
+
|
|
831
|
+
except Exception as e:
|
|
832
|
+
print(f" Error sending metrics: {e}")
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
---
|
|
836
|
+
|
|
837
|
+
## Performance Optimization
|
|
838
|
+
|
|
839
|
+
### Resource Management Integration
|
|
840
|
+
|
|
841
|
+
Intelligent Resource Allocation:
|
|
842
|
+
|
|
843
|
+
```python
|
|
844
|
+
# Resource manager for parallel worktree operations
|
|
845
|
+
class WorktreeResourceManager:
|
|
846
|
+
def __init__(self):
|
|
847
|
+
self.cpu_count = os.cpu_count()
|
|
848
|
+
self.memory_gb = self.get_available_memory_gb()
|
|
849
|
+
self.max_concurrent_worktrees = min(self.cpu_count, 4)
|
|
850
|
+
|
|
851
|
+
def optimize_parallel_operations(self, worktrees: List[str]) -> List[str]:
|
|
852
|
+
"""Optimize worktree operations based on available resources."""
|
|
853
|
+
|
|
854
|
+
# Sort worktrees by priority and size
|
|
855
|
+
prioritized_worktrees = self.prioritize_worktrees(worktrees)
|
|
856
|
+
|
|
857
|
+
# Group worktrees for parallel execution
|
|
858
|
+
operation_groups = self.group_worktrees_for_parallel_execution(
|
|
859
|
+
prioritized_worktrees
|
|
860
|
+
)
|
|
861
|
+
|
|
862
|
+
return operation_groups
|
|
863
|
+
|
|
864
|
+
def execute_with_resource_limits(self, operations: List[Callable]) -> List[Any]:
|
|
865
|
+
"""Execute operations with resource limits."""
|
|
866
|
+
|
|
867
|
+
import concurrent.futures
|
|
868
|
+
|
|
869
|
+
results = []
|
|
870
|
+
|
|
871
|
+
with concurrent.futures.ThreadPoolExecutor(
|
|
872
|
+
max_workers=self.max_concurrent_worktrees
|
|
873
|
+
) as executor:
|
|
874
|
+
# Submit all operations
|
|
875
|
+
future_to_operation = {
|
|
876
|
+
executor.submit(op): op for op in operations
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
# Collect results as they complete
|
|
880
|
+
for future in concurrent.futures.as_completed(future_to_operation):
|
|
881
|
+
operation = future_to_operation[future]
|
|
882
|
+
try:
|
|
883
|
+
result = future.result()
|
|
884
|
+
results.append(result)
|
|
885
|
+
except Exception as e:
|
|
886
|
+
print(f" Operation failed: {e}")
|
|
887
|
+
results.append(None)
|
|
888
|
+
|
|
889
|
+
return results
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
---
|
|
893
|
+
|
|
894
|
+
## Error Handling and Recovery
|
|
895
|
+
|
|
896
|
+
### Integration Error Recovery
|
|
897
|
+
|
|
898
|
+
Comprehensive Error Handling:
|
|
899
|
+
|
|
900
|
+
```python
|
|
901
|
+
# Integration error recovery system
|
|
902
|
+
class IntegrationErrorHandler:
|
|
903
|
+
def __init__(self):
|
|
904
|
+
self.error_log = []
|
|
905
|
+
self.recovery_strategies = {
|
|
906
|
+
'worktree_not_found': self.recover_missing_worktree,
|
|
907
|
+
'sync_conflict': self.recover_sync_conflict,
|
|
908
|
+
'permission_denied': self.recover_permission_error,
|
|
909
|
+
'disk_space': self.recover_disk_space_error,
|
|
910
|
+
'network_error': self.recover_network_error
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
def handle_integration_error(self, error: Exception, context: dict) -> bool:
|
|
914
|
+
"""Handle integration error with appropriate recovery strategy."""
|
|
915
|
+
|
|
916
|
+
error_type = self.classify_error(error)
|
|
917
|
+
|
|
918
|
+
if error_type in self.recovery_strategies:
|
|
919
|
+
try:
|
|
920
|
+
recovery_result = self.recovery_strategies[error_type](error, context)
|
|
921
|
+
|
|
922
|
+
if recovery_result.success:
|
|
923
|
+
print(f" Recovered from {error_type}: {recovery_result.message}")
|
|
924
|
+
return True
|
|
925
|
+
else:
|
|
926
|
+
print(f" Recovery failed for {error_type}: {recovery_result.message}")
|
|
927
|
+
return False
|
|
928
|
+
|
|
929
|
+
except Exception as recovery_error:
|
|
930
|
+
print(f" Recovery failed with exception: {recovery_error}")
|
|
931
|
+
return False
|
|
932
|
+
else:
|
|
933
|
+
print(f" No recovery strategy for error type: {error_type}")
|
|
934
|
+
return False
|
|
935
|
+
|
|
936
|
+
def recover_missing_worktree(self, error: Exception, context: dict) -> RecoveryResult:
|
|
937
|
+
"""Recover from missing worktree error."""
|
|
938
|
+
|
|
939
|
+
spec_id = context.get('spec_id')
|
|
940
|
+
if not spec_id:
|
|
941
|
+
return RecoveryResult(success=False, message="No SPEC ID in context")
|
|
942
|
+
|
|
943
|
+
try:
|
|
944
|
+
# Offer to recreate worktree
|
|
945
|
+
print(f"Worktree {spec_id} not found. Recreating...")
|
|
946
|
+
|
|
947
|
+
# Attempt recreation with backup if available
|
|
948
|
+
backup_path = self.find_worktree_backup(spec_id)
|
|
949
|
+
|
|
950
|
+
if backup_path:
|
|
951
|
+
print(f"Found backup: {backup_path}")
|
|
952
|
+
restore_result = self.restore_worktree_from_backup(spec_id, backup_path)
|
|
953
|
+
|
|
954
|
+
if restore_result:
|
|
955
|
+
return RecoveryResult(
|
|
956
|
+
success=True,
|
|
957
|
+
message=f"Worktree {spec_id} restored from backup"
|
|
958
|
+
)
|
|
959
|
+
|
|
960
|
+
# Create new worktree
|
|
961
|
+
subprocess.run([
|
|
962
|
+
"moai-worktree", "new", spec_id,
|
|
963
|
+
"Auto-recreated after error"
|
|
964
|
+
], check=True)
|
|
965
|
+
|
|
966
|
+
return RecoveryResult(
|
|
967
|
+
success=True,
|
|
968
|
+
message=f"Worktree {spec_id} recreated successfully"
|
|
969
|
+
)
|
|
970
|
+
|
|
971
|
+
except Exception as e:
|
|
972
|
+
return RecoveryResult(
|
|
973
|
+
success=False,
|
|
974
|
+
message=f"Failed to recreate worktree: {e}"
|
|
975
|
+
)
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
---
|
|
979
|
+
|
|
980
|
+
Version: 1.0.0
|
|
981
|
+
Last Updated: 2025-11-29
|
|
982
|
+
Module: Comprehensive integration patterns for moai-worktree with MoAI-ADK workflow, development tools, and external systems
|