moai-adk 0.35.1__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 +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- 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 +1 -0
- 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 +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- 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 +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- 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 +605 -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 +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- 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 +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- 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 +714 -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-plugin.md +637 -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 +513 -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 +1060 -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 +1386 -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/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -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 +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -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 +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- 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/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 +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- 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 +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- 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 +291 -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-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -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 +1434 -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 +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -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 +24 -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 +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- 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.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,901 @@
|
|
|
1
|
+
"""PostToolUse Hook for Automated SPEC Completion System."""
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
import time
|
|
8
|
+
from typing import Any, Dict, List
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# SpecGenerator: Placeholder for spec generation functionality
|
|
12
|
+
class SpecGenerator:
|
|
13
|
+
"""Placeholder SpecGenerator class for auto-spec completion."""
|
|
14
|
+
|
|
15
|
+
def __init__(self):
|
|
16
|
+
self.name = "SpecGenerator"
|
|
17
|
+
|
|
18
|
+
def generate_spec(self, file_path: str, content: str) -> str:
|
|
19
|
+
"""Generate a basic SPEC document."""
|
|
20
|
+
return f"SPEC document for {file_path}\n\nContent analysis:\n{content[:200]}..."
|
|
21
|
+
|
|
22
|
+
def analyze(self, file_path: str) -> Dict[str, Any]:
|
|
23
|
+
"""Analyze code file for SPEC generation."""
|
|
24
|
+
return {
|
|
25
|
+
"file_path": file_path,
|
|
26
|
+
"structure_info": {},
|
|
27
|
+
"domain_keywords": [],
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# BaseHook: Simplified base hook class for auto-spec completion
|
|
32
|
+
class BaseHook:
|
|
33
|
+
"""Base hook class for auto-spec completion."""
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
self.name = "PostToolAutoSpecCompletion"
|
|
37
|
+
self.description = "PostToolUse Hook for Automated SPEC Completion System"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Configure logging
|
|
41
|
+
logger = logging.getLogger(__name__)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class PostToolAutoSpecCompletion(BaseHook):
|
|
45
|
+
"""
|
|
46
|
+
PostToolUse Hook for automated SPEC completion.
|
|
47
|
+
|
|
48
|
+
This hook detects code file changes after Write/Edit/MultiEdit tools
|
|
49
|
+
and automatically generates complete SPEC documents in EARS format.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self):
|
|
53
|
+
super().__init__()
|
|
54
|
+
self.spec_generator = SpecGenerator()
|
|
55
|
+
self.auto_config = self._get_auto_spec_config()
|
|
56
|
+
|
|
57
|
+
# Track processed files to avoid duplicates
|
|
58
|
+
self.processed_files = set()
|
|
59
|
+
|
|
60
|
+
def _get_auto_spec_config(self) -> Dict[str, Any]:
|
|
61
|
+
"""Get auto-spec completion configuration."""
|
|
62
|
+
try:
|
|
63
|
+
from moai_adk.core.config.config_manager import ConfigManager
|
|
64
|
+
|
|
65
|
+
config = ConfigManager()
|
|
66
|
+
return config.get_value(
|
|
67
|
+
"auto_spec_completion",
|
|
68
|
+
{
|
|
69
|
+
"enabled": True,
|
|
70
|
+
"min_confidence": 0.7,
|
|
71
|
+
"auto_open_editor": True,
|
|
72
|
+
"supported_languages": ["python", "javascript", "typescript", "go"],
|
|
73
|
+
"excluded_patterns": ["test_", "spec_", "__tests__"],
|
|
74
|
+
},
|
|
75
|
+
)
|
|
76
|
+
except ImportError:
|
|
77
|
+
return {
|
|
78
|
+
"enabled": True,
|
|
79
|
+
"min_confidence": 0.7,
|
|
80
|
+
"auto_open_editor": True,
|
|
81
|
+
"supported_languages": ["python", "javascript", "typescript", "go"],
|
|
82
|
+
"excluded_patterns": ["test_", "spec_", "__tests__"],
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
def should_trigger_spec_completion(self, tool_name: str, tool_args: Dict[str, Any]) -> bool:
|
|
86
|
+
"""
|
|
87
|
+
Determine if spec completion should be triggered.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
tool_name: Name of the tool that was executed
|
|
91
|
+
tool_args: Arguments passed to the tool
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
True if spec completion should be triggered
|
|
95
|
+
"""
|
|
96
|
+
# Check if auto-spec completion is enabled
|
|
97
|
+
if not self.auto_config.get("enabled", True):
|
|
98
|
+
logger.debug("Auto-spec completion is disabled")
|
|
99
|
+
return False
|
|
100
|
+
|
|
101
|
+
# Only trigger for Write/Edit/MultiEdit tools
|
|
102
|
+
if tool_name not in ["Write", "Edit", "MultiEdit"]:
|
|
103
|
+
logger.debug(f"Tool {tool_name} does not trigger spec completion")
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
# Extract file paths from tool arguments
|
|
107
|
+
file_paths = self._extract_file_paths(tool_args)
|
|
108
|
+
|
|
109
|
+
if not file_paths:
|
|
110
|
+
logger.debug("No file paths found in tool arguments")
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
# Check if any file is a supported language
|
|
114
|
+
supported_files = []
|
|
115
|
+
for file_path in file_paths:
|
|
116
|
+
if self._is_supported_file(file_path):
|
|
117
|
+
supported_files.append(file_path)
|
|
118
|
+
else:
|
|
119
|
+
logger.debug(f"File {file_path} is not supported for auto-spec completion")
|
|
120
|
+
|
|
121
|
+
if not supported_files:
|
|
122
|
+
logger.debug("No supported files found")
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
# Check for excluded patterns
|
|
126
|
+
excluded_files = []
|
|
127
|
+
for file_path in supported_files:
|
|
128
|
+
if self._is_excluded_file(file_path):
|
|
129
|
+
excluded_files.append(file_path)
|
|
130
|
+
|
|
131
|
+
# Filter out excluded files
|
|
132
|
+
target_files = [f for f in supported_files if f not in excluded_files]
|
|
133
|
+
|
|
134
|
+
if not target_files:
|
|
135
|
+
logger.debug("All files are excluded from auto-spec completion")
|
|
136
|
+
return False
|
|
137
|
+
|
|
138
|
+
return True
|
|
139
|
+
|
|
140
|
+
def _extract_file_paths(self, tool_args: Dict[str, Any]) -> List[str]:
|
|
141
|
+
"""Extract file paths from tool arguments."""
|
|
142
|
+
file_paths = []
|
|
143
|
+
|
|
144
|
+
# Handle Write tool
|
|
145
|
+
if "file_path" in tool_args:
|
|
146
|
+
file_paths.append(tool_args["file_path"])
|
|
147
|
+
|
|
148
|
+
# Handle Edit tool
|
|
149
|
+
if "file_path" in tool_args:
|
|
150
|
+
file_paths.append(tool_args["file_path"])
|
|
151
|
+
|
|
152
|
+
# Handle MultiEdit tool
|
|
153
|
+
if "edits" in tool_args:
|
|
154
|
+
for edit in tool_args["edits"]:
|
|
155
|
+
if "file_path" in edit:
|
|
156
|
+
file_paths.append(edit["file_path"])
|
|
157
|
+
|
|
158
|
+
# Remove duplicates and resolve relative paths
|
|
159
|
+
unique_paths = []
|
|
160
|
+
for path in file_paths:
|
|
161
|
+
if path not in unique_paths:
|
|
162
|
+
abs_path = os.path.abspath(path)
|
|
163
|
+
unique_paths.append(abs_path)
|
|
164
|
+
|
|
165
|
+
return unique_paths
|
|
166
|
+
|
|
167
|
+
def _is_supported_file(self, file_path: str) -> bool:
|
|
168
|
+
"""Check if file is supported for auto-spec completion."""
|
|
169
|
+
# Get file extension
|
|
170
|
+
file_ext = os.path.splitext(file_path)[1].lower()
|
|
171
|
+
|
|
172
|
+
# Map extensions to languages
|
|
173
|
+
supported_extensions = {
|
|
174
|
+
".py": "python",
|
|
175
|
+
".js": "javascript",
|
|
176
|
+
".jsx": "javascript",
|
|
177
|
+
".ts": "typescript",
|
|
178
|
+
".tsx": "typescript",
|
|
179
|
+
".go": "go",
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if file_ext not in supported_extensions:
|
|
183
|
+
return False
|
|
184
|
+
|
|
185
|
+
# Check if language is supported
|
|
186
|
+
language = supported_extensions[file_ext]
|
|
187
|
+
supported_languages = self.auto_config.get("supported_languages", [])
|
|
188
|
+
return language in supported_languages
|
|
189
|
+
|
|
190
|
+
def _is_excluded_file(self, file_path: str) -> bool:
|
|
191
|
+
"""Check if file should be excluded from auto-spec completion."""
|
|
192
|
+
file_name = os.path.basename(file_path)
|
|
193
|
+
file_dir = os.path.basename(os.path.dirname(file_path))
|
|
194
|
+
|
|
195
|
+
excluded_patterns = self.auto_config.get("excluded_patterns", [])
|
|
196
|
+
|
|
197
|
+
for pattern in excluded_patterns:
|
|
198
|
+
# Check filename patterns
|
|
199
|
+
if re.search(pattern, file_name):
|
|
200
|
+
return True
|
|
201
|
+
# Check directory patterns
|
|
202
|
+
if re.search(pattern, file_dir):
|
|
203
|
+
return True
|
|
204
|
+
|
|
205
|
+
return False
|
|
206
|
+
|
|
207
|
+
def detect_code_changes(self, tool_name: str, tool_args: Dict[str, Any], result: Any) -> List[str]:
|
|
208
|
+
"""
|
|
209
|
+
Detect code changes from tool execution.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
tool_name: Name of the tool that was executed
|
|
213
|
+
tool_args: Arguments passed to the tool
|
|
214
|
+
result: Result from tool execution
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
List of affected file paths
|
|
218
|
+
"""
|
|
219
|
+
file_paths = []
|
|
220
|
+
|
|
221
|
+
# Write tool creates new files
|
|
222
|
+
if tool_name == "Write":
|
|
223
|
+
if "file_path" in tool_args:
|
|
224
|
+
file_paths.append(tool_args["file_path"])
|
|
225
|
+
|
|
226
|
+
# Edit tool modifies existing files
|
|
227
|
+
elif tool_name == "Edit":
|
|
228
|
+
if "file_path" in tool_args:
|
|
229
|
+
file_paths.append(tool_args["file_path"])
|
|
230
|
+
|
|
231
|
+
# MultiEdit tool can modify multiple files
|
|
232
|
+
elif tool_name == "MultiEdit":
|
|
233
|
+
if "edits" in tool_args:
|
|
234
|
+
for edit in tool_args["edits"]:
|
|
235
|
+
if "file_path" in edit:
|
|
236
|
+
file_paths.append(edit["file_path"])
|
|
237
|
+
|
|
238
|
+
# Convert to absolute paths
|
|
239
|
+
abs_paths = [os.path.abspath(path) for path in file_paths]
|
|
240
|
+
|
|
241
|
+
# Filter out already processed files
|
|
242
|
+
new_paths = [path for path in abs_paths if path not in self.processed_files]
|
|
243
|
+
|
|
244
|
+
# Add to processed files
|
|
245
|
+
self.processed_files.update(new_paths)
|
|
246
|
+
|
|
247
|
+
return new_paths
|
|
248
|
+
|
|
249
|
+
def calculate_completion_confidence(self, analysis: Dict[str, Any]) -> float:
|
|
250
|
+
"""
|
|
251
|
+
Calculate confidence score for SPEC completion.
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
analysis: Code analysis result
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
Confidence score between 0.0 and 1.0
|
|
258
|
+
"""
|
|
259
|
+
# Default confidence if analysis is incomplete
|
|
260
|
+
if not analysis:
|
|
261
|
+
return 0.5
|
|
262
|
+
|
|
263
|
+
structure_score = analysis.get("structure_score", 0.5)
|
|
264
|
+
domain_accuracy = analysis.get("domain_accuracy", 0.5)
|
|
265
|
+
documentation_level = analysis.get("documentation_level", 0.5)
|
|
266
|
+
|
|
267
|
+
# Weighted calculation
|
|
268
|
+
# Structure clarity: 30%
|
|
269
|
+
# Domain accuracy: 40%
|
|
270
|
+
# Documentation level: 30%
|
|
271
|
+
confidence = structure_score * 0.3 + domain_accuracy * 0.4 + documentation_level * 0.3
|
|
272
|
+
|
|
273
|
+
return min(max(confidence, 0.0), 1.0)
|
|
274
|
+
|
|
275
|
+
def generate_complete_spec(self, analysis: Dict[str, Any], file_path: str) -> Dict[str, str]:
|
|
276
|
+
"""
|
|
277
|
+
Generate complete SPEC documents in EARS format.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
analysis: Code analysis result
|
|
281
|
+
file_path: Path to the analyzed file
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
Dictionary containing spec.md, plan.md, and acceptance.md
|
|
285
|
+
"""
|
|
286
|
+
spec_id = self._generate_spec_id(file_path)
|
|
287
|
+
file_name = os.path.basename(file_path)
|
|
288
|
+
|
|
289
|
+
# Generate basic spec content
|
|
290
|
+
spec_md = self._generate_spec_content(analysis, spec_id, file_name)
|
|
291
|
+
plan_md = self._generate_plan_content(analysis, spec_id, file_name)
|
|
292
|
+
acceptance_md = self._generate_acceptance_content(analysis, spec_id, file_name)
|
|
293
|
+
|
|
294
|
+
return {
|
|
295
|
+
"spec_id": spec_id,
|
|
296
|
+
"spec_md": spec_md,
|
|
297
|
+
"plan_md": plan_md,
|
|
298
|
+
"acceptance_md": acceptance_md,
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
def _generate_spec_id(self, file_path: str) -> str:
|
|
302
|
+
"""Generate unique SPEC ID from file path."""
|
|
303
|
+
# Extract meaningful name from file path
|
|
304
|
+
file_name = os.path.basename(file_path)
|
|
305
|
+
name_parts = file_name.split("_")
|
|
306
|
+
|
|
307
|
+
# Convert to uppercase and join
|
|
308
|
+
meaningful_name = "".join(part.upper() for part in name_parts if part)
|
|
309
|
+
|
|
310
|
+
# Add hash to ensure uniqueness
|
|
311
|
+
file_hash = hashlib.md5(file_path.encode(), usedforsecurity=False).hexdigest()[:4]
|
|
312
|
+
|
|
313
|
+
return f"{meaningful_name}-{file_hash}"
|
|
314
|
+
|
|
315
|
+
def _generate_spec_content(self, analysis: Dict[str, Any], spec_id: str, file_name: str) -> str:
|
|
316
|
+
"""Generate main spec.md content."""
|
|
317
|
+
template = f"""---
|
|
318
|
+
"id": "SPEC-{spec_id}",
|
|
319
|
+
"title": "Auto-generated SPEC for {file_name}",
|
|
320
|
+
"title_en": "Auto-generated SPEC for {file_name}",
|
|
321
|
+
"version": "1.0.0",
|
|
322
|
+
"status": "pending",
|
|
323
|
+
"created": "{time.strftime("%Y-%m-%d")}",
|
|
324
|
+
"author": "@alfred-auto",
|
|
325
|
+
"reviewer": "",
|
|
326
|
+
"category": "FEATURE",
|
|
327
|
+
"priority": "MEDIUM",
|
|
328
|
+
"tags": ["auto-generated", "{spec_id}"],
|
|
329
|
+
"language": "en",
|
|
330
|
+
"estimated_complexity": "auto"
|
|
331
|
+
}}
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Auto-generated SPEC for {file_name}
|
|
335
|
+
|
|
336
|
+
### Overview
|
|
337
|
+
|
|
338
|
+
{analysis.get("description", "This spec was auto-generated based on code analysis.")}
|
|
339
|
+
|
|
340
|
+
### Environment
|
|
341
|
+
|
|
342
|
+
- **Project**: MoAI-ADK Auto-generated SPEC
|
|
343
|
+
- **Language**: {analysis.get("language", "Python")}
|
|
344
|
+
- **File**: {file_name}
|
|
345
|
+
- **Generation Method**: Automatic analysis-based
|
|
346
|
+
- **Status**: Review required
|
|
347
|
+
|
|
348
|
+
### Assumptions
|
|
349
|
+
|
|
350
|
+
1. Code structure is clearly defined
|
|
351
|
+
2. Domain-specific terminology is expected to be used
|
|
352
|
+
3. Standard development practices are assumed to be followed
|
|
353
|
+
4. Generated SPEC will be finalized after user review
|
|
354
|
+
|
|
355
|
+
### Requirements
|
|
356
|
+
|
|
357
|
+
#### Ubiquitous Requirements
|
|
358
|
+
|
|
359
|
+
- **REQ-001**: System must perform the functionality of {file_name}
|
|
360
|
+
- **REQ-002**: Generated functionality must be stable
|
|
361
|
+
- **REQ-003**: Code must be written in a maintainable form
|
|
362
|
+
- **REQ-004**: Tests must satisfy functional requirements
|
|
363
|
+
- **REQ-005**: Code must comply with project coding standards
|
|
364
|
+
|
|
365
|
+
#### State-driven Requirements
|
|
366
|
+
|
|
367
|
+
{analysis.get("state_requirements", "- **REQ-006**: System must transition from initial state to target state")}
|
|
368
|
+
|
|
369
|
+
#### Event-driven Requirements
|
|
370
|
+
|
|
371
|
+
{analysis.get("event_requirements", "- **REQ-007**: System must respond when user input occurs")}
|
|
372
|
+
|
|
373
|
+
### Specifications
|
|
374
|
+
|
|
375
|
+
{analysis.get("specifications", "- **SPEC-001**: System must implement requirements")}
|
|
376
|
+
|
|
377
|
+
### Traceability
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
### Edit Guide
|
|
381
|
+
|
|
382
|
+
**User Review Recommendations:**
|
|
383
|
+
1. ✅ Verify technical clarity
|
|
384
|
+
2. ✅ Specify requirements
|
|
385
|
+
3. ✅ Review domain-specific terminology
|
|
386
|
+
4. ✅ Define state and event requirements
|
|
387
|
+
5. ✅ Detail specifications
|
|
388
|
+
|
|
389
|
+
**Quality Improvement Suggestions:**
|
|
390
|
+
- Add domain-specific terminology
|
|
391
|
+
- Specify user cases
|
|
392
|
+
- Define performance requirements
|
|
393
|
+
- Add security requirements
|
|
394
|
+
"""
|
|
395
|
+
return template
|
|
396
|
+
|
|
397
|
+
def _generate_plan_content(self, analysis: Dict[str, Any], spec_id: str, file_name: str) -> str:
|
|
398
|
+
"""Generate plan.md content."""
|
|
399
|
+
return f"""---
|
|
400
|
+
"id": "PLAN-{spec_id}",
|
|
401
|
+
"spec_id": "SPEC-{spec_id}",
|
|
402
|
+
"title": "Auto-generated Implementation Plan for {file_name}",
|
|
403
|
+
"version": "1.0.0",
|
|
404
|
+
"status": "pending",
|
|
405
|
+
"created": "{time.strftime("%Y-%m-%d")}",
|
|
406
|
+
"author": "@alfred-auto"
|
|
407
|
+
}}
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Auto-generated Implementation Plan for {file_name}
|
|
411
|
+
|
|
412
|
+
### Implementation Phases
|
|
413
|
+
|
|
414
|
+
#### Phase 1: Basic Structure Review (Priority: High)
|
|
415
|
+
|
|
416
|
+
- [ ] Complete code structure analysis
|
|
417
|
+
- [ ] Identify core functionality
|
|
418
|
+
- [ ] Verify dependencies
|
|
419
|
+
- [ ] Set up test environment
|
|
420
|
+
|
|
421
|
+
#### Phase 2: Requirements Specification (Priority: Medium)
|
|
422
|
+
|
|
423
|
+
- [ ] Specify ubiquitous requirements
|
|
424
|
+
- [ ] Define state-driven requirements
|
|
425
|
+
- [ ] Review event-driven requirements
|
|
426
|
+
- [ ] Set performance requirements
|
|
427
|
+
|
|
428
|
+
#### Phase 3: Implementation Planning (Priority: Medium)
|
|
429
|
+
|
|
430
|
+
- [ ] Design module architecture
|
|
431
|
+
- [ ] Define interfaces
|
|
432
|
+
- [ ] Design data structures
|
|
433
|
+
- [ ] Plan error handling
|
|
434
|
+
|
|
435
|
+
#### Phase 4: Test Strategy Development (Priority: High)
|
|
436
|
+
|
|
437
|
+
- [ ] Plan unit tests
|
|
438
|
+
- [ ] Plan integration tests
|
|
439
|
+
- [ ] User story-based testing
|
|
440
|
+
- [ ] Implement test automation
|
|
441
|
+
|
|
442
|
+
### Technical Approach
|
|
443
|
+
|
|
444
|
+
#### Architecture Design
|
|
445
|
+
|
|
446
|
+
```
|
|
447
|
+
{analysis.get("architecture", "User Input → Validation → Business Logic → Data Processing → Output")}
|
|
448
|
+
↓
|
|
449
|
+
[Core Components] → [External Services] → [Data Layer]
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
#### Core Components
|
|
453
|
+
|
|
454
|
+
1. **{analysis.get("main_component", "Main Class")}**: Handle primary business logic
|
|
455
|
+
2. **{analysis.get("service_component", "Service Layer")}**: Integrate external services
|
|
456
|
+
3. **{analysis.get("data_component", "Data Layer")}**: Process and store data
|
|
457
|
+
4. **{analysis.get("component_4", "Validation Layer")}**: Validate input and check validity
|
|
458
|
+
|
|
459
|
+
#### Dependency Management
|
|
460
|
+
|
|
461
|
+
**Utilize Existing Modules:**
|
|
462
|
+
- {analysis.get("existing_modules", "Utilize standard libraries")}
|
|
463
|
+
|
|
464
|
+
**Add New Modules:**
|
|
465
|
+
- {analysis.get("new_modules", "Add as needed")}
|
|
466
|
+
|
|
467
|
+
### Success Criteria
|
|
468
|
+
|
|
469
|
+
#### Functional Criteria
|
|
470
|
+
|
|
471
|
+
- ✅ All requirements implemented
|
|
472
|
+
- ✅ Test coverage 85% or higher
|
|
473
|
+
- ✅ Performance targets met
|
|
474
|
+
- ✅ User requirements satisfied
|
|
475
|
+
|
|
476
|
+
#### Performance Criteria
|
|
477
|
+
|
|
478
|
+
- ✅ Response time {analysis.get("performance_target", "within 1 second")}
|
|
479
|
+
- ✅ Memory usage optimized
|
|
480
|
+
- ✅ Parallel processing supported
|
|
481
|
+
- ✅ Scalability verified
|
|
482
|
+
|
|
483
|
+
#### Quality Criteria
|
|
484
|
+
|
|
485
|
+
- ✅ Code quality verification passed
|
|
486
|
+
- ✅ Security scanning passed
|
|
487
|
+
- ✅ Documentation completeness verified
|
|
488
|
+
- ✅ Maintainability validated
|
|
489
|
+
|
|
490
|
+
### Next Steps
|
|
491
|
+
|
|
492
|
+
1. **Immediate**: Basic structure review (1-2 days)
|
|
493
|
+
2. **Weekly Goal**: Requirements specification (3-5 days)
|
|
494
|
+
3. **2-Week Goal**: Implementation completion (7-14 days)
|
|
495
|
+
4. **Release Preparation**: Testing and validation (14-16 days)
|
|
496
|
+
"""
|
|
497
|
+
|
|
498
|
+
def _generate_acceptance_content(self, analysis: Dict[str, Any], spec_id: str, file_name: str) -> str:
|
|
499
|
+
"""Generate acceptance.md content."""
|
|
500
|
+
return f"""---
|
|
501
|
+
"id": "ACCEPT-{spec_id}",
|
|
502
|
+
"spec_id": "SPEC-{spec_id}",
|
|
503
|
+
"title": "Auto-generated Acceptance Criteria for {file_name}",
|
|
504
|
+
"version": "1.0.0",
|
|
505
|
+
"status": "pending",
|
|
506
|
+
"created": "{time.strftime("%Y-%m-%d")}",
|
|
507
|
+
"author": "@alfred-auto"
|
|
508
|
+
}}
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## Auto-generated Acceptance Criteria for {file_name}
|
|
512
|
+
|
|
513
|
+
### Acceptance Criteria
|
|
514
|
+
|
|
515
|
+
#### Basic Functionality
|
|
516
|
+
|
|
517
|
+
**Must-have:**
|
|
518
|
+
- [ ] {analysis.get("must_have_1", "System must operate normally")}
|
|
519
|
+
- [ ] {analysis.get("must_have_2", "User interface must display correctly")}
|
|
520
|
+
- [ ] {analysis.get("must_have_3", "Data processing logic must function properly")}
|
|
521
|
+
|
|
522
|
+
**Should-have:**
|
|
523
|
+
- [ ] {analysis.get("should_have_1", "User experience must be smooth")}
|
|
524
|
+
- [ ] {analysis.get("should_have_2", "Performance targets must be met")}
|
|
525
|
+
|
|
526
|
+
#### Performance Testing
|
|
527
|
+
|
|
528
|
+
**Performance Requirements:**
|
|
529
|
+
- [ ] Response time: {analysis.get("response_time", "within 1 second")}
|
|
530
|
+
- [ ] Concurrent users: support {analysis.get("concurrent_users", "100 users")} or more
|
|
531
|
+
- [ ] Memory usage: {analysis.get("memory_usage", "100MB or less")}
|
|
532
|
+
- [ ] CPU utilization: {analysis.get("cpu_usage", "50% or less")}
|
|
533
|
+
|
|
534
|
+
**Load Testing:**
|
|
535
|
+
- [ ] Functional load testing passed
|
|
536
|
+
- [ ] Long-term stability testing passed
|
|
537
|
+
- [ ] Recovery testing passed
|
|
538
|
+
|
|
539
|
+
#### Security Testing
|
|
540
|
+
|
|
541
|
+
**Security Requirements:**
|
|
542
|
+
- [ ] {analysis.get("security_req_1", "Authentication and authorization verification passed")}
|
|
543
|
+
- [ ] {analysis.get("security_req_2", "Input validation passed")}
|
|
544
|
+
- [ ] {analysis.get("security_req_3", "SQL injection protection passed")}
|
|
545
|
+
|
|
546
|
+
**Vulnerability Testing:**
|
|
547
|
+
- [ ] OWASP Top 10 inspection passed
|
|
548
|
+
- [ ] Security scanning passed
|
|
549
|
+
- [ ] Permission settings verification passed
|
|
550
|
+
|
|
551
|
+
#### Compatibility Testing
|
|
552
|
+
|
|
553
|
+
**Browser Compatibility:**
|
|
554
|
+
- [ ] Chrome latest version
|
|
555
|
+
- [ ] Firefox latest version
|
|
556
|
+
- [ ] Safari latest version
|
|
557
|
+
- [ ] Edge latest version
|
|
558
|
+
|
|
559
|
+
**Device Compatibility:**
|
|
560
|
+
- [ ] Desktop (1920x1080)
|
|
561
|
+
- [ ] Tablet (768x1024)
|
|
562
|
+
- [ ] Mobile (375x667)
|
|
563
|
+
|
|
564
|
+
#### User Acceptance Testing
|
|
565
|
+
|
|
566
|
+
**User Scenarios:**
|
|
567
|
+
- [ ] {analysis.get("user_scenario_1", "General user scenario testing passed")}
|
|
568
|
+
- [ ] {analysis.get("user_scenario_2", "Administrator scenario testing passed")}
|
|
569
|
+
- [ ] {analysis.get("user_scenario_3", "Error handling scenario testing passed")}
|
|
570
|
+
|
|
571
|
+
**User Feedback:**
|
|
572
|
+
- [ ] User satisfaction 80% or higher
|
|
573
|
+
- [ ] Feature usability evaluation
|
|
574
|
+
- [ ] Design and UI/UX verification
|
|
575
|
+
|
|
576
|
+
### Validation Process
|
|
577
|
+
|
|
578
|
+
#### Phase 1: Unit Tests
|
|
579
|
+
|
|
580
|
+
- [ ] Developer testing completed
|
|
581
|
+
- [ ] Code review passed
|
|
582
|
+
- [ ] Automated testing passed
|
|
583
|
+
- [ ] Code coverage 85% or higher
|
|
584
|
+
|
|
585
|
+
#### Phase 2: Integration Tests
|
|
586
|
+
|
|
587
|
+
- [ ] Inter-module integration testing
|
|
588
|
+
- [ ] API integration testing
|
|
589
|
+
- [ ] Database integration testing
|
|
590
|
+
- [ ] External service integration testing
|
|
591
|
+
|
|
592
|
+
#### Phase 3: System Tests
|
|
593
|
+
|
|
594
|
+
- [ ] Full system functionality testing
|
|
595
|
+
- [ ] Performance testing
|
|
596
|
+
- [ ] Security testing
|
|
597
|
+
- [ ] Stability testing
|
|
598
|
+
|
|
599
|
+
#### Phase 4: User Tests
|
|
600
|
+
|
|
601
|
+
- [ ] Internal user testing
|
|
602
|
+
- [ ] Actual user testing
|
|
603
|
+
- [ ] Feedback collection and incorporation
|
|
604
|
+
- [ ] Final acceptance approval
|
|
605
|
+
|
|
606
|
+
### Validation Templates
|
|
607
|
+
|
|
608
|
+
#### Functionality Validation Template
|
|
609
|
+
|
|
610
|
+
| Function ID | Function Name | Expected Result | Actual Result | Status | Notes |
|
|
611
|
+
|-------------|---------------|-----------------|---------------|--------|-------|
|
|
612
|
+
| FUNC-001 | Function 1 | Success | Testing | In Progress | Description |
|
|
613
|
+
| FUNC-002 | Function 2 | Success | Success | Passed | Description |
|
|
614
|
+
| FUNC-003 | Function 3 | Success | Failed | Failed | Description |
|
|
615
|
+
|
|
616
|
+
#### Performance Validation Template
|
|
617
|
+
|
|
618
|
+
| Test Item | Target | Measured | Status | Notes |
|
|
619
|
+
|-----------|--------|----------|--------|-------|
|
|
620
|
+
| Response time | 1s | 0.8s | Passed | Description |
|
|
621
|
+
| Memory usage | 100MB | 85MB | Passed | Description |
|
|
622
|
+
| CPU utilization | 50% | 45% | Passed | Description |
|
|
623
|
+
|
|
624
|
+
### Completion Criteria
|
|
625
|
+
|
|
626
|
+
#### Pass Criteria
|
|
627
|
+
|
|
628
|
+
- ✅ All required functionality validation passed
|
|
629
|
+
- ✅ Performance requirements met
|
|
630
|
+
- ✅ Security testing passed
|
|
631
|
+
- ✅ User acceptance passed
|
|
632
|
+
- ✅ Documentation validation completed
|
|
633
|
+
|
|
634
|
+
#### Reporting
|
|
635
|
+
|
|
636
|
+
- [ ] Validation report created
|
|
637
|
+
- [ ] Identified issues documented
|
|
638
|
+
- [ ] Improvements defined
|
|
639
|
+
- [ ] Acceptance approval document prepared
|
|
640
|
+
|
|
641
|
+
**Validation Team:**
|
|
642
|
+
- Developer: @developer
|
|
643
|
+
- QA: @qa_engineer
|
|
644
|
+
- Product Owner: @product_owner
|
|
645
|
+
- Final Approver: @stakeholder
|
|
646
|
+
"""
|
|
647
|
+
|
|
648
|
+
def validate_generated_spec(self, spec_content: Dict[str, str]) -> Dict[str, Any]:
|
|
649
|
+
"""
|
|
650
|
+
Validate quality of generated spec.
|
|
651
|
+
|
|
652
|
+
Args:
|
|
653
|
+
spec_content: Dictionary with spec.md, plan.md, acceptance_md
|
|
654
|
+
|
|
655
|
+
Returns:
|
|
656
|
+
Validation result with quality metrics
|
|
657
|
+
"""
|
|
658
|
+
quality_score = 0.0
|
|
659
|
+
suggestions = []
|
|
660
|
+
|
|
661
|
+
# Check EARS format compliance
|
|
662
|
+
ears_compliance = self._check_ears_compliance(spec_content)
|
|
663
|
+
quality_score += ears_compliance * 0.4
|
|
664
|
+
|
|
665
|
+
# Check completeness
|
|
666
|
+
completeness = self._check_completeness(spec_content)
|
|
667
|
+
quality_score += completeness * 0.3
|
|
668
|
+
|
|
669
|
+
# Check content quality
|
|
670
|
+
content_quality = self._check_content_quality(spec_content)
|
|
671
|
+
quality_score += content_quality * 0.3
|
|
672
|
+
|
|
673
|
+
# Generate suggestions
|
|
674
|
+
if ears_compliance < 0.9:
|
|
675
|
+
suggestions.append("Improvement needed to fully comply with EARS format.")
|
|
676
|
+
|
|
677
|
+
if completeness < 0.8:
|
|
678
|
+
suggestions.append("Requirements and specifications need to be more detailed.")
|
|
679
|
+
|
|
680
|
+
if content_quality < 0.7:
|
|
681
|
+
suggestions.append("Domain-specific terminology and technical content need to be added.")
|
|
682
|
+
|
|
683
|
+
return {
|
|
684
|
+
"quality_score": min(max(quality_score, 0.0), 1.0),
|
|
685
|
+
"ears_compliance": ears_compliance,
|
|
686
|
+
"completeness": completeness,
|
|
687
|
+
"content_quality": content_quality,
|
|
688
|
+
"suggestions": suggestions,
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
def _check_ears_compliance(self, spec_content: Dict[str, str]) -> float:
|
|
692
|
+
"""Check EARS format compliance."""
|
|
693
|
+
spec_md = spec_content.get("spec_md", "")
|
|
694
|
+
|
|
695
|
+
required_sections = [
|
|
696
|
+
"Overview",
|
|
697
|
+
"Environment",
|
|
698
|
+
"Assumptions",
|
|
699
|
+
"Requirements",
|
|
700
|
+
"Specifications",
|
|
701
|
+
]
|
|
702
|
+
|
|
703
|
+
found_sections = 0
|
|
704
|
+
for section in required_sections:
|
|
705
|
+
if section in spec_md:
|
|
706
|
+
found_sections += 1
|
|
707
|
+
|
|
708
|
+
return found_sections / len(required_sections)
|
|
709
|
+
|
|
710
|
+
def _check_completeness(self, spec_content: Dict[str, str]) -> float:
|
|
711
|
+
"""Check content completeness."""
|
|
712
|
+
spec_md = spec_content.get("spec_md", "")
|
|
713
|
+
plan_md = spec_content.get("plan_md", "")
|
|
714
|
+
acceptance_md = spec_content.get("acceptance_md", "")
|
|
715
|
+
|
|
716
|
+
# Check minimum content length
|
|
717
|
+
total_length = len(spec_md) + len(plan_md) + len(acceptance_md)
|
|
718
|
+
length_score = min(total_length / 2000, 1.0) # 2000 chars as baseline
|
|
719
|
+
|
|
720
|
+
# Check for content diversity
|
|
721
|
+
has_requirements = "Requirements" in spec_md
|
|
722
|
+
has_planning = "Implementation Plan" in plan_md
|
|
723
|
+
has_acceptance = "Acceptance" in acceptance_md
|
|
724
|
+
|
|
725
|
+
diversity_score = 0.0
|
|
726
|
+
if has_requirements:
|
|
727
|
+
diversity_score += 0.3
|
|
728
|
+
if has_planning:
|
|
729
|
+
diversity_score += 0.3
|
|
730
|
+
if has_acceptance:
|
|
731
|
+
diversity_score += 0.4
|
|
732
|
+
|
|
733
|
+
return (length_score + diversity_score) / 2
|
|
734
|
+
|
|
735
|
+
def _check_content_quality(self, spec_content: Dict[str, str]) -> float:
|
|
736
|
+
"""Check content quality."""
|
|
737
|
+
spec_md = spec_content.get("spec_md", "")
|
|
738
|
+
|
|
739
|
+
# Check for technical terms
|
|
740
|
+
technical_indicators = [
|
|
741
|
+
"API",
|
|
742
|
+
"data",
|
|
743
|
+
"interface",
|
|
744
|
+
"module",
|
|
745
|
+
"component",
|
|
746
|
+
"architecture",
|
|
747
|
+
]
|
|
748
|
+
technical_score = sum(1 for term in technical_indicators if term in spec_md) / len(technical_indicators)
|
|
749
|
+
|
|
750
|
+
# Check for specificity
|
|
751
|
+
has_requirements = re.search(r"REQ-\d+", spec_md)
|
|
752
|
+
has_specifications = re.search(r"SPEC-\d+", spec_md)
|
|
753
|
+
|
|
754
|
+
specificity_score = 0.0
|
|
755
|
+
if has_requirements:
|
|
756
|
+
specificity_score += 0.5
|
|
757
|
+
if has_specifications:
|
|
758
|
+
specificity_score += 0.5
|
|
759
|
+
|
|
760
|
+
return (technical_score + specificity_score) / 2
|
|
761
|
+
|
|
762
|
+
def create_spec_files(self, spec_id: str, content: Dict[str, str], base_dir: str = ".moai/specs") -> bool:
|
|
763
|
+
"""
|
|
764
|
+
Create SPEC files in the correct directory structure.
|
|
765
|
+
|
|
766
|
+
Args:
|
|
767
|
+
spec_id: SPEC identifier
|
|
768
|
+
content: Dictionary with spec_md, plan_md, acceptance_md
|
|
769
|
+
base_dir: Base directory for specs
|
|
770
|
+
|
|
771
|
+
Returns:
|
|
772
|
+
True if files were created successfully
|
|
773
|
+
"""
|
|
774
|
+
try:
|
|
775
|
+
# Create spec directory
|
|
776
|
+
spec_dir = os.path.join(base_dir, f"SPEC-{spec_id}")
|
|
777
|
+
os.makedirs(spec_dir, exist_ok=True)
|
|
778
|
+
|
|
779
|
+
# Create files
|
|
780
|
+
files_to_create = [
|
|
781
|
+
("spec.md", content.get("spec_md", "")),
|
|
782
|
+
("plan.md", content.get("plan_md", "")),
|
|
783
|
+
("acceptance.md", content.get("acceptance_md", "")),
|
|
784
|
+
]
|
|
785
|
+
|
|
786
|
+
for filename, content_text in files_to_create:
|
|
787
|
+
file_path = os.path.join(spec_dir, filename)
|
|
788
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
789
|
+
f.write(content_text)
|
|
790
|
+
|
|
791
|
+
logger.info(f"Created spec file: {file_path}")
|
|
792
|
+
|
|
793
|
+
return True
|
|
794
|
+
|
|
795
|
+
except Exception as e:
|
|
796
|
+
logger.error(f"Failed to create spec files: {e}")
|
|
797
|
+
return False
|
|
798
|
+
|
|
799
|
+
def execute(self, tool_name: str, tool_args: Dict[str, Any], result: Any = None) -> Dict[str, Any]:
|
|
800
|
+
"""
|
|
801
|
+
Execute the auto-spec completion hook.
|
|
802
|
+
|
|
803
|
+
Args:
|
|
804
|
+
tool_name: Name of the tool that was executed
|
|
805
|
+
tool_args: Arguments passed to the tool
|
|
806
|
+
result: Result from tool execution
|
|
807
|
+
|
|
808
|
+
Returns:
|
|
809
|
+
Execution result
|
|
810
|
+
"""
|
|
811
|
+
start_time = time.time()
|
|
812
|
+
|
|
813
|
+
try:
|
|
814
|
+
# Check if we should trigger spec completion
|
|
815
|
+
if not self.should_trigger_spec_completion(tool_name, tool_args):
|
|
816
|
+
return {
|
|
817
|
+
"success": False,
|
|
818
|
+
"message": "Auto-spec completion not triggered",
|
|
819
|
+
"execution_time": time.time() - start_time,
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
# Detect code changes
|
|
823
|
+
changed_files = self.detect_code_changes(tool_name, tool_args, result)
|
|
824
|
+
|
|
825
|
+
if not changed_files:
|
|
826
|
+
return {
|
|
827
|
+
"success": False,
|
|
828
|
+
"message": "No code changes detected",
|
|
829
|
+
"execution_time": time.time() - start_time,
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
# Process each changed file
|
|
833
|
+
results = []
|
|
834
|
+
for file_path in changed_files:
|
|
835
|
+
try:
|
|
836
|
+
# Analyze the code file
|
|
837
|
+
analysis = self.spec_generator.analyze(file_path)
|
|
838
|
+
|
|
839
|
+
# Calculate confidence
|
|
840
|
+
confidence = self.calculate_completion_confidence(analysis)
|
|
841
|
+
|
|
842
|
+
# Skip if confidence is too low
|
|
843
|
+
min_confidence = self.auto_config.get("min_confidence", 0.7)
|
|
844
|
+
if confidence < min_confidence:
|
|
845
|
+
logger.info(f"Confidence {confidence} below threshold {min_confidence}")
|
|
846
|
+
continue
|
|
847
|
+
|
|
848
|
+
# Generate complete spec
|
|
849
|
+
spec_content = self.generate_complete_spec(analysis, file_path)
|
|
850
|
+
|
|
851
|
+
# Validate quality
|
|
852
|
+
validation = self.validate_generated_spec(spec_content)
|
|
853
|
+
|
|
854
|
+
# Create spec files
|
|
855
|
+
spec_id = spec_content["spec_id"]
|
|
856
|
+
created = self.create_spec_files(spec_id, spec_content)
|
|
857
|
+
|
|
858
|
+
results.append(
|
|
859
|
+
{
|
|
860
|
+
"file_path": file_path,
|
|
861
|
+
"spec_id": spec_id,
|
|
862
|
+
"confidence": confidence,
|
|
863
|
+
"quality_score": validation["quality_score"],
|
|
864
|
+
"created": created,
|
|
865
|
+
}
|
|
866
|
+
)
|
|
867
|
+
|
|
868
|
+
logger.info(f"Auto-generated SPEC for {file_path}: {spec_id}")
|
|
869
|
+
|
|
870
|
+
except Exception as e:
|
|
871
|
+
logger.error(f"Error processing {file_path}: {e}")
|
|
872
|
+
results.append({"file_path": file_path, "error": str(e)})
|
|
873
|
+
|
|
874
|
+
# Generate summary
|
|
875
|
+
successful_creations = [r for r in results if r.get("created", False)]
|
|
876
|
+
failed_creations = [r for r in results if not r.get("created", False)]
|
|
877
|
+
|
|
878
|
+
execution_result = {
|
|
879
|
+
"success": len(successful_creations) > 0,
|
|
880
|
+
"generated_specs": successful_creations,
|
|
881
|
+
"failed_files": failed_creations,
|
|
882
|
+
"execution_time": time.time() - start_time,
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
# Add notification message
|
|
886
|
+
if successful_creations:
|
|
887
|
+
execution_result["message"] = f"Auto-generated {len(successful_creations)} SPEC(s)"
|
|
888
|
+
elif failed_creations:
|
|
889
|
+
execution_result["message"] = "Auto-spec completion attempted but no specs created"
|
|
890
|
+
else:
|
|
891
|
+
execution_result["message"] = "No files required auto-spec completion"
|
|
892
|
+
|
|
893
|
+
return execution_result
|
|
894
|
+
|
|
895
|
+
except Exception as e:
|
|
896
|
+
logger.error(f"Error in auto-spec completion: {e}")
|
|
897
|
+
return {
|
|
898
|
+
"success": False,
|
|
899
|
+
"error": str(e),
|
|
900
|
+
"execution_time": time.time() - start_time,
|
|
901
|
+
}
|