workspace

import "github.com/jbcom/radioactive-ralph/internal/workspace"

Package workspace manages the on-disk git workspace a variant runs in.

Four orthogonal knobs, resolved from variant profile + config.toml overrides with safety-floor precedence:

isolation     — shared | shallow | mirror-single | mirror-pool
object_store  — reference | full  (mirror-* only)
sync_source   — local | origin | both
lfs_mode      — full | on-demand | pointers-only | excluded

Dispatch:

  • shared → no mirror, no worktree; variant runs against the operator’s repo

  • shallow → git clone –depth=1 into StateRoot/<hash>/shallow

  • mirror-single → git clone –mirror into MirrorGit, one worktree

  • mirror-pool → mirror + up to MaxParallelWorktrees worktrees

Zero git work happens in the package outside of clone, fetch, repack, and worktree add/remove. Commits, PRs, merges, and history rewrites are operator-skill work that lives inside the worktree Claude session.

Index

func CopyHooks

func CopyHooks(repoPath, mirrorGit string) error

CopyHooks copies the operator’s .git/hooks/* into the mirror’s hooks/ directory. Preserves the executable bit so a repo’s pre-commit / pre-push still runs inside a worktree.

The mirror is a bare clone so its hooks live under MirrorGit/hooks, not MirrorGit/.git/hooks.

If the operator’s hooks dir is missing, this is a no-op.

func HasLFS

func HasLFS(repoPath string) (bool, error)

HasLFS reports whether repoPath has `.gitattributes` entries that reference git-lfs filters. Used by pre-flight to decide whether LFS knob choices matter at all.

type Manager

Manager coordinates the per-variant on-disk workspace.

type Manager struct {
    // RepoPath is the absolute path to the operator's repo.
    RepoPath string

    // Paths is the resolved XDG layout for this repo.
    Paths xdg.Paths

    // Variant is the active profile driving the workspace.
    Variant variant.Profile

    // Isolation, ObjectStore, SyncSource, LFS are the resolved values
    // (variant default, possibly overridden by config.toml, with safety
    // floors pinned at config.Resolve time).
    Isolation   variant.IsolationMode
    ObjectStore variant.ObjectStoreMode
    SyncSource  variant.SyncSource
    LFS         variant.LFSMode

    // CopyHooksEnabled controls whether operator's .git/hooks are copied
    // to mirror.git on Init. Default true.
    CopyHooksEnabled bool
    // contains filtered or unexported fields
}

func New

func New(repoPath string, p variant.Profile, isolation variant.IsolationMode, objectStore variant.ObjectStoreMode, syncSource variant.SyncSource, lfs variant.LFSMode) (*Manager, error)

New constructs a Manager for repoPath with the given profile and resolved knob values. The repoPath MUST be an existing git repo; callers verify this in pre-flight.

func (*Manager) AcquireWorktree

func (m *Manager) AcquireWorktree(ctx context.Context) (*Worktree, error)

AcquireWorktree creates a new worktree for an available slot and returns it. Returns errPoolFull if all slots are in use.

Branch is named `ralph/<variant>/<slot>-<gen>` where gen is a monotonic counter so recycled slots never collide with stale worktree admin data in git.

func (*Manager) Fetch

func (m *Manager) Fetch(ctx context.Context) error

Fetch refreshes the mirror from its configured remotes. Two-remote variants (sync_source=both) fetch from local first (fast, shared objects), then from origin to pick up anything merged remotely.

func (*Manager) Init

func (m *Manager) Init(ctx context.Context) error

Init performs first-run setup for this variant’s workspace. Safe to call multiple times — each step checks whether the target already exists and is correctly formed.

Idempotent actions:

  • IsolationShared: ensures RepoPath exists, returns.

  • IsolationShallow: ensures shallow clone exists; fetches if stale.

  • IsolationMirrorSingle / IsolationMirrorPool: ensures mirror.git exists, fetches from configured remotes, copies hooks, sets LFS config, repacks if corruption detected.

func (*Manager) Pool

func (m *Manager) Pool() []*Worktree

Pool returns the current list of live worktrees. Callers should not mutate the slice.

func (*Manager) Reconcile

func (m *Manager) Reconcile(ctx context.Context) error

Reconcile walks `git worktree list` and removes any registered worktrees whose disk paths have disappeared (likely from an ungraceful prior shutdown). Called at supervisor boot after replaying the event log.

func (*Manager) ReleaseWorktree

func (m *Manager) ReleaseWorktree(ctx context.Context, wt *Worktree) error

ReleaseWorktree removes a worktree and frees its slot. Safe to call on a crashed worktree — uses `worktree remove –force`.

type Worktree

Worktree describes a live git worktree created by the manager.

type Worktree struct {
    // Slot is the worktree index inside the pool (0..MaxParallelWorktrees-1).
    Slot int

    // Path is the absolute path on disk where the worktree is checked out.
    Path string

    // Branch is the ref HEAD points to inside the worktree.
    Branch string
}

Generated by gomarkdoc