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,687 @@
|
|
|
1
|
+
"""Quality Validator for Auto-Generated SPECs."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
import time
|
|
6
|
+
from typing import Any, Dict, List
|
|
7
|
+
|
|
8
|
+
from moai_adk.core.spec.confidence_scoring import ConfidenceScoringSystem
|
|
9
|
+
|
|
10
|
+
# Configure logging
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
# Traceability tag patterns
|
|
14
|
+
TRACEABILITY_TAGS = ["@SPEC:", "@REQ:", "@TEST:", "@IMPL:", "@DOC:"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class QualityValidator:
|
|
18
|
+
"""
|
|
19
|
+
Quality Validator for auto-generated SPEC documents.
|
|
20
|
+
|
|
21
|
+
This validator ensures that auto-generated SPECs meet quality standards,
|
|
22
|
+
follow EARS format, and are complete and accurate.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, config: Dict[str, Any] = None):
|
|
26
|
+
"""Initialize the quality validator."""
|
|
27
|
+
self.config = config or {}
|
|
28
|
+
self.confidence_scorer = ConfidenceScoringSystem()
|
|
29
|
+
|
|
30
|
+
# Quality thresholds from config
|
|
31
|
+
self.min_ears_compliance = self.config.get("min_ears_compliance", 0.85)
|
|
32
|
+
self.min_confidence_score = self.config.get("min_confidence_score", 0.7)
|
|
33
|
+
self.min_content_length = self.config.get("min_content_length", 500)
|
|
34
|
+
self.max_review_suggestions = self.config.get("max_review_suggestions", 10)
|
|
35
|
+
|
|
36
|
+
# Quality metrics weights
|
|
37
|
+
self.quality_weights = self.config.get(
|
|
38
|
+
"quality_weights",
|
|
39
|
+
{
|
|
40
|
+
"ears_compliance": 0.3,
|
|
41
|
+
"content_completeness": 0.25,
|
|
42
|
+
"technical_accuracy": 0.2,
|
|
43
|
+
"clarity_score": 0.15,
|
|
44
|
+
"traceability": 0.1,
|
|
45
|
+
},
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# Validation rules
|
|
49
|
+
self.validation_rules = {
|
|
50
|
+
"required_sections": [
|
|
51
|
+
"Overview",
|
|
52
|
+
"Environment",
|
|
53
|
+
"Assumptions",
|
|
54
|
+
"Requirements",
|
|
55
|
+
"Specifications",
|
|
56
|
+
"Traceability",
|
|
57
|
+
],
|
|
58
|
+
"required_plan_sections": [
|
|
59
|
+
"Implementation Phases",
|
|
60
|
+
"Technical Approach",
|
|
61
|
+
"Success Criteria",
|
|
62
|
+
"Next Steps",
|
|
63
|
+
],
|
|
64
|
+
"required_acceptance_sections": [
|
|
65
|
+
"Acceptance Criteria",
|
|
66
|
+
"Validation Process",
|
|
67
|
+
"Completion Criteria",
|
|
68
|
+
],
|
|
69
|
+
"technical_keywords": [
|
|
70
|
+
"API",
|
|
71
|
+
"Database",
|
|
72
|
+
"Authentication",
|
|
73
|
+
"Security",
|
|
74
|
+
"Performance",
|
|
75
|
+
"Scalability",
|
|
76
|
+
"Testing",
|
|
77
|
+
],
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
def validate_spec_quality(
|
|
81
|
+
self, spec_content: Dict[str, str], code_analysis: Dict[str, Any] = None
|
|
82
|
+
) -> Dict[str, Any]:
|
|
83
|
+
"""
|
|
84
|
+
Validate the quality of a generated SPEC.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
spec_content: Dictionary with spec_md, plan_md, and acceptance_md
|
|
88
|
+
code_analysis: Original code analysis for reference
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
Quality validation results with scores and recommendations
|
|
92
|
+
"""
|
|
93
|
+
start_time = time.time()
|
|
94
|
+
|
|
95
|
+
logger.info("Starting SPEC quality validation")
|
|
96
|
+
|
|
97
|
+
# Initialize validation results
|
|
98
|
+
validation_result: Dict[str, Any] = {
|
|
99
|
+
"validation_time": 0.0,
|
|
100
|
+
"overall_score": 0.0,
|
|
101
|
+
"quality_grade": "F",
|
|
102
|
+
"passed_checks": [],
|
|
103
|
+
"failed_checks": [],
|
|
104
|
+
"recommendations": [],
|
|
105
|
+
"metrics": {},
|
|
106
|
+
"details": {},
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
# Validate EARS format compliance
|
|
111
|
+
ears_result = self._validate_ears_format(spec_content["spec_md"])
|
|
112
|
+
validation_result["details"]["ears_compliance"] = ears_result
|
|
113
|
+
|
|
114
|
+
# Validate content completeness
|
|
115
|
+
completeness_result = self._validate_content_completeness(spec_content)
|
|
116
|
+
validation_result["details"]["content_completeness"] = completeness_result
|
|
117
|
+
|
|
118
|
+
# Validate technical accuracy
|
|
119
|
+
technical_result = self._validate_technical_accuracy(spec_content, code_analysis)
|
|
120
|
+
validation_result["details"]["technical_accuracy"] = technical_result
|
|
121
|
+
|
|
122
|
+
# Validate clarity and readability
|
|
123
|
+
clarity_result = self._validate_clarity(spec_content)
|
|
124
|
+
validation_result["details"]["clarity_score"] = clarity_result
|
|
125
|
+
|
|
126
|
+
# Validate traceability
|
|
127
|
+
traceability_result = self._validate_traceability(spec_content)
|
|
128
|
+
validation_result["details"]["traceability"] = traceability_result
|
|
129
|
+
|
|
130
|
+
# Calculate overall quality score
|
|
131
|
+
overall_score = self._calculate_overall_score(validation_result["details"])
|
|
132
|
+
validation_result["overall_score"] = overall_score
|
|
133
|
+
|
|
134
|
+
# Determine quality grade
|
|
135
|
+
validation_result["quality_grade"] = self._determine_quality_grade(overall_score)
|
|
136
|
+
|
|
137
|
+
# Check if SPEC meets minimum quality standards
|
|
138
|
+
meets_standards = self._check_quality_standards(validation_result)
|
|
139
|
+
validation_result["meets_minimum_standards"] = meets_standards
|
|
140
|
+
|
|
141
|
+
# Generate recommendations
|
|
142
|
+
recommendations = self._generate_recommendations(validation_result)
|
|
143
|
+
validation_result["recommendations"] = recommendations
|
|
144
|
+
|
|
145
|
+
# Compile check results
|
|
146
|
+
validation_result["passed_checks"] = self._compile_passed_checks(validation_result["details"])
|
|
147
|
+
validation_result["failed_checks"] = self._compile_failed_checks(validation_result["details"])
|
|
148
|
+
|
|
149
|
+
except Exception as e:
|
|
150
|
+
logger.error(f"Error during SPEC validation: {str(e)}")
|
|
151
|
+
validation_result["error"] = str(e)
|
|
152
|
+
|
|
153
|
+
# Set validation time
|
|
154
|
+
validation_result["validation_time"] = time.time() - start_time
|
|
155
|
+
|
|
156
|
+
logger.info(f"SPEC quality validation completed in {validation_result['validation_time']:.2f}s")
|
|
157
|
+
|
|
158
|
+
return validation_result
|
|
159
|
+
|
|
160
|
+
def _validate_ears_format(self, spec_md: str) -> Dict[str, Any]:
|
|
161
|
+
"""Validate EARS format compliance."""
|
|
162
|
+
logger.info("Validating EARS format compliance")
|
|
163
|
+
|
|
164
|
+
required_sections = self.validation_rules["required_sections"]
|
|
165
|
+
section_scores = {}
|
|
166
|
+
missing_sections = []
|
|
167
|
+
|
|
168
|
+
# Check each required section
|
|
169
|
+
for section in required_sections:
|
|
170
|
+
if section in spec_md:
|
|
171
|
+
section_scores[section] = 1.0
|
|
172
|
+
else:
|
|
173
|
+
section_scores[section] = 0.0
|
|
174
|
+
missing_sections.append(section)
|
|
175
|
+
|
|
176
|
+
# Calculate overall compliance
|
|
177
|
+
overall_compliance = sum(section_scores.values()) / len(required_sections)
|
|
178
|
+
|
|
179
|
+
# Check for META information
|
|
180
|
+
has_meta = "---" in spec_md and "title:" in spec_md
|
|
181
|
+
|
|
182
|
+
# Check for tags
|
|
183
|
+
has_tags = self._check_traceability_tags(spec_md)
|
|
184
|
+
|
|
185
|
+
# Check for proper structure
|
|
186
|
+
has_proper_headings = self._check_heading_structure(spec_md)
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
"overall_compliance": round(overall_compliance, 2),
|
|
190
|
+
"section_scores": section_scores,
|
|
191
|
+
"missing_sections": missing_sections,
|
|
192
|
+
"has_meta_info": has_meta,
|
|
193
|
+
"has_tags": has_tags,
|
|
194
|
+
"has_proper_structure": has_proper_headings,
|
|
195
|
+
"total_sections": len(required_sections),
|
|
196
|
+
"present_sections": sum(1 for score in section_scores.values() if score > 0),
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
def _validate_content_completeness(self, spec_content: Dict[str, str]) -> Dict[str, Any]:
|
|
200
|
+
"""Validate content completeness across all SPEC files."""
|
|
201
|
+
logger.info("Validating content completeness")
|
|
202
|
+
|
|
203
|
+
results = {
|
|
204
|
+
"spec_completeness": 0.0,
|
|
205
|
+
"plan_completeness": 0.0,
|
|
206
|
+
"acceptance_completeness": 0.0,
|
|
207
|
+
"overall_completeness": 0.0,
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# Validate spec.md completeness
|
|
211
|
+
spec_md = spec_content.get("spec_md", "")
|
|
212
|
+
spec_completeness = self._assess_section_completeness(spec_md)
|
|
213
|
+
results["spec_completeness"] = spec_completeness
|
|
214
|
+
|
|
215
|
+
# Validate plan.md completeness
|
|
216
|
+
plan_md = spec_content.get("plan_md", "")
|
|
217
|
+
plan_completeness = self._assess_plan_completeness(plan_md)
|
|
218
|
+
results["plan_completeness"] = plan_completeness
|
|
219
|
+
|
|
220
|
+
# Validate acceptance.md completeness
|
|
221
|
+
acceptance_md = spec_content.get("acceptance_md", "")
|
|
222
|
+
acceptance_completeness = self._assess_acceptance_completeness(acceptance_md)
|
|
223
|
+
results["acceptance_completeness"] = acceptance_completeness
|
|
224
|
+
|
|
225
|
+
# Calculate overall completeness
|
|
226
|
+
overall_completeness = (spec_completeness + plan_completeness + acceptance_completeness) / 3
|
|
227
|
+
results["overall_completeness"] = round(overall_completeness, 2)
|
|
228
|
+
|
|
229
|
+
return results
|
|
230
|
+
|
|
231
|
+
def _validate_technical_accuracy(
|
|
232
|
+
self, spec_content: Dict[str, str], code_analysis: Dict[str, Any] = None
|
|
233
|
+
) -> Dict[str, Any]:
|
|
234
|
+
"""Validate technical accuracy of the SPEC."""
|
|
235
|
+
logger.info("Validating technical accuracy")
|
|
236
|
+
|
|
237
|
+
spec_md = spec_content.get("spec_md", "")
|
|
238
|
+
|
|
239
|
+
# Check for technical keywords presence
|
|
240
|
+
technical_keywords = self.validation_rules["technical_keywords"]
|
|
241
|
+
keyword_presence = self._check_technical_keywords(spec_md, technical_keywords)
|
|
242
|
+
|
|
243
|
+
# Check consistency with code analysis
|
|
244
|
+
consistency_score = 1.0
|
|
245
|
+
if code_analysis:
|
|
246
|
+
consistency_score = self._check_code_consistency(spec_md, code_analysis)
|
|
247
|
+
|
|
248
|
+
# Check for technical specifications
|
|
249
|
+
has_technical_specs = self._check_technical_specifications(spec_md)
|
|
250
|
+
|
|
251
|
+
# Check for realistic estimates
|
|
252
|
+
has_realistic_estimates = self._check_realistic_estimates(spec_md)
|
|
253
|
+
|
|
254
|
+
return {
|
|
255
|
+
"keyword_presence": keyword_presence,
|
|
256
|
+
"code_consistency": consistency_score,
|
|
257
|
+
"has_technical_specs": has_technical_specs,
|
|
258
|
+
"has_realistic_estimates": has_realistic_estimates,
|
|
259
|
+
"overall_accuracy": round(
|
|
260
|
+
(
|
|
261
|
+
keyword_presence
|
|
262
|
+
+ consistency_score
|
|
263
|
+
+ (1.0 if has_technical_specs else 0.0)
|
|
264
|
+
+ (1.0 if has_realistic_estimates else 0.0)
|
|
265
|
+
)
|
|
266
|
+
/ 4,
|
|
267
|
+
2,
|
|
268
|
+
),
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
def _validate_clarity(self, spec_content: Dict[str, str]) -> Dict[str, Any]:
|
|
272
|
+
"""Validate clarity and readability of the SPEC."""
|
|
273
|
+
logger.info("Validating clarity and readability")
|
|
274
|
+
|
|
275
|
+
spec_md = spec_content.get("spec_md", "")
|
|
276
|
+
|
|
277
|
+
# Check for proper language use
|
|
278
|
+
language_quality = self._check_language_quality(spec_md)
|
|
279
|
+
|
|
280
|
+
# Check for clarity requirements
|
|
281
|
+
clarity_requirements = self._check_clarity_requirements(spec_md)
|
|
282
|
+
|
|
283
|
+
# Check for ambiguity
|
|
284
|
+
ambiguity_score = self._check_ambiguity(spec_md)
|
|
285
|
+
|
|
286
|
+
# Check for consistency
|
|
287
|
+
consistency_score = self._check_consistency(spec_md)
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
"language_quality": language_quality,
|
|
291
|
+
"clarity_requirements": clarity_requirements,
|
|
292
|
+
"ambiguity_score": ambiguity_score,
|
|
293
|
+
"consistency_score": consistency_score,
|
|
294
|
+
"overall_clarity": round(
|
|
295
|
+
(language_quality + clarity_requirements + (1.0 - ambiguity_score) + consistency_score) / 4,
|
|
296
|
+
2,
|
|
297
|
+
),
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
def _validate_traceability(self, spec_content: Dict[str, str]) -> Dict[str, Any]:
|
|
301
|
+
"""Validate traceability in the SPEC."""
|
|
302
|
+
logger.info("Validating traceability")
|
|
303
|
+
|
|
304
|
+
spec_md = spec_content.get("spec_md", "")
|
|
305
|
+
|
|
306
|
+
# Check for basic traceability elements
|
|
307
|
+
has_traceability = "@SPEC:" in spec_md or "Requirements:" in spec_md
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
"has_traceability_elements": has_traceability,
|
|
311
|
+
"overall_traceability": 1.0 if has_traceability else 0.5,
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
def _calculate_overall_score(self, details: Dict[str, Any]) -> float:
|
|
315
|
+
"""Calculate overall quality score."""
|
|
316
|
+
weights = self.quality_weights
|
|
317
|
+
|
|
318
|
+
overall_score = (
|
|
319
|
+
details["ears_compliance"]["overall_compliance"] * weights["ears_compliance"]
|
|
320
|
+
+ details["content_completeness"]["overall_completeness"] * weights["content_completeness"]
|
|
321
|
+
+ details["technical_accuracy"]["overall_accuracy"] * weights["technical_accuracy"]
|
|
322
|
+
+ details["clarity_score"]["overall_clarity"] * weights["clarity_score"]
|
|
323
|
+
+ details["traceability"]["overall_traceability"] * weights["traceability"]
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
return round(overall_score, 2)
|
|
327
|
+
|
|
328
|
+
def _determine_quality_grade(self, score: float) -> str:
|
|
329
|
+
"""Determine quality grade based on score."""
|
|
330
|
+
if score >= 0.9:
|
|
331
|
+
return "A"
|
|
332
|
+
elif score >= 0.8:
|
|
333
|
+
return "B"
|
|
334
|
+
elif score >= 0.7:
|
|
335
|
+
return "C"
|
|
336
|
+
elif score >= 0.6:
|
|
337
|
+
return "D"
|
|
338
|
+
else:
|
|
339
|
+
return "F"
|
|
340
|
+
|
|
341
|
+
def _check_quality_standards(self, validation_result: Dict[str, Any]) -> bool:
|
|
342
|
+
"""Check if SPEC meets minimum quality standards."""
|
|
343
|
+
overall_score = validation_result["overall_score"]
|
|
344
|
+
ears_compliance = validation_result["details"]["ears_compliance"]["overall_compliance"]
|
|
345
|
+
|
|
346
|
+
meets_overall = overall_score >= self.min_confidence_score
|
|
347
|
+
meets_ears = ears_compliance >= self.min_ears_compliance
|
|
348
|
+
|
|
349
|
+
return meets_overall and meets_ears
|
|
350
|
+
|
|
351
|
+
def _generate_recommendations(self, validation_result: Dict[str, Any]) -> List[str]:
|
|
352
|
+
"""Generate improvement recommendations."""
|
|
353
|
+
recommendations = []
|
|
354
|
+
details = validation_result["details"]
|
|
355
|
+
|
|
356
|
+
# EARS compliance recommendations
|
|
357
|
+
if details["ears_compliance"]["overall_compliance"] < 1.0:
|
|
358
|
+
missing = details["ears_compliance"]["missing_sections"]
|
|
359
|
+
recommendations.append(f"Add missing EARS sections: {', '.join(missing[:3])}")
|
|
360
|
+
|
|
361
|
+
# Content completeness recommendations
|
|
362
|
+
if details["content_completeness"]["overall_completeness"] < 0.8:
|
|
363
|
+
recommendations.append("Expand content sections with more detailed requirements")
|
|
364
|
+
|
|
365
|
+
# Technical accuracy recommendations
|
|
366
|
+
if details["technical_accuracy"]["overall_accuracy"] < 0.8:
|
|
367
|
+
recommendations.append("Add more technical specifications and details")
|
|
368
|
+
|
|
369
|
+
# Clarity recommendations
|
|
370
|
+
if details["clarity_score"]["overall_clarity"] < 0.7:
|
|
371
|
+
recommendations.append("Improve language clarity and reduce ambiguity")
|
|
372
|
+
|
|
373
|
+
# Traceability recommendations
|
|
374
|
+
if details["traceability"]["overall_traceability"] < 0.8:
|
|
375
|
+
recommendations.append("Add proper traceability tags and relationships")
|
|
376
|
+
|
|
377
|
+
# Limit recommendations
|
|
378
|
+
return recommendations[: self.max_review_suggestions]
|
|
379
|
+
|
|
380
|
+
def _compile_passed_checks(self, details: Dict[str, Any]) -> List[str]:
|
|
381
|
+
"""Compile list of passed quality checks."""
|
|
382
|
+
passed = []
|
|
383
|
+
|
|
384
|
+
if details["ears_compliance"]["overall_compliance"] >= self.min_ears_compliance:
|
|
385
|
+
passed.append("EARS format compliance")
|
|
386
|
+
|
|
387
|
+
if details["content_completeness"]["overall_completeness"] >= 0.8:
|
|
388
|
+
passed.append("Content completeness")
|
|
389
|
+
|
|
390
|
+
if details["technical_accuracy"]["overall_accuracy"] >= 0.7:
|
|
391
|
+
passed.append("Technical accuracy")
|
|
392
|
+
|
|
393
|
+
if details["clarity_score"]["overall_clarity"] >= 0.7:
|
|
394
|
+
passed.append("Clarity and readability")
|
|
395
|
+
|
|
396
|
+
if details["traceability"]["overall_traceability"] >= 0.7:
|
|
397
|
+
passed.append("Traceability")
|
|
398
|
+
|
|
399
|
+
return passed
|
|
400
|
+
|
|
401
|
+
def _compile_failed_checks(self, details: Dict[str, Any]) -> List[str]:
|
|
402
|
+
"""Compile list of failed quality checks."""
|
|
403
|
+
failed = []
|
|
404
|
+
|
|
405
|
+
if details["ears_compliance"]["overall_compliance"] < self.min_ears_compliance:
|
|
406
|
+
failed.append("EARS format compliance")
|
|
407
|
+
|
|
408
|
+
if details["content_completeness"]["overall_completeness"] < 0.8:
|
|
409
|
+
failed.append("Content completeness")
|
|
410
|
+
|
|
411
|
+
if details["technical_accuracy"]["overall_accuracy"] < 0.7:
|
|
412
|
+
failed.append("Technical accuracy")
|
|
413
|
+
|
|
414
|
+
if details["clarity_score"]["overall_clarity"] < 0.7:
|
|
415
|
+
failed.append("Clarity and readability")
|
|
416
|
+
|
|
417
|
+
if details["traceability"]["overall_traceability"] < 0.7:
|
|
418
|
+
failed.append("Traceability")
|
|
419
|
+
|
|
420
|
+
return failed
|
|
421
|
+
|
|
422
|
+
# Helper methods
|
|
423
|
+
def _check_heading_structure(self, spec_md: str) -> bool:
|
|
424
|
+
"""Check if proper heading structure exists."""
|
|
425
|
+
# Look for proper markdown heading structure
|
|
426
|
+
heading_pattern = r"^#+\s+.*$"
|
|
427
|
+
headings = re.findall(heading_pattern, spec_md, re.MULTILINE)
|
|
428
|
+
return len(headings) >= 5 # At least 5 headings
|
|
429
|
+
|
|
430
|
+
def _assess_section_completeness(self, content: str) -> float:
|
|
431
|
+
"""Assess completeness of a section."""
|
|
432
|
+
if len(content) < self.min_content_length:
|
|
433
|
+
return 0.0
|
|
434
|
+
|
|
435
|
+
# Check for key indicators of completeness
|
|
436
|
+
completeness_indicators = [
|
|
437
|
+
r"##\s+.*", # Subheadings
|
|
438
|
+
r"\*\*.*\*\*", # Bold text
|
|
439
|
+
r"-\s+.*", # Lists
|
|
440
|
+
r"`[^`]+`", # Code snippets
|
|
441
|
+
r"\d+\.", # Numbered lists
|
|
442
|
+
]
|
|
443
|
+
|
|
444
|
+
score = 0.0
|
|
445
|
+
for indicator in completeness_indicators:
|
|
446
|
+
matches = re.findall(indicator, content)
|
|
447
|
+
if matches:
|
|
448
|
+
score += 0.2
|
|
449
|
+
|
|
450
|
+
return min(score, 1.0)
|
|
451
|
+
|
|
452
|
+
def _assess_plan_completeness(self, plan_content: str) -> float:
|
|
453
|
+
"""Assess completeness of implementation plan."""
|
|
454
|
+
if not plan_content:
|
|
455
|
+
return 0.0
|
|
456
|
+
|
|
457
|
+
# Check for plan-specific elements
|
|
458
|
+
plan_indicators = [
|
|
459
|
+
r"Phase", # Phases
|
|
460
|
+
r"Priority", # Priorities
|
|
461
|
+
r"Task", # Tasks
|
|
462
|
+
r"\[\s*\]", # Checkboxes
|
|
463
|
+
r"Phase 1", # Phase indicators
|
|
464
|
+
]
|
|
465
|
+
|
|
466
|
+
score = 0.0
|
|
467
|
+
for indicator in plan_indicators:
|
|
468
|
+
if re.search(indicator, plan_content):
|
|
469
|
+
score += 0.2
|
|
470
|
+
|
|
471
|
+
return min(score, 1.0)
|
|
472
|
+
|
|
473
|
+
def _assess_acceptance_criteria_completeness(self, acceptance_content: str) -> float:
|
|
474
|
+
"""Assess completeness of acceptance criteria."""
|
|
475
|
+
if not acceptance_content:
|
|
476
|
+
return 0.0
|
|
477
|
+
|
|
478
|
+
# Check for acceptance-specific elements
|
|
479
|
+
acceptance_indicators = [
|
|
480
|
+
r"Acceptance", # Acceptance
|
|
481
|
+
r"Criteria", # Criteria
|
|
482
|
+
r"Pass", # Pass
|
|
483
|
+
r"Fail", # Fail
|
|
484
|
+
r"Test", # Test
|
|
485
|
+
]
|
|
486
|
+
|
|
487
|
+
score = 0.0
|
|
488
|
+
for indicator in acceptance_indicators:
|
|
489
|
+
if re.search(indicator, acceptance_content):
|
|
490
|
+
score += 0.2
|
|
491
|
+
|
|
492
|
+
return min(score, 1.0)
|
|
493
|
+
|
|
494
|
+
def _check_technical_keywords(self, spec_md: str, keywords: List[str]) -> float:
|
|
495
|
+
"""Check for presence of technical keywords."""
|
|
496
|
+
found_keywords = []
|
|
497
|
+
for keyword in keywords:
|
|
498
|
+
if keyword in spec_md:
|
|
499
|
+
found_keywords.append(keyword)
|
|
500
|
+
|
|
501
|
+
return len(found_keywords) / len(keywords)
|
|
502
|
+
|
|
503
|
+
def _check_code_consistency(self, spec_md: str, code_analysis: Dict[str, Any]) -> float:
|
|
504
|
+
"""Check consistency between SPEC and code analysis."""
|
|
505
|
+
# Extract key elements from code analysis
|
|
506
|
+
classes = code_analysis.get("structure_info", {}).get("classes", [])
|
|
507
|
+
functions = code_analysis.get("structure_info", {}).get("functions", [])
|
|
508
|
+
|
|
509
|
+
# Check if these elements are mentioned in the SPEC
|
|
510
|
+
class_mentions = sum(1 for cls in classes if cls in spec_md)
|
|
511
|
+
function_mentions = sum(1 for func in functions if func in spec_md)
|
|
512
|
+
|
|
513
|
+
total_elements = len(classes) + len(functions)
|
|
514
|
+
if total_elements == 0:
|
|
515
|
+
return 1.0
|
|
516
|
+
|
|
517
|
+
consistency = (class_mentions + function_mentions) / total_elements
|
|
518
|
+
return min(consistency, 1.0)
|
|
519
|
+
|
|
520
|
+
def _check_technical_specifications(self, spec_md: str) -> bool:
|
|
521
|
+
"""Check for presence of technical specifications."""
|
|
522
|
+
technical_patterns = [
|
|
523
|
+
r"API\s+Endpoint",
|
|
524
|
+
r"Database\s+Schema",
|
|
525
|
+
r"Authentication",
|
|
526
|
+
r"Performance\s+Requirement",
|
|
527
|
+
r"Security\s+Requirement",
|
|
528
|
+
r"Scalability\s+Plan",
|
|
529
|
+
r"Testing\s+Strategy",
|
|
530
|
+
]
|
|
531
|
+
|
|
532
|
+
return any(re.search(pattern, spec_md) for pattern in technical_patterns)
|
|
533
|
+
|
|
534
|
+
def _check_realistic_estimates(self, spec_md: str) -> bool:
|
|
535
|
+
"""Check for realistic time/effort estimates."""
|
|
536
|
+
# Look for realistic time estimates
|
|
537
|
+
time_patterns = [r"1-2\s*days", r"3-5\s*days", r"1-2\s*weeks", r"\d+\s*hours"]
|
|
538
|
+
|
|
539
|
+
return any(re.search(pattern, spec_md) for pattern in time_patterns)
|
|
540
|
+
|
|
541
|
+
def _check_language_quality(self, spec_md: str) -> float:
|
|
542
|
+
"""Check language quality."""
|
|
543
|
+
# Simple language quality checks
|
|
544
|
+
sentences = spec_md.split(".")
|
|
545
|
+
avg_sentence_length = sum(len(s.split()) for s in sentences) / len(sentences)
|
|
546
|
+
|
|
547
|
+
# Optimal sentence length is around 15-20 words
|
|
548
|
+
if 15 <= avg_sentence_length <= 25:
|
|
549
|
+
return 1.0
|
|
550
|
+
elif 10 <= avg_sentence_length <= 30:
|
|
551
|
+
return 0.8
|
|
552
|
+
else:
|
|
553
|
+
return 0.5
|
|
554
|
+
|
|
555
|
+
def _check_clarity_requirements(self, spec_md: str) -> float:
|
|
556
|
+
"""Check clarity requirements."""
|
|
557
|
+
clarity_indicators = [
|
|
558
|
+
r"Clear",
|
|
559
|
+
r"Specific",
|
|
560
|
+
r"Measurable",
|
|
561
|
+
r"Achievable",
|
|
562
|
+
r"Relevant",
|
|
563
|
+
]
|
|
564
|
+
|
|
565
|
+
found_indicators = sum(1 for indicator in clarity_indicators if re.search(indicator, spec_md))
|
|
566
|
+
|
|
567
|
+
return min(found_indicators / len(clarity_indicators), 1.0)
|
|
568
|
+
|
|
569
|
+
def _check_ambiguity(self, spec_md: str) -> float:
|
|
570
|
+
"""Check for ambiguous language."""
|
|
571
|
+
ambiguity_indicators = [
|
|
572
|
+
r"degree",
|
|
573
|
+
r"extent",
|
|
574
|
+
r"approximately",
|
|
575
|
+
r"about",
|
|
576
|
+
r"around",
|
|
577
|
+
]
|
|
578
|
+
|
|
579
|
+
ambiguous_count = sum(1 for indicator in ambiguity_indicators if re.search(indicator, spec_md))
|
|
580
|
+
|
|
581
|
+
# Normalize by content length
|
|
582
|
+
content_length = len(spec_md.split())
|
|
583
|
+
ambiguity_ratio = ambiguous_count / max(content_length / 100, 1)
|
|
584
|
+
|
|
585
|
+
return min(ambiguity_ratio, 1.0)
|
|
586
|
+
|
|
587
|
+
def _check_consistency(self, spec_md: str) -> float:
|
|
588
|
+
"""Check for consistency in terminology."""
|
|
589
|
+
# Check for consistent terminology
|
|
590
|
+
# This is a simplified check - in practice, you'd use more sophisticated NLP
|
|
591
|
+
sentences = spec_md.split(".")
|
|
592
|
+
if len(sentences) < 2:
|
|
593
|
+
return 1.0
|
|
594
|
+
|
|
595
|
+
# Simple consistency check: look for repeated terms
|
|
596
|
+
words = spec_md.lower().split()
|
|
597
|
+
unique_words = set(words)
|
|
598
|
+
consistency_ratio = len(unique_words) / len(words)
|
|
599
|
+
|
|
600
|
+
return consistency_ratio
|
|
601
|
+
|
|
602
|
+
def _check_traceability_tags(self, spec_md: str) -> bool:
|
|
603
|
+
"""Check for traceability tags."""
|
|
604
|
+
return any(tag in spec_md for tag in TRACEABILITY_TAGS)
|
|
605
|
+
|
|
606
|
+
def _check_tag_formatting(self, spec_md: str) -> float:
|
|
607
|
+
"""Check proper tag formatting."""
|
|
608
|
+
# Look for properly formatted tags
|
|
609
|
+
tag_pattern = r"@[A-Z]+:[A-Za-z0-9\-]+"
|
|
610
|
+
matches = re.findall(tag_pattern, spec_md)
|
|
611
|
+
|
|
612
|
+
# Count total tags to check ratio
|
|
613
|
+
total_tags = len(re.findall(r"@[A-Z]+:", spec_md))
|
|
614
|
+
|
|
615
|
+
if total_tags == 0:
|
|
616
|
+
return 1.0
|
|
617
|
+
|
|
618
|
+
return len(matches) / total_tags
|
|
619
|
+
|
|
620
|
+
def _check_traceability_relationships(self, spec_md: str) -> float:
|
|
621
|
+
"""Check traceability relationships."""
|
|
622
|
+
# Look for traceability indicators
|
|
623
|
+
traceability_indicators = [
|
|
624
|
+
r"←|→", # Arrows for relationships
|
|
625
|
+
r"Relationship",
|
|
626
|
+
r"Connect",
|
|
627
|
+
r"Trace",
|
|
628
|
+
]
|
|
629
|
+
|
|
630
|
+
found_indicators = sum(1 for indicator in traceability_indicators if re.search(indicator, spec_md))
|
|
631
|
+
|
|
632
|
+
return min(found_indicators / len(traceability_indicators), 1.0)
|
|
633
|
+
|
|
634
|
+
def _assess_acceptance_completeness(self, acceptance_content: str) -> float:
|
|
635
|
+
"""Assess completeness of acceptance criteria section."""
|
|
636
|
+
if not acceptance_content:
|
|
637
|
+
return 0.0
|
|
638
|
+
|
|
639
|
+
# Check for acceptance-specific elements
|
|
640
|
+
acceptance_indicators = [
|
|
641
|
+
r"Acceptance", # Acceptance
|
|
642
|
+
r"Criteria", # Criteria
|
|
643
|
+
r"Pass", # Pass
|
|
644
|
+
r"Fail", # Fail
|
|
645
|
+
r"Test", # Test
|
|
646
|
+
]
|
|
647
|
+
|
|
648
|
+
score = 0.0
|
|
649
|
+
for indicator in acceptance_indicators:
|
|
650
|
+
if re.search(indicator, acceptance_content):
|
|
651
|
+
score += 0.2
|
|
652
|
+
|
|
653
|
+
return min(score, 1.0)
|
|
654
|
+
|
|
655
|
+
def generate_quality_report(self, validation_result: Dict[str, Any]) -> str:
|
|
656
|
+
"""Generate a quality report string."""
|
|
657
|
+
report = f"""
|
|
658
|
+
# Quality Validation Report
|
|
659
|
+
|
|
660
|
+
## Overall Quality Score: {validation_result["overall_score"]:.2f}/1.0
|
|
661
|
+
## Quality Grade: {validation_result["quality_grade"]}
|
|
662
|
+
## Validation Time: {validation_result["validation_time"]:.2f}s
|
|
663
|
+
|
|
664
|
+
## Summary
|
|
665
|
+
- Passed Checks: {len(validation_result["passed_checks"])}
|
|
666
|
+
- Failed Checks: {len(validation_result["failed_checks"])}
|
|
667
|
+
- Recommendations: {len(validation_result["recommendations"])}
|
|
668
|
+
|
|
669
|
+
## Detailed Metrics
|
|
670
|
+
"""
|
|
671
|
+
|
|
672
|
+
# Add detailed metrics
|
|
673
|
+
for metric_name, metric_value in validation_result["metrics"].items():
|
|
674
|
+
report += f"- {metric_name}: {metric_value:.2f}\n"
|
|
675
|
+
|
|
676
|
+
# Add recommendations
|
|
677
|
+
if validation_result["recommendations"]:
|
|
678
|
+
report += "\n## Recommendations\n"
|
|
679
|
+
for i, rec in enumerate(validation_result["recommendations"], 1):
|
|
680
|
+
report += f"{i}. {rec}\n"
|
|
681
|
+
|
|
682
|
+
# Add quality determination
|
|
683
|
+
meets_standards = validation_result.get("meets_minimum_standards", False)
|
|
684
|
+
status = "PASSED" if meets_standards else "FAILED"
|
|
685
|
+
report += f"\n## Quality Status: {status}\n"
|
|
686
|
+
|
|
687
|
+
return report
|