@cleocode/contracts 2026.5.78 → 2026.5.81

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.
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Zod schema tests for the Release Plan envelope (T9527).
3
+ *
4
+ * Validates the canonical SPEC-T9345 §6.1 shape against the Zod schema defined
5
+ * in {@link ./plan.ts}. Coverage targets:
6
+ *
7
+ * - Happy-path parse round-trip
8
+ * - Each enum field rejects unknown literal values
9
+ * - Required fields cannot be missing
10
+ * - `evidenceAtoms` stays permissive (verb-level enforcement, NOT contract)
11
+ * - All 8 `status` FSM values parse
12
+ * - `meta` is forward-compat (unknown keys pass through via `.catchall`)
13
+ *
14
+ * @task T9527
15
+ */
16
+ import { describe, expect, it } from 'vitest';
17
+ import { GATE_NAME, GATE_STATUS, IMPACT, PLATFORM_TUPLE, PUBLISHER, parseReleasePlan, RELEASE_CHANNEL, RELEASE_KIND, RELEASE_PLAN_SCHEMA_URL, RELEASE_PLAN_SCHEMA_VERSION, RELEASE_SCHEME, RELEASE_STATUS, RESOLVED_SOURCE, ReleaseGateSchema, ReleasePlanChangelogSchema, ReleasePlanMetaSchema, ReleasePlanSchema, ReleasePlanTaskSchema, ReleasePlatformMatrixEntrySchema, ReleasePreflightSummarySchema, safeParseReleasePlan, TASK_KIND, } from './plan.js';
18
+ // ─── Fixtures ────────────────────────────────────────────────────────────────
19
+ /**
20
+ * Returns a fresh deep clone of a minimal-but-complete valid plan. Each test
21
+ * mutates its own copy to test field-level rejection paths.
22
+ */
23
+ function makeValidPlan() {
24
+ return {
25
+ $schema: RELEASE_PLAN_SCHEMA_URL,
26
+ version: 'v2026.6.0',
27
+ resolvedVersion: 'v2026.6.0',
28
+ suffixApplied: false,
29
+ scheme: 'calver',
30
+ channel: 'latest',
31
+ epicId: 'T9999',
32
+ releaseKind: 'regular',
33
+ createdAt: '2026-06-01T12:00:00Z',
34
+ createdBy: 'cleo-prime',
35
+ previousVersion: 'v2026.5.74',
36
+ previousTag: 'v2026.5.74',
37
+ previousShippedAt: '2026-05-15T08:00:00Z',
38
+ tasks: [
39
+ {
40
+ id: 'T10001',
41
+ kind: 'feat',
42
+ impact: 'minor',
43
+ userFacingSummary: 'Add release plan schema',
44
+ evidenceAtoms: ['commit:abc123', 'test-run:vitest.json', 'tool:lint'],
45
+ ivtrPhaseAtPlan: 'released',
46
+ epicAncestor: 'T9999',
47
+ },
48
+ ],
49
+ changelog: {
50
+ features: ['T10001'],
51
+ fixes: [],
52
+ chores: [],
53
+ breaking: [],
54
+ },
55
+ gates: [
56
+ {
57
+ name: 'test',
58
+ atom: 'tool:test',
59
+ status: 'passed',
60
+ lastVerifiedAt: '2026-06-01T11:50:00Z',
61
+ resolvedCommand: 'pnpm run test',
62
+ resolvedSource: 'project-context',
63
+ },
64
+ ],
65
+ platformMatrix: [
66
+ {
67
+ platform: 'linux-x64',
68
+ publisher: 'npm',
69
+ package: '@cleocode/cleo',
70
+ smoke: true,
71
+ },
72
+ ],
73
+ preflightSummary: {
74
+ esbuildExternalsDrift: false,
75
+ lockfileDrift: false,
76
+ epicCompletenessClean: true,
77
+ doubleListingClean: true,
78
+ preflightWarnings: [],
79
+ },
80
+ workflowRunUrl: null,
81
+ prUrl: null,
82
+ mergeCommitSha: null,
83
+ status: 'planned',
84
+ meta: {
85
+ firstEverRelease: false,
86
+ unresolvedTools: [],
87
+ archetype: 'monorepo-w-workspaces',
88
+ },
89
+ };
90
+ }
91
+ // ─── Constant tuples ─────────────────────────────────────────────────────────
92
+ describe('Release plan constant tuples', () => {
93
+ it('exports an 8-state status FSM', () => {
94
+ expect(RELEASE_STATUS).toEqual([
95
+ 'planned',
96
+ 'pr-opened',
97
+ 'pr-merged',
98
+ 'published',
99
+ 'reconciled',
100
+ 'rolled_back',
101
+ 'failed',
102
+ 'cancelled',
103
+ ]);
104
+ expect(RELEASE_STATUS).toHaveLength(8);
105
+ });
106
+ it('exports the 4-channel set (latest|beta|alpha|rc)', () => {
107
+ expect(new Set(RELEASE_CHANNEL)).toEqual(new Set(['latest', 'beta', 'alpha', 'rc']));
108
+ });
109
+ it('exports the 3-scheme set including calver-suffix', () => {
110
+ expect(RELEASE_SCHEME).toContain('calver');
111
+ expect(RELEASE_SCHEME).toContain('semver');
112
+ expect(RELEASE_SCHEME).toContain('calver-suffix');
113
+ });
114
+ it('exports release-kind variants', () => {
115
+ expect(new Set(RELEASE_KIND)).toEqual(new Set(['regular', 'hotfix', 'prerelease']));
116
+ });
117
+ it('exports the 4-status gate enum', () => {
118
+ expect(new Set(GATE_STATUS)).toEqual(new Set(['passed', 'failed', 'skipped', 'unresolved']));
119
+ });
120
+ it('exports canonical gate names (R-310)', () => {
121
+ expect(GATE_NAME).toContain('test');
122
+ expect(GATE_NAME).toContain('build');
123
+ expect(GATE_NAME).toContain('lint');
124
+ expect(GATE_NAME).toContain('typecheck');
125
+ expect(GATE_NAME).toContain('audit');
126
+ expect(GATE_NAME).toContain('security-scan');
127
+ });
128
+ it('exports platform tuples aligned with T1737', () => {
129
+ expect(PLATFORM_TUPLE).toContain('linux-x64');
130
+ expect(PLATFORM_TUPLE).toContain('linux-arm64');
131
+ expect(PLATFORM_TUPLE).toContain('macos-x64');
132
+ expect(PLATFORM_TUPLE).toContain('macos-arm64');
133
+ expect(PLATFORM_TUPLE).toContain('windows-x64');
134
+ expect(PLATFORM_TUPLE).toContain('any');
135
+ });
136
+ it('exports publisher backends covering npm/cargo/docker/pypi/github-release/binary', () => {
137
+ expect(new Set(PUBLISHER)).toEqual(new Set(['npm', 'cargo', 'docker', 'pypi', 'github-release', 'binary']));
138
+ });
139
+ it('exports task-kind classification', () => {
140
+ expect(TASK_KIND).toContain('feat');
141
+ expect(TASK_KIND).toContain('fix');
142
+ expect(TASK_KIND).toContain('hotfix');
143
+ expect(TASK_KIND).toContain('breaking');
144
+ });
145
+ it('exports SemVer impact tuple', () => {
146
+ expect(IMPACT).toEqual(['major', 'minor', 'patch']);
147
+ });
148
+ it('exports resolved-source attribution per ADR-061', () => {
149
+ expect(RESOLVED_SOURCE).toEqual(['project-context', 'language-default', 'legacy-alias']);
150
+ });
151
+ it('exposes a stable schema version + URL', () => {
152
+ expect(RELEASE_PLAN_SCHEMA_VERSION).toBe('1.0.0');
153
+ expect(RELEASE_PLAN_SCHEMA_URL).toBe('https://cleocode.io/schemas/release-plan/v1.json');
154
+ });
155
+ });
156
+ // ─── Happy path ──────────────────────────────────────────────────────────────
157
+ describe('ReleasePlanSchema — happy path', () => {
158
+ it('parses a complete valid plan', () => {
159
+ const plan = parseReleasePlan(makeValidPlan());
160
+ expect(plan.version).toBe('v2026.6.0');
161
+ expect(plan.status).toBe('planned');
162
+ expect(plan.tasks).toHaveLength(1);
163
+ expect(plan.tasks[0]?.id).toBe('T10001');
164
+ expect(plan.platformMatrix[0]?.publisher).toBe('npm');
165
+ });
166
+ it('safeParse returns success for a valid plan', () => {
167
+ const result = safeParseReleasePlan(makeValidPlan());
168
+ expect(result.success).toBe(true);
169
+ });
170
+ it('round-trips through JSON.stringify / parse', () => {
171
+ const original = makeValidPlan();
172
+ const serialized = JSON.stringify(original);
173
+ const reparsed = parseReleasePlan(JSON.parse(serialized));
174
+ expect(reparsed).toEqual(original);
175
+ });
176
+ it('accepts a first-ever release with null previousVersion + meta.firstEverRelease', () => {
177
+ const plan = makeValidPlan();
178
+ plan.previousVersion = null;
179
+ plan.previousTag = null;
180
+ plan.previousShippedAt = null;
181
+ plan.meta = { firstEverRelease: true };
182
+ expect(() => parseReleasePlan(plan)).not.toThrow();
183
+ });
184
+ });
185
+ // ─── Status FSM coverage ─────────────────────────────────────────────────────
186
+ describe('ReleasePlanSchema — status FSM', () => {
187
+ it.each(RELEASE_STATUS)('accepts status = "%s"', (status) => {
188
+ const plan = makeValidPlan();
189
+ plan.status = status;
190
+ expect(() => parseReleasePlan(plan)).not.toThrow();
191
+ });
192
+ it('rejects unknown status literals', () => {
193
+ const plan = { ...makeValidPlan(), status: 'in-flight' };
194
+ expect(() => parseReleasePlan(plan)).toThrow();
195
+ });
196
+ });
197
+ // ─── Enum rejection per field ────────────────────────────────────────────────
198
+ describe('ReleasePlanSchema — enum rejection', () => {
199
+ it('rejects unknown channel', () => {
200
+ const plan = { ...makeValidPlan(), channel: 'canary' };
201
+ expect(() => parseReleasePlan(plan)).toThrow();
202
+ });
203
+ it('rejects unknown scheme', () => {
204
+ const plan = { ...makeValidPlan(), scheme: 'rolling' };
205
+ expect(() => parseReleasePlan(plan)).toThrow();
206
+ });
207
+ it('rejects unknown releaseKind', () => {
208
+ const plan = { ...makeValidPlan(), releaseKind: 'patch' };
209
+ expect(() => parseReleasePlan(plan)).toThrow();
210
+ });
211
+ it('rejects unknown task kind', () => {
212
+ const plan = makeValidPlan();
213
+ plan.tasks[0] = { ...plan.tasks[0], kind: 'misc' };
214
+ expect(() => parseReleasePlan(plan)).toThrow();
215
+ });
216
+ it('rejects unknown impact', () => {
217
+ const plan = makeValidPlan();
218
+ plan.tasks[0] = { ...plan.tasks[0], impact: 'huge' };
219
+ expect(() => parseReleasePlan(plan)).toThrow();
220
+ });
221
+ it('rejects unknown gate name', () => {
222
+ const plan = makeValidPlan();
223
+ plan.gates[0] = { ...plan.gates[0], name: 'fmt' };
224
+ expect(() => parseReleasePlan(plan)).toThrow();
225
+ });
226
+ it('rejects unknown gate status', () => {
227
+ const plan = makeValidPlan();
228
+ plan.gates[0] = { ...plan.gates[0], status: 'flaky' };
229
+ expect(() => parseReleasePlan(plan)).toThrow();
230
+ });
231
+ it('rejects unknown platform tuple', () => {
232
+ const plan = makeValidPlan();
233
+ plan.platformMatrix[0] = { ...plan.platformMatrix[0], platform: 'haiku-x64' };
234
+ expect(() => parseReleasePlan(plan)).toThrow();
235
+ });
236
+ it('rejects unknown publisher', () => {
237
+ const plan = makeValidPlan();
238
+ plan.platformMatrix[0] = { ...plan.platformMatrix[0], publisher: 'gemfury' };
239
+ expect(() => parseReleasePlan(plan)).toThrow();
240
+ });
241
+ it('rejects unknown resolvedSource', () => {
242
+ const plan = makeValidPlan();
243
+ plan.gates[0] = { ...plan.gates[0], resolvedSource: 'env-override' };
244
+ expect(() => parseReleasePlan(plan)).toThrow();
245
+ });
246
+ });
247
+ // ─── Required-field rejection ────────────────────────────────────────────────
248
+ describe('ReleasePlanSchema — required fields', () => {
249
+ it('rejects missing version', () => {
250
+ const plan = makeValidPlan();
251
+ delete plan.version;
252
+ expect(() => parseReleasePlan(plan)).toThrow();
253
+ });
254
+ it('rejects missing epicId', () => {
255
+ const plan = makeValidPlan();
256
+ delete plan.epicId;
257
+ expect(() => parseReleasePlan(plan)).toThrow();
258
+ });
259
+ it('rejects empty epicId string', () => {
260
+ const plan = { ...makeValidPlan(), epicId: '' };
261
+ expect(() => parseReleasePlan(plan)).toThrow();
262
+ });
263
+ it('rejects missing tasks array', () => {
264
+ const plan = makeValidPlan();
265
+ delete plan.tasks;
266
+ expect(() => parseReleasePlan(plan)).toThrow();
267
+ });
268
+ it('rejects missing changelog object', () => {
269
+ const plan = makeValidPlan();
270
+ delete plan.changelog;
271
+ expect(() => parseReleasePlan(plan)).toThrow();
272
+ });
273
+ it('rejects missing preflightSummary', () => {
274
+ const plan = makeValidPlan();
275
+ delete plan.preflightSummary;
276
+ expect(() => parseReleasePlan(plan)).toThrow();
277
+ });
278
+ it('rejects missing epicAncestor on a task row', () => {
279
+ const plan = makeValidPlan();
280
+ const taskWithoutAncestor = { ...plan.tasks[0] };
281
+ delete taskWithoutAncestor.epicAncestor;
282
+ plan.tasks[0] = taskWithoutAncestor;
283
+ expect(() => parseReleasePlan(plan)).toThrow();
284
+ });
285
+ it('rejects malformed createdAt timestamp', () => {
286
+ const plan = { ...makeValidPlan(), createdAt: 'yesterday' };
287
+ expect(() => parseReleasePlan(plan)).toThrow();
288
+ });
289
+ });
290
+ // ─── Evidence atoms (contract permissive — R-301 verb-enforced) ─────────────
291
+ describe('ReleasePlanTaskSchema — evidenceAtoms', () => {
292
+ it('accepts a string[] for evidenceAtoms', () => {
293
+ const result = ReleasePlanTaskSchema.parse({
294
+ id: 'T1',
295
+ kind: 'feat',
296
+ impact: 'patch',
297
+ userFacingSummary: '',
298
+ evidenceAtoms: ['commit:abc'],
299
+ epicAncestor: 'E1',
300
+ });
301
+ expect(result.evidenceAtoms).toEqual(['commit:abc']);
302
+ });
303
+ it('permits an empty evidenceAtoms array at the contract layer (R-301 is verb-enforced)', () => {
304
+ const result = ReleasePlanTaskSchema.safeParse({
305
+ id: 'T1',
306
+ kind: 'feat',
307
+ impact: 'patch',
308
+ userFacingSummary: '',
309
+ evidenceAtoms: [],
310
+ epicAncestor: 'E1',
311
+ });
312
+ expect(result.success).toBe(true);
313
+ });
314
+ it('rejects non-array evidenceAtoms', () => {
315
+ const result = ReleasePlanTaskSchema.safeParse({
316
+ id: 'T1',
317
+ kind: 'feat',
318
+ impact: 'patch',
319
+ userFacingSummary: '',
320
+ evidenceAtoms: 'commit:abc',
321
+ epicAncestor: 'E1',
322
+ });
323
+ expect(result.success).toBe(false);
324
+ });
325
+ it('rejects empty-string atom entries (NonEmptyString)', () => {
326
+ const result = ReleasePlanTaskSchema.safeParse({
327
+ id: 'T1',
328
+ kind: 'feat',
329
+ impact: 'patch',
330
+ userFacingSummary: '',
331
+ evidenceAtoms: [''],
332
+ epicAncestor: 'E1',
333
+ });
334
+ expect(result.success).toBe(false);
335
+ });
336
+ });
337
+ // ─── meta forward-compat ─────────────────────────────────────────────────────
338
+ describe('ReleasePlanMetaSchema — forward compatibility', () => {
339
+ it('preserves unknown keys via catchall', () => {
340
+ const result = ReleasePlanMetaSchema.parse({
341
+ firstEverRelease: false,
342
+ futureField: 'someValue',
343
+ anotherUnknown: { nested: true },
344
+ });
345
+ expect(result.futureField).toBe('someValue');
346
+ expect(result.anotherUnknown).toEqual({ nested: true });
347
+ });
348
+ it('still validates known fields strictly', () => {
349
+ const result = ReleasePlanMetaSchema.safeParse({
350
+ firstEverRelease: 'yes',
351
+ });
352
+ expect(result.success).toBe(false);
353
+ });
354
+ it('accepts a fully-empty meta object', () => {
355
+ expect(() => ReleasePlanMetaSchema.parse({})).not.toThrow();
356
+ });
357
+ });
358
+ // ─── Nested-schema sanity ────────────────────────────────────────────────────
359
+ describe('Nested schemas — sanity', () => {
360
+ it('ReleaseGateSchema requires lastVerifiedAt to be ISO-8601', () => {
361
+ const result = ReleaseGateSchema.safeParse({
362
+ name: 'test',
363
+ atom: 'tool:test',
364
+ status: 'passed',
365
+ lastVerifiedAt: 'Tuesday',
366
+ });
367
+ expect(result.success).toBe(false);
368
+ });
369
+ it('ReleasePlatformMatrixEntrySchema applies smoke=true default when omitted', () => {
370
+ const result = ReleasePlatformMatrixEntrySchema.parse({
371
+ platform: 'any',
372
+ publisher: 'npm',
373
+ package: '@cleocode/lafs',
374
+ });
375
+ expect(result.smoke).toBe(true);
376
+ });
377
+ it('ReleasePreflightSummarySchema requires the four boolean preflight gates', () => {
378
+ const result = ReleasePreflightSummarySchema.safeParse({
379
+ esbuildExternalsDrift: false,
380
+ lockfileDrift: false,
381
+ epicCompletenessClean: true,
382
+ // doubleListingClean omitted
383
+ });
384
+ expect(result.success).toBe(false);
385
+ });
386
+ it('ReleasePlanChangelogSchema applies empty-array defaults for omitted buckets', () => {
387
+ const result = ReleasePlanChangelogSchema.parse({});
388
+ expect(result.features).toEqual([]);
389
+ expect(result.fixes).toEqual([]);
390
+ expect(result.chores).toEqual([]);
391
+ expect(result.breaking).toEqual([]);
392
+ });
393
+ it('ReleasePlanSchema accepts plans with no tasks (e.g. config-only releases)', () => {
394
+ const plan = makeValidPlan();
395
+ plan.tasks = [];
396
+ plan.changelog.features = [];
397
+ expect(() => parseReleasePlan(plan)).not.toThrow();
398
+ });
399
+ it('safeParseReleasePlan surfaces issues for bad enums', () => {
400
+ const result = safeParseReleasePlan({ ...makeValidPlan(), channel: 'invalid-channel' });
401
+ expect(result.success).toBe(false);
402
+ if (!result.success) {
403
+ expect(result.error.issues.length).toBeGreaterThan(0);
404
+ }
405
+ });
406
+ });
407
+ // ─── Schema export sanity ────────────────────────────────────────────────────
408
+ describe('ReleasePlanSchema — module surface', () => {
409
+ it('exports a Zod object schema at the top level', () => {
410
+ expect(typeof ReleasePlanSchema.parse).toBe('function');
411
+ expect(typeof ReleasePlanSchema.safeParse).toBe('function');
412
+ });
413
+ });
414
+ //# sourceMappingURL=plan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.test.js","sourceRoot":"","sources":["../../src/release/plan.test.ts"],"names":[],"mappings":"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"}
@@ -51,8 +51,8 @@ import { z } from 'zod';
51
51
  export declare const ArchiveReason: z.ZodEnum<{
52
52
  cancelled: "cancelled";
53
53
  superseded: "superseded";
54
- verified: "verified";
55
54
  reconciled: "reconciled";
55
+ verified: "verified";
56
56
  shadowed: "shadowed";
57
57
  "completed-unverified": "completed-unverified";
58
58
  }>;
