@paths.design/caws-cli 7.0.1 โ†’ 7.0.3

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.
Files changed (121) hide show
  1. package/dist/budget-derivation.js +5 -4
  2. package/dist/commands/diagnose.js +26 -20
  3. package/dist/commands/init.js +72 -5
  4. package/dist/commands/specs.js +40 -1
  5. package/dist/commands/status.js +2 -2
  6. package/dist/commands/templates.js +10 -0
  7. package/dist/commands/tool.js +2 -3
  8. package/dist/commands/validate.js +12 -0
  9. package/dist/config/index.js +17 -8
  10. package/dist/generators/working-spec.js +42 -9
  11. package/dist/index.js +3 -1
  12. package/dist/scaffold/cursor-hooks.js +10 -2
  13. package/dist/scaffold/git-hooks.js +189 -32
  14. package/dist/scaffold/index.js +105 -17
  15. package/dist/templates/.caws/tools/README.md +20 -0
  16. package/dist/templates/.cursor/README.md +311 -0
  17. package/dist/templates/.cursor/hooks/audit.sh +55 -0
  18. package/dist/templates/.cursor/hooks/block-dangerous.sh +83 -0
  19. package/dist/templates/.cursor/hooks/caws-quality-check.sh +52 -0
  20. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +130 -0
  21. package/dist/templates/.cursor/hooks/caws-tool-validation.sh +121 -0
  22. package/dist/templates/.cursor/hooks/format.sh +38 -0
  23. package/dist/templates/.cursor/hooks/naming-check.sh +64 -0
  24. package/dist/templates/.cursor/hooks/scan-secrets.sh +46 -0
  25. package/dist/templates/.cursor/hooks/scope-guard.sh +52 -0
  26. package/dist/templates/.cursor/hooks/validate-spec.sh +83 -0
  27. package/dist/templates/.cursor/hooks.json +59 -0
  28. package/dist/templates/.cursor/rules/00-claims-verification.mdc +144 -0
  29. package/dist/templates/.cursor/rules/01-working-style.mdc +50 -0
  30. package/dist/templates/.cursor/rules/02-quality-gates.mdc +370 -0
  31. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +33 -0
  32. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +23 -0
  33. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +23 -0
  34. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +36 -0
  35. package/dist/templates/.cursor/rules/07-process-ops.mdc +20 -0
  36. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +16 -0
  37. package/dist/templates/.cursor/rules/09-docstrings.mdc +89 -0
  38. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +390 -0
  39. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +385 -0
  40. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +516 -0
  41. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +588 -0
  42. package/dist/templates/.cursor/rules/README.md +148 -0
  43. package/dist/templates/.github/copilot/instructions.md +311 -0
  44. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +5 -0
  45. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +5 -0
  46. package/dist/templates/.vscode/launch.json +56 -0
  47. package/dist/templates/.vscode/settings.json +93 -0
  48. package/dist/templates/.windsurf/workflows/caws-guided-development.md +92 -0
  49. package/dist/templates/COMMIT_CONVENTIONS.md +86 -0
  50. package/dist/templates/OIDC_SETUP.md +300 -0
  51. package/dist/templates/agents.md +1047 -0
  52. package/dist/templates/codemod/README.md +1 -0
  53. package/dist/templates/codemod/test.js +93 -0
  54. package/dist/templates/docs/README.md +150 -0
  55. package/dist/templates/scripts/quality-gates/check-god-objects.js +146 -0
  56. package/dist/templates/scripts/quality-gates/run-quality-gates.js +50 -0
  57. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +1997 -0
  58. package/dist/tool-loader.js +6 -1
  59. package/dist/tool-validator.js +8 -2
  60. package/dist/utils/detection.js +34 -6
  61. package/dist/utils/git-lock.js +118 -0
  62. package/dist/utils/gitignore-updater.js +148 -0
  63. package/dist/utils/quality-gates.js +47 -7
  64. package/dist/utils/spec-resolver.js +23 -3
  65. package/dist/utils/yaml-validation.js +155 -0
  66. package/dist/validation/spec-validation.js +105 -2
  67. package/package.json +2 -2
  68. package/templates/.caws/schemas/waivers.schema.json +30 -0
  69. package/templates/.caws/schemas/working-spec.schema.json +133 -0
  70. package/templates/.caws/templates/working-spec.template.yml +74 -0
  71. package/templates/.caws/tools/README.md +20 -0
  72. package/templates/.caws/tools/scope-guard.js +208 -0
  73. package/templates/.caws/tools-allow.json +331 -0
  74. package/templates/.caws/waivers.yml +19 -0
  75. package/templates/.cursor/hooks/scope-guard.sh +2 -2
  76. package/templates/.cursor/hooks/validate-spec.sh +42 -7
  77. package/templates/apps/tools/caws/COMPLETION_REPORT.md +0 -331
  78. package/templates/apps/tools/caws/MIGRATION_SUMMARY.md +0 -360
  79. package/templates/apps/tools/caws/README.md +0 -463
  80. package/templates/apps/tools/caws/TEST_STATUS.md +0 -365
  81. package/templates/apps/tools/caws/attest.js +0 -357
  82. package/templates/apps/tools/caws/ci-optimizer.js +0 -642
  83. package/templates/apps/tools/caws/config.ts +0 -245
  84. package/templates/apps/tools/caws/cross-functional.js +0 -876
  85. package/templates/apps/tools/caws/dashboard.js +0 -1112
  86. package/templates/apps/tools/caws/flake-detector.ts +0 -362
  87. package/templates/apps/tools/caws/gates.js +0 -198
  88. package/templates/apps/tools/caws/gates.ts +0 -271
  89. package/templates/apps/tools/caws/language-adapters.ts +0 -381
  90. package/templates/apps/tools/caws/language-support.d.ts +0 -367
  91. package/templates/apps/tools/caws/language-support.d.ts.map +0 -1
  92. package/templates/apps/tools/caws/language-support.js +0 -585
  93. package/templates/apps/tools/caws/legacy-assessment.ts +0 -408
  94. package/templates/apps/tools/caws/legacy-assessor.js +0 -764
  95. package/templates/apps/tools/caws/mutant-analyzer.js +0 -734
  96. package/templates/apps/tools/caws/perf-budgets.ts +0 -349
  97. package/templates/apps/tools/caws/prompt-lint.js.backup +0 -274
  98. package/templates/apps/tools/caws/property-testing.js +0 -707
  99. package/templates/apps/tools/caws/provenance.d.ts +0 -14
  100. package/templates/apps/tools/caws/provenance.d.ts.map +0 -1
  101. package/templates/apps/tools/caws/provenance.js +0 -132
  102. package/templates/apps/tools/caws/provenance.js.backup +0 -73
  103. package/templates/apps/tools/caws/provenance.ts +0 -211
  104. package/templates/apps/tools/caws/security-provenance.ts +0 -483
  105. package/templates/apps/tools/caws/shared/base-tool.ts +0 -281
  106. package/templates/apps/tools/caws/shared/config-manager.ts +0 -366
  107. package/templates/apps/tools/caws/shared/gate-checker.ts +0 -849
  108. package/templates/apps/tools/caws/shared/types.ts +0 -444
  109. package/templates/apps/tools/caws/shared/validator.ts +0 -305
  110. package/templates/apps/tools/caws/shared/waivers-manager.ts +0 -174
  111. package/templates/apps/tools/caws/spec-test-mapper.ts +0 -391
  112. package/templates/apps/tools/caws/test-quality.js +0 -578
  113. package/templates/apps/tools/caws/validate.js +0 -76
  114. package/templates/apps/tools/caws/validate.ts +0 -228
  115. package/templates/apps/tools/caws/waivers.js +0 -344
  116. /package/{templates/apps/tools/caws โ†’ dist/templates/.caws}/schemas/waivers.schema.json +0 -0
  117. /package/{templates/apps/tools/caws โ†’ dist/templates/.caws}/schemas/working-spec.schema.json +0 -0
  118. /package/{templates/apps/tools/caws โ†’ dist/templates/.caws}/templates/working-spec.template.yml +0 -0
  119. /package/{templates/apps/tools/caws โ†’ dist/templates/.caws/tools}/scope-guard.js +0 -0
  120. /package/{templates/apps/tools/caws โ†’ dist/templates/.caws}/tools-allow.json +0 -0
  121. /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
- };