tlc-claude-code 1.2.29 → 1.4.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 (182) hide show
  1. package/dashboard/dist/components/AuditPane.d.ts +30 -0
  2. package/dashboard/dist/components/AuditPane.js +127 -0
  3. package/dashboard/dist/components/AuditPane.test.d.ts +1 -0
  4. package/dashboard/dist/components/AuditPane.test.js +339 -0
  5. package/dashboard/dist/components/CompliancePane.d.ts +39 -0
  6. package/dashboard/dist/components/CompliancePane.js +96 -0
  7. package/dashboard/dist/components/CompliancePane.test.d.ts +1 -0
  8. package/dashboard/dist/components/CompliancePane.test.js +183 -0
  9. package/dashboard/dist/components/SSOPane.d.ts +36 -0
  10. package/dashboard/dist/components/SSOPane.js +71 -0
  11. package/dashboard/dist/components/SSOPane.test.d.ts +1 -0
  12. package/dashboard/dist/components/SSOPane.test.js +155 -0
  13. package/dashboard/dist/components/UsagePane.d.ts +13 -0
  14. package/dashboard/dist/components/UsagePane.js +51 -0
  15. package/dashboard/dist/components/UsagePane.test.d.ts +1 -0
  16. package/dashboard/dist/components/UsagePane.test.js +142 -0
  17. package/dashboard/dist/components/WorkspaceDocsPane.d.ts +19 -0
  18. package/dashboard/dist/components/WorkspaceDocsPane.js +130 -0
  19. package/dashboard/dist/components/WorkspaceDocsPane.test.d.ts +1 -0
  20. package/dashboard/dist/components/WorkspaceDocsPane.test.js +242 -0
  21. package/dashboard/dist/components/WorkspacePane.d.ts +18 -0
  22. package/dashboard/dist/components/WorkspacePane.js +17 -0
  23. package/dashboard/dist/components/WorkspacePane.test.d.ts +1 -0
  24. package/dashboard/dist/components/WorkspacePane.test.js +84 -0
  25. package/dashboard/dist/components/ZeroRetentionPane.d.ts +44 -0
  26. package/dashboard/dist/components/ZeroRetentionPane.js +83 -0
  27. package/dashboard/dist/components/ZeroRetentionPane.test.d.ts +1 -0
  28. package/dashboard/dist/components/ZeroRetentionPane.test.js +160 -0
  29. package/package.json +1 -1
  30. package/server/lib/access-control-doc.js +541 -0
  31. package/server/lib/access-control-doc.test.js +672 -0
  32. package/server/lib/adr-generator.js +423 -0
  33. package/server/lib/adr-generator.test.js +586 -0
  34. package/server/lib/agent-progress-monitor.js +223 -0
  35. package/server/lib/agent-progress-monitor.test.js +202 -0
  36. package/server/lib/architecture-command.js +450 -0
  37. package/server/lib/architecture-command.test.js +754 -0
  38. package/server/lib/ast-analyzer.js +324 -0
  39. package/server/lib/ast-analyzer.test.js +437 -0
  40. package/server/lib/audit-attribution.js +191 -0
  41. package/server/lib/audit-attribution.test.js +359 -0
  42. package/server/lib/audit-classifier.js +202 -0
  43. package/server/lib/audit-classifier.test.js +209 -0
  44. package/server/lib/audit-command.js +275 -0
  45. package/server/lib/audit-command.test.js +325 -0
  46. package/server/lib/audit-exporter.js +380 -0
  47. package/server/lib/audit-exporter.test.js +464 -0
  48. package/server/lib/audit-logger.js +236 -0
  49. package/server/lib/audit-logger.test.js +364 -0
  50. package/server/lib/audit-query.js +257 -0
  51. package/server/lib/audit-query.test.js +352 -0
  52. package/server/lib/audit-storage.js +269 -0
  53. package/server/lib/audit-storage.test.js +272 -0
  54. package/server/lib/auth-system.test.js +4 -1
  55. package/server/lib/boundary-detector.js +427 -0
  56. package/server/lib/boundary-detector.test.js +320 -0
  57. package/server/lib/budget-alerts.js +138 -0
  58. package/server/lib/budget-alerts.test.js +235 -0
  59. package/server/lib/bulk-repo-init.js +342 -0
  60. package/server/lib/bulk-repo-init.test.js +388 -0
  61. package/server/lib/candidates-tracker.js +210 -0
  62. package/server/lib/candidates-tracker.test.js +300 -0
  63. package/server/lib/checkpoint-manager.js +251 -0
  64. package/server/lib/checkpoint-manager.test.js +474 -0
  65. package/server/lib/circular-detector.js +337 -0
  66. package/server/lib/circular-detector.test.js +353 -0
  67. package/server/lib/cohesion-analyzer.js +310 -0
  68. package/server/lib/cohesion-analyzer.test.js +447 -0
  69. package/server/lib/compliance-checklist.js +866 -0
  70. package/server/lib/compliance-checklist.test.js +476 -0
  71. package/server/lib/compliance-command.js +616 -0
  72. package/server/lib/compliance-command.test.js +551 -0
  73. package/server/lib/compliance-reporter.js +692 -0
  74. package/server/lib/compliance-reporter.test.js +707 -0
  75. package/server/lib/contract-testing.js +625 -0
  76. package/server/lib/contract-testing.test.js +342 -0
  77. package/server/lib/conversion-planner.js +469 -0
  78. package/server/lib/conversion-planner.test.js +361 -0
  79. package/server/lib/convert-command.js +351 -0
  80. package/server/lib/convert-command.test.js +608 -0
  81. package/server/lib/coupling-calculator.js +189 -0
  82. package/server/lib/coupling-calculator.test.js +509 -0
  83. package/server/lib/data-flow-doc.js +665 -0
  84. package/server/lib/data-flow-doc.test.js +659 -0
  85. package/server/lib/dependency-graph.js +367 -0
  86. package/server/lib/dependency-graph.test.js +516 -0
  87. package/server/lib/duplication-detector.js +349 -0
  88. package/server/lib/duplication-detector.test.js +401 -0
  89. package/server/lib/ephemeral-storage.js +249 -0
  90. package/server/lib/ephemeral-storage.test.js +254 -0
  91. package/server/lib/evidence-collector.js +627 -0
  92. package/server/lib/evidence-collector.test.js +901 -0
  93. package/server/lib/example-service.js +616 -0
  94. package/server/lib/example-service.test.js +397 -0
  95. package/server/lib/flow-diagram-generator.js +474 -0
  96. package/server/lib/flow-diagram-generator.test.js +446 -0
  97. package/server/lib/idp-manager.js +626 -0
  98. package/server/lib/idp-manager.test.js +587 -0
  99. package/server/lib/impact-scorer.js +184 -0
  100. package/server/lib/impact-scorer.test.js +211 -0
  101. package/server/lib/memory-exclusion.js +326 -0
  102. package/server/lib/memory-exclusion.test.js +241 -0
  103. package/server/lib/mermaid-generator.js +358 -0
  104. package/server/lib/mermaid-generator.test.js +301 -0
  105. package/server/lib/messaging-patterns.js +750 -0
  106. package/server/lib/messaging-patterns.test.js +213 -0
  107. package/server/lib/mfa-handler.js +452 -0
  108. package/server/lib/mfa-handler.test.js +490 -0
  109. package/server/lib/microservice-template.js +386 -0
  110. package/server/lib/microservice-template.test.js +325 -0
  111. package/server/lib/new-project-microservice.js +450 -0
  112. package/server/lib/new-project-microservice.test.js +600 -0
  113. package/server/lib/oauth-flow.js +375 -0
  114. package/server/lib/oauth-flow.test.js +487 -0
  115. package/server/lib/oauth-registry.js +190 -0
  116. package/server/lib/oauth-registry.test.js +306 -0
  117. package/server/lib/readme-generator.js +490 -0
  118. package/server/lib/readme-generator.test.js +493 -0
  119. package/server/lib/refactor-command.js +326 -0
  120. package/server/lib/refactor-command.test.js +528 -0
  121. package/server/lib/refactor-executor.js +254 -0
  122. package/server/lib/refactor-executor.test.js +305 -0
  123. package/server/lib/refactor-observer.js +292 -0
  124. package/server/lib/refactor-observer.test.js +422 -0
  125. package/server/lib/refactor-progress.js +193 -0
  126. package/server/lib/refactor-progress.test.js +251 -0
  127. package/server/lib/refactor-reporter.js +237 -0
  128. package/server/lib/refactor-reporter.test.js +247 -0
  129. package/server/lib/repo-dependency-tracker.js +261 -0
  130. package/server/lib/repo-dependency-tracker.test.js +350 -0
  131. package/server/lib/retention-policy.js +281 -0
  132. package/server/lib/retention-policy.test.js +486 -0
  133. package/server/lib/role-mapper.js +236 -0
  134. package/server/lib/role-mapper.test.js +395 -0
  135. package/server/lib/saml-provider.js +765 -0
  136. package/server/lib/saml-provider.test.js +643 -0
  137. package/server/lib/security-policy-generator.js +682 -0
  138. package/server/lib/security-policy-generator.test.js +544 -0
  139. package/server/lib/semantic-analyzer.js +198 -0
  140. package/server/lib/semantic-analyzer.test.js +474 -0
  141. package/server/lib/sensitive-detector.js +112 -0
  142. package/server/lib/sensitive-detector.test.js +209 -0
  143. package/server/lib/service-interaction-diagram.js +700 -0
  144. package/server/lib/service-interaction-diagram.test.js +638 -0
  145. package/server/lib/service-scaffold.js +486 -0
  146. package/server/lib/service-scaffold.test.js +373 -0
  147. package/server/lib/service-summary.js +553 -0
  148. package/server/lib/service-summary.test.js +619 -0
  149. package/server/lib/session-purge.js +460 -0
  150. package/server/lib/session-purge.test.js +312 -0
  151. package/server/lib/shared-kernel.js +578 -0
  152. package/server/lib/shared-kernel.test.js +255 -0
  153. package/server/lib/sso-command.js +544 -0
  154. package/server/lib/sso-command.test.js +552 -0
  155. package/server/lib/sso-session.js +492 -0
  156. package/server/lib/sso-session.test.js +670 -0
  157. package/server/lib/traefik-config.js +282 -0
  158. package/server/lib/traefik-config.test.js +312 -0
  159. package/server/lib/usage-command.js +218 -0
  160. package/server/lib/usage-command.test.js +391 -0
  161. package/server/lib/usage-formatter.js +192 -0
  162. package/server/lib/usage-formatter.test.js +267 -0
  163. package/server/lib/usage-history.js +122 -0
  164. package/server/lib/usage-history.test.js +206 -0
  165. package/server/lib/workspace-command.js +249 -0
  166. package/server/lib/workspace-command.test.js +264 -0
  167. package/server/lib/workspace-config.js +270 -0
  168. package/server/lib/workspace-config.test.js +312 -0
  169. package/server/lib/workspace-docs-command.js +547 -0
  170. package/server/lib/workspace-docs-command.test.js +692 -0
  171. package/server/lib/workspace-memory.js +451 -0
  172. package/server/lib/workspace-memory.test.js +403 -0
  173. package/server/lib/workspace-scanner.js +452 -0
  174. package/server/lib/workspace-scanner.test.js +677 -0
  175. package/server/lib/workspace-test-runner.js +315 -0
  176. package/server/lib/workspace-test-runner.test.js +294 -0
  177. package/server/lib/zero-retention-command.js +439 -0
  178. package/server/lib/zero-retention-command.test.js +448 -0
  179. package/server/lib/zero-retention.js +322 -0
  180. package/server/lib/zero-retention.test.js +258 -0
  181. package/server/package-lock.json +14 -0
  182. package/server/package.json +1 -0
