rvlib-shipkit
v1.9.0
Published
All-in-one repo companion: ci gate (task DAG), auto-discovered health checks, release-contract fulfillness, asks queue, md-wiki tools, asset atelier, live tui
Readme
rvlib-shipkit
Repo toolkit for shipping: one config file gives a repo a commit gate (one DAG over every check), release-contract fulfillness checks, a human ask queue, markdown-wiki tooling, and the asset atelier (generate, curate, and ship assets — favicon/logo/OG included).
bun add -d rvlib-shipkit
bunx rvlib-shipkit init # scaffolds repo.config.ts + package.json scripts// repo.config.ts
import { defineRepo } from 'rvlib-shipkit'
export default defineRepo({
name: 'my-game',
venues: ['itch'], // which release contracts are REQUIRED
social: ['x', 'discord'], // .shipkit/social/<channel>/ post folders (+ .shipkit/discord/)
})Everything the gate runs beyond the floor is a CHECK, and a check needs no config at all: drop a <name>.check.ts file anywhere and sk ci, sk check, sk checks and the hub discover it.
// e2e.check.ts
import { check } from 'rvlib-shipkit/src/check.ts'
export default check({
description: 'the end to end suite passes against a built app',
blocking: true,
build: true,
cmd: ['bun', 'run', 'e2e'],
deps: ['lint'],
})CLI
sk ci commit gate: floor (lint/typecheck/test/imports/cycles —
scripts win, imports/cycles/typecheck fill from bundled
tools with zero config, gaps print visibly) + contracts
+ your checks, parallel DAG; refreshes STATUS.md
[--bail --skip g --only id --json]
sk contracts release-contract fulfillness alone [--venue v --json]
sk check periodic health: the built-in checks + every *.check.ts in
the repo, auto-discovered + TTL-cached
[--json --fresh --frozen --fix [SK### …]]
--fix applies check autofixes then re-runs them; --frozen =
self-maintaining checks (rvlib self-update) report only
sk checks the inventory: every check, where it runs, blocks or warns,
and how it caches. --fixable = what repairs itself,
with its owning doc [--json --md --out]
sk tui live dashboard: build steps + every other check + panels
the repo injects via repo.config tui.panels
sk asks human action queue: list · ask "<title>" · asks check (auto-close)
sk needs everything blocked on a human, red/yellow by collection
report-only, exit 0 always [--json]
sk wiki serve|lint — live md link-graph + orphan/dangling-ref lint
sk mv rename an md page + its sibling dir, sweeping every ref
sk assets serve|fill|add|gen|identity|check — the asset atelier
(declare kinds in .shipkit/assets/kit.ts, roll, curate, ship)
sk pb collection <name> — scaffold a PocketBase collection's UI
folder (columns/card/grid/form/index) from the app's
generated pb types, create-only [--dry-run]
sk smoke browser pass over a DEPLOYED web app, read only: login
through the app's own form, every route in repo.config
`smoke`, screenshots, console/network problems, the host
quota headers, a detail page per `open` link. Exit code =
failed routes. Needs playwright in the repo
[--base <url> --routes /a,/b]
sk serve the repo's ONE server: hub page, wikis, studio, status
sk reflect your prompts across every Claude Code session of a repo:
all config roots, queued-mid-run ones included, harness
noise out, chronological md corpus for a retrospective
[repo…] [--short --out <dir> --json]
sk init scaffold config + scripts, print the resolved floor
[--bin <cli.ts path> for in-repo-source consumers]
sk start ensure <root>/<name> + its CLAUDE.md include; prints the dirOutput is a stable line protocol — ok: / WARN / FAIL: / skip: with indented fix: pointers — exit 0/1. Greppable by humans, parseable by agents, --json where structure helps.
Release contracts
A venue contract is data: required files, exact PNG dimensions (header-parsed, no image dependency), glob minimums, required markdown sections. Enforcement is both ways — a declared venue with an incomplete folder fails, and an undeclared venue whose signals fire (deploy scripts, folders) fails too. exempt: { steam: "reason" } skips visibly. Wire venue deploys as deps: ['SK002'] and an incomplete folder physically blocks the upload.
Ship your own contracts via contracts: { extra: [defineContract({...})] } — see rvlib-shipkit/contracts for the rule vocabulary.
Library use
Everything the CLI does is importable: runChecks, evaluateContracts, the asks queue, scanMdGraph/lintMd/serveMdGraph, and the assets surface (defineKit/defineKind, identityKinds, studioRoutes, saveEndpoint via rvlib-shipkit/vite). Ships TypeScript source. Bun ≥ 1.0.
MIT
