moai-adk 0.15.1__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -6
- moai_adk/__main__.py +136 -21
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +17 -5
- moai_adk/cli/commands/init.py +105 -47
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +8 -13
- moai_adk/cli/commands/update.py +1734 -65
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +144 -91
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +147 -16
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +2 -10
- moai_adk/core/git/checkpoint.py +1 -7
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +91 -2
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +20 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +17 -39
- moai_adk/core/project/initializer.py +170 -33
- moai_adk/core/project/phase_executor.py +398 -68
- moai_adk/core/project/validator.py +7 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +37 -101
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +82 -17
- moai_adk/core/template/config.py +112 -40
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +75 -26
- moai_adk/core/template/processor.py +750 -72
- moai_adk/core/template_engine.py +90 -48
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +373 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +264 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +383 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/{alfred/shared/core → moai/lib}/checkpoint.py +9 -36
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/{alfred/shared/core → moai/lib}/project.py +63 -44
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/timeout.py +40 -16
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +78 -50
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +312 -283
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +291 -94
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +469 -101
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +220 -13
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
- moai_adk/templates/.gitignore +197 -13
- moai_adk/templates/.mcp.json +20 -0
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +310 -1050
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +7 -11
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/{templates/.claude/hooks/alfred/utils → utils}/timeout.py +8 -9
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -80
- moai_adk/core/tags/__init__.py +0 -86
- moai_adk/core/tags/ci_validator.py +0 -463
- moai_adk/core/tags/cli.py +0 -283
- moai_adk/core/tags/generator.py +0 -109
- moai_adk/core/tags/inserter.py +0 -99
- moai_adk/core/tags/mapper.py +0 -126
- moai_adk/core/tags/parser.py +0 -76
- moai_adk/core/tags/pre_commit_validator.py +0 -393
- moai_adk/core/tags/reporter.py +0 -956
- moai_adk/core/tags/tags.py +0 -149
- moai_adk/core/tags/validator.py +0 -897
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
- moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
- moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
- moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
- moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -419
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
- moai_adk/templates/.github/workflows/release.yml +0 -118
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/tag-report.yml +0 -269
- moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
- moai_adk/templates/.moai/config.json +0 -115
- moai_adk/templates/workflows/go-tag-validation.yml +0 -30
- moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
- moai_adk/templates/workflows/python-tag-validation.yml +0 -42
- moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
- moai_adk-0.15.1.dist-info/METADATA +0 -3094
- moai_adk-0.15.1.dist-info/RECORD +0 -365
- {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Unified Configuration Manager for MoAI-ADK
|
|
3
|
+
|
|
4
|
+
Thread-safe singleton configuration manager that consolidates all config management
|
|
5
|
+
patterns from across the codebase into a single, robust implementation.
|
|
6
|
+
|
|
7
|
+
Features:
|
|
8
|
+
- Thread-safe singleton with double-checked locking
|
|
9
|
+
- Lazy loading with in-memory caching
|
|
10
|
+
- Atomic writes with backup creation
|
|
11
|
+
- Schema validation support
|
|
12
|
+
- Smart defaults with auto-detection
|
|
13
|
+
- Deep merge for nested configs
|
|
14
|
+
- Configuration migration between versions
|
|
15
|
+
- Domain-specific facades for different subsystems
|
|
16
|
+
|
|
17
|
+
Design Philosophy:
|
|
18
|
+
- Single source of truth for `.moai/config/config.yaml` (with JSON fallback)
|
|
19
|
+
- Best patterns from StatuslineConfig, UnifiedConfigManager, ConfigurationManager
|
|
20
|
+
- Backward compatible with existing ConfigManager interfaces
|
|
21
|
+
- Performance optimized with caching and minimal I/O
|
|
22
|
+
|
|
23
|
+
Usage:
|
|
24
|
+
>>> from moai_adk.core.config.unified import get_unified_config
|
|
25
|
+
>>> config = get_unified_config()
|
|
26
|
+
>>> timeout = config.get("hooks.timeout_ms", 2000)
|
|
27
|
+
>>> config.update({"hooks.timeout_ms": 3000})
|
|
28
|
+
>>> config.save()
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
import json
|
|
32
|
+
import logging
|
|
33
|
+
import shutil
|
|
34
|
+
import threading
|
|
35
|
+
from datetime import datetime
|
|
36
|
+
from functools import lru_cache
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
from typing import Any, Dict, Optional, Union
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
import yaml
|
|
42
|
+
|
|
43
|
+
YAML_AVAILABLE = True
|
|
44
|
+
except ImportError:
|
|
45
|
+
YAML_AVAILABLE = False
|
|
46
|
+
|
|
47
|
+
logger = logging.getLogger(__name__)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class UnifiedConfigManager:
|
|
51
|
+
"""
|
|
52
|
+
Thread-safe singleton configuration manager for MoAI-ADK.
|
|
53
|
+
|
|
54
|
+
This class consolidates all configuration management patterns from:
|
|
55
|
+
- StatuslineConfig: Thread-safe singleton pattern
|
|
56
|
+
- UnifiedConfigManager (skills): Backup, migration, validation
|
|
57
|
+
- ConfigurationManager (project): Smart defaults, auto-detection
|
|
58
|
+
- ConfigManager (hooks): Convenience functions
|
|
59
|
+
|
|
60
|
+
Attributes:
|
|
61
|
+
_instance: Singleton instance
|
|
62
|
+
_config: Cached configuration dictionary
|
|
63
|
+
_lock: Thread lock for singleton pattern
|
|
64
|
+
_config_path: Path to configuration file
|
|
65
|
+
_last_modified: Last modification timestamp for cache invalidation
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
_instance: Optional["UnifiedConfigManager"] = None
|
|
69
|
+
_config: Dict[str, Any] = {}
|
|
70
|
+
_lock = threading.Lock()
|
|
71
|
+
_config_path: Optional[Path] = None
|
|
72
|
+
_last_modified: Optional[float] = None
|
|
73
|
+
|
|
74
|
+
def __new__(cls, config_path: Optional[Union[str, Path]] = None):
|
|
75
|
+
"""
|
|
76
|
+
Create or return singleton instance with double-checked locking.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
config_path: Optional path to config file (default: .moai/config/config.json)
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
UnifiedConfigManager: Singleton instance
|
|
83
|
+
"""
|
|
84
|
+
# Double-checked locking pattern for thread-safe singleton
|
|
85
|
+
if cls._instance is None:
|
|
86
|
+
with cls._lock:
|
|
87
|
+
# Double-check after acquiring lock
|
|
88
|
+
if cls._instance is None:
|
|
89
|
+
cls._instance = super().__new__(cls)
|
|
90
|
+
cls._instance._initialize(config_path)
|
|
91
|
+
return cls._instance
|
|
92
|
+
|
|
93
|
+
def _initialize(self, config_path: Optional[Union[str, Path]] = None) -> None:
|
|
94
|
+
"""
|
|
95
|
+
Initialize configuration manager (called once by singleton).
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
config_path: Optional path to config file
|
|
99
|
+
"""
|
|
100
|
+
# Set config path with auto-detection
|
|
101
|
+
if config_path:
|
|
102
|
+
self._config_path = Path(config_path)
|
|
103
|
+
else:
|
|
104
|
+
# Auto-detect YAML (preferred) or JSON (fallback)
|
|
105
|
+
base_path = Path.cwd() / ".moai" / "config"
|
|
106
|
+
yaml_path = base_path / "config.yaml"
|
|
107
|
+
json_path = base_path / "config.json"
|
|
108
|
+
|
|
109
|
+
if YAML_AVAILABLE and yaml_path.exists():
|
|
110
|
+
self._config_path = yaml_path
|
|
111
|
+
elif json_path.exists():
|
|
112
|
+
self._config_path = json_path
|
|
113
|
+
else:
|
|
114
|
+
# Default to YAML for new projects
|
|
115
|
+
self._config_path = yaml_path if YAML_AVAILABLE else json_path
|
|
116
|
+
|
|
117
|
+
# Load configuration
|
|
118
|
+
self._load_config()
|
|
119
|
+
|
|
120
|
+
def _load_config(self) -> None:
|
|
121
|
+
"""
|
|
122
|
+
Load configuration from file with caching.
|
|
123
|
+
|
|
124
|
+
Implements cache invalidation based on file modification time.
|
|
125
|
+
Falls back to default configuration if file doesn't exist.
|
|
126
|
+
Supports both YAML (preferred) and JSON (legacy) formats.
|
|
127
|
+
"""
|
|
128
|
+
try:
|
|
129
|
+
# Check if file exists
|
|
130
|
+
if not self._config_path.exists():
|
|
131
|
+
logger.warning(f"Config file not found: {self._config_path}")
|
|
132
|
+
self._config = self._get_default_config()
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
# Check cache validity
|
|
136
|
+
current_mtime = self._config_path.stat().st_mtime
|
|
137
|
+
if self._last_modified and current_mtime == self._last_modified:
|
|
138
|
+
# Cache is still valid
|
|
139
|
+
return
|
|
140
|
+
|
|
141
|
+
# Load from file (auto-detect format)
|
|
142
|
+
with open(self._config_path, "r", encoding="utf-8") as f:
|
|
143
|
+
if self._config_path.suffix == ".yaml" or self._config_path.suffix == ".yml":
|
|
144
|
+
if not YAML_AVAILABLE:
|
|
145
|
+
raise ImportError("PyYAML is required for YAML config files. Install with: pip install pyyaml")
|
|
146
|
+
self._config = yaml.safe_load(f) or {}
|
|
147
|
+
else:
|
|
148
|
+
self._config = json.load(f)
|
|
149
|
+
|
|
150
|
+
# Update cache timestamp
|
|
151
|
+
self._last_modified = current_mtime
|
|
152
|
+
|
|
153
|
+
logger.debug(f"Loaded config from {self._config_path}")
|
|
154
|
+
|
|
155
|
+
except (
|
|
156
|
+
json.JSONDecodeError,
|
|
157
|
+
yaml.YAMLError if YAML_AVAILABLE else Exception,
|
|
158
|
+
OSError,
|
|
159
|
+
UnicodeDecodeError,
|
|
160
|
+
) as e:
|
|
161
|
+
logger.error(f"Failed to load config: {e}")
|
|
162
|
+
self._config = self._get_default_config()
|
|
163
|
+
|
|
164
|
+
def get(self, key: str, default: Any = None) -> Any:
|
|
165
|
+
"""
|
|
166
|
+
Get configuration value with dot-notation support.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
key: Configuration key (supports dot notation, e.g., "hooks.timeout_ms")
|
|
170
|
+
default: Default value if key not found
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Configuration value or default
|
|
174
|
+
|
|
175
|
+
Examples:
|
|
176
|
+
>>> config.get("hooks.timeout_ms", 2000)
|
|
177
|
+
2000
|
|
178
|
+
>>> config.get("project.name")
|
|
179
|
+
"MoAI-ADK"
|
|
180
|
+
"""
|
|
181
|
+
# Reload if file changed
|
|
182
|
+
self._reload_if_modified()
|
|
183
|
+
|
|
184
|
+
# Navigate nested dict with dot notation
|
|
185
|
+
keys = key.split(".")
|
|
186
|
+
value = self._config
|
|
187
|
+
|
|
188
|
+
for k in keys:
|
|
189
|
+
if isinstance(value, dict):
|
|
190
|
+
value = value.get(k)
|
|
191
|
+
if value is None:
|
|
192
|
+
return default
|
|
193
|
+
else:
|
|
194
|
+
return default
|
|
195
|
+
|
|
196
|
+
return value if value is not None else default
|
|
197
|
+
|
|
198
|
+
def set(self, key: str, value: Any) -> None:
|
|
199
|
+
"""
|
|
200
|
+
Set configuration value with dot-notation support.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
key: Configuration key (supports dot notation)
|
|
204
|
+
value: Value to set
|
|
205
|
+
|
|
206
|
+
Examples:
|
|
207
|
+
>>> config.set("hooks.timeout_ms", 3000)
|
|
208
|
+
>>> config.set("project.name", "MyProject")
|
|
209
|
+
"""
|
|
210
|
+
# Navigate to parent dict
|
|
211
|
+
keys = key.split(".")
|
|
212
|
+
target = self._config
|
|
213
|
+
|
|
214
|
+
for k in keys[:-1]:
|
|
215
|
+
if k not in target:
|
|
216
|
+
target[k] = {}
|
|
217
|
+
target = target[k]
|
|
218
|
+
|
|
219
|
+
# Set value
|
|
220
|
+
target[keys[-1]] = value
|
|
221
|
+
|
|
222
|
+
def update(self, updates: Dict[str, Any], deep_merge: bool = True) -> None:
|
|
223
|
+
"""
|
|
224
|
+
Update configuration with dictionary.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
updates: Dictionary of updates
|
|
228
|
+
deep_merge: If True, recursively merge nested dicts (default: True)
|
|
229
|
+
|
|
230
|
+
Examples:
|
|
231
|
+
>>> config.update({"hooks": {"timeout_ms": 3000}})
|
|
232
|
+
>>> config.update({"project.name": "MyProject"}, deep_merge=False)
|
|
233
|
+
"""
|
|
234
|
+
if deep_merge:
|
|
235
|
+
self._config = self._deep_merge(self._config, updates)
|
|
236
|
+
else:
|
|
237
|
+
self._config.update(updates)
|
|
238
|
+
|
|
239
|
+
def save(self, backup: bool = True) -> bool:
|
|
240
|
+
"""
|
|
241
|
+
Save configuration to file with atomic write.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
backup: If True, create backup before saving (default: True)
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
bool: True if save successful, False otherwise
|
|
248
|
+
|
|
249
|
+
Pattern: Temp file → Atomic rename (prevents corruption)
|
|
250
|
+
"""
|
|
251
|
+
try:
|
|
252
|
+
# Create backup if requested
|
|
253
|
+
if backup and self._config_path.exists():
|
|
254
|
+
self._create_backup()
|
|
255
|
+
|
|
256
|
+
# Atomic write pattern: temp file → rename
|
|
257
|
+
temp_path = self._config_path.with_suffix(".tmp")
|
|
258
|
+
|
|
259
|
+
# Write to temp file (auto-detect format)
|
|
260
|
+
with open(temp_path, "w", encoding="utf-8") as f:
|
|
261
|
+
if self._config_path.suffix == ".yaml" or self._config_path.suffix == ".yml":
|
|
262
|
+
if not YAML_AVAILABLE:
|
|
263
|
+
raise ImportError("PyYAML is required for YAML config files. Install with: pip install pyyaml")
|
|
264
|
+
yaml.safe_dump(
|
|
265
|
+
self._config,
|
|
266
|
+
f,
|
|
267
|
+
default_flow_style=False,
|
|
268
|
+
allow_unicode=True,
|
|
269
|
+
sort_keys=False,
|
|
270
|
+
)
|
|
271
|
+
else:
|
|
272
|
+
json.dump(self._config, f, indent=2, ensure_ascii=False)
|
|
273
|
+
|
|
274
|
+
# Atomic rename
|
|
275
|
+
temp_path.replace(self._config_path)
|
|
276
|
+
|
|
277
|
+
# Update cache timestamp
|
|
278
|
+
self._last_modified = self._config_path.stat().st_mtime
|
|
279
|
+
|
|
280
|
+
logger.info(f"Saved config to {self._config_path}")
|
|
281
|
+
return True
|
|
282
|
+
|
|
283
|
+
except (OSError, PermissionError) as e:
|
|
284
|
+
logger.error(f"Failed to save config: {e}")
|
|
285
|
+
return False
|
|
286
|
+
|
|
287
|
+
def _create_backup(self) -> None:
|
|
288
|
+
"""Create timestamped backup of config file."""
|
|
289
|
+
try:
|
|
290
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
291
|
+
backup_dir = self._config_path.parent / "backups"
|
|
292
|
+
backup_dir.mkdir(parents=True, exist_ok=True)
|
|
293
|
+
|
|
294
|
+
backup_path = backup_dir / f"config_backup_{timestamp}.json"
|
|
295
|
+
shutil.copy2(self._config_path, backup_path)
|
|
296
|
+
|
|
297
|
+
logger.debug(f"Created backup: {backup_path}")
|
|
298
|
+
|
|
299
|
+
except (OSError, PermissionError) as e:
|
|
300
|
+
logger.warning(f"Failed to create backup: {e}")
|
|
301
|
+
|
|
302
|
+
def _reload_if_modified(self) -> None:
|
|
303
|
+
"""Reload config if file has been modified."""
|
|
304
|
+
try:
|
|
305
|
+
if self._config_path.exists():
|
|
306
|
+
current_mtime = self._config_path.stat().st_mtime
|
|
307
|
+
if self._last_modified is None or current_mtime != self._last_modified:
|
|
308
|
+
self._load_config()
|
|
309
|
+
except OSError:
|
|
310
|
+
pass
|
|
311
|
+
|
|
312
|
+
@staticmethod
|
|
313
|
+
def _deep_merge(base: Dict[str, Any], updates: Dict[str, Any]) -> Dict[str, Any]:
|
|
314
|
+
"""
|
|
315
|
+
Recursively merge two dictionaries.
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
base: Base dictionary
|
|
319
|
+
updates: Updates to merge
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
Merged dictionary
|
|
323
|
+
"""
|
|
324
|
+
result = base.copy()
|
|
325
|
+
|
|
326
|
+
for key, value in updates.items():
|
|
327
|
+
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
|
328
|
+
result[key] = UnifiedConfigManager._deep_merge(result[key], value)
|
|
329
|
+
else:
|
|
330
|
+
result[key] = value
|
|
331
|
+
|
|
332
|
+
return result
|
|
333
|
+
|
|
334
|
+
@staticmethod
|
|
335
|
+
def _get_default_config() -> Dict[str, Any]:
|
|
336
|
+
"""
|
|
337
|
+
Get default configuration when file doesn't exist.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
Default configuration dictionary
|
|
341
|
+
"""
|
|
342
|
+
return {
|
|
343
|
+
"moai": {"version": "0.28.0", "update_check_frequency": "daily"},
|
|
344
|
+
"project": {"name": "MyProject", "initialized": False},
|
|
345
|
+
"hooks": {"timeout_ms": 2000, "graceful_degradation": True},
|
|
346
|
+
"session": {"suppress_setup_messages": False},
|
|
347
|
+
"language": {"conversation_language": "en", "agent_prompt_language": "en"},
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
def get_all(self) -> Dict[str, Any]:
|
|
351
|
+
"""
|
|
352
|
+
Get entire configuration dictionary.
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
Complete configuration dictionary
|
|
356
|
+
"""
|
|
357
|
+
self._reload_if_modified()
|
|
358
|
+
return self._config.copy()
|
|
359
|
+
|
|
360
|
+
def reset_to_defaults(self) -> None:
|
|
361
|
+
"""Reset configuration to defaults without saving."""
|
|
362
|
+
self._config = self._get_default_config()
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
# Module-level singleton instance
|
|
366
|
+
_unified_config_instance: Optional[UnifiedConfigManager] = None
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def get_unified_config(
|
|
370
|
+
config_path: Optional[Union[str, Path]] = None,
|
|
371
|
+
) -> UnifiedConfigManager:
|
|
372
|
+
"""
|
|
373
|
+
Get or create unified configuration manager instance.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
config_path: Optional path to config file
|
|
377
|
+
|
|
378
|
+
Returns:
|
|
379
|
+
UnifiedConfigManager: Singleton instance
|
|
380
|
+
|
|
381
|
+
Examples:
|
|
382
|
+
>>> config = get_unified_config()
|
|
383
|
+
>>> timeout = config.get("hooks.timeout_ms", 2000)
|
|
384
|
+
"""
|
|
385
|
+
global _unified_config_instance
|
|
386
|
+
|
|
387
|
+
if _unified_config_instance is None:
|
|
388
|
+
_unified_config_instance = UnifiedConfigManager(config_path)
|
|
389
|
+
|
|
390
|
+
return _unified_config_instance
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
# Convenience functions for common operations
|
|
394
|
+
@lru_cache(maxsize=1)
|
|
395
|
+
def get_config_path() -> Path:
|
|
396
|
+
"""Get path to configuration file."""
|
|
397
|
+
return Path.cwd() / ".moai" / "config" / "config.json"
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def get_config_value(key: str, default: Any = None) -> Any:
|
|
401
|
+
"""
|
|
402
|
+
Get configuration value (convenience function).
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
key: Configuration key with dot notation
|
|
406
|
+
default: Default value if key not found
|
|
407
|
+
|
|
408
|
+
Returns:
|
|
409
|
+
Configuration value or default
|
|
410
|
+
"""
|
|
411
|
+
return get_unified_config().get(key, default)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def set_config_value(key: str, value: Any) -> None:
|
|
415
|
+
"""
|
|
416
|
+
Set configuration value (convenience function).
|
|
417
|
+
|
|
418
|
+
Args:
|
|
419
|
+
key: Configuration key with dot notation
|
|
420
|
+
value: Value to set
|
|
421
|
+
"""
|
|
422
|
+
config = get_unified_config()
|
|
423
|
+
config.set(key, value)
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def save_config(backup: bool = True) -> bool:
|
|
427
|
+
"""
|
|
428
|
+
Save configuration (convenience function).
|
|
429
|
+
|
|
430
|
+
Args:
|
|
431
|
+
backup: Create backup before saving
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
bool: True if successful
|
|
435
|
+
"""
|
|
436
|
+
return get_unified_config().save(backup)
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Context Management Module for Commands Layer
|
|
3
|
+
|
|
4
|
+
Provides utilities for:
|
|
5
|
+
1. Path validation and absolute path conversion
|
|
6
|
+
2. Atomic JSON file operations
|
|
7
|
+
3. Phase result persistence and loading
|
|
8
|
+
4. Template variable substitution
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import re
|
|
14
|
+
import tempfile
|
|
15
|
+
from datetime import datetime, timezone
|
|
16
|
+
from typing import Any, Dict, Optional
|
|
17
|
+
|
|
18
|
+
# Constants
|
|
19
|
+
PROJECT_ROOT_SAFETY_MSG = "Path outside project root: {}"
|
|
20
|
+
PARENT_DIR_MISSING_MSG = "Parent directory not found: {}"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _is_path_within_root(abs_path: str, project_root: str) -> bool:
|
|
24
|
+
"""
|
|
25
|
+
Check if absolute path is within project root.
|
|
26
|
+
|
|
27
|
+
Resolves symlinks to prevent escape attacks.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
abs_path: Absolute path to check
|
|
31
|
+
project_root: Project root directory
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
True if path is within root, False otherwise
|
|
35
|
+
"""
|
|
36
|
+
try:
|
|
37
|
+
real_abs_path = os.path.realpath(abs_path)
|
|
38
|
+
real_project_root = os.path.realpath(project_root)
|
|
39
|
+
|
|
40
|
+
return real_abs_path == real_project_root or real_abs_path.startswith(real_project_root + os.sep)
|
|
41
|
+
except OSError:
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def validate_and_convert_path(relative_path: str, project_root: str) -> str:
|
|
46
|
+
"""
|
|
47
|
+
Convert relative path to absolute path and validate it.
|
|
48
|
+
|
|
49
|
+
Ensures path stays within project root and parent directories exist
|
|
50
|
+
for file paths.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
relative_path: Path to validate and convert (relative or absolute)
|
|
54
|
+
project_root: Project root directory for relative path resolution
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Validated absolute path
|
|
58
|
+
|
|
59
|
+
Raises:
|
|
60
|
+
ValueError: If path is outside project root
|
|
61
|
+
FileNotFoundError: If parent directory doesn't exist for file paths
|
|
62
|
+
"""
|
|
63
|
+
# Convert to absolute path
|
|
64
|
+
abs_path = os.path.abspath(os.path.join(project_root, relative_path))
|
|
65
|
+
project_root_abs = os.path.abspath(project_root)
|
|
66
|
+
|
|
67
|
+
# Security check: ensure path stays within project root
|
|
68
|
+
if not _is_path_within_root(abs_path, project_root_abs):
|
|
69
|
+
raise ValueError(PROJECT_ROOT_SAFETY_MSG.format(abs_path))
|
|
70
|
+
|
|
71
|
+
# If it's a directory and exists, return it
|
|
72
|
+
if os.path.isdir(abs_path):
|
|
73
|
+
return abs_path
|
|
74
|
+
|
|
75
|
+
# For files, check if parent directory exists
|
|
76
|
+
parent_dir = os.path.dirname(abs_path)
|
|
77
|
+
if not os.path.exists(parent_dir):
|
|
78
|
+
raise FileNotFoundError(PARENT_DIR_MISSING_MSG.format(parent_dir))
|
|
79
|
+
|
|
80
|
+
return abs_path
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _cleanup_temp_file(temp_fd: Optional[int], temp_path: Optional[str]) -> None:
|
|
84
|
+
"""
|
|
85
|
+
Clean up temporary file handles and paths.
|
|
86
|
+
|
|
87
|
+
Silently ignores errors during cleanup.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
temp_fd: File descriptor to close, or None
|
|
91
|
+
temp_path: Path to file to remove, or None
|
|
92
|
+
"""
|
|
93
|
+
if temp_fd is not None:
|
|
94
|
+
try:
|
|
95
|
+
os.close(temp_fd)
|
|
96
|
+
except OSError:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
if temp_path and os.path.exists(temp_path):
|
|
100
|
+
try:
|
|
101
|
+
os.unlink(temp_path)
|
|
102
|
+
except OSError:
|
|
103
|
+
pass
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def save_phase_result(data: Dict[str, Any], target_path: str) -> None:
|
|
107
|
+
"""
|
|
108
|
+
Atomically save phase result to JSON file.
|
|
109
|
+
|
|
110
|
+
Uses temporary file and atomic rename to ensure data integrity
|
|
111
|
+
even if write fails midway.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
data: Dictionary to save
|
|
115
|
+
target_path: Full path where JSON should be saved
|
|
116
|
+
|
|
117
|
+
Raises:
|
|
118
|
+
IOError: If write or rename fails
|
|
119
|
+
OSError: If directory is not writable
|
|
120
|
+
"""
|
|
121
|
+
target_dir = os.path.dirname(target_path)
|
|
122
|
+
os.makedirs(target_dir, exist_ok=True)
|
|
123
|
+
|
|
124
|
+
# Atomic write using temp file
|
|
125
|
+
temp_fd = None
|
|
126
|
+
temp_path = None
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
# Create temp file in target directory for atomic rename
|
|
130
|
+
temp_fd, temp_path = tempfile.mkstemp(dir=target_dir, prefix=".tmp_phase_", suffix=".json")
|
|
131
|
+
|
|
132
|
+
# Write JSON to temp file
|
|
133
|
+
with os.fdopen(temp_fd, "w", encoding="utf-8") as f:
|
|
134
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
135
|
+
|
|
136
|
+
temp_fd = None # File handle is now closed
|
|
137
|
+
|
|
138
|
+
# Atomic rename
|
|
139
|
+
os.replace(temp_path, target_path)
|
|
140
|
+
|
|
141
|
+
except Exception as e:
|
|
142
|
+
_cleanup_temp_file(temp_fd, temp_path)
|
|
143
|
+
raise IOError(f"Failed to write {target_path}: {e}")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def load_phase_result(source_path: str) -> Dict[str, Any]:
|
|
147
|
+
"""
|
|
148
|
+
Load phase result from JSON file.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
source_path: Full path to JSON file to load
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Dictionary containing phase result
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
FileNotFoundError: If file doesn't exist
|
|
158
|
+
json.JSONDecodeError: If file is not valid JSON
|
|
159
|
+
"""
|
|
160
|
+
if not os.path.exists(source_path):
|
|
161
|
+
raise FileNotFoundError(f"Phase result file not found: {source_path}")
|
|
162
|
+
|
|
163
|
+
with open(source_path, "r", encoding="utf-8") as f:
|
|
164
|
+
data = json.load(f)
|
|
165
|
+
|
|
166
|
+
return data
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def substitute_template_variables(text: str, context: Dict[str, str]) -> str:
|
|
170
|
+
"""
|
|
171
|
+
Replace template variables in text with values from context.
|
|
172
|
+
|
|
173
|
+
Performs safe string substitution of {{VARIABLE}} placeholders.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
text: Text containing {{VARIABLE}} placeholders
|
|
177
|
+
context: Dictionary mapping variable names to values
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Text with variables substituted
|
|
181
|
+
"""
|
|
182
|
+
result = text
|
|
183
|
+
|
|
184
|
+
for key, value in context.items():
|
|
185
|
+
placeholder = f"{{{{{key}}}}}"
|
|
186
|
+
result = result.replace(placeholder, str(value))
|
|
187
|
+
|
|
188
|
+
return result
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
# Regex pattern for detecting unsubstituted template variables
|
|
192
|
+
# Matches {{VARIABLE}}, {{VAR_NAME}}, {{VAR1}}, etc.
|
|
193
|
+
TEMPLATE_VAR_PATTERN = r"\{\{[A-Z_][A-Z0-9_]*\}\}"
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def validate_no_template_vars(text: str) -> None:
|
|
197
|
+
"""
|
|
198
|
+
Validate that text contains no unsubstituted template variables.
|
|
199
|
+
|
|
200
|
+
Raises error if any {{VARIABLE}} patterns are found.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
text: Text to validate
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ValueError: If unsubstituted variables are found
|
|
207
|
+
"""
|
|
208
|
+
matches = re.findall(TEMPLATE_VAR_PATTERN, text)
|
|
209
|
+
|
|
210
|
+
if matches:
|
|
211
|
+
raise ValueError(f"Unsubstituted template variables found: {matches}")
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class ContextManager:
|
|
215
|
+
"""
|
|
216
|
+
Manages context passing and state persistence for Commands layer.
|
|
217
|
+
|
|
218
|
+
Handles saving and loading phase results, managing state directory,
|
|
219
|
+
and providing convenient access to command state.
|
|
220
|
+
"""
|
|
221
|
+
|
|
222
|
+
def __init__(self, project_root: str):
|
|
223
|
+
"""
|
|
224
|
+
Initialize ContextManager.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
project_root: Root directory of the project
|
|
228
|
+
"""
|
|
229
|
+
self.project_root = project_root
|
|
230
|
+
self.state_dir = os.path.join(project_root, ".moai", "memory", "command-state")
|
|
231
|
+
os.makedirs(self.state_dir, exist_ok=True)
|
|
232
|
+
|
|
233
|
+
def save_phase_result(self, data: Dict[str, Any]) -> str:
|
|
234
|
+
"""
|
|
235
|
+
Save phase result with timestamp.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
data: Phase result data
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
Path to saved file
|
|
242
|
+
"""
|
|
243
|
+
# Generate filename with timestamp
|
|
244
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
|
|
245
|
+
phase_name = data.get("phase", "unknown")
|
|
246
|
+
filename = f"{phase_name}-{timestamp}.json"
|
|
247
|
+
target_path = os.path.join(self.state_dir, filename)
|
|
248
|
+
|
|
249
|
+
save_phase_result(data, target_path)
|
|
250
|
+
return target_path
|
|
251
|
+
|
|
252
|
+
def load_latest_phase(self) -> Optional[Dict[str, Any]]:
|
|
253
|
+
"""
|
|
254
|
+
Load the most recent phase result.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
Phase result dictionary or None if no phase files exist
|
|
258
|
+
"""
|
|
259
|
+
# List all phase files
|
|
260
|
+
phase_files = sorted([f for f in os.listdir(self.state_dir) if f.endswith(".json")])
|
|
261
|
+
|
|
262
|
+
if not phase_files:
|
|
263
|
+
return None
|
|
264
|
+
|
|
265
|
+
# Load the latest (last in sorted order)
|
|
266
|
+
latest_file = phase_files[-1]
|
|
267
|
+
latest_path = os.path.join(self.state_dir, latest_file)
|
|
268
|
+
|
|
269
|
+
return load_phase_result(latest_path)
|
|
270
|
+
|
|
271
|
+
def get_state_dir(self) -> str:
|
|
272
|
+
"""Get the command state directory path."""
|
|
273
|
+
return self.state_dir
|