@cleocode/contracts 2026.4.69 → 2026.4.72

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 (71) hide show
  1. package/dist/__tests__/acceptance-gate.test.d.ts +14 -0
  2. package/dist/__tests__/acceptance-gate.test.d.ts.map +1 -0
  3. package/dist/__tests__/acceptance-gate.test.js +642 -0
  4. package/dist/__tests__/acceptance-gate.test.js.map +1 -0
  5. package/dist/__tests__/attachment.test.d.ts +17 -0
  6. package/dist/__tests__/attachment.test.d.ts.map +1 -0
  7. package/dist/__tests__/attachment.test.js +505 -0
  8. package/dist/__tests__/attachment.test.js.map +1 -0
  9. package/dist/__tests__/evidence-record.test.d.ts +14 -0
  10. package/dist/__tests__/evidence-record.test.d.ts.map +1 -0
  11. package/dist/__tests__/evidence-record.test.js +362 -0
  12. package/dist/__tests__/evidence-record.test.js.map +1 -0
  13. package/dist/__tests__/invariants.test.d.ts +19 -0
  14. package/dist/__tests__/invariants.test.d.ts.map +1 -0
  15. package/dist/__tests__/invariants.test.js +351 -0
  16. package/dist/__tests__/invariants.test.js.map +1 -0
  17. package/dist/acceptance-gate-schema.d.ts +701 -0
  18. package/dist/acceptance-gate-schema.d.ts.map +1 -0
  19. package/dist/acceptance-gate-schema.js +303 -0
  20. package/dist/acceptance-gate-schema.js.map +1 -0
  21. package/dist/acceptance-gate.d.ts +350 -0
  22. package/dist/acceptance-gate.d.ts.map +1 -0
  23. package/dist/acceptance-gate.js +22 -0
  24. package/dist/acceptance-gate.js.map +1 -0
  25. package/dist/attachment-schema.d.ts +243 -0
  26. package/dist/attachment-schema.d.ts.map +1 -0
  27. package/dist/attachment-schema.js +200 -0
  28. package/dist/attachment-schema.js.map +1 -0
  29. package/dist/attachment.d.ts +224 -0
  30. package/dist/attachment.d.ts.map +1 -0
  31. package/dist/attachment.js +21 -0
  32. package/dist/attachment.js.map +1 -0
  33. package/dist/evidence-record-schema.d.ts +202 -0
  34. package/dist/evidence-record-schema.d.ts.map +1 -0
  35. package/dist/evidence-record-schema.js +130 -0
  36. package/dist/evidence-record-schema.js.map +1 -0
  37. package/dist/evidence-record.d.ts +167 -0
  38. package/dist/evidence-record.d.ts.map +1 -0
  39. package/dist/evidence-record.js +21 -0
  40. package/dist/evidence-record.js.map +1 -0
  41. package/dist/index.d.ts +12 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +6 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/task-evidence.d.ts +251 -0
  46. package/dist/task-evidence.d.ts.map +1 -0
  47. package/dist/task-evidence.js +89 -0
  48. package/dist/task-evidence.js.map +1 -0
  49. package/dist/task.d.ts +23 -4
  50. package/dist/task.d.ts.map +1 -1
  51. package/package.json +8 -2
  52. package/schemas/acceptance-gate.schema.json +9 -0
  53. package/schemas/attachment.schema.json +9 -0
  54. package/schemas/gate-result-details.schema.json +9 -0
  55. package/schemas/gate-result.schema.json +9 -0
  56. package/schemas/manifest-v1.json +176 -0
  57. package/schemas/task-evidence.schema.json +9 -0
  58. package/schemas/task.schema.json +9 -0
  59. package/src/__tests__/acceptance-gate.test.ts +736 -0
  60. package/src/__tests__/attachment.test.ts +601 -0
  61. package/src/__tests__/evidence-record.test.ts +412 -0
  62. package/src/__tests__/invariants.test.ts +445 -0
  63. package/src/acceptance-gate-schema.ts +347 -0
  64. package/src/acceptance-gate.ts +370 -0
  65. package/src/attachment-schema.ts +223 -0
  66. package/src/attachment.ts +245 -0
  67. package/src/evidence-record-schema.ts +158 -0
  68. package/src/evidence-record.ts +182 -0
  69. package/src/index.ts +114 -1
  70. package/src/task-evidence.ts +239 -0
  71. package/src/task.ts +24 -4
