JSDoc
Functions
mergeTheme
functionmergeTheme(base: Theme, override: PartialTheme): Theme
ThemeProvider
functionThemeProvider({ theme, themeOverride, children }: Props): ReactNodeuseTheme
functionuseTheme(): Theme
Icon
functionIcon({ 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.ElementSpinner
functionSpinner({ 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.ElementChip
functionChip({ 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.ElementDot
functionDot({ tone, size }: Props): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementBanner
functionBanner({ 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.ElementButton
functionButton({ 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.ElementCard
functionCard({ 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.ElementSkeleton
functionSkeleton({ 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.ElementProgressBar
functionProgressBar({ 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.ElementConnectionPanel
functionConnectionPanel 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.ElementRepoPickerSheet
functionRepoPickerSheet 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.ElementRepoRow
functionRepoRow({ 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.ElementCreateRepoForm
functionCreateRepoForm 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.ElementInitializationSequence
functionInitializationSequence({ model, repoLabel }: InitializationSequenceProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementInitStepRow
functionInitStepRow({ step, theme }: InitStepRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementSyncStatusBar
functionThe 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.ElementConflictShell
functionConflictShell({ 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.ElementFileTreeRow
functionFileTreeRow({ 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.ElementBranchGraph
functionBranchGraph({ 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.ElementDivergenceExplainer
functionDivergenceExplainer({ model }: DivergenceExplainerProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementConflictResolverSheet
functionConflictResolverSheet({ 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.ElementTextPreview
functiontextPreviewForSides — 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): ReactNodeRepoStateRecoveryPanel
functionRepoStateRecoveryPanel({ model }: RepoStateRecoveryPanelProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementFindingItem
functionFindingItem({ finding, theme }: FindingItemProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementValidationFailureBanner
functionValidationFailureBanner({ model }: ValidationFailureBannerProps): anyFailureRow
functionFailureRow({ failure, model }: FailureRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementRepoStatusRow
functionRepoStatusRow({ model }: RepoStatusRowProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementResourceButton
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.ElementDiagnosticsSheet
functionDiagnosticsSheet({ model }: DiagnosticsSheetProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementDiagnosticsRow
functionDiagnosticsRow({ 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.ElementProviderSelector
functionProviderSelector({ model, }: ProviderSelectorProps): import("/home/runner/work/gitapp/gitapp/node_modules/.pnpm/@types+react@18.3.28/node_modules/@types/react/jsx-runtime").JSX.ElementSyncStatusBadge
functionSyncStatusBadge — 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.ElementEditorialBadge
functionEditorialBadge — 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.ElementForkRepoButton
functionForkRepoButton — 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.ElementPullRequestComposer
functionPullRequestComposer — 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.ElementEditorialQueueScreen
functionEditorialQueueScreen — 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.ElementEditorialQueueRowCard
functionEditorialQueueRowCard({ row, onPress, }: EditorialQueueRowCardProps): JSX.ElementRecordReviewSheet
functionRecordReviewSheet — 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.ElementPreviewPpaTask
functionPreviewPpaTask({ file, side, mine, theirs, mineTask, theirsTask, }: PreviewPpaTaskProps): ReactNodePreviewCmsArticle
functionPreviewCmsArticle({ file, side, mine, theirs, mineArticle, theirsArticle, frontmatterDiff, }: PreviewCmsArticleProps): ReactNodePreviewBookmark
functionPreviewBookmark({ file, side, mine, theirs, mineBookmark, theirsBookmark, }: PreviewBookmarkProps): ReactNodePreviewPasswordEntry
functionPreviewPasswordEntry({ file, side, mine, theirs, mineEntry, theirsEntry, }: PreviewPasswordEntryProps): ReactNodeisWritable
functionReturns true when the mode permits writes.
isWritable(mode: RepoMode): boolean
describeMode
functionHuman-readable description of the mode, exhaustive over all variants.
describeMode(mode: RepoMode): string
effectiveMode
functioneffectiveMode(selection: Pick<RepoSelection, "owner" | "name">, mode: RepoMode, demo: DemoRepoRef): RepoMode
requireWrite
functionrequireWrite(mode: RepoMode, attemptedAction: string): WriteAccess
normalizeHost
functionnormalizeHost(provider: RepoProviderId, host: string): string
describeEditorialState
functionHuman-readable description of a record's editorial state, exhaustive.
describeEditorialState(state: RecordEditorialState): string
readEditorialConfig
functionReads 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
typetype Resource = Resource<T>
ResourceT
typetype ResourceT = Resource<T>
Err
typetype Err = { readonly message: string; readonly cause?: unknown }StatusTone
typetype StatusTone = | "neutral" | "brand" | "success" | "warn" | "danger" | "info" | "mine" | "theirs" | "merged"
Connectivity
typetype Connectivity = | { kind: "online" }
| { kind: "offline" }
| { kind: "uncertain" }ProviderId
typetype ProviderId = "github" | "gitea" | "gitlab"
IconName
typetype 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
typeCategorised 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
typeAccess state for a single repo — checked against current auth token.
type RepoAccess = | { kind: "found" }
| { kind: "forbidden"; currentLogin: string }
| { kind: "missing" }
| { kind: "checking" }CreateErrorKind
typeCategorised create error — drives specific copy.
type CreateErrorKind = | { kind: "auth" }
| { kind: "duplicate"; name: string }
| { kind: "network" }
| { kind: "unknown"; detail: string }InitStepState
typetype InitStepState = | { kind: "pending" }
| { kind: "running"; progress: InitStepProgress }
| { kind: "ok"; durationMs: number }
| { kind: "error"; message: string }
| { kind: "blocked"; reason: string }InitStepProgress
typetype InitStepProgress = | { kind: "indeterminate" }
| { kind: "determinate"; ratio: number; label: string }InitOverall
typetype InitOverall = | { kind: "running"; currentIndex: number }
| { kind: "ok" }
| { kind: "blocked"; failedIndex: number; error: string }SyncErrorKind
typeCategorised 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
typetype ConflictSideId = "mine" | "theirs" | "merged"
ConflictFileStatus
typetype ConflictFileStatus = | { kind: "modifiedBoth" }
| { kind: "modifiedMine" }
| { kind: "modifiedTheirs" }
| { kind: "deletedMine" }
| { kind: "deletedTheirs" }
| { kind: "addedMine" }
| { kind: "addedTheirs" }
| { kind: "renamed"; fromPath: string; toPath: string }
| { kind: "binary" }ConflictFile
typetype ConflictFile = {
readonly id: string;
readonly path: string;
readonly displayName: string;
readonly status: ConflictFileStatus;
readonly resolved: boolean;
}ConflictSide
typetype 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
typetype CommitSummary = {
readonly id: string;
readonly side: "mine" | "theirs";
readonly shortHash: string;
readonly title: string;
readonly author: string;
readonly whenISO: string;
}DivergedCommit
typetype 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
typetype DivergedFileChange = {
readonly path: string;
readonly mineEdited: boolean;
readonly theirsEdited: boolean;
readonly bothEditedSameContent: boolean;
}ConflictDecision
typetype ConflictDecision = | { kind: "pending" }
| { kind: "keepMine" }
| { kind: "keepTheirs" }
| { kind: "merged"; content: string }
| { kind: "deferred" }ResolvableFile
typeA 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
typetype FindingPath = | { kind: "none" }
| { kind: "some"; value: string }DiagnosisState
typetype DiagnosisState = | { kind: "loading" }
| { kind: "ready"; findings: Finding[] }LastGoodCommit
typetype LastGoodCommit = | { kind: "none" }
| { kind: "some"; sha: string; whenISO: string }RepoStatusState
typetype 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
typetype DiagnosticsOp = "push" | "pull" | "commit" | "clone"
DiagnosticsResult
typetype 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
typetype DiagnosticsResultKind = | "ok" | "non-fast-forward" | "auth-error" | "network" | "rejected" | "unknown"
DiagnosticsFilter
typetype DiagnosticsFilter = "all" | "errors" | "last-hour"
SyncState
typetype 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
typeControls how much space the badge occupies.
type SyncStatusBadgeVariant = "compact" | "expanded"
PullRequestComposerMode
typetype PullRequestComposerMode = | { kind: "editorial-submit"; recordTitle: string }
| { kind: "fork-back"; sourceUpstream: { owner: string; name: string } }ScheduledPublish
typetype ScheduledPublish = | { kind: "none" }
| { kind: "at"; iso: string }FrontmatterDiffLine
typetype FrontmatterDiffLine = | { kind: "removed"; text: string }
| { kind: "added"; text: string }
| { kind: "context"; text: string }RepoMode
typeRepoMode — 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
typetype RepoProviderId = "github" | "gitea" | "gitlab"
RoReason
typetype RoReason = | { readonly kind: "demo" }
| { readonly kind: "no-access" }
| { readonly kind: "user-locked" }WriteAccess
typetype WriteAccess = | { readonly kind: "granted" }
| { readonly kind: "denied"; readonly reason: RoReason; readonly attemptedAction: string }RecordEditorialState
typeRecordEditorialState — 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
typeRepoEditorialMode — 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
interfaceinterface Theme
name
propertyname: string
colors
propertycolors: ThemeColors
fonts
propertyfonts: ThemeFonts
radii
propertyradii: ThemeRadii
spacing
propertyspacing: ThemeSpacing
shadows
propertyshadows: ThemeShadows
typography
propertytypography: ThemeTypography
ThemeColors
interfaceinterface ThemeColors
bg
propertybg: string
surface
propertysurface: string
surface2
propertysurface2: string
surface3
propertysurface3: string
border
propertyborder: string
border2
propertyborder2: string
text
propertytext: string
text2
propertytext2: string
text3
propertytext3: string
text4
propertytext4: string
brand
propertybrand: string
brand2
propertybrand2: string
brandFg
propertybrandFg: string
brandBg
propertybrandBg: string
success
propertysuccess: string
successBg
propertysuccessBg: string
successBorder
propertysuccessBorder: string
warn
propertywarn: string
warnBg
propertywarnBg: string
warnBorder
propertywarnBorder: string
danger
propertydanger: string
dangerBg
propertydangerBg: string
dangerBorder
propertydangerBorder: string
info
propertyinfo: string
infoBg
propertyinfoBg: string
infoBorder
propertyinfoBorder: string
mine
propertymine: string
mineBg
propertymineBg: string
mineBorder
propertymineBorder: string
theirs
propertytheirs: string
theirsBg
propertytheirsBg: string
theirsBorder
propertytheirsBorder: string
merged
propertymerged: string
mergedBg
propertymergedBg: string
mergedBorder
propertymergedBorder: string
ThemeFonts
interfaceinterface ThemeFonts
ui
propertyui: string
mono
propertymono: string
ThemeRadii
interfaceinterface ThemeRadii
sm
propertysm: number
md
propertymd: number
lg
propertylg: number
ThemeSpacing
interfaceinterface ThemeSpacing
xs
propertyxs: number
sm
propertysm: number
md
propertymd: number
lg
propertylg: number
xl
propertyxl: number
ThemeShadow
interfaceinterface ThemeShadow
color
propertycolor: string
opacity
propertyopacity: number
offsetX
propertyoffsetX: number
offsetY
propertyoffsetY: number
radius
propertyradius: number
elevation
propertyelevation: number
ThemeShadows
interfaceinterface ThemeShadows
s1
propertys1: ThemeShadow
s2
propertys2: ThemeShadow
modal
propertymodal: ThemeShadow
ThemeTypography
interfaceinterface ThemeTypography
t12
propertyt12: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }t13
propertyt13: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }t14
propertyt14: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }t15
propertyt15: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }t16
propertyt16: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }t18
propertyt18: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }t22
propertyt22: { size: number; lineHeight: number; weight: "400" | "500" | "600" | "700"; }ConnectionPanelProps
interfaceinterface ConnectionPanelProps
model
propertymodel: IConnectionModel
IConnectionModel
interfaceinterface IConnectionModel
provider
propertyCurrent selected provider.
provider: ProviderId
authMethod
propertyOAuth or PAT — GitHub supports both; Gitea/GitLab require PAT.
authMethod: { kind: "oauth"; } | { kind: "pat"; token: string; }host
propertyDefault = the provider's public cloud; custom = self-hosted URL.
host: { kind: "default"; } | { kind: "custom"; url: string; }connection
propertyFour-state Resource for the current authentication attempt.
connection: Resource<ConnectionSuccess>
errorKind
propertyCategorised error when connection.kind === "error".
errorKind: { kind: "none"; } | { kind: "some"; value: ConnectionErrorKind; }onProviderChange
methodonProviderChange(p: ProviderId): void
onAuthMethodChange
methodonAuthMethodChange(m: { kind: "oauth"; } | { kind: "pat"; token: string; }): voidonHostChange
methodonHostChange(h: { kind: "default"; } | { kind: "custom"; url: string; }): voidonConnect
methodonConnect(): Promise<void>
onDisconnect
methodonDisconnect(): Promise<void>
ConnectionSuccess
interfaceConnection success payload.
interface ConnectionSuccess
login
propertylogin: string
provider
propertyprovider: ProviderId
RepoPickerSheetProps
interfaceinterface RepoPickerSheetProps
model
propertymodel: IRepoPickerModel
IRepoPickerModel
interfaceinterface IRepoPickerModel
repos
propertyFull repo list — all 4 Resource states.
repos: Resource<readonly RepoInfo[]>
filter
propertyCurrent filter text (controlled).
filter: string
picked
propertySelection state — discriminated union, no nullable.
picked: { kind: "none"; } | { kind: "picking"; repo: RepoInfo; } | { kind: "picked"; repo: RepoInfo; }currentLogin
propertyWho we are authed as (shown in forbidden chip copy).
currentLogin: { kind: "anonymous"; } | { kind: "loggedIn"; login: string; }filteredRepos
propertyFiltered + sorted subset — computed by the model, not this component.
filteredRepos: readonly RepoInfo[]
canCreate
propertyWhether the current auth token has repo-create scope.
canCreate: boolean
onFilterChange
methodonFilterChange(v: string): void
onSelect
methodonSelect(repo: RepoInfo): Promise<void>
onRefresh
methodonRefresh(): Promise<void>
onOpenCreate
methodonOpenCreate(): void
onDismiss
methodonDismiss(): void
RepoInfo
interfaceRepo metadata returned from the provider's list-repos API.
interface RepoInfo
owner
propertyowner: string
name
propertyname: string
isPrivate
propertyisPrivate: boolean
defaultBranch
propertydefaultBranch: string
pushedAt
propertypushedAt: string
access
propertyaccess: RepoAccess
CreateRepoFormProps
interfaceinterface CreateRepoFormProps
model
propertymodel: ICreateRepoModel
ICreateRepoModel
interfaceinterface ICreateRepoModel
name
propertyControlled repo name (no spaces; dashes + alphanumeric only).
name: string
visibility
propertyVisibility toggle — private is the default and recommended.
visibility: "private" | "public"
initWithReadme
propertyWhether to create an initial README commit (required for push).
initWithReadme: boolean
create
propertyFour-state Resource for the create attempt.
create: Resource<CreatedRepo>
nameValidation
propertyInline name validation — shown under the input.
nameValidation: { kind: "ok"; } | { kind: "invalid"; reason: string; }createErrorKind
propertyCategorised error when create.kind === "error".
createErrorKind: { kind: "none"; } | { kind: "some"; value: CreateErrorKind; }onNameChange
methodonNameChange(v: string): void
onVisibilityChange
methodonVisibilityChange(v: "private" | "public"): void
onInitWithReadmeChange
methodonInitWithReadmeChange(v: boolean): void
onSubmit
methodonSubmit(): Promise<void>
onCancel
methodonCancel(): void
CreatedRepo
interfaceSuccess payload — the created repo coordinates.
interface CreatedRepo
owner
propertyowner: string
name
propertyname: string
InitializationSequenceProps
interfaceinterface InitializationSequenceProps
model
propertymodel: IInitModel
repoLabel
propertyShown in the heading, e.g. "byoklab/ppa-data-andrew"
repoLabel: string
IInitModel
interfaceinterface IInitModel
steps
propertysteps: readonly InitStep[]
overall
propertyoverall: InitOverall
onRetry
methodonRetry(stepId: string): Promise<void>
onReset
methodonReset(): Promise<void>
onCancel
methodonCancel(): void
InitStep
interfaceinterface InitStep
id
propertyid: string
label
propertylabel: string
state
propertystate: InitStepState
InitStepRowProps
interfaceinterface InitStepRowProps
step
propertystep: InitStep
theme
propertytheme: Theme
SyncStatusBarProps
interfaceinterface SyncStatusBarProps
model
propertymodel: ISyncStatusModel
nowISO
propertyCalled every minute or so by the parent so "3m ago" updates.
nowISO: string
ISyncStatusModel
interfaceinterface ISyncStatusModel
sync
propertyThe four-state Resource for the latest sync attempt.
sync: Resource<SyncSummary>
connectivity
propertyNetwork reachability — orthogonal to sync.
connectivity: Connectivity
errorKind
propertyCategorised error when sync.kind === "error".
errorKind: { kind: "none"; } | { kind: "some"; value: SyncErrorKind; }pendingCount
propertyPending writes count (used in offline label).
pendingCount: number
expanded
propertyWhether the strip's expanded recovery panel is open.
expanded: boolean
onToggleExpanded
methodonToggleExpanded(): void
onRetry
methodonRetry(): Promise<void>
onOpenDivergence
methodonOpenDivergence(): void
onOpenDiagnostics
methodonOpenDiagnostics(): void
onReconnect
methodonReconnect(): void
SyncSummary
interfaceSuccessful-state payload — what the strip shows in `ready`.
interface SyncSummary
lastPushedISO
propertylastPushedISO: string
pendingCount
propertypendingCount: number
ConflictShellProps
interfaceinterface ConflictShellProps
vm
propertyvm: IConflictShellViewModel
getSides
propertygetSides: (file: ConflictFile) => { mine: ConflictSide; theirs: ConflictSide; merged: ConflictSide; }renderPreview
propertyRender-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
propertyViewport 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
propertyForce the mobile drawer open (useful for Storybook / showcase). Only meaningful when viewport="phone".
drawerOpen: boolean
IConflictShellViewModel
interfaceinterface IConflictShellViewModel
files
propertyfiles: readonly ConflictFile[]
commits
propertycommits: readonly CommitSummary[]
selectedFile
propertyselectedFile: { kind: "selected"; fileId: string; } | { kind: "none"; }selectedSide
propertyselectedSide: ConflictSideId
railMode
propertyMobile only: toggle between file list and commit list.
railMode: { kind: "files"; } | { kind: "commits"; }resolvedCount
propertyresolvedCount: number
pendingCount
propertypendingCount: number
canApply
propertycanApply: boolean
selectFile
methodselectFile(fileId: string): void
selectSide
methodselectSide(side: ConflictSideId): void
setRailMode
methodsetRailMode(mode: IConflictShellViewModel["railMode"]): void
keepMine
methodWhole-file shortcut — no preview needed, resolves inline.
keepMine(fileId: string): void
keepTheirs
methodWhole-file shortcut — no preview needed, resolves inline.
keepTheirs(fileId: string): void
skip
methodMark deferred — skip this record for now.
skip(fileId: string): void
apply
methodapply(): Promise<void>
ConflictPreviewProps
interfaceinterface ConflictPreviewProps
file
propertyfile: ConflictFile
side
propertyside: ConflictSideId
mine
propertymine: ConflictSide
theirs
propertytheirs: ConflictSide
merged
propertymerged: ConflictSide
FileTreeRowProps
interfaceinterface FileTreeRowProps
file
propertyfile: ConflictFile
isSelected
propertyisSelected: boolean
onSelect
propertyonSelect: () => void
onKeepMine
propertyonKeepMine: () => void
onKeepTheirs
propertyonKeepTheirs: () => void
theme
propertytheme: Theme
BranchGraphProps
interfaceinterface BranchGraphProps
size
propertysize: "phone" | "desktop" | "inline"
mine
propertymine: readonly DivergedCommit[]
theirs
propertytheirs: readonly DivergedCommit[]
mergeBase
propertymergeBase: { commitId: string; whenISO: string; }maxDots
propertyOverride the per-size default maximum dots per lane.
maxDots: number
DivergenceExplainerProps
interfaceinterface DivergenceExplainerProps
model
propertymodel: IDivergenceModel
IDivergenceModel
interfaceinterface IDivergenceModel
mine
propertymine: readonly DivergedCommit[]
theirs
propertytheirs: readonly DivergedCommit[]
mergeBase
propertymergeBase: { commitId: string; whenISO: string; }fileChanges
propertyfileChanges: readonly DivergedFileChange[]
strategy
propertystrategy: { kind: "choosing"; } | { kind: "tryingAutomatic"; } | { kind: "automaticSucceeded"; } | { kind: "automaticFailed"; } | { kind: "confirmingDiscard"; side: "mine" | "theirs"; } | { kind: "discarding"; } | { kind: "discarded"; } | { kind: "applyError"; reason: string; }canShowAutomatic
propertycanShowAutomatic: boolean
onTryAutomatic
methodonTryAutomatic(): Promise<void>
onResolveManually
methodonResolveManually(): void
onDiscard
methodonDiscard(side: "mine" | "theirs"): void
onConfirmDiscard
methodonConfirmDiscard(typed: string): Promise<void>
onCancel
methodonCancel(): void
onShowTechnicalDetails
methodonShowTechnicalDetails(): void
ConflictResolverSheetProps
interfaceinterface ConflictResolverSheetProps
model
propertymodel: IConflictResolverModel
renderPreview
propertyConsuming-app override for the preview slot. If omitted, the default text-v1 side-by-side panes are used.
renderPreview: (props: ConflictPreviewProps) => ReactNode
viewport
propertyviewport: "phone" | "desktop"
drawerOpen
propertydrawerOpen: boolean
IConflictResolverModel
interfaceinterface IConflictResolverModel
files
propertyfiles: readonly ResolvableFile[]
tab
propertytab: "all" | "pending" | "resolved"
overall
propertyoverall: { kind: "browsing"; } | { kind: "resolvingFile"; path: string; } | { kind: "applying"; } | { kind: "applied"; } | { kind: "applyError"; reason: string; }pendingCount
propertypendingCount: number
resolvedCount
propertyresolvedCount: number
canApply
propertycanApply: boolean
shellVm
propertyThe adapter the shell consumes.
shellVm: IConflictShellViewModel
renderPreview
methodDefault renderPreview — text-v1 side-by-side panes.
renderPreview(props: ConflictPreviewProps): ReactNode
onTabChange
methodonTabChange(tab: "all" | "pending" | "resolved"): void
onOpenFile
methodonOpenFile(path: string): void
onCloseFile
methodonCloseFile(): void
onDecide
methodonDecide(path: string, decision: ConflictDecision): void
onKeepAllMine
methodonKeepAllMine(): void
onKeepAllTheirs
methodonKeepAllTheirs(): void
onApply
methodonApply(): Promise<void>
onDismiss
methodonDismiss(): void
RepoStateRecoveryPanelProps
interfaceinterface RepoStateRecoveryPanelProps
model
propertymodel: IRecoveryModel
IRecoveryModel
interfaceinterface IRecoveryModel
repoOwner
propertyrepoOwner: string
repoName
propertyrepoName: string
lastWorkingISO
propertylastWorkingISO: { kind: "none"; } | { kind: "some"; value: string; }localChangesCount
propertylocalChangesCount: number
diagnosis
propertydiagnosis: DiagnosisState
recovery
propertyrecovery: Resource<RecoveryOutcome>
onSoftRefresh
methodonSoftRefresh(): void
onPull
methodonPull(): Promise<void>
onReset
methodonReset(typedConfirmation: string): Promise<void>
onOpenDiagnostics
methodonOpenDiagnostics(): void
onSwitchRepo
methodonSwitchRepo(): void
Finding
interfaceinterface Finding
severity
propertyseverity: "warn" | "error"
message
propertymessage: string
path
propertypath: FindingPath
RecoveryOutcome
interfaceOutcome returned by successful recovery operations.
interface RecoveryOutcome
message
propertymessage: string
ValidationFailureBannerProps
interfaceinterface ValidationFailureBannerProps
model
propertymodel: IValidationModel
IValidationModel
interfaceinterface IValidationModel
failures
propertyfailures: Resource<ValidationFailure[]>
onShowDetails
methodonShowDetails(file: string): void
onOpenRawEditor
methodonOpenRawEditor(file: string): void
onReset
methodonReset(file: string): void
onDismiss
methodonDismiss(file: string): void
ValidationFailure
interfaceinterface ValidationFailure
path
propertypath: string
oneLineError
propertyoneLineError: string
fullErrors
propertyfullErrors: readonly string[]
lastGoodCommit
propertylastGoodCommit: LastGoodCommit
FailureRowProps
interfaceinterface FailureRowProps
failure
propertyfailure: ValidationFailure
model
propertymodel: IValidationModel
RepoStatusRowProps
interfaceinterface RepoStatusRowProps
model
propertymodel: IRepoStatusModel
IRepoStatusModel
interfaceinterface IRepoStatusModel
state
propertystate: RepoStatusState
onPress
methodonPress(): void
IResourceButtonProps
interfaceinterface IResourceButtonProps
state
propertystate: Resource<T>
label
propertylabel: string
onPress
propertyonPress: (() => void) | (() => Promise<void>)
variant
propertyvariant: "danger" | "primary" | "secondary"
size
propertysize: "sm" | "md" | "lg"
renderReady
propertyOverride the success content. Receives the unwrapped ready value.
renderReady: (value: T) => ReactNode
DiagnosticsSheetProps
interfaceinterface DiagnosticsSheetProps
model
propertymodel: IDiagnosticsModel
IDiagnosticsModel
interfaceinterface IDiagnosticsModel
entries
propertyentries: Resource<DiagnosticsEntry[]>
filter
propertyfilter: DiagnosticsFilter
expanded
propertyexpanded: { kind: "none"; } | { kind: "some"; entryId: string; }onFilterChange
methodonFilterChange(filter: DiagnosticsFilter): void
onToggleExpanded
methodonToggleExpanded(id: string): void
onClear
methodonClear(): void
onExport
methodonExport(): void
DiagnosticsEntry
interfaceinterface DiagnosticsEntry
id
propertyid: string
whenISO
propertywhenISO: string
op
propertyop: DiagnosticsOp
result
propertyresult: DiagnosticsResult
durationMs
propertydurationMs: number
args
propertyargs: Record<string, unknown>
DiagnosticsRowProps
interfaceinterface DiagnosticsRowProps
entry
propertyentry: DiagnosticsEntry
isExpanded
propertyisExpanded: boolean
onToggle
propertyonToggle: () => void
theme
propertytheme: Theme
ProviderSelectorProps
interfaceinterface ProviderSelectorProps
model
propertymodel: IProviderSelectorModel
IProviderSelectorModel
interfaceinterface IProviderSelectorModel
current
propertyCurrent provider and host (read-only display).
current: { provider: ProviderId; host: string; }state
propertySelection lifecycle state.
state: Resource<void>
isOpen
propertyWhether the selector is open (controls sheet visibility).
isOpen: boolean
onSelectProvider
methodonSelectProvider(provider: ProviderId): void
onCustomHostChange
methodonCustomHostChange(host: string): void
onConfirm
methodonConfirm(): Promise<void>
onDismiss
methodonDismiss(): void
SyncStatusBadgeProps
interfaceinterface SyncStatusBadgeProps
state
propertyThe current sync state to render.
state: SyncState
onPress
propertyCalled 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
propertyDisplay density. compact — single-line pill / badge (~24px tall) for chrome. expanded — multi-line panel with sha, counts, retry button.
variant: SyncStatusBadgeVariant
tokens
propertyOptional 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
interfaceinterface EditorialBadgeProps
state
propertystate: RecordEditorialState
size
propertysize: "sm" | "md"
tokens
propertyOptional per-state color overrides. If omitted, theme defaults apply.
tokens: EditorialBadgeTokens
EditorialBadgeTokens
interfaceinterface EditorialBadgeTokens
draft
propertyOverride the background color for a specific state.
draft: string
inReview
propertyinReview: string
approved
propertyapproved: string
changesRequested
propertychangesRequested: string
published
propertypublished: string
ForkRepoButtonProps
interfaceinterface ForkRepoButtonProps
vm
propertyvm: ForkRepoViewModel
ForkRepoViewModel
interfaceinterface ForkRepoViewModel
source
propertyThe upstream repo being forked.
source: { owner: string; name: string; }state
propertyResource tracking the fork operation. ready.value is the new forked repo.
state: Resource<{ owner: string; name: string; }>onPress
methodonPress(): void
PullRequestComposerProps
interfaceinterface PullRequestComposerProps
vm
propertyvm: PullRequestComposerViewModel
PullRequestComposerViewModel
interfaceinterface PullRequestComposerViewModel
mode
propertymode: PullRequestComposerMode
title
propertytitle: string
body
propertybody: string
baseBranch
propertybaseBranch: string
scheduledPublish
propertyscheduledPublish: ScheduledPublish
state
propertystate: Resource<PullRequestRef>
onChangeTitle
methodonChangeTitle(s: string): void
onChangeBody
methodonChangeBody(s: string): void
onChangeBaseBranch
methodonChangeBaseBranch(s: string): void
onChangeScheduled
methodonChangeScheduled(s: ScheduledPublish): void
onSubmit
methodonSubmit(): void
onCancel
methodonCancel(): void
EditorialQueueScreenProps
interfaceinterface EditorialQueueScreenProps
vm
propertyvm: EditorialQueueViewModel
EditorialQueueViewModel
interfaceinterface EditorialQueueViewModel
rows
propertyrows: readonly EditorialQueueRow[]
filter
propertyfilter: EditorialQueueFilter
layout
propertylayout: "kanban" | "list"
state
propertyLoad state for the queue itself.
state: Resource<void>
onSelectRow
methodonSelectRow(id: string): void
onChangeFilter
methodonChangeFilter(filter: EditorialQueueFilter): void
onToggleLayout
methodonToggleLayout(): void
EditorialQueueRow
interfaceinterface EditorialQueueRow
id
propertyid: string
title
propertytitle: string
state
propertystate: RecordEditorialState
author
propertyauthor: string
updatedAt
propertyupdatedAt: number
EditorialQueueFilter
interfaceinterface EditorialQueueFilter
state
propertystate: readonly ("published" | "draft" | "in-review" | "approved" | "changes-requested")[]author
propertyauthor: string
EditorialQueueRowCardProps
interfaceinterface EditorialQueueRowCardProps
row
propertyrow: EditorialQueueRow
onPress
propertyonPress: (id: string) => void
RecordReviewSheetProps
interfaceinterface RecordReviewSheetProps
vm
propertyvm: RecordReviewSheetViewModel
renderPreview
propertyRender-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; }) => ReactNodeRecordReviewSheetViewModel
interfaceinterface RecordReviewSheetViewModel
record
propertyrecord: { readonly id: string; readonly title: string; readonly rawContent: string; readonly meta: unknown; }pr
propertypr: PullRequestRef
approveState
propertyapproveState: Resource<void>
requestChangesState
propertyrequestChangesState: Resource<{ comment: string; }>closeState
propertycloseState: Resource<void>
onApprove
methodonApprove(): void
onRequestChanges
methodonRequestChanges(comment: string): void
onClose
methodonClose(): void
onCancel
methodonCancel(): void
PreviewPpaTaskProps
interfaceinterface PreviewPpaTaskProps
mineTask
propertyParsed mine task — if absent, raw text from ConflictSide is shown.
mineTask: PpaTaskRecord
theirsTask
propertyParsed theirs task — if absent, raw text from ConflictSide is shown.
theirsTask: PpaTaskRecord
PpaTaskRecord
interfaceinterface PpaTaskRecord
title
propertyMarkdown YAML frontmatter fields
title: string
status
propertystatus: string
context
propertycontext: string
project
propertyproject: string
due
propertydue: string
body
propertyMarkdown body below the frontmatter
body: string
author
propertyCommit author label
author: string
whenLabel
propertyRelative time label, e.g. "4m ago"
whenLabel: string
PreviewCmsArticleProps
interfaceinterface PreviewCmsArticleProps
mineArticle
propertymineArticle: CmsArticleRecord
theirsArticle
propertytheirsArticle: CmsArticleRecord
frontmatterDiff
propertyPre-computed frontmatter diff lines for the expander.
frontmatterDiff: readonly FrontmatterDiffLine[]
CmsArticleRecord
interfaceinterface CmsArticleRecord
title
propertyFrontmatter fields
title: string
slug
propertyslug: string
publishedAt
propertypublishedAt: string
authors
propertyauthors: readonly string[]
tags
propertytags: readonly string[]
draft
propertydraft: boolean
body
propertyRaw markdown body
body: string
author
propertyContributor label
author: string
whenLabel
propertyRelative time, e.g. "2h ago"
whenLabel: string
PreviewBookmarkProps
interfaceinterface PreviewBookmarkProps
mineBookmark
propertymineBookmark: BookmarkRecord
theirsBookmark
propertytheirsBookmark: BookmarkRecord
BookmarkRecord
interfaceinterface BookmarkRecord
id
propertyid: string
url
propertyurl: string
title
propertytitle: string
tags
propertytags: readonly string[]
notes
propertynotes: string
addedAt
propertyaddedAt: string
whenLabel
propertyRelative time label
whenLabel: string
PreviewPasswordEntryProps
interfaceinterface PreviewPasswordEntryProps
mineEntry
propertymineEntry: PasswordRecord
theirsEntry
propertytheirsEntry: PasswordRecord
PasswordRecord
interfaceinterface PasswordRecord
accountName
propertyHuman-readable account label, e.g. "GitHub (work)"
accountName: string
username
propertyusername: string
passwordMasked
propertyAlways masked here — "tap to reveal" stub.
passwordMasked: true
has2FaSeed
propertyhas2FaSeed: boolean
url
propertyurl: string
notes
propertynotes: string
whenLabel
propertyRelative time label
whenLabel: string
deviceLabel
propertyDevice label
deviceLabel: string
RepoSelection
interfaceinterface RepoSelection
providerId
propertyproviderId: RepoProviderId
owner
propertyowner: string
name
propertyname: string
provider
propertyprovider: RepoProviderId
host
propertyhost: string
DemoRepoRef
interfaceinterface DemoRepoRef
owner
propertyowner: string
name
propertyname: string
PullRequestRef
interfacePullRequestRef — minimal PR reference mirroring the shape Track 3 uses in
interface PullRequestRef
number
propertynumber: number
state
propertystate: "merged" | "open" | "closed"
title
propertytitle: string
htmlUrl
propertyhtmlUrl: string
EditorialConfigSource
interfaceProvider-agnostic file-reading interface. PPA wires the iso-git read in later; tests inject a fake.
interface EditorialConfigSource
readFile
methodreadFile(path: string): Promise<string | null>
Constants
defaultLightTheme
constconst defaultLightTheme: Theme
RepoModeSchema
constZod 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
constconst ProviderIdSchema: z.ZodType<RepoProviderId, z.ZodTypeDef, RepoProviderId>
RepoSelectionSchema
constconst RepoSelectionSchema: z.ZodType<RepoSelection, z.ZodTypeDef, RepoSelection>
RecordEditorialStateSchema
constZod schema for RecordEditorialState. Uses .passthrough() on each variant for forward-compatibility.
const RecordEditorialStateSchema: z.ZodType<RecordEditorialState, z.ZodTypeDef, RecordEditorialState>
RepoEditorialModeSchema
constZod schema for RepoEditorialMode. Uses .passthrough() on each variant for forward-compatibility.
const RepoEditorialModeSchema: z.ZodType<RepoEditorialMode, z.ZodTypeDef, RepoEditorialMode>
PullRequestRefSchema
constZod schema for PullRequestRef.
const PullRequestRefSchema: z.ZodType<PullRequestRef, z.ZodTypeDef, PullRequestRef>