proagents 1.6.16 → 1.6.18

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 (170) hide show
  1. package/.claude/settings.local.json +169 -0
  2. package/COMMANDS.md +595 -0
  3. package/README.md +22 -64
  4. package/bin/proagents.js +0 -2
  5. package/lib/commands/init.js +4 -174
  6. package/package.json +2 -7
  7. package/.proagents/ai-models/README.md +0 -141
  8. package/.proagents/ai-models/cost-management.md +0 -362
  9. package/.proagents/ai-models/fallbacks.md +0 -342
  10. package/.proagents/ai-models/model-config.md +0 -318
  11. package/.proagents/ai-models/task-routing.md +0 -503
  12. package/.proagents/ai-training/README.md +0 -155
  13. package/.proagents/ai-training/continuous-learning.md +0 -413
  14. package/.proagents/ai-training/domain-knowledge.md +0 -378
  15. package/.proagents/ai-training/pattern-learning.md +0 -455
  16. package/.proagents/ai-training/training-data.md +0 -337
  17. package/.proagents/ai-training/user-preferences.md +0 -346
  18. package/.proagents/approval-workflows/README.md +0 -146
  19. package/.proagents/approval-workflows/approval-config.md +0 -332
  20. package/.proagents/approval-workflows/approval-stages.md +0 -503
  21. package/.proagents/approval-workflows/emergency-bypass.md +0 -351
  22. package/.proagents/approval-workflows/examples.md +0 -859
  23. package/.proagents/approval-workflows/notifications.md +0 -320
  24. package/.proagents/compliance/README.md +0 -206
  25. package/.proagents/compliance/access-control.md +0 -310
  26. package/.proagents/compliance/audit-logging.md +0 -444
  27. package/.proagents/compliance/compliance-frameworks.md +0 -429
  28. package/.proagents/compliance/reports.md +0 -491
  29. package/.proagents/compliance/retention-policies.md +0 -454
  30. package/.proagents/config-versioning/README.md +0 -120
  31. package/.proagents/config-versioning/changelog.md +0 -300
  32. package/.proagents/config-versioning/rollback.md +0 -283
  33. package/.proagents/config-versioning/versioning.md +0 -330
  34. package/.proagents/contract-testing/README.md +0 -223
  35. package/.proagents/contract-testing/contract-testing.md +0 -614
  36. package/.proagents/contract-testing/pact-integration.md +0 -507
  37. package/.proagents/contract-testing/schema-validation.md +0 -565
  38. package/.proagents/dependency-management/README.md +0 -140
  39. package/.proagents/dependency-management/automation.md +0 -363
  40. package/.proagents/dependency-management/compatibility.md +0 -319
  41. package/.proagents/dependency-management/security-scanning.md +0 -413
  42. package/.proagents/dependency-management/update-policies.md +0 -374
  43. package/.proagents/disaster-recovery/README.md +0 -247
  44. package/.proagents/disaster-recovery/automation.md +0 -366
  45. package/.proagents/disaster-recovery/backup-recovery.md +0 -571
  46. package/.proagents/disaster-recovery/incident-response.md +0 -565
  47. package/.proagents/disaster-recovery/rollback-procedures.md +0 -499
  48. package/.proagents/disaster-recovery/runbooks.md +0 -603
  49. package/.proagents/disaster-recovery/scenarios.md +0 -892
  50. package/.proagents/disaster-recovery/testing.md +0 -438
  51. package/.proagents/environments/README.md +0 -244
  52. package/.proagents/environments/configuration.md +0 -437
  53. package/.proagents/environments/promotion.md +0 -434
  54. package/.proagents/environments/setup.md +0 -420
  55. package/.proagents/examples/README.md +0 -55
  56. package/.proagents/examples/backend-nodejs/README.md +0 -188
  57. package/.proagents/examples/backend-nodejs/complete-conversation.md +0 -601
  58. package/.proagents/examples/backend-nodejs/proagents.config.yaml +0 -415
  59. package/.proagents/examples/backend-nodejs/workflow-example.md +0 -909
  60. package/.proagents/examples/fullstack-nextjs/README.md +0 -155
  61. package/.proagents/examples/fullstack-nextjs/complete-conversation.md +0 -604
  62. package/.proagents/examples/fullstack-nextjs/proagents.config.yaml +0 -287
  63. package/.proagents/examples/fullstack-nextjs/workflow-example.md +0 -553
  64. package/.proagents/examples/mobile-react-native/README.md +0 -171
  65. package/.proagents/examples/mobile-react-native/complete-conversation.md +0 -825
  66. package/.proagents/examples/mobile-react-native/proagents.config.yaml +0 -330
  67. package/.proagents/examples/mobile-react-native/workflow-example.md +0 -723
  68. package/.proagents/examples/web-frontend-react/README.md +0 -125
  69. package/.proagents/examples/web-frontend-react/complete-conversation.md +0 -556
  70. package/.proagents/examples/web-frontend-react/proagents.config.yaml +0 -183
  71. package/.proagents/examples/web-frontend-react/workflow-example.md +0 -603
  72. package/.proagents/existing-projects/README.md +0 -65
  73. package/.proagents/existing-projects/challenges.md +0 -861
  74. package/.proagents/existing-projects/coexistence-mode.md +0 -483
  75. package/.proagents/existing-projects/compatibility-assessment.md +0 -541
  76. package/.proagents/existing-projects/gradual-adoption.md +0 -515
  77. package/.proagents/existing-projects/migration-strategies.md +0 -788
  78. package/.proagents/existing-projects/pattern-reconciliation.md +0 -489
  79. package/.proagents/existing-projects/team-onboarding.md +0 -617
  80. package/.proagents/existing-projects/technical-debt-handling.md +0 -644
  81. package/.proagents/feature-flags/README.md +0 -263
  82. package/.proagents/feature-flags/ab-testing.md +0 -413
  83. package/.proagents/feature-flags/configuration.md +0 -420
  84. package/.proagents/feature-flags/kill-switches.md +0 -444
  85. package/.proagents/feature-flags/rollout-strategies.md +0 -392
  86. package/.proagents/history.log +0 -12
  87. package/.proagents/i18n/README.md +0 -133
  88. package/.proagents/i18n/extraction.md +0 -433
  89. package/.proagents/i18n/tms-integration.md +0 -332
  90. package/.proagents/i18n/translation-workflow.md +0 -413
  91. package/.proagents/i18n/validation.md +0 -355
  92. package/.proagents/logging/README.md +0 -276
  93. package/.proagents/logging/aggregation.md +0 -475
  94. package/.proagents/logging/log-levels.md +0 -376
  95. package/.proagents/logging/sensitive-data.md +0 -423
  96. package/.proagents/logging/structured-logging.md +0 -406
  97. package/.proagents/metrics/README.md +0 -69
  98. package/.proagents/metrics/code-quality-kpis.md +0 -461
  99. package/.proagents/metrics/deployment-metrics.md +0 -517
  100. package/.proagents/metrics/developer-productivity.md +0 -368
  101. package/.proagents/metrics/learning-effectiveness.md +0 -478
  102. package/.proagents/migrations/README.md +0 -77
  103. package/.proagents/migrations/from-claude-projects.md +0 -313
  104. package/.proagents/migrations/from-cursor-rules.md +0 -345
  105. package/.proagents/migrations/from-custom-workflows.md +0 -410
  106. package/.proagents/monitoring/README.md +0 -308
  107. package/.proagents/monitoring/alerting.md +0 -449
  108. package/.proagents/monitoring/dashboards.md +0 -454
  109. package/.proagents/monitoring/health-checks.md +0 -436
  110. package/.proagents/monitoring/metrics.md +0 -434
  111. package/.proagents/multi-project/README.md +0 -170
  112. package/.proagents/multi-project/coordinated-deploy.md +0 -510
  113. package/.proagents/multi-project/cross-project-deps.md +0 -395
  114. package/.proagents/multi-project/unified-changelog.md +0 -477
  115. package/.proagents/multi-project/walkthroughs/monorepo-setup.md +0 -787
  116. package/.proagents/multi-project/workspace-config.md +0 -408
  117. package/.proagents/notifications/README.md +0 -151
  118. package/.proagents/notifications/channels.md +0 -457
  119. package/.proagents/notifications/preferences.md +0 -415
  120. package/.proagents/notifications/routing.md +0 -449
  121. package/.proagents/notifications/scheduling.md +0 -425
  122. package/.proagents/notifications/templates.md +0 -446
  123. package/.proagents/offline-mode/README.md +0 -145
  124. package/.proagents/offline-mode/caching.md +0 -344
  125. package/.proagents/offline-mode/offline-operations.md +0 -312
  126. package/.proagents/offline-mode/queue-specifications.md +0 -679
  127. package/.proagents/offline-mode/sync.md +0 -475
  128. package/.proagents/parallel-features/README.md +0 -85
  129. package/.proagents/parallel-features/conflict-detection.md +0 -226
  130. package/.proagents/parallel-features/dependency-management.md +0 -392
  131. package/.proagents/parallel-features/merge-coordination.md +0 -506
  132. package/.proagents/parallel-features/tracking-system.md +0 -416
  133. package/.proagents/performance/README.md +0 -59
  134. package/.proagents/performance/bundle-analysis.md +0 -375
  135. package/.proagents/performance/load-testing.md +0 -563
  136. package/.proagents/performance/runtime-metrics.md +0 -489
  137. package/.proagents/performance/web-vitals.md +0 -425
  138. package/.proagents/plugins/README.md +0 -139
  139. package/.proagents/plugins/creating-plugins.md +0 -504
  140. package/.proagents/plugins/plugin-api.md +0 -467
  141. package/.proagents/plugins/plugin-registry.md +0 -276
  142. package/.proagents/reporting/README.md +0 -158
  143. package/.proagents/reporting/dashboards.md +0 -366
  144. package/.proagents/reporting/exports.md +0 -524
  145. package/.proagents/reporting/quality-metrics.md +0 -385
  146. package/.proagents/reporting/templates/README.md +0 -56
  147. package/.proagents/reporting/templates/dashboard-config.json +0 -187
  148. package/.proagents/reporting/templates/metrics-queries.md +0 -427
  149. package/.proagents/reporting/templates/react-dashboard.tsx +0 -544
  150. package/.proagents/reporting/templates/widgets.md +0 -451
  151. package/.proagents/reporting/velocity-metrics.md +0 -340
  152. package/.proagents/reverse-engineering/README.md +0 -151
  153. package/.proagents/reverse-engineering/architecture-extraction.md +0 -325
  154. package/.proagents/reverse-engineering/code-analysis.md +0 -377
  155. package/.proagents/reverse-engineering/dependency-mapping.md +0 -567
  156. package/.proagents/reverse-engineering/diagram-generation.md +0 -586
  157. package/.proagents/reverse-engineering/documentation-generation.md +0 -468
  158. package/.proagents/reverse-engineering/pattern-detection.md +0 -569
  159. package/.proagents/reverse-engineering/quality-assessment.md +0 -733
  160. package/.proagents/secrets/README.md +0 -278
  161. package/.proagents/secrets/access-control.md +0 -443
  162. package/.proagents/secrets/rotation.md +0 -403
  163. package/.proagents/secrets/scanning.md +0 -487
  164. package/.proagents/secrets/storage.md +0 -394
  165. package/.proagents/webhooks/README.md +0 -126
  166. package/.proagents/webhooks/endpoints.md +0 -298
  167. package/.proagents/webhooks/events.md +0 -316
  168. package/.proagents/webhooks/payloads.md +0 -325
  169. package/.proagents/webhooks/reliability.md +0 -363
  170. package/.proagents/webhooks/security.md +0 -380
