@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.
Files changed (217) hide show
  1. package/dist/budget-derivation.js +5 -4
  2. package/dist/commands/diagnose.js +24 -19
  3. package/dist/commands/init.js +51 -4
  4. package/dist/commands/quality-gates.js +147 -9
  5. package/dist/commands/specs.js +148 -14
  6. package/dist/commands/status.js +2 -2
  7. package/dist/commands/tool.js +2 -4
  8. package/dist/config/index.js +17 -8
  9. package/dist/generators/working-spec.js +19 -6
  10. package/dist/scaffold/git-hooks.js +245 -46
  11. package/dist/scaffold/index.js +53 -7
  12. package/dist/templates/.caws/tools/README.md +21 -0
  13. package/dist/templates/.cursor/README.md +311 -0
  14. package/dist/templates/.cursor/hooks/audit.sh +55 -0
  15. package/dist/templates/.cursor/hooks/block-dangerous.sh +83 -0
  16. package/dist/templates/.cursor/hooks/caws-quality-check.sh +52 -0
  17. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +130 -0
  18. package/dist/templates/.cursor/hooks/caws-tool-validation.sh +121 -0
  19. package/dist/templates/.cursor/hooks/format.sh +38 -0
  20. package/dist/templates/.cursor/hooks/naming-check.sh +64 -0
  21. package/dist/templates/.cursor/hooks/scan-secrets.sh +46 -0
  22. package/dist/templates/.cursor/hooks/scope-guard.sh +52 -0
  23. package/dist/templates/.cursor/hooks/validate-spec.sh +83 -0
  24. package/dist/templates/.cursor/hooks.json +59 -0
  25. package/dist/templates/.cursor/rules/00-claims-verification.mdc +144 -0
  26. package/dist/templates/.cursor/rules/01-working-style.mdc +50 -0
  27. package/dist/templates/.cursor/rules/02-quality-gates.mdc +370 -0
  28. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +33 -0
  29. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +23 -0
  30. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +23 -0
  31. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +36 -0
  32. package/dist/templates/.cursor/rules/07-process-ops.mdc +20 -0
  33. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +16 -0
  34. package/dist/templates/.cursor/rules/09-docstrings.mdc +89 -0
  35. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +390 -0
  36. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +385 -0
  37. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +516 -0
  38. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +588 -0
  39. package/dist/templates/.cursor/rules/README.md +148 -0
  40. package/dist/templates/.github/copilot/instructions.md +311 -0
  41. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +5 -0
  42. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +5 -0
  43. package/dist/templates/.vscode/launch.json +56 -0
  44. package/dist/templates/.vscode/settings.json +93 -0
  45. package/dist/templates/.windsurf/workflows/caws-guided-development.md +92 -0
  46. package/dist/templates/COMMIT_CONVENTIONS.md +86 -0
  47. package/dist/templates/OIDC_SETUP.md +300 -0
  48. package/dist/templates/agents.md +1047 -0
  49. package/dist/templates/codemod/README.md +1 -0
  50. package/dist/templates/codemod/test.js +93 -0
  51. package/dist/templates/docs/README.md +150 -0
  52. package/dist/templates/scripts/quality-gates/check-god-objects.js +146 -0
  53. package/dist/templates/scripts/quality-gates/run-quality-gates.js +50 -0
  54. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +1997 -0
  55. package/dist/tool-loader.js +6 -1
  56. package/dist/tool-validator.js +8 -2
  57. package/dist/utils/detection.js +4 -3
  58. package/dist/utils/git-lock.js +119 -0
  59. package/dist/utils/gitignore-updater.js +148 -0
  60. package/dist/utils/project-analysis.js +176 -16
  61. package/dist/utils/quality-gates.js +48 -7
  62. package/dist/utils/spec-resolver.js +27 -3
  63. package/dist/utils/yaml-validation.js +156 -0
  64. package/dist/validation/spec-validation.js +81 -2
  65. package/package.json +2 -2
  66. package/templates/.caws/schemas/waivers.schema.json +30 -0
  67. package/templates/.caws/schemas/working-spec.schema.json +133 -0
  68. package/templates/.caws/templates/working-spec.template.yml +74 -0
  69. package/templates/.caws/tools/README.md +21 -0
  70. package/templates/.caws/tools/scope-guard.js +208 -0
  71. package/templates/.caws/tools-allow.json +331 -0
  72. package/templates/.caws/waivers.yml +19 -0
  73. package/templates/.cursor/hooks/scope-guard.sh +2 -2
  74. package/templates/.cursor/hooks/validate-spec.sh +42 -7
  75. package/dist/budget-derivation.d.ts +0 -74
  76. package/dist/budget-derivation.d.ts.map +0 -1
  77. package/dist/cicd-optimizer.d.ts +0 -142
  78. package/dist/cicd-optimizer.d.ts.map +0 -1
  79. package/dist/commands/archive.d.ts +0 -50
  80. package/dist/commands/archive.d.ts.map +0 -1
  81. package/dist/commands/burnup.d.ts +0 -6
  82. package/dist/commands/burnup.d.ts.map +0 -1
  83. package/dist/commands/diagnose.d.ts +0 -52
  84. package/dist/commands/diagnose.d.ts.map +0 -1
  85. package/dist/commands/evaluate.d.ts +0 -8
  86. package/dist/commands/evaluate.d.ts.map +0 -1
  87. package/dist/commands/init.d.ts +0 -5
  88. package/dist/commands/init.d.ts.map +0 -1
  89. package/dist/commands/iterate.d.ts +0 -8
  90. package/dist/commands/iterate.d.ts.map +0 -1
  91. package/dist/commands/mode.d.ts +0 -24
  92. package/dist/commands/mode.d.ts.map +0 -1
  93. package/dist/commands/plan.d.ts +0 -49
  94. package/dist/commands/plan.d.ts.map +0 -1
  95. package/dist/commands/provenance.d.ts +0 -32
  96. package/dist/commands/provenance.d.ts.map +0 -1
  97. package/dist/commands/quality-gates.d.ts +0 -52
  98. package/dist/commands/quality-gates.d.ts.map +0 -1
  99. package/dist/commands/quality-monitor.d.ts +0 -17
  100. package/dist/commands/quality-monitor.d.ts.map +0 -1
  101. package/dist/commands/specs.d.ts +0 -71
  102. package/dist/commands/specs.d.ts.map +0 -1
  103. package/dist/commands/status.d.ts +0 -44
  104. package/dist/commands/status.d.ts.map +0 -1
  105. package/dist/commands/templates.d.ts +0 -74
  106. package/dist/commands/templates.d.ts.map +0 -1
  107. package/dist/commands/tool.d.ts +0 -13
  108. package/dist/commands/tool.d.ts.map +0 -1
  109. package/dist/commands/troubleshoot.d.ts +0 -8
  110. package/dist/commands/troubleshoot.d.ts.map +0 -1
  111. package/dist/commands/tutorial.d.ts +0 -55
  112. package/dist/commands/tutorial.d.ts.map +0 -1
  113. package/dist/commands/validate.d.ts +0 -15
  114. package/dist/commands/validate.d.ts.map +0 -1
  115. package/dist/commands/waivers.d.ts +0 -8
  116. package/dist/commands/waivers.d.ts.map +0 -1
  117. package/dist/commands/workflow.d.ts +0 -85
  118. package/dist/commands/workflow.d.ts.map +0 -1
  119. package/dist/config/index.d.ts +0 -29
  120. package/dist/config/index.d.ts.map +0 -1
  121. package/dist/config/modes.d.ts +0 -225
  122. package/dist/config/modes.d.ts.map +0 -1
  123. package/dist/constants/spec-types.d.ts +0 -41
  124. package/dist/constants/spec-types.d.ts.map +0 -1
  125. package/dist/error-handler.d.ts +0 -164
  126. package/dist/error-handler.d.ts.map +0 -1
  127. package/dist/generators/jest-config.d.ts +0 -32
  128. package/dist/generators/jest-config.d.ts.map +0 -1
  129. package/dist/generators/working-spec.d.ts +0 -13
  130. package/dist/generators/working-spec.d.ts.map +0 -1
  131. package/dist/index-new.d.ts +0 -5
  132. package/dist/index-new.d.ts.map +0 -1
  133. package/dist/index-new.js +0 -317
  134. package/dist/index.d.ts +0 -5
  135. package/dist/index.d.ts.map +0 -1
  136. package/dist/index.js.backup +0 -4711
  137. package/dist/minimal-cli.d.ts +0 -3
  138. package/dist/minimal-cli.d.ts.map +0 -1
  139. package/dist/policy/PolicyManager.d.ts +0 -104
  140. package/dist/policy/PolicyManager.d.ts.map +0 -1
  141. package/dist/scaffold/cursor-hooks.d.ts +0 -7
  142. package/dist/scaffold/cursor-hooks.d.ts.map +0 -1
  143. package/dist/scaffold/git-hooks.d.ts +0 -20
  144. package/dist/scaffold/git-hooks.d.ts.map +0 -1
  145. package/dist/scaffold/index.d.ts +0 -20
  146. package/dist/scaffold/index.d.ts.map +0 -1
  147. package/dist/spec/SpecFileManager.d.ts +0 -146
  148. package/dist/spec/SpecFileManager.d.ts.map +0 -1
  149. package/dist/test-analysis.d.ts +0 -182
  150. package/dist/test-analysis.d.ts.map +0 -1
  151. package/dist/tool-interface.d.ts +0 -236
  152. package/dist/tool-interface.d.ts.map +0 -1
  153. package/dist/tool-loader.d.ts +0 -77
  154. package/dist/tool-loader.d.ts.map +0 -1
  155. package/dist/tool-validator.d.ts +0 -72
  156. package/dist/tool-validator.d.ts.map +0 -1
  157. package/dist/utils/detection.d.ts +0 -7
  158. package/dist/utils/detection.d.ts.map +0 -1
  159. package/dist/utils/finalization.d.ts +0 -17
  160. package/dist/utils/finalization.d.ts.map +0 -1
  161. package/dist/utils/project-analysis.d.ts +0 -14
  162. package/dist/utils/project-analysis.d.ts.map +0 -1
  163. package/dist/utils/quality-gates.d.ts +0 -49
  164. package/dist/utils/quality-gates.d.ts.map +0 -1
  165. package/dist/utils/spec-resolver.d.ts +0 -88
  166. package/dist/utils/spec-resolver.d.ts.map +0 -1
  167. package/dist/utils/typescript-detector.d.ts +0 -63
  168. package/dist/utils/typescript-detector.d.ts.map +0 -1
  169. package/dist/validation/spec-validation.d.ts +0 -43
  170. package/dist/validation/spec-validation.d.ts.map +0 -1
  171. package/dist/waivers-manager.d.ts +0 -167
  172. package/dist/waivers-manager.d.ts.map +0 -1
  173. package/templates/apps/tools/caws/COMPLETION_REPORT.md +0 -331
  174. package/templates/apps/tools/caws/MIGRATION_SUMMARY.md +0 -360
  175. package/templates/apps/tools/caws/README.md +0 -463
  176. package/templates/apps/tools/caws/TEST_STATUS.md +0 -365
  177. package/templates/apps/tools/caws/attest.js +0 -357
  178. package/templates/apps/tools/caws/ci-optimizer.js +0 -642
  179. package/templates/apps/tools/caws/config.ts +0 -245
  180. package/templates/apps/tools/caws/cross-functional.js +0 -876
  181. package/templates/apps/tools/caws/dashboard.js +0 -1112
  182. package/templates/apps/tools/caws/flake-detector.ts +0 -362
  183. package/templates/apps/tools/caws/gates.js +0 -198
  184. package/templates/apps/tools/caws/gates.ts +0 -271
  185. package/templates/apps/tools/caws/language-adapters.ts +0 -381
  186. package/templates/apps/tools/caws/language-support.d.ts +0 -367
  187. package/templates/apps/tools/caws/language-support.d.ts.map +0 -1
  188. package/templates/apps/tools/caws/language-support.js +0 -585
  189. package/templates/apps/tools/caws/legacy-assessment.ts +0 -408
  190. package/templates/apps/tools/caws/legacy-assessor.js +0 -764
  191. package/templates/apps/tools/caws/mutant-analyzer.js +0 -734
  192. package/templates/apps/tools/caws/perf-budgets.ts +0 -349
  193. package/templates/apps/tools/caws/prompt-lint.js.backup +0 -274
  194. package/templates/apps/tools/caws/property-testing.js +0 -707
  195. package/templates/apps/tools/caws/provenance.d.ts +0 -14
  196. package/templates/apps/tools/caws/provenance.d.ts.map +0 -1
  197. package/templates/apps/tools/caws/provenance.js +0 -132
  198. package/templates/apps/tools/caws/provenance.js.backup +0 -73
  199. package/templates/apps/tools/caws/provenance.ts +0 -211
  200. package/templates/apps/tools/caws/security-provenance.ts +0 -483
  201. package/templates/apps/tools/caws/shared/base-tool.ts +0 -281
  202. package/templates/apps/tools/caws/shared/config-manager.ts +0 -366
  203. package/templates/apps/tools/caws/shared/gate-checker.ts +0 -849
  204. package/templates/apps/tools/caws/shared/types.ts +0 -444
  205. package/templates/apps/tools/caws/shared/validator.ts +0 -305
  206. package/templates/apps/tools/caws/shared/waivers-manager.ts +0 -174
  207. package/templates/apps/tools/caws/spec-test-mapper.ts +0 -391
  208. package/templates/apps/tools/caws/test-quality.js +0 -578
  209. package/templates/apps/tools/caws/validate.js +0 -76
  210. package/templates/apps/tools/caws/validate.ts +0 -228
  211. package/templates/apps/tools/caws/waivers.js +0 -344
  212. /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/waivers.schema.json +0 -0
  213. /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/working-spec.schema.json +0 -0
  214. /package/{templates/apps/tools/caws → dist/templates/.caws}/templates/working-spec.template.yml +0 -0
  215. /package/{templates/apps/tools/caws → dist/templates/.caws/tools}/scope-guard.js +0 -0
  216. /package/{templates/apps/tools/caws → dist/templates/.caws}/tools-allow.json +0 -0
  217. /package/{templates/apps/tools/caws → dist/templates/.caws}/waivers.yml +0 -0