@@ -0,0 +1,362 @@
1
+ /**
2
+ * Round-trip Zod parse tests for `EvidenceRecord` variants.
3
+ *
4
+ * Each variant is exercised with two cases:
5
+ * 1. A minimal (required-fields-only) input.
6
+ * 2. A maximal (all-fields populated) input with a structural type-check.
7
+ *
8
+ * Five variants × 2 cases = 10 core tests, plus union-routing and rejection tests.
9
+ *
10
+ * @epic T810
11
+ * @task T816
12
+ */
13
+ import { describe, expect, it } from 'vitest';
14
+ import { commandOutputRecordSchema, evidenceRecordSchema, implDiffRecordSchema, lintReportRecordSchema, testOutputRecordSchema, validateSpecCheckRecordSchema, } from '../evidence-record-schema.js';
15
+ // ─── Shared fixture helpers ───────────────────────────────────────────────────
16
+ const SHA256 = 'a'.repeat(64);
17
+ const AGENT = 'T816-worker';
18
+ const TIMESTAMP = '2026-04-16T00:00:00.000Z';
19
+ // ─── impl-diff ────────────────────────────────────────────────────────────────
20
+ describe('implDiffRecordSchema', () => {
21
+ it('round-trips a minimal impl-diff record', () => {
22
+ const input = {
23
+ kind: 'impl-diff',
24
+ phase: 'implement',
25
+ agentIdentity: AGENT,
26
+ attachmentSha256: SHA256,
27
+ filesChanged: ['packages/contracts/src/evidence-record.ts'],
28
+ linesAdded: 120,
29
+ linesRemoved: 0,
30
+ ranAt: TIMESTAMP,
31
+ durationMs: 850,
32
+ };
33
+ const result = implDiffRecordSchema.parse(input);
34
+ expect(result.kind).toBe('impl-diff');
35
+ expect(result.phase).toBe('implement');
36
+ expect(result.filesChanged).toHaveLength(1);
37
+ expect(result.linesAdded).toBe(120);
38
+ expect(result.linesRemoved).toBe(0);
39
+ expect(result.durationMs).toBe(850);
40
+ });
41
+ it('round-trips a maximal impl-diff record and type-checks as EvidenceRecord', () => {
42
+ const input = {
43
+ kind: 'impl-diff',
44
+ phase: 'implement',
45
+ agentIdentity: AGENT,
46
+ attachmentSha256: SHA256,
47
+ filesChanged: [
48
+ 'packages/contracts/src/evidence-record.ts',
49
+ 'packages/contracts/src/evidence-record-schema.ts',
50
+ 'packages/contracts/src/index.ts',
51
+ ],
52
+ linesAdded: 300,
53
+ linesRemoved: 5,
54
+ ranAt: TIMESTAMP,
55
+ durationMs: 1200,
56
+ };
57
+ const result = implDiffRecordSchema.parse(input);
58
+ expect(result.filesChanged).toHaveLength(3);
59
+ expect(result.linesRemoved).toBe(5);
60
+ // Structural compatibility with canonical interface
61
+ const typed = result;
62
+ expect(typed.kind).toBe('impl-diff');
63
+ // Assignable to the union
64
+ const unionTyped = result;
65
+ expect(unionTyped.kind).toBe('impl-diff');
66
+ });
67
+ });
68
+ // ─── validate-spec-check ─────────────────────────────────────────────────────
69
+ describe('validateSpecCheckRecordSchema', () => {
70
+ it('round-trips a minimal validate-spec-check record', () => {
71
+ const input = {
72
+ kind: 'validate-spec-check',
73
+ phase: 'validate',
74
+ agentIdentity: AGENT,
75
+ attachmentSha256: SHA256,
76
+ reqIdsChecked: ['IVTR-01'],
77
+ passed: true,
78
+ details: 'All checked REQ-IDs satisfied.',
79
+ ranAt: TIMESTAMP,
80
+ durationMs: 300,
81
+ };
82
+ const result = validateSpecCheckRecordSchema.parse(input);
83
+ expect(result.kind).toBe('validate-spec-check');
84
+ expect(result.phase).toBe('validate');
85
+ expect(result.passed).toBe(true);
86
+ expect(result.reqIdsChecked).toEqual(['IVTR-01']);
87
+ });
88
+ it('round-trips a maximal validate-spec-check record with failure', () => {
89
+ const input = {
90
+ kind: 'validate-spec-check',
91
+ phase: 'validate',
92
+ agentIdentity: AGENT,
93
+ attachmentSha256: SHA256,
94
+ reqIdsChecked: ['IVTR-01', 'IVTR-02', 'IVTR-06'],
95
+ passed: false,
96
+ details: 'IVTR-06: EvidenceRecord schema missing lint-report variant.',
97
+ ranAt: TIMESTAMP,
98
+ durationMs: 550,
99
+ };
100
+ const result = validateSpecCheckRecordSchema.parse(input);
101
+ expect(result.reqIdsChecked).toHaveLength(3);
102
+ expect(result.passed).toBe(false);
103
+ expect(result.details).toContain('lint-report');
104
+ // Structural compatibility with canonical interface
105
+ const typed = result;
106
+ expect(typed.kind).toBe('validate-spec-check');
107
+ });
108
+ });
109
+ // ─── test-output ─────────────────────────────────────────────────────────────
110
+ describe('testOutputRecordSchema', () => {
111
+ it('round-trips a minimal test-output record', () => {
112
+ const input = {
113
+ kind: 'test-output',
114
+ phase: 'test',
115
+ agentIdentity: AGENT,
116
+ attachmentSha256: SHA256,
117
+ command: 'pnpm --filter @cleocode/contracts run test',
118
+ exitCode: 0,
119
+ testsPassed: 10,
120
+ testsFailed: 0,
121
+ ranAt: TIMESTAMP,
122
+ durationMs: 4200,
123
+ };
124
+ const result = testOutputRecordSchema.parse(input);
125
+ expect(result.kind).toBe('test-output');
126
+ expect(result.phase).toBe('test');
127
+ expect(result.exitCode).toBe(0);
128
+ expect(result.testsPassed).toBe(10);
129
+ expect(result.testsFailed).toBe(0);
130
+ });
131
+ it('round-trips a test-output record with failures and type-checks as EvidenceRecord', () => {
132
+ const input = {
133
+ kind: 'test-output',
134
+ phase: 'test',
135
+ agentIdentity: AGENT,
136
+ attachmentSha256: SHA256,
137
+ command: 'pnpm run test',
138
+ exitCode: 1,
139
+ testsPassed: 8,
140
+ testsFailed: 2,
141
+ ranAt: TIMESTAMP,
142
+ durationMs: 3100,
143
+ };
144
+ const result = testOutputRecordSchema.parse(input);
145
+ expect(result.exitCode).toBe(1);
146
+ expect(result.testsFailed).toBe(2);
147
+ // Structural compatibility
148
+ const typed = result;
149
+ expect(typed.command).toBe('pnpm run test');
150
+ const unionTyped = result;
151
+ expect(unionTyped.kind).toBe('test-output');
152
+ });
153
+ });
154
+ // ─── lint-report ─────────────────────────────────────────────────────────────
155
+ describe('lintReportRecordSchema', () => {
156
+ it('round-trips a minimal lint-report record (implement phase)', () => {
157
+ const input = {
158
+ kind: 'lint-report',
159
+ phase: 'implement',
160
+ agentIdentity: AGENT,
161
+ attachmentSha256: SHA256,
162
+ tool: 'biome',
163
+ passed: true,
164
+ warnings: 0,
165
+ errors: 0,
166
+ ranAt: TIMESTAMP,
167
+ durationMs: 620,
168
+ };
169
+ const result = lintReportRecordSchema.parse(input);
170
+ expect(result.kind).toBe('lint-report');
171
+ expect(result.phase).toBe('implement');
172
+ expect(result.tool).toBe('biome');
173
+ expect(result.passed).toBe(true);
174
+ expect(result.warnings).toBe(0);
175
+ expect(result.errors).toBe(0);
176
+ });
177
+ it('round-trips a lint-report record with warnings (test phase) and type-checks', () => {
178
+ const input = {
179
+ kind: 'lint-report',
180
+ phase: 'test',
181
+ agentIdentity: AGENT,
182
+ attachmentSha256: SHA256,
183
+ tool: 'tsc',
184
+ passed: false,
185
+ warnings: 3,
186
+ errors: 2,
187
+ ranAt: TIMESTAMP,
188
+ durationMs: 800,
189
+ };
190
+ const result = lintReportRecordSchema.parse(input);
191
+ expect(result.phase).toBe('test');
192
+ expect(result.warnings).toBe(3);
193
+ expect(result.errors).toBe(2);
194
+ expect(result.passed).toBe(false);
195
+ // Structural compatibility
196
+ const typed = result;
197
+ expect(typed.tool).toBe('tsc');
198
+ const unionTyped = result;
199
+ expect(unionTyped.kind).toBe('lint-report');
200
+ });
201
+ });
202
+ // ─── command-output ───────────────────────────────────────────────────────────
203
+ describe('commandOutputRecordSchema', () => {
204
+ it('round-trips a minimal command-output record (implement phase)', () => {
205
+ const input = {
206
+ kind: 'command-output',
207
+ phase: 'implement',
208
+ agentIdentity: AGENT,
209
+ attachmentSha256: SHA256,
210
+ cmd: 'git diff --stat HEAD',
211
+ exitCode: 0,
212
+ ranAt: TIMESTAMP,
213
+ durationMs: 120,
214
+ };
215
+ const result = commandOutputRecordSchema.parse(input);
216
+ expect(result.kind).toBe('command-output');
217
+ expect(result.phase).toBe('implement');
218
+ expect(result.cmd).toBe('git diff --stat HEAD');
219
+ expect(result.exitCode).toBe(0);
220
+ });
221
+ it('round-trips a command-output record (validate phase) and type-checks as EvidenceRecord', () => {
222
+ const input = {
223
+ kind: 'command-output',
224
+ phase: 'validate',
225
+ agentIdentity: AGENT,
226
+ attachmentSha256: SHA256,
227
+ cmd: 'cleo check --task T816',
228
+ exitCode: 0,
229
+ ranAt: TIMESTAMP,
230
+ durationMs: 250,
231
+ };
232
+ const result = commandOutputRecordSchema.parse(input);
233
+ expect(result.phase).toBe('validate');
234
+ // Structural compatibility
235
+ const typed = result;
236
+ expect(typed.cmd).toBe('cleo check --task T816');
237
+ const unionTyped = result;
238
+ expect(unionTyped.kind).toBe('command-output');
239
+ });
240
+ });
241
+ // ─── evidenceRecordSchema (discriminated union routing) ──────────────────────
242
+ describe('evidenceRecordSchema (discriminated union)', () => {
243
+ it('routes impl-diff by kind', () => {
244
+ const result = evidenceRecordSchema.parse({
245
+ kind: 'impl-diff',
246
+ phase: 'implement',
247
+ agentIdentity: AGENT,
248
+ attachmentSha256: SHA256,
249
+ filesChanged: ['src/x.ts'],
250
+ linesAdded: 10,
251
+ linesRemoved: 2,
252
+ ranAt: TIMESTAMP,
253
+ durationMs: 100,
254
+ });
255
+ expect(result.kind).toBe('impl-diff');
256
+ });
257
+ it('routes validate-spec-check by kind', () => {
258
+ const result = evidenceRecordSchema.parse({
259
+ kind: 'validate-spec-check',
260
+ phase: 'validate',
261
+ agentIdentity: AGENT,
262
+ attachmentSha256: SHA256,
263
+ reqIdsChecked: ['REQ-01'],
264
+ passed: true,
265
+ details: 'ok',
266
+ ranAt: TIMESTAMP,
267
+ durationMs: 100,
268
+ });
269
+ expect(result.kind).toBe('validate-spec-check');
270
+ });
271
+ it('routes test-output by kind', () => {
272
+ const result = evidenceRecordSchema.parse({
273
+ kind: 'test-output',
274
+ phase: 'test',
275
+ agentIdentity: AGENT,
276
+ attachmentSha256: SHA256,
277
+ command: 'pnpm test',
278
+ exitCode: 0,
279
+ testsPassed: 5,
280
+ testsFailed: 0,
281
+ ranAt: TIMESTAMP,
282
+ durationMs: 100,
283
+ });
284
+ expect(result.kind).toBe('test-output');
285
+ });
286
+ it('routes lint-report by kind', () => {
287
+ const result = evidenceRecordSchema.parse({
288
+ kind: 'lint-report',
289
+ phase: 'implement',
290
+ agentIdentity: AGENT,
291
+ attachmentSha256: SHA256,
292
+ tool: 'biome',
293
+ passed: true,
294
+ warnings: 0,
295
+ errors: 0,
296
+ ranAt: TIMESTAMP,
297
+ durationMs: 100,
298
+ });
299
+ expect(result.kind).toBe('lint-report');
300
+ });
301
+ it('routes command-output by kind', () => {
302
+ const result = evidenceRecordSchema.parse({
303
+ kind: 'command-output',
304
+ phase: 'test',
305
+ agentIdentity: AGENT,
306
+ attachmentSha256: SHA256,
307
+ cmd: 'cleo doctor',
308
+ exitCode: 0,
309
+ ranAt: TIMESTAMP,
310
+ durationMs: 100,
311
+ });
312
+ expect(result.kind).toBe('command-output');
313
+ });
314
+ it('rejects an unknown kind', () => {
315
+ expect(() => evidenceRecordSchema.parse({
316
+ kind: 'unknown-kind',
317
+ agentIdentity: AGENT,
318
+ attachmentSha256: SHA256,
319
+ ranAt: TIMESTAMP,
320
+ durationMs: 0,
321
+ })).toThrow();
322
+ });
323
+ it('rejects an invalid attachmentSha256 (wrong length)', () => {
324
+ expect(() => evidenceRecordSchema.parse({
325
+ kind: 'command-output',
326
+ phase: 'test',
327
+ agentIdentity: AGENT,
328
+ attachmentSha256: 'tooshort',
329
+ cmd: 'cleo doctor',
330
+ exitCode: 0,
331
+ ranAt: TIMESTAMP,
332
+ durationMs: 0,
333
+ })).toThrow();
334
+ });
335
+ it('rejects an invalid ranAt (non-datetime string)', () => {
336
+ expect(() => evidenceRecordSchema.parse({
337
+ kind: 'test-output',
338
+ phase: 'test',
339
+ agentIdentity: AGENT,
340
+ attachmentSha256: SHA256,
341
+ command: 'pnpm test',
342
+ exitCode: 0,
343
+ testsPassed: 1,
344
+ testsFailed: 0,
345
+ ranAt: 'not-a-timestamp',
346
+ durationMs: 0,
347
+ })).toThrow();
348
+ });
349
+ it('rejects negative durationMs', () => {
350
+ expect(() => evidenceRecordSchema.parse({
351
+ kind: 'command-output',
352
+ phase: 'implement',
353
+ agentIdentity: AGENT,
354
+ attachmentSha256: SHA256,
355
+ cmd: 'cleo doctor',
356
+ exitCode: 0,
357
+ ranAt: TIMESTAMP,
358
+ durationMs: -1,
359
+ })).toThrow();
360
+ });
361
+ });
362
+ //# sourceMappingURL=evidence-record.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-record.test.js","sourceRoot":"","sources":["../../src/__tests__/evidence-record.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Contract invariant tests for @cleocode/contracts.
3
+ *
4
+ * Asserts structural rules that must hold across ALL contracts:
5
+ *
6
+ * 1. No contract field named `notes`, `details`, or `text` is typed as bare
7
+ * `string` when a structured shape is possible.
8
+ * Whitelisted exceptions are documented with inline rationale.
9
+ *
10
+ * 2. All discriminated unions use `kind` as the discriminant — NOT `type`.
11
+ * Convention: `type` is reserved for FileAssertion variants only (legacy).
12
+ *
13
+ * 3. Zod schemas for each major contract type are exported from the index.
14
+ *
15
+ * @epic T760
16
+ * @task T804
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=invariants.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/invariants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}