mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-05 01:50:27 +08:00
252 lines
7.5 KiB
JSON
252 lines
7.5 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"version": "1.0.0",
|
|
"description": "Test quality and code validation configuration for AI-generated code",
|
|
|
|
"code_validation": {
|
|
"description": "Pre-test validation for AI-generated code common errors",
|
|
"enabled": true,
|
|
"phases": {
|
|
"L0_compilation": {
|
|
"description": "TypeScript/JavaScript compilation check",
|
|
"enabled": true,
|
|
"commands": {
|
|
"typescript": "npx tsc --noEmit --skipLibCheck",
|
|
"javascript": "node --check"
|
|
},
|
|
"critical": true,
|
|
"failure_blocks_tests": true
|
|
},
|
|
"L0_imports": {
|
|
"description": "Import statement validation",
|
|
"enabled": true,
|
|
"checks": [
|
|
{
|
|
"id": "unresolved_imports",
|
|
"description": "Check for unresolved module imports",
|
|
"pattern": "Cannot find module|Module not found|Unable to resolve",
|
|
"severity": "critical"
|
|
},
|
|
{
|
|
"id": "circular_imports",
|
|
"description": "Check for circular dependencies",
|
|
"tool": "madge",
|
|
"command": "npx madge --circular --extensions ts,tsx,js,jsx",
|
|
"severity": "warning"
|
|
},
|
|
{
|
|
"id": "duplicate_imports",
|
|
"description": "Check for duplicate imports",
|
|
"eslint_rule": "import/no-duplicates",
|
|
"severity": "error"
|
|
},
|
|
{
|
|
"id": "unused_imports",
|
|
"description": "Check for unused imports",
|
|
"eslint_rule": "unused-imports/no-unused-imports",
|
|
"severity": "warning"
|
|
}
|
|
]
|
|
},
|
|
"L0_variables": {
|
|
"description": "Variable declaration validation",
|
|
"enabled": true,
|
|
"checks": [
|
|
{
|
|
"id": "redeclaration",
|
|
"description": "Check for variable redeclaration",
|
|
"pattern": "Cannot redeclare|Duplicate identifier|has already been declared",
|
|
"severity": "critical"
|
|
},
|
|
{
|
|
"id": "scope_conflict",
|
|
"description": "Check for scope conflicts",
|
|
"eslint_rule": "no-shadow",
|
|
"severity": "error"
|
|
},
|
|
{
|
|
"id": "undefined_vars",
|
|
"description": "Check for undefined variables",
|
|
"eslint_rule": "no-undef",
|
|
"severity": "critical"
|
|
},
|
|
{
|
|
"id": "unused_vars",
|
|
"description": "Check for unused variables",
|
|
"eslint_rule": "@typescript-eslint/no-unused-vars",
|
|
"severity": "warning"
|
|
}
|
|
]
|
|
},
|
|
"L0_types": {
|
|
"description": "TypeScript type validation",
|
|
"enabled": true,
|
|
"checks": [
|
|
{
|
|
"id": "type_mismatch",
|
|
"description": "Check for type mismatches",
|
|
"pattern": "Type .* is not assignable to type",
|
|
"severity": "critical"
|
|
},
|
|
{
|
|
"id": "missing_types",
|
|
"description": "Check for missing type definitions",
|
|
"pattern": "Could not find a declaration file",
|
|
"severity": "warning"
|
|
},
|
|
{
|
|
"id": "any_abuse",
|
|
"description": "Check for excessive any type usage",
|
|
"eslint_rule": "@typescript-eslint/no-explicit-any",
|
|
"severity": "warning",
|
|
"max_occurrences": 5
|
|
},
|
|
{
|
|
"id": "implicit_any",
|
|
"description": "Check for implicit any",
|
|
"pattern": "implicitly has an 'any' type",
|
|
"severity": "error"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"severity_thresholds": {
|
|
"critical": 0,
|
|
"error": 3,
|
|
"warning": 10
|
|
},
|
|
"max_retries": 2,
|
|
"auto_fix": {
|
|
"enabled": true,
|
|
"safe_fixes_only": true,
|
|
"fixable_categories": ["imports", "formatting", "unused_vars"]
|
|
}
|
|
},
|
|
|
|
"test_quality": {
|
|
"description": "Test file quality validation (IMPL-001.5)",
|
|
"enabled": true,
|
|
"coverage": {
|
|
"minimum_threshold": 80,
|
|
"branch_threshold": 70,
|
|
"function_threshold": 80,
|
|
"line_threshold": 80
|
|
},
|
|
"anti_patterns": {
|
|
"empty_test_body": {
|
|
"pattern": "it\\(['\"].*['\"],\\s*\\(\\)\\s*=>\\s*\\{\\s*\\}\\)",
|
|
"severity": "critical",
|
|
"description": "Test with empty body"
|
|
},
|
|
"missing_assertion": {
|
|
"pattern": "it\\(['\"].*['\"],.*\\{[^}]*\\}\\)(?![\\s\\S]*expect)",
|
|
"severity": "critical",
|
|
"description": "Test without expect() assertion"
|
|
},
|
|
"skipped_without_reason": {
|
|
"pattern": "(it|describe)\\.skip\\(['\"][^'\"]*['\"](?!.*\\/\\/ )",
|
|
"severity": "error",
|
|
"description": "Skipped test without comment explaining why"
|
|
},
|
|
"todo_test": {
|
|
"pattern": "(it|test)\\.todo\\(",
|
|
"severity": "warning",
|
|
"description": "TODO test placeholder"
|
|
},
|
|
"only_test": {
|
|
"pattern": "(it|describe)\\.only\\(",
|
|
"severity": "critical",
|
|
"description": "Focused test (will skip other tests)"
|
|
}
|
|
},
|
|
"required_test_types": {
|
|
"unit": {
|
|
"min_per_function": 1,
|
|
"must_include": ["happy_path"]
|
|
},
|
|
"negative": {
|
|
"min_per_public_api": 1,
|
|
"description": "Error handling tests for public APIs"
|
|
},
|
|
"edge_case": {
|
|
"required_scenarios": ["null", "undefined", "empty_string", "empty_array", "boundary_values"]
|
|
}
|
|
}
|
|
},
|
|
|
|
"ai_specific_checks": {
|
|
"description": "Checks specifically for AI-generated code patterns",
|
|
"enabled": true,
|
|
"checks": [
|
|
{
|
|
"id": "hallucinated_imports",
|
|
"description": "Check for imports of non-existent packages",
|
|
"validation": "npm_package_exists",
|
|
"severity": "critical"
|
|
},
|
|
{
|
|
"id": "inconsistent_naming",
|
|
"description": "Check for naming inconsistencies within file",
|
|
"pattern": "function (\\w+).*\\1(?!\\()",
|
|
"severity": "warning"
|
|
},
|
|
{
|
|
"id": "placeholder_code",
|
|
"description": "Check for AI placeholder comments",
|
|
"patterns": [
|
|
"// TODO: implement",
|
|
"// Add your code here",
|
|
"// Implementation pending",
|
|
"throw new Error\\(['\"]Not implemented['\"]\\)"
|
|
],
|
|
"severity": "error"
|
|
},
|
|
{
|
|
"id": "mock_in_production",
|
|
"description": "Check for mock/stub code in production files",
|
|
"patterns": [
|
|
"jest\\.mock\\(",
|
|
"sinon\\.",
|
|
"vi\\.mock\\("
|
|
],
|
|
"exclude_paths": ["**/*.test.*", "**/*.spec.*", "**/test/**", "**/__tests__/**"],
|
|
"severity": "critical"
|
|
}
|
|
]
|
|
},
|
|
|
|
"validation_commands": {
|
|
"typescript_check": {
|
|
"command": "npx tsc --noEmit --skipLibCheck",
|
|
"timeout": 60000,
|
|
"parse_errors": true
|
|
},
|
|
"eslint_check": {
|
|
"command": "npx eslint --format json",
|
|
"timeout": 60000,
|
|
"auto_fix_command": "npx eslint --fix"
|
|
},
|
|
"circular_deps_check": {
|
|
"command": "npx madge --circular --extensions ts,tsx,js,jsx",
|
|
"timeout": 30000
|
|
},
|
|
"package_validation": {
|
|
"command": "npm ls --json",
|
|
"timeout": 30000
|
|
}
|
|
},
|
|
|
|
"gate_decisions": {
|
|
"pass_criteria": {
|
|
"critical_issues": 0,
|
|
"error_issues": "<=3",
|
|
"warning_issues": "<=10"
|
|
},
|
|
"actions": {
|
|
"pass": "Proceed to IMPL-001.5 (Test Quality Gate)",
|
|
"soft_fail": "Auto-fix and retry (max 2 attempts)",
|
|
"hard_fail": "Block and report to user with fix suggestions"
|
|
}
|
|
}
|
|
}
|