import { z } from "zod"; // ── Existing branch/worktree Git API ───────────────────────────────── export const gitListBranchesInputSchema = z.object({ cwd: z.string().min(1), }); export const gitCreateWorktreeInputSchema = z.object({ cwd: z.string().min(1), branch: z.string().min(1), newBranch: z.string().min(1), path: z.string().min(1).optional(), }); export const gitRemoveWorktreeInputSchema = z.object({ cwd: z.string().min(1), path: z.string().min(1), }); export const gitCreateBranchInputSchema = z.object({ cwd: z.string().min(1), branch: z.string().min(1), }); export const gitCheckoutInputSchema = z.object({ cwd: z.string().min(1), branch: z.string().min(1), }); export const gitInitInputSchema = z.object({ cwd: z.string().min(1), }); export const gitBranchSchema = z.object({ name: z.string().min(1), current: z.boolean(), isDefault: z.boolean(), worktreePath: z.string().min(1).nullable(), }); export const gitWorktreeSchema = z.object({ path: z.string().min(1), branch: z.string().min(1), }); export type GitListBranchesInput = z.infer; export type GitBranch = z.infer; export type GitCreateWorktreeInput = z.infer; export type GitWorktree = z.infer; export type GitRemoveWorktreeInput = z.infer; export type GitCreateBranchInput = z.infer; export type GitCheckoutInput = z.infer; export type GitInitInput = z.infer; export interface GitListBranchesResult { branches: GitBranch[]; isRepo: boolean; } export interface GitCreateWorktreeResult { worktree: GitWorktree; } // ── Stacked action Git API ─────────────────────────────────────────── export const gitStatusInputSchema = z.object({ cwd: z.string().trim().min(1), }); export const gitStatusResultSchema = z.object({ branch: z.string().min(1).nullable(), hasWorkingTreeChanges: z.boolean(), hasUpstream: z.boolean(), aheadCount: z.number().int().nonnegative(), behindCount: z.number().int().nonnegative(), openPr: z .object({ number: z.number().int().positive(), title: z.string().min(1), url: z.string().url(), baseBranch: z.string().min(1), headBranch: z.string().min(1), }) .nullable(), }); export const gitStackedActionSchema = z.enum(["commit", "commit_push", "commit_push_pr"]); const gitCommitStepStatusSchema = z.enum(["created", "skipped_no_changes"]); const gitPushStepStatusSchema = z.enum(["pushed", "skipped_not_requested", "skipped_up_to_date"]); const gitPrStepStatusSchema = z.enum(["created", "opened_existing", "skipped_not_requested"]); export const gitRunStackedActionInputSchema = z.object({ cwd: z.string().trim().min(1), action: gitStackedActionSchema, commitMessage: z.string().trim().min(1).max(10_000).optional(), }); export const gitRunStackedActionResultSchema = z.object({ action: gitStackedActionSchema, commit: z.object({ status: gitCommitStepStatusSchema, commitSha: z.string().min(1).optional(), subject: z.string().min(1).optional(), }), push: z.object({ status: gitPushStepStatusSchema, branch: z.string().min(1).optional(), upstreamBranch: z.string().min(1).optional(), setUpstream: z.boolean().optional(), }), pr: z.object({ status: gitPrStepStatusSchema, url: z.string().url().optional(), number: z.number().int().positive().optional(), baseBranch: z.string().min(1).optional(), headBranch: z.string().min(1).optional(), title: z.string().min(1).optional(), }), }); export type GitStatusInput = z.input; export type GitStatusResult = z.infer; export type GitStackedAction = z.infer; export type GitRunStackedActionInput = z.input; export type GitRunStackedActionResult = z.infer;