@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.
- package/dist/__tests__/acceptance-gate.test.d.ts +14 -0
- package/dist/__tests__/acceptance-gate.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance-gate.test.js +642 -0
- package/dist/__tests__/acceptance-gate.test.js.map +1 -0
- package/dist/__tests__/attachment.test.d.ts +17 -0
- package/dist/__tests__/attachment.test.d.ts.map +1 -0
- package/dist/__tests__/attachment.test.js +505 -0
- package/dist/__tests__/attachment.test.js.map +1 -0
- package/dist/__tests__/evidence-record.test.d.ts +14 -0
- package/dist/__tests__/evidence-record.test.d.ts.map +1 -0
- package/dist/__tests__/evidence-record.test.js +362 -0
- package/dist/__tests__/evidence-record.test.js.map +1 -0
- package/dist/__tests__/invariants.test.d.ts +19 -0
- package/dist/__tests__/invariants.test.d.ts.map +1 -0
- package/dist/__tests__/invariants.test.js +351 -0
- package/dist/__tests__/invariants.test.js.map +1 -0
- package/dist/acceptance-gate-schema.d.ts +701 -0
- package/dist/acceptance-gate-schema.d.ts.map +1 -0
- package/dist/acceptance-gate-schema.js +303 -0
- package/dist/acceptance-gate-schema.js.map +1 -0
- package/dist/acceptance-gate.d.ts +350 -0
- package/dist/acceptance-gate.d.ts.map +1 -0
- package/dist/acceptance-gate.js +22 -0
- package/dist/acceptance-gate.js.map +1 -0
- package/dist/attachment-schema.d.ts +243 -0
- package/dist/attachment-schema.d.ts.map +1 -0
- package/dist/attachment-schema.js +200 -0
- package/dist/attachment-schema.js.map +1 -0
- package/dist/attachment.d.ts +224 -0
- package/dist/attachment.d.ts.map +1 -0
- package/dist/attachment.js +21 -0
- package/dist/attachment.js.map +1 -0
- package/dist/evidence-record-schema.d.ts +202 -0
- package/dist/evidence-record-schema.d.ts.map +1 -0
- package/dist/evidence-record-schema.js +130 -0
- package/dist/evidence-record-schema.js.map +1 -0
- package/dist/evidence-record.d.ts +167 -0
- package/dist/evidence-record.d.ts.map +1 -0
- package/dist/evidence-record.js +21 -0
- package/dist/evidence-record.js.map +1 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/task-evidence.d.ts +251 -0
- package/dist/task-evidence.d.ts.map +1 -0
- package/dist/task-evidence.js +89 -0
- package/dist/task-evidence.js.map +1 -0
- package/dist/task.d.ts +23 -4
- package/dist/task.d.ts.map +1 -1
- package/package.json +8 -2
- package/schemas/acceptance-gate.schema.json +9 -0
- package/schemas/attachment.schema.json +9 -0
- package/schemas/gate-result-details.schema.json +9 -0
- package/schemas/gate-result.schema.json +9 -0
- package/schemas/manifest-v1.json +176 -0
- package/schemas/task-evidence.schema.json +9 -0
- package/schemas/task.schema.json +9 -0
- package/src/__tests__/acceptance-gate.test.ts +736 -0
- package/src/__tests__/attachment.test.ts +601 -0
- package/src/__tests__/evidence-record.test.ts +412 -0
- package/src/__tests__/invariants.test.ts +445 -0
- package/src/acceptance-gate-schema.ts +347 -0
- package/src/acceptance-gate.ts +370 -0
- package/src/attachment-schema.ts +223 -0
- package/src/attachment.ts +245 -0
- package/src/evidence-record-schema.ts +158 -0
- package/src/evidence-record.ts +182 -0
- package/src/index.ts +114 -1
- package/src/task-evidence.ts +239 -0
- package/src/task.ts +24 -4
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attachment discriminated union and metadata types.
|
|
3
|
+
*
|
|
4
|
+
* An `Attachment` represents any content artifact that can be associated
|
|
5
|
+
* with a CLEO owner (task, observation, session, decision, learning, pattern).
|
|
6
|
+
* Five attachment kinds are supported:
|
|
7
|
+
* - `local-file` — a file on disk, tracked by path + SHA-256 hash
|
|
8
|
+
* - `url` — a remote URL, optionally cached to the content-addressed store
|
|
9
|
+
* - `blob` — raw bytes stored content-addressed in `.cleo/attachments/sha256/`
|
|
10
|
+
* - `llms-txt` — a generated or fetched llms.txt site-index snapshot (RFC llmstxt.org)
|
|
11
|
+
* - `llmtxt-doc` — a pointer into an llmtxt document (local or remote backend)
|
|
12
|
+
*
|
|
13
|
+
* `AttachmentMetadata` is the row persisted in the attachment registry.
|
|
14
|
+
* `AttachmentRef` is the junction row linking an attachment to an owner.
|
|
15
|
+
*
|
|
16
|
+
* @epic T760
|
|
17
|
+
* @task T795
|
|
18
|
+
* @see {@link https://github.com/kryptobaseddev/cleo} T760 unified attachments
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* A file on disk inside or adjacent to the CLEO project.
|
|
22
|
+
*
|
|
23
|
+
* The `path` is stored as recorded at attach time; the `sha256` is the content
|
|
24
|
+
* hash computed at that moment. On fetch, the runtime re-hashes the file and
|
|
25
|
+
* emits a warning if the file has drifted from the stored hash.
|
|
26
|
+
*/
|
|
27
|
+
export interface LocalFileAttachment {
|
|
28
|
+
kind: 'local-file';
|
|
29
|
+
/** Path to the file (absolute or project-root-relative, forward-slashes only). */
|
|
30
|
+
path: string;
|
|
31
|
+
/** SHA-256 hex digest of the file at attach time. */
|
|
32
|
+
sha256: string;
|
|
33
|
+
/** IANA MIME type (e.g., `"text/markdown"`, `"application/pdf"`). */
|
|
34
|
+
mime: string;
|
|
35
|
+
/** File size in bytes at attach time. */
|
|
36
|
+
size: number;
|
|
37
|
+
/** Optional free-text description of what this file contains. */
|
|
38
|
+
description?: string;
|
|
39
|
+
/** Labels for filtering (e.g., `["rfc", "spec"]`). */
|
|
40
|
+
labels?: string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A remote URL, optionally cached to the content-addressed store.
|
|
44
|
+
*
|
|
45
|
+
* When `--cache` is passed on attach, the body is fetched, hashed, and stored
|
|
46
|
+
* at `.cleo/attachments/sha256/<hash[0..2]>/<hash[2..]>.<ext>`. The
|
|
47
|
+
* `cachedSha256` and `cachedAt` fields are populated on a successful cache.
|
|
48
|
+
*/
|
|
49
|
+
export interface UrlAttachment {
|
|
50
|
+
kind: 'url';
|
|
51
|
+
/** The remote URL. Must be a valid absolute URL. */
|
|
52
|
+
url: string;
|
|
53
|
+
/** SHA-256 of the fetched body if the URL has been cached locally. */
|
|
54
|
+
cachedSha256?: string;
|
|
55
|
+
/** ISO 8601 timestamp when the body was cached. */
|
|
56
|
+
cachedAt?: string;
|
|
57
|
+
/** IANA MIME type detected from the Content-Type header. */
|
|
58
|
+
mime?: string;
|
|
59
|
+
/** Optional free-text description. */
|
|
60
|
+
description?: string;
|
|
61
|
+
/** Labels for filtering. */
|
|
62
|
+
labels?: string[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Raw bytes stored content-addressed in `.cleo/attachments/sha256/`.
|
|
66
|
+
*
|
|
67
|
+
* No external path dependency — the content is always retrievable by
|
|
68
|
+
* `storageKey` as long as the attachment has a positive `refCount`.
|
|
69
|
+
*/
|
|
70
|
+
export interface BlobAttachment {
|
|
71
|
+
kind: 'blob';
|
|
72
|
+
/** SHA-256 hex digest of the uncompressed content. */
|
|
73
|
+
sha256: string;
|
|
74
|
+
/** Storage key inside `.cleo/attachments/sha256/` (e.g., `"ab/abcdef…12.pdf"`). */
|
|
75
|
+
storageKey: string;
|
|
76
|
+
/** IANA MIME type. */
|
|
77
|
+
mime: string;
|
|
78
|
+
/** Size of the uncompressed content in bytes. */
|
|
79
|
+
size: number;
|
|
80
|
+
/** Optional free-text description. */
|
|
81
|
+
description?: string;
|
|
82
|
+
/** Labels for filtering. */
|
|
83
|
+
labels?: string[];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A generated or fetched llms.txt site-index snapshot (per llmstxt.org spec).
|
|
87
|
+
*
|
|
88
|
+
* The content is stored inline — llms.txt files are small by design.
|
|
89
|
+
* `source: 'url'` means it was fetched from a remote site;
|
|
90
|
+
* `source: 'generated'` means it was produced by `cleo docs generate`.
|
|
91
|
+
*/
|
|
92
|
+
export interface LlmsTxtAttachment {
|
|
93
|
+
kind: 'llms-txt';
|
|
94
|
+
/** Where the llms.txt content originated. */
|
|
95
|
+
source: 'url' | 'generated';
|
|
96
|
+
/**
|
|
97
|
+
* Full markdown content of the llms.txt (stored inline; small by design per
|
|
98
|
+
* the llmstxt.org spec).
|
|
99
|
+
*/
|
|
100
|
+
content: string;
|
|
101
|
+
/** SHA-256 hex digest of `content`. */
|
|
102
|
+
sha256: string;
|
|
103
|
+
/** Optional free-text description. */
|
|
104
|
+
description?: string;
|
|
105
|
+
/** Labels for filtering. */
|
|
106
|
+
labels?: string[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* A pointer into an llmtxt document managed by a local or remote backend.
|
|
110
|
+
*
|
|
111
|
+
* `backend: 'local'` — the document lives in `.cleo/llmtxt/` (llmtxt LocalBackend).
|
|
112
|
+
* `backend: 'remote'` — the document lives on an llmtxt.my SaaS instance.
|
|
113
|
+
*
|
|
114
|
+
* This attachment kind delegates content storage to the llmtxt package; CLEO
|
|
115
|
+
* only stores the pointer (slug + backend + optional pinned version).
|
|
116
|
+
*/
|
|
117
|
+
export interface LlmtxtDocAttachment {
|
|
118
|
+
kind: 'llmtxt-doc';
|
|
119
|
+
/** Document slug from the llmtxt backend (e.g., `"9fZLOnf5"`). */
|
|
120
|
+
slug: string;
|
|
121
|
+
/** Which backend owns the document. */
|
|
122
|
+
backend: 'local' | 'remote';
|
|
123
|
+
/**
|
|
124
|
+
* Version string pinned at attach time.
|
|
125
|
+
*
|
|
126
|
+
* For `local` backends this is the integer version number serialised as a
|
|
127
|
+
* string; for `remote` backends it is the version identifier returned by the
|
|
128
|
+
* API.
|
|
129
|
+
*/
|
|
130
|
+
pinnedVersion?: string;
|
|
131
|
+
/** Optional free-text description. */
|
|
132
|
+
description?: string;
|
|
133
|
+
/** Labels for filtering. */
|
|
134
|
+
labels?: string[];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A content artifact attachable to any CLEO owner
|
|
138
|
+
* (task, observation, session, decision, learning, or pattern).
|
|
139
|
+
*
|
|
140
|
+
* The `kind` field is the discriminant. All variants share optional
|
|
141
|
+
* `description` and `labels` fields.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* const att: Attachment = {
|
|
146
|
+
* kind: 'local-file',
|
|
147
|
+
* path: 'docs/rfc-003.md',
|
|
148
|
+
* sha256: 'a1b2c3...ff',
|
|
149
|
+
* mime: 'text/markdown',
|
|
150
|
+
* size: 8192,
|
|
151
|
+
* description: 'RFC draft v3',
|
|
152
|
+
* labels: ['rfc', 'spec'],
|
|
153
|
+
* };
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export type Attachment = LocalFileAttachment | UrlAttachment | BlobAttachment | LlmsTxtAttachment | LlmtxtDocAttachment;
|
|
157
|
+
/** All valid `kind` discriminants for `Attachment`. */
|
|
158
|
+
export type AttachmentKind = Attachment['kind'];
|
|
159
|
+
/**
|
|
160
|
+
* Persisted metadata row for one attachment in the attachment registry
|
|
161
|
+
* (`.cleo/attachments/index.db`).
|
|
162
|
+
*
|
|
163
|
+
* The full {@link Attachment} value is stored as a JSON blob in the `attachment`
|
|
164
|
+
* field so the registry does not need a column per variant.
|
|
165
|
+
*/
|
|
166
|
+
export interface AttachmentMetadata {
|
|
167
|
+
/**
|
|
168
|
+
* Unique attachment ID.
|
|
169
|
+
*
|
|
170
|
+
* Pattern: `att_<base62>` — generated by `llmtxt.generateId()` or a UUID
|
|
171
|
+
* fallback.
|
|
172
|
+
*/
|
|
173
|
+
id: string;
|
|
174
|
+
/**
|
|
175
|
+
* Content hash.
|
|
176
|
+
*
|
|
177
|
+
* For `local-file`, `blob`, and `llms-txt` variants this is the SHA-256
|
|
178
|
+
* of the bytes at attach time. For `url` it is `cachedSha256` when the URL
|
|
179
|
+
* has been cached, or the empty string when it has not. For `llmtxt-doc` it
|
|
180
|
+
* is the empty string (content is managed by the llmtxt backend).
|
|
181
|
+
*/
|
|
182
|
+
sha256: string;
|
|
183
|
+
/** The full attachment value (all kind-specific fields). */
|
|
184
|
+
attachment: Attachment;
|
|
185
|
+
/** ISO 8601 timestamp when this attachment was first registered. */
|
|
186
|
+
createdAt: string;
|
|
187
|
+
/**
|
|
188
|
+
* How many {@link AttachmentRef} rows point at this attachment.
|
|
189
|
+
*
|
|
190
|
+
* When `refCount` drops to zero the blob is eligible for GC via
|
|
191
|
+
* `cleo docs attachments gc`. Blobs are NEVER auto-deleted.
|
|
192
|
+
*/
|
|
193
|
+
refCount: number;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Junction row linking one attachment to one owner.
|
|
197
|
+
*
|
|
198
|
+
* Stored in the `attachment_refs` table of `.cleo/attachments/index.db`.
|
|
199
|
+
* A single attachment can be referenced by multiple owners simultaneously
|
|
200
|
+
* (e.g., the same RFC PDF attached to an epic and to every child task).
|
|
201
|
+
*/
|
|
202
|
+
export interface AttachmentRef {
|
|
203
|
+
/** ID of the attachment (→ `attachments.id`). */
|
|
204
|
+
attachmentId: string;
|
|
205
|
+
/**
|
|
206
|
+
* The domain entity type that owns this attachment.
|
|
207
|
+
*
|
|
208
|
+
* Determines which CLEO store to query when resolving the owner's display
|
|
209
|
+
* name (`tasks.db` for task/session/decision/learning/pattern;
|
|
210
|
+
* `brain.db` for observation).
|
|
211
|
+
*/
|
|
212
|
+
ownerType: 'task' | 'observation' | 'session' | 'decision' | 'learning' | 'pattern';
|
|
213
|
+
/** The ID of the owning entity (e.g., `"T766"`, `"O-abc123"`, `"ses_..."`). */
|
|
214
|
+
ownerId: string;
|
|
215
|
+
/** ISO 8601 timestamp when the ref was created. */
|
|
216
|
+
attachedAt: string;
|
|
217
|
+
/**
|
|
218
|
+
* Agent identity (or `"human"`) that created the ref.
|
|
219
|
+
*
|
|
220
|
+
* Populated from the active session's agent credential when available.
|
|
221
|
+
*/
|
|
222
|
+
attachedBy?: string;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=attachment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../src/attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attachment discriminated union and metadata types.
|
|
3
|
+
*
|
|
4
|
+
* An `Attachment` represents any content artifact that can be associated
|
|
5
|
+
* with a CLEO owner (task, observation, session, decision, learning, pattern).
|
|
6
|
+
* Five attachment kinds are supported:
|
|
7
|
+
* - `local-file` — a file on disk, tracked by path + SHA-256 hash
|
|
8
|
+
* - `url` — a remote URL, optionally cached to the content-addressed store
|
|
9
|
+
* - `blob` — raw bytes stored content-addressed in `.cleo/attachments/sha256/`
|
|
10
|
+
* - `llms-txt` — a generated or fetched llms.txt site-index snapshot (RFC llmstxt.org)
|
|
11
|
+
* - `llmtxt-doc` — a pointer into an llmtxt document (local or remote backend)
|
|
12
|
+
*
|
|
13
|
+
* `AttachmentMetadata` is the row persisted in the attachment registry.
|
|
14
|
+
* `AttachmentRef` is the junction row linking an attachment to an owner.
|
|
15
|
+
*
|
|
16
|
+
* @epic T760
|
|
17
|
+
* @task T795
|
|
18
|
+
* @see {@link https://github.com/kryptobaseddev/cleo} T760 unified attachments
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=attachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.js","sourceRoot":"","sources":["../src/attachment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod validation schemas for {@link EvidenceRecord} and its variants.
|
|
3
|
+
*
|
|
4
|
+
* Kept in a separate file from the plain TypeScript types so that consumers
|
|
5
|
+
* that do not need runtime validation (e.g. type-only imports) pay zero cost.
|
|
6
|
+
*
|
|
7
|
+
* All schemas are named `*RecordSchema` and derive their inferred types from
|
|
8
|
+
* the canonical TypeScript interfaces in `./evidence-record.ts`.
|
|
9
|
+
*
|
|
10
|
+
* The top-level {@link evidenceRecordSchema} is a `z.discriminatedUnion` on
|
|
11
|
+
* `"kind"` so Zod can route to the correct variant in O(1).
|
|
12
|
+
*
|
|
13
|
+
* @epic T810
|
|
14
|
+
* @task T816
|
|
15
|
+
*/
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
/**
|
|
18
|
+
* Zod schema for {@link ImplDiffRecord}.
|
|
19
|
+
*
|
|
20
|
+
* Validates that `filesChanged` is a non-empty array and that `linesAdded` /
|
|
21
|
+
* `linesRemoved` are non-negative integers.
|
|
22
|
+
*/
|
|
23
|
+
export declare const implDiffRecordSchema: z.ZodObject<{
|
|
24
|
+
agentIdentity: z.ZodString;
|
|
25
|
+
attachmentSha256: z.ZodString;
|
|
26
|
+
ranAt: z.ZodString;
|
|
27
|
+
durationMs: z.ZodNumber;
|
|
28
|
+
kind: z.ZodLiteral<"impl-diff">;
|
|
29
|
+
phase: z.ZodLiteral<"implement">;
|
|
30
|
+
filesChanged: z.ZodArray<z.ZodString>;
|
|
31
|
+
linesAdded: z.ZodNumber;
|
|
32
|
+
linesRemoved: z.ZodNumber;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
/** Inferred TypeScript type from {@link implDiffRecordSchema}. */
|
|
35
|
+
export type ImplDiffRecordInput = z.input<typeof implDiffRecordSchema>;
|
|
36
|
+
/**
|
|
37
|
+
* Zod schema for {@link ValidateSpecCheckRecord}.
|
|
38
|
+
*
|
|
39
|
+
* Validates that `reqIdsChecked` is non-empty and `details` is non-blank.
|
|
40
|
+
*/
|
|
41
|
+
export declare const validateSpecCheckRecordSchema: z.ZodObject<{
|
|
42
|
+
agentIdentity: z.ZodString;
|
|
43
|
+
attachmentSha256: z.ZodString;
|
|
44
|
+
ranAt: z.ZodString;
|
|
45
|
+
durationMs: z.ZodNumber;
|
|
46
|
+
kind: z.ZodLiteral<"validate-spec-check">;
|
|
47
|
+
phase: z.ZodLiteral<"validate">;
|
|
48
|
+
reqIdsChecked: z.ZodArray<z.ZodString>;
|
|
49
|
+
passed: z.ZodBoolean;
|
|
50
|
+
details: z.ZodString;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
/** Inferred TypeScript type from {@link validateSpecCheckRecordSchema}. */
|
|
53
|
+
export type ValidateSpecCheckRecordInput = z.input<typeof validateSpecCheckRecordSchema>;
|
|
54
|
+
/**
|
|
55
|
+
* Zod schema for {@link TestOutputRecord}.
|
|
56
|
+
*
|
|
57
|
+
* Validates that `command` is non-blank and test counts are non-negative.
|
|
58
|
+
*/
|
|
59
|
+
export declare const testOutputRecordSchema: z.ZodObject<{
|
|
60
|
+
agentIdentity: z.ZodString;
|
|
61
|
+
attachmentSha256: z.ZodString;
|
|
62
|
+
ranAt: z.ZodString;
|
|
63
|
+
durationMs: z.ZodNumber;
|
|
64
|
+
kind: z.ZodLiteral<"test-output">;
|
|
65
|
+
phase: z.ZodLiteral<"test">;
|
|
66
|
+
command: z.ZodString;
|
|
67
|
+
exitCode: z.ZodNumber;
|
|
68
|
+
testsPassed: z.ZodNumber;
|
|
69
|
+
testsFailed: z.ZodNumber;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
/** Inferred TypeScript type from {@link testOutputRecordSchema}. */
|
|
72
|
+
export type TestOutputRecordInput = z.input<typeof testOutputRecordSchema>;
|
|
73
|
+
/**
|
|
74
|
+
* Zod schema for {@link LintReportRecord}.
|
|
75
|
+
*
|
|
76
|
+
* `phase` is restricted to `'implement' | 'test'`.
|
|
77
|
+
* `warnings` and `errors` are non-negative integers.
|
|
78
|
+
*/
|
|
79
|
+
export declare const lintReportRecordSchema: z.ZodObject<{
|
|
80
|
+
agentIdentity: z.ZodString;
|
|
81
|
+
attachmentSha256: z.ZodString;
|
|
82
|
+
ranAt: z.ZodString;
|
|
83
|
+
durationMs: z.ZodNumber;
|
|
84
|
+
kind: z.ZodLiteral<"lint-report">;
|
|
85
|
+
phase: z.ZodEnum<{
|
|
86
|
+
test: "test";
|
|
87
|
+
implement: "implement";
|
|
88
|
+
}>;
|
|
89
|
+
tool: z.ZodString;
|
|
90
|
+
passed: z.ZodBoolean;
|
|
91
|
+
warnings: z.ZodNumber;
|
|
92
|
+
errors: z.ZodNumber;
|
|
93
|
+
}, z.core.$strip>;
|
|
94
|
+
/** Inferred TypeScript type from {@link lintReportRecordSchema}. */
|
|
95
|
+
export type LintReportRecordInput = z.input<typeof lintReportRecordSchema>;
|
|
96
|
+
/**
|
|
97
|
+
* Zod schema for {@link CommandOutputRecord}.
|
|
98
|
+
*
|
|
99
|
+
* `phase` can be `'implement'`, `'validate'`, or `'test'`.
|
|
100
|
+
* `cmd` must be non-blank.
|
|
101
|
+
*/
|
|
102
|
+
export declare const commandOutputRecordSchema: z.ZodObject<{
|
|
103
|
+
agentIdentity: z.ZodString;
|
|
104
|
+
attachmentSha256: z.ZodString;
|
|
105
|
+
ranAt: z.ZodString;
|
|
106
|
+
durationMs: z.ZodNumber;
|
|
107
|
+
kind: z.ZodLiteral<"command-output">;
|
|
108
|
+
phase: z.ZodEnum<{
|
|
109
|
+
test: "test";
|
|
110
|
+
implement: "implement";
|
|
111
|
+
validate: "validate";
|
|
112
|
+
}>;
|
|
113
|
+
cmd: z.ZodString;
|
|
114
|
+
exitCode: z.ZodNumber;
|
|
115
|
+
}, z.core.$strip>;
|
|
116
|
+
/** Inferred TypeScript type from {@link commandOutputRecordSchema}. */
|
|
117
|
+
export type CommandOutputRecordInput = z.input<typeof commandOutputRecordSchema>;
|
|
118
|
+
/**
|
|
119
|
+
* Zod discriminated-union schema for {@link EvidenceRecord}.
|
|
120
|
+
*
|
|
121
|
+
* Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup.
|
|
122
|
+
* Parse with `evidenceRecordSchema.parse(input)` or
|
|
123
|
+
* `evidenceRecordSchema.safeParse(input)`.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* const rec = evidenceRecordSchema.parse({
|
|
128
|
+
* kind: 'test-output',
|
|
129
|
+
* phase: 'test',
|
|
130
|
+
* agentIdentity: 'T816-worker',
|
|
131
|
+
* attachmentSha256: 'a'.repeat(64),
|
|
132
|
+
* command: 'pnpm test',
|
|
133
|
+
* exitCode: 0,
|
|
134
|
+
* testsPassed: 10,
|
|
135
|
+
* testsFailed: 0,
|
|
136
|
+
* ranAt: '2026-04-16T00:00:00.000Z',
|
|
137
|
+
* durationMs: 1234,
|
|
138
|
+
* });
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
export declare const evidenceRecordSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
142
|
+
agentIdentity: z.ZodString;
|
|
143
|
+
attachmentSha256: z.ZodString;
|
|
144
|
+
ranAt: z.ZodString;
|
|
145
|
+
durationMs: z.ZodNumber;
|
|
146
|
+
kind: z.ZodLiteral<"impl-diff">;
|
|
147
|
+
phase: z.ZodLiteral<"implement">;
|
|
148
|
+
filesChanged: z.ZodArray<z.ZodString>;
|
|
149
|
+
linesAdded: z.ZodNumber;
|
|
150
|
+
linesRemoved: z.ZodNumber;
|
|
151
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
152
|
+
agentIdentity: z.ZodString;
|
|
153
|
+
attachmentSha256: z.ZodString;
|
|
154
|
+
ranAt: z.ZodString;
|
|
155
|
+
durationMs: z.ZodNumber;
|
|
156
|
+
kind: z.ZodLiteral<"validate-spec-check">;
|
|
157
|
+
phase: z.ZodLiteral<"validate">;
|
|
158
|
+
reqIdsChecked: z.ZodArray<z.ZodString>;
|
|
159
|
+
passed: z.ZodBoolean;
|
|
160
|
+
details: z.ZodString;
|
|
161
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
162
|
+
agentIdentity: z.ZodString;
|
|
163
|
+
attachmentSha256: z.ZodString;
|
|
164
|
+
ranAt: z.ZodString;
|
|
165
|
+
durationMs: z.ZodNumber;
|
|
166
|
+
kind: z.ZodLiteral<"test-output">;
|
|
167
|
+
phase: z.ZodLiteral<"test">;
|
|
168
|
+
command: z.ZodString;
|
|
169
|
+
exitCode: z.ZodNumber;
|
|
170
|
+
testsPassed: z.ZodNumber;
|
|
171
|
+
testsFailed: z.ZodNumber;
|
|
172
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
173
|
+
agentIdentity: z.ZodString;
|
|
174
|
+
attachmentSha256: z.ZodString;
|
|
175
|
+
ranAt: z.ZodString;
|
|
176
|
+
durationMs: z.ZodNumber;
|
|
177
|
+
kind: z.ZodLiteral<"lint-report">;
|
|
178
|
+
phase: z.ZodEnum<{
|
|
179
|
+
test: "test";
|
|
180
|
+
implement: "implement";
|
|
181
|
+
}>;
|
|
182
|
+
tool: z.ZodString;
|
|
183
|
+
passed: z.ZodBoolean;
|
|
184
|
+
warnings: z.ZodNumber;
|
|
185
|
+
errors: z.ZodNumber;
|
|
186
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
187
|
+
agentIdentity: z.ZodString;
|
|
188
|
+
attachmentSha256: z.ZodString;
|
|
189
|
+
ranAt: z.ZodString;
|
|
190
|
+
durationMs: z.ZodNumber;
|
|
191
|
+
kind: z.ZodLiteral<"command-output">;
|
|
192
|
+
phase: z.ZodEnum<{
|
|
193
|
+
test: "test";
|
|
194
|
+
implement: "implement";
|
|
195
|
+
validate: "validate";
|
|
196
|
+
}>;
|
|
197
|
+
cmd: z.ZodString;
|
|
198
|
+
exitCode: z.ZodNumber;
|
|
199
|
+
}, z.core.$strip>], "kind">;
|
|
200
|
+
/** Inferred TypeScript type from {@link evidenceRecordSchema}. */
|
|
201
|
+
export type EvidenceRecordInput = z.input<typeof evidenceRecordSchema>;
|
|
202
|
+
//# sourceMappingURL=evidence-record-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-record-schema.d.ts","sourceRoot":"","sources":["../src/evidence-record-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAM/B,CAAC;AAEH,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;iBAMxC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEzF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBAOjC,CAAC;AAEH,oEAAoE;AACpE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAOjC,CAAC;AAEH,oEAAoE;AACpE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;iBAKpC,CAAC;AAEH,uEAAuE;AACvE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAIjF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAM/B,CAAC;AAEH,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod validation schemas for {@link EvidenceRecord} and its variants.
|
|
3
|
+
*
|
|
4
|
+
* Kept in a separate file from the plain TypeScript types so that consumers
|
|
5
|
+
* that do not need runtime validation (e.g. type-only imports) pay zero cost.
|
|
6
|
+
*
|
|
7
|
+
* All schemas are named `*RecordSchema` and derive their inferred types from
|
|
8
|
+
* the canonical TypeScript interfaces in `./evidence-record.ts`.
|
|
9
|
+
*
|
|
10
|
+
* The top-level {@link evidenceRecordSchema} is a `z.discriminatedUnion` on
|
|
11
|
+
* `"kind"` so Zod can route to the correct variant in O(1).
|
|
12
|
+
*
|
|
13
|
+
* @epic T810
|
|
14
|
+
* @task T816
|
|
15
|
+
*/
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
// ─── Shared base fields ───────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Zod schema for the provenance fields shared by every EvidenceRecord variant.
|
|
20
|
+
*
|
|
21
|
+
* Not exported as a standalone validator; always composed into a full record
|
|
22
|
+
* schema via `.extend()`.
|
|
23
|
+
*/
|
|
24
|
+
const evidenceBaseSchema = z.object({
|
|
25
|
+
/** Identity string of the agent that produced this record. */
|
|
26
|
+
agentIdentity: z.string().min(1),
|
|
27
|
+
/** SHA-256 hex digest (64 chars) of the attached artifact. */
|
|
28
|
+
attachmentSha256: z.string().length(64),
|
|
29
|
+
/** ISO 8601 timestamp at which the action ran. */
|
|
30
|
+
ranAt: z.string().datetime(),
|
|
31
|
+
/** Wall-clock duration of the action in milliseconds. */
|
|
32
|
+
durationMs: z.number().nonnegative(),
|
|
33
|
+
});
|
|
34
|
+
// ─── Individual variant schemas ───────────────────────────────────────────────
|
|
35
|
+
/**
|
|
36
|
+
* Zod schema for {@link ImplDiffRecord}.
|
|
37
|
+
*
|
|
38
|
+
* Validates that `filesChanged` is a non-empty array and that `linesAdded` /
|
|
39
|
+
* `linesRemoved` are non-negative integers.
|
|
40
|
+
*/
|
|
41
|
+
export const implDiffRecordSchema = evidenceBaseSchema.extend({
|
|
42
|
+
kind: z.literal('impl-diff'),
|
|
43
|
+
phase: z.literal('implement'),
|
|
44
|
+
filesChanged: z.array(z.string().min(1)).min(1),
|
|
45
|
+
linesAdded: z.number().int().nonnegative(),
|
|
46
|
+
linesRemoved: z.number().int().nonnegative(),
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Zod schema for {@link ValidateSpecCheckRecord}.
|
|
50
|
+
*
|
|
51
|
+
* Validates that `reqIdsChecked` is non-empty and `details` is non-blank.
|
|
52
|
+
*/
|
|
53
|
+
export const validateSpecCheckRecordSchema = evidenceBaseSchema.extend({
|
|
54
|
+
kind: z.literal('validate-spec-check'),
|
|
55
|
+
phase: z.literal('validate'),
|
|
56
|
+
reqIdsChecked: z.array(z.string().min(1)).min(1),
|
|
57
|
+
passed: z.boolean(),
|
|
58
|
+
details: z.string().min(1),
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Zod schema for {@link TestOutputRecord}.
|
|
62
|
+
*
|
|
63
|
+
* Validates that `command` is non-blank and test counts are non-negative.
|
|
64
|
+
*/
|
|
65
|
+
export const testOutputRecordSchema = evidenceBaseSchema.extend({
|
|
66
|
+
kind: z.literal('test-output'),
|
|
67
|
+
phase: z.literal('test'),
|
|
68
|
+
command: z.string().min(1),
|
|
69
|
+
exitCode: z.number().int(),
|
|
70
|
+
testsPassed: z.number().int().nonnegative(),
|
|
71
|
+
testsFailed: z.number().int().nonnegative(),
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* Zod schema for {@link LintReportRecord}.
|
|
75
|
+
*
|
|
76
|
+
* `phase` is restricted to `'implement' | 'test'`.
|
|
77
|
+
* `warnings` and `errors` are non-negative integers.
|
|
78
|
+
*/
|
|
79
|
+
export const lintReportRecordSchema = evidenceBaseSchema.extend({
|
|
80
|
+
kind: z.literal('lint-report'),
|
|
81
|
+
phase: z.enum(['implement', 'test']),
|
|
82
|
+
tool: z.string().min(1),
|
|
83
|
+
passed: z.boolean(),
|
|
84
|
+
warnings: z.number().int().nonnegative(),
|
|
85
|
+
errors: z.number().int().nonnegative(),
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* Zod schema for {@link CommandOutputRecord}.
|
|
89
|
+
*
|
|
90
|
+
* `phase` can be `'implement'`, `'validate'`, or `'test'`.
|
|
91
|
+
* `cmd` must be non-blank.
|
|
92
|
+
*/
|
|
93
|
+
export const commandOutputRecordSchema = evidenceBaseSchema.extend({
|
|
94
|
+
kind: z.literal('command-output'),
|
|
95
|
+
phase: z.enum(['implement', 'validate', 'test']),
|
|
96
|
+
cmd: z.string().min(1),
|
|
97
|
+
exitCode: z.number().int(),
|
|
98
|
+
});
|
|
99
|
+
// ─── Discriminated union ──────────────────────────────────────────────────────
|
|
100
|
+
/**
|
|
101
|
+
* Zod discriminated-union schema for {@link EvidenceRecord}.
|
|
102
|
+
*
|
|
103
|
+
* Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup.
|
|
104
|
+
* Parse with `evidenceRecordSchema.parse(input)` or
|
|
105
|
+
* `evidenceRecordSchema.safeParse(input)`.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* const rec = evidenceRecordSchema.parse({
|
|
110
|
+
* kind: 'test-output',
|
|
111
|
+
* phase: 'test',
|
|
112
|
+
* agentIdentity: 'T816-worker',
|
|
113
|
+
* attachmentSha256: 'a'.repeat(64),
|
|
114
|
+
* command: 'pnpm test',
|
|
115
|
+
* exitCode: 0,
|
|
116
|
+
* testsPassed: 10,
|
|
117
|
+
* testsFailed: 0,
|
|
118
|
+
* ranAt: '2026-04-16T00:00:00.000Z',
|
|
119
|
+
* durationMs: 1234,
|
|
120
|
+
* });
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export const evidenceRecordSchema = z.discriminatedUnion('kind', [
|
|
124
|
+
implDiffRecordSchema,
|
|
125
|
+
validateSpecCheckRecordSchema,
|
|
126
|
+
testOutputRecordSchema,
|
|
127
|
+
lintReportRecordSchema,
|
|
128
|
+
commandOutputRecordSchema,
|
|
129
|
+
]);
|
|
130
|
+
//# sourceMappingURL=evidence-record-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-record-schema.js","sourceRoot":"","sources":["../src/evidence-record-schema.ts"],"names":[],"mappings":"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"}
|