225 lines · 5.6 KB · TypeScript
RawDownload
/** * GitCore - Effect service contract for low-level Git operations. * * Wraps core repository primitives used by higher-level orchestration * services and WebSocket routes. * * @module GitCore */import { ServiceMap } from "effect";import type { Effect, Scope } from "effect";import type {  GitCheckoutInput,  GitCreateBranchInput,  GitCreateWorktreeInput,  GitCreateWorktreeResult,  GitInitInput,  GitListBranchesInput,  GitListBranchesResult,  GitPullResult,  GitRemoveWorktreeInput,  GitStatusInput,  GitStatusResult,} from "@t3tools/contracts"; import type { GitCommandError } from "../Errors.ts"; export interface GitStatusDetails extends Omit<GitStatusResult, "pr"> {  upstreamRef: string | null;} export interface GitPreparedCommitContext {  stagedSummary: string;  stagedPatch: string;} export interface GitPushResult {  status: "pushed" | "skipped_up_to_date";  branch: string;  upstreamBranch?: string | undefined;  setUpstream?: boolean | undefined;} export interface GitRangeContext {  commitSummary: string;  diffSummary: string;  diffPatch: string;} export interface GitRenameBranchInput {  cwd: string;  oldBranch: string;  newBranch: string;} export interface GitRenameBranchResult {  branch: string;} export interface GitFetchPullRequestBranchInput {  cwd: string;  prNumber: number;  branch: string;} export interface GitEnsureRemoteInput {  cwd: string;  preferredName: string;  url: string;} export interface GitFetchRemoteBranchInput {  cwd: string;  remoteName: string;  remoteBranch: string;  localBranch: string;} export interface GitSetBranchUpstreamInput {  cwd: string;  branch: string;  remoteName: string;  remoteBranch: string;} /** * GitCoreShape - Service API for low-level Git repository interactions. */export interface GitCoreShape {  /**   * Read Git status for a repository.   */  readonly status: (input: GitStatusInput) => Effect.Effect<GitStatusResult, GitCommandError>;   /**   * Read detailed working tree / branch status for a repository.   */  readonly statusDetails: (cwd: string) => Effect.Effect<GitStatusDetails, GitCommandError>;   /**   * Build staged change context for commit generation.   */  readonly prepareCommitContext: (    cwd: string,    filePaths?: readonly string[],  ) => Effect.Effect<GitPreparedCommitContext | null, GitCommandError>;   /**   * Create a commit with provided subject/body.   */  readonly commit: (    cwd: string,    subject: string,    body: string,  ) => Effect.Effect<{ commitSha: string }, GitCommandError>;   /**   * Push current branch, setting upstream if needed.   */  readonly pushCurrentBranch: (    cwd: string,    fallbackBranch: string | null,  ) => Effect.Effect<GitPushResult, GitCommandError>;   /**   * Collect commit/diff context between base branch and current HEAD.   */  readonly readRangeContext: (    cwd: string,    baseBranch: string,  ) => Effect.Effect<GitRangeContext, GitCommandError>;   /**   * Read a Git config value from the local repository.   */  readonly readConfigValue: (    cwd: string,    key: string,  ) => Effect.Effect<string | null, GitCommandError>;   /**   * List local + remote branches and branch metadata.   */  readonly listBranches: (    input: GitListBranchesInput,  ) => Effect.Effect<GitListBranchesResult, GitCommandError>;   /**   * Pull current branch from upstream using fast-forward only.   */  readonly pullCurrentBranch: (cwd: string) => Effect.Effect<GitPullResult, GitCommandError>;   /**   * Create a worktree and branch from a base branch.   */  readonly createWorktree: (    input: GitCreateWorktreeInput,  ) => Effect.Effect<GitCreateWorktreeResult, GitCommandError>;   /**   * Materialize a GitHub pull request head as a local branch without switching checkout.   */  readonly fetchPullRequestBranch: (    input: GitFetchPullRequestBranchInput,  ) => Effect.Effect<void, GitCommandError>;   /**   * Ensure a named remote exists for the provided URL, returning the reused or created remote name.   */  readonly ensureRemote: (input: GitEnsureRemoteInput) => Effect.Effect<string, GitCommandError>;   /**   * Fetch a remote branch into a local branch without checkout.   */  readonly fetchRemoteBranch: (    input: GitFetchRemoteBranchInput,  ) => Effect.Effect<void, GitCommandError>;   /**   * Set the upstream tracking branch for a local branch.   */  readonly setBranchUpstream: (    input: GitSetBranchUpstreamInput,  ) => Effect.Effect<void, GitCommandError>;   /**   * Remove an existing worktree.   */  readonly removeWorktree: (input: GitRemoveWorktreeInput) => Effect.Effect<void, GitCommandError>;   /**   * Rename an existing local branch.   */  readonly renameBranch: (    input: GitRenameBranchInput,  ) => Effect.Effect<GitRenameBranchResult, GitCommandError>;   /**   * Create a local branch.   */  readonly createBranch: (input: GitCreateBranchInput) => Effect.Effect<void, GitCommandError>;   /**   * Checkout an existing branch and refresh its upstream metadata in background.   */  readonly checkoutBranch: (    input: GitCheckoutInput,  ) => Effect.Effect<void, GitCommandError, Scope.Scope>;   /**   * Initialize a repository in the provided directory.   */  readonly initRepo: (input: GitInitInput) => Effect.Effect<void, GitCommandError>;   /**   * List local branch names (short format).   */  readonly listLocalBranchNames: (cwd: string) => Effect.Effect<string[], GitCommandError>;} /** * GitCore - Service tag for low-level Git repository operations. */export class GitCore extends ServiceMap.Service<GitCore, GitCoreShape>()(  "t3/git/Services/GitCore",) {}