@@ -1,614 +0,0 @@
1
- # Complete Contract Testing Guide
2
-
3
- A comprehensive guide to implementing contract testing in your projects.
4
-
5
- ---
6
-
7
- ## Table of Contents
8
-
9
- 1. [Introduction](#introduction)
10
- 2. [When to Use Contract Testing](#when-to-use-contract-testing)
11
- 3. [Consumer-Driven Contracts](#consumer-driven-contracts)
12
- 4. [Writing Consumer Tests](#writing-consumer-tests)
13
- 5. [Writing Provider Tests](#writing-provider-tests)
14
- 6. [Contract Versioning](#contract-versioning)
15
- 7. [CI/CD Integration](#cicd-integration)
16
- 8. [Troubleshooting](#troubleshooting)
17
-
18
- ---
19
-
20
- ## Introduction
21
-
22
- Contract testing verifies that two services (consumer and provider) can communicate correctly by testing them against a shared "contract" - an agreement about what requests look like and what responses are expected.
23
-
24
- ### Why Contract Testing?
25
-
26
- ```
27
- Traditional Integration Testing:
28
- ┌──────────┐ ┌──────────┐ ┌──────────┐
29
- │ Service A │ ───→ │ Service B │ ───→ │ Service C │
30
- └──────────┘ └──────────┘ └──────────┘
31
- All services must be running. Slow. Flaky.
32
-
33
- Contract Testing:
34
- ┌──────────┐ ┌──────────┐
35
- │ Service A │ ←── Contract JSON ───→ │ Service B │
36
- └──────────┘ └──────────┘
37
- Tests against Tests against
38
- mock server real contract
39
-
40
- Services test independently. Fast. Reliable.
41
- ```
42
-
43
- ### Key Concepts
44
-
45
- | Term | Definition |
46
- |------|------------|
47
- | **Consumer** | Service that makes API requests |
48
- | **Provider** | Service that handles API requests |
49
- | **Contract** | JSON file describing expected interactions |
50
- | **Pact** | Most popular contract testing framework |
51
- | **Broker** | Central server storing contracts |
52
-
53
- ---
54
-
55
- ## When to Use Contract Testing
56
-
57
- ### Good Candidates
58
-
59
- - **Microservices** communicating via HTTP/REST
60
- - **Frontend-Backend** API interactions
61
- - **Mobile-Backend** API interactions
62
- - **Service-to-Service** internal APIs
63
- - **Third-Party API** integrations (if you control the mock)
64
-
65
- ### Not Ideal For
66
-
67
- - **Databases** - Use migration testing instead
68
- - **Message Queues** - Use different patterns (Pact supports async)
69
- - **UI Testing** - Use E2E tests
70
- - **Internal Functions** - Use unit tests
71
-
72
- ### Decision Tree
73
-
74
- ```
75
- Is it an API boundary between services?
76
- ├── Yes → Do you control both sides?
77
- │ ├── Yes → Contract Testing ✓
78
- │ └── No → Schema Validation / Mocks
79
- └── No → Unit or Integration Tests
80
- ```
81
-
82
- ---
83
-
84
- ## Consumer-Driven Contracts
85
-
86
- In CDC, **consumers define the contract** based on what they actually need.
87
-
88
- ### Why Consumer-Driven?
89
-
90
- 1. **No over-fetching** - Contract only includes used fields
91
- 2. **Consumer needs are explicit** - Provider knows what's important
92
- 3. **Changes are visible** - Breaking changes are caught immediately
93
-
94
- ### Workflow
95
-
96
- ```
97
- 1. Consumer writes test
98
-
99
-
100
- 2. Consumer test generates contract (pact.json)
101
-
102
-
103
- 3. Contract published to broker
104
-
105
-
106
- 4. Provider pulls contract
107
-
108
-
109
- 5. Provider verifies against contract
110
-
111
-
112
- 6. Both sides pass → Safe to deploy
113
- ```
114
-
115
- ---
116
-
117
- ## Writing Consumer Tests
118
-
119
- ### Step 1: Set Up Pact
120
-
121
- ```typescript
122
- // consumer/pact.setup.ts
123
- import { PactV3 } from '@pact-foundation/pact';
124
- import path from 'path';
125
-
126
- export const provider = new PactV3({
127
- consumer: 'WebApp',
128
- provider: 'UserService',
129
- dir: path.resolve(process.cwd(), 'pacts'),
130
- logLevel: 'warn',
131
- });
132
- ```
133
-
134
- ### Step 2: Define Interactions
135
-
136
- ```typescript
137
- // consumer/tests/user.pact.test.ts
138
- import { MatchersV3 } from '@pact-foundation/pact';
139
- import { provider } from '../pact.setup';
140
- import { UserService } from '../services/UserService';
141
-
142
- const { eachLike, string, integer, email, datetime } = MatchersV3;
143
-
144
- describe('User API Consumer Tests', () => {
145
- // Test: Get user by ID
146
- describe('GET /users/:id', () => {
147
- it('returns user when user exists', async () => {
148
- // Arrange: Define the expected interaction
149
- await provider
150
- .given('user with ID 123 exists')
151
- .uponReceiving('a request to get user 123')
152
- .withRequest({
153
- method: 'GET',
154
- path: '/api/users/123',
155
- headers: {
156
- Accept: 'application/json',
157
- Authorization: string('Bearer token'),
158
- },
159
- })
160
- .willRespondWith({
161
- status: 200,
162
- headers: {
163
- 'Content-Type': 'application/json',
164
- },
165
- body: {
166
- id: string('123'),
167
- email: email('user@example.com'),
168
- name: string('John Doe'),
169
- createdAt: datetime("2024-01-01T00:00:00.000Z"),
170
- },
171
- });
172
-
173
- // Act & Assert: Run your actual code
174
- await provider.executeTest(async (mockServer) => {
175
- const userService = new UserService(mockServer.url);
176
- const user = await userService.getUser('123');
177
-
178
- expect(user.id).toBe('123');
179
- expect(user.name).toBeDefined();
180
- });
181
- });
182
-
183
- it('returns 404 when user does not exist', async () => {
184
- await provider
185
- .given('user with ID 999 does not exist')
186
- .uponReceiving('a request for non-existent user')
187
- .withRequest({
188
- method: 'GET',
189
- path: '/api/users/999',
190
- headers: {
191
- Accept: 'application/json',
192
- },
193
- })
194
- .willRespondWith({
195
- status: 404,
196
- body: {
197
- error: string('Not Found'),
198
- message: string('User not found'),
199
- },
200
- });
201
-
202
- await provider.executeTest(async (mockServer) => {
203
- const userService = new UserService(mockServer.url);
204
- await expect(userService.getUser('999')).rejects.toThrow('User not found');
205
- });
206
- });
207
- });
208
-
209
- // Test: Create user
210
- describe('POST /users', () => {
211
- it('creates a new user', async () => {
212
- await provider
213
- .given('no user with email test@example.com exists')
214
- .uponReceiving('a request to create user')
215
- .withRequest({
216
- method: 'POST',
217
- path: '/api/users',
218
- headers: {
219
- 'Content-Type': 'application/json',
220
- },
221
- body: {
222
- email: 'test@example.com',
223
- name: 'Test User',
224
- password: string('password123'),
225
- },
226
- })
227
- .willRespondWith({
228
- status: 201,
229
- body: {
230
- id: string(),
231
- email: email('test@example.com'),
232
- name: string('Test User'),
233
- },
234
- });
235
-
236
- await provider.executeTest(async (mockServer) => {
237
- const userService = new UserService(mockServer.url);
238
- const user = await userService.createUser({
239
- email: 'test@example.com',
240
- name: 'Test User',
241
- password: 'password123',
242
- });
243
-
244
- expect(user.id).toBeDefined();
245
- expect(user.email).toBe('test@example.com');
246
- });
247
- });
248
- });
249
-
250
- // Test: List users
251
- describe('GET /users', () => {
252
- it('returns paginated list of users', async () => {
253
- await provider
254
- .given('multiple users exist')
255
- .uponReceiving('a request to list users')
256
- .withRequest({
257
- method: 'GET',
258
- path: '/api/users',
259
- query: {
260
- page: '1',
261
- limit: '10',
262
- },
263
- })
264
- .willRespondWith({
265
- status: 200,
266
- body: {
267
- data: eachLike({
268
- id: string('user-1'),
269
- email: email(),
270
- name: string('User Name'),
271
- }),
272
- meta: {
273
- page: integer(1),
274
- limit: integer(10),
275
- total: integer(25),
276
- },
277
- },
278
- });
279
-
280
- await provider.executeTest(async (mockServer) => {
281
- const userService = new UserService(mockServer.url);
282
- const result = await userService.listUsers({ page: 1, limit: 10 });
283
-
284
- expect(result.data.length).toBeGreaterThan(0);
285
- expect(result.meta.page).toBe(1);
286
- });
287
- });
288
- });
289
- });
290
- ```
291
-
292
- ### Step 3: Run Consumer Tests
293
-
294
- ```bash
295
- # Run consumer tests (generates pact files)
296
- npm run test:contract:consumer
297
-
298
- # Output: pacts/webapp-userservice.json
299
- ```
300
-
301
- ---
302
-
303
- ## Writing Provider Tests
304
-
305
- ### Step 1: Set Up Verifier
306
-
307
- ```typescript
308
- // provider/tests/pact.verify.test.ts
309
- import { Verifier } from '@pact-foundation/pact';
310
- import { app } from '../app';
311
-
312
- describe('User Service Provider Verification', () => {
313
- let server: any;
314
-
315
- beforeAll(async () => {
316
- // Start your actual server
317
- server = app.listen(3001);
318
- });
319
-
320
- afterAll(async () => {
321
- server.close();
322
- });
323
-
324
- it('validates the expectations of WebApp', async () => {
325
- const verifier = new Verifier({
326
- providerBaseUrl: 'http://localhost:3001',
327
-
328
- // Option 1: Local pact files
329
- pactUrls: [
330
- './pacts/webapp-userservice.json',
331
- ],
332
-
333
- // Option 2: Pact Broker
334
- // pactBrokerUrl: process.env.PACT_BROKER_URL,
335
- // pactBrokerToken: process.env.PACT_BROKER_TOKEN,
336
- // provider: 'UserService',
337
- // consumerVersionSelectors: [
338
- // { latest: true },
339
- // ],
340
-
341
- // State handlers - set up test data for each state
342
- stateHandlers: {
343
- 'user with ID 123 exists': async () => {
344
- await db.users.create({
345
- id: '123',
346
- email: 'user@example.com',
347
- name: 'John Doe',
348
- createdAt: new Date('2024-01-01'),
349
- });
350
- },
351
-
352
- 'user with ID 999 does not exist': async () => {
353
- await db.users.deleteMany({ id: '999' });
354
- },
355
-
356
- 'no user with email test@example.com exists': async () => {
357
- await db.users.deleteMany({ email: 'test@example.com' });
358
- },
359
-
360
- 'multiple users exist': async () => {
361
- await db.users.createMany([
362
- { id: 'user-1', email: 'user1@example.com', name: 'User 1' },
363
- { id: 'user-2', email: 'user2@example.com', name: 'User 2' },
364
- { id: 'user-3', email: 'user3@example.com', name: 'User 3' },
365
- ]);
366
- },
367
- },
368
-
369
- // Clean up after each test
370
- beforeEach: async () => {
371
- await db.users.deleteMany({});
372
- },
373
-
374
- // Request filters (e.g., add auth)
375
- requestFilter: (req, res, next) => {
376
- // Add any necessary headers
377
- req.headers['authorization'] = 'Bearer test-token';
378
- next();
379
- },
380
-
381
- // Enable verbose logging
382
- logLevel: 'info',
383
-
384
- // Publish verification results
385
- publishVerificationResult: process.env.CI === 'true',
386
- providerVersion: process.env.GIT_COMMIT || '1.0.0',
387
- });
388
-
389
- await verifier.verifyProvider();
390
- });
391
- });
392
- ```
393
-
394
- ### Step 2: Run Provider Tests
395
-
396
- ```bash
397
- # Run provider verification
398
- npm run test:contract:provider
399
-
400
- # Output shows each interaction verified
401
- ```
402
-
403
- ---
404
-
405
- ## Contract Versioning
406
-
407
- ### Using Pact Broker
408
-
409
- ```bash
410
- # Publish consumer contract
411
- pact-broker publish ./pacts \
412
- --consumer-app-version $(git rev-parse HEAD) \
413
- --branch $(git branch --show-current) \
414
- --broker-base-url $PACT_BROKER_URL \
415
- --broker-token $PACT_BROKER_TOKEN
416
-
417
- # Verify provider
418
- pact-broker verify \
419
- --provider UserService \
420
- --provider-app-version $(git rev-parse HEAD) \
421
- --broker-base-url $PACT_BROKER_URL \
422
- --broker-token $PACT_BROKER_TOKEN
423
-
424
- # Can I deploy?
425
- pact-broker can-i-deploy \
426
- --pacticipant WebApp \
427
- --version $(git rev-parse HEAD) \
428
- --to-environment production
429
- ```
430
-
431
- ### Version Selectors
432
-
433
- ```typescript
434
- // Provider test configuration
435
- {
436
- consumerVersionSelectors: [
437
- { mainBranch: true }, // Test against main branch
438
- { deployedOrReleased: true }, // Test against deployed versions
439
- { matchingBranch: true }, // Test against same branch
440
- ],
441
- }
442
- ```
443
-
444
- ---
445
-
446
- ## CI/CD Integration
447
-
448
- ### GitHub Actions Example
449
-
450
- ```yaml
451
- # .github/workflows/contract-tests.yml
452
- name: Contract Tests
453
-
454
- on:
455
- push:
456
- branches: [main, develop]
457
- pull_request:
458
- branches: [main]
459
-
460
- env:
461
- PACT_BROKER_URL: ${{ secrets.PACT_BROKER_URL }}
462
- PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
463
-
464
- jobs:
465
- consumer-tests:
466
- runs-on: ubuntu-latest
467
- steps:
468
- - uses: actions/checkout@v4
469
-
470
- - name: Setup Node
471
- uses: actions/setup-node@v4
472
- with:
473
- node-version: '20'
474
-
475
- - name: Install dependencies
476
- run: npm ci
477
-
478
- - name: Run consumer contract tests
479
- run: npm run test:contract:consumer
480
-
481
- - name: Publish contracts
482
- if: github.ref == 'refs/heads/main'
483
- run: |
484
- npx pact-broker publish ./pacts \
485
- --consumer-app-version ${{ github.sha }} \
486
- --branch ${{ github.ref_name }}
487
-
488
- provider-tests:
489
- runs-on: ubuntu-latest
490
- needs: consumer-tests
491
- steps:
492
- - uses: actions/checkout@v4
493
-
494
- - name: Setup Node
495
- uses: actions/setup-node@v4
496
-
497
- - name: Install dependencies
498
- run: npm ci
499
-
500
- - name: Run provider verification
501
- run: npm run test:contract:provider
502
- env:
503
- GIT_COMMIT: ${{ github.sha }}
504
- CI: true
505
-
506
- can-i-deploy:
507
- runs-on: ubuntu-latest
508
- needs: [consumer-tests, provider-tests]
509
- if: github.ref == 'refs/heads/main'
510
- steps:
511
- - name: Can I deploy?
512
- run: |
513
- npx pact-broker can-i-deploy \
514
- --pacticipant WebApp \
515
- --version ${{ github.sha }} \
516
- --to-environment production
517
- ```
518
-
519
- ---
520
-
521
- ## Troubleshooting
522
-
523
- ### Common Issues
524
-
525
- #### 1. "No matching interaction found"
526
-
527
- **Cause:** Request doesn't match any defined interaction.
528
-
529
- **Solution:**
530
- ```typescript
531
- // Check exact path, method, headers match
532
- .withRequest({
533
- method: 'GET', // Exact method
534
- path: '/api/users/123', // Exact path (no trailing slash)
535
- headers: {
536
- Accept: 'application/json', // Required headers
537
- },
538
- })
539
- ```
540
-
541
- #### 2. "State handler not found"
542
-
543
- **Cause:** Provider test missing state handler.
544
-
545
- **Solution:**
546
- ```typescript
547
- stateHandlers: {
548
- 'user exists': async () => {
549
- // This string must EXACTLY match the .given() in consumer
550
- },
551
- }
552
- ```
553
-
554
- #### 3. "Response body mismatch"
555
-
556
- **Cause:** Provider returns different structure than expected.
557
-
558
- **Solution:**
559
- - Use flexible matchers instead of exact values
560
- - Check for extra fields in response
561
- - Verify data types match
562
-
563
- ```typescript
564
- // Consumer: Use matchers
565
- body: {
566
- id: string(), // Any string
567
- count: integer(), // Any integer
568
- items: eachLike({}), // Array with at least one item
569
- }
570
- ```
571
-
572
- #### 4. "Verification failed - missing fields"
573
-
574
- **Cause:** Provider response missing required fields.
575
-
576
- **Solution:**
577
- - Ensure provider returns all fields in contract
578
- - Check conditional fields are included
579
-
580
- ### Debugging Tips
581
-
582
- ```typescript
583
- // Enable verbose logging
584
- const provider = new PactV3({
585
- logLevel: 'debug',
586
- });
587
-
588
- // Log actual requests/responses
589
- const verifier = new Verifier({
590
- logLevel: 'debug',
591
- verbose: true,
592
- });
593
- ```
594
-
595
- ### Pact Broker UI
596
-
597
- The Pact Broker provides a web UI showing:
598
- - All contracts
599
- - Verification status
600
- - Can-I-Deploy matrix
601
- - Integration graph
602
-
603
- ---
604
-
605
- ## Best Practices Checklist
606
-
607
- - [ ] Consumer tests generate contracts (not hand-written)
608
- - [ ] Use matchers instead of exact values
609
- - [ ] Keep contracts minimal (only what's used)
610
- - [ ] Version contracts with git commits
611
- - [ ] Run contract tests in CI/CD
612
- - [ ] Block deployments on contract failures
613
- - [ ] Clean up test data between verifications
614
- - [ ] Document state requirements clearly