Submatter/packages/shared/src/convoy-lifecycle/schemas.ts

95 lines
2.5 KiB
TypeScript
Raw Normal View History

import { z } from "zod";
import { convoyModelPolicySchema } from "../model-routing/schemas";
export const convoyStatusSchema = z.enum([
"draft",
"convoy_review",
"ready",
"in_progress",
"pr_review",
"doc_review",
"merged",
"published",
"released",
"blocked",
"cancelled",
]);
export type ConvoyStatus = z.infer<typeof convoyStatusSchema>;
export const convoyClassificationSchema = z.enum([
"feature",
"hotfix",
"docs-only",
"infra-only",
"server-only",
"config-only",
]);
export type ConvoyClassification = z.infer<typeof convoyClassificationSchema>;
export const convoyFileStatusSchema = z.enum([
"open",
"in-progress",
"merged",
"shipped",
"abandoned",
]);
export type ConvoyFileStatus = z.infer<typeof convoyFileStatusSchema>;
export const convoyActorSchema = z.string().min(1).max(64);
export const convoyEventTypeSchema = z.enum([
"role_complete",
"status_change",
"brief_created",
"reconcile",
]);
export type ConvoyEventType = z.infer<typeof convoyEventTypeSchema>;
export const convoyObjectContentSchema = z.object({
convoySlug: z.string().min(1).max(120),
classification: convoyClassificationSchema,
skipFlags: z.array(z.string()).default([]),
successMetric: z.string().min(1),
modelPolicy: convoyModelPolicySchema.optional(),
backlogItemId: z.string().uuid().optional(),
repoPath: z.string().min(1).optional(),
planSlug: z.string().min(1).optional(),
epicSlug: z.string().min(1).optional(),
briefFiles: z.array(z.string()).optional(),
prUrl: z.string().url().optional(),
prNumber: z.number().int().optional(),
});
export type ConvoyObjectContent = z.infer<typeof convoyObjectContentSchema>;
export const briefObjectContentSchema = z.object({
briefNumber: z.number().int().positive(),
files: z.array(z.string()).default([]),
sliceDependencies: z.array(z.number().int().positive()).default([]),
acceptance: z.string().optional(),
});
export type BriefObjectContent = z.infer<typeof briefObjectContentSchema>;
export const transitionConvoyInputSchema = z.object({
convoyId: z.string().uuid(),
toStatus: convoyStatusSchema,
actor: convoyActorSchema,
reason: z.string().min(1).max(2_000).optional(),
});
export type TransitionConvoyInput = z.infer<typeof transitionConvoyInputSchema>;
export const convoyTransitionErrorCodeSchema = z.enum([
"INVALID_TRANSITION",
"FORBIDDEN_ACTOR",
"REASON_REQUIRED",
]);
export type ConvoyTransitionErrorCode = z.infer<typeof convoyTransitionErrorCodeSchema>;