@paths.design/caws-cli 7.0.2 โ 8.0.0
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.
- package/dist/budget-derivation.js +5 -4
- package/dist/commands/diagnose.js +24 -19
- package/dist/commands/init.js +51 -4
- package/dist/commands/quality-gates.js +147 -9
- package/dist/commands/specs.js +148 -14
- package/dist/commands/status.js +2 -2
- package/dist/commands/tool.js +2 -4
- package/dist/config/index.js +17 -8
- package/dist/generators/working-spec.js +19 -6
- package/dist/scaffold/git-hooks.js +245 -46
- package/dist/scaffold/index.js +53 -7
- package/dist/templates/.caws/tools/README.md +21 -0
- package/dist/templates/.cursor/README.md +311 -0
- package/dist/templates/.cursor/hooks/audit.sh +55 -0
- package/dist/templates/.cursor/hooks/block-dangerous.sh +83 -0
- package/dist/templates/.cursor/hooks/caws-quality-check.sh +52 -0
- package/dist/templates/.cursor/hooks/caws-scope-guard.sh +130 -0
- package/dist/templates/.cursor/hooks/caws-tool-validation.sh +121 -0
- package/dist/templates/.cursor/hooks/format.sh +38 -0
- package/dist/templates/.cursor/hooks/naming-check.sh +64 -0
- package/dist/templates/.cursor/hooks/scan-secrets.sh +46 -0
- package/dist/templates/.cursor/hooks/scope-guard.sh +52 -0
- package/dist/templates/.cursor/hooks/validate-spec.sh +83 -0
- package/dist/templates/.cursor/hooks.json +59 -0
- package/dist/templates/.cursor/rules/00-claims-verification.mdc +144 -0
- package/dist/templates/.cursor/rules/01-working-style.mdc +50 -0
- package/dist/templates/.cursor/rules/02-quality-gates.mdc +370 -0
- package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +33 -0
- package/dist/templates/.cursor/rules/04-logging-language-style.mdc +23 -0
- package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +23 -0
- package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +36 -0
- package/dist/templates/.cursor/rules/07-process-ops.mdc +20 -0
- package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +16 -0
- package/dist/templates/.cursor/rules/09-docstrings.mdc +89 -0
- package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +390 -0
- package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +385 -0
- package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +516 -0
- package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +588 -0
- package/dist/templates/.cursor/rules/README.md +148 -0
- package/dist/templates/.github/copilot/instructions.md +311 -0
- package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +5 -0
- package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +5 -0
- package/dist/templates/.vscode/launch.json +56 -0
- package/dist/templates/.vscode/settings.json +93 -0
- package/dist/templates/.windsurf/workflows/caws-guided-development.md +92 -0
- package/dist/templates/COMMIT_CONVENTIONS.md +86 -0
- package/dist/templates/OIDC_SETUP.md +300 -0
- package/dist/templates/agents.md +1047 -0
- package/dist/templates/codemod/README.md +1 -0
- package/dist/templates/codemod/test.js +93 -0
- package/dist/templates/docs/README.md +150 -0
- package/dist/templates/scripts/quality-gates/check-god-objects.js +146 -0
- package/dist/templates/scripts/quality-gates/run-quality-gates.js +50 -0
- package/dist/templates/scripts/v3/analysis/todo_analyzer.py +1997 -0
- package/dist/tool-loader.js +6 -1
- package/dist/tool-validator.js +8 -2
- package/dist/utils/detection.js +4 -3
- package/dist/utils/git-lock.js +119 -0
- package/dist/utils/gitignore-updater.js +148 -0
- package/dist/utils/project-analysis.js +176 -16
- package/dist/utils/quality-gates.js +48 -7
- package/dist/utils/spec-resolver.js +27 -3
- package/dist/utils/yaml-validation.js +156 -0
- package/dist/validation/spec-validation.js +81 -2
- package/package.json +2 -2
- package/templates/.caws/schemas/waivers.schema.json +30 -0
- package/templates/.caws/schemas/working-spec.schema.json +133 -0
- package/templates/.caws/templates/working-spec.template.yml +74 -0
- package/templates/.caws/tools/README.md +21 -0
- package/templates/.caws/tools/scope-guard.js +208 -0
- package/templates/.caws/tools-allow.json +331 -0
- package/templates/.caws/waivers.yml +19 -0
- package/templates/.cursor/hooks/scope-guard.sh +2 -2
- package/templates/.cursor/hooks/validate-spec.sh +42 -7
- package/dist/budget-derivation.d.ts +0 -74
- package/dist/budget-derivation.d.ts.map +0 -1
- package/dist/cicd-optimizer.d.ts +0 -142
- package/dist/cicd-optimizer.d.ts.map +0 -1
- package/dist/commands/archive.d.ts +0 -50
- package/dist/commands/archive.d.ts.map +0 -1
- package/dist/commands/burnup.d.ts +0 -6
- package/dist/commands/burnup.d.ts.map +0 -1
- package/dist/commands/diagnose.d.ts +0 -52
- package/dist/commands/diagnose.d.ts.map +0 -1
- package/dist/commands/evaluate.d.ts +0 -8
- package/dist/commands/evaluate.d.ts.map +0 -1
- package/dist/commands/init.d.ts +0 -5
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/iterate.d.ts +0 -8
- package/dist/commands/iterate.d.ts.map +0 -1
- package/dist/commands/mode.d.ts +0 -24
- package/dist/commands/mode.d.ts.map +0 -1
- package/dist/commands/plan.d.ts +0 -49
- package/dist/commands/plan.d.ts.map +0 -1
- package/dist/commands/provenance.d.ts +0 -32
- package/dist/commands/provenance.d.ts.map +0 -1
- package/dist/commands/quality-gates.d.ts +0 -52
- package/dist/commands/quality-gates.d.ts.map +0 -1
- package/dist/commands/quality-monitor.d.ts +0 -17
- package/dist/commands/quality-monitor.d.ts.map +0 -1
- package/dist/commands/specs.d.ts +0 -71
- package/dist/commands/specs.d.ts.map +0 -1
- package/dist/commands/status.d.ts +0 -44
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/templates.d.ts +0 -74
- package/dist/commands/templates.d.ts.map +0 -1
- package/dist/commands/tool.d.ts +0 -13
- package/dist/commands/tool.d.ts.map +0 -1
- package/dist/commands/troubleshoot.d.ts +0 -8
- package/dist/commands/troubleshoot.d.ts.map +0 -1
- package/dist/commands/tutorial.d.ts +0 -55
- package/dist/commands/tutorial.d.ts.map +0 -1
- package/dist/commands/validate.d.ts +0 -15
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/waivers.d.ts +0 -8
- package/dist/commands/waivers.d.ts.map +0 -1
- package/dist/commands/workflow.d.ts +0 -85
- package/dist/commands/workflow.d.ts.map +0 -1
- package/dist/config/index.d.ts +0 -29
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/modes.d.ts +0 -225
- package/dist/config/modes.d.ts.map +0 -1
- package/dist/constants/spec-types.d.ts +0 -41
- package/dist/constants/spec-types.d.ts.map +0 -1
- package/dist/error-handler.d.ts +0 -164
- package/dist/error-handler.d.ts.map +0 -1
- package/dist/generators/jest-config.d.ts +0 -32
- package/dist/generators/jest-config.d.ts.map +0 -1
- package/dist/generators/working-spec.d.ts +0 -13
- package/dist/generators/working-spec.d.ts.map +0 -1
- package/dist/index-new.d.ts +0 -5
- package/dist/index-new.d.ts.map +0 -1
- package/dist/index-new.js +0 -317
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.backup +0 -4711
- package/dist/minimal-cli.d.ts +0 -3
- package/dist/minimal-cli.d.ts.map +0 -1
- package/dist/policy/PolicyManager.d.ts +0 -104
- package/dist/policy/PolicyManager.d.ts.map +0 -1
- package/dist/scaffold/cursor-hooks.d.ts +0 -7
- package/dist/scaffold/cursor-hooks.d.ts.map +0 -1
- package/dist/scaffold/git-hooks.d.ts +0 -20
- package/dist/scaffold/git-hooks.d.ts.map +0 -1
- package/dist/scaffold/index.d.ts +0 -20
- package/dist/scaffold/index.d.ts.map +0 -1
- package/dist/spec/SpecFileManager.d.ts +0 -146
- package/dist/spec/SpecFileManager.d.ts.map +0 -1
- package/dist/test-analysis.d.ts +0 -182
- package/dist/test-analysis.d.ts.map +0 -1
- package/dist/tool-interface.d.ts +0 -236
- package/dist/tool-interface.d.ts.map +0 -1
- package/dist/tool-loader.d.ts +0 -77
- package/dist/tool-loader.d.ts.map +0 -1
- package/dist/tool-validator.d.ts +0 -72
- package/dist/tool-validator.d.ts.map +0 -1
- package/dist/utils/detection.d.ts +0 -7
- package/dist/utils/detection.d.ts.map +0 -1
- package/dist/utils/finalization.d.ts +0 -17
- package/dist/utils/finalization.d.ts.map +0 -1
- package/dist/utils/project-analysis.d.ts +0 -14
- package/dist/utils/project-analysis.d.ts.map +0 -1
- package/dist/utils/quality-gates.d.ts +0 -49
- package/dist/utils/quality-gates.d.ts.map +0 -1
- package/dist/utils/spec-resolver.d.ts +0 -88
- package/dist/utils/spec-resolver.d.ts.map +0 -1
- package/dist/utils/typescript-detector.d.ts +0 -63
- package/dist/utils/typescript-detector.d.ts.map +0 -1
- package/dist/validation/spec-validation.d.ts +0 -43
- package/dist/validation/spec-validation.d.ts.map +0 -1
- package/dist/waivers-manager.d.ts +0 -167
- package/dist/waivers-manager.d.ts.map +0 -1
- package/templates/apps/tools/caws/COMPLETION_REPORT.md +0 -331
- package/templates/apps/tools/caws/MIGRATION_SUMMARY.md +0 -360
- package/templates/apps/tools/caws/README.md +0 -463
- package/templates/apps/tools/caws/TEST_STATUS.md +0 -365
- package/templates/apps/tools/caws/attest.js +0 -357
- package/templates/apps/tools/caws/ci-optimizer.js +0 -642
- package/templates/apps/tools/caws/config.ts +0 -245
- package/templates/apps/tools/caws/cross-functional.js +0 -876
- package/templates/apps/tools/caws/dashboard.js +0 -1112
- package/templates/apps/tools/caws/flake-detector.ts +0 -362
- package/templates/apps/tools/caws/gates.js +0 -198
- package/templates/apps/tools/caws/gates.ts +0 -271
- package/templates/apps/tools/caws/language-adapters.ts +0 -381
- package/templates/apps/tools/caws/language-support.d.ts +0 -367
- package/templates/apps/tools/caws/language-support.d.ts.map +0 -1
- package/templates/apps/tools/caws/language-support.js +0 -585
- package/templates/apps/tools/caws/legacy-assessment.ts +0 -408
- package/templates/apps/tools/caws/legacy-assessor.js +0 -764
- package/templates/apps/tools/caws/mutant-analyzer.js +0 -734
- package/templates/apps/tools/caws/perf-budgets.ts +0 -349
- package/templates/apps/tools/caws/prompt-lint.js.backup +0 -274
- package/templates/apps/tools/caws/property-testing.js +0 -707
- package/templates/apps/tools/caws/provenance.d.ts +0 -14
- package/templates/apps/tools/caws/provenance.d.ts.map +0 -1
- package/templates/apps/tools/caws/provenance.js +0 -132
- package/templates/apps/tools/caws/provenance.js.backup +0 -73
- package/templates/apps/tools/caws/provenance.ts +0 -211
- package/templates/apps/tools/caws/security-provenance.ts +0 -483
- package/templates/apps/tools/caws/shared/base-tool.ts +0 -281
- package/templates/apps/tools/caws/shared/config-manager.ts +0 -366
- package/templates/apps/tools/caws/shared/gate-checker.ts +0 -849
- package/templates/apps/tools/caws/shared/types.ts +0 -444
- package/templates/apps/tools/caws/shared/validator.ts +0 -305
- package/templates/apps/tools/caws/shared/waivers-manager.ts +0 -174
- package/templates/apps/tools/caws/spec-test-mapper.ts +0 -391
- package/templates/apps/tools/caws/test-quality.js +0 -578
- package/templates/apps/tools/caws/validate.js +0 -76
- package/templates/apps/tools/caws/validate.ts +0 -228
- package/templates/apps/tools/caws/waivers.js +0 -344
- /package/{templates/apps/tools/caws โ dist/templates/.caws}/schemas/waivers.schema.json +0 -0
- /package/{templates/apps/tools/caws โ dist/templates/.caws}/schemas/working-spec.schema.json +0 -0
- /package/{templates/apps/tools/caws โ dist/templates/.caws}/templates/working-spec.template.yml +0 -0
- /package/{templates/apps/tools/caws โ dist/templates/.caws/tools}/scope-guard.js +0 -0
- /package/{templates/apps/tools/caws โ dist/templates/.caws}/tools-allow.json +0 -0
- /package/{templates/apps/tools/caws โ dist/templates/.caws}/waivers.yml +0 -0
|
@@ -1,585 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview CAWS Multi-Language Support System
|
|
5
|
-
* Provides pluggable quality gates and tool configurations for different programming languages
|
|
6
|
-
* @author @darianrosebrook
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Supported languages and their tool configurations
|
|
14
|
-
*/
|
|
15
|
-
const LANGUAGE_CONFIGS = {
|
|
16
|
-
javascript: {
|
|
17
|
-
name: 'JavaScript/TypeScript',
|
|
18
|
-
extensions: ['.js', '.ts', '.jsx', '.tsx', '.mjs', '.cjs'],
|
|
19
|
-
testExtensions: ['.test.js', '.test.ts', '.spec.js', '.spec.ts'],
|
|
20
|
-
qualityTools: {
|
|
21
|
-
unitTest: {
|
|
22
|
-
commands: ['jest', 'mocha', 'vitest'],
|
|
23
|
-
coverageCommand: 'jest --coverage',
|
|
24
|
-
defaultCommand: 'jest',
|
|
25
|
-
},
|
|
26
|
-
mutationTest: {
|
|
27
|
-
commands: ['stryker'],
|
|
28
|
-
defaultCommand: 'stryker run',
|
|
29
|
-
},
|
|
30
|
-
lint: {
|
|
31
|
-
commands: ['eslint'],
|
|
32
|
-
defaultCommand: 'eslint .',
|
|
33
|
-
},
|
|
34
|
-
format: {
|
|
35
|
-
commands: ['prettier'],
|
|
36
|
-
defaultCommand: 'prettier --write .',
|
|
37
|
-
},
|
|
38
|
-
typeCheck: {
|
|
39
|
-
commands: ['tsc'],
|
|
40
|
-
defaultCommand: 'tsc --noEmit',
|
|
41
|
-
},
|
|
42
|
-
contractTest: {
|
|
43
|
-
commands: ['pact'],
|
|
44
|
-
defaultCommand: 'pact',
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
coverageReports: ['coverage/lcov.info', 'coverage/coverage-final.json'],
|
|
48
|
-
tierAdjustments: {
|
|
49
|
-
1: { min_branch: 0.9, min_mutation: 0.7 },
|
|
50
|
-
2: { min_branch: 0.8, min_mutation: 0.5 },
|
|
51
|
-
3: { min_branch: 0.7, min_mutation: 0.3 },
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
python: {
|
|
56
|
-
name: 'Python',
|
|
57
|
-
extensions: ['.py', '.pyw'],
|
|
58
|
-
testExtensions: ['test_*.py', '*_test.py'],
|
|
59
|
-
qualityTools: {
|
|
60
|
-
unitTest: {
|
|
61
|
-
commands: ['pytest', 'unittest'],
|
|
62
|
-
coverageCommand: 'pytest --cov',
|
|
63
|
-
defaultCommand: 'pytest',
|
|
64
|
-
},
|
|
65
|
-
mutationTest: {
|
|
66
|
-
commands: ['mutmut', 'cosmic-ray'],
|
|
67
|
-
defaultCommand: 'mutmut run',
|
|
68
|
-
},
|
|
69
|
-
lint: {
|
|
70
|
-
commands: ['pylint', 'flake8', 'black'],
|
|
71
|
-
defaultCommand: 'flake8 .',
|
|
72
|
-
},
|
|
73
|
-
format: {
|
|
74
|
-
commands: ['black', 'autopep8'],
|
|
75
|
-
defaultCommand: 'black .',
|
|
76
|
-
},
|
|
77
|
-
typeCheck: {
|
|
78
|
-
commands: ['mypy'],
|
|
79
|
-
defaultCommand: 'mypy .',
|
|
80
|
-
},
|
|
81
|
-
contractTest: {
|
|
82
|
-
commands: ['schemathesis'],
|
|
83
|
-
defaultCommand: 'schemathesis run',
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
coverageReports: ['.coverage', 'coverage.xml', 'htmlcov/'],
|
|
87
|
-
tierAdjustments: {
|
|
88
|
-
1: { min_branch: 0.85, min_mutation: 0.6 },
|
|
89
|
-
2: { min_branch: 0.75, min_mutation: 0.4 },
|
|
90
|
-
3: { min_branch: 0.6, min_mutation: 0.2 },
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
java: {
|
|
95
|
-
name: 'Java',
|
|
96
|
-
extensions: ['.java'],
|
|
97
|
-
testExtensions: ['*Test.java', 'Test*.java'],
|
|
98
|
-
qualityTools: {
|
|
99
|
-
unitTest: {
|
|
100
|
-
commands: ['mvn test', 'gradle test', 'junit'],
|
|
101
|
-
coverageCommand: 'mvn test jacoco:report',
|
|
102
|
-
defaultCommand: 'mvn test',
|
|
103
|
-
},
|
|
104
|
-
mutationTest: {
|
|
105
|
-
commands: ['pitest', 'pitest-maven'],
|
|
106
|
-
defaultCommand: 'mvn org.pitest:pitest-maven:mutationCoverage',
|
|
107
|
-
},
|
|
108
|
-
lint: {
|
|
109
|
-
commands: ['checkstyle', 'pmd'],
|
|
110
|
-
defaultCommand: 'mvn checkstyle:check',
|
|
111
|
-
},
|
|
112
|
-
format: {
|
|
113
|
-
commands: ['google-java-format'],
|
|
114
|
-
defaultCommand: 'google-java-format --replace',
|
|
115
|
-
},
|
|
116
|
-
contractTest: {
|
|
117
|
-
commands: ['pact-jvm'],
|
|
118
|
-
defaultCommand: 'pact-jvm',
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
coverageReports: ['target/site/jacoco/', 'build/reports/jacoco/'],
|
|
122
|
-
tierAdjustments: {
|
|
123
|
-
1: { min_branch: 0.85, min_mutation: 0.65 },
|
|
124
|
-
2: { min_branch: 0.75, min_mutation: 0.45 },
|
|
125
|
-
3: { min_branch: 0.65, min_mutation: 0.25 },
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
go: {
|
|
130
|
-
name: 'Go',
|
|
131
|
-
extensions: ['.go'],
|
|
132
|
-
testExtensions: ['*_test.go'],
|
|
133
|
-
qualityTools: {
|
|
134
|
-
unitTest: {
|
|
135
|
-
commands: ['go test'],
|
|
136
|
-
coverageCommand: 'go test -coverprofile=coverage.out',
|
|
137
|
-
defaultCommand: 'go test ./...',
|
|
138
|
-
},
|
|
139
|
-
mutationTest: {
|
|
140
|
-
commands: ['gremlins'],
|
|
141
|
-
defaultCommand: 'gremlins',
|
|
142
|
-
},
|
|
143
|
-
lint: {
|
|
144
|
-
commands: ['golangci-lint', 'golint'],
|
|
145
|
-
defaultCommand: 'golangci-lint run',
|
|
146
|
-
},
|
|
147
|
-
format: {
|
|
148
|
-
commands: ['gofmt'],
|
|
149
|
-
defaultCommand: 'gofmt -w .',
|
|
150
|
-
},
|
|
151
|
-
contractTest: {
|
|
152
|
-
commands: ['pact-go'],
|
|
153
|
-
defaultCommand: 'pact-go',
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
coverageReports: ['coverage.out', 'coverage.html'],
|
|
157
|
-
tierAdjustments: {
|
|
158
|
-
1: { min_branch: 0.8, min_mutation: 0.6 },
|
|
159
|
-
2: { min_branch: 0.7, min_mutation: 0.4 },
|
|
160
|
-
3: { min_branch: 0.6, min_mutation: 0.2 },
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
|
|
164
|
-
rust: {
|
|
165
|
-
name: 'Rust',
|
|
166
|
-
extensions: ['.rs'],
|
|
167
|
-
testExtensions: ['*.rs'], // Rust tests are in the same files
|
|
168
|
-
qualityTools: {
|
|
169
|
-
unitTest: {
|
|
170
|
-
commands: ['cargo test'],
|
|
171
|
-
coverageCommand: 'cargo test --no-run && tarpaulin',
|
|
172
|
-
defaultCommand: 'cargo test',
|
|
173
|
-
},
|
|
174
|
-
mutationTest: {
|
|
175
|
-
commands: ['mutagen'],
|
|
176
|
-
defaultCommand: 'mutagen',
|
|
177
|
-
},
|
|
178
|
-
lint: {
|
|
179
|
-
commands: ['cargo clippy'],
|
|
180
|
-
defaultCommand: 'cargo clippy',
|
|
181
|
-
},
|
|
182
|
-
format: {
|
|
183
|
-
commands: ['cargo fmt'],
|
|
184
|
-
defaultCommand: 'cargo fmt',
|
|
185
|
-
},
|
|
186
|
-
contractTest: {
|
|
187
|
-
commands: ['pact-rust'],
|
|
188
|
-
defaultCommand: 'pact-rust',
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
coverageReports: ['cobertura.xml', 'lcov.info'],
|
|
192
|
-
tierAdjustments: {
|
|
193
|
-
1: { min_branch: 0.9, min_mutation: 0.7 },
|
|
194
|
-
2: { min_branch: 0.8, min_mutation: 0.5 },
|
|
195
|
-
3: { min_branch: 0.7, min_mutation: 0.3 },
|
|
196
|
-
},
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Detect the primary language of a project
|
|
202
|
-
* @param {string} projectDir - Project directory path
|
|
203
|
-
* @returns {string} Detected language key or 'unknown'
|
|
204
|
-
*/
|
|
205
|
-
function detectProjectLanguage(projectDir = process.cwd()) {
|
|
206
|
-
const fileStats = {};
|
|
207
|
-
|
|
208
|
-
// Count files by extension
|
|
209
|
-
function scanDirectory(dir) {
|
|
210
|
-
try {
|
|
211
|
-
const files = fs.readdirSync(dir);
|
|
212
|
-
|
|
213
|
-
files.forEach((file) => {
|
|
214
|
-
const filePath = path.join(dir, file);
|
|
215
|
-
const stat = fs.statSync(filePath);
|
|
216
|
-
|
|
217
|
-
if (
|
|
218
|
-
stat.isDirectory() &&
|
|
219
|
-
!file.startsWith('.') &&
|
|
220
|
-
file !== 'node_modules' &&
|
|
221
|
-
file !== 'target'
|
|
222
|
-
) {
|
|
223
|
-
scanDirectory(filePath);
|
|
224
|
-
} else if (stat.isFile()) {
|
|
225
|
-
const ext = path.extname(file);
|
|
226
|
-
|
|
227
|
-
Object.keys(LANGUAGE_CONFIGS).forEach((lang) => {
|
|
228
|
-
if (LANGUAGE_CONFIGS[lang].extensions.includes(ext)) {
|
|
229
|
-
fileStats[lang] = (fileStats[lang] || 0) + 1;
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
} catch (error) {
|
|
235
|
-
// Skip directories we can't read
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
scanDirectory(projectDir);
|
|
240
|
-
|
|
241
|
-
// Find the language with the most files
|
|
242
|
-
let maxCount = 0;
|
|
243
|
-
let detectedLanguage = 'unknown';
|
|
244
|
-
|
|
245
|
-
Object.keys(fileStats).forEach((lang) => {
|
|
246
|
-
if (fileStats[lang] > maxCount) {
|
|
247
|
-
maxCount = fileStats[lang];
|
|
248
|
-
detectedLanguage = lang;
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
if (detectedLanguage !== 'unknown') {
|
|
253
|
-
console.log(
|
|
254
|
-
`๐ Detected project language: ${LANGUAGE_CONFIGS[detectedLanguage].name} (${fileStats[detectedLanguage]} files)`
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return detectedLanguage;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* Get quality tool configuration for a language
|
|
263
|
-
* @param {string} language - Language key
|
|
264
|
-
* @param {string} toolType - Type of tool (unitTest, mutationTest, etc.)
|
|
265
|
-
* @returns {Object} Tool configuration
|
|
266
|
-
*/
|
|
267
|
-
function getQualityToolConfig(language, toolType) {
|
|
268
|
-
const config = LANGUAGE_CONFIGS[language];
|
|
269
|
-
if (!config || !config.qualityTools[toolType]) {
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return config.qualityTools[toolType];
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Generate CI configuration for a language
|
|
278
|
-
* @param {string} language - Language key
|
|
279
|
-
* @param {number} tier - Risk tier (1, 2, 3)
|
|
280
|
-
* @returns {Object} CI configuration
|
|
281
|
-
*/
|
|
282
|
-
function generateCIConfig(language, tier) {
|
|
283
|
-
const config = LANGUAGE_CONFIGS[language];
|
|
284
|
-
if (!config) {
|
|
285
|
-
throw new Error(`Unsupported language: ${language}`);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const thresholds = config.tierAdjustments[tier] || config.tierAdjustments[2];
|
|
289
|
-
|
|
290
|
-
return {
|
|
291
|
-
language,
|
|
292
|
-
tier,
|
|
293
|
-
thresholds,
|
|
294
|
-
steps: {
|
|
295
|
-
install: getInstallCommands(language),
|
|
296
|
-
lint: getLintCommands(language),
|
|
297
|
-
test: getTestCommands(language, tier),
|
|
298
|
-
coverage: getCoverageCommands(language),
|
|
299
|
-
mutation: getMutationCommands(language),
|
|
300
|
-
contract: getContractCommands(language),
|
|
301
|
-
},
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Get installation commands for a language
|
|
307
|
-
*/
|
|
308
|
-
function getInstallCommands(language) {
|
|
309
|
-
const configs = {
|
|
310
|
-
javascript: ['npm ci', 'npm install'],
|
|
311
|
-
python: [
|
|
312
|
-
'python -m pip install --upgrade pip',
|
|
313
|
-
'pip install -r requirements.txt',
|
|
314
|
-
'pip install -r requirements-dev.txt',
|
|
315
|
-
],
|
|
316
|
-
java: ['mvn dependency:resolve', './gradlew dependencies'],
|
|
317
|
-
go: ['go mod download'],
|
|
318
|
-
rust: ['cargo fetch'],
|
|
319
|
-
};
|
|
320
|
-
|
|
321
|
-
return configs[language] || [];
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Get lint commands for a language
|
|
326
|
-
*/
|
|
327
|
-
function getLintCommands(language) {
|
|
328
|
-
const toolConfig = getQualityToolConfig(language, 'lint');
|
|
329
|
-
return toolConfig ? [toolConfig.defaultCommand] : [];
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* Get test commands for a language
|
|
334
|
-
*/
|
|
335
|
-
function getTestCommands(language, tier) {
|
|
336
|
-
const toolConfig = getQualityToolConfig(language, 'unitTest');
|
|
337
|
-
if (!toolConfig) return [];
|
|
338
|
-
|
|
339
|
-
// Adjust test rigor based on tier
|
|
340
|
-
const commands = [toolConfig.defaultCommand];
|
|
341
|
-
|
|
342
|
-
// For higher tiers, add more comprehensive testing
|
|
343
|
-
if (tier <= 2) {
|
|
344
|
-
commands.push(`${toolConfig.defaultCommand} --verbose`);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
return commands;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* Get coverage commands for a language
|
|
352
|
-
*/
|
|
353
|
-
function getCoverageCommands(language) {
|
|
354
|
-
const toolConfig = getQualityToolConfig(language, 'unitTest');
|
|
355
|
-
return toolConfig?.coverageCommand ? [toolConfig.coverageCommand] : [];
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
/**
|
|
359
|
-
* Get mutation testing commands for a language
|
|
360
|
-
*/
|
|
361
|
-
function getMutationCommands(language) {
|
|
362
|
-
const toolConfig = getQualityToolConfig(language, 'mutationTest');
|
|
363
|
-
return toolConfig ? [toolConfig.defaultCommand] : [];
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Get contract testing commands for a language
|
|
368
|
-
*/
|
|
369
|
-
function getContractCommands(language) {
|
|
370
|
-
const toolConfig = getQualityToolConfig(language, 'contractTest');
|
|
371
|
-
return toolConfig ? [toolConfig.defaultCommand] : [];
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Generate a language-specific CAWS configuration file
|
|
376
|
-
* @param {string} language - Language key
|
|
377
|
-
* @param {string} configPath - Output configuration path
|
|
378
|
-
*/
|
|
379
|
-
function generateLanguageConfig(language, configPath = '.caws/language-config.json') {
|
|
380
|
-
const ciConfig = generateCIConfig(language, 2); // Default to tier 2
|
|
381
|
-
|
|
382
|
-
const config = {
|
|
383
|
-
language,
|
|
384
|
-
name: LANGUAGE_CONFIGS[language]?.name || 'Unknown',
|
|
385
|
-
tier: ciConfig.tier,
|
|
386
|
-
thresholds: ciConfig.thresholds,
|
|
387
|
-
tools: {},
|
|
388
|
-
generated_at: new Date().toISOString(),
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
// Add tool configurations
|
|
392
|
-
Object.keys(LANGUAGE_CONFIGS[language]?.qualityTools || {}).forEach((toolType) => {
|
|
393
|
-
const toolConfig = getQualityToolConfig(language, toolType);
|
|
394
|
-
if (toolConfig) {
|
|
395
|
-
config.tools[toolType] = {
|
|
396
|
-
commands: toolConfig.commands,
|
|
397
|
-
default: toolConfig.defaultCommand,
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
// Ensure directory exists
|
|
403
|
-
const dir = path.dirname(configPath);
|
|
404
|
-
if (!fs.existsSync(dir)) {
|
|
405
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
409
|
-
console.log(`โ
Generated language config: ${configPath}`);
|
|
410
|
-
|
|
411
|
-
return config;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Validate that required tools are installed for a language
|
|
416
|
-
* @param {string} language - Language key
|
|
417
|
-
* @returns {Object} Validation results
|
|
418
|
-
*/
|
|
419
|
-
function validateTooling(language) {
|
|
420
|
-
const config = LANGUAGE_CONFIGS[language];
|
|
421
|
-
if (!config) {
|
|
422
|
-
return { valid: false, errors: [`Unsupported language: ${language}`] };
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
const results = {
|
|
426
|
-
valid: true,
|
|
427
|
-
errors: [],
|
|
428
|
-
warnings: [],
|
|
429
|
-
missingTools: [],
|
|
430
|
-
availableTools: [],
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
// Check each tool type
|
|
434
|
-
Object.keys(config.qualityTools).forEach((toolType) => {
|
|
435
|
-
const toolConfig = config.qualityTools[toolType];
|
|
436
|
-
|
|
437
|
-
// Check if any of the tool commands are available
|
|
438
|
-
let found = false;
|
|
439
|
-
toolConfig.commands.forEach((command) => {
|
|
440
|
-
try {
|
|
441
|
-
require('child_process').execSync(`which ${command.split(' ')[0]}`, { stdio: 'ignore' });
|
|
442
|
-
found = true;
|
|
443
|
-
results.availableTools.push(command);
|
|
444
|
-
} catch (error) {
|
|
445
|
-
// Tool not found
|
|
446
|
-
}
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
if (!found) {
|
|
450
|
-
results.missingTools.push(toolType);
|
|
451
|
-
results.errors.push(`${toolType} tools not found: ${toolConfig.commands.join(', ')}`);
|
|
452
|
-
results.valid = false;
|
|
453
|
-
}
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
return results;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// CLI interface
|
|
460
|
-
if (require.main === module) {
|
|
461
|
-
const command = process.argv[2];
|
|
462
|
-
|
|
463
|
-
switch (command) {
|
|
464
|
-
case 'detect':
|
|
465
|
-
const language = detectProjectLanguage();
|
|
466
|
-
if (language !== 'unknown') {
|
|
467
|
-
console.log(`๐ Language: ${LANGUAGE_CONFIGS[language].name}`);
|
|
468
|
-
console.log(`๐ Extensions: ${LANGUAGE_CONFIGS[language].extensions.join(', ')}`);
|
|
469
|
-
console.log(`๐งช Test patterns: ${LANGUAGE_CONFIGS[language].testExtensions.join(', ')}`);
|
|
470
|
-
} else {
|
|
471
|
-
console.log('โ Could not detect project language');
|
|
472
|
-
process.exit(1);
|
|
473
|
-
}
|
|
474
|
-
break;
|
|
475
|
-
|
|
476
|
-
case 'config':
|
|
477
|
-
const targetLanguage = process.argv[3] || detectProjectLanguage();
|
|
478
|
-
const tier = parseInt(process.argv[4]) || 2;
|
|
479
|
-
const configPath = process.argv[5] || '.caws/language-config.json';
|
|
480
|
-
|
|
481
|
-
if (targetLanguage === 'unknown') {
|
|
482
|
-
console.error('โ Unknown or unsupported language');
|
|
483
|
-
process.exit(1);
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
generateLanguageConfig(targetLanguage, configPath);
|
|
487
|
-
console.log(
|
|
488
|
-
`๐ Generated config for ${LANGUAGE_CONFIGS[targetLanguage].name} (Tier ${tier})`
|
|
489
|
-
);
|
|
490
|
-
break;
|
|
491
|
-
|
|
492
|
-
case 'validate':
|
|
493
|
-
const langToValidate = process.argv[3] || detectProjectLanguage();
|
|
494
|
-
|
|
495
|
-
if (langToValidate === 'unknown') {
|
|
496
|
-
console.error('โ Cannot validate tooling for unknown language');
|
|
497
|
-
process.exit(1);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
console.log(`๐ Validating tooling for ${LANGUAGE_CONFIGS[langToValidate].name}...`);
|
|
501
|
-
const validation = validateTooling(langToValidate);
|
|
502
|
-
|
|
503
|
-
if (validation.errors.length > 0) {
|
|
504
|
-
console.error('\nโ Tooling validation failed:');
|
|
505
|
-
validation.errors.forEach((error) => console.error(` - ${error}`));
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
if (validation.warnings.length > 0) {
|
|
509
|
-
console.warn('\nโ ๏ธ Tooling warnings:');
|
|
510
|
-
validation.warnings.forEach((warning) => console.warn(` - ${warning}`));
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
if (validation.missingTools.length > 0) {
|
|
514
|
-
console.log('\n๐ก To install missing tools:');
|
|
515
|
-
validation.missingTools.forEach((toolType) => {
|
|
516
|
-
const toolConfig = getQualityToolConfig(langToValidate, toolType);
|
|
517
|
-
console.log(
|
|
518
|
-
` ${toolType}: ${toolConfig.commands[0]} (or alternatives: ${toolConfig.commands.slice(1).join(', ')})`
|
|
519
|
-
);
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
if (validation.valid) {
|
|
524
|
-
console.log('โ
All required tools are available');
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
process.exit(validation.valid ? 0 : 1);
|
|
528
|
-
break;
|
|
529
|
-
|
|
530
|
-
case 'ci':
|
|
531
|
-
const ciLanguage = process.argv[3] || detectProjectLanguage();
|
|
532
|
-
const ciTier = parseInt(process.argv[4]) || 2;
|
|
533
|
-
|
|
534
|
-
if (ciLanguage === 'unknown') {
|
|
535
|
-
console.error('โ Cannot generate CI config for unknown language');
|
|
536
|
-
process.exit(1);
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
const ciConfig = generateCIConfig(ciLanguage, ciTier);
|
|
540
|
-
console.log(`๐ CI Configuration for ${LANGUAGE_CONFIGS[ciLanguage].name} (Tier ${ciTier}):`);
|
|
541
|
-
console.log(
|
|
542
|
-
` Thresholds: Branch โฅ${ciConfig.thresholds.min_branch * 100}%, Mutation โฅ${ciConfig.thresholds.min_mutation * 100}%`
|
|
543
|
-
);
|
|
544
|
-
|
|
545
|
-
console.log('\n๐ง Installation steps:');
|
|
546
|
-
ciConfig.steps.install.forEach((cmd) => console.log(` - ${cmd}`));
|
|
547
|
-
|
|
548
|
-
console.log('\n๐งช Test steps:');
|
|
549
|
-
ciConfig.steps.test.forEach((cmd) => console.log(` - ${cmd}`));
|
|
550
|
-
|
|
551
|
-
if (ciConfig.steps.mutation.length > 0) {
|
|
552
|
-
console.log('\n๐งฌ Mutation testing:');
|
|
553
|
-
ciConfig.steps.mutation.forEach((cmd) => console.log(` - ${cmd}`));
|
|
554
|
-
}
|
|
555
|
-
break;
|
|
556
|
-
|
|
557
|
-
default:
|
|
558
|
-
console.log('CAWS Multi-Language Support Tool');
|
|
559
|
-
console.log('Usage:');
|
|
560
|
-
console.log(' node language-support.js detect');
|
|
561
|
-
console.log(' node language-support.js config [language] [tier] [output-path]');
|
|
562
|
-
console.log(' node language-support.js validate [language]');
|
|
563
|
-
console.log(' node language-support.js ci [language] [tier]');
|
|
564
|
-
console.log('');
|
|
565
|
-
console.log('Supported languages:');
|
|
566
|
-
Object.keys(LANGUAGE_CONFIGS).forEach((lang) => {
|
|
567
|
-
console.log(` - ${lang}: ${LANGUAGE_CONFIGS[lang].name}`);
|
|
568
|
-
});
|
|
569
|
-
console.log('');
|
|
570
|
-
console.log('Examples:');
|
|
571
|
-
console.log(' node language-support.js detect');
|
|
572
|
-
console.log(' node language-support.js config python 2');
|
|
573
|
-
console.log(' node language-support.js validate javascript');
|
|
574
|
-
process.exit(1);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
module.exports = {
|
|
579
|
-
LANGUAGE_CONFIGS,
|
|
580
|
-
detectProjectLanguage,
|
|
581
|
-
getQualityToolConfig,
|
|
582
|
-
generateCIConfig,
|
|
583
|
-
validateTooling,
|
|
584
|
-
generateLanguageConfig,
|
|
585
|
-
};
|