@@ -67,8 +67,8 @@ export declare const ArchiveReason: z.ZodEnum<{
67
67
  export declare const ArchiveReasonSchema: z.ZodEnum<{
68
68
  cancelled: "cancelled";
69
69
  superseded: "superseded";
70
- verified: "verified";
71
70
  reconciled: "reconciled";
71
+ verified: "verified";
72
72
  shadowed: "shadowed";
73
73
  "completed-unverified": "completed-unverified";
74
74
  }>;
@@ -93,7 +93,7 @@ export type ArchiveReasonValue = z.infer<typeof ArchiveReason>;
93
93
  * Useful when a Drizzle column or a discriminated union needs the raw
94
94
  * tuple form (e.g. `text('archive_reason', { enum: ARCHIVE_REASON_VALUES })`).
95
95
  */
96
- export declare const ARCHIVE_REASON_VALUES: ("cancelled" | "superseded" | "verified" | "reconciled" | "shadowed" | "completed-unverified")[];
96
+ export declare const ARCHIVE_REASON_VALUES: ("cancelled" | "superseded" | "reconciled" | "verified" | "shadowed" | "completed-unverified")[];
97
97
  /**
98
98
  * The single tombstone value within {@link ArchiveReason}.
99
99
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/contracts",
3
- "version": "2026.5.78",
3
+ "version": "2026.5.81",
4
4
  "description": "Domain types, interfaces, and contracts for the CLEO ecosystem",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -98,7 +98,7 @@
98
98
  "dependencies": {
99
99
  "zod": "^4.3.6",
100
100
  "zod-to-json-schema": "^3.25.2",
101
- "@cleocode/lafs": "2026.5.78"
101
+ "@cleocode/lafs": "2026.5.81"
102
102
  },
103
103
  "scripts": {
104
104
  "build": "tsc -b --force && node scripts/emit-schemas.mjs",
package/src/exit-codes.ts CHANGED
@@ -226,6 +226,60 @@ export enum ExitCode {
226
226
  LEAD_BYPASS_DETECTED = 107,
227
227
  }
228
228
 
229
+ // ---------------------------------------------------------------------------
230
+ // Release pipeline v2 error code names (SPEC-T9345 §4.7)
231
+ //
232
+ // String-valued error codes emitted by the new release verbs (plan, open,
233
+ // reconcile, rollback). These are the `code` field of EngineErrorPayload;
234
+ // the numeric exit code is the bucket the verb resolves to (per SPEC §4.7).
235
+ //
236
+ // @task T9525
237
+ // @epic T9492
238
+ // @spec .cleo/rcasd/T9345/research/SPEC-T9345-release-pipeline-v2.md §4.7
239
+ // ---------------------------------------------------------------------------
240
+
241
+ /** Dirty version files block `cleo release plan` (R-020). Exit code 13. */
242
+ export const E_DIRTY_TREE = 'E_DIRTY_TREE' as const;
243
+ /** Epic referenced by `--epic` has zero children (R-021). Exit code 4. */
244
+ export const E_EPIC_EMPTY = 'E_EPIC_EMPTY' as const;
245
+ /** Epic referenced by `--epic` does not exist (R-021). Exit code 10. */
246
+ export const E_EPIC_NOT_FOUND = 'E_EPIC_NOT_FOUND' as const;
247
+ /** Channel + version scheme are incompatible (R-022). Exit code 6. */
248
+ export const E_CHANNEL_MISMATCH = 'E_CHANNEL_MISMATCH' as const;
249
+ /**
250
+ * One or more tasks in the plan are missing required ADR-051 evidence atoms
251
+ * (R-301 / R-310). Exit code 83. `error.details.tasks[]` lists offenders.
252
+ */
253
+ export const E_EVIDENCE_INSUFFICIENT = 'E_EVIDENCE_INSUFFICIENT' as const;
254
+ /** Plan file at `.cleo/release/<version>.plan.json` is absent. Exit code 4. */
255
+ export const E_PLAN_NOT_FOUND = 'E_PLAN_NOT_FOUND' as const;
256
+ /** Generic release-plan validation failure (e.g. schema). Exit code 6. */
257
+ export const E_RELEASE_PLAN_INVALID = 'E_RELEASE_PLAN_INVALID' as const;
258
+ /**
259
+ * Release row exists but is not in the status FSM state required by the
260
+ * caller (R-051 — `cleo release open` requires status='planned'). Exit code 6.
261
+ * `error.details.currentStatus` MUST report the actual status; `error.details.expectedStatus`
262
+ * SHOULD list the accepted state(s).
263
+ *
264
+ * @task T9530
265
+ */
266
+ export const E_INVALID_STATE = 'E_INVALID_STATE' as const;
267
+ /**
268
+ * `gh auth status` exited non-zero (R-052). The GitHub CLI is either not
269
+ * installed or not authenticated for the active hostname. Exit code 5.
270
+ *
271
+ * @task T9530
272
+ */
273
+ export const E_GH_NOT_AUTHENTICATED = 'E_GH_NOT_AUTHENTICATED' as const;
274
+ /**
275
+ * The expected GitHub Actions workflow file is missing under `.github/workflows/`
276
+ * (R-053). Without it, `gh workflow run` would fail with a non-recoverable error.
277
+ * Exit code 4.
278
+ *
279
+ * @task T9530
280
+ */
281
+ export const E_WORKFLOW_NOT_FOUND = 'E_WORKFLOW_NOT_FOUND' as const;
282
+
229
283
  /** Check if an exit code represents an error (1-99). */
230
284
  export function isErrorCode(code: ExitCode): boolean {
231
285
  return code >= 1 && code < 100;
package/src/index.ts CHANGED
@@ -332,6 +332,18 @@ export {
332
332
  } from './evidence-record-schema.js';
333
333
  // === Exit Codes ===
334
334
  export {
335
+ // SPEC-T9345 release pipeline v2 error code names (T9525)
336
+ E_CHANNEL_MISMATCH,
337
+ E_DIRTY_TREE,
338
+ E_EPIC_EMPTY,
339
+ E_EPIC_NOT_FOUND,
340
+ E_EVIDENCE_INSUFFICIENT,
341
+ // SPEC-T9345 release pipeline v2 error code names (T9530)
342
+ E_GH_NOT_AUTHENTICATED,
343
+ E_INVALID_STATE,
344
+ E_PLAN_NOT_FOUND,
345
+ E_RELEASE_PLAN_INVALID,
346
+ E_WORKFLOW_NOT_FOUND,
335
347
  ExitCode,
336
348
  getExitCodeName,
337
349
  isErrorCode,
@@ -1144,13 +1156,24 @@ export type {
1144
1156
  CreateWorktreeResult,
1145
1157
  DestroyWorktreeOptions,
1146
1158
  DestroyWorktreeResult,
1159
+ ForceUnlockWorktreeOpts,
1160
+ ForceUnlockWorktreeResult,
1147
1161
  ListWorktreesOptions,
1162
+ ListWorktreesOpts,
1163
+ ListWorktreesResult,
1164
+ PrunedWorktreeOutcome,
1165
+ PruneOrphanedWorktreesOpts,
1166
+ PruneOrphanedWorktreesResult,
1148
1167
  PruneWorktreesOptions,
1149
1168
  PruneWorktreesResult,
1150
1169
  WorktreeHook,
1151
1170
  WorktreeHookResult,
1152
1171
  WorktreeIncludePattern,
1172
+ WorktreeInfo,
1173
+ WorktreeLifecycleAction,
1174
+ WorktreeLifecycleAuditEntry,
1153
1175
  WorktreeListEntry,
1176
+ WorktreeStatusCategory,
1154
1177
  } from './operations/worktree.js';
1155
1178
  // === Orchestration Roll-up Types (T9082, ADR-070) ===
1156
1179
  export type {
@@ -1235,6 +1258,62 @@ export type {
1235
1258
  ReleaseVersionScheme,
1236
1259
  VerifyResult,
1237
1260
  } from './release/pipeline.js';
1261
+ // === Release Plan Envelope (T9527 / SPEC-T9345 §6) ===
1262
+ export type {
1263
+ GateName as ReleaseGateName,
1264
+ GateStatus as ReleaseGateExecutionStatus,
1265
+ Impact as ReleasePlanImpact,
1266
+ PlatformTuple,
1267
+ Publisher,
1268
+ ReleaseChannel as ReleasePlanChannel,
1269
+ ReleaseGate,
1270
+ ReleaseKind,
1271
+ ReleasePlan,
1272
+ ReleasePlanChangelog,
1273
+ ReleasePlanMeta,
1274
+ ReleasePlanTask,
1275
+ ReleasePlatformMatrixEntry,
1276
+ ReleasePreflightSummary,
1277
+ ReleaseScheme,
1278
+ ReleaseStatus as ReleasePlanStatus,
1279
+ ResolvedSource,
1280
+ TaskKind as ReleaseTaskKind,
1281
+ } from './release/plan.js';
1282
+ export {
1283
+ GATE_NAME,
1284
+ GATE_STATUS,
1285
+ GateNameSchema,
1286
+ GateStatusSchema,
1287
+ IMPACT,
1288
+ ImpactSchema,
1289
+ PLATFORM_TUPLE,
1290
+ PlatformTupleSchema,
1291
+ PUBLISHER,
1292
+ PublisherSchema,
1293
+ parseReleasePlan,
1294
+ RELEASE_CHANNEL,
1295
+ RELEASE_KIND,
1296
+ RELEASE_PLAN_SCHEMA_URL,
1297
+ RELEASE_PLAN_SCHEMA_VERSION,
1298
+ RELEASE_SCHEME,
1299
+ RELEASE_STATUS,
1300
+ RESOLVED_SOURCE,
1301
+ ReleaseChannelSchema,
1302
+ ReleaseGateSchema,
1303
+ ReleaseKindSchema,
1304
+ ReleasePlanChangelogSchema,
1305
+ ReleasePlanMetaSchema,
1306
+ ReleasePlanSchema,
1307
+ ReleasePlanTaskSchema,
1308
+ ReleasePlatformMatrixEntrySchema,
1309
+ ReleasePreflightSummarySchema,
1310
+ ReleaseSchemeSchema,
1311
+ ReleaseStatusSchema,
1312
+ ResolvedSourceSchema,
1313
+ safeParseReleasePlan,
1314
+ TASK_KIND,
1315
+ TaskKindSchema,
1316
+ } from './release/plan.js';
1238
1317
  // === Release Version Bump ===
1239
1318
  export type {
1240
1319
  BumpResult,