Gitapp

← Back to module

JSDoc

Functions

mergeTheme

function
mergeTheme(base: Theme, override: PartialTheme): Theme

ThemeProvider

function
ThemeProvider({ theme, themeOverride, children }: Props): ReactNode

useTheme

function
useTheme(): Theme

Icon

function
Icon({ name, size, color, strokeWidth }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Spinner

function
Spinner({ size, thickness, tone, trackOpacity, }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Chip

function
Chip({ label, tone, mono, leading, trailing, }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Dot

function
Dot({ tone, size }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Banner

function
Banner({ kind, title, children, icon, trailing }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Button

function
Button({ label, onPress, variant, size, disabled, leading, trailing, block, accessibilityLabel, }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Card

function
Card({ children, elevation, padding, borderColor, style, accent, }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

Skeleton

function
Skeleton({ width, height, radius, style, }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ProgressBar

function
ProgressBar({ ratio, tone, height }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ConnectionPanel

function

ConnectionPanel renders the full connection flow: 1. Provider radio (GitHub / Gitea / GitLab) 2. Auth sub-form (OAuth button or PAT input, per provider) 3. Custom host input (Gitea / GitLab) 4. Full Resource<T> shell on the auth attempt

ConnectionPanel({ model }: ConnectionPanelProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

RepoPickerSheet

function

RepoPickerSheet is a bottom-sheet style modal. List surface is derived from a single pickListSurface() helper that takes repos + filteredRepos + picked and returns one discriminated ListSurface. The RepoRow sub-component is extracted so consumers can wrap it with observer() to get per-row MobX reactivity.

RepoPickerSheet({ model }: RepoPickerSheetProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

RepoRow

function
RepoRow({ repo, isPicking, onSelect, theme, }: { readonly repo: RepoInfo; readonly isPicking: boolean; readonly onSelect: () => void; readonly theme: Theme; }): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

CreateRepoForm

function

CreateRepoForm renders the "New repository" modal form. The form drives its submit button entirely through match(model.create).exhaustive() so all four Resource states have a distinct, visible affordance.

CreateRepoForm({ model }: CreateRepoFormProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

InitializationSequence

function
InitializationSequence({ model, repoLabel }: InitializationSequenceProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

InitStepRow

function
InitStepRow({ step, theme }: InitStepRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

SyncStatusBar

function

The SyncStatusBar derives its display surface from FOUR independent state inputs: - the sync Resource<T> (idle / loading / ready / error) - the connectivity union (online / offline / uncertain) - the categorised errorKind (when sync errored) - the expanded flag (whether the recovery panel is open) Offline overrides everything else — even a successful sync is misleading if the user has been disconnected since (their next mutation will queue). That's why the surface decision is a single `pickSurface()` function that takes all four inputs and returns one discriminated `Surface`.

SyncStatusBar({ model, nowISO }: SyncStatusBarProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ConflictShell

function
ConflictShell({ vm, getSides, renderPreview, viewport, drawerOpen: drawerOpenProp, }: ConflictShellProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

FileTreeRow

function
FileTreeRow({ file, isSelected, onSelect, onKeepMine, onKeepTheirs, theme, }: FileTreeRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

BranchGraph

function
BranchGraph({ size, mine, theirs, mergeBase, maxDots }: BranchGraphProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

DivergenceExplainer

function
DivergenceExplainer({ model }: DivergenceExplainerProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ConflictResolverSheet

function
ConflictResolverSheet({ model, renderPreview, viewport, drawerOpen, }: ConflictResolverSheetProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

TextPreview

function

textPreviewForSides — the default preview for §4.6 text/markdown files. Shows side-by-side monospaced text panes (mine left, theirs right), with the active side highlighted. One column on phone (side switcher controls which side is visible). RN v1 fallback: plain monospace <Text> blocks, no syntax highlighting. On web, the consuming app can replace this with

TextPreview({ file, side, mine, theirs }: ConflictPreviewProps): ReactNode

RepoStateRecoveryPanel

function
RepoStateRecoveryPanel({ model }: RepoStateRecoveryPanelProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

FindingItem

function
FindingItem({ finding, theme }: FindingItemProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ValidationFailureBanner

function
ValidationFailureBanner({ model }: ValidationFailureBannerProps): any

FailureRow

function
FailureRow({ failure, model }: FailureRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

RepoStatusRow

function
RepoStatusRow({ model }: RepoStatusRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ResourceButton

function
<T>({ state, label, onPress, variant, size, renderReady, }: IResourceButtonProps<T>): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

DiagnosticsSheet

function
DiagnosticsSheet({ model }: DiagnosticsSheetProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

DiagnosticsRow

function
DiagnosticsRow({ entry, isExpanded, onToggle, theme }: DiagnosticsRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

ProviderSelector

function
ProviderSelector({ model, }: ProviderSelectorProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.Element

SyncStatusBadge

function

SyncStatusBadge — pure presentational indicator of git sync state. The `compact` variant renders a small inline badge suitable for the app chrome (top status row, header). The `expanded` variant renders a multi- line info panel suitable for a sheet or settings screen. Always pass `onPress` — dead UI is banned by CLAUDE.md. If the action isn't implemented yet, use warnNotImplemented in the caller.

SyncStatusBadge({ state, onPress, variant, }: SyncStatusBadgeProps): JSX.Element

EditorialBadge

function

EditorialBadge — pure presentational chip for the editorial state of a record. Not interactive (no onPress). If you need a tappable chip that drills into the review sheet, wrap this in a Pressable in the consuming component.

EditorialBadge({ state, size, tokens, }: EditorialBadgeProps): JSX.Element

ForkRepoButton

function

ForkRepoButton — triggers a fork of `vm.source` to the user's account. Renders all four Resource states distinctly. The `ready` display auto-fades to idle after 2 s (without mutating the parent's Resource) so the user can fork again if needed.

ForkRepoButton({ vm }: ForkRepoButtonProps): JSX.Element

PullRequestComposer

function

PullRequestComposer — sheet/modal for opening a PR. Supports two modes: - "editorial-submit": submitting a record for review (with optional scheduled-publish datetime). - "fork-back": proposing changes back to an upstream repo. All four Resource states on `vm.state` are rendered distinctly. The `ready` state auto-closes (calls onCancel) after 1 s so the user sees the success before the sheet dismisses.

PullRequestComposer({ vm }: PullRequestComposerProps): JSX.Element

EditorialQueueScreen

function

EditorialQueueScreen — queue of content records by editorial state. Per-row observer pattern: EditorialQueueRowCard is extracted so MobX consumers can wrap individual rows with observer() without touching this file.

EditorialQueueScreen({ vm }: EditorialQueueScreenProps): JSX.Element

EditorialQueueRowCard

function
EditorialQueueRowCard({ row, onPress, }: EditorialQueueRowCardProps): JSX.Element

RecordReviewSheet

function

RecordReviewSheet — sheet for reviewing a single content record PR. Three footer actions: - Approve: merges/approves, each with its own Resource<void> state. - Request Changes: expands a comment input, then submits. - Close PR: closes without merging, with its own Resource<void> state. The renderPreview slot allows consuming apps to render domain-specific content (PPA: TaskCard, CMS: MarkdownArticle, etc.).

RecordReviewSheet({ vm, renderPreview, }: RecordReviewSheetProps): JSX.Element

PreviewPpaTask

function
PreviewPpaTask({ file, side, mine, theirs, mineTask, theirsTask, }: PreviewPpaTaskProps): ReactNode

PreviewCmsArticle

function
PreviewCmsArticle({ file, side, mine, theirs, mineArticle, theirsArticle, frontmatterDiff, }: PreviewCmsArticleProps): ReactNode

PreviewBookmark

function
PreviewBookmark({ file, side, mine, theirs, mineBookmark, theirsBookmark, }: PreviewBookmarkProps): ReactNode

PreviewPasswordEntry

function
PreviewPasswordEntry({ file, side, mine, theirs, mineEntry, theirsEntry, }: PreviewPasswordEntryProps): ReactNode

isWritable

function

Returns true when the mode permits writes.

isWritable(mode: RepoMode): boolean

describeMode

function

Human-readable description of the mode, exhaustive over all variants.

describeMode(mode: RepoMode): string

effectiveMode

function
effectiveMode(selection: Pick<RepoSelection, "owner" | "name">, mode: RepoMode, demo: DemoRepoRef): RepoMode

requireWrite

function
requireWrite(mode: RepoMode, attemptedAction: string): WriteAccess

normalizeHost

function
normalizeHost(provider: RepoProviderId, host: string): string

describeEditorialState

function

Human-readable description of a record's editorial state, exhaustive.

describeEditorialState(state: RecordEditorialState): string

readEditorialConfig

function

Reads and validates the repo editorial config from `.gitapp/editorial.json`. - Returns `{ kind: "off" }` when the file is absent. - Returns `{ kind: "off" }` and calls `warnDegraded` on parse failure (forward-compat: unknown future variants fall through gracefully).

readEditorialConfig(source: EditorialConfigSource): Promise<RepoEditorialMode>

Types

Resource

type
type Resource = Resource<T>

ResourceT

type
type ResourceT = Resource<T>

Err

type
type Err = { readonly message: string; readonly cause?: unknown }

StatusTone

type
type StatusTone = | "neutral"
  | "brand"
  | "success"
  | "warn"
  | "danger"
  | "info"
  | "mine"
  | "theirs"
  | "merged"

Connectivity

type
type Connectivity = | { kind: "online" }
  | { kind: "offline" }
  | { kind: "uncertain" }

ProviderId

type
type ProviderId = "github" | "gitea" | "gitlab"

IconName

type
type IconName = | "check" | "x" | "alert" | "alertTri" | "info"
  | "chevronRight" | "chevronDown" | "chevronLeft" | "chevronUp"
  | "arrowRight" | "arrowLeft"
  | "refresh" | "rotate" | "search" | "plus" | "more" | "menu"
  | "lock" | "unlock" | "key"
  | "cloud" | "cloudOff" | "git" | "branch"
  | "folder" | "file" | "fileText" | "image"
  | "user" | "users" | "eye" | "eyeOff"
  | "download" | "upload" | "bookmark" | "bolt" | "trash"
  | "settings" | "activity" | "shield" | "wrench"
  | "circle" | "dot"

ConnectionErrorKind

type

Categorised connection error so recovery copy can be specific.

type ConnectionErrorKind = | { kind: "auth"; reason: string }   // bad token / OAuth failure
  | { kind: "network" }                // unreachable
  | { kind: "not-found" }

RepoAccess

type

Access state for a single repo — checked against current auth token.

type RepoAccess = | { kind: "found" }
  | { kind: "forbidden"; currentLogin: string }
  | { kind: "missing" }
  | { kind: "checking" }

CreateErrorKind

type

Categorised create error — drives specific copy.

type CreateErrorKind = | { kind: "auth" }
  | { kind: "duplicate"; name: string }
  | { kind: "network" }
  | { kind: "unknown"; detail: string }

InitStepState

type
type InitStepState = | { kind: "pending" }
  | { kind: "running";  progress: InitStepProgress }
  | { kind: "ok";       durationMs: number }
  | { kind: "error";    message: string }
  | { kind: "blocked";  reason: string }

InitStepProgress

type
type InitStepProgress = | { kind: "indeterminate" }
  | { kind: "determinate"; ratio: number; label: string }

InitOverall

type
type InitOverall = | { kind: "running";  currentIndex: number }
  | { kind: "ok" }
  | { kind: "blocked";  failedIndex: number; error: string }

SyncErrorKind

type

Categorised error so the recovery affordance can route appropriately.

type SyncErrorKind = | { kind: "auth" }                     // 401 / 403 → reconnect
  | { kind: "network" }                  // network unreachable
  | { kind: "conflict" }                 // non-fast-forward → opens Divergence
  | { kind: "rejected" }                 // server-side hook rejected
  | { kind: "unknown"; detail: string }

ConflictSideId

type
type ConflictSideId = "mine" | "theirs" | "merged"

ConflictFileStatus

type
type ConflictFileStatus = | { kind: "modifiedBoth" }
  | { kind: "modifiedMine" }
  | { kind: "modifiedTheirs" }
  | { kind: "deletedMine" }
  | { kind: "deletedTheirs" }
  | { kind: "addedMine" }
  | { kind: "addedTheirs" }
  | { kind: "renamed"; fromPath: string; toPath: string }
  | { kind: "binary" }

ConflictFile

type
type ConflictFile = {
  readonly id: string;
  readonly path: string;
  readonly displayName: string;
  readonly status: ConflictFileStatus;
  readonly resolved: boolean;
}

ConflictSide

type
type ConflictSide = | { kind: "text";    title: string; content: string }
  | { kind: "binary";  title: string; mimeType: string; sizeBytes: number }
  | { kind: "deleted"; title: string }
  | { kind: "missing"; title: string; reason: string }

CommitSummary

type
type CommitSummary = {
  readonly id: string;
  readonly side: "mine" | "theirs";
  readonly shortHash: string;
  readonly title: string;
  readonly author: string;
  readonly whenISO: string;
}

DivergedCommit

type
type DivergedCommit = {
  readonly commitId: string;        // shown ONLY in "technical details" expand — never here
  readonly summary: string;         // plain-language label from summarizeCommit()
  readonly author: string;          // device name
  readonly whenISO: string;
}

DivergedFileChange

type
type DivergedFileChange = {
  readonly path: string;
  readonly mineEdited: boolean;
  readonly theirsEdited: boolean;
  readonly bothEditedSameContent: boolean;
}

ConflictDecision

type
type ConflictDecision = | { kind: "pending" }
  | { kind: "keepMine" }
  | { kind: "keepTheirs" }
  | { kind: "merged"; content: string }
  | { kind: "deferred" }

ResolvableFile

type

A resolvable file as the resolver sees it — richer than the shell's ConflictFile (includes raw content + commit metadata + decision). The resolver maps this to the shell's ConflictFile via shellVm.files.

type ResolvableFile = {
  readonly path: string;
  readonly mine: {
    readonly content: string;
    readonly commit: string;
    readonly author: string;
    readonly whenISO: string;
  };
  readonly theirs: {
    readonly content: string;
    readonly commit: string;
    readonly author: string;
    readonly whenISO: string;
  };
  readonly decision: ConflictDecision;
}

FindingPath

type
type FindingPath = | { kind: "none" }
  | { kind: "some"; value: string }

DiagnosisState

type
type DiagnosisState = | { kind: "loading" }
  | { kind: "ready"; findings: Finding[] }

LastGoodCommit

type
type LastGoodCommit = | { kind: "none" }
  | { kind: "some"; sha: string; whenISO: string }

RepoStatusState

type
type RepoStatusState = | { kind: "disconnected" }
  | { kind: "connectedNoRepo"; login: string }
  | { kind: "connected";       login: string; repo: { owner: string; name: string; branch: string } }
  | { kind: "connectedMismatch"; login: string; repo: { owner: string; name: string; branch: string } }
  | { kind: "checking";        login: string }

DiagnosticsOp

type
type DiagnosticsOp = "push" | "pull" | "commit" | "clone"

DiagnosticsResult

type
type DiagnosticsResult = | { kind: "ok";                detail: string }
  | { kind: "non-fast-forward";  detail: string }
  | { kind: "auth-error";        message: string }
  | { kind: "network";           message: string }
  | { kind: "rejected";          message: string }
  | { kind: "unknown";           message: string }

DiagnosticsResultKind

type
type DiagnosticsResultKind = | "ok"
  | "non-fast-forward"
  | "auth-error"
  | "network"
  | "rejected"
  | "unknown"

DiagnosticsFilter

type
type DiagnosticsFilter = "all" | "errors" | "last-hour"

SyncState

type
type SyncState = | { kind: "synced"; lastSyncedAt: number; sha: string }
  | { kind: "syncing"; phase: "push" | "pull" | "rebase"; sinceMs: number }
  | { kind: "ahead"; commits: number; sha: string }      // local has unpushed commits
  | { kind: "behind"; commits: number; sha: string }     // remote has unpulled commits
  | { kind: "diverged"; localCommits: number; remoteCommits: number }
  | { kind: "conflict"; files: ReadonlyArray<string> }
  | { kind: "offline"; lastSyncedAt: number }
  | { kind: "error"; error: { message: string }; tag: string }
  | { kind: "idle" }

SyncStatusBadgeVariant

type

Controls how much space the badge occupies.

type SyncStatusBadgeVariant = "compact" | "expanded"

PullRequestComposerMode

type
type PullRequestComposerMode = | { kind: "editorial-submit"; recordTitle: string }
  | { kind: "fork-back"; sourceUpstream: { owner: string; name: string } }

ScheduledPublish

type
type ScheduledPublish = | { kind: "none" }
  | { kind: "at"; iso: string }

FrontmatterDiffLine

type
type FrontmatterDiffLine = | { kind: "removed"; text: string }
  | { kind: "added";   text: string }
  | { kind: "context"; text: string }

RepoMode

type

RepoMode — discriminated union expressing the write-access level of a repo. - rw: user has full read-write access. - ro: user can only read. The `reason` field distinguishes the cause.

type RepoMode = | { kind: "rw" }
  | { kind: "ro"; reason: "no-access" | "demo" | "user-locked" }

RepoProviderId

type
type RepoProviderId = "github" | "gitea" | "gitlab"

RoReason

type
type RoReason = | { readonly kind: "demo" }
  | { readonly kind: "no-access" }
  | { readonly kind: "user-locked" }

WriteAccess

type
type WriteAccess = | { readonly kind: "granted" }
  | { readonly kind: "denied"; readonly reason: RoReason; readonly attemptedAction: string }

RecordEditorialState

type

RecordEditorialState — the editorial lifecycle of a single content record. All variants are exhaustive — no null/undefined in the union.

type RecordEditorialState = | { kind: "published"; sha: string }
  | { kind: "draft"; branch: string; lastEdit: number; author: string }
  | {
      kind: "in-review";
      branch: string;
      pr: PullRequestRef;
      reviewers: ReadonlyArray<string>;
    }
  | { kind: "approved"; pr: PullRequestRef; readyToMerge: true }
  | {
      kind: "changes-requested";
      pr: PullRequestRef;
      reviewer: string;
      comment: string;
    }

RepoEditorialMode

type

RepoEditorialMode — the editorial workflow configured for the repo. - off: no editorial workflow; records are pushed to main directly. - branch-per-record: each record gets its own branch and PR. - single-working-branch: all drafts share one named branch. - open-authoring: forks from a specified upstream repo.

type RepoEditorialMode = | { kind: "off" }
  | { kind: "branch-per-record" }
  | { kind: "single-working-branch"; branch: string }
  | { kind: "open-authoring"; upstream: { owner: string; name: string } }

Interfaces

Theme

interface
interface Theme
Members

name

property
name: string

colors

property
colors: ThemeColors

fonts

property
fonts: ThemeFonts

radii

property
radii: ThemeRadii

spacing

property
spacing: ThemeSpacing

shadows

property
shadows: ThemeShadows

typography

property
typography: ThemeTypography

ThemeColors

interface
interface ThemeColors
Members

bg

property
bg: string

surface

property
surface: string

surface2

property
surface2: string

surface3

property
surface3: string

border

property
border: string

border2

property
border2: string

text

property
text: string

text2

property
text2: string

text3

property
text3: string

text4

property
text4: string

brand

property
brand: string

brand2

property
brand2: string

brandFg

property
brandFg: string

brandBg

property
brandBg: string

success

property
success: string

successBg

property
successBg: string

successBorder

property
successBorder: string

warn

property
warn: string

warnBg

property
warnBg: string

warnBorder

property
warnBorder: string

danger

property
danger: string

dangerBg

property
dangerBg: string

dangerBorder

property
dangerBorder: string

info

property
info: string

infoBg

property
infoBg: string

infoBorder

property
infoBorder: string

mine

property
mine: string

mineBg

property
mineBg: string

mineBorder

property
mineBorder: string

theirs

property
theirs: string

theirsBg

property
theirsBg: string

theirsBorder

property
theirsBorder: string

merged

property
merged: string

mergedBg

property
mergedBg: string

mergedBorder

property
mergedBorder: string

ThemeFonts

interface
interface ThemeFonts
Members

ui

property
ui: string

mono

property
mono: string

ThemeRadii

interface
interface ThemeRadii
Members

sm

property
sm: number

md

property
md: number

lg

property
lg: number

ThemeSpacing

interface
interface ThemeSpacing
Members

xs

property
xs: number

sm

property
sm: number

md

property
md: number

lg

property
lg: number

xl

property
xl: number

ThemeShadow

interface
interface ThemeShadow
Members

color

property
color: string

opacity

property
opacity: number

offsetX

property
offsetX: number

offsetY

property
offsetY: number

radius

property
radius: number

elevation

property
elevation: number

ThemeShadows

interface
interface ThemeShadows
Members

s1

property
s1: ThemeShadow

s2

property
s2: ThemeShadow

modal

property
modal: ThemeShadow

ThemeTypography

interface
interface ThemeTypography
Members

t12

property
t12: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

t13

property
t13: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

t14

property
t14: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

t15

property
t15: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

t16

property
t16: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

t18

property
t18: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

t22

property
t22: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }

ConnectionPanelProps

interface
interface ConnectionPanelProps
Members

model

property
model: IConnectionModel

IConnectionModel

interface
interface IConnectionModel
Members

provider

property

Current selected provider.

provider: ProviderId

authMethod

property

OAuth or PAT — GitHub supports both; Gitea/GitLab require PAT.

authMethod: { kind: "oauth"; } | { kind: "pat"; token: string; }

host

property

Default = the provider's public cloud; custom = self-hosted URL.

host: { kind: "default"; } | { kind: "custom"; url: string; }

connection

property

Four-state Resource for the current authentication attempt.

connection: Resource<ConnectionSuccess>

errorKind

property

Categorised error when connection.kind === "error".

errorKind: { kind: "none"; } | { kind: "some"; value: ConnectionErrorKind; }

onProviderChange

method
onProviderChange(p: ProviderId): void

onAuthMethodChange

method
onAuthMethodChange(m: { kind: "oauth"; } | { kind: "pat"; token: string; }): void

onHostChange

method
onHostChange(h: { kind: "default"; } | { kind: "custom"; url: string; }): void

onConnect

method
onConnect(): Promise<void>

onDisconnect

method
onDisconnect(): Promise<void>

ConnectionSuccess

interface

Connection success payload.

interface ConnectionSuccess
Members

login

property
login: string

provider

property
provider: ProviderId

RepoPickerSheetProps

interface
interface RepoPickerSheetProps
Members

model

property
model: IRepoPickerModel

IRepoPickerModel

interface
interface IRepoPickerModel
Members

repos

property

Full repo list — all 4 Resource states.

repos: Resource<readonly RepoInfo[]>

filter

property

Current filter text (controlled).

filter: string

picked

property

Selection state — discriminated union, no nullable.

picked: { kind: "none"; } | { kind: "picking"; repo: RepoInfo; } | { kind: "picked"; repo: RepoInfo; }

currentLogin

property

Who we are authed as (shown in forbidden chip copy).

currentLogin: { kind: "anonymous"; } | { kind: "loggedIn"; login: string; }

filteredRepos

property

Filtered + sorted subset — computed by the model, not this component.

filteredRepos: readonly RepoInfo[]

canCreate

property

Whether the current auth token has repo-create scope.

canCreate: boolean

onFilterChange

method
onFilterChange(v: string): void

onSelect

method
onSelect(repo: RepoInfo): Promise<void>

onRefresh

method
onRefresh(): Promise<void>

onOpenCreate

method
onOpenCreate(): void

onDismiss

method
onDismiss(): void

RepoInfo

interface

Repo metadata returned from the provider's list-repos API.

interface RepoInfo
Members

owner

property
owner: string

name

property
name: string

isPrivate

property
isPrivate: boolean

defaultBranch

property
defaultBranch: string

pushedAt

property
pushedAt: string

access

property
access: RepoAccess

CreateRepoFormProps

interface
interface CreateRepoFormProps
Members

model

property
model: ICreateRepoModel

ICreateRepoModel

interface
interface ICreateRepoModel
Members

name

property

Controlled repo name (no spaces; dashes + alphanumeric only).

name: string

visibility

property

Visibility toggle — private is the default and recommended.

visibility: "private" | "public"

initWithReadme

property

Whether to create an initial README commit (required for push).

initWithReadme: boolean

create

property

Four-state Resource for the create attempt.

create: Resource<CreatedRepo>

nameValidation

property

Inline name validation — shown under the input.

nameValidation: { kind: "ok"; } | { kind: "invalid"; reason: string; }

createErrorKind

property

Categorised error when create.kind === "error".

createErrorKind: { kind: "none"; } | { kind: "some"; value: CreateErrorKind; }

onNameChange

method
onNameChange(v: string): void

onVisibilityChange

method
onVisibilityChange(v: "private" | "public"): void

onInitWithReadmeChange

method
onInitWithReadmeChange(v: boolean): void

onSubmit

method
onSubmit(): Promise<void>

onCancel

method
onCancel(): void

CreatedRepo

interface

Success payload — the created repo coordinates.

interface CreatedRepo
Members

owner

property
owner: string

name

property
name: string

InitializationSequenceProps

interface
interface InitializationSequenceProps
Members

model

property
model: IInitModel

repoLabel

property

Shown in the heading, e.g. "byoklab/ppa-data-andrew"

repoLabel: string

IInitModel

interface
interface IInitModel
Members

steps

property
steps: readonly InitStep[]

overall

property
overall: InitOverall

onRetry

method
onRetry(stepId: string): Promise<void>

onReset

method
onReset(): Promise<void>

onCancel

method
onCancel(): void

InitStep

interface
interface InitStep
Members

id

property
id: string

label

property
label: string

state

property
state: InitStepState

InitStepRowProps

interface
interface InitStepRowProps
Members

step

property
step: InitStep

theme

property
theme: Theme

SyncStatusBarProps

interface
interface SyncStatusBarProps
Members

model

property
model: ISyncStatusModel

nowISO

property

Called every minute or so by the parent so "3m ago" updates.

nowISO: string

ISyncStatusModel

interface
interface ISyncStatusModel
Members

sync

property

The four-state Resource for the latest sync attempt.

sync: Resource<SyncSummary>

connectivity

property

Network reachability — orthogonal to sync.

connectivity: Connectivity

errorKind

property

Categorised error when sync.kind === "error".

errorKind: { kind: "none"; } | { kind: "some"; value: SyncErrorKind; }

pendingCount

property

Pending writes count (used in offline label).

pendingCount: number

expanded

property

Whether the strip's expanded recovery panel is open.

expanded: boolean

onToggleExpanded

method
onToggleExpanded(): void

onRetry

method
onRetry(): Promise<void>

onOpenDivergence

method
onOpenDivergence(): void

onOpenDiagnostics

method
onOpenDiagnostics(): void

onReconnect

method
onReconnect(): void

SyncSummary

interface

Successful-state payload — what the strip shows in `ready`.

interface SyncSummary
Members

lastPushedISO

property
lastPushedISO: string

pendingCount

property
pendingCount: number

ConflictShellProps

interface
interface ConflictShellProps
Members

vm

property
vm: IConflictShellViewModel

getSides

property
getSides: (file: ConflictFile) => { mine: ConflictSide; theirs: ConflictSide; merged: ConflictSide; }

renderPreview

property

Render-prop slot — the consuming app provides domain-specific preview. Called with the currently-selected file + active side + all three sides.

renderPreview: (props: ConflictPreviewProps) => ReactNode

viewport

property

Viewport hint. Pass "phone" to force the mobile drawer layout, "desktop" for the persistent two-pane layout. Default: auto-detect from window width when undefined.

viewport: "phone" | "desktop"

drawerOpen

property

Force the mobile drawer open (useful for Storybook / showcase). Only meaningful when viewport="phone".

drawerOpen: boolean

IConflictShellViewModel

interface
interface IConflictShellViewModel
Members

files

property
files: readonly ConflictFile[]

commits

property
commits: readonly CommitSummary[]

selectedFile

property
selectedFile: { kind: "selected"; fileId: string; } | { kind: "none"; }

selectedSide

property
selectedSide: ConflictSideId

railMode

property

Mobile only: toggle between file list and commit list.

railMode: { kind: "files"; } | { kind: "commits"; }

resolvedCount

property
resolvedCount: number

pendingCount

property
pendingCount: number

canApply

property
canApply: boolean

selectFile

method
selectFile(fileId: string): void

selectSide

method
selectSide(side: ConflictSideId): void

setRailMode

method
setRailMode(mode: IConflictShellViewModel["railMode"]): void

keepMine

method

Whole-file shortcut — no preview needed, resolves inline.

keepMine(fileId: string): void

keepTheirs

method

Whole-file shortcut — no preview needed, resolves inline.

keepTheirs(fileId: string): void

skip

method

Mark deferred — skip this record for now.

skip(fileId: string): void

apply

method
apply(): Promise<void>

ConflictPreviewProps

interface
interface ConflictPreviewProps
Members

file

property
file: ConflictFile

side

property
side: ConflictSideId

mine

property
mine: ConflictSide

theirs

property
theirs: ConflictSide

merged

property
merged: ConflictSide

FileTreeRowProps

interface
interface FileTreeRowProps
Members

file

property
file: ConflictFile

isSelected

property
isSelected: boolean

onSelect

property
onSelect: () => void

onKeepMine

property
onKeepMine: () => void

onKeepTheirs

property
onKeepTheirs: () => void

theme

property
theme: Theme

BranchGraphProps

interface
interface BranchGraphProps
Members

size

property
size: "phone" | "desktop" | "inline"

mine

property
mine: readonly DivergedCommit[]

theirs

property
theirs: readonly DivergedCommit[]

mergeBase

property
mergeBase: { commitId: string; whenISO: string; }

maxDots

property

Override the per-size default maximum dots per lane.

maxDots: number

DivergenceExplainerProps

interface
interface DivergenceExplainerProps
Members

model

property
model: IDivergenceModel

IDivergenceModel

interface
interface IDivergenceModel
Members

mine

property
mine: readonly DivergedCommit[]

theirs

property
theirs: readonly DivergedCommit[]

mergeBase

property
mergeBase: { commitId: string; whenISO: string; }

fileChanges

property
fileChanges: readonly DivergedFileChange[]

strategy

property
strategy: { kind: "choosing"; } | { kind: "tryingAutomatic"; } | { kind: "automaticSucceeded"; } | { kind: "automaticFailed"; } | { kind: "confirmingDiscard"; side: "mine" | "theirs"; } | { kind: "discarding"; } | { kind: "discarded"; } | { kind: "applyError"; reason: string; }

canShowAutomatic

property
canShowAutomatic: boolean

onTryAutomatic

method
onTryAutomatic(): Promise<void>

onResolveManually

method
onResolveManually(): void

onDiscard

method
onDiscard(side: "mine" | "theirs"): void

onConfirmDiscard

method
onConfirmDiscard(typed: string): Promise<void>

onCancel

method
onCancel(): void

onShowTechnicalDetails

method
onShowTechnicalDetails(): void

ConflictResolverSheetProps

interface
interface ConflictResolverSheetProps
Members

model

property
model: IConflictResolverModel

renderPreview

property

Consuming-app override for the preview slot. If omitted, the default text-v1 side-by-side panes are used.

renderPreview: (props: ConflictPreviewProps) => ReactNode

viewport

property
viewport: "phone" | "desktop"

drawerOpen

property
drawerOpen: boolean

IConflictResolverModel

interface
interface IConflictResolverModel
Members

files

property
files: readonly ResolvableFile[]

tab

property
tab: "all" | "pending" | "resolved"

overall

property
overall: { kind: "browsing"; } | { kind: "resolvingFile"; path: string; } | { kind: "applying"; } | { kind: "applied"; } | { kind: "applyError"; reason: string; }

pendingCount

property
pendingCount: number

resolvedCount

property
resolvedCount: number

canApply

property
canApply: boolean

shellVm

property

The adapter the shell consumes.

shellVm: IConflictShellViewModel

renderPreview

method

Default renderPreview — text-v1 side-by-side panes.

renderPreview(props: ConflictPreviewProps): ReactNode

onTabChange

method
onTabChange(tab: "all" | "pending" | "resolved"): void

onOpenFile

method
onOpenFile(path: string): void

onCloseFile

method
onCloseFile(): void

onDecide

method
onDecide(path: string, decision: ConflictDecision): void

onKeepAllMine

method
onKeepAllMine(): void

onKeepAllTheirs

method
onKeepAllTheirs(): void

onApply

method
onApply(): Promise<void>

onDismiss

method
onDismiss(): void

RepoStateRecoveryPanelProps

interface
interface RepoStateRecoveryPanelProps
Members

model

property
model: IRecoveryModel

IRecoveryModel

interface
interface IRecoveryModel
Members

repoOwner

property
repoOwner: string

repoName

property
repoName: string

lastWorkingISO

property
lastWorkingISO: { kind: "none"; } | { kind: "some"; value: string; }

localChangesCount

property
localChangesCount: number

diagnosis

property
diagnosis: DiagnosisState

recovery

property
recovery: Resource<RecoveryOutcome>

onSoftRefresh

method
onSoftRefresh(): void

onPull

method
onPull(): Promise<void>

onReset

method
onReset(typedConfirmation: string): Promise<void>

onOpenDiagnostics

method
onOpenDiagnostics(): void

onSwitchRepo

method
onSwitchRepo(): void

Finding

interface
interface Finding
Members

severity

property
severity: "warn" | "error"

message

property
message: string

path

property
path: FindingPath

RecoveryOutcome

interface

Outcome returned by successful recovery operations.

interface RecoveryOutcome
Members

message

property
message: string

ValidationFailureBannerProps

interface
interface ValidationFailureBannerProps
Members

model

property
model: IValidationModel

IValidationModel

interface
interface IValidationModel
Members

failures

property
failures: Resource<ValidationFailure[]>

onShowDetails

method
onShowDetails(file: string): void

onOpenRawEditor

method
onOpenRawEditor(file: string): void

onReset

method
onReset(file: string): void

onDismiss

method
onDismiss(file: string): void

ValidationFailure

interface
interface ValidationFailure
Members

path

property
path: string

oneLineError

property
oneLineError: string

fullErrors

property
fullErrors: readonly string[]

lastGoodCommit

property
lastGoodCommit: LastGoodCommit

FailureRowProps

interface
interface FailureRowProps
Members

failure

property
failure: ValidationFailure

model

property
model: IValidationModel

RepoStatusRowProps

interface
interface RepoStatusRowProps
Members

model

property
model: IRepoStatusModel

IRepoStatusModel

interface
interface IRepoStatusModel
Members

state

property
state: RepoStatusState

onPress

method
onPress(): void

IResourceButtonProps

interface
interface IResourceButtonProps
Members

state

property
state: Resource<T>

label

property
label: string

onPress

property
onPress: (() => void) | (() => Promise<void>)

variant

property
variant: "danger" | "primary" | "secondary"

size

property
size: "sm" | "md" | "lg"

renderReady

property

Override the success content. Receives the unwrapped ready value.

renderReady: (value: T) => ReactNode

DiagnosticsSheetProps

interface
interface DiagnosticsSheetProps
Members

model

property
model: IDiagnosticsModel

IDiagnosticsModel

interface
interface IDiagnosticsModel
Members

entries

property
entries: Resource<DiagnosticsEntry[]>

filter

property
filter: DiagnosticsFilter

expanded

property
expanded: { kind: "none"; } | { kind: "some"; entryId: string; }

onFilterChange

method
onFilterChange(filter: DiagnosticsFilter): void

onToggleExpanded

method
onToggleExpanded(id: string): void

onClear

method
onClear(): void

onExport

method
onExport(): void

DiagnosticsEntry

interface
interface DiagnosticsEntry
Members

id

property
id: string

whenISO

property
whenISO: string

op

property
op: DiagnosticsOp

result

property
result: DiagnosticsResult

durationMs

property
durationMs: number

args

property
args: Record<string, unknown>

DiagnosticsRowProps

interface
interface DiagnosticsRowProps
Members

entry

property
entry: DiagnosticsEntry

isExpanded

property
isExpanded: boolean

onToggle

property
onToggle: () => void

theme

property
theme: Theme

ProviderSelectorProps

interface
interface ProviderSelectorProps
Members

model

property
model: IProviderSelectorModel

IProviderSelectorModel

interface
interface IProviderSelectorModel
Members

current

property

Current provider and host (read-only display).

current: { provider: ProviderId; host: string; }

state

property

Selection lifecycle state.

state: Resource<void>

isOpen

property

Whether the selector is open (controls sheet visibility).

isOpen: boolean

onSelectProvider

method
onSelectProvider(provider: ProviderId): void

onCustomHostChange

method
onCustomHostChange(host: string): void

onConfirm

method
onConfirm(): Promise<void>

onDismiss

method
onDismiss(): void

SyncStatusBadgeProps

interface
interface SyncStatusBadgeProps
Members

state

property

The current sync state to render.

state: SyncState

onPress

property

Called when the user taps the badge. Receives the current state so the parent can route to the correct sheet (e.g. conflict resolver for "conflict", retry for "error", manual sync sheet for "idle").

onPress: (state: SyncState) => void

variant

property

Display density. compact — single-line pill / badge (~24px tall) for chrome. expanded — multi-line panel with sha, counts, retry button.

variant: SyncStatusBadgeVariant

tokens

property

Optional theme token overrides. When omitted, the badge reads from the nearest <ThemeProvider>. Useful in Storybook / dev-hub where the ThemeProvider may not wrap the story.

tokens: Partial<{ accent: string; accentFg: string; success: string; warn: string; danger: string; text: string; text2: string; text3: string; surface: string; border: string; warnBg: string; dangerBg: string; successBg: string; }>

EditorialBadgeProps

interface
interface EditorialBadgeProps
Members

state

property
state: RecordEditorialState

size

property
size: "sm" | "md"

tokens

property

Optional per-state color overrides. If omitted, theme defaults apply.

tokens: EditorialBadgeTokens

EditorialBadgeTokens

interface
interface EditorialBadgeTokens
Members

draft

property

Override the background color for a specific state.

draft: string

inReview

property
inReview: string

approved

property
approved: string

changesRequested

property
changesRequested: string

published

property
published: string

ForkRepoButtonProps

interface
interface ForkRepoButtonProps
Members

vm

property
vm: ForkRepoViewModel

ForkRepoViewModel

interface
interface ForkRepoViewModel
Members

source

property

The upstream repo being forked.

source: { owner: string; name: string; }

state

property

Resource tracking the fork operation. ready.value is the new forked repo.

state: Resource<{ owner: string; name: string; }>

onPress

method
onPress(): void

PullRequestComposerProps

interface
interface PullRequestComposerProps
Members

vm

property
vm: PullRequestComposerViewModel

PullRequestComposerViewModel

interface
interface PullRequestComposerViewModel
Members

mode

property
mode: PullRequestComposerMode

title

property
title: string

body

property
body: string

baseBranch

property
baseBranch: string

scheduledPublish

property
scheduledPublish: ScheduledPublish

state

property
state: Resource<PullRequestRef>

onChangeTitle

method
onChangeTitle(s: string): void

onChangeBody

method
onChangeBody(s: string): void

onChangeBaseBranch

method
onChangeBaseBranch(s: string): void

onChangeScheduled

method
onChangeScheduled(s: ScheduledPublish): void

onSubmit

method
onSubmit(): void

onCancel

method
onCancel(): void

EditorialQueueScreenProps

interface
interface EditorialQueueScreenProps
Members

vm

property
vm: EditorialQueueViewModel

EditorialQueueViewModel

interface
interface EditorialQueueViewModel
Members

rows

property
rows: readonly EditorialQueueRow[]

filter

property
filter: EditorialQueueFilter

layout

property
layout: "kanban" | "list"

state

property

Load state for the queue itself.

state: Resource<void>

onSelectRow

method
onSelectRow(id: string): void

onChangeFilter

method
onChangeFilter(filter: EditorialQueueFilter): void

onToggleLayout

method
onToggleLayout(): void

EditorialQueueRow

interface
interface EditorialQueueRow
Members

id

property
id: string

title

property
title: string

state

property
state: RecordEditorialState

author

property
author: string

updatedAt

property
updatedAt: number

EditorialQueueFilter

interface
interface EditorialQueueFilter
Members

state

property
state: readonly ("published" | "draft" | "in-review" | "approved" | "changes-requested")[]

author

property
author: string

EditorialQueueRowCardProps

interface
interface EditorialQueueRowCardProps
Members

row

property
row: EditorialQueueRow

onPress

property
onPress: (id: string) => void

RecordReviewSheetProps

interface
interface RecordReviewSheetProps
Members

vm

property
vm: RecordReviewSheetViewModel

renderPreview

property

Render-prop slot — the consuming app provides domain-specific record preview. PPA passes a task card renderer; a CMS app passes a markdown article renderer.

renderPreview: (record: { rawContent: string; meta: unknown; }) => ReactNode

RecordReviewSheetViewModel

interface
interface RecordReviewSheetViewModel
Members

record

property
record: { readonly id: string; readonly title: string; readonly rawContent: string; readonly meta: unknown; }

pr

property
pr: PullRequestRef

approveState

property
approveState: Resource<void>

requestChangesState

property
requestChangesState: Resource<{ comment: string; }>

closeState

property
closeState: Resource<void>

onApprove

method
onApprove(): void

onRequestChanges

method
onRequestChanges(comment: string): void

onClose

method
onClose(): void

onCancel

method
onCancel(): void

PreviewPpaTaskProps

interface
interface PreviewPpaTaskProps
Members

mineTask

property

Parsed mine task — if absent, raw text from ConflictSide is shown.

mineTask: PpaTaskRecord

theirsTask

property

Parsed theirs task — if absent, raw text from ConflictSide is shown.

theirsTask: PpaTaskRecord

PpaTaskRecord

interface
interface PpaTaskRecord
Members

title

property

Markdown YAML frontmatter fields

title: string

status

property
status: string

context

property
context: string

project

property
project: string

due

property
due: string

body

property

Markdown body below the frontmatter

body: string

author

property

Commit author label

author: string

whenLabel

property

Relative time label, e.g. "4m ago"

whenLabel: string

PreviewCmsArticleProps

interface
interface PreviewCmsArticleProps
Members

mineArticle

property
mineArticle: CmsArticleRecord

theirsArticle

property
theirsArticle: CmsArticleRecord

frontmatterDiff

property

Pre-computed frontmatter diff lines for the expander.

frontmatterDiff: readonly FrontmatterDiffLine[]

CmsArticleRecord

interface
interface CmsArticleRecord
Members

title

property

Frontmatter fields

title: string

slug

property
slug: string

publishedAt

property
publishedAt: string

authors

property
authors: readonly string[]

tags

property
tags: readonly string[]

draft

property
draft: boolean

body

property

Raw markdown body

body: string

author

property

Contributor label

author: string

whenLabel

property

Relative time, e.g. "2h ago"

whenLabel: string

PreviewBookmarkProps

interface
interface PreviewBookmarkProps
Members

mineBookmark

property
mineBookmark: BookmarkRecord

theirsBookmark

property
theirsBookmark: BookmarkRecord

BookmarkRecord

interface
interface BookmarkRecord
Members

id

property
id: string

url

property
url: string

title

property
title: string

tags

property
tags: readonly string[]

notes

property
notes: string

addedAt

property
addedAt: string

whenLabel

property

Relative time label

whenLabel: string

PreviewPasswordEntryProps

interface
interface PreviewPasswordEntryProps
Members

mineEntry

property
mineEntry: PasswordRecord

theirsEntry

property
theirsEntry: PasswordRecord

PasswordRecord

interface
interface PasswordRecord
Members

accountName

property

Human-readable account label, e.g. "GitHub (work)"

accountName: string

username

property
username: string

passwordMasked

property

Always masked here — "tap to reveal" stub.

passwordMasked: true

has2FaSeed

property
has2FaSeed: boolean

url

property
url: string

notes

property
notes: string

whenLabel

property

Relative time label

whenLabel: string

deviceLabel

property

Device label

deviceLabel: string

RepoSelection

interface
interface RepoSelection
Members

providerId

property
providerId: RepoProviderId

owner

property
owner: string

name

property
name: string

provider

property
provider: RepoProviderId

host

property
host: string

DemoRepoRef

interface
interface DemoRepoRef
Members

owner

property
owner: string

name

property
name: string

PullRequestRef

interface

PullRequestRef — minimal PR reference mirroring the shape Track 3 uses in

interface PullRequestRef
Members

number

property
number: number

state

property
state: "merged" | "open" | "closed"

title

property
title: string

htmlUrl

property
htmlUrl: string

EditorialConfigSource

interface

Provider-agnostic file-reading interface. PPA wires the iso-git read in later; tests inject a fake.

interface EditorialConfigSource
Members

readFile

method
readFile(path: string): Promise<string | null>

Constants

defaultLightTheme

const
const defaultLightTheme: Theme

RepoModeSchema

const

Zod schema for RepoMode. Uses .passthrough() for forward-compatibility — unknown fields are preserved rather than rejected. Never uses .optional() — missing fields signal a parse failure.

const RepoModeSchema: z.ZodType<RepoMode, z.ZodTypeDef, RepoMode>

ProviderIdSchema

const
const ProviderIdSchema: z.ZodType<RepoProviderId, z.ZodTypeDef, RepoProviderId>

RepoSelectionSchema

const
const RepoSelectionSchema: z.ZodType<RepoSelection, z.ZodTypeDef, RepoSelection>

RecordEditorialStateSchema

const

Zod schema for RecordEditorialState. Uses .passthrough() on each variant for forward-compatibility.

const RecordEditorialStateSchema: z.ZodType<RecordEditorialState, z.ZodTypeDef, RecordEditorialState>

RepoEditorialModeSchema

const

Zod schema for RepoEditorialMode. Uses .passthrough() on each variant for forward-compatibility.

const RepoEditorialModeSchema: z.ZodType<RepoEditorialMode, z.ZodTypeDef, RepoEditorialMode>

PullRequestRefSchema

const

Zod schema for PullRequestRef.

const PullRequestRefSchema: z.ZodType<PullRequestRef, z.ZodTypeDef, PullRequestRef>