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,981 @@
|
|
|
1
|
+
# TRUST 5 Framework - Quality Assurance System
|
|
2
|
+
|
|
3
|
+
Purpose: Automated quality gates ensuring code quality, security, maintainability, and traceability through five core principles.
|
|
4
|
+
|
|
5
|
+
Version: 1.0.0 (Updated from TRUST 4)
|
|
6
|
+
Last Updated: 2025-11-25
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Quick Reference (30 seconds)
|
|
11
|
+
|
|
12
|
+
TRUST 5 is MoAI-ADK's comprehensive quality assurance framework enforcing five pillars:
|
|
13
|
+
|
|
14
|
+
1. Test-first(T) - ≥85% coverage, RED-GREEN-REFACTOR cycle
|
|
15
|
+
2. Readable(R) - Clear naming, ≤10 cyclomatic complexity
|
|
16
|
+
3. Unified(U) - Consistent patterns, architecture compliance
|
|
17
|
+
4. Secured(S) - OWASP Top 10 compliance, security validation
|
|
18
|
+
5. Trackable(T) - Clear commits, requirement traceability
|
|
19
|
+
|
|
20
|
+
Integration Points:
|
|
21
|
+
- Pre-commit hooks → Automated validation
|
|
22
|
+
- CI/CD pipelines → Quality gate enforcement
|
|
23
|
+
- quality-gate agent → TRUST 5 validation
|
|
24
|
+
- /moai:2-run → Enforces ≥85% coverage
|
|
25
|
+
|
|
26
|
+
Quick Validation:
|
|
27
|
+
```python
|
|
28
|
+
validations = [
|
|
29
|
+
test_coverage >= 85, # T
|
|
30
|
+
complexity <= 10, # R
|
|
31
|
+
consistency > 90, # U
|
|
32
|
+
security_score == 100,# S
|
|
33
|
+
has_clear_commits # T
|
|
34
|
+
]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Implementation Guide (5 minutes)
|
|
40
|
+
|
|
41
|
+
### Principle 1: Test-First (T)
|
|
42
|
+
|
|
43
|
+
RED-GREEN-REFACTOR Cycle:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
RED Phase: Write failing test
|
|
47
|
+
Test defines requirement
|
|
48
|
+
Code doesn't exist yet
|
|
49
|
+
Test fails as expected
|
|
50
|
+
|
|
51
|
+
GREEN Phase: Write minimal code
|
|
52
|
+
Simplest code to pass test
|
|
53
|
+
Focus on making test pass
|
|
54
|
+
Test now passes
|
|
55
|
+
|
|
56
|
+
REFACTOR Phase: Improve quality
|
|
57
|
+
Extract functions/classes
|
|
58
|
+
Optimize performance
|
|
59
|
+
Add documentation
|
|
60
|
+
Keep tests passing
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Test Coverage Requirements:
|
|
64
|
+
|
|
65
|
+
| Level | Coverage | Action |
|
|
66
|
+
| -------- | -------- | --------------------------- |
|
|
67
|
+
| Critical | ≥85% | Required for merge |
|
|
68
|
+
| Warning | 70-84% | Review required |
|
|
69
|
+
| Failing | <70% | Block merge, generate tests |
|
|
70
|
+
|
|
71
|
+
Implementation Pattern:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
# RED: Write failing test first
|
|
75
|
+
def test_calculate_total_price_with_tax():
|
|
76
|
+
item = ShoppingItem(name="Widget", price=10.00)
|
|
77
|
+
total = calculate_total_with_tax(item, tax_rate=0.10)
|
|
78
|
+
assert total == 11.00 # Fails - function doesn't exist
|
|
79
|
+
|
|
80
|
+
# GREEN: Minimal implementation
|
|
81
|
+
def calculate_total_with_tax(item, tax_rate):
|
|
82
|
+
return item.price * (1 + tax_rate)
|
|
83
|
+
|
|
84
|
+
# REFACTOR: Improve code quality
|
|
85
|
+
def calculate_total_with_tax(item: ShoppingItem, tax_rate: float) -> float:
|
|
86
|
+
"""Calculate total price including tax.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
item: Shopping item with price
|
|
90
|
+
tax_rate: Tax rate as decimal (0.10 = 10%)
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Total price including tax
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
ValueError: If tax_rate not between 0 and 1
|
|
97
|
+
|
|
98
|
+
Example:
|
|
99
|
+
>>> item = ShoppingItem("Widget", 10.00)
|
|
100
|
+
>>> calculate_total_with_tax(item, 0.10)
|
|
101
|
+
11.0
|
|
102
|
+
"""
|
|
103
|
+
if not 0 <= tax_rate <= 1:
|
|
104
|
+
raise ValueError("Tax rate must be between 0 and 1")
|
|
105
|
+
|
|
106
|
+
return item.price * (1 + tax_rate)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Validation Commands:
|
|
110
|
+
```bash
|
|
111
|
+
# Run tests with coverage
|
|
112
|
+
pytest --cov=src --cov-report=html --cov-fail-under=85
|
|
113
|
+
|
|
114
|
+
# Generate coverage report
|
|
115
|
+
coverage report -m
|
|
116
|
+
|
|
117
|
+
# Show missing lines
|
|
118
|
+
coverage html && open htmlcov/index.html
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### Principle 2: Readable (R)
|
|
124
|
+
|
|
125
|
+
Readability Metrics:
|
|
126
|
+
|
|
127
|
+
| Metric | Target | Tool | Max Threshold |
|
|
128
|
+
| --------------------- | --------- | ------ | ------------- |
|
|
129
|
+
| Cyclomatic Complexity | ≤10 | pylint | 15 |
|
|
130
|
+
| Function Length | ≤50 lines | custom | 100 |
|
|
131
|
+
| Nesting Depth | ≤3 levels | pylint | 5 |
|
|
132
|
+
| Comment Ratio | 15-20% | custom | Min 10% |
|
|
133
|
+
| Type Hint Coverage | 100% | mypy | 90% |
|
|
134
|
+
|
|
135
|
+
Readability Checklist:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
Clear function/variable names (noun_verb pattern)
|
|
139
|
+
Single responsibility principle
|
|
140
|
+
Type hints on all parameters and returns
|
|
141
|
+
Docstrings with examples (Google style)
|
|
142
|
+
No magic numbers (use named constants)
|
|
143
|
+
DRY principle applied (no code duplication)
|
|
144
|
+
SOLID principles followed
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Example - Bad vs Good:
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
# BAD: Unreadable, no types, magic numbers
|
|
151
|
+
def calc(x, y):
|
|
152
|
+
if x > 0:
|
|
153
|
+
if y > 0:
|
|
154
|
+
if x + y < 100:
|
|
155
|
+
return x * 1.1 + y * 0.9
|
|
156
|
+
return 0
|
|
157
|
+
|
|
158
|
+
# GOOD: Readable, typed, constants
|
|
159
|
+
TAX_RATE = 0.10
|
|
160
|
+
DISCOUNT_RATE = 0.10
|
|
161
|
+
MAX_TOTAL = 100.00
|
|
162
|
+
|
|
163
|
+
def calculate_order_total(
|
|
164
|
+
base_amount: float,
|
|
165
|
+
discount_amount: float
|
|
166
|
+
) -> float:
|
|
167
|
+
"""Calculate order total with tax and discount.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
base_amount: Base order amount before tax
|
|
171
|
+
discount_amount: Discount amount to apply
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
Final order total with tax applied
|
|
175
|
+
|
|
176
|
+
Raises:
|
|
177
|
+
ValueError: If amounts are negative or exceed max
|
|
178
|
+
"""
|
|
179
|
+
if base_amount < 0 or discount_amount < 0:
|
|
180
|
+
raise ValueError("Amounts must be non-negative")
|
|
181
|
+
|
|
182
|
+
subtotal = base_amount - discount_amount
|
|
183
|
+
|
|
184
|
+
if subtotal > MAX_TOTAL:
|
|
185
|
+
raise ValueError(f"Total exceeds maximum {MAX_TOTAL}")
|
|
186
|
+
|
|
187
|
+
return subtotal * (1 + TAX_RATE)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Validation Commands:
|
|
191
|
+
```bash
|
|
192
|
+
# Pylint complexity check
|
|
193
|
+
pylint src/ --fail-under=8.0
|
|
194
|
+
|
|
195
|
+
# Black format check
|
|
196
|
+
black --check src/
|
|
197
|
+
|
|
198
|
+
# MyPy type check
|
|
199
|
+
mypy src/ --strict
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
### Principle 3: Unified (U)
|
|
205
|
+
|
|
206
|
+
Consistency Requirements:
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
Architecture Consistency:
|
|
210
|
+
Same pattern across all modules
|
|
211
|
+
Same error handling approach
|
|
212
|
+
Same logging strategy
|
|
213
|
+
Same naming conventions
|
|
214
|
+
|
|
215
|
+
Testing Consistency:
|
|
216
|
+
Same test structure (Arrange-Act-Assert)
|
|
217
|
+
Same fixtures/factories
|
|
218
|
+
Same assertion patterns
|
|
219
|
+
Same mock strategies
|
|
220
|
+
|
|
221
|
+
Documentation Consistency:
|
|
222
|
+
Same docstring format (Google style)
|
|
223
|
+
Same README structure
|
|
224
|
+
Same API documentation
|
|
225
|
+
Same changelog format (conventional commits)
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Pattern Enforcement:
|
|
229
|
+
|
|
230
|
+
```python
|
|
231
|
+
# Standard error handling pattern
|
|
232
|
+
class DomainError(Exception):
|
|
233
|
+
"""Base error for domain-specific errors."""
|
|
234
|
+
pass
|
|
235
|
+
|
|
236
|
+
class ValidationError(DomainError):
|
|
237
|
+
"""Validation failed."""
|
|
238
|
+
pass
|
|
239
|
+
|
|
240
|
+
def process_data(data: dict) -> Result:
|
|
241
|
+
"""Standard processing pattern."""
|
|
242
|
+
try:
|
|
243
|
+
# 1. Validate input
|
|
244
|
+
validated = validate_input(data)
|
|
245
|
+
|
|
246
|
+
# 2. Process
|
|
247
|
+
result = perform_processing(validated)
|
|
248
|
+
|
|
249
|
+
# 3. Return result
|
|
250
|
+
return Result(success=True, data=result)
|
|
251
|
+
|
|
252
|
+
except ValidationError as e:
|
|
253
|
+
logger.error(f"Validation failed: {e}")
|
|
254
|
+
raise
|
|
255
|
+
except Exception as e:
|
|
256
|
+
logger.exception(f"Processing failed: {e}")
|
|
257
|
+
raise DomainError(f"Processing failed: {e}") from e
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Validation Tools:
|
|
261
|
+
```bash
|
|
262
|
+
# Check architecture compliance
|
|
263
|
+
python .moai/scripts/validate_architecture.py
|
|
264
|
+
|
|
265
|
+
# Verify naming conventions
|
|
266
|
+
grep -r "def [A-Z]" src/ && echo "Found camelCase functions!"
|
|
267
|
+
|
|
268
|
+
# Check consistent imports
|
|
269
|
+
isort --check-only src/
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
### Principle 4: Secured (S)
|
|
275
|
+
|
|
276
|
+
OWASP Top 10 (2024) Compliance:
|
|
277
|
+
|
|
278
|
+
| Risk | Mitigation | Validation |
|
|
279
|
+
| ------------------------- | ------------------------- | ---------------------- |
|
|
280
|
+
| Broken Access Control | RBAC, permission checks | security-expert review |
|
|
281
|
+
| Cryptographic Failures | bcrypt, proper encryption | Bandit scan |
|
|
282
|
+
| Injection | Parameterized queries | SQLMap test |
|
|
283
|
+
| Insecure Design | Threat modeling | Architecture review |
|
|
284
|
+
| Security Misconfiguration | Environment variables | Config audit |
|
|
285
|
+
| Vulnerable Components | Dependency scanning | pip-audit, safety |
|
|
286
|
+
| Authentication Failures | MFA, secure sessions | Penetration test |
|
|
287
|
+
| Data Integrity | Checksums, signatures | Integrity validation |
|
|
288
|
+
| Logging Failures | Comprehensive logging | Log analysis |
|
|
289
|
+
| SSRF | URL validation | Security test |
|
|
290
|
+
|
|
291
|
+
Security Patterns:
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
# 1. Broken Access Control - RBAC implementation
|
|
295
|
+
from functools import wraps
|
|
296
|
+
|
|
297
|
+
def require_permission(permission: str):
|
|
298
|
+
"""Decorator to enforce permission checks."""
|
|
299
|
+
def decorator(func):
|
|
300
|
+
@wraps(func)
|
|
301
|
+
def wrapper(user: User, *args, kwargs):
|
|
302
|
+
if not user.has_permission(permission):
|
|
303
|
+
raise UnauthorizedError(
|
|
304
|
+
f"User lacks permission: {permission}"
|
|
305
|
+
)
|
|
306
|
+
return func(user, *args, kwargs)
|
|
307
|
+
return wrapper
|
|
308
|
+
return decorator
|
|
309
|
+
|
|
310
|
+
@require_permission("user:update")
|
|
311
|
+
def update_user_profile(user: User, profile_data: dict) -> UserProfile:
|
|
312
|
+
"""Update user profile (requires permission)."""
|
|
313
|
+
return user.update_profile(profile_data)
|
|
314
|
+
|
|
315
|
+
# 2. Cryptographic Failures - Secure password hashing
|
|
316
|
+
from bcrypt import hashpw, gensalt, checkpw
|
|
317
|
+
|
|
318
|
+
def hash_password(plaintext: str) -> str:
|
|
319
|
+
"""Hash password securely with bcrypt."""
|
|
320
|
+
salt = gensalt(rounds=12) # Adaptive cost factor
|
|
321
|
+
return hashpw(plaintext.encode('utf-8'), salt).decode('utf-8')
|
|
322
|
+
|
|
323
|
+
def verify_password(plaintext: str, hashed: str) -> bool:
|
|
324
|
+
"""Verify password against hash."""
|
|
325
|
+
return checkpw(
|
|
326
|
+
plaintext.encode('utf-8'),
|
|
327
|
+
hashed.encode('utf-8')
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# 3. Injection Prevention - Parameterized queries
|
|
331
|
+
from sqlalchemy import text
|
|
332
|
+
|
|
333
|
+
def safe_user_query(username: str) -> List[User]:
|
|
334
|
+
"""Query users safely with parameterized query."""
|
|
335
|
+
query = text("SELECT * FROM users WHERE username = :username")
|
|
336
|
+
return db.session.execute(
|
|
337
|
+
query,
|
|
338
|
+
{"username": username} # Parameterized, not concatenated
|
|
339
|
+
).fetchall()
|
|
340
|
+
|
|
341
|
+
# 4. Security Misconfiguration - Environment-based config
|
|
342
|
+
import os
|
|
343
|
+
from pathlib import Path
|
|
344
|
+
|
|
345
|
+
def load_secure_config() -> dict:
|
|
346
|
+
"""Load configuration from environment variables."""
|
|
347
|
+
config = {
|
|
348
|
+
'DEBUG': os.getenv('DEBUG', 'false').lower() == 'true',
|
|
349
|
+
'DATABASE_URL': os.getenv('DATABASE_URL'),
|
|
350
|
+
'SECRET_KEY': os.getenv('SECRET_KEY'),
|
|
351
|
+
'ALLOWED_HOSTS': os.getenv('ALLOWED_HOSTS', '').split(',')
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
# Validate required configs
|
|
355
|
+
required = ['DATABASE_URL', 'SECRET_KEY']
|
|
356
|
+
for key in required:
|
|
357
|
+
if not config.get(key):
|
|
358
|
+
raise ValueError(f"Required config missing: {key}")
|
|
359
|
+
|
|
360
|
+
# Never expose secrets in logs
|
|
361
|
+
logger.info(f"Config loaded (DEBUG={config['DEBUG']})")
|
|
362
|
+
|
|
363
|
+
return config
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Security Validation:
|
|
367
|
+
```bash
|
|
368
|
+
# Bandit security scan
|
|
369
|
+
bandit -r src/ -ll
|
|
370
|
+
|
|
371
|
+
# Dependency audit
|
|
372
|
+
pip-audit
|
|
373
|
+
safety check
|
|
374
|
+
|
|
375
|
+
# OWASP ZAP scan (for APIs)
|
|
376
|
+
zap-cli quick-scan http://localhost:8000
|
|
377
|
+
|
|
378
|
+
# Secret scanning
|
|
379
|
+
detect-secrets scan
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### Principle 5: Trackable (T)
|
|
385
|
+
|
|
386
|
+
Traceability Requirements:
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
Commit Traceability:
|
|
390
|
+
Conventional commit format
|
|
391
|
+
Link to SPEC or issue
|
|
392
|
+
Clear description of changes
|
|
393
|
+
Test evidence included
|
|
394
|
+
|
|
395
|
+
Requirement Traceability:
|
|
396
|
+
SPEC-XXX-REQ-YY mapping
|
|
397
|
+
Implementation → Test linkage
|
|
398
|
+
Test → Acceptance criteria
|
|
399
|
+
Acceptance → User story
|
|
400
|
+
|
|
401
|
+
Quality Traceability:
|
|
402
|
+
Coverage reports
|
|
403
|
+
Quality metrics dashboard
|
|
404
|
+
CI/CD pipeline results
|
|
405
|
+
Code review history
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
Conventional Commit Format:
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
# Format: <type>(<scope>): <subject>
|
|
412
|
+
#
|
|
413
|
+
# <body>
|
|
414
|
+
#
|
|
415
|
+
# <footer>
|
|
416
|
+
|
|
417
|
+
# Examples:
|
|
418
|
+
feat(auth): Add OAuth2 integration
|
|
419
|
+
|
|
420
|
+
Implement OAuth2 authentication flow with Google provider.
|
|
421
|
+
Addresses SPEC-001-REQ-02.
|
|
422
|
+
|
|
423
|
+
- Add OAuth2 client configuration
|
|
424
|
+
- Implement callback handling
|
|
425
|
+
- Add token validation
|
|
426
|
+
- Test coverage: 92%
|
|
427
|
+
|
|
428
|
+
Closes #42
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
fix(api): Resolve JWT token expiry bug
|
|
433
|
+
|
|
434
|
+
JWT tokens were expiring 1 hour early due to timezone issue.
|
|
435
|
+
Fixes SPEC-001-REQ-03.
|
|
436
|
+
|
|
437
|
+
- Correct timezone handling in token generation
|
|
438
|
+
- Add expiry validation tests
|
|
439
|
+
- Update API documentation
|
|
440
|
+
|
|
441
|
+
Fixes #58
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
refactor(database): Optimize query performance
|
|
446
|
+
|
|
447
|
+
Improve query performance by adding database indexes.
|
|
448
|
+
Related to SPEC-005-REQ-01.
|
|
449
|
+
|
|
450
|
+
- Add indexes on frequently queried columns
|
|
451
|
+
- Reduce query time by 70%
|
|
452
|
+
- Add performance benchmarks
|
|
453
|
+
|
|
454
|
+
Performance improvement from 500ms → 150ms average query time.
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
Traceability Matrix:
|
|
458
|
+
|
|
459
|
+
```yaml
|
|
460
|
+
# .moai/specs/traceability.yaml
|
|
461
|
+
requirements:
|
|
462
|
+
SPEC-001-REQ-01:
|
|
463
|
+
description: "User registration with email/password"
|
|
464
|
+
implementation:
|
|
465
|
+
- src/auth/registration.py::register_user
|
|
466
|
+
- src/models/user.py::User
|
|
467
|
+
tests:
|
|
468
|
+
- tests/auth/test_registration.py::test_register_user_success
|
|
469
|
+
- tests/auth/test_registration.py::test_register_user_duplicate
|
|
470
|
+
coverage: 95%
|
|
471
|
+
status: Implemented
|
|
472
|
+
|
|
473
|
+
SPEC-001-REQ-02:
|
|
474
|
+
description: "OAuth2 authentication"
|
|
475
|
+
implementation:
|
|
476
|
+
- src/auth/oauth2.py::OAuth2Handler
|
|
477
|
+
- src/auth/providers/google.py::GoogleOAuth2Provider
|
|
478
|
+
tests:
|
|
479
|
+
- tests/auth/test_oauth2.py::test_oauth2_flow
|
|
480
|
+
- tests/auth/test_oauth2.py::test_token_validation
|
|
481
|
+
coverage: 92%
|
|
482
|
+
status: Implemented
|
|
483
|
+
|
|
484
|
+
SPEC-001-REQ-03:
|
|
485
|
+
description: "JWT token generation and validation"
|
|
486
|
+
implementation:
|
|
487
|
+
- src/auth/jwt_manager.py::JWTManager
|
|
488
|
+
tests:
|
|
489
|
+
- tests/auth/test_jwt.py::test_token_generation
|
|
490
|
+
- tests/auth/test_jwt.py::test_token_validation
|
|
491
|
+
- tests/auth/test_jwt.py::test_token_expiry
|
|
492
|
+
coverage: 98%
|
|
493
|
+
status: Implemented
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## Advanced Implementation (10+ minutes)
|
|
499
|
+
|
|
500
|
+
### TRUST 5 CI/CD Integration
|
|
501
|
+
|
|
502
|
+
Complete Quality Gate Pipeline:
|
|
503
|
+
|
|
504
|
+
```yaml
|
|
505
|
+
# .github/workflows/trust-5-quality-gates.yml
|
|
506
|
+
name: TRUST 5 Quality Gates
|
|
507
|
+
|
|
508
|
+
on:
|
|
509
|
+
pull_request:
|
|
510
|
+
branches: [main, develop]
|
|
511
|
+
push:
|
|
512
|
+
branches: [main, develop]
|
|
513
|
+
|
|
514
|
+
jobs:
|
|
515
|
+
test-first:
|
|
516
|
+
name: "T1: Test Coverage ≥85%"
|
|
517
|
+
runs-on: ubuntu-latest
|
|
518
|
+
steps:
|
|
519
|
+
- uses: actions/checkout@v4
|
|
520
|
+
|
|
521
|
+
- name: Set up Python
|
|
522
|
+
uses: actions/setup-python@v4
|
|
523
|
+
with:
|
|
524
|
+
python-version: '3.13'
|
|
525
|
+
|
|
526
|
+
- name: Install dependencies
|
|
527
|
+
run: |
|
|
528
|
+
pip install -r requirements.txt
|
|
529
|
+
pip install pytest pytest-cov
|
|
530
|
+
|
|
531
|
+
- name: Run tests with coverage
|
|
532
|
+
run: |
|
|
533
|
+
pytest --cov=src --cov-report=xml --cov-fail-under=85
|
|
534
|
+
|
|
535
|
+
- name: Upload coverage to Codecov
|
|
536
|
+
uses: codecov/codecov-action@v3
|
|
537
|
+
with:
|
|
538
|
+
file: ./coverage.xml
|
|
539
|
+
fail_ci_if_error: true
|
|
540
|
+
|
|
541
|
+
readable:
|
|
542
|
+
name: "R: Code Quality ≥8.0"
|
|
543
|
+
runs-on: ubuntu-latest
|
|
544
|
+
steps:
|
|
545
|
+
- uses: actions/checkout@v4
|
|
546
|
+
|
|
547
|
+
- name: Pylint check
|
|
548
|
+
run: |
|
|
549
|
+
pip install pylint
|
|
550
|
+
pylint src/ --fail-under=8.0
|
|
551
|
+
|
|
552
|
+
- name: Black format check
|
|
553
|
+
run: |
|
|
554
|
+
pip install black
|
|
555
|
+
black --check src/
|
|
556
|
+
|
|
557
|
+
- name: MyPy type check
|
|
558
|
+
run: |
|
|
559
|
+
pip install mypy
|
|
560
|
+
mypy src/ --strict
|
|
561
|
+
|
|
562
|
+
unified:
|
|
563
|
+
name: "U: Consistency ≥90%"
|
|
564
|
+
runs-on: ubuntu-latest
|
|
565
|
+
steps:
|
|
566
|
+
- uses: actions/checkout@v4
|
|
567
|
+
|
|
568
|
+
- name: Architecture validation
|
|
569
|
+
run: |
|
|
570
|
+
python .moai/scripts/validate_architecture.py
|
|
571
|
+
|
|
572
|
+
- name: Import consistency
|
|
573
|
+
run: |
|
|
574
|
+
pip install isort
|
|
575
|
+
isort --check-only src/
|
|
576
|
+
|
|
577
|
+
- name: Naming convention check
|
|
578
|
+
run: |
|
|
579
|
+
python .moai/scripts/check_naming_conventions.py
|
|
580
|
+
|
|
581
|
+
secured:
|
|
582
|
+
name: "S: Security Score 100"
|
|
583
|
+
runs-on: ubuntu-latest
|
|
584
|
+
steps:
|
|
585
|
+
- uses: actions/checkout@v4
|
|
586
|
+
|
|
587
|
+
- name: Bandit security scan
|
|
588
|
+
run: |
|
|
589
|
+
pip install bandit
|
|
590
|
+
bandit -r src/ -ll
|
|
591
|
+
|
|
592
|
+
- name: Dependency audit
|
|
593
|
+
run: |
|
|
594
|
+
pip install pip-audit safety
|
|
595
|
+
pip-audit
|
|
596
|
+
safety check
|
|
597
|
+
|
|
598
|
+
- name: Secret scanning
|
|
599
|
+
run: |
|
|
600
|
+
pip install detect-secrets
|
|
601
|
+
detect-secrets scan --baseline .secrets.baseline
|
|
602
|
+
|
|
603
|
+
trackable:
|
|
604
|
+
name: "T2: Traceability Check"
|
|
605
|
+
runs-on: ubuntu-latest
|
|
606
|
+
steps:
|
|
607
|
+
- uses: actions/checkout@v4
|
|
608
|
+
|
|
609
|
+
- name: Validate commit messages
|
|
610
|
+
run: |
|
|
611
|
+
python .moai/scripts/validate_commits.py
|
|
612
|
+
|
|
613
|
+
- name: Check requirement traceability
|
|
614
|
+
run: |
|
|
615
|
+
python .moai/scripts/check_traceability.py
|
|
616
|
+
|
|
617
|
+
- name: Generate traceability report
|
|
618
|
+
run: |
|
|
619
|
+
python .moai/scripts/generate_traceability_report.py
|
|
620
|
+
|
|
621
|
+
quality-gate:
|
|
622
|
+
name: "Final Quality Gate"
|
|
623
|
+
needs: [test-first, readable, unified, secured, trackable]
|
|
624
|
+
runs-on: ubuntu-latest
|
|
625
|
+
steps:
|
|
626
|
+
- name: All gates passed
|
|
627
|
+
run: echo " TRUST 5 quality gates passed!"
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### TRUST 5 Validation Framework
|
|
631
|
+
|
|
632
|
+
Comprehensive Validator Implementation:
|
|
633
|
+
|
|
634
|
+
```python
|
|
635
|
+
from dataclasses import dataclass
|
|
636
|
+
from typing import List, Dict, Any
|
|
637
|
+
import subprocess
|
|
638
|
+
import re
|
|
639
|
+
|
|
640
|
+
@dataclass
|
|
641
|
+
class ValidationResult:
|
|
642
|
+
"""Result of TRUST 5 validation."""
|
|
643
|
+
passed: bool
|
|
644
|
+
test_coverage: float
|
|
645
|
+
code_quality: float
|
|
646
|
+
consistency_score: float
|
|
647
|
+
security_score: int
|
|
648
|
+
traceability_score: float
|
|
649
|
+
issues: List[str]
|
|
650
|
+
warnings: List[str]
|
|
651
|
+
|
|
652
|
+
def overall_score(self) -> float:
|
|
653
|
+
"""Calculate overall TRUST 5 score."""
|
|
654
|
+
weights = {
|
|
655
|
+
'test': 0.20,
|
|
656
|
+
'quality': 0.20,
|
|
657
|
+
'consistency': 0.20,
|
|
658
|
+
'security': 0.20,
|
|
659
|
+
'traceability': 0.20
|
|
660
|
+
}
|
|
661
|
+
return (
|
|
662
|
+
self.test_coverage * weights['test'] +
|
|
663
|
+
self.code_quality * weights['quality'] +
|
|
664
|
+
self.consistency_score * weights['consistency'] +
|
|
665
|
+
self.security_score * weights['security'] +
|
|
666
|
+
self.traceability_score * weights['traceability']
|
|
667
|
+
)
|
|
668
|
+
|
|
669
|
+
class TRUST5Validator:
|
|
670
|
+
"""Comprehensive TRUST 5 validation engine."""
|
|
671
|
+
|
|
672
|
+
def __init__(self, src_dir: str = "src/"):
|
|
673
|
+
self.src_dir = src_dir
|
|
674
|
+
self.result = ValidationResult(
|
|
675
|
+
passed=False,
|
|
676
|
+
test_coverage=0.0,
|
|
677
|
+
code_quality=0.0,
|
|
678
|
+
consistency_score=0.0,
|
|
679
|
+
security_score=0,
|
|
680
|
+
traceability_score=0.0,
|
|
681
|
+
issues=[],
|
|
682
|
+
warnings=[]
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
def validate_all(self) -> ValidationResult:
|
|
686
|
+
"""Run all TRUST 5 validations."""
|
|
687
|
+
# T1: Test-first
|
|
688
|
+
self._validate_test_coverage()
|
|
689
|
+
|
|
690
|
+
# R: Readable
|
|
691
|
+
self._validate_readability()
|
|
692
|
+
|
|
693
|
+
# U: Unified
|
|
694
|
+
self._validate_consistency()
|
|
695
|
+
|
|
696
|
+
# S: Secured
|
|
697
|
+
self._validate_security()
|
|
698
|
+
|
|
699
|
+
# T2: Trackable
|
|
700
|
+
self._validate_traceability()
|
|
701
|
+
|
|
702
|
+
# Final gate
|
|
703
|
+
self.result.passed = all([
|
|
704
|
+
self.result.test_coverage >= 85,
|
|
705
|
+
self.result.code_quality >= 8.0,
|
|
706
|
+
self.result.consistency_score >= 90,
|
|
707
|
+
self.result.security_score == 100,
|
|
708
|
+
self.result.traceability_score >= 80
|
|
709
|
+
])
|
|
710
|
+
|
|
711
|
+
return self.result
|
|
712
|
+
|
|
713
|
+
def _validate_test_coverage(self):
|
|
714
|
+
"""Validate test coverage ≥85%."""
|
|
715
|
+
try:
|
|
716
|
+
result = subprocess.run(
|
|
717
|
+
["pytest", "--cov", self.src_dir, "--cov-report=json"],
|
|
718
|
+
capture_output=True,
|
|
719
|
+
text=True,
|
|
720
|
+
check=False
|
|
721
|
+
)
|
|
722
|
+
|
|
723
|
+
import json
|
|
724
|
+
with open("coverage.json") as f:
|
|
725
|
+
coverage_data = json.load(f)
|
|
726
|
+
|
|
727
|
+
self.result.test_coverage = coverage_data['totals']['percent_covered']
|
|
728
|
+
|
|
729
|
+
if self.result.test_coverage < 85:
|
|
730
|
+
self.result.issues.append(
|
|
731
|
+
f"Test coverage {self.result.test_coverage:.1f}% < 85% required"
|
|
732
|
+
)
|
|
733
|
+
|
|
734
|
+
except Exception as e:
|
|
735
|
+
self.result.issues.append(f"Coverage validation failed: {e}")
|
|
736
|
+
|
|
737
|
+
def _validate_readability(self):
|
|
738
|
+
"""Validate code quality with pylint."""
|
|
739
|
+
try:
|
|
740
|
+
result = subprocess.run(
|
|
741
|
+
["pylint", self.src_dir, "--output-format=json"],
|
|
742
|
+
capture_output=True,
|
|
743
|
+
text=True,
|
|
744
|
+
check=False
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
import json
|
|
748
|
+
pylint_output = json.loads(result.stdout)
|
|
749
|
+
|
|
750
|
+
# Calculate score from pylint output
|
|
751
|
+
score_match = re.search(r"rated at ([\d.]+)/10", result.stdout)
|
|
752
|
+
if score_match:
|
|
753
|
+
self.result.code_quality = float(score_match.group(1))
|
|
754
|
+
|
|
755
|
+
if self.result.code_quality < 8.0:
|
|
756
|
+
self.result.issues.append(
|
|
757
|
+
f"Code quality {self.result.code_quality:.1f} < 8.0 required"
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
except Exception as e:
|
|
761
|
+
self.result.issues.append(f"Readability validation failed: {e}")
|
|
762
|
+
|
|
763
|
+
def _validate_consistency(self):
|
|
764
|
+
"""Validate architectural consistency."""
|
|
765
|
+
try:
|
|
766
|
+
# Check import consistency
|
|
767
|
+
isort_result = subprocess.run(
|
|
768
|
+
["isort", "--check-only", self.src_dir],
|
|
769
|
+
capture_output=True,
|
|
770
|
+
check=False
|
|
771
|
+
)
|
|
772
|
+
|
|
773
|
+
# Check formatting consistency
|
|
774
|
+
black_result = subprocess.run(
|
|
775
|
+
["black", "--check", self.src_dir],
|
|
776
|
+
capture_output=True,
|
|
777
|
+
check=False
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
# Score based on checks passed
|
|
781
|
+
checks_passed = 0
|
|
782
|
+
if isort_result.returncode == 0:
|
|
783
|
+
checks_passed += 50
|
|
784
|
+
if black_result.returncode == 0:
|
|
785
|
+
checks_passed += 50
|
|
786
|
+
|
|
787
|
+
self.result.consistency_score = checks_passed
|
|
788
|
+
|
|
789
|
+
if self.result.consistency_score < 90:
|
|
790
|
+
self.result.issues.append(
|
|
791
|
+
f"Consistency {self.result.consistency_score}% < 90% required"
|
|
792
|
+
)
|
|
793
|
+
|
|
794
|
+
except Exception as e:
|
|
795
|
+
self.result.issues.append(f"Consistency validation failed: {e}")
|
|
796
|
+
|
|
797
|
+
def _validate_security(self):
|
|
798
|
+
"""Validate security with Bandit."""
|
|
799
|
+
try:
|
|
800
|
+
result = subprocess.run(
|
|
801
|
+
["bandit", "-r", self.src_dir, "-f", "json"],
|
|
802
|
+
capture_output=True,
|
|
803
|
+
text=True,
|
|
804
|
+
check=False
|
|
805
|
+
)
|
|
806
|
+
|
|
807
|
+
import json
|
|
808
|
+
bandit_output = json.loads(result.stdout)
|
|
809
|
+
|
|
810
|
+
# Count high/medium severity issues
|
|
811
|
+
issues = bandit_output.get('results', [])
|
|
812
|
+
critical_issues = [
|
|
813
|
+
i for i in issues
|
|
814
|
+
if i['issue_severity'] in ['HIGH', 'MEDIUM']
|
|
815
|
+
]
|
|
816
|
+
|
|
817
|
+
if critical_issues:
|
|
818
|
+
self.result.security_score = 0
|
|
819
|
+
for issue in critical_issues:
|
|
820
|
+
self.result.issues.append(
|
|
821
|
+
f"Security: {issue['issue_text']} "
|
|
822
|
+
f"({issue['issue_severity']})"
|
|
823
|
+
)
|
|
824
|
+
else:
|
|
825
|
+
self.result.security_score = 100
|
|
826
|
+
|
|
827
|
+
except Exception as e:
|
|
828
|
+
self.result.issues.append(f"Security validation failed: {e}")
|
|
829
|
+
|
|
830
|
+
def _validate_traceability(self):
|
|
831
|
+
"""Validate requirement traceability."""
|
|
832
|
+
try:
|
|
833
|
+
# Check commit message format
|
|
834
|
+
result = subprocess.run(
|
|
835
|
+
["git", "log", "-1", "--pretty=%s"],
|
|
836
|
+
capture_output=True,
|
|
837
|
+
text=True,
|
|
838
|
+
check=True
|
|
839
|
+
)
|
|
840
|
+
|
|
841
|
+
commit_msg = result.stdout.strip()
|
|
842
|
+
|
|
843
|
+
# Conventional commit pattern
|
|
844
|
+
pattern = r'^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,50}'
|
|
845
|
+
|
|
846
|
+
if re.match(pattern, commit_msg):
|
|
847
|
+
self.result.traceability_score = 100
|
|
848
|
+
else:
|
|
849
|
+
self.result.traceability_score = 50
|
|
850
|
+
self.result.warnings.append(
|
|
851
|
+
f"Commit message doesn't follow conventional format: {commit_msg}"
|
|
852
|
+
)
|
|
853
|
+
|
|
854
|
+
except Exception as e:
|
|
855
|
+
self.result.warnings.append(f"Traceability validation failed: {e}")
|
|
856
|
+
self.result.traceability_score = 0
|
|
857
|
+
|
|
858
|
+
# Usage
|
|
859
|
+
validator = TRUST5Validator(src_dir="src/")
|
|
860
|
+
result = validator.validate_all()
|
|
861
|
+
|
|
862
|
+
if result.passed:
|
|
863
|
+
print(f" TRUST 5 validation passed! (Score: {result.overall_score():.1f})")
|
|
864
|
+
else:
|
|
865
|
+
print(f" TRUST 5 validation failed!")
|
|
866
|
+
for issue in result.issues:
|
|
867
|
+
print(f" - {issue}")
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
### TRUST 5 Metrics Dashboard
|
|
871
|
+
|
|
872
|
+
```python
|
|
873
|
+
class TRUST5Metrics:
|
|
874
|
+
"""Real-time TRUST 5 quality metrics."""
|
|
875
|
+
|
|
876
|
+
def __init__(self):
|
|
877
|
+
self.test_coverage = 0.0 # Target: ≥85%
|
|
878
|
+
self.code_quality = 0.0 # Target: ≥8.0
|
|
879
|
+
self.consistency_score = 0.0 # Target: ≥90%
|
|
880
|
+
self.security_score = 0 # Target: 100
|
|
881
|
+
self.traceability_score = 0.0 # Target: ≥80%
|
|
882
|
+
|
|
883
|
+
def update_metrics(self, validation_result: ValidationResult):
|
|
884
|
+
"""Update metrics from validation result."""
|
|
885
|
+
self.test_coverage = validation_result.test_coverage
|
|
886
|
+
self.code_quality = validation_result.code_quality
|
|
887
|
+
self.consistency_score = validation_result.consistency_score
|
|
888
|
+
self.security_score = validation_result.security_score
|
|
889
|
+
self.traceability_score = validation_result.traceability_score
|
|
890
|
+
|
|
891
|
+
def get_dashboard_data(self) -> dict:
|
|
892
|
+
"""Get metrics for dashboard display."""
|
|
893
|
+
return {
|
|
894
|
+
'overall_score': self.get_overall_score(),
|
|
895
|
+
'production_ready': self.is_production_ready(),
|
|
896
|
+
'metrics': {
|
|
897
|
+
'test_coverage': {
|
|
898
|
+
'value': self.test_coverage,
|
|
899
|
+
'target': 85,
|
|
900
|
+
'status': 'pass' if self.test_coverage >= 85 else 'fail'
|
|
901
|
+
},
|
|
902
|
+
'code_quality': {
|
|
903
|
+
'value': self.code_quality,
|
|
904
|
+
'target': 8.0,
|
|
905
|
+
'status': 'pass' if self.code_quality >= 8.0 else 'fail'
|
|
906
|
+
},
|
|
907
|
+
'consistency': {
|
|
908
|
+
'value': self.consistency_score,
|
|
909
|
+
'target': 90,
|
|
910
|
+
'status': 'pass' if self.consistency_score >= 90 else 'fail'
|
|
911
|
+
},
|
|
912
|
+
'security': {
|
|
913
|
+
'value': self.security_score,
|
|
914
|
+
'target': 100,
|
|
915
|
+
'status': 'pass' if self.security_score == 100 else 'fail'
|
|
916
|
+
},
|
|
917
|
+
'traceability': {
|
|
918
|
+
'value': self.traceability_score,
|
|
919
|
+
'target': 80,
|
|
920
|
+
'status': 'pass' if self.traceability_score >= 80 else 'fail'
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
def get_overall_score(self) -> float:
|
|
926
|
+
"""Calculate overall TRUST 5 score (0-100)."""
|
|
927
|
+
weights = {
|
|
928
|
+
'test': 0.20,
|
|
929
|
+
'quality': 0.20,
|
|
930
|
+
'consistency': 0.20,
|
|
931
|
+
'security': 0.20,
|
|
932
|
+
'traceability': 0.20
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
return (
|
|
936
|
+
self.test_coverage * weights['test'] +
|
|
937
|
+
(self.code_quality * 10) * weights['quality'] +
|
|
938
|
+
self.consistency_score * weights['consistency'] +
|
|
939
|
+
self.security_score * weights['security'] +
|
|
940
|
+
self.traceability_score * weights['traceability']
|
|
941
|
+
)
|
|
942
|
+
|
|
943
|
+
def is_production_ready(self) -> bool:
|
|
944
|
+
"""Check if code meets production standards."""
|
|
945
|
+
return (
|
|
946
|
+
self.test_coverage >= 85 and
|
|
947
|
+
self.code_quality >= 8.0 and
|
|
948
|
+
self.consistency_score >= 90 and
|
|
949
|
+
self.security_score == 100 and
|
|
950
|
+
self.traceability_score >= 80
|
|
951
|
+
)
|
|
952
|
+
```
|
|
953
|
+
|
|
954
|
+
---
|
|
955
|
+
|
|
956
|
+
## Works Well With
|
|
957
|
+
|
|
958
|
+
Agents:
|
|
959
|
+
- quality-gate - Automated TRUST 5 validation
|
|
960
|
+
- tdd-implementer - RED-GREEN-REFACTOR enforcement
|
|
961
|
+
- security-expert - OWASP compliance checking
|
|
962
|
+
- test-engineer - Test generation and coverage
|
|
963
|
+
|
|
964
|
+
Skills:
|
|
965
|
+
- moai-essentials-testing-integration - Test framework setup
|
|
966
|
+
- moai-domain-security - Security patterns
|
|
967
|
+
- moai-core-code-reviewer - Code quality analysis
|
|
968
|
+
|
|
969
|
+
Commands:
|
|
970
|
+
- /moai:2-run - Enforces ≥85% coverage requirement
|
|
971
|
+
- /moai:9-feedback - Quality improvement suggestions
|
|
972
|
+
|
|
973
|
+
Memory:
|
|
974
|
+
- Skill("moai-foundation-core") modules/execution-rules.md - Quality gates
|
|
975
|
+
- @.moai/config/config.yaml - constitution.test_coverage_target
|
|
976
|
+
|
|
977
|
+
---
|
|
978
|
+
|
|
979
|
+
Version: 1.0.0
|
|
980
|
+
Last Updated: 2025-11-25
|
|
981
|
+
Status: Production Ready
|