@@ -1,271 +0,0 @@
1
- #!/usr/bin/env tsx
2
-
3
- /**
4
- * CAWS Gates Tool - Enhanced Implementation
5
- * CLI wrapper for CawsGateChecker with tier policies
6
- *
7
- * @author @darianrosebrook
8
- */
9
-
10
- import { CawsGateChecker } from './shared/gate-checker.js';
11
- import { CawsConfigManager } from './shared/config-manager.js';
12
-
13
- // Tier policies for quality gates
14
- const TIER_POLICIES = {
15
- 1: {
16
- branch_coverage: 0.9,
17
- mutation_score: 0.7,
18
- max_files: 40,
19
- max_loc: 1500,
20
- trust_score: 85,
21
- },
22
- 2: {
23
- branch_coverage: 0.8,
24
- mutation_score: 0.5,
25
- max_files: 25,
26
- max_loc: 1000,
27
- trust_score: 82,
28
- },
29
- 3: {
30
- branch_coverage: 0.7,
31
- mutation_score: 0.3,
32
- max_files: 15,
33
- max_loc: 500,
34
- trust_score: 75,
35
- },
36
- };
37
-
38
- class GatesCLI {
39
- private gateChecker: CawsGateChecker;
40
- private configManager: CawsConfigManager;
41
-
42
- constructor() {
43
- this.gateChecker = new CawsGateChecker();
44
- this.configManager = new CawsConfigManager();
45
- }
46
-
47
- /**
48
- * Show tier policy
49
- */
50
- showTierPolicy(tier: number = 1): void {
51
- const policy = TIER_POLICIES[tier as keyof typeof TIER_POLICIES];
52
- if (!policy) {
53
- console.error(`āŒ Unknown tier: ${tier}`);
54
- process.exit(1);
55
- }
56
-
57
- console.log(`šŸ“‹ Tier ${tier} Policy:`);
58
- console.log(`Branch Coverage: ≄${policy.branch_coverage * 100}%`);
59
- console.log(`Mutation Score: ≄${policy.mutation_score * 100}%`);
60
- console.log(`Max Files: ${policy.max_files}`);
61
- console.log(`Max LOC: ${policy.max_loc}`);
62
- console.log(`Trust Score: ≄${policy.trust_score}`);
63
- console.log('Requires Contracts: true');
64
- console.log('Manual Review: Required');
65
- }
66
-
67
- /**
68
- * Enforce coverage gate using CawsGateChecker
69
- */
70
- async enforceCoverageGate(tier: number = 2): Promise<boolean> {
71
- try {
72
- const policy = TIER_POLICIES[tier as keyof typeof TIER_POLICIES];
73
- const result = await this.gateChecker.checkCoverage({
74
- tier,
75
- workingDirectory: process.cwd(),
76
- });
77
-
78
- if (result.passed) {
79
- console.log(
80
- `āœ… Coverage gate passed: ${(result.score * 100).toFixed(1)}% ≄ ${policy.branch_coverage * 100}%`
81
- );
82
- return true;
83
- } else {
84
- console.log(
85
- `āŒ Coverage gate failed: ${(result.score * 100).toFixed(1)}% < ${policy.branch_coverage * 100}%`
86
- );
87
- if (result.errors && result.errors.length > 0) {
88
- result.errors.forEach((error) => console.error(` - ${error}`));
89
- }
90
- if (result.details?.searched_paths) {
91
- console.error(` Searched paths: ${result.details.searched_paths.join(', ')}`);
92
- }
93
- if (result.details?.run_command) {
94
- console.error(` Run: ${result.details.run_command}`);
95
- }
96
- if (result.details?.waiver_available) {
97
- console.error(` šŸ’” ${result.details.waiver_suggestion}`);
98
- console.error(` ${result.details.waiver_command}`);
99
- }
100
- return false;
101
- }
102
- } catch (error) {
103
- console.error(`āŒ Coverage gate check failed: ${error}`);
104
- return false;
105
- }
106
- }
107
-
108
- /**
109
- * Enforce mutation gate using CawsGateChecker
110
- */
111
- async enforceMutationGate(tier: number = 2): Promise<boolean> {
112
- try {
113
- const policy = TIER_POLICIES[tier as keyof typeof TIER_POLICIES];
114
- const result = await this.gateChecker.checkMutation({
115
- tier,
116
- workingDirectory: process.cwd(),
117
- });
118
-
119
- if (result.passed) {
120
- console.log(
121
- `āœ… Mutation gate passed: ${(result.score * 100).toFixed(1)}% ≄ ${policy.mutation_score * 100}%`
122
- );
123
- return true;
124
- } else {
125
- console.log(
126
- `āŒ Mutation gate failed: ${(result.score * 100).toFixed(1)}% < ${policy.mutation_score * 100}%`
127
- );
128
- if (result.errors && result.errors.length > 0) {
129
- result.errors.forEach((error) => console.error(` - ${error}`));
130
- }
131
- if (result.details?.searched_paths) {
132
- console.error(` Searched paths: ${result.details.searched_paths.join(', ')}`);
133
- }
134
- if (result.details?.run_command) {
135
- console.error(` Run: ${result.details.run_command}`);
136
- }
137
- if (result.details?.waiver_available) {
138
- console.error(` šŸ’” ${result.details.waiver_suggestion}`);
139
- console.error(
140
- ` caws waivers create --title="Mutation waiver" --reason=emergency_hotfix --gates=mutation`
141
- );
142
- }
143
- return false;
144
- }
145
- } catch (error) {
146
- console.error(`āŒ Mutation gate check failed: ${error}`);
147
- return false;
148
- }
149
- }
150
-
151
- /**
152
- * Enforce contract gate using CawsGateChecker
153
- */
154
- async enforceContractGate(tier: number = 2): Promise<boolean> {
155
- try {
156
- const result = await this.gateChecker.checkContracts({
157
- tier,
158
- workingDirectory: process.cwd(),
159
- });
160
-
161
- if (result.passed) {
162
- console.log('āœ… Contract gate passed');
163
- return true;
164
- } else {
165
- console.log('āŒ Contract gate failed');
166
- if (result.errors && result.errors.length > 0) {
167
- result.errors.forEach((error) => console.error(` - ${error}`));
168
- }
169
- if (result.details?.searched_paths) {
170
- console.error(` Searched paths: ${result.details.searched_paths.join(', ')}`);
171
- }
172
- if (result.details?.example_command) {
173
- console.error(` Example: ${result.details.example_command}`);
174
- }
175
- console.error(
176
- ` šŸ’” If contracts are not required for this tier, consider creating a waiver`
177
- );
178
- console.error(
179
- ` caws waivers create --title="Contract waiver" --reason=experimental_feature --gates=contracts`
180
- );
181
- return false;
182
- }
183
- } catch (error) {
184
- console.error(`āŒ Contract gate check failed: ${error}`);
185
- return false;
186
- }
187
- }
188
-
189
- /**
190
- * Run all gates for a tier
191
- */
192
- async runAllGates(tier: number = 2): Promise<boolean> {
193
- console.log(`\n🚪 Running all gates for Tier ${tier}...\n`);
194
-
195
- const results = await Promise.all([
196
- this.enforceCoverageGate(tier),
197
- this.enforceMutationGate(tier),
198
- this.enforceContractGate(tier),
199
- ]);
200
-
201
- const allPassed = results.every((r) => r);
202
-
203
- console.log(`\n${'='.repeat(50)}`);
204
- if (allPassed) {
205
- console.log('āœ… All gates passed!');
206
- } else {
207
- console.log('āŒ Some gates failed');
208
- }
209
- console.log('='.repeat(50));
210
-
211
- return allPassed;
212
- }
213
- }
214
-
215
- // Main CLI handler
216
- if (import.meta.url === `file://${process.argv[1]}`) {
217
- (async () => {
218
- const command = process.argv[2];
219
- const cli = new GatesCLI();
220
-
221
- switch (command) {
222
- case 'tier': {
223
- const tier = parseInt(process.argv[3]) || 1;
224
- cli.showTierPolicy(tier);
225
- break;
226
- }
227
-
228
- case 'coverage': {
229
- const tier = parseInt(process.argv[3]) || 2;
230
- const passed = await cli.enforceCoverageGate(tier);
231
- process.exit(passed ? 0 : 1);
232
- }
233
-
234
- case 'mutation': {
235
- const tier = parseInt(process.argv[3]) || 2;
236
- const passed = await cli.enforceMutationGate(tier);
237
- process.exit(passed ? 0 : 1);
238
- }
239
-
240
- case 'contracts': {
241
- const tier = parseInt(process.argv[3]) || 2;
242
- const passed = await cli.enforceContractGate(tier);
243
- process.exit(passed ? 0 : 1);
244
- }
245
-
246
- case 'all': {
247
- const tier = parseInt(process.argv[3]) || 2;
248
- const passed = await cli.runAllGates(tier);
249
- process.exit(passed ? 0 : 1);
250
- }
251
-
252
- default:
253
- console.log('CAWS Gates Tool - Quality Gate Enforcement');
254
- console.log('');
255
- console.log('Commands:');
256
- console.log(' tier <tier> - Show tier policy');
257
- console.log(' coverage <tier> - Enforce coverage gate');
258
- console.log(' mutation <tier> - Enforce mutation gate');
259
- console.log(' contracts <tier> - Enforce contract gate');
260
- console.log(' all <tier> - Run all gates for tier');
261
- console.log('');
262
- console.log('Examples:');
263
- console.log(' gates.ts tier 1');
264
- console.log(' gates.ts coverage 2');
265
- console.log(' gates.ts all 2');
266
- process.exit(1);
267
- }
268
- })();
269
- }
270
-
271
- export { GatesCLI };
@@ -1,381 +0,0 @@
1
- #!/usr/bin/env tsx
2
-
3
- /**
4
- * CAWS Language Adapter Manager
5
- * Multi-language support for TypeScript, Python, Rust, Go, Java
6
- *
7
- * @author @darianrosebrook
8
- */
9
-
10
- import * as path from 'path';
11
- import { CawsBaseTool } from './shared/base-tool.js';
12
- import { TierPolicy, GateConfig } from './shared/types.js';
13
-
14
- interface LanguageAdapter {
15
- language: string;
16
- fileExtensions: string[];
17
- tools: {
18
- unitTest: { command: string; args: string[] };
19
- coverage: { command: string; args: string[] };
20
- mutationTest?: { command: string; args: string[] };
21
- contractTest?: { command: string; args: string[] };
22
- lint: { command: string; args: string[] };
23
- };
24
- tierAdjustments?: {
25
- [tier: number]: Partial<TierPolicy>;
26
- };
27
- fallbacks?: {
28
- mutation?: string; // What to do if mutation testing unavailable
29
- contracts?: string;
30
- };
31
- }
32
-
33
- export class LanguageAdapterManager extends CawsBaseTool {
34
- private adapters: Map<string, LanguageAdapter> = new Map();
35
-
36
- constructor() {
37
- super();
38
- this.initializeAdapters();
39
- }
40
-
41
- private initializeAdapters(): void {
42
- // TypeScript/JavaScript adapter
43
- this.adapters.set('typescript', {
44
- language: 'typescript',
45
- fileExtensions: ['.ts', '.tsx', '.js', '.jsx'],
46
- tools: {
47
- unitTest: { command: 'vitest', args: ['run'] },
48
- coverage: { command: 'vitest', args: ['run', '--coverage'] },
49
- mutationTest: { command: 'stryker', args: ['run'] },
50
- contractTest: { command: 'pact', args: ['verify'] },
51
- lint: { command: 'eslint', args: ['.'] },
52
- },
53
- });
54
-
55
- // Python adapter
56
- this.adapters.set('python', {
57
- language: 'python',
58
- fileExtensions: ['.py'],
59
- tools: {
60
- unitTest: { command: 'pytest', args: [] },
61
- coverage: { command: 'pytest', args: ['--cov'] },
62
- mutationTest: { command: 'mutmut', args: ['run'] },
63
- contractTest: { command: 'schemathesis', args: ['run'] },
64
- lint: { command: 'ruff', args: ['check', '.'] },
65
- },
66
- tierAdjustments: {
67
- 1: { min_mutation: 0.6 }, // Python mutation testing is less mature
68
- 2: { min_mutation: 0.4 },
69
- 3: { min_mutation: 0.25 },
70
- },
71
- fallbacks: {
72
- mutation: 'If mutation testing unavailable, increase integration test coverage by 20%',
73
- contracts: 'Use pytest with OpenAPI schema validation',
74
- },
75
- });
76
-
77
- // Rust adapter
78
- this.adapters.set('rust', {
79
- language: 'rust',
80
- fileExtensions: ['.rs'],
81
- tools: {
82
- unitTest: { command: 'cargo', args: ['test'] },
83
- coverage: { command: 'cargo', args: ['tarpaulin', '--out', 'Json'] },
84
- mutationTest: { command: 'cargo', args: ['mutants'] },
85
- lint: { command: 'cargo', args: ['clippy', '--', '-D', 'warnings'] },
86
- },
87
- tierAdjustments: {
88
- 1: { min_mutation: 0.65 },
89
- 2: { min_mutation: 0.45 },
90
- 3: { min_mutation: 0.3 },
91
- },
92
- });
93
-
94
- // Go adapter
95
- this.adapters.set('go', {
96
- language: 'go',
97
- fileExtensions: ['.go'],
98
- tools: {
99
- unitTest: { command: 'go', args: ['test', './...'] },
100
- coverage: {
101
- command: 'go',
102
- args: ['test', '-coverprofile=coverage.out', './...'],
103
- },
104
- lint: { command: 'golangci-lint', args: ['run'] },
105
- },
106
- fallbacks: {
107
- mutation: 'Go lacks mature mutation testing - require 90% branch coverage instead',
108
- contracts: 'Use go-swagger for API contract validation',
109
- },
110
- });
111
-
112
- // Java adapter
113
- this.adapters.set('java', {
114
- language: 'java',
115
- fileExtensions: ['.java'],
116
- tools: {
117
- unitTest: { command: 'mvn', args: ['test'] },
118
- coverage: { command: 'mvn', args: ['jacoco:report'] },
119
- mutationTest: {
120
- command: 'mvn',
121
- args: ['org.pitest:pitest-maven:mutationCoverage'],
122
- },
123
- contractTest: { command: 'mvn', args: ['pact:verify'] },
124
- lint: { command: 'mvn', args: ['checkstyle:check'] },
125
- },
126
- });
127
- }
128
-
129
- /**
130
- * Detect project language based on files present
131
- */
132
- detectLanguage(projectDir: string): string | null {
133
- const indicators = [
134
- { file: 'package.json', language: 'typescript' },
135
- { file: 'tsconfig.json', language: 'typescript' },
136
- { file: 'requirements.txt', language: 'python' },
137
- { file: 'pyproject.toml', language: 'python' },
138
- { file: 'Pipfile', language: 'python' },
139
- { file: 'Cargo.toml', language: 'rust' },
140
- { file: 'go.mod', language: 'go' },
141
- { file: 'pom.xml', language: 'java' },
142
- { file: 'build.gradle', language: 'java' },
143
- ];
144
-
145
- for (const indicator of indicators) {
146
- const filePath = path.join(projectDir, indicator.file);
147
- if (this.pathExists(filePath)) {
148
- return indicator.language;
149
- }
150
- }
151
-
152
- return null;
153
- }
154
-
155
- /**
156
- * Get adapter for a specific language
157
- */
158
- getAdapter(language: string): LanguageAdapter | null {
159
- return this.adapters.get(language.toLowerCase()) || null;
160
- }
161
-
162
- /**
163
- * Get adjusted tier policy for a language
164
- */
165
- getAdjustedTierPolicy(language: string, tier: number): TierPolicy | null {
166
- const adapter = this.getAdapter(language);
167
- if (!adapter) return null;
168
-
169
- const basePolicies: Record<number, TierPolicy> = {
170
- 1: {
171
- min_branch: 0.9,
172
- min_coverage: 0.9,
173
- min_mutation: 0.7,
174
- requires_contracts: true,
175
- requires_manual_review: true,
176
- },
177
- 2: {
178
- min_branch: 0.8,
179
- min_coverage: 0.8,
180
- min_mutation: 0.5,
181
- requires_contracts: true,
182
- },
183
- 3: {
184
- min_branch: 0.7,
185
- min_coverage: 0.7,
186
- min_mutation: 0.3,
187
- requires_contracts: false,
188
- },
189
- };
190
-
191
- const basePolicy = basePolicies[tier];
192
- if (!basePolicy) return null;
193
-
194
- // Apply language-specific adjustments
195
- const adjustments = adapter.tierAdjustments?.[tier] || {};
196
- return { ...basePolicy, ...adjustments };
197
- }
198
-
199
- /**
200
- * Generate language-specific configuration
201
- */
202
- generateConfig(language: string): Record<string, any> | null {
203
- const adapter = this.getAdapter(language);
204
- if (!adapter) return null;
205
-
206
- return {
207
- language: adapter.language,
208
- tools: adapter.tools,
209
- gates: this.generateGateConfig(adapter),
210
- tierAdjustments: adapter.tierAdjustments,
211
- fallbacks: adapter.fallbacks,
212
- };
213
- }
214
-
215
- private generateGateConfig(adapter: LanguageAdapter): Record<string, GateConfig> {
216
- const gates: Record<string, GateConfig> = {
217
- coverage: {
218
- enabled: true,
219
- threshold: 0.8,
220
- },
221
- mutation: {
222
- enabled: !!adapter.tools.mutationTest,
223
- threshold: 0.5,
224
- },
225
- contracts: {
226
- enabled: !!adapter.tools.contractTest,
227
- threshold: 1.0,
228
- },
229
- };
230
-
231
- return gates;
232
- }
233
-
234
- /**
235
- * List all available adapters
236
- */
237
- listAdapters(): Array<{
238
- language: string;
239
- hasMutation: boolean;
240
- hasContracts: boolean;
241
- }> {
242
- return Array.from(this.adapters.values()).map((adapter) => ({
243
- language: adapter.language,
244
- hasMutation: !!adapter.tools.mutationTest,
245
- hasContracts: !!adapter.tools.contractTest,
246
- }));
247
- }
248
-
249
- /**
250
- * Check if tools are available for a language
251
- */
252
- checkToolAvailability(language: string): {
253
- language: string;
254
- available: Record<string, boolean>;
255
- missing: string[];
256
- } {
257
- const adapter = this.getAdapter(language);
258
- if (!adapter) {
259
- return { language, available: {}, missing: [] };
260
- }
261
-
262
- const available: Record<string, boolean> = {};
263
- const missing: string[] = [];
264
-
265
- const toolChecks = [
266
- { name: 'unitTest', tool: adapter.tools.unitTest },
267
- { name: 'coverage', tool: adapter.tools.coverage },
268
- { name: 'mutationTest', tool: adapter.tools.mutationTest },
269
- { name: 'contractTest', tool: adapter.tools.contractTest },
270
- { name: 'lint', tool: adapter.tools.lint },
271
- ];
272
-
273
- for (const { name, tool } of toolChecks) {
274
- if (tool) {
275
- // Simple check - just verify command exists (would need proper implementation)
276
- available[name] = true; // Placeholder
277
- } else {
278
- available[name] = false;
279
- missing.push(name);
280
- }
281
- }
282
-
283
- return { language, available, missing };
284
- }
285
- }
286
-
287
- // CLI interface
288
- if (import.meta.url === `file://${process.argv[1]}`) {
289
- const command = process.argv[2];
290
- const manager = new LanguageAdapterManager();
291
-
292
- switch (command) {
293
- case 'detect': {
294
- const projectDir = process.argv[3] || process.cwd();
295
- const language = manager.detectLanguage(projectDir);
296
-
297
- if (language) {
298
- console.log(`āœ… Detected language: ${language}`);
299
- const adapter = manager.getAdapter(language);
300
- if (adapter) {
301
- console.log(`\nšŸ“¦ Available tools:`);
302
- console.log(` Unit tests: ${adapter.tools.unitTest.command}`);
303
- console.log(` Coverage: ${adapter.tools.coverage.command}`);
304
- if (adapter.tools.mutationTest) {
305
- console.log(` Mutation: ${adapter.tools.mutationTest.command}`);
306
- }
307
- if (adapter.tools.contractTest) {
308
- console.log(` Contracts: ${adapter.tools.contractTest.command}`);
309
- }
310
- console.log(` Lint: ${adapter.tools.lint.command}`);
311
- }
312
- } else {
313
- console.log('āŒ Could not detect language');
314
- process.exit(1);
315
- }
316
- break;
317
- }
318
-
319
- case 'list': {
320
- const adapters = manager.listAdapters();
321
- console.log('Available Language Adapters:');
322
- console.log('='.repeat(50));
323
- adapters.forEach((adapter) => {
324
- console.log(`\nšŸ“š ${adapter.language}`);
325
- console.log(` Mutation testing: ${adapter.hasMutation ? 'āœ…' : 'āŒ'}`);
326
- console.log(` Contract testing: ${adapter.hasContracts ? 'āœ…' : 'āŒ'}`);
327
- });
328
- break;
329
- }
330
-
331
- case 'config': {
332
- const language = process.argv[3];
333
- if (!language) {
334
- console.error('Usage: language-adapters config <language>');
335
- process.exit(1);
336
- }
337
-
338
- const config = manager.generateConfig(language);
339
- if (config) {
340
- console.log(JSON.stringify(config, null, 2));
341
- } else {
342
- console.error(`āŒ No adapter found for language: ${language}`);
343
- process.exit(1);
344
- }
345
- break;
346
- }
347
-
348
- case 'tier': {
349
- const language = process.argv[3];
350
- const tier = parseInt(process.argv[4]);
351
-
352
- if (!language || !tier) {
353
- console.error('Usage: language-adapters tier <language> <tier>');
354
- process.exit(1);
355
- }
356
-
357
- const policy = manager.getAdjustedTierPolicy(language, tier);
358
- if (policy) {
359
- console.log(`Tier ${tier} policy for ${language}:`);
360
- console.log(JSON.stringify(policy, null, 2));
361
- } else {
362
- console.error(`āŒ Could not get policy for ${language} tier ${tier}`);
363
- process.exit(1);
364
- }
365
- break;
366
- }
367
-
368
- default:
369
- console.log('CAWS Language Adapter Manager');
370
- console.log('');
371
- console.log('Usage:');
372
- console.log(' language-adapters detect [dir] - Detect project language');
373
- console.log(' language-adapters list - List available adapters');
374
- console.log(' language-adapters config <language> - Generate config for language');
375
- console.log(' language-adapters tier <language> <tier> - Get tier policy for language');
376
- console.log('');
377
- console.log('Supported Languages:');
378
- console.log(' typescript, python, rust, go, java');
379
- break;
380
- }
381
- }