moai-adk 0.11.0__py3-none-any.whl → 0.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/core/issue_creator.py +2 -2
- moai_adk/core/project/detector.py +195 -12
- moai_adk/core/tags/ci_validator.py +1 -1
- moai_adk/core/tags/pre_commit_validator.py +1 -1
- moai_adk/core/tags/validator.py +1 -1
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +316 -0
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +208 -0
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +214 -0
- moai_adk/templates/.claude/agents/alfred/git-manager.md +406 -0
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +350 -0
- moai_adk/templates/.claude/agents/alfred/project-manager.md +273 -0
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +343 -0
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +865 -0
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +287 -0
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +287 -0
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +326 -0
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +375 -0
- moai_adk/templates/.claude/commands/alfred/0-project.md +1275 -0
- moai_adk/templates/.claude/commands/alfred/1-plan.md +734 -0
- moai_adk/templates/.claude/commands/alfred/2-run.md +551 -0
- moai_adk/templates/.claude/commands/alfred/3-sync.md +689 -0
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +149 -0
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +206 -0
- moai_adk/templates/.claude/hooks/alfred/core/project.py +742 -0
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +95 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +95 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +101 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +95 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +97 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +170 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +271 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +67 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +230 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +174 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +87 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +61 -0
- moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +95 -0
- moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +95 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +111 -0
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +136 -0
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +640 -0
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +696 -0
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +474 -0
- moai_adk/templates/.claude/settings.json +144 -0
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +122 -0
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +237 -0
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +615 -0
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +653 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +269 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +32 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +26 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +21 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +252 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +24 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +199 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +39 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +18 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +263 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +30 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +15 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +1633 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +660 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +303 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +1064 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +1047 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +116 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +122 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +1099 -0
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +125 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +32 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +431 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +624 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +316 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +124 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +123 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +127 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +34 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +482 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +278 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +524 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +477 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +429 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +391 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +431 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +577 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +271 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +466 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +583 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +526 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +465 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +328 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +312 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +245 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +285 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +278 -0
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +303 -0
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +137 -0
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +219 -0
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +161 -0
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +541 -0
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +622 -0
- moai_adk/templates/.github/workflows/c-tag-validation.yml +83 -0
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +79 -0
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +65 -0
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +82 -0
- moai_adk/templates/.github/workflows/java-tag-validation.yml +75 -0
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +67 -0
- moai_adk/templates/.github/workflows/php-tag-validation.yml +56 -0
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +68 -0
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +73 -0
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +65 -0
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +79 -0
- moai_adk/templates/.moai/config.json +113 -0
- moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +208 -0
- moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +369 -0
- moai_adk/templates/.moai/memory/CLAUDE-RULES.md +539 -0
- moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +344 -0
- moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +330 -0
- moai_adk/templates/.moai/memory/ISSUE-LABEL-MAPPING.md +150 -0
- moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +218 -0
- moai_adk/templates/.moai/memory/SPEC-METADATA.md +356 -0
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +330 -0
- moai_adk/templates/.moai/memory/spec-metadata.md +356 -0
- moai_adk/templates/.moai/project/product.md +161 -0
- moai_adk/templates/.moai/project/structure.md +156 -0
- moai_adk/templates/.moai/project/tech.md +227 -0
- moai_adk/templates/CLAUDE.md +90 -10
- moai_adk/templates/workflows/go-tag-validation.yml +130 -0
- moai_adk/templates/workflows/javascript-tag-validation.yml +135 -0
- moai_adk/templates/workflows/python-tag-validation.yml +118 -0
- moai_adk/templates/workflows/typescript-tag-validation.yml +154 -0
- {moai_adk-0.11.0.dist-info → moai_adk-0.12.0.dist-info}/METADATA +43 -1
- moai_adk-0.12.0.dist-info/RECORD +330 -0
- moai_adk-0.11.0.dist-info/RECORD +0 -77
- /moai_adk/templates/.github/workflows/{release.yml → moai-adk-release.yml} +0 -0
- /moai_adk/templates/.github/workflows/{spec-issue-sync.yml → moai-adk-spec-issue-sync.yml} +0 -0
- /moai_adk/templates/.github/workflows/{tag-validation.yml → moai-adk-tag-validation.yml} +0 -0
- {moai_adk-0.11.0.dist-info → moai_adk-0.12.0.dist-info}/WHEEL +0 -0
- {moai_adk-0.11.0.dist-info → moai_adk-0.12.0.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.11.0.dist-info → moai_adk-0.12.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1099 @@
|
|
|
1
|
+
# TRUST Validation Reference Guide
|
|
2
|
+
|
|
3
|
+
## Quick Reference
|
|
4
|
+
|
|
5
|
+
This document provides comprehensive CLI commands, configuration templates, and tool setup instructions for implementing TRUST 5-principles validation across all supported languages.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## T - Test First: CLI Command Matrix
|
|
10
|
+
|
|
11
|
+
### Python (pytest 8.4.2)
|
|
12
|
+
|
|
13
|
+
**Installation**:
|
|
14
|
+
```bash
|
|
15
|
+
pip install pytest==8.4.2 pytest-cov==5.0.0 pytest-xdist==3.6.1
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Basic Coverage**:
|
|
19
|
+
```bash
|
|
20
|
+
pytest --cov=src --cov-report=term-missing
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Coverage with Threshold**:
|
|
24
|
+
```bash
|
|
25
|
+
pytest --cov=src --cov-report=term-missing --cov-fail-under=85
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Coverage Reports (Multiple Formats)**:
|
|
29
|
+
```bash
|
|
30
|
+
pytest --cov=src --cov-report=html --cov-report=xml --cov-report=term
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Parallel Execution**:
|
|
34
|
+
```bash
|
|
35
|
+
pytest -n auto --cov=src --cov-report=term-missing
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Configuration** (`pyproject.toml`):
|
|
39
|
+
```toml
|
|
40
|
+
[tool.pytest.ini_options]
|
|
41
|
+
testpaths = ["tests"]
|
|
42
|
+
python_files = ["test_*.py", "*_test.py"]
|
|
43
|
+
addopts = [
|
|
44
|
+
"--cov=src",
|
|
45
|
+
"--cov-report=term-missing",
|
|
46
|
+
"--cov-fail-under=85",
|
|
47
|
+
"--strict-markers",
|
|
48
|
+
"--disable-warnings"
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[tool.coverage.run]
|
|
52
|
+
branch = true
|
|
53
|
+
source = ["src"]
|
|
54
|
+
omit = ["*/tests/*", "*/migrations/*", "*/__pycache__/*"]
|
|
55
|
+
|
|
56
|
+
[tool.coverage.report]
|
|
57
|
+
exclude_lines = [
|
|
58
|
+
"pragma: no cover",
|
|
59
|
+
"def __repr__",
|
|
60
|
+
"raise AssertionError",
|
|
61
|
+
"raise NotImplementedError",
|
|
62
|
+
"if __name__ == .__main__.:",
|
|
63
|
+
"if TYPE_CHECKING:",
|
|
64
|
+
]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### TypeScript/JavaScript (Vitest 2.0.5)
|
|
70
|
+
|
|
71
|
+
**Installation**:
|
|
72
|
+
```bash
|
|
73
|
+
npm install -D vitest@2.0.5 @vitest/coverage-v8@2.0.5
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Basic Coverage**:
|
|
77
|
+
```bash
|
|
78
|
+
vitest run --coverage
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Coverage with Threshold**:
|
|
82
|
+
```bash
|
|
83
|
+
vitest run --coverage --coverage.thresholds.lines=85 --coverage.thresholds.branches=80
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Watch Mode**:
|
|
87
|
+
```bash
|
|
88
|
+
vitest --coverage --watch
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Configuration** (`vitest.config.ts`):
|
|
92
|
+
```typescript
|
|
93
|
+
import { defineConfig } from 'vitest/config';
|
|
94
|
+
|
|
95
|
+
export default defineConfig({
|
|
96
|
+
test: {
|
|
97
|
+
globals: true,
|
|
98
|
+
environment: 'node',
|
|
99
|
+
coverage: {
|
|
100
|
+
provider: 'v8',
|
|
101
|
+
reporter: ['text', 'html', 'lcov'],
|
|
102
|
+
exclude: [
|
|
103
|
+
'node_modules/',
|
|
104
|
+
'dist/',
|
|
105
|
+
'**/*.spec.ts',
|
|
106
|
+
'**/*.test.ts',
|
|
107
|
+
'**/types/**',
|
|
108
|
+
],
|
|
109
|
+
thresholds: {
|
|
110
|
+
lines: 85,
|
|
111
|
+
branches: 80,
|
|
112
|
+
functions: 85,
|
|
113
|
+
statements: 85,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
### JavaScript (Jest 29.x)
|
|
123
|
+
|
|
124
|
+
**Installation**:
|
|
125
|
+
```bash
|
|
126
|
+
npm install -D jest@29 @types/jest
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Basic Coverage**:
|
|
130
|
+
```bash
|
|
131
|
+
jest --coverage
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Coverage with Threshold**:
|
|
135
|
+
```bash
|
|
136
|
+
jest --coverage --coverageThreshold='{"global":{"lines":85,"branches":80}}'
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Configuration** (`jest.config.js`):
|
|
140
|
+
```javascript
|
|
141
|
+
module.exports = {
|
|
142
|
+
testEnvironment: 'node',
|
|
143
|
+
collectCoverageFrom: [
|
|
144
|
+
'src/**/*.{js,jsx}',
|
|
145
|
+
'!src/**/*.test.{js,jsx}',
|
|
146
|
+
'!src/**/__tests__/**',
|
|
147
|
+
],
|
|
148
|
+
coverageThreshold: {
|
|
149
|
+
global: {
|
|
150
|
+
lines: 85,
|
|
151
|
+
branches: 80,
|
|
152
|
+
functions: 85,
|
|
153
|
+
statements: 85,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
coverageReporters: ['text', 'html', 'lcov'],
|
|
157
|
+
};
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### Go (testing 1.23)
|
|
163
|
+
|
|
164
|
+
**Basic Tests**:
|
|
165
|
+
```bash
|
|
166
|
+
go test ./...
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Coverage Report**:
|
|
170
|
+
```bash
|
|
171
|
+
go test ./... -cover -coverprofile=coverage.out
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Coverage by Package**:
|
|
175
|
+
```bash
|
|
176
|
+
go test ./... -coverprofile=coverage.out -covermode=atomic
|
|
177
|
+
go tool cover -html=coverage.out -o coverage.html
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Coverage Threshold Check**:
|
|
181
|
+
```bash
|
|
182
|
+
# Custom script for threshold enforcement
|
|
183
|
+
go test ./... -coverprofile=coverage.out -covermode=atomic
|
|
184
|
+
go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//' | awk '{if($1<85)exit 1}'
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Makefile Example**:
|
|
188
|
+
```makefile
|
|
189
|
+
.PHONY: test coverage
|
|
190
|
+
|
|
191
|
+
test:
|
|
192
|
+
go test -v ./...
|
|
193
|
+
|
|
194
|
+
coverage:
|
|
195
|
+
go test -coverprofile=coverage.out -covermode=atomic ./...
|
|
196
|
+
go tool cover -html=coverage.out -o coverage.html
|
|
197
|
+
@echo "Coverage report: coverage.html"
|
|
198
|
+
|
|
199
|
+
coverage-check:
|
|
200
|
+
@go test -coverprofile=coverage.out -covermode=atomic ./...
|
|
201
|
+
@go tool cover -func=coverage.out | grep total | awk '{print "Total coverage: " $$3}'
|
|
202
|
+
@go tool cover -func=coverage.out | grep total | awk '{print $$3}' | sed 's/%//' | \
|
|
203
|
+
awk '{if($$1<85){print "FAIL: Coverage below 85%"; exit 1}else{print "PASS: Coverage >= 85%"}}'
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### Rust (cargo test 1.82.0)
|
|
209
|
+
|
|
210
|
+
**Basic Tests**:
|
|
211
|
+
```bash
|
|
212
|
+
cargo test
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Coverage with tarpaulin**:
|
|
216
|
+
```bash
|
|
217
|
+
cargo install cargo-tarpaulin
|
|
218
|
+
cargo tarpaulin --out Xml --output-dir coverage/ --fail-under 85
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Coverage with HTML Report**:
|
|
222
|
+
```bash
|
|
223
|
+
cargo tarpaulin --out Html --output-dir coverage/
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Configuration** (`Cargo.toml`):
|
|
227
|
+
```toml
|
|
228
|
+
[package]
|
|
229
|
+
name = "my-project"
|
|
230
|
+
version = "0.1.0"
|
|
231
|
+
|
|
232
|
+
[dependencies]
|
|
233
|
+
|
|
234
|
+
[dev-dependencies]
|
|
235
|
+
|
|
236
|
+
[profile.test]
|
|
237
|
+
opt-level = 0
|
|
238
|
+
|
|
239
|
+
# Coverage configuration
|
|
240
|
+
[package.metadata.tarpaulin]
|
|
241
|
+
exclude-files = ["target/*", "tests/*"]
|
|
242
|
+
out = ["Html", "Xml"]
|
|
243
|
+
output-dir = "coverage/"
|
|
244
|
+
fail-under = 85
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### Java/Kotlin (JUnit 5.10.x + JaCoCo)
|
|
250
|
+
|
|
251
|
+
**Gradle Configuration** (`build.gradle.kts`):
|
|
252
|
+
```kotlin
|
|
253
|
+
plugins {
|
|
254
|
+
kotlin("jvm") version "1.9.22"
|
|
255
|
+
jacoco
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
jacoco {
|
|
259
|
+
toolVersion = "0.8.11"
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
tasks.test {
|
|
263
|
+
useJUnitPlatform()
|
|
264
|
+
finalizedBy(tasks.jacocoTestReport)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
tasks.jacocoTestReport {
|
|
268
|
+
dependsOn(tasks.test)
|
|
269
|
+
reports {
|
|
270
|
+
xml.required.set(true)
|
|
271
|
+
html.required.set(true)
|
|
272
|
+
csv.required.set(false)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
tasks.jacocoTestCoverageVerification {
|
|
277
|
+
violationRules {
|
|
278
|
+
rule {
|
|
279
|
+
limit {
|
|
280
|
+
minimum = "0.85".toBigDecimal()
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Commands**:
|
|
288
|
+
```bash
|
|
289
|
+
./gradlew test jacocoTestReport
|
|
290
|
+
./gradlew jacocoTestCoverageVerification
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## R - Readable: Linting & Formatting
|
|
296
|
+
|
|
297
|
+
### Python (ruff 0.6.x)
|
|
298
|
+
|
|
299
|
+
**Installation**:
|
|
300
|
+
```bash
|
|
301
|
+
pip install ruff==0.6.8
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**Commands**:
|
|
305
|
+
```bash
|
|
306
|
+
ruff check . # Check only
|
|
307
|
+
ruff check . --fix # Auto-fix
|
|
308
|
+
ruff format . # Format code
|
|
309
|
+
ruff check . --statistics # Show statistics
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Configuration** (`pyproject.toml`):
|
|
313
|
+
```toml
|
|
314
|
+
[tool.ruff]
|
|
315
|
+
line-length = 100
|
|
316
|
+
target-version = "py311"
|
|
317
|
+
|
|
318
|
+
[tool.ruff.lint]
|
|
319
|
+
select = [
|
|
320
|
+
"E", # pycodestyle errors
|
|
321
|
+
"W", # pycodestyle warnings
|
|
322
|
+
"F", # pyflakes
|
|
323
|
+
"I", # isort
|
|
324
|
+
"N", # pep8-naming
|
|
325
|
+
"UP", # pyupgrade
|
|
326
|
+
"B", # flake8-bugbear
|
|
327
|
+
"C4", # flake8-comprehensions
|
|
328
|
+
"SIM", # flake8-simplify
|
|
329
|
+
]
|
|
330
|
+
ignore = ["E501"] # line too long (handled by formatter)
|
|
331
|
+
|
|
332
|
+
[tool.ruff.lint.per-file-ignores]
|
|
333
|
+
"__init__.py" = ["F401"] # unused imports
|
|
334
|
+
"tests/**" = ["S101"] # allow assert in tests
|
|
335
|
+
|
|
336
|
+
[tool.ruff.lint.mccabe]
|
|
337
|
+
max-complexity = 10
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
### TypeScript/JavaScript (Biome 1.9.x)
|
|
343
|
+
|
|
344
|
+
**Installation**:
|
|
345
|
+
```bash
|
|
346
|
+
npm install -D @biomejs/biome@1.9.0
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Commands**:
|
|
350
|
+
```bash
|
|
351
|
+
biome check . # Check all
|
|
352
|
+
biome check --apply . # Auto-fix
|
|
353
|
+
biome format . # Format only
|
|
354
|
+
biome lint . # Lint only
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Configuration** (`biome.json`):
|
|
358
|
+
```json
|
|
359
|
+
{
|
|
360
|
+
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
|
|
361
|
+
"organizeImports": {
|
|
362
|
+
"enabled": true
|
|
363
|
+
},
|
|
364
|
+
"linter": {
|
|
365
|
+
"enabled": true,
|
|
366
|
+
"rules": {
|
|
367
|
+
"recommended": true,
|
|
368
|
+
"complexity": {
|
|
369
|
+
"noExtraBooleanCast": "error",
|
|
370
|
+
"noMultipleSpacesInRegularExpressionLiterals": "error",
|
|
371
|
+
"noUselessCatch": "error",
|
|
372
|
+
"noUselessConstructor": "error"
|
|
373
|
+
},
|
|
374
|
+
"correctness": {
|
|
375
|
+
"noUnusedVariables": "error",
|
|
376
|
+
"useExhaustiveDependencies": "warn"
|
|
377
|
+
},
|
|
378
|
+
"suspicious": {
|
|
379
|
+
"noExplicitAny": "warn"
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
"formatter": {
|
|
384
|
+
"enabled": true,
|
|
385
|
+
"formatWithErrors": false,
|
|
386
|
+
"indentStyle": "space",
|
|
387
|
+
"indentWidth": 2,
|
|
388
|
+
"lineWidth": 100
|
|
389
|
+
},
|
|
390
|
+
"javascript": {
|
|
391
|
+
"formatter": {
|
|
392
|
+
"quoteStyle": "single",
|
|
393
|
+
"semicolons": "always"
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
### Go (golangci-lint 1.60.x)
|
|
402
|
+
|
|
403
|
+
**Installation**:
|
|
404
|
+
```bash
|
|
405
|
+
# Binary installation
|
|
406
|
+
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.60.3
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Commands**:
|
|
410
|
+
```bash
|
|
411
|
+
golangci-lint run # Run all linters
|
|
412
|
+
golangci-lint run --fix # Auto-fix
|
|
413
|
+
golangci-lint run --enable-all # Enable all linters
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Configuration** (`.golangci.yml`):
|
|
417
|
+
```yaml
|
|
418
|
+
run:
|
|
419
|
+
timeout: 5m
|
|
420
|
+
tests: true
|
|
421
|
+
|
|
422
|
+
linters:
|
|
423
|
+
enable:
|
|
424
|
+
- gofmt
|
|
425
|
+
- goimports
|
|
426
|
+
- govet
|
|
427
|
+
- staticcheck
|
|
428
|
+
- errcheck
|
|
429
|
+
- gosimple
|
|
430
|
+
- ineffassign
|
|
431
|
+
- unused
|
|
432
|
+
- misspell
|
|
433
|
+
- gocyclo
|
|
434
|
+
- dupl
|
|
435
|
+
- goconst
|
|
436
|
+
- gocognit
|
|
437
|
+
|
|
438
|
+
linters-settings:
|
|
439
|
+
gocyclo:
|
|
440
|
+
min-complexity: 10
|
|
441
|
+
dupl:
|
|
442
|
+
threshold: 100
|
|
443
|
+
goconst:
|
|
444
|
+
min-len: 3
|
|
445
|
+
min-occurrences: 3
|
|
446
|
+
gocognit:
|
|
447
|
+
min-complexity: 15
|
|
448
|
+
|
|
449
|
+
issues:
|
|
450
|
+
exclude-use-default: false
|
|
451
|
+
max-issues-per-linter: 0
|
|
452
|
+
max-same-issues: 0
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
### Rust (clippy 1.82.0)
|
|
458
|
+
|
|
459
|
+
**Commands**:
|
|
460
|
+
```bash
|
|
461
|
+
cargo clippy # Basic check
|
|
462
|
+
cargo clippy -- -D warnings # Treat warnings as errors
|
|
463
|
+
cargo clippy --all-targets # Check all targets
|
|
464
|
+
cargo fmt # Format code
|
|
465
|
+
cargo fmt -- --check # Check formatting
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
**Configuration** (`clippy.toml`):
|
|
469
|
+
```toml
|
|
470
|
+
# Clippy configuration
|
|
471
|
+
disallowed-methods = [
|
|
472
|
+
"std::env::set_var",
|
|
473
|
+
]
|
|
474
|
+
|
|
475
|
+
cognitive-complexity-threshold = 10
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
## U - Unified: Type Checking
|
|
481
|
+
|
|
482
|
+
### Python (mypy 1.11.x)
|
|
483
|
+
|
|
484
|
+
**Installation**:
|
|
485
|
+
```bash
|
|
486
|
+
pip install mypy==1.11.2
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
**Commands**:
|
|
490
|
+
```bash
|
|
491
|
+
mypy src/ # Check src directory
|
|
492
|
+
mypy src/ --strict # Strict mode
|
|
493
|
+
mypy src/ --no-error-summary # Quiet mode
|
|
494
|
+
mypy src/ --install-types # Install missing type stubs
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**Configuration** (`pyproject.toml`):
|
|
498
|
+
```toml
|
|
499
|
+
[tool.mypy]
|
|
500
|
+
python_version = "3.11"
|
|
501
|
+
strict = true
|
|
502
|
+
warn_return_any = true
|
|
503
|
+
warn_unused_configs = true
|
|
504
|
+
disallow_untyped_defs = true
|
|
505
|
+
disallow_any_generics = true
|
|
506
|
+
check_untyped_defs = true
|
|
507
|
+
no_implicit_optional = true
|
|
508
|
+
warn_redundant_casts = true
|
|
509
|
+
warn_unused_ignores = true
|
|
510
|
+
warn_no_return = true
|
|
511
|
+
warn_unreachable = true
|
|
512
|
+
|
|
513
|
+
[[tool.mypy.overrides]]
|
|
514
|
+
module = "tests.*"
|
|
515
|
+
disallow_untyped_defs = false
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
### TypeScript (tsc 5.6.x)
|
|
521
|
+
|
|
522
|
+
**Commands**:
|
|
523
|
+
```bash
|
|
524
|
+
tsc --noEmit # Type check only
|
|
525
|
+
tsc --noEmit --strict # Strict mode
|
|
526
|
+
tsc --noEmit --watch # Watch mode
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
**Configuration** (`tsconfig.json`):
|
|
530
|
+
```json
|
|
531
|
+
{
|
|
532
|
+
"compilerOptions": {
|
|
533
|
+
"target": "ES2022",
|
|
534
|
+
"module": "ESNext",
|
|
535
|
+
"lib": ["ES2022"],
|
|
536
|
+
"strict": true,
|
|
537
|
+
"noImplicitAny": true,
|
|
538
|
+
"strictNullChecks": true,
|
|
539
|
+
"strictFunctionTypes": true,
|
|
540
|
+
"strictBindCallApply": true,
|
|
541
|
+
"strictPropertyInitialization": true,
|
|
542
|
+
"noImplicitThis": true,
|
|
543
|
+
"alwaysStrict": true,
|
|
544
|
+
"noUnusedLocals": true,
|
|
545
|
+
"noUnusedParameters": true,
|
|
546
|
+
"noImplicitReturns": true,
|
|
547
|
+
"noFallthroughCasesInSwitch": true,
|
|
548
|
+
"esModuleInterop": true,
|
|
549
|
+
"skipLibCheck": true,
|
|
550
|
+
"forceConsistentCasingInFileNames": true
|
|
551
|
+
},
|
|
552
|
+
"include": ["src/**/*"],
|
|
553
|
+
"exclude": ["node_modules", "dist"]
|
|
554
|
+
}
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## S - Secured: SAST Tools
|
|
560
|
+
|
|
561
|
+
### detect-secrets 1.4.x
|
|
562
|
+
|
|
563
|
+
**Installation**:
|
|
564
|
+
```bash
|
|
565
|
+
pip install detect-secrets==1.4.0
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
**Commands**:
|
|
569
|
+
```bash
|
|
570
|
+
# Create baseline
|
|
571
|
+
detect-secrets scan > .secrets.baseline
|
|
572
|
+
|
|
573
|
+
# Scan against baseline
|
|
574
|
+
detect-secrets scan --baseline .secrets.baseline
|
|
575
|
+
|
|
576
|
+
# Audit findings
|
|
577
|
+
detect-secrets audit .secrets.baseline
|
|
578
|
+
|
|
579
|
+
# Update baseline
|
|
580
|
+
detect-secrets scan --baseline .secrets.baseline --update
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
**Pre-commit Hook** (`.pre-commit-config.yaml`):
|
|
584
|
+
```yaml
|
|
585
|
+
repos:
|
|
586
|
+
- repo: https://github.com/Yelp/detect-secrets
|
|
587
|
+
rev: v1.4.0
|
|
588
|
+
hooks:
|
|
589
|
+
- id: detect-secrets
|
|
590
|
+
args: ['--baseline', '.secrets.baseline']
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
### Trivy 0.56.x
|
|
596
|
+
|
|
597
|
+
**Installation**:
|
|
598
|
+
```bash
|
|
599
|
+
# macOS
|
|
600
|
+
brew install aquasecurity/trivy/trivy
|
|
601
|
+
|
|
602
|
+
# Linux
|
|
603
|
+
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
|
|
604
|
+
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
|
|
605
|
+
sudo apt-get update
|
|
606
|
+
sudo apt-get install trivy
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
**Commands**:
|
|
610
|
+
```bash
|
|
611
|
+
# Filesystem scan
|
|
612
|
+
trivy fs .
|
|
613
|
+
|
|
614
|
+
# Scan with severity filter
|
|
615
|
+
trivy fs --severity HIGH,CRITICAL .
|
|
616
|
+
|
|
617
|
+
# Exit on vulnerabilities
|
|
618
|
+
trivy fs --severity HIGH,CRITICAL --exit-code 1 .
|
|
619
|
+
|
|
620
|
+
# Output formats
|
|
621
|
+
trivy fs --format json --output result.json .
|
|
622
|
+
trivy fs --format sarif --output result.sarif .
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
**Configuration** (`trivy.yaml`):
|
|
626
|
+
```yaml
|
|
627
|
+
severity: HIGH,CRITICAL
|
|
628
|
+
exit-code: 1
|
|
629
|
+
timeout: 5m
|
|
630
|
+
cache:
|
|
631
|
+
dir: .trivy-cache
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
### Semgrep 1.94.x
|
|
637
|
+
|
|
638
|
+
**Installation**:
|
|
639
|
+
```bash
|
|
640
|
+
pip install semgrep==1.94.0
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
**Commands**:
|
|
644
|
+
```bash
|
|
645
|
+
# Auto configuration (recommended)
|
|
646
|
+
semgrep --config=auto .
|
|
647
|
+
|
|
648
|
+
# Specific rulesets
|
|
649
|
+
semgrep --config=p/owasp-top-ten .
|
|
650
|
+
semgrep --config=p/security-audit .
|
|
651
|
+
|
|
652
|
+
# Exit on findings
|
|
653
|
+
semgrep --config=auto --error .
|
|
654
|
+
|
|
655
|
+
# Output formats
|
|
656
|
+
semgrep --config=auto --json --output=results.json .
|
|
657
|
+
semgrep --config=auto --sarif --output=results.sarif .
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**Configuration** (`.semgrep.yml`):
|
|
661
|
+
```yaml
|
|
662
|
+
rules:
|
|
663
|
+
- id: hardcoded-secret
|
|
664
|
+
pattern: |
|
|
665
|
+
password = "..."
|
|
666
|
+
message: Hardcoded password detected
|
|
667
|
+
severity: ERROR
|
|
668
|
+
languages: [python, javascript, typescript]
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
---
|
|
672
|
+
|
|
673
|
+
### Bandit 1.7.x (Python)
|
|
674
|
+
|
|
675
|
+
**Installation**:
|
|
676
|
+
```bash
|
|
677
|
+
pip install bandit==1.7.9
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
**Commands**:
|
|
681
|
+
```bash
|
|
682
|
+
bandit -r src/ # Scan src directory
|
|
683
|
+
bandit -r src/ -ll # High severity only
|
|
684
|
+
bandit -r src/ -f json # JSON output
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
**Configuration** (`.bandit`):
|
|
688
|
+
```yaml
|
|
689
|
+
exclude_dirs:
|
|
690
|
+
- /tests
|
|
691
|
+
- /venv
|
|
692
|
+
|
|
693
|
+
tests:
|
|
694
|
+
- B201 # flask_debug_true
|
|
695
|
+
- B301 # pickle
|
|
696
|
+
- B302 # marshal
|
|
697
|
+
- B303 # md5
|
|
698
|
+
- B304 # ciphers
|
|
699
|
+
- B305 # cipher_modes
|
|
700
|
+
- B306 # mktemp_q
|
|
701
|
+
- B307 # eval
|
|
702
|
+
- B308 # mark_safe
|
|
703
|
+
- B309 # httpsconnection
|
|
704
|
+
- B310 # urllib_urlopen
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
---
|
|
708
|
+
|
|
709
|
+
## T - Trackable: TAG Validation
|
|
710
|
+
|
|
711
|
+
### TAG Scanning Commands
|
|
712
|
+
|
|
713
|
+
**Find all TAGs**:
|
|
714
|
+
```bash
|
|
715
|
+
rg '@(SPEC|TEST|CODE|DOC):' -n .moai/specs/ tests/ src/ docs/
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
**Find specific TAG**:
|
|
719
|
+
```bash
|
|
720
|
+
rg '@CODE:AUTH-001' -n src/
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
**Find orphaned TAGs** (CODE without SPEC):
|
|
724
|
+
```bash
|
|
725
|
+
# 1. Extract all CODE TAGs
|
|
726
|
+
rg '@CODE:([A-Z]+-\d+)' -or '$1' src/ | sort -u > code_tags.txt
|
|
727
|
+
|
|
728
|
+
# 2. Extract all SPEC TAGs
|
|
729
|
+
rg '@SPEC:([A-Z]+-\d+)' -or '$1' .moai/specs/ | sort -u > spec_tags.txt
|
|
730
|
+
|
|
731
|
+
# 3. Find orphans (in CODE but not in SPEC)
|
|
732
|
+
comm -23 code_tags.txt spec_tags.txt
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
**TAG Chain Validation Script** (`scripts/validate-tags.sh`):
|
|
736
|
+
```bash
|
|
737
|
+
#!/bin/bash
|
|
738
|
+
set -e
|
|
739
|
+
|
|
740
|
+
echo "Validating TAG chains..."
|
|
741
|
+
|
|
742
|
+
# Find all TAGs
|
|
743
|
+
ALL_TAGS=$(rg '@(SPEC|TEST|CODE|DOC):([A-Z]+-\d+)' -or '$2' .moai/specs/ tests/ src/ docs/ 2>/dev/null | sort -u)
|
|
744
|
+
|
|
745
|
+
ERRORS=0
|
|
746
|
+
|
|
747
|
+
for TAG in $ALL_TAGS; do
|
|
748
|
+
SPEC_COUNT=$(rg "@SPEC:$TAG" -c .moai/specs/ 2>/dev/null | awk -F: '{sum+=$2} END {print sum}')
|
|
749
|
+
CODE_COUNT=$(rg "@CODE:$TAG" -c src/ 2>/dev/null | awk -F: '{sum+=$2} END {print sum}')
|
|
750
|
+
TEST_COUNT=$(rg "@TEST:$TAG" -c tests/ 2>/dev/null | awk -F: '{sum+=$2} END {print sum}')
|
|
751
|
+
|
|
752
|
+
echo "TAG $TAG: SPEC=$SPEC_COUNT CODE=$CODE_COUNT TEST=$TEST_COUNT"
|
|
753
|
+
|
|
754
|
+
if [ "$CODE_COUNT" -gt 0 ] && [ "$SPEC_COUNT" -eq 0 ]; then
|
|
755
|
+
echo " ERROR: CODE exists but SPEC missing"
|
|
756
|
+
ERRORS=$((ERRORS + 1))
|
|
757
|
+
fi
|
|
758
|
+
|
|
759
|
+
if [ "$CODE_COUNT" -gt 0 ] && [ "$TEST_COUNT" -eq 0 ]; then
|
|
760
|
+
echo " WARNING: CODE exists but TEST missing"
|
|
761
|
+
fi
|
|
762
|
+
done
|
|
763
|
+
|
|
764
|
+
if [ $ERRORS -gt 0 ]; then
|
|
765
|
+
echo "TAG validation FAILED with $ERRORS errors"
|
|
766
|
+
exit 1
|
|
767
|
+
fi
|
|
768
|
+
|
|
769
|
+
echo "TAG validation PASSED"
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
## CI/CD Integration Examples
|
|
775
|
+
|
|
776
|
+
### GitHub Actions (Python Project)
|
|
777
|
+
|
|
778
|
+
**File**: `.github/workflows/trust-check.yml`
|
|
779
|
+
|
|
780
|
+
```yaml
|
|
781
|
+
name: TRUST Validation
|
|
782
|
+
|
|
783
|
+
on:
|
|
784
|
+
pull_request:
|
|
785
|
+
push:
|
|
786
|
+
branches: [main, develop]
|
|
787
|
+
|
|
788
|
+
jobs:
|
|
789
|
+
trust-gate:
|
|
790
|
+
runs-on: ubuntu-latest
|
|
791
|
+
|
|
792
|
+
steps:
|
|
793
|
+
- name: Checkout code
|
|
794
|
+
uses: actions/checkout@v4
|
|
795
|
+
|
|
796
|
+
- name: Set up Python
|
|
797
|
+
uses: actions/setup-python@v5
|
|
798
|
+
with:
|
|
799
|
+
python-version: '3.11'
|
|
800
|
+
cache: 'pip'
|
|
801
|
+
|
|
802
|
+
- name: Install dependencies
|
|
803
|
+
run: |
|
|
804
|
+
pip install -r requirements.txt
|
|
805
|
+
pip install pytest pytest-cov ruff mypy detect-secrets
|
|
806
|
+
|
|
807
|
+
# T - Test First
|
|
808
|
+
- name: Run tests with coverage
|
|
809
|
+
run: |
|
|
810
|
+
pytest --cov=src --cov-report=xml --cov-report=term --cov-fail-under=85
|
|
811
|
+
|
|
812
|
+
- name: Upload coverage to Codecov
|
|
813
|
+
uses: codecov/codecov-action@v4
|
|
814
|
+
with:
|
|
815
|
+
file: ./coverage.xml
|
|
816
|
+
fail_ci_if_error: true
|
|
817
|
+
|
|
818
|
+
# R - Readable
|
|
819
|
+
- name: Lint with ruff
|
|
820
|
+
run: ruff check .
|
|
821
|
+
|
|
822
|
+
# U - Unified
|
|
823
|
+
- name: Type check with mypy
|
|
824
|
+
run: mypy src/ --strict
|
|
825
|
+
|
|
826
|
+
# S - Secured
|
|
827
|
+
- name: Scan for secrets
|
|
828
|
+
run: detect-secrets scan --baseline .secrets.baseline
|
|
829
|
+
|
|
830
|
+
- name: Security scan with Trivy
|
|
831
|
+
uses: aquasecurity/trivy-action@master
|
|
832
|
+
with:
|
|
833
|
+
scan-type: 'fs'
|
|
834
|
+
scan-ref: '.'
|
|
835
|
+
severity: 'HIGH,CRITICAL'
|
|
836
|
+
exit-code: '1'
|
|
837
|
+
|
|
838
|
+
- name: SAST with Semgrep
|
|
839
|
+
run: |
|
|
840
|
+
pip install semgrep
|
|
841
|
+
semgrep --config=auto --error .
|
|
842
|
+
|
|
843
|
+
# T - Trackable
|
|
844
|
+
- name: Validate TAG chains
|
|
845
|
+
run: |
|
|
846
|
+
chmod +x scripts/validate-tags.sh
|
|
847
|
+
./scripts/validate-tags.sh
|
|
848
|
+
|
|
849
|
+
- name: TRUST gate summary
|
|
850
|
+
if: always()
|
|
851
|
+
run: |
|
|
852
|
+
echo "## TRUST Validation Results" >> $GITHUB_STEP_SUMMARY
|
|
853
|
+
echo "- Test coverage: $(grep -oP 'TOTAL.*\K\d+%' coverage.txt || echo 'N/A')" >> $GITHUB_STEP_SUMMARY
|
|
854
|
+
echo "- Linting: $(ruff check . --statistics | tail -1)" >> $GITHUB_STEP_SUMMARY
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
---
|
|
858
|
+
|
|
859
|
+
### GitHub Actions (TypeScript Project)
|
|
860
|
+
|
|
861
|
+
**File**: `.github/workflows/trust-check.yml`
|
|
862
|
+
|
|
863
|
+
```yaml
|
|
864
|
+
name: TRUST Validation
|
|
865
|
+
|
|
866
|
+
on:
|
|
867
|
+
pull_request:
|
|
868
|
+
push:
|
|
869
|
+
branches: [main, develop]
|
|
870
|
+
|
|
871
|
+
jobs:
|
|
872
|
+
trust-gate:
|
|
873
|
+
runs-on: ubuntu-latest
|
|
874
|
+
|
|
875
|
+
steps:
|
|
876
|
+
- name: Checkout code
|
|
877
|
+
uses: actions/checkout@v4
|
|
878
|
+
|
|
879
|
+
- name: Setup Node.js
|
|
880
|
+
uses: actions/setup-node@v4
|
|
881
|
+
with:
|
|
882
|
+
node-version: '20'
|
|
883
|
+
cache: 'npm'
|
|
884
|
+
|
|
885
|
+
- name: Install dependencies
|
|
886
|
+
run: npm ci
|
|
887
|
+
|
|
888
|
+
# T - Test First
|
|
889
|
+
- name: Run tests with coverage
|
|
890
|
+
run: npm run test:coverage
|
|
891
|
+
|
|
892
|
+
- name: Check coverage threshold
|
|
893
|
+
run: |
|
|
894
|
+
COVERAGE=$(npx vitest run --coverage --reporter=json | jq '.coverage.lines.pct')
|
|
895
|
+
if (( $(echo "$COVERAGE < 85" | bc -l) )); then
|
|
896
|
+
echo "Coverage $COVERAGE% is below 85%"
|
|
897
|
+
exit 1
|
|
898
|
+
fi
|
|
899
|
+
|
|
900
|
+
# R - Readable
|
|
901
|
+
- name: Lint with Biome
|
|
902
|
+
run: npx biome check .
|
|
903
|
+
|
|
904
|
+
# U - Unified
|
|
905
|
+
- name: Type check
|
|
906
|
+
run: npm run type-check
|
|
907
|
+
|
|
908
|
+
# S - Secured
|
|
909
|
+
- name: Audit dependencies
|
|
910
|
+
run: npm audit --audit-level=high
|
|
911
|
+
|
|
912
|
+
- name: Security scan with Trivy
|
|
913
|
+
uses: aquasecurity/trivy-action@master
|
|
914
|
+
with:
|
|
915
|
+
scan-type: 'fs'
|
|
916
|
+
scan-ref: '.'
|
|
917
|
+
severity: 'HIGH,CRITICAL'
|
|
918
|
+
exit-code: '1'
|
|
919
|
+
|
|
920
|
+
# T - Trackable
|
|
921
|
+
- name: Validate TAG chains
|
|
922
|
+
run: |
|
|
923
|
+
chmod +x scripts/validate-tags.sh
|
|
924
|
+
./scripts/validate-tags.sh
|
|
925
|
+
```
|
|
926
|
+
|
|
927
|
+
---
|
|
928
|
+
|
|
929
|
+
## Local Pre-commit Hooks
|
|
930
|
+
|
|
931
|
+
### Python Project (`.git/hooks/pre-commit`)
|
|
932
|
+
|
|
933
|
+
```bash
|
|
934
|
+
#!/bin/bash
|
|
935
|
+
set -e
|
|
936
|
+
|
|
937
|
+
echo "Running TRUST validation..."
|
|
938
|
+
|
|
939
|
+
# T - Test First
|
|
940
|
+
echo "→ Running tests..."
|
|
941
|
+
pytest --cov=src --cov-fail-under=85 --quiet || exit 1
|
|
942
|
+
|
|
943
|
+
# R - Readable
|
|
944
|
+
echo "→ Linting..."
|
|
945
|
+
ruff check . || exit 1
|
|
946
|
+
|
|
947
|
+
# U - Unified
|
|
948
|
+
echo "→ Type checking..."
|
|
949
|
+
mypy src/ --strict || exit 1
|
|
950
|
+
|
|
951
|
+
# S - Secured
|
|
952
|
+
echo "→ Checking for secrets..."
|
|
953
|
+
detect-secrets scan --baseline .secrets.baseline || exit 1
|
|
954
|
+
|
|
955
|
+
echo "✓ TRUST validation passed"
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
### TypeScript Project (`.git/hooks/pre-commit`)
|
|
959
|
+
|
|
960
|
+
```bash
|
|
961
|
+
#!/bin/bash
|
|
962
|
+
set -e
|
|
963
|
+
|
|
964
|
+
echo "Running TRUST validation..."
|
|
965
|
+
|
|
966
|
+
# T - Test First
|
|
967
|
+
echo "→ Running tests..."
|
|
968
|
+
npm run test:coverage || exit 1
|
|
969
|
+
|
|
970
|
+
# R - Readable
|
|
971
|
+
echo "→ Linting..."
|
|
972
|
+
npx biome check . || exit 1
|
|
973
|
+
|
|
974
|
+
# U - Unified
|
|
975
|
+
echo "→ Type checking..."
|
|
976
|
+
npm run type-check || exit 1
|
|
977
|
+
|
|
978
|
+
# S - Secured
|
|
979
|
+
echo "→ Auditing dependencies..."
|
|
980
|
+
npm audit --audit-level=high || exit 1
|
|
981
|
+
|
|
982
|
+
echo "✓ TRUST validation passed"
|
|
983
|
+
```
|
|
984
|
+
|
|
985
|
+
---
|
|
986
|
+
|
|
987
|
+
## Makefile Automation
|
|
988
|
+
|
|
989
|
+
### Universal TRUST Makefile
|
|
990
|
+
|
|
991
|
+
```makefile
|
|
992
|
+
.PHONY: trust trust-test trust-lint trust-type trust-security trust-tags
|
|
993
|
+
|
|
994
|
+
# Run all TRUST checks
|
|
995
|
+
trust: trust-test trust-lint trust-type trust-security trust-tags
|
|
996
|
+
@echo "✓ All TRUST principles validated"
|
|
997
|
+
|
|
998
|
+
# T - Test First
|
|
999
|
+
trust-test:
|
|
1000
|
+
@echo "→ T - Test First (Coverage ≥85%)"
|
|
1001
|
+
@pytest --cov=src --cov-fail-under=85 --quiet || exit 1
|
|
1002
|
+
@echo "✓ Tests passed with adequate coverage"
|
|
1003
|
+
|
|
1004
|
+
# R - Readable
|
|
1005
|
+
trust-lint:
|
|
1006
|
+
@echo "→ R - Readable (Linting)"
|
|
1007
|
+
@ruff check . || exit 1
|
|
1008
|
+
@echo "✓ Code is readable and well-formatted"
|
|
1009
|
+
|
|
1010
|
+
# U - Unified
|
|
1011
|
+
trust-type:
|
|
1012
|
+
@echo "→ U - Unified (Type checking)"
|
|
1013
|
+
@mypy src/ --strict || exit 1
|
|
1014
|
+
@echo "✓ Type safety verified"
|
|
1015
|
+
|
|
1016
|
+
# S - Secured
|
|
1017
|
+
trust-security:
|
|
1018
|
+
@echo "→ S - Secured (Security scans)"
|
|
1019
|
+
@detect-secrets scan --baseline .secrets.baseline || exit 1
|
|
1020
|
+
@trivy fs --severity HIGH,CRITICAL --exit-code 1 . || exit 1
|
|
1021
|
+
@echo "✓ Security scans passed"
|
|
1022
|
+
|
|
1023
|
+
# T - Trackable
|
|
1024
|
+
trust-tags:
|
|
1025
|
+
@echo "→ T - Trackable (TAG validation)"
|
|
1026
|
+
@bash scripts/validate-tags.sh || exit 1
|
|
1027
|
+
@echo "✓ TAG chains validated"
|
|
1028
|
+
|
|
1029
|
+
# Quick check (fast subset)
|
|
1030
|
+
trust-quick: trust-lint trust-type
|
|
1031
|
+
@echo "✓ Quick TRUST check passed"
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
---
|
|
1035
|
+
|
|
1036
|
+
## Tool Version Management
|
|
1037
|
+
|
|
1038
|
+
### Python (requirements-dev.txt)
|
|
1039
|
+
|
|
1040
|
+
```txt
|
|
1041
|
+
# TRUST validation tools (2025-10-22)
|
|
1042
|
+
|
|
1043
|
+
# T - Test First
|
|
1044
|
+
pytest==8.4.2
|
|
1045
|
+
pytest-cov==5.0.0
|
|
1046
|
+
pytest-xdist==3.6.1
|
|
1047
|
+
|
|
1048
|
+
# R - Readable
|
|
1049
|
+
ruff==0.6.8
|
|
1050
|
+
|
|
1051
|
+
# U - Unified
|
|
1052
|
+
mypy==1.11.2
|
|
1053
|
+
|
|
1054
|
+
# S - Secured
|
|
1055
|
+
detect-secrets==1.4.0
|
|
1056
|
+
bandit==1.7.9
|
|
1057
|
+
semgrep==1.94.0
|
|
1058
|
+
```
|
|
1059
|
+
|
|
1060
|
+
### TypeScript (package.json)
|
|
1061
|
+
|
|
1062
|
+
```json
|
|
1063
|
+
{
|
|
1064
|
+
"devDependencies": {
|
|
1065
|
+
"@biomejs/biome": "^1.9.0",
|
|
1066
|
+
"@vitest/coverage-v8": "^2.0.5",
|
|
1067
|
+
"vitest": "^2.0.5",
|
|
1068
|
+
"typescript": "^5.6.0"
|
|
1069
|
+
},
|
|
1070
|
+
"scripts": {
|
|
1071
|
+
"test": "vitest run",
|
|
1072
|
+
"test:coverage": "vitest run --coverage",
|
|
1073
|
+
"test:watch": "vitest --watch",
|
|
1074
|
+
"lint": "biome check .",
|
|
1075
|
+
"lint:fix": "biome check --apply .",
|
|
1076
|
+
"type-check": "tsc --noEmit",
|
|
1077
|
+
"trust": "npm run test:coverage && npm run lint && npm run type-check"
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
```
|
|
1081
|
+
|
|
1082
|
+
---
|
|
1083
|
+
|
|
1084
|
+
## Additional Resources
|
|
1085
|
+
|
|
1086
|
+
- **pytest**: https://docs.pytest.org/
|
|
1087
|
+
- **Vitest**: https://vitest.dev/
|
|
1088
|
+
- **Jest**: https://jestjs.io/
|
|
1089
|
+
- **Go testing**: https://go.dev/doc/tutorial/add-a-test
|
|
1090
|
+
- **Rust testing**: https://doc.rust-lang.org/book/ch11-00-testing.html
|
|
1091
|
+
- **ruff**: https://docs.astral.sh/ruff/
|
|
1092
|
+
- **Biome**: https://biomejs.dev/
|
|
1093
|
+
- **golangci-lint**: https://golangci-lint.run/
|
|
1094
|
+
- **clippy**: https://github.com/rust-lang/rust-clippy
|
|
1095
|
+
- **mypy**: https://mypy.readthedocs.io/
|
|
1096
|
+
- **TypeScript**: https://www.typescriptlang.org/
|
|
1097
|
+
- **Trivy**: https://trivy.dev/
|
|
1098
|
+
- **detect-secrets**: https://github.com/Yelp/detect-secrets
|
|
1099
|
+
- **Semgrep**: https://semgrep.dev/
|