tlc-claude-code 1.4.9 → 1.5.2

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 (122) hide show
  1. package/CLAUDE.md +23 -0
  2. package/CODING-STANDARDS.md +408 -0
  3. package/bin/install.js +2 -0
  4. package/dashboard/dist/components/QualityGatePane.d.ts +38 -0
  5. package/dashboard/dist/components/QualityGatePane.js +31 -0
  6. package/dashboard/dist/components/QualityGatePane.test.d.ts +1 -0
  7. package/dashboard/dist/components/QualityGatePane.test.js +147 -0
  8. package/dashboard/dist/components/orchestration/AgentCard.d.ts +26 -0
  9. package/dashboard/dist/components/orchestration/AgentCard.js +60 -0
  10. package/dashboard/dist/components/orchestration/AgentCard.test.d.ts +1 -0
  11. package/dashboard/dist/components/orchestration/AgentCard.test.js +63 -0
  12. package/dashboard/dist/components/orchestration/AgentControls.d.ts +11 -0
  13. package/dashboard/dist/components/orchestration/AgentControls.js +20 -0
  14. package/dashboard/dist/components/orchestration/AgentControls.test.d.ts +1 -0
  15. package/dashboard/dist/components/orchestration/AgentControls.test.js +52 -0
  16. package/dashboard/dist/components/orchestration/AgentDetail.d.ts +35 -0
  17. package/dashboard/dist/components/orchestration/AgentDetail.js +37 -0
  18. package/dashboard/dist/components/orchestration/AgentDetail.test.d.ts +1 -0
  19. package/dashboard/dist/components/orchestration/AgentDetail.test.js +79 -0
  20. package/dashboard/dist/components/orchestration/AgentList.d.ts +31 -0
  21. package/dashboard/dist/components/orchestration/AgentList.js +47 -0
  22. package/dashboard/dist/components/orchestration/AgentList.test.d.ts +1 -0
  23. package/dashboard/dist/components/orchestration/AgentList.test.js +64 -0
  24. package/dashboard/dist/components/orchestration/CostMeter.d.ts +11 -0
  25. package/dashboard/dist/components/orchestration/CostMeter.js +28 -0
  26. package/dashboard/dist/components/orchestration/CostMeter.test.d.ts +1 -0
  27. package/dashboard/dist/components/orchestration/CostMeter.test.js +50 -0
  28. package/dashboard/dist/components/orchestration/ModelSelector.d.ts +20 -0
  29. package/dashboard/dist/components/orchestration/ModelSelector.js +12 -0
  30. package/dashboard/dist/components/orchestration/ModelSelector.test.d.ts +1 -0
  31. package/dashboard/dist/components/orchestration/ModelSelector.test.js +56 -0
  32. package/dashboard/dist/components/orchestration/OrchestrationDashboard.d.ts +28 -0
  33. package/dashboard/dist/components/orchestration/OrchestrationDashboard.js +28 -0
  34. package/dashboard/dist/components/orchestration/OrchestrationDashboard.test.d.ts +1 -0
  35. package/dashboard/dist/components/orchestration/OrchestrationDashboard.test.js +56 -0
  36. package/dashboard/dist/components/orchestration/QualityIndicator.d.ts +11 -0
  37. package/dashboard/dist/components/orchestration/QualityIndicator.js +37 -0
  38. package/dashboard/dist/components/orchestration/QualityIndicator.test.d.ts +1 -0
  39. package/dashboard/dist/components/orchestration/QualityIndicator.test.js +52 -0
  40. package/dashboard/dist/components/orchestration/index.d.ts +8 -0
  41. package/dashboard/dist/components/orchestration/index.js +8 -0
  42. package/package.json +1 -1
  43. package/server/lib/access-control.js +352 -0
  44. package/server/lib/access-control.test.js +322 -0
  45. package/server/lib/agents-cancel-command.js +139 -0
  46. package/server/lib/agents-cancel-command.test.js +180 -0
  47. package/server/lib/agents-get-command.js +159 -0
  48. package/server/lib/agents-get-command.test.js +167 -0
  49. package/server/lib/agents-list-command.js +150 -0
  50. package/server/lib/agents-list-command.test.js +149 -0
  51. package/server/lib/agents-logs-command.js +126 -0
  52. package/server/lib/agents-logs-command.test.js +198 -0
  53. package/server/lib/agents-retry-command.js +117 -0
  54. package/server/lib/agents-retry-command.test.js +192 -0
  55. package/server/lib/budget-limits.js +222 -0
  56. package/server/lib/budget-limits.test.js +214 -0
  57. package/server/lib/code-generator.js +291 -0
  58. package/server/lib/code-generator.test.js +307 -0
  59. package/server/lib/cost-command.js +290 -0
  60. package/server/lib/cost-command.test.js +202 -0
  61. package/server/lib/cost-optimizer.js +404 -0
  62. package/server/lib/cost-optimizer.test.js +232 -0
  63. package/server/lib/cost-projections.js +302 -0
  64. package/server/lib/cost-projections.test.js +217 -0
  65. package/server/lib/cost-reports.js +277 -0
  66. package/server/lib/cost-reports.test.js +254 -0
  67. package/server/lib/cost-tracker.js +216 -0
  68. package/server/lib/cost-tracker.test.js +302 -0
  69. package/server/lib/crypto-patterns.js +433 -0
  70. package/server/lib/crypto-patterns.test.js +346 -0
  71. package/server/lib/design-command.js +385 -0
  72. package/server/lib/design-command.test.js +249 -0
  73. package/server/lib/design-parser.js +237 -0
  74. package/server/lib/design-parser.test.js +290 -0
  75. package/server/lib/gemini-vision.js +377 -0
  76. package/server/lib/gemini-vision.test.js +282 -0
  77. package/server/lib/input-validator.js +360 -0
  78. package/server/lib/input-validator.test.js +295 -0
  79. package/server/lib/litellm-client.js +232 -0
  80. package/server/lib/litellm-client.test.js +267 -0
  81. package/server/lib/litellm-command.js +291 -0
  82. package/server/lib/litellm-command.test.js +260 -0
  83. package/server/lib/litellm-config.js +273 -0
  84. package/server/lib/litellm-config.test.js +212 -0
  85. package/server/lib/model-pricing.js +189 -0
  86. package/server/lib/model-pricing.test.js +178 -0
  87. package/server/lib/models-command.js +223 -0
  88. package/server/lib/models-command.test.js +193 -0
  89. package/server/lib/optimize-command.js +197 -0
  90. package/server/lib/optimize-command.test.js +193 -0
  91. package/server/lib/orchestration-integration.js +206 -0
  92. package/server/lib/orchestration-integration.test.js +235 -0
  93. package/server/lib/output-encoder.js +308 -0
  94. package/server/lib/output-encoder.test.js +312 -0
  95. package/server/lib/quality-evaluator.js +396 -0
  96. package/server/lib/quality-evaluator.test.js +337 -0
  97. package/server/lib/quality-gate-command.js +340 -0
  98. package/server/lib/quality-gate-command.test.js +321 -0
  99. package/server/lib/quality-gate-scorer.js +378 -0
  100. package/server/lib/quality-gate-scorer.test.js +376 -0
  101. package/server/lib/quality-history.js +265 -0
  102. package/server/lib/quality-history.test.js +359 -0
  103. package/server/lib/quality-presets.js +288 -0
  104. package/server/lib/quality-presets.test.js +269 -0
  105. package/server/lib/quality-retry.js +323 -0
  106. package/server/lib/quality-retry.test.js +325 -0
  107. package/server/lib/quality-thresholds.js +255 -0
  108. package/server/lib/quality-thresholds.test.js +237 -0
  109. package/server/lib/secure-auth.js +333 -0
  110. package/server/lib/secure-auth.test.js +288 -0
  111. package/server/lib/secure-code-command.js +540 -0
  112. package/server/lib/secure-code-command.test.js +309 -0
  113. package/server/lib/secure-errors.js +521 -0
  114. package/server/lib/secure-errors.test.js +298 -0
  115. package/server/lib/vision-command.js +372 -0
  116. package/server/lib/vision-command.test.js +255 -0
  117. package/server/lib/visual-command.js +350 -0
  118. package/server/lib/visual-command.test.js +256 -0
  119. package/server/lib/visual-testing.js +315 -0
  120. package/server/lib/visual-testing.test.js +357 -0
  121. package/server/package-lock.json +2 -2
  122. package/server/package.json +1 -1
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Crypto Patterns Tests
3
+ *
4
+ * Secure cryptography patterns for code generation
5
+ */
6
+
7
+ const { describe, it, beforeEach } = require('node:test');
8
+ const assert = require('node:assert');
9
+
10
+ const {
11
+ createCryptoPatterns,
12
+ detectHardcodedSecrets,
13
+ generateSecureRandom,
14
+ generateTlsConfig,
15
+ generateKeyRotation,
16
+ generateEncryptionCode,
17
+ generateSecretManagement,
18
+ } = require('./crypto-patterns.js');
19
+
20
+ describe('Crypto Patterns', () => {
21
+ let patterns;
22
+
23
+ beforeEach(() => {
24
+ patterns = createCryptoPatterns();
25
+ });
26
+
27
+ describe('createCryptoPatterns', () => {
28
+ it('creates patterns with default config', () => {
29
+ assert.ok(patterns);
30
+ assert.ok(patterns.algorithms);
31
+ });
32
+
33
+ it('includes modern algorithms', () => {
34
+ assert.ok(patterns.algorithms.includes('aes-256-gcm'));
35
+ });
36
+
37
+ it('excludes weak algorithms', () => {
38
+ assert.ok(!patterns.algorithms.includes('des'));
39
+ assert.ok(!patterns.algorithms.includes('md5'));
40
+ });
41
+ });
42
+
43
+ describe('detectHardcodedSecrets', () => {
44
+ it('detects API keys', () => {
45
+ const code = `
46
+ const apiKey = 'sk_live_abc123def456';
47
+ fetch(url, { headers: { Authorization: apiKey } });
48
+ `;
49
+
50
+ const result = detectHardcodedSecrets(code);
51
+
52
+ assert.ok(result.found);
53
+ assert.ok(result.secrets.length > 0);
54
+ });
55
+
56
+ it('detects AWS keys', () => {
57
+ const code = `
58
+ const accessKey = 'AKIAIOSFODNN7EXAMPLE';
59
+ const secretKey = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';
60
+ `;
61
+
62
+ const result = detectHardcodedSecrets(code);
63
+
64
+ assert.ok(result.found);
65
+ });
66
+
67
+ it('detects JWT secrets', () => {
68
+ const code = `
69
+ const jwtSecret = 'super-secret-key-12345';
70
+ jwt.sign(payload, jwtSecret);
71
+ `;
72
+
73
+ const result = detectHardcodedSecrets(code);
74
+
75
+ assert.ok(result.found);
76
+ });
77
+
78
+ it('detects database passwords', () => {
79
+ const code = `
80
+ const dbUrl = 'postgres://user:password123@localhost/db';
81
+ `;
82
+
83
+ const result = detectHardcodedSecrets(code);
84
+
85
+ assert.ok(result.found);
86
+ });
87
+
88
+ it('suggests environment variables', () => {
89
+ const code = `const apiKey = 'abc123';`;
90
+
91
+ const result = detectHardcodedSecrets(code);
92
+
93
+ assert.ok(result.suggestion);
94
+ assert.ok(result.suggestion.includes('env') || result.suggestion.includes('environment'));
95
+ });
96
+
97
+ it('ignores example placeholders', () => {
98
+ const code = `
99
+ const apiKey = 'YOUR_API_KEY_HERE';
100
+ const secret = '<insert-secret>';
101
+ `;
102
+
103
+ const result = detectHardcodedSecrets(code);
104
+
105
+ assert.strictEqual(result.found, false);
106
+ });
107
+
108
+ it('detects private keys', () => {
109
+ const code = `
110
+ const privateKey = '-----BEGIN RSA PRIVATE KEY-----\\nMIIE...';
111
+ `;
112
+
113
+ const result = detectHardcodedSecrets(code);
114
+
115
+ assert.ok(result.found);
116
+ });
117
+ });
118
+
119
+ describe('generateSecureRandom', () => {
120
+ it('uses crypto.randomBytes', () => {
121
+ const code = generateSecureRandom({
122
+ language: 'javascript',
123
+ length: 32,
124
+ });
125
+
126
+ assert.ok(code.includes('crypto') && code.includes('random'));
127
+ });
128
+
129
+ it('generates hex output', () => {
130
+ const code = generateSecureRandom({
131
+ language: 'javascript',
132
+ encoding: 'hex',
133
+ });
134
+
135
+ assert.ok(code.includes('hex'));
136
+ });
137
+
138
+ it('generates base64 output', () => {
139
+ const code = generateSecureRandom({
140
+ language: 'javascript',
141
+ encoding: 'base64',
142
+ });
143
+
144
+ assert.ok(code.includes('base64'));
145
+ });
146
+
147
+ it('generates UUID v4', () => {
148
+ const code = generateSecureRandom({
149
+ type: 'uuid',
150
+ });
151
+
152
+ assert.ok(code.includes('uuid') || code.includes('randomUUID'));
153
+ });
154
+
155
+ it('warns against Math.random', () => {
156
+ const result = generateSecureRandom({
157
+ validate: 'Math.random()',
158
+ });
159
+
160
+ assert.ok(result.warning);
161
+ });
162
+
163
+ it('generates Python secrets module', () => {
164
+ const code = generateSecureRandom({
165
+ language: 'python',
166
+ });
167
+
168
+ assert.ok(code.includes('secrets') || code.includes('os.urandom'));
169
+ });
170
+ });
171
+
172
+ describe('generateTlsConfig', () => {
173
+ it('requires TLS 1.3 minimum', () => {
174
+ const config = generateTlsConfig({});
175
+
176
+ assert.ok(config.minVersion === 'TLSv1.3' || config.minVersion === 'TLS1.3');
177
+ });
178
+
179
+ it('specifies secure cipher suites', () => {
180
+ const config = generateTlsConfig({});
181
+
182
+ assert.ok(config.ciphers);
183
+ assert.ok(config.ciphers.includes('GCM') || config.ciphers.includes('ECDHE'));
184
+ });
185
+
186
+ it('enables OCSP stapling', () => {
187
+ const config = generateTlsConfig({
188
+ ocspStapling: true,
189
+ });
190
+
191
+ assert.ok(config.ocspStapling);
192
+ });
193
+
194
+ it('sets HSTS header', () => {
195
+ const config = generateTlsConfig({
196
+ hsts: true,
197
+ });
198
+
199
+ assert.ok(config.hstsMaxAge >= 31536000); // 1 year minimum
200
+ });
201
+
202
+ it('generates Node.js TLS options', () => {
203
+ const config = generateTlsConfig({
204
+ platform: 'nodejs',
205
+ });
206
+
207
+ assert.ok(config.code.includes('tls') || config.code.includes('https'));
208
+ });
209
+
210
+ it('generates Nginx config', () => {
211
+ const config = generateTlsConfig({
212
+ platform: 'nginx',
213
+ });
214
+
215
+ assert.ok(config.code.includes('ssl_') || config.code.includes('server'));
216
+ });
217
+ });
218
+
219
+ describe('generateKeyRotation', () => {
220
+ it('generates rotation schedule', () => {
221
+ const config = generateKeyRotation({
222
+ rotationDays: 90,
223
+ });
224
+
225
+ assert.ok(config.schedule);
226
+ assert.strictEqual(config.rotationDays, 90);
227
+ });
228
+
229
+ it('supports multiple active keys', () => {
230
+ const config = generateKeyRotation({
231
+ maxActiveKeys: 2,
232
+ });
233
+
234
+ assert.strictEqual(config.maxActiveKeys, 2);
235
+ });
236
+
237
+ it('generates graceful transition', () => {
238
+ const config = generateKeyRotation({
239
+ gracePeriod: 86400000, // 24 hours
240
+ });
241
+
242
+ assert.ok(config.gracePeriod);
243
+ });
244
+
245
+ it('generates key versioning', () => {
246
+ const config = generateKeyRotation({
247
+ versioned: true,
248
+ });
249
+
250
+ assert.ok(config.versioned);
251
+ });
252
+
253
+ it('generates key derivation', () => {
254
+ const config = generateKeyRotation({
255
+ deriveKeys: true,
256
+ });
257
+
258
+ assert.ok(config.code.includes('derive') || config.code.includes('hkdf'));
259
+ });
260
+ });
261
+
262
+ describe('generateEncryptionCode', () => {
263
+ it('uses AES-256-GCM', () => {
264
+ const code = generateEncryptionCode({
265
+ language: 'javascript',
266
+ });
267
+
268
+ assert.ok(code.includes('aes-256-gcm') || code.includes('AES'));
269
+ });
270
+
271
+ it('generates authenticated encryption', () => {
272
+ const code = generateEncryptionCode({
273
+ authenticated: true,
274
+ });
275
+
276
+ assert.ok(code.includes('tag') || code.includes('auth') || code.includes('GCM'));
277
+ });
278
+
279
+ it('includes IV generation', () => {
280
+ const code = generateEncryptionCode({
281
+ language: 'javascript',
282
+ });
283
+
284
+ assert.ok(code.includes('iv') || code.includes('nonce'));
285
+ });
286
+
287
+ it('generates key from password', () => {
288
+ const code = generateEncryptionCode({
289
+ keyDerivation: 'password',
290
+ });
291
+
292
+ assert.ok(code.includes('pbkdf2') || code.includes('scrypt') || code.includes('argon'));
293
+ });
294
+
295
+ it('generates envelope encryption', () => {
296
+ const code = generateEncryptionCode({
297
+ envelope: true,
298
+ });
299
+
300
+ assert.ok(code.includes('data key') || code.includes('wrap') || code.includes('envelope'));
301
+ });
302
+ });
303
+
304
+ describe('generateSecretManagement', () => {
305
+ it('generates env var pattern', () => {
306
+ const code = generateSecretManagement({
307
+ method: 'env',
308
+ });
309
+
310
+ assert.ok(code.includes('process.env') || code.includes('os.environ'));
311
+ });
312
+
313
+ it('generates vault integration', () => {
314
+ const code = generateSecretManagement({
315
+ method: 'vault',
316
+ });
317
+
318
+ assert.ok(code.includes('vault') || code.includes('Vault'));
319
+ });
320
+
321
+ it('generates AWS Secrets Manager', () => {
322
+ const code = generateSecretManagement({
323
+ method: 'aws-secrets',
324
+ });
325
+
326
+ assert.ok(code.includes('SecretsManager') || code.includes('aws'));
327
+ });
328
+
329
+ it('includes secret caching', () => {
330
+ const code = generateSecretManagement({
331
+ cache: true,
332
+ cacheTtl: 300000,
333
+ });
334
+
335
+ assert.ok(code.includes('cache') || code.includes('Cache'));
336
+ });
337
+
338
+ it('generates secret validation', () => {
339
+ const code = generateSecretManagement({
340
+ validate: true,
341
+ });
342
+
343
+ assert.ok(code.includes('validate') || code.includes('check') || code.includes('required'));
344
+ });
345
+ });
346
+ });