@@ -0,0 +1,342 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ ContractTesting,
4
+ generateConsumerTest,
5
+ generateProviderTest,
6
+ generateBrokerConfig,
7
+ generateCiWorkflow,
8
+ generateFromOpenApi,
9
+ createContractTesting,
10
+ } from './contract-testing.js';
11
+
12
+ describe('contract-testing', () => {
13
+ describe('ContractTesting', () => {
14
+ it('creates instance with default options', () => {
15
+ const ct = new ContractTesting();
16
+ expect(ct).toBeDefined();
17
+ expect(ct.options).toBeDefined();
18
+ });
19
+
20
+ it('creates instance with custom options', () => {
21
+ const ct = new ContractTesting({ broker: 'pactflow' });
22
+ expect(ct.options.broker).toBe('pactflow');
23
+ });
24
+ });
25
+
26
+ describe('generate', () => {
27
+ it('generates complete contract testing setup', () => {
28
+ const ct = new ContractTesting();
29
+ const result = ct.generate({
30
+ services: ['user', 'order'],
31
+ broker: 'local',
32
+ });
33
+
34
+ expect(result.files).toBeDefined();
35
+ expect(Array.isArray(result.files)).toBe(true);
36
+ expect(result.files.length).toBeGreaterThan(0);
37
+ });
38
+
39
+ it('generates files for each service pair', () => {
40
+ const ct = new ContractTesting();
41
+ const result = ct.generate({
42
+ services: ['user', 'order'],
43
+ broker: 'local',
44
+ });
45
+
46
+ const fileNames = result.files.map(f => f.name);
47
+ expect(fileNames.some(n => n.includes('user'))).toBe(true);
48
+ expect(fileNames.some(n => n.includes('order'))).toBe(true);
49
+ });
50
+ });
51
+
52
+ describe('generateConsumerTest', () => {
53
+ it('generates valid JavaScript template', () => {
54
+ const result = generateConsumerTest('order', 'user');
55
+
56
+ expect(result.content).toContain('describe');
57
+ expect(result.content).toContain('it(');
58
+ expect(result.content).toContain('expect');
59
+ });
60
+
61
+ it('defines interactions in the test', () => {
62
+ const result = generateConsumerTest('order', 'user');
63
+
64
+ expect(result.content).toContain('interaction');
65
+ expect(result.content).toContain('willRespondWith');
66
+ });
67
+
68
+ it('generates contract file on success', () => {
69
+ const result = generateConsumerTest('order', 'user');
70
+
71
+ expect(result.content).toContain('writeContract');
72
+ expect(result.content).toContain('pacts');
73
+ });
74
+
75
+ it('uses consumer and provider names in test', () => {
76
+ const result = generateConsumerTest('order', 'user');
77
+
78
+ expect(result.content).toContain('order');
79
+ expect(result.content).toContain('user');
80
+ });
81
+
82
+ it('includes mock provider setup', () => {
83
+ const result = generateConsumerTest('checkout', 'inventory');
84
+
85
+ expect(result.content).toContain('mockProvider');
86
+ expect(result.content).toContain('verify');
87
+ });
88
+ });
89
+
90
+ describe('generateProviderTest', () => {
91
+ it('loads contracts from broker', () => {
92
+ const result = generateProviderTest('user', { broker: 'local' });
93
+
94
+ expect(result.content).toContain('loadContracts');
95
+ expect(result.content).toContain('contracts');
96
+ });
97
+
98
+ it('verifies endpoints from contracts', () => {
99
+ const result = generateProviderTest('user', { broker: 'local' });
100
+
101
+ expect(result.content).toContain('verifyProvider');
102
+ expect(result.content).toContain('endpoint');
103
+ });
104
+
105
+ it('reports failures for missing endpoints', () => {
106
+ const result = generateProviderTest('user', { broker: 'local' });
107
+
108
+ expect(result.content).toContain('missing');
109
+ expect(result.content).toContain('fail');
110
+ });
111
+
112
+ it('supports different broker modes', () => {
113
+ const localResult = generateProviderTest('user', { broker: 'local' });
114
+ const pactflowResult = generateProviderTest('user', { broker: 'pactflow' });
115
+
116
+ expect(localResult.content).toContain('contracts/');
117
+ expect(pactflowResult.content).toContain('pactflow');
118
+ });
119
+ });
120
+
121
+ describe('generateBrokerConfig', () => {
122
+ it('supports local mode', () => {
123
+ const result = generateBrokerConfig('local');
124
+
125
+ expect(result.mode).toBe('local');
126
+ expect(result.config).toBeDefined();
127
+ });
128
+
129
+ it('supports pactflow mode', () => {
130
+ const result = generateBrokerConfig('pactflow');
131
+
132
+ expect(result.mode).toBe('pactflow');
133
+ expect(result.config).toContain('PACT_BROKER');
134
+ });
135
+
136
+ it('stores contracts in contracts/ directory for local', () => {
137
+ const result = generateBrokerConfig('local');
138
+
139
+ expect(result.contractsDir).toBe('contracts/');
140
+ });
141
+
142
+ it('generates publish script', () => {
143
+ const result = generateBrokerConfig('pactflow');
144
+
145
+ expect(result.publishScript).toBeDefined();
146
+ expect(result.publishScript).toContain('publish');
147
+ });
148
+
149
+ it('generates fetch script', () => {
150
+ const result = generateBrokerConfig('pactflow');
151
+
152
+ expect(result.fetchScript).toBeDefined();
153
+ expect(result.fetchScript.toLowerCase()).toContain('fetch');
154
+ });
155
+ });
156
+
157
+ describe('generateCiWorkflow', () => {
158
+ it('runs on pull requests', () => {
159
+ const result = generateCiWorkflow();
160
+
161
+ expect(result.on).toBeDefined();
162
+ expect(result.on.pull_request).toBeDefined();
163
+ });
164
+
165
+ it('runs consumer tests', () => {
166
+ const result = generateCiWorkflow();
167
+ const yaml = JSON.stringify(result);
168
+
169
+ expect(yaml).toContain('consumer');
170
+ });
171
+
172
+ it('runs provider tests', () => {
173
+ const result = generateCiWorkflow();
174
+ const yaml = JSON.stringify(result);
175
+
176
+ expect(yaml).toContain('provider');
177
+ });
178
+
179
+ it('blocks merge on failure', () => {
180
+ const result = generateCiWorkflow();
181
+
182
+ // Workflow should fail if tests fail (no continue-on-error)
183
+ expect(result.jobs.contract_tests).toBeDefined();
184
+ expect(result.jobs.contract_tests['continue-on-error']).not.toBe(true);
185
+ });
186
+
187
+ it('generates valid workflow structure', () => {
188
+ const result = generateCiWorkflow();
189
+
190
+ expect(result.name).toBeDefined();
191
+ expect(result.jobs).toBeDefined();
192
+ expect(result.jobs.contract_tests.steps).toBeDefined();
193
+ });
194
+ });
195
+
196
+ describe('generateFromOpenApi', () => {
197
+ it('extracts endpoints from OpenAPI spec', () => {
198
+ const spec = {
199
+ openapi: '3.0.0',
200
+ paths: {
201
+ '/users': {
202
+ get: { summary: 'List users' },
203
+ post: { summary: 'Create user' },
204
+ },
205
+ '/users/{id}': {
206
+ get: { summary: 'Get user' },
207
+ },
208
+ },
209
+ };
210
+
211
+ const result = generateFromOpenApi(spec);
212
+
213
+ expect(result.endpoints).toBeDefined();
214
+ expect(result.endpoints.length).toBe(3);
215
+ });
216
+
217
+ it('maps responses from spec', () => {
218
+ const spec = {
219
+ openapi: '3.0.0',
220
+ paths: {
221
+ '/users': {
222
+ get: {
223
+ responses: {
224
+ '200': {
225
+ content: {
226
+ 'application/json': {
227
+ schema: { type: 'array' },
228
+ },
229
+ },
230
+ },
231
+ },
232
+ },
233
+ },
234
+ },
235
+ };
236
+
237
+ const result = generateFromOpenApi(spec);
238
+
239
+ expect(result.endpoints[0].responses).toBeDefined();
240
+ expect(result.endpoints[0].responses['200']).toBeDefined();
241
+ });
242
+
243
+ it('generates contract expectations', () => {
244
+ const spec = {
245
+ openapi: '3.0.0',
246
+ paths: {
247
+ '/users': {
248
+ get: { summary: 'List users' },
249
+ },
250
+ },
251
+ };
252
+
253
+ const result = generateFromOpenApi(spec);
254
+
255
+ expect(result.contracts).toBeDefined();
256
+ expect(result.contracts.length).toBeGreaterThan(0);
257
+ });
258
+
259
+ it('handles request bodies', () => {
260
+ const spec = {
261
+ openapi: '3.0.0',
262
+ paths: {
263
+ '/users': {
264
+ post: {
265
+ requestBody: {
266
+ content: {
267
+ 'application/json': {
268
+ schema: {
269
+ type: 'object',
270
+ properties: {
271
+ name: { type: 'string' },
272
+ email: { type: 'string' },
273
+ },
274
+ },
275
+ },
276
+ },
277
+ },
278
+ },
279
+ },
280
+ },
281
+ };
282
+
283
+ const result = generateFromOpenApi(spec);
284
+
285
+ expect(result.endpoints[0].requestBody).toBeDefined();
286
+ });
287
+ });
288
+
289
+ describe('edge cases', () => {
290
+ it('handles service with no consumers', () => {
291
+ const ct = new ContractTesting();
292
+ const result = ct.generate({
293
+ services: ['standalone'],
294
+ broker: 'local',
295
+ });
296
+
297
+ expect(result.files).toBeDefined();
298
+ // Should still generate provider test for verification
299
+ expect(result.files.some(f => f.name.includes('provider'))).toBe(true);
300
+ });
301
+
302
+ it('handles single consumer-provider pair', () => {
303
+ const ct = new ContractTesting();
304
+ const result = ct.generate({
305
+ services: ['api', 'frontend'],
306
+ relations: [{ consumer: 'frontend', provider: 'api' }],
307
+ broker: 'local',
308
+ });
309
+
310
+ expect(result.files).toBeDefined();
311
+ expect(result.files.some(f => f.name.includes('frontend'))).toBe(true);
312
+ expect(result.files.some(f => f.name.includes('api'))).toBe(true);
313
+ });
314
+
315
+ it('handles empty services array', () => {
316
+ const ct = new ContractTesting();
317
+ const result = ct.generate({
318
+ services: [],
319
+ broker: 'local',
320
+ });
321
+
322
+ expect(result.files).toEqual([]);
323
+ });
324
+ });
325
+
326
+ describe('createContractTesting', () => {
327
+ it('creates factory instance', () => {
328
+ const ct = createContractTesting();
329
+
330
+ expect(ct.generate).toBeDefined();
331
+ expect(ct.generateConsumerTest).toBeDefined();
332
+ expect(ct.generateProviderTest).toBeDefined();
333
+ });
334
+
335
+ it('passes options through', () => {
336
+ const ct = createContractTesting({ broker: 'pactflow' });
337
+ const result = ct.generateBrokerConfig();
338
+
339
+ expect(result.mode).toBe('pactflow');
340
+ });
341
+ });
342
+ });