moai-adk 0.8.0__py3-none-any.whl → 0.34.0__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.
- moai_adk/__init__.py +2 -6
- moai_adk/__main__.py +136 -21
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +17 -5
- moai_adk/cli/commands/init.py +118 -48
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +8 -13
- moai_adk/cli/commands/update.py +1978 -149
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +144 -91
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +148 -17
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +2 -10
- moai_adk/core/git/checkpoint.py +1 -7
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +91 -2
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +189 -22
- moai_adk/core/project/initializer.py +218 -27
- moai_adk/core/project/phase_executor.py +416 -44
- moai_adk/core/project/validator.py +7 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +37 -101
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +82 -17
- moai_adk/core/template/config.py +112 -40
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +75 -26
- moai_adk/core/template/processor.py +750 -72
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +670 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +509 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1020 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1384 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/checkpoint.py +10 -37
- 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 +1075 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +78 -50
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +313 -283
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +610 -1525
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +423 -619
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +295 -95
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +817 -16
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +532 -17
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +470 -97
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +955 -16
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +651 -18
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/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 +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +618 -93
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +446 -91
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +346 -94
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +906 -16
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +721 -15
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +352 -91
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +851 -16
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +278 -18
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +344 -86
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +993 -16
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +549 -18
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +617 -96
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +364 -314
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +849 -496
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +731 -243
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +545 -89
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +650 -87
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +341 -93
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +646 -16
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +491 -18
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +463 -89
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +620 -16
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +410 -17
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +486 -112
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +905 -16
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +659 -17
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +333 -92
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1076 -16
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +718 -21
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1462 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +206 -36
- moai_adk/templates/.gitignore +194 -13
- moai_adk/templates/.mcp.json +31 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +151 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +81 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +634 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +170 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +87 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +571 -244
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +9 -13
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.34.0.dist-info/METADATA +2999 -0
- moai_adk-0.34.0.dist-info/RECORD +463 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/WHEEL +1 -1
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -80
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -293
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -196
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -207
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -375
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -343
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -246
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -320
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -837
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -272
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -265
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -311
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -352
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1184
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -665
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -488
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -623
- moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -416
- moai_adk/templates/.claude/hooks/alfred/core/tags.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -161
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -90
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -42
- moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -218
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
- moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +0 -176
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -256
- moai_adk/templates/.moai/config.json +0 -96
- moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +0 -208
- moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +0 -369
- moai_adk/templates/.moai/memory/CLAUDE-RULES.md +0 -539
- moai_adk/templates/.moai/memory/CONFIG-SCHEMA.md +0 -444
- moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
- moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +0 -220
- moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +0 -218
- moai_adk/templates/.moai/memory/SPEC-METADATA.md +0 -356
- moai_adk/templates/.moai/memory/config-schema.md +0 -444
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- moai_adk/templates/.moai/project/product.md +0 -161
- moai_adk/templates/.moai/project/structure.md +0 -156
- moai_adk/templates/.moai/project/tech.md +0 -227
- moai_adk/templates/__init__.py +0 -2
- moai_adk-0.8.0.dist-info/METADATA +0 -1722
- moai_adk-0.8.0.dist-info/RECORD +0 -282
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
"""SPEC Status Manager
|
|
2
|
+
|
|
3
|
+
Automated management of SPEC status transitions from 'draft' to 'completed'
|
|
4
|
+
based on implementation completion detection and validation criteria.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import re
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, Dict, List, Set
|
|
12
|
+
|
|
13
|
+
import yaml # type: ignore
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SpecStatusManager:
|
|
19
|
+
"""Manages SPEC status detection and updates based on implementation completion"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, project_root: Path):
|
|
22
|
+
"""Initialize the SPEC status manager
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
project_root: Root directory of the MoAI project
|
|
26
|
+
"""
|
|
27
|
+
self.project_root = Path(project_root)
|
|
28
|
+
self.specs_dir = self.project_root / ".moai" / "specs"
|
|
29
|
+
self.src_dir = self.project_root / "src"
|
|
30
|
+
self.tests_dir = self.project_root / "tests"
|
|
31
|
+
self.docs_dir = self.project_root / "docs"
|
|
32
|
+
|
|
33
|
+
# Validation criteria (configurable)
|
|
34
|
+
self.validation_criteria = {
|
|
35
|
+
"min_code_coverage": 0.85, # 85% minimum coverage
|
|
36
|
+
"require_acceptance_criteria": True,
|
|
37
|
+
"min_implementation_age_days": 0, # Days since last implementation
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def detect_draft_specs(self) -> Set[str]:
|
|
41
|
+
"""Detect all SPEC files with 'draft' status
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Set of SPEC IDs that have draft status
|
|
45
|
+
"""
|
|
46
|
+
draft_specs: Set[str] = set()
|
|
47
|
+
|
|
48
|
+
if not self.specs_dir.exists():
|
|
49
|
+
logger.warning(f"SPEC directory not found: {self.specs_dir}")
|
|
50
|
+
return draft_specs
|
|
51
|
+
|
|
52
|
+
for spec_dir in self.specs_dir.iterdir():
|
|
53
|
+
if spec_dir.is_dir():
|
|
54
|
+
spec_file = spec_dir / "spec.md"
|
|
55
|
+
if spec_file.exists():
|
|
56
|
+
try:
|
|
57
|
+
# Read frontmatter to check status
|
|
58
|
+
with open(spec_file, "r", encoding="utf-8") as f:
|
|
59
|
+
content = f.read()
|
|
60
|
+
|
|
61
|
+
frontmatter = None
|
|
62
|
+
|
|
63
|
+
# Handle JSON-like meta (common in older specs)
|
|
64
|
+
meta_match = re.search(r"<%?\s*---\s*\n(.*?)\n---\s*%?>", content, re.DOTALL)
|
|
65
|
+
if meta_match:
|
|
66
|
+
try:
|
|
67
|
+
meta_text = meta_match.group(1)
|
|
68
|
+
# Replace JSON-style quotes and parse as YAML
|
|
69
|
+
meta_text = meta_text.replace('"', "").replace("'", "")
|
|
70
|
+
frontmatter = yaml.safe_load("{" + meta_text + "}")
|
|
71
|
+
except Exception as e:
|
|
72
|
+
logger.debug(f"JSON meta parsing failed for {spec_dir.name}: {e}")
|
|
73
|
+
|
|
74
|
+
# Handle regular YAML frontmatter
|
|
75
|
+
elif content.startswith("---"):
|
|
76
|
+
end_marker = content.find("---", 3)
|
|
77
|
+
if end_marker != -1:
|
|
78
|
+
frontmatter_text = content[3:end_marker].strip()
|
|
79
|
+
try:
|
|
80
|
+
frontmatter = yaml.safe_load(frontmatter_text)
|
|
81
|
+
except yaml.YAMLError as e:
|
|
82
|
+
logger.warning(f"YAML parsing error for {spec_dir.name}: {e}")
|
|
83
|
+
# Try to fix common issues (like @ in author field)
|
|
84
|
+
try:
|
|
85
|
+
# Replace problematic @author entries
|
|
86
|
+
fixed_text = frontmatter_text
|
|
87
|
+
if "author: @" in fixed_text:
|
|
88
|
+
fixed_text = re.sub(
|
|
89
|
+
r"author:\s*@(\w+)",
|
|
90
|
+
r'author: "\1"',
|
|
91
|
+
fixed_text,
|
|
92
|
+
)
|
|
93
|
+
frontmatter = yaml.safe_load(fixed_text)
|
|
94
|
+
except yaml.YAMLError:
|
|
95
|
+
logger.error(f"Could not parse YAML for {spec_dir.name} even after fixes")
|
|
96
|
+
continue
|
|
97
|
+
|
|
98
|
+
if frontmatter and frontmatter.get("status") == "draft":
|
|
99
|
+
spec_id = spec_dir.name
|
|
100
|
+
draft_specs.add(spec_id)
|
|
101
|
+
logger.debug(f"Found draft SPEC: {spec_id}")
|
|
102
|
+
|
|
103
|
+
except Exception as e:
|
|
104
|
+
logger.error(f"Error reading SPEC {spec_dir.name}: {e}")
|
|
105
|
+
|
|
106
|
+
logger.info(f"Found {len(draft_specs)} draft SPECs")
|
|
107
|
+
return draft_specs
|
|
108
|
+
|
|
109
|
+
def is_spec_implementation_completed(self, spec_id: str) -> bool:
|
|
110
|
+
"""Check if a SPEC's implementation is complete
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
spec_id: The SPEC identifier (e.g., "SPEC-001")
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
True if implementation is complete, False otherwise
|
|
117
|
+
"""
|
|
118
|
+
spec_dir = self.specs_dir / spec_id
|
|
119
|
+
spec_file = spec_dir / "spec.md"
|
|
120
|
+
|
|
121
|
+
if not spec_file.exists():
|
|
122
|
+
logger.warning(f"SPEC file not found: {spec_file}")
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
# Check basic implementation status
|
|
127
|
+
spec_dir = spec_file.parent
|
|
128
|
+
|
|
129
|
+
# Check for implementation files
|
|
130
|
+
src_files = list(spec_dir.rglob("*.py")) if (spec_dir.parent.parent / "src").exists() else []
|
|
131
|
+
|
|
132
|
+
# Check for test files
|
|
133
|
+
test_dir = spec_dir.parent.parent / "tests"
|
|
134
|
+
test_files = list(test_dir.rglob(f"test_*{spec_id.lower()}*.py")) if test_dir.exists() else []
|
|
135
|
+
|
|
136
|
+
# Simple completion criteria
|
|
137
|
+
has_code = len(src_files) > 0
|
|
138
|
+
has_tests = len(test_files) > 0
|
|
139
|
+
|
|
140
|
+
# Check if SPEC has acceptance criteria
|
|
141
|
+
with open(spec_file, "r", encoding="utf-8") as f:
|
|
142
|
+
spec_content = f.read()
|
|
143
|
+
has_acceptance_criteria = "Acceptance Criteria" in spec_content
|
|
144
|
+
|
|
145
|
+
# Overall completion check
|
|
146
|
+
is_complete = has_code and has_tests and has_acceptance_criteria
|
|
147
|
+
|
|
148
|
+
logger.info(f"SPEC {spec_id} implementation status: {'COMPLETE' if is_complete else 'INCOMPLETE'}")
|
|
149
|
+
return is_complete
|
|
150
|
+
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.error(f"Error checking SPEC {spec_id} completion: {e}")
|
|
153
|
+
return False
|
|
154
|
+
|
|
155
|
+
def update_spec_status(self, spec_id: str, new_status: str) -> bool:
|
|
156
|
+
"""Update SPEC status in frontmatter
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
spec_id: The SPEC identifier
|
|
160
|
+
new_status: New status value ('completed', 'draft', etc.)
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
True if update successful, False otherwise
|
|
164
|
+
"""
|
|
165
|
+
spec_dir = self.specs_dir / spec_id
|
|
166
|
+
spec_file = spec_dir / "spec.md"
|
|
167
|
+
|
|
168
|
+
if not spec_file.exists():
|
|
169
|
+
logger.error(f"SPEC file not found: {spec_file}")
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
with open(spec_file, "r", encoding="utf-8") as f:
|
|
174
|
+
content = f.read()
|
|
175
|
+
|
|
176
|
+
# Extract and update frontmatter
|
|
177
|
+
if content.startswith("---"):
|
|
178
|
+
end_marker = content.find("---", 3)
|
|
179
|
+
if end_marker != -1:
|
|
180
|
+
frontmatter_text = content[3:end_marker].strip()
|
|
181
|
+
try:
|
|
182
|
+
frontmatter = yaml.safe_load(frontmatter_text) or {}
|
|
183
|
+
except yaml.YAMLError as e:
|
|
184
|
+
logger.warning(f"YAML parsing error for {spec_id}: {e}")
|
|
185
|
+
# Try to fix common issues
|
|
186
|
+
try:
|
|
187
|
+
fixed_text = frontmatter_text
|
|
188
|
+
if "author: @" in fixed_text:
|
|
189
|
+
fixed_text = re.sub(r"author:\s*@(\w+)", r'author: "\1"', fixed_text)
|
|
190
|
+
frontmatter = yaml.safe_load(fixed_text) or {}
|
|
191
|
+
except yaml.YAMLError:
|
|
192
|
+
logger.error(f"Could not parse YAML for {spec_id} even after fixes")
|
|
193
|
+
return False
|
|
194
|
+
|
|
195
|
+
# Update status
|
|
196
|
+
frontmatter["status"] = new_status
|
|
197
|
+
|
|
198
|
+
# Bump version if completing
|
|
199
|
+
if new_status == "completed":
|
|
200
|
+
frontmatter["version"] = self._bump_version(frontmatter.get("version", "0.1.0"))
|
|
201
|
+
frontmatter["updated"] = datetime.now().strftime("%Y-%m-%d")
|
|
202
|
+
|
|
203
|
+
# Reconstruct the file
|
|
204
|
+
new_frontmatter = yaml.dump(frontmatter, default_flow_style=False)
|
|
205
|
+
new_content = f"---\n{new_frontmatter}---{content[end_marker + 3 :]}"
|
|
206
|
+
|
|
207
|
+
# Write back to file
|
|
208
|
+
with open(spec_file, "w", encoding="utf-8") as f:
|
|
209
|
+
f.write(new_content)
|
|
210
|
+
|
|
211
|
+
logger.info(f"Updated SPEC {spec_id} status to {new_status}")
|
|
212
|
+
return True
|
|
213
|
+
|
|
214
|
+
except Exception as e:
|
|
215
|
+
logger.error(f"Error updating SPEC {spec_id} status: {e}")
|
|
216
|
+
return False
|
|
217
|
+
|
|
218
|
+
def get_completion_validation_criteria(self) -> Dict:
|
|
219
|
+
"""Get the current validation criteria for SPEC completion
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Dictionary of validation criteria
|
|
223
|
+
"""
|
|
224
|
+
return self.validation_criteria.copy()
|
|
225
|
+
|
|
226
|
+
def validate_spec_for_completion(self, spec_id: str) -> Dict[str, Any]:
|
|
227
|
+
"""Validate if a SPEC is ready for completion
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
spec_id: The SPEC identifier
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
Dictionary with validation results:
|
|
234
|
+
{
|
|
235
|
+
'is_ready': bool,
|
|
236
|
+
'criteria_met': Dict[str, bool],
|
|
237
|
+
'issues': List[str],
|
|
238
|
+
'recommendations': List[str]
|
|
239
|
+
}
|
|
240
|
+
"""
|
|
241
|
+
result: Dict[str, Any] = {
|
|
242
|
+
"is_ready": False,
|
|
243
|
+
"criteria_met": {},
|
|
244
|
+
"issues": [],
|
|
245
|
+
"recommendations": [],
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
try:
|
|
249
|
+
spec_dir = self.specs_dir / spec_id
|
|
250
|
+
spec_file = spec_dir / "spec.md"
|
|
251
|
+
|
|
252
|
+
if not spec_file.exists():
|
|
253
|
+
issues_list = result["issues"]
|
|
254
|
+
if isinstance(issues_list, list):
|
|
255
|
+
issues_list.append(f"SPEC file not found: {spec_file}")
|
|
256
|
+
return result
|
|
257
|
+
|
|
258
|
+
# Check implementation status
|
|
259
|
+
criteria_checks: Dict[str, bool] = {}
|
|
260
|
+
|
|
261
|
+
# Check for code implementation
|
|
262
|
+
spec_dir = spec_file.parent
|
|
263
|
+
src_dir = spec_dir.parent.parent / "src"
|
|
264
|
+
criteria_checks["code_implemented"] = src_dir.exists() and len(list(src_dir.rglob("*.py"))) > 0
|
|
265
|
+
if not criteria_checks["code_implemented"]:
|
|
266
|
+
issues_list = result["issues"]
|
|
267
|
+
if isinstance(issues_list, list):
|
|
268
|
+
issues_list.append("No source code files found")
|
|
269
|
+
|
|
270
|
+
# Check for test implementation
|
|
271
|
+
test_dir = spec_dir.parent.parent / "tests"
|
|
272
|
+
test_files = list(test_dir.rglob("test_*.py")) if test_dir.exists() else []
|
|
273
|
+
criteria_checks["test_implemented"] = len(test_files) > 0
|
|
274
|
+
if not criteria_checks["test_implemented"]:
|
|
275
|
+
issues_list = result["issues"]
|
|
276
|
+
if isinstance(issues_list, list):
|
|
277
|
+
issues_list.append("No test files found")
|
|
278
|
+
|
|
279
|
+
# Check for acceptance criteria
|
|
280
|
+
criteria_checks["tasks_completed"] = self._check_acceptance_criteria(spec_file)
|
|
281
|
+
if not criteria_checks["tasks_completed"]:
|
|
282
|
+
issues_list = result["issues"]
|
|
283
|
+
if isinstance(issues_list, list):
|
|
284
|
+
issues_list.append("Missing acceptance criteria section")
|
|
285
|
+
|
|
286
|
+
# 4. Acceptance criteria present
|
|
287
|
+
criteria_checks["has_acceptance_criteria"] = self._check_acceptance_criteria(spec_file)
|
|
288
|
+
if (
|
|
289
|
+
not criteria_checks["has_acceptance_criteria"]
|
|
290
|
+
and self.validation_criteria["require_acceptance_criteria"]
|
|
291
|
+
):
|
|
292
|
+
issues_list = result["issues"]
|
|
293
|
+
if isinstance(issues_list, list):
|
|
294
|
+
issues_list.append("Missing acceptance criteria section")
|
|
295
|
+
|
|
296
|
+
# 5. Documentation sync
|
|
297
|
+
criteria_checks["docs_synced"] = self._check_documentation_sync(spec_id)
|
|
298
|
+
if not criteria_checks["docs_synced"]:
|
|
299
|
+
recs_list = result["recommendations"]
|
|
300
|
+
if isinstance(recs_list, list):
|
|
301
|
+
recs_list.append("Consider running /moai:3-sync to update documentation")
|
|
302
|
+
|
|
303
|
+
result["criteria_met"] = criteria_checks
|
|
304
|
+
result["is_ready"] = all(criteria_checks.values())
|
|
305
|
+
|
|
306
|
+
# Add recommendations
|
|
307
|
+
if result["is_ready"]:
|
|
308
|
+
recs_list = result["recommendations"]
|
|
309
|
+
if isinstance(recs_list, list):
|
|
310
|
+
recs_list.append("SPEC is ready for completion. Consider updating status to 'completed'")
|
|
311
|
+
|
|
312
|
+
except Exception as e:
|
|
313
|
+
logger.error(f"Error validating SPEC {spec_id}: {e}")
|
|
314
|
+
issues_list = result["issues"]
|
|
315
|
+
if isinstance(issues_list, list):
|
|
316
|
+
issues_list.append(f"Validation error: {e}")
|
|
317
|
+
|
|
318
|
+
return result
|
|
319
|
+
|
|
320
|
+
def batch_update_completed_specs(self) -> Dict[str, List[str]]:
|
|
321
|
+
"""Batch update all draft SPECs that have completed implementations
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
Dictionary with update results:
|
|
325
|
+
{
|
|
326
|
+
'updated': List[str], # Successfully updated SPEC IDs
|
|
327
|
+
'failed': List[str], # Failed SPEC IDs with errors
|
|
328
|
+
'skipped': List[str] # Incomplete SPEC IDs
|
|
329
|
+
}
|
|
330
|
+
"""
|
|
331
|
+
results: Dict[str, List[str]] = {"updated": [], "failed": [], "skipped": []}
|
|
332
|
+
|
|
333
|
+
draft_specs = self.detect_draft_specs()
|
|
334
|
+
logger.info(f"Checking {len(draft_specs)} draft SPECs for completion")
|
|
335
|
+
|
|
336
|
+
for spec_id in draft_specs:
|
|
337
|
+
try:
|
|
338
|
+
# Validate first
|
|
339
|
+
validation = self.validate_spec_for_completion(spec_id)
|
|
340
|
+
|
|
341
|
+
if validation["is_ready"]:
|
|
342
|
+
# Update status
|
|
343
|
+
if self.update_spec_status(spec_id, "completed"):
|
|
344
|
+
updated_list = results["updated"]
|
|
345
|
+
if isinstance(updated_list, list):
|
|
346
|
+
updated_list.append(spec_id)
|
|
347
|
+
logger.info(f"Updated SPEC {spec_id} to completed")
|
|
348
|
+
else:
|
|
349
|
+
failed_list = results["failed"]
|
|
350
|
+
if isinstance(failed_list, list):
|
|
351
|
+
failed_list.append(spec_id)
|
|
352
|
+
logger.error(f"Failed to update SPEC {spec_id}")
|
|
353
|
+
else:
|
|
354
|
+
skipped_list = results["skipped"]
|
|
355
|
+
if isinstance(skipped_list, list):
|
|
356
|
+
skipped_list.append(spec_id)
|
|
357
|
+
logger.debug(f"SPEC {spec_id} not ready for completion: {validation['issues']}")
|
|
358
|
+
|
|
359
|
+
except Exception as e:
|
|
360
|
+
failed_list = results["failed"]
|
|
361
|
+
if isinstance(failed_list, list):
|
|
362
|
+
failed_list.append(spec_id)
|
|
363
|
+
logger.error(f"Error processing SPEC {spec_id}: {e}")
|
|
364
|
+
|
|
365
|
+
logger.info(
|
|
366
|
+
f"Batch update complete: {len(results['updated'])} updated, "
|
|
367
|
+
f"{len(results['failed'])} failed, "
|
|
368
|
+
f"{len(results['skipped'])} skipped"
|
|
369
|
+
)
|
|
370
|
+
return results
|
|
371
|
+
|
|
372
|
+
# Private helper methods
|
|
373
|
+
|
|
374
|
+
def _check_acceptance_criteria(self, spec_file: Path) -> bool:
|
|
375
|
+
"""
|
|
376
|
+
Check if SPEC file contains acceptance criteria
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
spec_file: Path to SPEC file
|
|
380
|
+
|
|
381
|
+
Returns:
|
|
382
|
+
True if acceptance criteria present
|
|
383
|
+
"""
|
|
384
|
+
try:
|
|
385
|
+
with open(spec_file, "r", encoding="utf-8") as f:
|
|
386
|
+
content = f.read()
|
|
387
|
+
|
|
388
|
+
# Look for acceptance criteria section
|
|
389
|
+
acceptance_patterns = [
|
|
390
|
+
r"##\s*Acceptance\s+Criteria",
|
|
391
|
+
r"###\s*Acceptance\s+Criteria",
|
|
392
|
+
r"##\s*验收\s+标准",
|
|
393
|
+
r"###\s*验收\s+标准",
|
|
394
|
+
]
|
|
395
|
+
|
|
396
|
+
for pattern in acceptance_patterns:
|
|
397
|
+
if re.search(pattern, content, re.IGNORECASE):
|
|
398
|
+
return True
|
|
399
|
+
|
|
400
|
+
return False
|
|
401
|
+
|
|
402
|
+
except Exception as e:
|
|
403
|
+
logger.error(f"Error checking acceptance criteria in {spec_file}: {e}")
|
|
404
|
+
return False
|
|
405
|
+
|
|
406
|
+
def _check_documentation_sync(self, spec_id: str) -> bool:
|
|
407
|
+
"""
|
|
408
|
+
Check if documentation is synchronized with implementation
|
|
409
|
+
|
|
410
|
+
Args:
|
|
411
|
+
spec_id: The SPEC identifier
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
True if documentation appears synchronized
|
|
415
|
+
"""
|
|
416
|
+
try:
|
|
417
|
+
# Simple heuristic: check if docs exist and are recent
|
|
418
|
+
docs_dir = self.project_root / "docs"
|
|
419
|
+
if not docs_dir.exists():
|
|
420
|
+
return True # No docs to sync
|
|
421
|
+
|
|
422
|
+
# Check if there are any doc files related to this SPEC
|
|
423
|
+
spec_docs = list(docs_dir.rglob(f"*{spec_id.lower()}*"))
|
|
424
|
+
if not spec_docs:
|
|
425
|
+
return True # No specific docs for this SPEC
|
|
426
|
+
|
|
427
|
+
# Basic check - assume docs are in sync if they exist
|
|
428
|
+
return True
|
|
429
|
+
|
|
430
|
+
except Exception as e:
|
|
431
|
+
logger.error(f"Error checking documentation sync for {spec_id}: {e}")
|
|
432
|
+
return False
|
|
433
|
+
|
|
434
|
+
def _run_additional_validations(self, spec_id: str) -> bool:
|
|
435
|
+
"""Run additional validation checks for SPEC completion
|
|
436
|
+
|
|
437
|
+
Args:
|
|
438
|
+
spec_id: The SPEC identifier
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
True if all additional validations pass
|
|
442
|
+
"""
|
|
443
|
+
# Add any additional validation logic here
|
|
444
|
+
# For now, return True as default
|
|
445
|
+
return True
|
|
446
|
+
|
|
447
|
+
def _bump_version(self, current_version: str) -> str:
|
|
448
|
+
"""Bump version to indicate completion
|
|
449
|
+
|
|
450
|
+
Args:
|
|
451
|
+
current_version: Current version string
|
|
452
|
+
|
|
453
|
+
Returns:
|
|
454
|
+
New version string
|
|
455
|
+
"""
|
|
456
|
+
try:
|
|
457
|
+
# Parse current version - strip quotes if present
|
|
458
|
+
version = str(current_version).strip("\"'")
|
|
459
|
+
|
|
460
|
+
if version.startswith("0."):
|
|
461
|
+
# Major version bump for completion
|
|
462
|
+
return "1.0.0"
|
|
463
|
+
else:
|
|
464
|
+
# Minor version bump for updates
|
|
465
|
+
parts = version.split(".")
|
|
466
|
+
if len(parts) >= 2:
|
|
467
|
+
try:
|
|
468
|
+
minor = int(parts[1]) + 1
|
|
469
|
+
return f"{parts[0]}.{minor}.0"
|
|
470
|
+
except ValueError:
|
|
471
|
+
# If parsing fails, default to 1.0.0
|
|
472
|
+
return "1.0.0"
|
|
473
|
+
else:
|
|
474
|
+
return f"{version}.1"
|
|
475
|
+
|
|
476
|
+
except Exception:
|
|
477
|
+
# Fallback to 1.0.0
|
|
478
|
+
return "1.0.0"
|
moai_adk/core/template/backup.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# @CODE:TEMPLATE-001 | SPEC: SPEC-INIT-003/spec.md | Chain: TEMPLATE-001
|
|
2
1
|
"""Template backup manager (SPEC-INIT-003 v0.3.0).
|
|
3
2
|
|
|
4
3
|
Creates and manages backups to protect user data during template updates.
|
|
@@ -6,7 +5,9 @@ Creates and manages backups to protect user data during template updates.
|
|
|
6
5
|
|
|
7
6
|
from __future__ import annotations
|
|
8
7
|
|
|
8
|
+
import re
|
|
9
9
|
import shutil
|
|
10
|
+
from datetime import datetime
|
|
10
11
|
from pathlib import Path
|
|
11
12
|
|
|
12
13
|
|
|
@@ -42,24 +43,20 @@ class TemplateBackup:
|
|
|
42
43
|
Returns:
|
|
43
44
|
True when any tracked file exists.
|
|
44
45
|
"""
|
|
45
|
-
return any(
|
|
46
|
-
(self.target_path / item).exists()
|
|
47
|
-
for item in [".moai", ".claude", ".github", "CLAUDE.md"]
|
|
48
|
-
)
|
|
46
|
+
return any((self.target_path / item).exists() for item in [".moai", ".claude", ".github", "CLAUDE.md"])
|
|
49
47
|
|
|
50
48
|
def create_backup(self) -> Path:
|
|
51
|
-
"""Create a
|
|
49
|
+
"""Create a timestamped backup under .moai-backups/.
|
|
52
50
|
|
|
53
|
-
|
|
51
|
+
Creates a new timestamped backup directory for each update.
|
|
52
|
+
Maintains backward compatibility by supporting both new and legacy structures.
|
|
54
53
|
|
|
55
54
|
Returns:
|
|
56
|
-
|
|
55
|
+
Path to timestamped backup directory (e.g., .moai-backups/20241201_143022/).
|
|
57
56
|
"""
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if backup_path.exists():
|
|
62
|
-
shutil.rmtree(backup_path)
|
|
57
|
+
# Generate timestamp for backup directory name
|
|
58
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
59
|
+
backup_path = self.target_path / ".moai-backups" / timestamp
|
|
63
60
|
|
|
64
61
|
backup_path.mkdir(parents=True, exist_ok=True)
|
|
65
62
|
|
|
@@ -81,6 +78,35 @@ class TemplateBackup:
|
|
|
81
78
|
|
|
82
79
|
return backup_path
|
|
83
80
|
|
|
81
|
+
def get_latest_backup(self) -> Path | None:
|
|
82
|
+
"""Get the most recent backup, supporting both new and legacy structures.
|
|
83
|
+
|
|
84
|
+
Searches for backups in order of preference:
|
|
85
|
+
1. Latest timestamped backup (new structure)
|
|
86
|
+
2. Legacy backup/ directory (old structure)
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Path to the most recent backup directory, or None if no backups exist.
|
|
90
|
+
"""
|
|
91
|
+
# Check for new timestamped backups first
|
|
92
|
+
backup_dir = self.target_path / ".moai-backups"
|
|
93
|
+
if backup_dir.exists():
|
|
94
|
+
# Match pattern: YYYYMMDD_HHMMSS (8 digits + underscore + 6 digits)
|
|
95
|
+
timestamp_pattern = re.compile(r"^\d{8}_\d{6}$")
|
|
96
|
+
timestamped_backups = [d for d in backup_dir.iterdir() if d.is_dir() and timestamp_pattern.match(d.name)]
|
|
97
|
+
|
|
98
|
+
if timestamped_backups:
|
|
99
|
+
# Sort by name (timestamp) and return the latest
|
|
100
|
+
latest_backup = max(timestamped_backups, key=lambda x: x.name)
|
|
101
|
+
return latest_backup
|
|
102
|
+
|
|
103
|
+
# Fall back to legacy backup/ directory
|
|
104
|
+
legacy_backup = backup_dir / "backup"
|
|
105
|
+
if legacy_backup.exists():
|
|
106
|
+
return legacy_backup
|
|
107
|
+
|
|
108
|
+
return None
|
|
109
|
+
|
|
84
110
|
def _copy_exclude_protected(self, src: Path, dst: Path) -> None:
|
|
85
111
|
"""Copy backup content while excluding protected paths.
|
|
86
112
|
|
|
@@ -95,10 +121,7 @@ class TemplateBackup:
|
|
|
95
121
|
rel_path_str = str(rel_path)
|
|
96
122
|
|
|
97
123
|
# Skip excluded paths
|
|
98
|
-
if any(
|
|
99
|
-
rel_path_str.startswith(exclude_dir)
|
|
100
|
-
for exclude_dir in self.BACKUP_EXCLUDE_DIRS
|
|
101
|
-
):
|
|
124
|
+
if any(rel_path_str.startswith(exclude_dir) for exclude_dir in self.BACKUP_EXCLUDE_DIRS):
|
|
102
125
|
continue
|
|
103
126
|
|
|
104
127
|
dst_item = dst / rel_path
|
|
@@ -107,3 +130,45 @@ class TemplateBackup:
|
|
|
107
130
|
shutil.copy2(item, dst_item)
|
|
108
131
|
elif item.is_dir():
|
|
109
132
|
dst_item.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
|
|
134
|
+
def restore_backup(self, backup_path: Path | None = None) -> None:
|
|
135
|
+
"""Restore project files from backup.
|
|
136
|
+
|
|
137
|
+
Restores .moai, .claude, .github directories and CLAUDE.md file
|
|
138
|
+
from a backup created by create_backup().
|
|
139
|
+
Supports both new timestamped and legacy backup structures.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
backup_path: Backup path to restore from.
|
|
143
|
+
If None, automatically finds the latest backup.
|
|
144
|
+
|
|
145
|
+
Raises:
|
|
146
|
+
FileNotFoundError: When no backup is found.
|
|
147
|
+
"""
|
|
148
|
+
if backup_path is None:
|
|
149
|
+
backup_path = self.get_latest_backup()
|
|
150
|
+
|
|
151
|
+
if backup_path is None or not backup_path.exists():
|
|
152
|
+
raise FileNotFoundError(f"Backup not found: {backup_path}")
|
|
153
|
+
|
|
154
|
+
# Restore each item from backup
|
|
155
|
+
for item in [".moai", ".claude", ".github", "CLAUDE.md"]:
|
|
156
|
+
src = backup_path / item
|
|
157
|
+
dst = self.target_path / item
|
|
158
|
+
|
|
159
|
+
# Skip if not in backup
|
|
160
|
+
if not src.exists():
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
# Remove current version
|
|
164
|
+
if dst.exists():
|
|
165
|
+
if dst.is_dir():
|
|
166
|
+
shutil.rmtree(dst)
|
|
167
|
+
else:
|
|
168
|
+
dst.unlink()
|
|
169
|
+
|
|
170
|
+
# Restore from backup
|
|
171
|
+
if src.is_dir():
|
|
172
|
+
shutil.copytree(src, dst, dirs_exist_ok=True)
|
|
173
|
+
else:
|
|
174
|
+
shutil.copy2(src, dst)
|