@rness/cli 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +265 -11
- package/dist/bin/rness.js +1 -1
- package/dist/{chunk-LW4S5OLI.js → chunk-4VTYSPZW.js} +3590 -1381
- package/dist/chunk-4VTYSPZW.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-LW4S5OLI.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/fs.ts","../src/core/pm.ts","../src/core/auth.ts","../src/core/device-flow.ts","../src/core/github.ts","../src/core/github-oauth-provider.ts","../src/core/remote.ts","../src/core/git.ts","../src/core/manifest.ts","../src/core/repos.ts","../src/core/terminal.ts","../src/core/transport.ts","../src/core/style.ts","../src/core/workspace.ts","../src/report.ts","../src/version.ts","../src/core/block.ts","../src/core/frontmatter.ts","../src/core/collect.ts","../src/core/scope.ts","../src/core/context.ts","../src/core/merge.ts","../src/commands/sync.ts","../src/core/agent-targets.ts","../src/core/agents.ts","../src/core/json-guarantees.ts","../src/core/ask-agents.ts","../src/core/progress.ts","../src/core/ui.ts","../src/commands/add.ts","../src/commands/context.ts","../src/core/delegate.ts","../src/core/scaffold.ts","../src/core/scaffold-copy.ts","../src/commands/login.ts","../src/core/setup-git.ts","../src/commands/create.ts","../src/core/new-workspace.ts","../src/core/pinned.ts","../src/core/scaffold-git.ts","../src/core/sync-blocks.ts","../src/commands/create-blank.ts","../src/core/blocks.ts","../src/core/contract.ts","../src/commands/logout.ts","../src/commands/upgrade.ts","../src/core/check-workspace.ts","../src/commands/validate.ts","../src/cli.ts","../src/commands/git-credential.ts","../src/commands/hook.ts","../src/mcp/tools.ts","../src/core/documents.ts","../src/commands/mcp.ts","../src/mcp/protocol.ts","../src/commands/status.ts","../src/core/status.ts","../src/core/status-view.ts","../src/core/catch-up.ts"],"sourcesContent":["import {\n access,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from 'node:fs/promises'\nimport { basename, dirname, join } from 'node:path'\n\nexport async function exists(p: string): Promise<boolean> {\n try {\n await access(p)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * True when `p` is itself a symbolic link (the link is not followed). False\n * when it does not exist. Callers use it to leave a `CLAUDE.md → AGENTS.md`\n * link alone: reading follows the link and the atomic rename would replace it.\n */\nexport async function isSymlink(p: string): Promise<boolean> {\n try {\n return (await lstat(p)).isSymbolicLink()\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return false\n throw e\n }\n}\n\n/** File content, or null when the file does not exist; any other error propagates. */\nexport async function readOrNull(p: string): Promise<string | null> {\n try {\n return await readFile(p, 'utf8')\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return null\n throw e\n }\n}\n\nlet sequence = 0\n\n/** Write to a temporary file in the same directory, then rename over the target. */\nexport async function writeFileAtomic(p: string, text: string): Promise<void> {\n sequence += 1\n const tmp = join(dirname(p), `.${basename(p)}.${process.pid}.${sequence}.tmp`)\n await writeFile(tmp, text, 'utf8')\n try {\n await rename(tmp, p)\n } catch (e) {\n await rm(tmp, { force: true }).catch(() => undefined)\n throw e\n }\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\n\nconst execFileP = promisify(execFile)\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\nexport const PACKAGE_MANAGERS: readonly PackageManager[] = [\n 'npm',\n 'pnpm',\n 'yarn',\n 'bun',\n]\n\nexport function isPackageManager(value: string): value is PackageManager {\n return (PACKAGE_MANAGERS as readonly string[]).includes(value)\n}\n\n/** The manager that launched us (`npm_config_user_agent`: `pnpm/12.2.1 npm/? node/…`), else npm. */\nexport function detectPackageManager(\n userAgent: string = process.env['npm_config_user_agent'] ?? ''\n): PackageManager {\n const name = userAgent.split('/')[0] ?? ''\n return isPackageManager(name) ? name : 'npm'\n}\n\nfunction firstLine(text: string): string {\n return (\n text\n .split('\\n')\n .find((l) => l.trim() !== '')\n ?.trim() ?? 'unknown error'\n )\n}\n\nexport async function packageManagerVersion(\n pm: PackageManager\n): Promise<string> {\n try {\n const { stdout } = await execFileP(pm, ['--version'])\n return stdout.trim()\n } catch (e) {\n throw new Error(`${pm} is not available on PATH`, { cause: e })\n }\n}\n\n/**\n * The rness CLI run through `pm`, without a global install: what the next\n * steps of `create` are written with, so they work on the machine that ran it.\n * Inside a workspace the fetched copy hands over to the pinned one. Yarn 1 has\n * no `dlx`, and an unknown yarn may be one: npx comes with Node.\n */\nexport function rnessRunner(\n pm: PackageManager,\n version: string | null\n): string {\n if (pm === 'pnpm') return 'pnpm dlx @rness/cli'\n if (pm === 'bun') return 'bunx @rness/cli'\n if (pm === 'yarn' && Number(version?.split('.')[0]) >= 2)\n return 'yarn dlx @rness/cli'\n return 'npx @rness/cli'\n}\n\n/**\n * The rness command as the user can type it again, for every hint and next\n * step: launched through a package manager — npx, pnpm dlx, yarn dlx, bunx,\n * `pnpm create`, a package script, which all set `npm_config_user_agent` —\n * that manager's runner; else the `rness` they typed, a global install.\n */\nexport function rnessCommand(env: NodeJS.ProcessEnv = process.env): string {\n const agent = env['npm_config_user_agent'] ?? ''\n if (agent === '') return 'rness'\n const pm = detectPackageManager(agent)\n const [name, version] = (agent.split(' ')[0] ?? '').split('/')\n return rnessRunner(pm, name === pm ? (version ?? null) : null)\n}\n\nconst BARE_NPM_CODE = /^npm (error|ERR!) code \\S+$/\n\n/**\n * The line of a failed install worth showing. npm leads with its error code\n * (`npm error code ETARGET`) and says what is wrong on the next line\n * (`…No matching version found for @rness/cli@0.4.0.`): that one is kept. The\n * code is shown only when nothing follows it.\n */\nexport function installErrorLine(stderr: string): string {\n const lines = stderr\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l !== '')\n return lines.find((l) => !BARE_NPM_CODE.test(l)) ?? firstLine(stderr)\n}\n\nconst FROZEN: Record<PackageManager, readonly string[]> = {\n npm: ['ci'],\n pnpm: ['install', '--frozen-lockfile'],\n yarn: ['install', '--immutable'],\n bun: ['install', '--frozen-lockfile'],\n}\n\n/** The install that refuses to touch a committed lockfile (spec 0008 §4). */\nexport function frozenArgs(pm: PackageManager): string[] {\n return [...FROZEN[pm]]\n}\n\n/** `<pm> install` in `dir`; output is swallowed, failure is one line. */\nexport async function installDependencies(\n pm: PackageManager,\n dir: string,\n opts: { frozen?: boolean } = {}\n): Promise<void> {\n const args = opts.frozen === true ? frozenArgs(pm) : ['install']\n try {\n await execFileP(pm, args, { cwd: dir, maxBuffer: 16 * 1024 * 1024 })\n } catch (e) {\n const err = e as { stderr?: string; message: string }\n throw new Error(\n `${pm} ${args.join(' ')} failed in ${dir}: ${installErrorLine(err.stderr ?? err.message)}`,\n { cause: e }\n )\n }\n}\n","import { chmod, mkdir, open, readFile, rm, stat } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nimport {\n RefreshRejected,\n type TokenSet,\n refreshTokenSet,\n} from './device-flow.ts'\nimport { writeFileAtomic } from './fs.ts'\nimport { rnessCommand } from './pm.ts'\n\n// Where the GitHub login lives (spec 0004 §1): one file, readable by its\n// owner only. No keychain: that needs a native dependency.\n\nexport interface StoredLogin {\n login: string\n tokens: TokenSet\n}\n\n/** `$XDG_CONFIG_HOME/rness`, else `~/.config/rness`; `%APPDATA%\\rness` on Windows. */\nexport function configDir(): string {\n const xdg = process.env['XDG_CONFIG_HOME']\n if (xdg !== undefined && xdg !== '') return join(xdg, 'rness')\n const appData = process.env['APPDATA']\n if (process.platform === 'win32' && appData !== undefined && appData !== '')\n return join(appData, 'rness')\n return join(homedir(), '.config', 'rness')\n}\n\nconst authFile = (): string => join(configDir(), 'auth.json')\nconst lockFile = (): string => join(configDir(), 'auth.lock')\n\nfunction isTokenSet(v: unknown): v is TokenSet {\n if (v === null || typeof v !== 'object') return false\n const t = v as Record<string, unknown>\n return typeof t['accessToken'] === 'string' && t['accessToken'] !== ''\n}\n\nexport async function readAuth(): Promise<StoredLogin | null> {\n try {\n const parsed: unknown = JSON.parse(await readFile(authFile(), 'utf8'))\n const entry =\n parsed !== null && typeof parsed === 'object'\n ? (parsed as Record<string, unknown>)['github.com']\n : undefined\n if (entry === null || typeof entry !== 'object') return null\n const { login, tokens } = entry as Record<string, unknown>\n if (typeof login !== 'string' || !isTokenSet(tokens)) return null\n return {\n login,\n tokens: {\n accessToken: tokens.accessToken,\n expiresAt: tokens.expiresAt ?? null,\n refreshToken: tokens.refreshToken ?? null,\n refreshExpiresAt: tokens.refreshExpiresAt ?? null,\n scopes: tokens.scopes ?? '',\n },\n }\n } catch {\n return null\n }\n}\n\nexport async function writeAuth(login: StoredLogin): Promise<void> {\n const dir = configDir()\n await mkdir(dir, { recursive: true, mode: 0o700 })\n const file = authFile()\n await writeFileAtomic(\n file,\n `${JSON.stringify({ 'github.com': login }, null, 2)}\\n`\n )\n await chmod(file, 0o600)\n}\n\nexport async function clearAuth(): Promise<void> {\n await rm(authFile(), { force: true })\n}\n\nexport type TokenSource = 'GITHUB_TOKEN' | 'GH_TOKEN' | 'login'\n\nexport interface ResolvedToken {\n token: string\n source: TokenSource\n /** Known for a stored login only. */\n login: string | null\n}\n\n/** The token the environment provides, which wins over the stored login (CI, scripts). */\nexport function envToken(): ResolvedToken | null {\n for (const source of ['GITHUB_TOKEN', 'GH_TOKEN'] as const) {\n const token = process.env[source]\n if (token !== undefined && token !== '')\n return { token, source, login: null }\n }\n return null\n}\n\n/** Refresh when the access token has less than this left. */\nconst REFRESH_MARGIN_MS = 5 * 60_000\nconst LOCK_WAIT_MS = 10_000\nconst LOCK_STALE_MS = 30_000\n\nexport interface ResolveDeps {\n now?: () => number\n /** One line for the user when the login turns out to be over. */\n notify?: (line: string) => void\n}\n\nconst fresh = (tokens: TokenSet, now: number): boolean =>\n tokens.expiresAt === null || tokens.expiresAt - now > REFRESH_MARGIN_MS\n\n/**\n * Hold `auth.lock` while `work` runs. A refresh token is single-use and git\n * calls `rness git-credential` in parallel: two refreshes at once would\n * invalidate each other. Null when the lock could not be had in time.\n */\nasync function withLock<T>(work: () => Promise<T>): Promise<T | null> {\n await mkdir(configDir(), { recursive: true, mode: 0o700 })\n const file = lockFile()\n const deadline = Date.now() + LOCK_WAIT_MS\n for (;;) {\n try {\n const handle = await open(file, 'wx')\n await handle.close()\n break\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'EEXIST') throw e\n const age = await stat(file).then(\n (s) => Date.now() - s.mtimeMs,\n () => 0\n )\n if (age > LOCK_STALE_MS) await rm(file, { force: true })\n else if (Date.now() > deadline) return null\n else await new Promise<void>((r) => setTimeout(r, 50))\n }\n }\n try {\n return await work()\n } finally {\n await rm(file, { force: true })\n }\n}\n\n/**\n * The GitHub token to act with: `GITHUB_TOKEN`, then `GH_TOKEN`, then the\n * stored login — refreshed when it is about to expire. Null when there is\n * none. A network failure during the refresh never ends the login: an\n * offline `git pull` must not log anyone out.\n */\nexport async function resolveToken(\n deps: ResolveDeps = {}\n): Promise<ResolvedToken | null> {\n const env = envToken()\n if (env !== null) return env\n const now = deps.now ?? Date.now\n const stored = await readAuth()\n if (stored === null) return null\n const answer = (s: StoredLogin): ResolvedToken => ({\n token: s.tokens.accessToken,\n source: 'login',\n login: s.login,\n })\n if (fresh(stored.tokens, now())) return answer(stored)\n\n const refreshed = await withLock(async (): Promise<StoredLogin | null> => {\n // Another process may have renewed it while this one waited.\n const current = await readAuth()\n if (current === null) return null\n if (fresh(current.tokens, now())) return current\n if (current.tokens.refreshToken === null) return null\n try {\n const tokens = await refreshTokenSet(current.tokens.refreshToken, now)\n const next = { login: current.login, tokens }\n await writeAuth(next)\n return next\n } catch (e) {\n if (e instanceof RefreshRejected) {\n await clearAuth()\n ;(deps.notify ?? ((l) => process.stderr.write(`${l}\\n`)))(\n `your GitHub login expired; run ${rnessCommand()} login`\n )\n return null\n }\n // Offline: keep the login, and the token while it is still valid.\n const expiresAt = current.tokens.expiresAt\n return expiresAt !== null && expiresAt > now() ? current : null\n }\n })\n return refreshed === null ? null : answer(refreshed)\n}\n","// GitHub's OAuth device flow (spec 0004 §2): no client secret, no redirect,\n// and it works where there is no local browser. Refreshing a token obtained\n// this way needs no secret either (GitHub documentation, read 2026-09-19).\n\n/** The OAuth App \"Rness\" of the rness-dev organization. Public by nature. */\nconst GITHUB_CLIENT_ID = 'Ov23liv1ia2UWeWttsOK'\nconst GITHUB_WEB = 'https://github.com'\nexport const SCOPES = 'repo read:org'\n\nexport function clientId(): string {\n return process.env['RNESS_GITHUB_CLIENT_ID'] ?? GITHUB_CLIENT_ID\n}\n\n/** `https://github.com`; `RNESS_GITHUB_WEB` overrides it in tests. */\nexport function webBase(): string {\n return (process.env['RNESS_GITHUB_WEB'] ?? GITHUB_WEB).replace(/\\/+$/, '')\n}\n\nexport interface DeviceCode {\n deviceCode: string\n userCode: string\n verificationUri: string\n /** Seconds. */\n expiresIn: number\n interval: number\n}\n\nexport interface TokenSet {\n accessToken: string\n /** Epoch milliseconds; null for a token that does not expire. */\n expiresAt: number | null\n refreshToken: string | null\n refreshExpiresAt: number | null\n scopes: string\n}\n\n/** GitHub said no: the message is one line for the user. */\nexport class LoginError extends Error {}\n/** GitHub refused the refresh token: the login is over. Not a network error. */\nexport class RefreshRejected extends Error {}\n\nfunction reason(e: unknown): string {\n if (e instanceof Error) {\n return e.name === 'TimeoutError' ? 'timed out' : e.message\n }\n return String(e)\n}\n\nasync function post(\n path: string,\n params: Record<string, string>\n): Promise<Record<string, unknown>> {\n let res: Response\n try {\n res = await fetch(`${webBase()}${path}`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'rness-cli',\n },\n body: new URLSearchParams(params).toString(),\n signal: AbortSignal.timeout(15_000),\n })\n } catch (e) {\n throw new Error(`cannot reach github.com: ${reason(e)}`, { cause: e })\n }\n let body: unknown\n try {\n body = await res.json()\n } catch (e) {\n throw new Error(`github.com answered ${res.status} for ${path}`, {\n cause: e,\n })\n }\n if (body === null || typeof body !== 'object')\n throw new Error(`github.com answered an unexpected body for ${path}`)\n return body as Record<string, unknown>\n}\n\nconst str = (v: unknown): string | null => (typeof v === 'string' ? v : null)\nconst num = (v: unknown): number | null =>\n typeof v === 'number' && Number.isFinite(v) ? v : null\n\nfunction tokenSet(body: Record<string, unknown>, now: number): TokenSet | null {\n const accessToken = str(body['access_token'])\n if (accessToken === null) return null\n const expiresIn = num(body['expires_in'])\n const refreshIn = num(body['refresh_token_expires_in'])\n return {\n accessToken,\n expiresAt: expiresIn === null ? null : now + expiresIn * 1000,\n refreshToken: str(body['refresh_token']),\n refreshExpiresAt: refreshIn === null ? null : now + refreshIn * 1000,\n scopes: str(body['scope']) ?? '',\n }\n}\n\nexport async function requestDeviceCode(): Promise<DeviceCode> {\n const id = clientId()\n if (id === '')\n throw new LoginError(\n 'rness has no GitHub client ID yet; set RNESS_GITHUB_CLIENT_ID'\n )\n const body = await post('/login/device/code', {\n client_id: id,\n scope: SCOPES,\n })\n const deviceCode = str(body['device_code'])\n const userCode = str(body['user_code'])\n const verificationUri = str(body['verification_uri'])\n if (deviceCode === null || userCode === null || verificationUri === null) {\n const error = str(body['error'])\n throw new LoginError(\n error === 'device_flow_disabled'\n ? 'the device flow is not enabled on the rness GitHub app'\n : `github.com refused to start the login${error === null ? '' : ` (${error})`}`\n )\n }\n return {\n deviceCode,\n userCode,\n verificationUri,\n expiresIn: num(body['expires_in']) ?? 900,\n interval: num(body['interval']) ?? 5,\n }\n}\n\nexport interface PollDeps {\n sleep?: (ms: number) => Promise<void>\n now?: () => number\n}\n\n/** Ask every `interval` seconds until the user approved, refused, or the code expired. */\nexport async function pollForToken(\n code: DeviceCode,\n deps: PollDeps = {}\n): Promise<TokenSet> {\n const sleep =\n deps.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)))\n const now = deps.now ?? Date.now\n const deadline = now() + code.expiresIn * 1000\n let interval = code.interval\n for (;;) {\n await sleep(interval * 1000)\n const body = await post('/login/oauth/access_token', {\n client_id: clientId(),\n device_code: code.deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n })\n const tokens = tokenSet(body, now())\n if (tokens !== null) return tokens\n const error = str(body['error'])\n if (error === 'authorization_pending') {\n if (now() > deadline)\n throw new LoginError('the code expired before it was approved')\n continue\n }\n if (error === 'slow_down') {\n interval = (num(body['interval']) ?? interval) + 5\n continue\n }\n if (error === 'expired_token')\n throw new LoginError('the code expired before it was approved')\n if (error === 'access_denied')\n throw new LoginError('the login was cancelled on github.com')\n throw new LoginError(`github.com refused the login (${error ?? 'unknown'})`)\n }\n}\n\n/** A new token set for a refresh token. `RefreshRejected` when GitHub says the login is over. */\nexport async function refreshTokenSet(\n refreshToken: string,\n now: () => number = Date.now\n): Promise<TokenSet> {\n const body = await post('/login/oauth/access_token', {\n client_id: clientId(),\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n const tokens = tokenSet(body, now())\n if (tokens !== null) return tokens\n throw new RefreshRejected(str(body['error']) ?? 'refused')\n}\n","import { rnessCommand } from './pm.ts'\n\n/** The public GitHub REST API; `--github-api` overrides it in tests. */\nexport const DEFAULT_GITHUB_API = 'https://api.github.com'\n\n/** Guards against a server that always answers `rel=\"next\"`. */\nexport const MAX_PAGES = 50\nexport const PER_PAGE = 100\n\nconst addLater = (): string =>\n `; add repositories later with ${rnessCommand()} add <repo>`\n\nexport interface OrgRepository {\n name: string\n private: boolean\n archived: boolean\n}\n\nexport interface RepositoryListing {\n repositories: OrgRepository[]\n /**\n * Which endpoint answered. `/users/<name>/repos` lists a personal account's\n * public repositories only, whatever the token; `self` is `/user/repos`, the\n * logged-in user's own account, private repositories included.\n */\n owner: 'org' | 'user' | 'self'\n /** `MAX_PAGES` stopped the listing while GitHub still announced a next page. */\n truncated: boolean\n}\n\nexport interface ListRepositoriesOptions {\n /** Sent as `Authorization: Bearer <token>` when given; without it only public repositories are listed. */\n token?: string | undefined\n apiBase?: string\n /** Per request. */\n timeoutMs?: number\n /**\n * The login the token belongs to, asked only when `owner` turns out not to\n * be an organization: its own account is listed through `/user/repos`.\n */\n self?: () => Promise<string | null>\n}\n\nconst NEXT = /<[^>]*>\\s*;\\s*rel=\"next\"/\n\nfunction isRepository(value: unknown): value is OrgRepository {\n if (value === null || typeof value !== 'object') return false\n const r = value as Record<string, unknown>\n return (\n typeof r['name'] === 'string' &&\n typeof r['private'] === 'boolean' &&\n typeof r['archived'] === 'boolean'\n )\n}\n\nfunction reason(e: unknown): string {\n // undici reports every network failure as `TypeError: fetch failed`; the\n // useful part (ECONNREFUSED, ENOTFOUND, …) is its cause.\n if (e instanceof Error && e.cause instanceof Error) return e.cause.message\n return e instanceof Error ? e.message : String(e)\n}\n\ninterface Page {\n status: number\n headers: Headers\n body: unknown\n}\n\nasync function getPage(\n url: string,\n headers: Record<string, string>,\n timeoutMs: number\n): Promise<Page> {\n const signal = AbortSignal.timeout(timeoutMs)\n let res: Response\n try {\n res = await fetch(url, { headers, signal })\n } catch (e) {\n throw new Error(`cannot reach the GitHub API: ${reason(e)}`, { cause: e })\n }\n if (!res.ok) {\n // Drain the body so the connection is released; its content is not used.\n await res.body?.cancel().catch(() => undefined)\n return { status: res.status, headers: res.headers, body: undefined }\n }\n let text: string\n try {\n text = await res.text()\n } catch (e) {\n throw new Error(`cannot reach the GitHub API: ${reason(e)}`, { cause: e })\n }\n try {\n return { status: res.status, headers: res.headers, body: JSON.parse(text) }\n } catch (e) {\n throw new Error(\n `GitHub API answered invalid JSON for ${new URL(url).pathname}`,\n { cause: e }\n )\n }\n}\n\nfunction httpError(page: Page, path: string): Error {\n const cause = { status: page.status, path }\n if (page.status === 401)\n return new Error('GitHub rejected the token (401)', { cause })\n // GitHub signals a primary rate limit with 403 and no remaining requests,\n // a secondary one with 403 or 429 and `retry-after`.\n if (\n page.status === 429 ||\n (page.status === 403 &&\n (page.headers.get('x-ratelimit-remaining') === '0' ||\n page.headers.has('retry-after')))\n ) {\n return new Error(\n `GitHub API rate limit reached; set GITHUB_TOKEN or add repositories later with ${rnessCommand()} add`,\n { cause }\n )\n }\n return new Error(\n `GitHub API answered ${page.status} for ${path}${addLater()}`,\n { cause }\n )\n}\n\n/**\n * Every repository of the organization `owner` — or, when GitHub knows no\n * such organization, the public ones of the personal account — following the\n * `Link` header page by page, up to `MAX_PAGES`. Errors are one line, each\n * with its `cause`.\n */\nexport async function listRepositories(\n owner: string,\n options: ListRepositoriesOptions\n): Promise<RepositoryListing> {\n const base = (options.apiBase ?? DEFAULT_GITHUB_API).replace(/\\/+$/, '')\n const timeoutMs = options.timeoutMs ?? 15_000\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'rness-cli',\n }\n if (options.token !== undefined && options.token !== '')\n headers['Authorization'] = `Bearer ${options.token}`\n\n const encoded = encodeURIComponent(owner)\n interface Kind {\n path: string\n query: string\n owner: RepositoryListing['owner']\n }\n const ORG: Kind = {\n path: `/orgs/${encoded}/repos`,\n query: 'type=all',\n owner: 'org',\n }\n const USER: Kind = {\n path: `/users/${encoded}/repos`,\n query: 'type=owner',\n owner: 'user',\n }\n const SELF: Kind = {\n path: '/user/repos',\n query: 'affiliation=owner',\n owner: 'self',\n }\n const url = (k: Kind, n: number): string =>\n `${base}${k.path}?${k.query}&per_page=${PER_PAGE}&page=${n}`\n let kind: Kind = ORG\n const repositories: OrgRepository[] = []\n for (let n = 1; n <= MAX_PAGES; n++) {\n let page = await getPage(url(kind, n), headers, timeoutMs)\n if (n === 1 && page.status === 404) {\n // Not an organization: a personal account answers on /users instead.\n const self = (await options.self?.()) ?? null\n kind = self?.toLowerCase() === owner.toLowerCase() ? SELF : USER\n page = await getPage(url(kind, n), headers, timeoutMs)\n if (page.status === 404) {\n throw new Error(\n `GitHub has no organization or user named \"${owner}\" (or it is not visible to you)${addLater()}`,\n { cause: { status: 404, path: kind.path } }\n )\n }\n }\n if (page.status < 200 || page.status >= 300)\n throw httpError(page, kind.path)\n if (!Array.isArray(page.body) || !page.body.every(isRepository)) {\n throw new Error(\n `GitHub API answered an unexpected body for ${kind.path}`,\n {\n cause: page.body,\n }\n )\n }\n for (const r of page.body)\n repositories.push({\n name: r.name,\n private: r.private,\n archived: r.archived,\n })\n if (!NEXT.test(page.headers.get('link') ?? ''))\n return {\n repositories,\n owner: kind.owner,\n truncated: false,\n }\n }\n return {\n repositories,\n owner: kind.owner,\n truncated: true,\n }\n}\n\nexport interface ApiOptions {\n token: string\n apiBase?: string\n timeoutMs?: number\n}\n\nfunction apiHeaders(token: string): Record<string, string> {\n return {\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'rness-cli',\n Authorization: `Bearer ${token}`,\n }\n}\n\n/** One authenticated GET whose error body is kept: GitHub explains a 403 there. */\nasync function getJson(\n path: string,\n options: ApiOptions\n): Promise<{ status: number; body: unknown }> {\n const base = (options.apiBase ?? DEFAULT_GITHUB_API).replace(/\\/+$/, '')\n let res: Response\n try {\n res = await fetch(`${base}${path}`, {\n headers: apiHeaders(options.token),\n signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),\n })\n } catch (e) {\n throw new Error(`cannot reach the GitHub API: ${reason(e)}`, { cause: e })\n }\n const body: unknown = await res.json().catch(() => undefined)\n return { status: res.status, body }\n}\n\n/** The login a token belongs to. */\nexport async function getUser(options: ApiOptions): Promise<{ login: string }> {\n const { status, body } = await getJson('/user', options)\n if (status === 401) throw new Error('GitHub rejected the token (401)')\n const login =\n body !== null && typeof body === 'object'\n ? (body as Record<string, unknown>)['login']\n : undefined\n if (status !== 200 || typeof login !== 'string')\n throw new Error(`GitHub API answered ${status} for /user`)\n return { login }\n}\n\n/** The organizations the token's user belongs to (`read:org`), first page of 100. */\nexport async function listUserOrganizations(\n options: ApiOptions\n): Promise<string[]> {\n const { status, body } = await getJson(\n `/user/orgs?per_page=${PER_PAGE}`,\n options\n )\n if (status !== 200 || !Array.isArray(body))\n throw new Error(`GitHub API answered ${status} for /user/orgs`)\n return body\n .map((o: unknown) =>\n o !== null && typeof o === 'object'\n ? (o as Record<string, unknown>)['login']\n : undefined\n )\n .filter((l): l is string => typeof l === 'string')\n}\n\nexport type OrgMembership = 'member' | 'not-member' | 'restricted' | 'unknown'\n\n/**\n * The user's standing in `org`. `restricted`: the organization limits OAuth\n * apps and has not approved this one, so its private repositories are hidden\n * from the token — GitHub says so in the body of a 403.\n */\nexport async function getOrgMembership(\n org: string,\n options: ApiOptions\n): Promise<OrgMembership> {\n const { status, body } = await getJson(\n `/user/memberships/orgs/${encodeURIComponent(org)}`,\n options\n )\n if (status === 200) {\n const state =\n body !== null && typeof body === 'object'\n ? (body as Record<string, unknown>)['state']\n : undefined\n return state === 'active' ? 'member' : 'not-member'\n }\n if (status === 404) return 'not-member'\n if (status === 403) {\n const message =\n body !== null && typeof body === 'object'\n ? String((body as Record<string, unknown>)['message'] ?? '')\n : ''\n if (/OAuth App access restrictions/i.test(message)) return 'restricted'\n }\n return 'unknown'\n}\n\nexport type CreateRepositoryResult =\n | { kind: 'created' }\n /** GitHub said the name is taken (422). */\n | { kind: 'exists' }\n /** Not allowed, in GitHub's words. */\n | { kind: 'refused'; reason: string }\n\n/**\n * Create the private repository `owner/name`: in the organization `owner`,\n * or — when GitHub knows no such organization and `owner` is the token's own\n * account (`self`) — under the user.\n */\nexport async function createRepository(\n owner: string,\n name: string,\n options: ApiOptions & { self?: string | null }\n): Promise<CreateRepositoryResult> {\n const base = (options.apiBase ?? DEFAULT_GITHUB_API).replace(/\\/+$/, '')\n const post = async (\n path: string\n ): Promise<{ status: number; message: string }> => {\n let res: Response\n try {\n res = await fetch(`${base}${path}`, {\n method: 'POST',\n headers: {\n ...apiHeaders(options.token),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name, private: true }),\n signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),\n })\n } catch (e) {\n throw new Error(`cannot reach the GitHub API: ${reason(e)}`, { cause: e })\n }\n const body: unknown = await res.json().catch(() => undefined)\n const message =\n body !== null && typeof body === 'object'\n ? String((body as Record<string, unknown>)['message'] ?? '')\n : ''\n return { status: res.status, message }\n }\n let answer = await post(`/orgs/${encodeURIComponent(owner)}/repos`)\n if (\n answer.status === 404 &&\n options.self !== undefined &&\n options.self !== null &&\n options.self.toLowerCase() === owner.toLowerCase()\n )\n answer = await post('/user/repos')\n if (answer.status === 201) return { kind: 'created' }\n if (answer.status === 422) return { kind: 'exists' }\n return {\n kind: 'refused',\n reason:\n answer.message === ''\n ? `GitHub answered ${answer.status}`\n : `${answer.message} (${answer.status})`,\n }\n}\n","import { type ResolvedToken, resolveToken } from './auth.ts'\nimport {\n type CreateRepositoryResult,\n type RepositoryListing,\n createRepository,\n getOrgMembership,\n getUser,\n listRepositories,\n listUserOrganizations,\n} from './github.ts'\nimport type {\n GitCredentials,\n GitProvider,\n Organization,\n OrganizationAccess,\n} from './provider.ts'\n\nconst GITHUB_HTTPS = 'https://github.com/'\n\n/**\n * GitHub as a user: the token of `GITHUB_TOKEN`, `GH_TOKEN` or `rness login`\n * — or none, and then it is GitHub seen anonymously (public repositories).\n */\nexport class GitHubOAuthProvider implements GitProvider {\n readonly #token: ResolvedToken | null\n readonly #apiBase: string | undefined\n #login: Promise<{ login: string } | null> | undefined\n\n get authenticated(): boolean {\n return this.#token !== null\n }\n\n constructor(options: { token: ResolvedToken | null; apiBase?: string }) {\n this.#token = options.token\n this.#apiBase = options.apiBase\n }\n\n #api(token: string): { token: string; apiBase?: string } {\n return this.#apiBase === undefined\n ? { token }\n : { token, apiBase: this.#apiBase }\n }\n\n identity(): Promise<{ login: string } | null> {\n this.#login ??= (async () => {\n const t = this.#token\n if (t === null) return null\n // A stored login knows its name; an environment token has to be asked.\n if (t.login !== null) return { login: t.login }\n try {\n return await getUser(this.#api(t.token))\n } catch {\n return null\n }\n })()\n return this.#login\n }\n\n async listOrganizations(): Promise<Organization[]> {\n if (this.#token === null) return []\n const logins = await listUserOrganizations(this.#api(this.#token.token))\n return logins.map((login) => ({ login }))\n }\n\n async organizationAccess(org: string): Promise<OrganizationAccess> {\n if (this.#token === null) return 'unknown'\n try {\n return await getOrgMembership(org, this.#api(this.#token.token))\n } catch {\n return 'unknown'\n }\n }\n\n async listRepositories(owner: string): Promise<RepositoryListing> {\n return listRepositories(owner, {\n token: this.#token?.token,\n ...(this.#apiBase === undefined ? {} : { apiBase: this.#apiBase }),\n self: async () => (await this.identity())?.login ?? null,\n })\n }\n\n async createRepository(\n owner: string,\n name: string\n ): Promise<CreateRepositoryResult> {\n if (this.#token === null)\n return { kind: 'refused', reason: 'not logged in' }\n return createRepository(owner, name, {\n ...this.#api(this.#token.token),\n self: (await this.identity())?.login ?? null,\n })\n }\n\n credentialsFor(url: string): GitCredentials | null {\n if (this.#token === null || !url.startsWith(GITHUB_HTTPS)) return null\n return { username: 'x-access-token', password: this.#token.token }\n }\n}\n\n/** The CLI's provider: whatever token this machine has, against `apiBase`. */\nexport async function githubProvider(apiBase?: string): Promise<GitProvider> {\n return new GitHubOAuthProvider({\n token: await resolveToken(),\n ...(apiBase === undefined ? {} : { apiBase }),\n })\n}\n","import { spawn } from 'node:child_process'\n\nimport { positional, withCredentials } from './git.ts'\nimport type { GitCredentials } from './provider.ts'\n\nexport const DEFAULT_HOST = 'https://github.com/'\nexport const SSH_HOST = 'git@github.com:'\n\n/** `<host><org>/<repo>.git`; `host` ends with `/` (https, file) or `:` (ssh). */\nexport function repoUrl(host: string, org: string, repo: string): string {\n return `${host}${org}/${repo}.git`\n}\n\nexport type Probe =\n { kind: 'found' } | { kind: 'not-found' } | { kind: 'error'; message: string }\n\nconst AUTH = [\n /authentication failed/i,\n /permission denied/i,\n /could not read username/i,\n /terminal prompts disabled/i,\n]\nconst NOT_FOUND = [\n /repository .*not found/i,\n /does not appear to be a git repository/i,\n]\n\nfunction firstLine(text: string): string {\n return (\n text\n .split('\\n')\n .find((l) => l.trim() !== '')\n ?.trim() ?? 'unknown error'\n )\n}\n\n/**\n * Interpret `git ls-remote --exit-code <url> HEAD`. Auth patterns win over\n * not-found ones: GitHub tells strangers a private repository does not exist,\n * so \"not found\" only counts when nothing points at a credentials problem.\n * Exit 2 is \"no HEAD\" — an empty repository that does exist.\n */\nexport function classifyProbe(\n url: string,\n exitCode: number,\n stderr: string\n): Probe {\n if (exitCode === 0 || exitCode === 2) return { kind: 'found' }\n if (AUTH.some((r) => r.test(stderr)))\n return {\n kind: 'error',\n message: `cannot access ${url}: ${firstLine(stderr)}`,\n }\n if (NOT_FOUND.some((r) => r.test(stderr))) return { kind: 'not-found' }\n return { kind: 'error', message: `cannot reach ${url}: ${firstLine(stderr)}` }\n}\n\n/**\n * How long, after the child has exited, the stderr pipe may still deliver what\n * git wrote before exiting. `'exit'` can precede the last `'data'` event, and\n * an empty stderr would be classified as an unreachable remote — but a\n * grandchild (a credential helper) can hold the pipe open for as long as it\n * likes, so the wait is bounded and `'close'` is never awaited.\n */\nconst STDERR_FLUSH_MS = 200\n\n/**\n * `git ls-remote --exit-code <url> HEAD`, classified (see `classifyProbe`).\n * Never hangs: the child is killed after `timeoutMs`, and the answer never\n * waits on `'close'`, so a credential helper left holding the stderr pipe\n * cannot keep the caller pending. The child stays in this process's group so\n * that Ctrl-C in the terminal reaches it too.\n */\nexport async function probeRemote(\n url: string,\n timeoutMs = 60_000,\n credentials?: GitCredentials | null\n): Promise<Probe> {\n // Before anything spawns, and outside the promise: a url git would read as\n // an option must fail loudly rather than reach the command line.\n positional(url, 'repository url')\n return new Promise<Probe>((resolve) => {\n const auth = withCredentials(credentials)\n const child = spawn(\n 'git',\n [...auth.args, 'ls-remote', '--exit-code', url, 'HEAD'],\n {\n stdio: ['ignore', 'ignore', 'pipe'],\n env: { ...process.env, ...auth.env, GIT_TERMINAL_PROMPT: '0' },\n }\n )\n const chunks: string[] = []\n child.stderr?.setEncoding('utf8')\n child.stderr?.on('data', (chunk: string) => chunks.push(chunk))\n\n let settled = false\n const settle = (probe: Probe): void => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n // Release the pipe: a grandchild still holding it open would otherwise\n // keep the event loop alive long after the answer is known.\n child.stderr?.destroy()\n resolve(probe)\n }\n const timer = setTimeout(() => {\n // Only the child git itself: a grandchild it orphaned is harmless, and\n // killing a whole process group would mean detaching from ours, which\n // costs the terminal's Ctrl-C.\n child.kill('SIGKILL')\n settle({\n kind: 'error',\n message: `cannot reach ${url}: timed out after ${Math.round(timeoutMs / 1000)}s`,\n })\n }, timeoutMs)\n\n child.on('error', (e: Error) => settle(classifyProbe(url, 1, e.message)))\n child.on('exit', (code) => {\n const finish = (): void =>\n settle(classifyProbe(url, code ?? 1, chunks.join('')))\n const stderr = child.stderr\n if (stderr === null || stderr.readableEnded || stderr.destroyed)\n return finish()\n const flush = setTimeout(finish, STDERR_FLUSH_MS)\n const done = (): void => {\n clearTimeout(flush)\n finish()\n }\n stderr.once('end', done)\n stderr.once('error', done)\n })\n })\n}\n","import { execFile } from 'node:child_process'\nimport { dirname, resolve } from 'node:path'\nimport { promisify } from 'node:util'\n\nimport type { GitCredentials } from './provider.ts'\n\nconst execFileP = promisify(execFile)\n\n// Answers git's `get` with what the environment holds. The token is never in\n// an argument, a URL or a config file: only in the child's environment.\nconst ENV_HELPER =\n '!f() { test \"$1\" = get && printf \"username=%s\\\\npassword=%s\\\\n\" \"$RNESS_GIT_USERNAME\" \"$RNESS_GIT_TOKEN\"; }; f'\n\n/**\n * How one git command is given credentials (spec 0004 §4): the helpers git\n * would otherwise consult are cleared, and one that lives for this command\n * only reads the child's environment. Nothing when there are none.\n */\nexport function withCredentials(\n credentials: GitCredentials | null | undefined\n): {\n args: string[]\n env: Record<string, string>\n} {\n if (credentials === null || credentials === undefined)\n return { args: [], env: {} }\n return {\n args: ['-c', 'credential.helper=', '-c', `credential.helper=${ENV_HELPER}`],\n env: {\n RNESS_GIT_USERNAME: credentials.username,\n RNESS_GIT_TOKEN: credentials.password,\n },\n }\n}\n\nasync function git(\n args: readonly string[],\n cwd?: string,\n credentials?: GitCredentials | null\n): Promise<string> {\n const auth = withCredentials(credentials)\n try {\n const { stdout } = await execFileP('git', [...auth.args, ...args], {\n ...(cwd === undefined ? {} : { cwd }),\n env: {\n ...process.env,\n ...auth.env,\n GIT_TERMINAL_PROMPT: '0',\n // Pin the command to `cwd` itself: without a ceiling, git walks up and\n // a plain directory under `org/` would report — or be pulled into —\n // whatever repository happens to sit above the workspace root. git\n // ignores a relative ceiling entry, hence the resolve().\n ...(cwd === undefined\n ? {}\n : { GIT_CEILING_DIRECTORIES: dirname(resolve(cwd)) }),\n },\n maxBuffer: 16 * 1024 * 1024,\n })\n return stdout\n } catch (e) {\n const err = e as { stderr?: string; message?: string }\n const text =\n err.stderr !== undefined && err.stderr !== ''\n ? err.stderr\n : (err.message ?? 'unknown error')\n const first =\n text.split('\\n').find((l) => l.trim() !== '') ?? 'unknown error'\n throw new Error(`git ${args[0] ?? ''} failed: ${first.trim()}`, {\n cause: e,\n })\n }\n}\n\n/** Reject a value git could parse as an option (e.g. a `rness.json` URL starting with `-`). */\nexport function positional(value: string, what: string): string {\n if (value.startsWith('-'))\n throw new Error(`refusing suspicious ${what}: ${value}`)\n return value\n}\n\n/** `git clone <url> <dir>`; `dir` must not exist. */\nexport async function clone(\n url: string,\n dir: string,\n credentials?: GitCredentials | null\n): Promise<void> {\n await git(\n [\n 'clone',\n '--quiet',\n '--',\n positional(url, 'repository url'),\n positional(dir, 'directory'),\n ],\n undefined,\n credentials\n )\n}\n\n/**\n * True when `git status --porcelain` prints nothing, ignoring the paths in\n * `ignore` (rness-managed files such as `AGENTS.md`/`CLAUDE.md` that sync\n * itself writes into every clone and that should never veto an auto-pull).\n */\nexport async function isClean(\n dir: string,\n ignore: readonly string[] = []\n): Promise<boolean> {\n const pathspec = ignore.map((p) => `:!${p}`)\n return (\n (\n await git(\n [\n 'status',\n '--porcelain',\n // Every untracked file on its own line: a directory folded into one\n // `?? dir/` entry would slip past a pathspec naming a file inside it.\n '--untracked-files=all',\n ...(pathspec.length > 0 ? ['--', ...pathspec] : []),\n ],\n dir\n )\n ).trim() === ''\n )\n}\n\n/**\n * Which of `paths` differ from `HEAD` in `dir` — modified, added or untracked\n * (ignored ones are not). Paths relative to `dir`, in git's order.\n */\nexport async function changedPaths(\n dir: string,\n paths: readonly string[]\n): Promise<string[]> {\n if (paths.length === 0) return []\n const entries = (\n await git(\n ['status', '--porcelain', '-z', '--untracked-files=all', '--', ...paths],\n dir\n )\n ).split('\\0')\n const changed: string[] = []\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i] ?? ''\n if (entry.length < 4) continue\n changed.push(entry.slice(3))\n // A rename or copy is followed by its source path.\n if (entry[0] === 'R' || entry[0] === 'C') i++\n }\n return changed\n}\n\nexport async function pullFastForward(\n dir: string,\n credentials?: GitCredentials | null\n): Promise<void> {\n await git(['pull', '--ff-only', '--quiet'], dir, credentials)\n}\n\n/** `git remote add origin <url>` then `git push -u origin main`, in `dir`. */\nexport async function publish(\n dir: string,\n url: string,\n credentials?: GitCredentials | null\n): Promise<void> {\n await git(['remote', 'add', 'origin', positional(url, 'repository url')], dir)\n await git(['push', '--quiet', '-u', 'origin', 'main'], dir, credentials)\n}\n\n/** The `origin` URL, or null when `dir` is not a clone with an origin. */\nexport async function originUrl(dir: string): Promise<string | null> {\n try {\n return (await git(['remote', 'get-url', 'origin'], dir)).trim()\n } catch {\n return null\n }\n}\n\n/** `git init -q -b main <dir>` (the directory must exist). */\nexport async function init(dir: string): Promise<void> {\n await git(['init', '-q', '-b', 'main'], dir)\n}\n\n/** `git add -A && git commit -q -m <message>` in `dir`. */\nexport async function commitAll(dir: string, message: string): Promise<void> {\n await git(['add', '-A'], dir)\n await git(['commit', '-q', '-m', message], dir)\n}\n","import { readFile } from 'node:fs/promises'\nimport { basename, join } from 'node:path'\n\nimport { writeFileAtomic } from './fs.ts'\nimport { repoUrl } from './remote.ts'\nimport type { Manifest, RepoEntry, ScopeEntry } from './types.ts'\n\n/**\n * A repository or scope name: what GitHub allows in a repository name, in\n * lowercase — letters, digits, `.`, `_` and `-`. Not `.` or `..` (the name is\n * a directory under `org/`), and no leading `-` (git would read an option).\n */\nexport const NAME = /^(?!\\.{1,2}$)[a-z0-9._][a-z0-9._-]*$/\n\n/**\n * The organization's context repository. It holds the catalogue and is cloned\n * as `<root>/.rness`, so it is never a member of the workspace it defines:\n * `create` does not offer it and `add` refuses it (spec 0009).\n */\nexport const CONTEXT_REPO = '.rness'\n\n/**\n * Names that are never a repository of the workspace, whatever they look like\n * (spec 0009). A leading dot is an ordinary first character — `.github`\n * carries an organization's profile, its templates and its shared workflows —\n * so the rule cannot be a shape: it is this list. Add a name here rather than\n * inventing another filter.\n *\n * - `.rness` — the context repository: it holds the catalogue and is already\n * cloned as `<root>/.rness`.\n * - `.git` — a git directory, were `org/` ever to sit inside a repository.\n * - `node_modules` — an install run one directory too high.\n */\nexport const EXCLUDED_NAMES: ReadonlySet<string> = new Set([\n CONTEXT_REPO,\n '.git',\n 'node_modules',\n])\n\n/**\n * Whether a repository of the organization can become a member of the\n * workspace. Everything active is, but an excluded name; an archived\n * repository is read-only on GitHub, so a block written into it could never be\n * pushed back. `create` filters its listing with this, and counts with it, so\n * the number it announces and the list it offers cannot disagree.\n */\nexport function isMemberRepo(repo: {\n name: string\n archived: boolean\n}): boolean {\n return !repo.archived && !EXCLUDED_NAMES.has(repo.name.toLowerCase())\n}\n\n/**\n * Whether a directory under `org/` is one of the workspace's clones. It must\n * be a name the catalogue could hold: a directory `rness add` could never\n * declare is not reported as an undeclared clone, since the command suggested\n * to bring it in would refuse it.\n */\nexport function isWorkspaceClone(name: string): boolean {\n return NAME.test(name) && !EXCLUDED_NAMES.has(name)\n}\n/** How the rule reads in an error message. */\nexport const NAME_RULE =\n \"lowercase letters, digits, '.', '_' and '-', not starting with '-'\"\n\n/**\n * A GitHub organization (or user) name: alphanumerics and single hyphens, not\n * at either end, at most 39 characters. Used exactly as typed — GitHub\n * resolves names case-insensitively, but the URLs and `rness.json` keep the\n * spelling the user chose.\n */\nexport const ORG_NAME = /^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/\n\n/** Every top-level key contract 1 defines. */\nconst KEYS = ['contract', 'org', 'agents', 'repos', 'scopes']\n\nfunction fail(message: string): never {\n throw new Error(`rness.json: ${message}`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction checkPath(scope: string, path: unknown): string {\n if (typeof path !== 'string' || path === '')\n fail(`scope \"${scope}\" needs a string \"path\"`)\n if (path.startsWith('/')) fail(`scope \"${scope}\" path must be relative`)\n if (path.split('/').includes('..'))\n fail(`scope \"${scope}\" path must not contain \"..\"`)\n if (path.split('/').some((segment) => segment === ''))\n fail(`scope \"${scope}\" path must not contain empty segments`)\n return path\n}\n\nfunction readOrg(value: unknown): string | null {\n if (value === undefined || value === null) return null\n if (typeof value !== 'string' || !ORG_NAME.test(value)) {\n fail(\n `\"org\" must be a GitHub organization name (got ${JSON.stringify(value)})`\n )\n }\n return value\n}\n\n/**\n * The name the workspace goes by — in its blocks and its session titles: the\n * organization, else the root directory's name. A workspace without `org` is\n * a blank one (spec 0012), a normal state rather than a slip to warn about.\n */\nexport function workspaceName(manifest: Manifest, root: string): string {\n return manifest.org ?? basename(root)\n}\n\n/** An agent name as `agents` holds it: lowercase letters, digits and `-`. */\nconst AGENT_NAME = /^[a-z][a-z0-9-]*$/\n\n/** `agents`, when present: a list of unique agent names (spec 0011 §3.1). */\nfunction readAgents(value: unknown): string[] | null {\n if (value === undefined) return null\n if (\n !Array.isArray(value) ||\n !value.every((v) => typeof v === 'string' && AGENT_NAME.test(v)) ||\n new Set(value).size !== value.length\n )\n fail(\n `\"agents\" must be a list of unique agent names (got ${JSON.stringify(value)})`\n )\n return [...(value as string[])]\n}\n\nfunction readRepos(value: unknown): Record<string, RepoEntry> {\n const raw = value ?? {}\n if (!isRecord(raw)) fail('\"repos\" must be an object')\n const repos: Record<string, RepoEntry> = {}\n for (const [name, entry] of Object.entries(raw)) {\n if (!NAME.test(name))\n fail(`repo name \"${name}\" may only contain ${NAME_RULE}`)\n if (!isRecord(entry) || typeof entry.url !== 'string')\n fail(`repo \"${name}\" needs a string \"url\"`)\n repos[name] = { url: entry.url }\n }\n return repos\n}\n\nfunction readScopes(value: unknown): Record<string, ScopeEntry> {\n const raw = value ?? {}\n if (!isRecord(raw)) fail('\"scopes\" must be an object')\n const scopes: Record<string, ScopeEntry> = {}\n for (const [name, entry] of Object.entries(raw)) {\n if (!NAME.test(name))\n fail(`scope name \"${name}\" may only contain ${NAME_RULE}`)\n if (!isRecord(entry)) fail(`scope \"${name}\" must be an object`)\n const path = checkPath(name, entry.path)\n const ext = entry.extends ?? []\n if (!Array.isArray(ext) || !ext.every((t) => typeof t === 'string')) {\n fail(`scope \"${name}\" extends must be an array of scope names`)\n }\n scopes[name] = { path, extends: ext as string[] }\n }\n for (const [name, entry] of Object.entries(scopes)) {\n for (const target of entry.extends) {\n if (!Object.hasOwn(scopes, target))\n fail(`scope \"${name}\" extends unknown scope \"${target}\"`)\n }\n }\n return scopes\n}\n\n/** Read and validate `<rnessDir>/rness.json`. Every error starts with `rness.json:`. */\nexport async function loadManifest(rnessDir: string): Promise<Manifest> {\n let raw: string\n try {\n raw = await readFile(join(rnessDir, 'rness.json'), 'utf8')\n } catch {\n fail('not found')\n }\n let data: unknown\n try {\n data = JSON.parse(raw)\n } catch (e) {\n fail(`invalid JSON (${e instanceof Error ? e.message : String(e)})`)\n }\n if (!isRecord(data)) fail('must be a JSON object')\n if (data.contract !== 1)\n fail(`unsupported contract: ${JSON.stringify(data.contract)} (expected 1)`)\n // Refuse what this contract does not define: a typo (`scope`, `repo`) or a\n // key from a later contract would otherwise be read as nothing at all.\n for (const key of Object.keys(data)) {\n if (!KEYS.includes(key)) fail(`unknown key ${JSON.stringify(key)}`)\n }\n return {\n contract: 1,\n org: readOrg(data.org),\n agents: readAgents(data.agents),\n repos: readRepos(data.repos),\n scopes: readScopes(data.scopes),\n }\n}\n\n/** Serialise in the contract's key order; atomic write. */\nexport async function writeManifest(\n rnessDir: string,\n manifest: Manifest\n): Promise<void> {\n const repos = Object.entries(manifest.repos).map(\n ([name, r]) =>\n ` ${JSON.stringify(name)}: { \"url\": ${JSON.stringify(r.url)} }`\n )\n const scopes = Object.entries(manifest.scopes).map(([name, s]) => {\n const ext =\n s.extends.length === 0\n ? ''\n : `, \"extends\": [${s.extends.map((e) => JSON.stringify(e)).join(', ')}]`\n return ` ${JSON.stringify(name)}: { \"path\": ${JSON.stringify(s.path)}${ext} }`\n })\n const lines = ['{', ' \"contract\": 1,']\n if (manifest.org !== null)\n lines.push(` \"org\": ${JSON.stringify(manifest.org)},`)\n if (manifest.agents !== null)\n lines.push(\n ` \"agents\": [${manifest.agents.map((a) => JSON.stringify(a)).join(', ')}],`\n )\n lines.push(\n ' \"repos\": {',\n repos.join(',\\n'),\n ' },',\n ' \"scopes\": {',\n scopes.join(',\\n'),\n ' }',\n '}'\n )\n const text = `${lines.filter((l) => l !== '').join('\\n')}\\n`\n await writeFileAtomic(join(rnessDir, 'rness.json'), text)\n}\n\nconst FULL_URL = /^(https?:\\/\\/|git@|ssh:\\/\\/|file:\\/\\/)/\n\n/** `web` → `<host><org>/web.git`; `other/api` → `<host>other/api.git`; a full URL is kept. */\nexport function parseRepoSpec(\n spec: string,\n org: string | null,\n host: string\n): { name: string; url: string } {\n let url: string\n if (FULL_URL.test(spec)) {\n url = spec\n } else {\n const parts = spec.split('/')\n if (parts.length === 1) {\n // A blank workspace has no owner to expand a bare name with (spec 0012).\n if (org === null)\n throw new Error(\n 'this workspace has no GitHub organization: give <owner>/<repo> or a git URL'\n )\n url = repoUrl(host, org, spec)\n } else if (\n parts.length === 2 &&\n parts[0] !== undefined &&\n parts[1] !== undefined\n )\n url = repoUrl(host, parts[0], parts[1])\n else\n throw new Error(\n `repository name \"${spec}\" is not a name (use <repo>, <owner>/<repo>, or a URL)`\n )\n }\n const last = url.replace(/\\/+$/, '').split(/[/:]/).at(-1) ?? ''\n const name = last.endsWith('.git') ? last.slice(0, -4) : last\n if (!NAME.test(name))\n throw new Error(`repository name \"${name}\" may only contain ${NAME_RULE}`)\n return { name, url }\n}\n","import { glob, readFile, rm } from 'node:fs/promises'\nimport { join, posix, sep } from 'node:path'\n\nimport { exists } from './fs.ts'\nimport { clone, originUrl } from './git.ts'\nimport { NAME, NAME_RULE, parseRepoSpec, writeManifest } from './manifest.ts'\nimport type { GitCredentials } from './provider.ts'\nimport type { Manifest, ScopeEntry } from './types.ts'\n\nexport interface AddRepositoryInput {\n root: string\n rnessDir: string\n manifest: Manifest\n /** `<repo>`, `<owner>/<repo>`, or a clone URL. */\n spec: string\n /** The owner of a bare `<repo>`; null in a blank workspace, which refuses one. */\n org: string | null\n host: string\n /** Sub-scopes relative to the repository (`apps/web`); each becomes scope `<basename>` extending `<repo>`. */\n scopes: readonly string[]\n /** HTTPS credentials for the URL the spec resolves to, when there are any. */\n credentialsFor?: (url: string) => GitCredentials | null\n}\n\nexport interface AddRepositoryResult {\n manifest: Manifest\n name: string\n url: string\n action: 'cloned' | 'adopted'\n /** Scope names written to the manifest, repository scope first. */\n declared: string[]\n}\n\n/** Clone (or adopt) a repository under `org/` and declare it — manifest written last (spec 0003 §3). */\nexport async function addRepository(\n input: AddRepositoryInput\n): Promise<AddRepositoryResult> {\n const { name, url } = parseRepoSpec(input.spec, input.org, input.host)\n const dir = join(input.root, 'org', name)\n\n // Validate every scope before touching the filesystem: a malformed request\n // must never leave a clone behind that the manifest doesn't know about. Only\n // the per-sub directory-existence check needs the clone (or adoption) to have\n // happened, so it waits until after.\n const repoPath = `org/${name}`\n // The repository scope gets the same protection as a sub-scope: a name\n // already taken by another path is a collision, not something to overwrite.\n // At the same path the entry keeps its `extends` — a hand-added shared\n // parent scope survives every later `add` of the repository.\n const current = input.manifest.scopes[name]\n if (current !== undefined && current.path !== repoPath)\n throw new Error(`scope \"${name}\" already points at ${current.path}`)\n const scopes: Record<string, ScopeEntry> = {\n ...input.manifest.scopes,\n [name]: { path: repoPath, extends: current?.extends ?? [] },\n }\n const subs: { path: string; base: string }[] = []\n for (const sub of input.scopes) {\n const clean = sub.replace(/^\\/+|\\/+$/g, '')\n const segments = clean.split('/')\n if (segments.some((s) => s === '' || s === '.' || s === '..'))\n throw new Error(\n `sub-scope \"${clean}\" must be a relative path inside the repository`\n )\n const base = segments.at(-1) ?? ''\n const path = `org/${name}/${clean}`\n if (!NAME.test(base))\n throw new Error(\n `the last segment of sub-scope \"${clean}\" may only contain ${NAME_RULE}`\n )\n const existing = scopes[base]\n if (existing !== undefined && existing.path !== path)\n throw new Error(`scope \"${base}\" already points at ${existing.path}`)\n scopes[base] = { path, extends: [name] }\n subs.push({ path, base })\n }\n\n let action: AddRepositoryResult['action']\n if (await exists(dir)) {\n const origin = await originUrl(dir)\n if (origin === null)\n throw new Error(`org/${name} exists and is not a git clone`)\n if (origin !== url)\n throw new Error(`org/${name} is a clone of ${origin}, not ${url}`)\n action = 'adopted'\n } else {\n await clone(url, dir, input.credentialsFor?.(url) ?? null)\n action = 'cloned'\n }\n\n const declared = [name]\n for (const { path, base } of subs) {\n if (!(await exists(join(input.root, ...path.split('/'))))) {\n // Only a clone this call just made is ours to remove: it isn't in the\n // manifest yet, so nothing is lost. An adopted directory predates this\n // call and is left alone.\n if (action === 'cloned') await rm(dir, { recursive: true, force: true })\n throw new Error(`${path} does not exist`)\n }\n declared.push(base)\n }\n\n const manifest: Manifest = {\n ...input.manifest,\n repos: { ...input.manifest.repos, [name]: { url } },\n scopes,\n }\n await writeManifest(input.rnessDir, manifest)\n return { manifest, name, url, action, declared }\n}\n\n/** Directories matched by `package.json#workspaces` that hold a `package.json`, POSIX-relative, sorted. */\nexport async function workspaceDirs(repoDir: string): Promise<string[]> {\n let patterns: string[] = []\n try {\n const pkg = JSON.parse(\n await readFile(join(repoDir, 'package.json'), 'utf8')\n ) as { workspaces?: unknown }\n const w = pkg.workspaces\n if (Array.isArray(w))\n patterns = w.filter((p): p is string => typeof p === 'string')\n else if (\n w !== null &&\n typeof w === 'object' &&\n Array.isArray((w as { packages?: unknown }).packages)\n ) {\n patterns = (w as { packages: unknown[] }).packages.filter(\n (p): p is string => typeof p === 'string'\n )\n }\n } catch {\n return []\n }\n const dirs = new Set<string>()\n for (const pattern of patterns) {\n for await (const match of glob(pattern, { cwd: repoDir })) {\n const rel = match.split(sep).join(posix.sep)\n if (await exists(join(repoDir, ...rel.split(posix.sep), 'package.json')))\n dirs.add(rel)\n }\n }\n return [...dirs].sort()\n}\n","import type {\n autocompleteMultiselect,\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n multiselect,\n note,\n outro,\n select,\n spinner,\n text,\n} from '@clack/prompts'\n\n/** The `@clack/prompts` functions the interactive commands use. */\nexport interface Prompts {\n text: typeof text\n confirm: typeof confirm\n multiselect: typeof multiselect\n select: typeof select\n autocompleteMultiselect: typeof autocompleteMultiselect\n isCancel: typeof isCancel\n // The session look (spec 0007 §5b). Optional: a scripted terminal in a\n // test has prompts only, and gets the plain look.\n intro?: typeof intro\n outro?: typeof outro\n cancel?: typeof cancel\n note?: typeof note\n log?: typeof log\n spinner?: typeof spinner\n}\n\n/** What an interactive command needs from the terminal; tests replace it with scripted answers. */\nexport interface Terminal {\n isTty(): boolean\n prompts(): Promise<Prompts>\n}\n\nexport const defaultTerminal: Terminal = {\n isTty: () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n // Lazy: the prompt library stays off every non-interactive path.\n prompts: () => import('@clack/prompts'),\n}\n","import { spawn } from 'node:child_process'\n\nimport { rnessCommand } from './pm.ts'\nimport { DEFAULT_HOST, SSH_HOST } from './remote.ts'\nimport { status } from './style.ts'\n\n/** The two bases a github.com URL can be written with (spec 0005). */\nexport interface Hosts {\n ssh: string\n https: string\n}\n\nexport const GITHUB_HOSTS: Hosts = { ssh: SSH_HOST, https: DEFAULT_HOST }\n\nexport type SshAccess =\n { ok: true; login: string } | { ok: false; reason: string }\n\nexport type DetectSsh = (opts: { interactive: boolean }) => Promise<SshAccess>\n\n/** What a command needs to choose between SSH and HTTPS; tests replace it. */\nexport interface Transport {\n hosts: Hosts\n detect: DetectSsh\n}\n\nconst GREETING = /^Hi ([^!\\s]+)! You've successfully authenticated/m\n\n/** The login in GitHub's `Hi <login>! You've successfully authenticated…`, or null. */\nexport function parseSshGreeting(stderr: string): string | null {\n return GREETING.exec(stderr)?.[1] ?? null\n}\n\nfunction firstLine(text: string): string | null {\n return (\n text\n .split('\\n')\n .find((l) => l.trim() !== '')\n ?.trim() ?? null\n )\n}\n\n/** As in `probeRemote`: what the pipe may still deliver after `'exit'`. */\nconst STDERR_FLUSH_MS = 200\n\n/**\n * `ssh -T git@github.com`: does github.com accept one of the user's keys?\n * GitHub greets an accepted key and exits 1, so the greeting — not the exit\n * code — is the answer.\n *\n * In a terminal `ssh` may ask for a key's passphrase or confirm github.com's\n * host key; it asks on `/dev/tty`, not on stderr, so stderr stays piped and\n * the greeting is still read. Without a terminal `BatchMode=yes` forbids\n * every prompt. Never throws and never hangs: the child is killed at the\n * deadline, and the answer never waits on `'close'`.\n */\nexport async function detectGithubSsh(opts: {\n interactive: boolean\n /** Tests: a fake executable, called by path. */\n command?: string\n timeoutMs?: number\n}): Promise<SshAccess> {\n const timeoutMs = opts.timeoutMs ?? (opts.interactive ? 120_000 : 10_000)\n const args = [\n '-T',\n '-o',\n 'ConnectTimeout=5',\n ...(opts.interactive ? [] : ['-o', 'BatchMode=yes']),\n 'git@github.com',\n ]\n return new Promise<SshAccess>((resolve) => {\n const child = spawn(opts.command ?? 'ssh', args, {\n stdio: [opts.interactive ? 'inherit' : 'ignore', 'ignore', 'pipe'],\n })\n const chunks: string[] = []\n child.stderr?.setEncoding('utf8')\n child.stderr?.on('data', (chunk: string) => chunks.push(chunk))\n\n let settled = false\n const settle = (access: SshAccess): void => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n child.stderr?.destroy()\n resolve(access)\n }\n const timer = setTimeout(() => {\n child.kill('SIGKILL')\n settle({ ok: false, reason: `timed out after ${timeoutMs / 1000}s` })\n }, timeoutMs)\n\n child.on('error', (e: Error) => settle({ ok: false, reason: e.message }))\n child.on('exit', (code) => {\n const finish = (): void => {\n const stderr = chunks.join('')\n const login = parseSshGreeting(stderr)\n settle(\n login !== null\n ? { ok: true, login }\n : {\n ok: false,\n reason:\n firstLine(stderr) ?? `ssh exited with code ${code ?? '?'}`,\n }\n )\n }\n const stderr = child.stderr\n if (stderr === null || stderr.readableEnded || stderr.destroyed)\n return finish()\n const flush = setTimeout(finish, STDERR_FLUSH_MS)\n const done = (): void => {\n clearTimeout(flush)\n finish()\n }\n stderr.once('end', done)\n stderr.once('error', done)\n })\n })\n}\n\nexport const defaultTransport: Transport = {\n hosts: GITHUB_HOSTS,\n detect: detectGithubSsh,\n}\n\nexport interface SshTest {\n access: SshAccess\n /** SSH works without asking anything: git over SSH will not prompt either. */\n unattended: boolean\n}\n\n/**\n * The SSH test, unattended first (`BatchMode=yes`): when that passes, ssh\n * never asks anything and a progress line may animate while git runs. Only\n * when it fails, and in a terminal, the test runs again letting ssh ask for a\n * passphrase — `announce` says so first.\n */\nexport async function testGithubSsh(\n transport: Transport,\n interactive: boolean,\n announce: () => void\n): Promise<SshTest> {\n const batch = await transport.detect({ interactive: false })\n if (batch.ok || !interactive) return { access: batch, unattended: batch.ok }\n announce()\n return {\n access: await transport.detect({ interactive: true }),\n unattended: false,\n }\n}\n\nconst loggedInAs = (login?: string | null): string =>\n login === undefined || login === null ? '' : `, logged in as ${login}`\n\n/** The outcome of the SSH test as a sentence, for the session look. */\nexport function usingSentence(\n access: SshAccess,\n login?: string | null\n): string {\n return access.ok\n ? `SSH works for github.com (as ${access.login}) — repositories are cloned over SSH`\n : `No SSH access to github.com (${access.reason}) — repositories are cloned over HTTPS${loggedInAs(login)}`\n}\n\n/** Is `url` written with the SSH base? */\nexport function isSshUrl(url: string, hosts: Hosts): boolean {\n return url.startsWith(hosts.ssh)\n}\n\n/** Printed in a terminal before the test, which may ask for a passphrase. */\nexport const CHECKING_LINE = status('checking', 'ssh access to github.com…')\n/** The same as `[verb, rest, sentence]`, for a `Ui`. */\nexport const CHECKING = [\n 'checking',\n 'ssh access to github.com…',\n 'Checking SSH access to github.com — ssh may ask for your passphrase',\n] as const\n\n/** `login`: who rness is logged in as, which is what makes HTTPS reach private repositories. */\nexport function usingRest(access: SshAccess, login?: string | null): string {\n return access.ok\n ? `ssh (github.com as ${access.login})`\n : `https (ssh to github.com unavailable: ${access.reason}${loggedInAs(login)})`\n}\n\nexport function usingLine(access: SshAccess, login?: string | null): string {\n return status('using', usingRest(access, login))\n}\n\n/** Why an SSH workspace cannot be served, and how to fix it. */\n/**\n * A child's `git clone` failed on publickey although the parent's own SSH test\n * passed: the key works but no agent holds it, so git's `ssh` asks again in\n * every child (spec 0008 §2.1).\n */\nexport function agentHintLines(\n platform: NodeJS.Platform = process.platform\n): string[] {\n const mac = platform === 'darwin'\n return [\n 'your key works but is not loaded; ssh asks again in every child:',\n ` ssh-add ${mac ? '--apple-use-keychain ' : ''}~/.ssh/id_ed25519`,\n ` ~/.ssh/config: AddKeysToAgent yes${mac ? ', UseKeychain yes' : ''}`,\n ]\n}\n\nexport function sshWorkspaceLines(reason: string): [string, string] {\n return [\n `this workspace clones over SSH (rness.json) but ssh to github.com fails: ${reason}`,\n 'set up an SSH key: https://docs.github.com/authentication/connecting-to-github-with-ssh',\n ]\n}\n\n/** The user-side escape hatch where `rness.json` is not negotiable. */\nexport const INSTEAD_OF_LINES: [string, string] = [\n 'or make git use HTTPS for github.com on this machine:',\n ' git config --global url.\"https://github.com/\".insteadOf git@github.com:',\n]\n\nexport function httpsFlagLine(spec: string): string {\n return `or clone this repository over HTTPS: ${rnessCommand()} add ${spec} --https`\n}\n","import { styleText } from 'node:util'\n\n// The CLI's look (spec 0007). This module imports `node:util` only, so the\n// lean commands (`context`, `validate`) can use it. Whether a stream gets\n// colour is `util.styleText`'s decision: a terminal, unless NO_COLOR; any\n// stream with FORCE_COLOR. Off a terminal every function returns plain text —\n// the bytes scripts, CI and the tests have always read.\n\nexport type Tone = 'done' | 'idle' | 'info' | 'warn' | 'error'\n\ntype Format = Parameters<typeof styleText>[0]\n\nconst FORMAT: Record<Tone, Format> = {\n done: 'green',\n idle: 'dim',\n info: 'cyan',\n warn: 'yellow',\n error: 'red',\n}\n\n/** https://no-color.org: any non-empty value; FORCE_COLOR, being explicit, wins. */\nfunction noColor(): boolean {\n const off = process.env['NO_COLOR']\n return (\n off !== undefined && off !== '' && process.env['FORCE_COLOR'] === undefined\n )\n}\n\nexport function paint(\n tone: Tone,\n text: string,\n stream: NodeJS.WriteStream = process.stdout\n): string {\n if (noColor()) return text\n return styleText(FORMAT[tone], text, { stream, validateStream: true })\n}\n\nconst IDLE = new Set(['unchanged', 'skipped', 'not cloned', 'current'])\nconst DONE = new Set([\n 'created',\n 'cloned',\n 'adopted',\n 'declared',\n 'installed',\n 'committed',\n 'updated',\n 'upgraded',\n 'pulled',\n 'pushed',\n 'logged in',\n 'logged out',\n 'synced',\n 'listed',\n])\n\n/** What a status verb says about the step: it changed something, it did not, or it is progress. */\nexport function toneOf(verb: string): Tone {\n if (DONE.has(verb)) return 'done'\n if (IDLE.has(verb)) return 'idle'\n if (verb === 'stale') return 'warn'\n return 'info'\n}\n\n/** The width verbs are padded to; a longer verb (`unchanged`) takes its own. */\nconst COLUMN = 8\n\n/**\n * One status line: the verb painted by its tone and padded to the column,\n * then `rest`, untouched — a path stays readable on any background.\n */\nexport function status(\n verb: string,\n rest: string,\n stream: NodeJS.WriteStream = process.stdout\n): string {\n const pad = ' '.repeat(Math.max(0, COLUMN - verb.length))\n return `${paint(toneOf(verb), verb, stream)}${pad} ${rest}`\n}\n\nexport function bold(\n text: string,\n stream: NodeJS.WriteStream = process.stdout\n): string {\n if (noColor()) return text\n return styleText('bold', text, { stream, validateStream: true })\n}\n\n/**\n * Backgrounds for a badge. `intro` opens a session; the others close one, so\n * the verdict is legible at a glance without reading the words.\n */\nconst BACKGROUND: Record<BadgeTone, Format> = {\n intro: ['bgCyan', 'black', 'bold'],\n done: ['bgGreen', 'black', 'bold'],\n idle: ['bgCyan', 'black', 'bold'],\n info: ['bgCyan', 'black', 'bold'],\n warn: ['bgYellow', 'black', 'bold'],\n error: ['bgRed', 'white', 'bold'],\n}\n\nexport type BadgeTone = Tone | 'intro'\n\n/**\n * Text on a coloured background — the intro of a session, or its verdict.\n * Without colour it is the bare text: padding only makes sense around a\n * background.\n */\nexport function badge(\n text: string,\n tone: BadgeTone | NodeJS.WriteStream = 'intro',\n stream: NodeJS.WriteStream = process.stdout\n): string {\n // The stream used to be the second argument; callers that pass one still\n // get the intro badge they asked for before tones existed.\n const [t, s] =\n typeof tone === 'string'\n ? ([tone, stream] as const)\n : (['intro', tone] as const)\n if (noColor()) return text\n const padded = ` ${text} `\n const painted = styleText(BACKGROUND[t], padded, {\n stream: s,\n validateStream: true,\n })\n return painted === padded ? text : painted\n}\n\n/**\n * Reverse video, for what is selected: the active tab of `rness status`.\n * Without colour, brackets in place of the text's first and last characters\n * — spaces by convention — so the width is kept.\n */\nexport function inverse(\n text: string,\n stream: NodeJS.WriteStream = process.stdout\n): string {\n const plain = `[${text.slice(1, -1)}]`\n if (noColor()) return plain\n const painted = styleText('inverse', text, { stream, validateStream: true })\n return painted === text ? plain : painted\n}\n\n/** Grey, for what is read after the rest: a box of next steps. */\nexport function grey(\n text: string,\n stream: NodeJS.WriteStream = process.stdout\n): string {\n if (noColor()) return text\n return styleText('gray', text, { stream, validateStream: true })\n}\n\n/**\n * Can this terminal draw characters beyond ASCII? The rule `@clack/prompts`\n * follows for its own symbols: everywhere but the Linux console and the\n * legacy Windows console.\n */\nexport function unicode(): boolean {\n if (process.platform !== 'win32') return process.env['TERM'] !== 'linux'\n return (\n process.env['WT_SESSION'] !== undefined ||\n process.env['TERM_PROGRAM'] === 'vscode'\n )\n}\n\n/** A private repository, said with a padlock; a public one says nothing. */\nexport const PRIVATE_MARK = '🔒'\n\n/** `warning: …` for stderr, the prefix painted. */\nexport function warn(text: string): string {\n return `${paint('warn', 'warning:', process.stderr)} ${text}`\n}\n\n// `rness`, rendered once with cfonts' \"tiny\" font and kept as a constant: one\n// fixed word does not need a font engine at run time.\nconst WORD = [' █▀█ █▄ █ █▀▀ █▀▀ █▀▀', ' █▀▄ █ ▀█ ██▄ ▄▄█ ▄▄█']\n\nconst FROM = [63, 185, 80] as const // green\nconst TO = [57, 197, 207] as const // cyan\n\n/**\n * The only hand-written escape sequences of the code base: `util.styleText`\n * has no 24-bit colour. A left-to-right gradient, one colour per column.\n */\nfunction gradient(line: string): string {\n const chars = [...line]\n const last = Math.max(1, chars.length - 1)\n const painted = chars.map((ch, i) => {\n if (ch === ' ') return ch\n const [r, g, b] = FROM.map((from, c) =>\n Math.round(from + (((TO[c] ?? from) - from) * i) / last)\n )\n return `\\x1b[38;2;${r};${g};${b}m${ch}`\n })\n return `${painted.join('')}\\x1b[39m`\n}\n\n/**\n * The banner, or `''` where it has no place: a pipe, a file, CI. Shown on a\n * terminal (and with FORCE_COLOR); the gradient only where the terminal says\n * it has true colour, plain green otherwise, no colour under NO_COLOR.\n */\nexport function banner(\n version: string,\n stream: NodeJS.WriteStream = process.stdout\n): string {\n const forced =\n process.env['FORCE_COLOR'] !== undefined &&\n process.env['FORCE_COLOR'] !== '0'\n if (stream.isTTY !== true && !forced) return ''\n const coloured = paint('done', 'x', stream) !== 'x'\n const trueColour =\n coloured &&\n typeof stream.hasColors === 'function' &&\n stream.hasColors(2 ** 24)\n const word = WORD.map((line) =>\n trueColour ? gradient(line) : paint('done', line, stream)\n )\n return [\n '',\n ...word,\n '',\n ` ${bold(`rness v${version}`, stream)}`,\n ` ${paint('idle', 'Context for AI coding agents, across an organization’s repositories', stream)}`,\n '',\n '',\n ].join('\\n')\n}\n","import { readdir } from 'node:fs/promises'\nimport { dirname, join, parse, resolve } from 'node:path'\n\nimport { exists } from './fs.ts'\nimport { isWorkspaceClone } from './manifest.ts'\nimport type { Workspace } from './types.ts'\n\n/** Walk up from `startDir`: a directory holding `.rness/rness.json` is the root. Only when none exists anywhere above does a directory that itself holds `rness.json` count — a standalone checkout of the context repository (CI): that directory is `.rness/`, its parent the root. */\nexport async function findWorkspace(startDir: string): Promise<Workspace> {\n const start = resolve(startDir)\n const { root: fsRoot } = parse(start)\n const ancestors: string[] = []\n for (let dir = start; ; dir = dirname(dir)) {\n ancestors.push(dir)\n if (dir === fsRoot) break\n }\n for (const dir of ancestors) {\n if (await exists(join(dir, '.rness', 'rness.json')))\n return { root: dir, rnessDir: join(dir, '.rness') }\n }\n for (const dir of ancestors) {\n if (await exists(join(dir, 'rness.json')))\n return { root: dirname(dir), rnessDir: dir }\n }\n throw new Error(`no rness workspace found above ${startDir}`)\n}\n\n/** The repositories cloned under `<root>/org`, by name (spec 0009 §3). */\nexport async function clonesIn(root: string): Promise<Set<string>> {\n try {\n const entries = await readdir(join(root, 'org'), { withFileTypes: true })\n return new Set(\n entries\n .filter((e) => e.isDirectory() && isWorkspaceClone(e.name))\n .map((e) => e.name)\n )\n } catch {\n return new Set()\n }\n}\n","import { paint } from './core/style.ts'\n\n/**\n * Shared CLI error contract: one line on stderr, and — only under\n * `RNESS_DEBUG=1` — the stack trace instead of the plain message (the stack\n * already starts with `Error: <message>`, so printing both would repeat it).\n */\nexport function reportError(e: unknown): number {\n const debug = process.env['RNESS_DEBUG'] === '1'\n if (debug && e instanceof Error && e.stack) {\n process.stderr.write(`${e.stack}\\n`)\n } else {\n const message = e instanceof Error ? e.message : String(e)\n process.stderr.write(`${paint('error', message, process.stderr)}\\n`)\n }\n return 1\n}\n","// Single source of the package version. test/version.test.ts keeps it equal\n// to package.json; bump both together.\nexport const VERSION = '0.11.0'\n","import { createHash } from 'node:crypto'\n\nimport type { Context } from './types.ts'\n\nexport const BEGIN = '<!-- BEGIN rness -->'\nexport const END = '<!-- END rness -->'\n/** Blocks above this size are written with a warning (spec 0003 §4.2). */\nexport const BLOCK_SIZE_WARNING = 32 * 1024\n\nexport interface BlockInput {\n /** Scope name, or null for the workspace-root global block. */\n scope: string | null\n org: string\n /** Path segments between the scope directory and the workspace root (`org/web` → 2; root → 0). */\n depth: number\n context: Context\n}\n\nexport interface RenderedBlock {\n /** The whole block, LF line endings, no trailing newline. */\n text: string\n hash: string\n bytes: number\n}\n\nexport interface BlockHeader {\n /** The CLI version a 0.2–0.4 header named; null for the current form. */\n version: string | null\n scope: string\n hash: string\n}\n\n// The header names no CLI version (spec 0006 §1): nothing read it, and it\n// made every upgrade rewrite every block. The 0.2–0.4 form still parses, so a\n// block written by an older CLI stays current as long as its hash is.\nconst HEADER =\n /^<!-- rness (?:(\\S+) )?· scope: (\\S+) · contract: 1 · hash: ([0-9a-f]{12}) · generated: run `rness sync`, never edit inside this block -->$/\n\nfunction toLf(s: string): string {\n return s.replace(/\\r\\n?/g, '\\n')\n}\n\n/** SHA-256 of the LF-normalised body, first 12 hex characters. */\nexport function blockHash(body: string): string {\n return createHash('sha256')\n .update(toLf(body), 'utf8')\n .digest('hex')\n .slice(0, 12)\n}\n\nfunction intro(scope: string | null, org: string, depth: number): string {\n if (scope === null) {\n return [\n `This is the root of rness workspace \\`${org}\\`. Full context lives in \\`.rness/\\` —`,\n 'start at its `AGENTS.md`, then task-relevant `adr/`, `specs/`, `plans/`; live: `rness context`.',\n 'Every `org/<repo>/` carries its own block with the rules that apply there.',\n ].join('\\n')\n }\n const rel = `${'../'.repeat(depth)}.rness/`\n return [\n `This directory is scope \\`${scope}\\` of rness workspace \\`${org}\\`. Full context lives in`,\n `\\`${rel}\\` — start at its \\`AGENTS.md\\`, then task-relevant \\`adr/\\`, \\`specs/\\`, \\`plans/\\`;`,\n `live: \\`rness context --scope ${scope}\\`. If \\`.rness/\\` is not reachable, this is a`,\n 'standalone clone: the rules below are all you have.',\n ].join('\\n')\n}\n\nfunction header(scope: string | null, hash: string): string {\n return `<!-- rness · scope: ${scope ?? 'global'} · contract: 1 · hash: ${hash} · generated: run \\`rness sync\\`, never edit inside this block -->`\n}\n\n/** Render the block for one scope (or the root) from an already resolved context. */\nexport function renderBlock({\n scope,\n org,\n depth,\n context,\n}: BlockInput): RenderedBlock {\n const standards =\n context.collections.find((c) => c.name === 'standards')?.files ?? []\n const rules =\n standards.length === 0\n ? ['_No standards apply to this scope yet._']\n : standards.map(\n (f) => `<!-- rness: standards/${f.rel} -->\\n${toLf(f.content).trim()}`\n )\n const body = `${intro(scope, org, depth)}\\n\\n## Rules\\n${rules.join('\\n\\n')}`\n const hash = blockHash(body)\n const text = [BEGIN, header(scope, hash), body, END].join('\\n')\n return { text, hash, bytes: Buffer.byteLength(text, 'utf8') }\n}\n\n/** Parse the header line of a block; null when the line is not a rness header. */\nexport function parseHeader(line: string): BlockHeader | null {\n const m = HEADER.exec(line.trimEnd())\n if (m === null) return null\n return { version: m[1] ?? null, scope: m[2] ?? '', hash: m[3] ?? '' }\n}\n\n/** The hashed body of a block given its lines (BEGIN, header, body…, END). */\nexport function bodyOf(blockLines: string[]): string {\n return blockLines.slice(2, -1).join('\\n')\n}\n\n/**\n * Is this block (BEGIN, header, body…, END) what a fresh render would write?\n * By hash, never by text: the header's hash is the fresh one, and the body\n * still hashes to it — a hand edit inside the block breaks the second half.\n */\nexport function isCurrentBlock(\n blockLines: string[],\n freshHash: string\n): boolean {\n const header = parseHeader(blockLines[1] ?? '')\n return (\n header !== null &&\n header.hash === freshHash &&\n blockHash(bodyOf(blockLines)) === freshHash\n )\n}\n","import { parse } from 'yaml'\n\nimport type { Fields } from './types.ts'\n\n// The inner group is optional so that `---\\n---\\n` (an empty block with no line\n// between the fences) is still recognised as front matter.\nconst FRONT_MATTER = /^---\\r?\\n(?:([\\s\\S]*?)\\r?\\n)?---(?:\\r?\\n|$)/\n\nfunction fail(message: string): never {\n throw new Error(`front matter: ${message}`)\n}\n\n/** Strip a leading UTF-8 BOM so `---` is still recognised as the first thing in the file. */\nfunction stripBom(source: string): string {\n return source.startsWith('') ? source.slice(1) : source\n}\n\n/**\n * Parse the leading `---` block as YAML (1.2 core schema: `2026-09-07` stays a\n * string, `1` becomes a number). Returns null when there is no block, `{}`\n * for an empty block, and throws a `front matter:`-prefixed error when the\n * YAML is invalid or is not a mapping.\n */\nexport function parseFrontMatter(source: string): Fields | null {\n const match = stripBom(source).match(FRONT_MATTER)\n if (match === null) return null\n const block = match[1] ?? ''\n if (block.trim() === '') return {}\n let doc: unknown\n try {\n // 'error': suppress the printed YAMLWarning (e.g. an unresolved `!!tag`)\n // without silencing real parse errors — `logLevel: 'silent'` would do that too.\n doc = parse(block, { logLevel: 'error' })\n } catch (e) {\n fail(\n e instanceof Error\n ? (e.message.split('\\n')[0] ?? 'invalid YAML').replace(/:$/, '')\n : 'invalid YAML'\n )\n }\n if (doc === null || doc === undefined) return {}\n if (typeof doc !== 'object' || Array.isArray(doc))\n fail('block must be a mapping of keys to values')\n return doc as Fields\n}\n\n/**\n * The document text with its leading `---` block removed, along with the blank\n * lines that separated it from the body. Purely textual: a block whose YAML is\n * invalid is still stripped, so a broken file never leaks `---` fences into a\n * rendered block. Returns the (BOM-stripped) source unchanged when there is no\n * front matter.\n */\nexport function stripFrontMatter(source: string): string {\n const text = stripBom(source)\n const match = text.match(FRONT_MATTER)\n if (match === null) return text\n return text.slice(match[0].length).replace(/^(?:[ \\t]*\\r?\\n)+/, '')\n}\n\nexport function extractTitle(source: string): string | null {\n return (\n stripBom(source)\n .match(/^# (.+)$/m)?.[1]\n ?.trim() ?? null\n )\n}\n","import { glob, readFile } from 'node:fs/promises'\nimport { join, posix, sep } from 'node:path'\n\nimport {\n extractTitle,\n parseFrontMatter,\n stripFrontMatter,\n} from './frontmatter.ts'\nimport type { MarkdownItem } from './types.ts'\n\nfunction toPosix(rel: string): string {\n return rel.split(sep).join(posix.sep)\n}\n\n/**\n * Every `*.md` under `dir`, recursively, sorted by `rel`. A missing directory\n * yields []. A file whose front matter fails to parse is kept with\n * `fields: null` and the error in `fieldsError`, so one broken file cannot\n * hide a whole collection.\n */\nexport async function collectMarkdown(dir: string): Promise<MarkdownItem[]> {\n const rels: string[] = []\n for await (const rel of glob('**/*.md', { cwd: dir })) rels.push(toPosix(rel))\n const items = await Promise.all(\n rels.map(async (rel): Promise<MarkdownItem> => {\n const path = join(dir, ...rel.split(posix.sep))\n const body = await readFile(path, 'utf8')\n let fields: MarkdownItem['fields'] = null\n let fieldsError: string | null = null\n try {\n fields = parseFrontMatter(body)\n } catch (e) {\n fieldsError = e instanceof Error ? e.message : String(e)\n }\n return {\n path,\n rel,\n fields,\n fieldsError,\n title: extractTitle(body),\n body,\n content: stripFrontMatter(body),\n }\n })\n )\n return items.sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0))\n}\n","import type { Manifest } from './types.ts'\n\nfunction isPrefix(prefix: string, target: string): boolean {\n return prefix === target || target.startsWith(`${prefix}/`)\n}\n\n/** The scope whose `path` is the longest path-segment prefix of `relDir`; null = global. */\nexport function resolveScope(\n manifest: Manifest,\n relDir: string\n): string | null {\n let best: string | null = null\n let bestLen = -1\n for (const [name, entry] of Object.entries(manifest.scopes)) {\n if (isPrefix(entry.path, relDir) && entry.path.length > bestLen) {\n best = name\n bestLen = entry.path.length\n }\n }\n return best\n}\n\n/** `scope` then its transitive `extends`, nearest first, de-duplicated. Throws on a cycle. */\nexport function scopeChain(manifest: Manifest, scope: string | null): string[] {\n if (scope === null) return []\n const chain: string[] = []\n const seen = new Set<string>()\n const visit = (name: string, stack: Set<string>): void => {\n if (stack.has(name)) throw new Error(`extends cycle at scope \"${name}\"`)\n if (seen.has(name)) return\n seen.add(name)\n chain.push(name)\n stack.add(name)\n const entry = Object.hasOwn(manifest.scopes, name)\n ? manifest.scopes[name]\n : undefined\n for (const target of entry?.extends ?? []) visit(target, stack)\n stack.delete(name)\n }\n visit(scope, new Set())\n return chain\n}\n","import { join } from 'node:path'\n\nimport { collectMarkdown } from './collect.ts'\nimport { scopeChain } from './scope.ts'\nimport type {\n CollectionName,\n Context,\n ContextCollection,\n ContextFile,\n Manifest,\n MarkdownItem,\n} from './types.ts'\n\nexport const COLLECTIONS: readonly CollectionName[] = [\n 'standards',\n 'adr',\n 'specs',\n 'plans',\n 'skills',\n]\n\n/** The first path segment of `rel`, or null for a file at the collection root. */\nexport function ownerScope(rel: string): string | null {\n const slash = rel.indexOf('/')\n return slash === -1 ? null : rel.slice(0, slash)\n}\n\ntype Owned = MarkdownItem & { scope: string | null }\n\n/**\n * The file's place defines its scope (spec 0003 §4.0): collection-root files\n * are global, `<scope>/**` files belong to that scope. A file under a\n * directory outside the chain is ignored; front matter never re-routes.\n */\nasync function assembleCollection(\n dir: string,\n name: CollectionName,\n chain: string[]\n): Promise<ContextCollection> {\n const items = await collectMarkdown(dir)\n const groups = new Map<string, Owned[]>(chain.map((s) => [s, []]))\n const rootFiles: Owned[] = []\n for (const item of items) {\n const owner = ownerScope(item.rel)\n if (owner === null) rootFiles.push({ ...item, scope: null })\n else groups.get(owner)?.push({ ...item, scope: owner })\n }\n const files: ContextFile[] = []\n const push = (f: Owned): void => {\n files.push({\n rel: f.rel,\n scope: f.scope,\n title: f.title,\n body: f.body,\n content: f.content,\n })\n }\n for (const s of chain) for (const f of groups.get(s) ?? []) push(f)\n for (const f of rootFiles) push(f)\n return { name, files }\n}\n\nexport interface AssembleInput {\n rnessDir: string\n manifest: Manifest\n scope: string | null\n}\n\n/** Resolve every scoped collection for `scope` (null = global only). */\nexport async function assembleContext({\n rnessDir,\n manifest,\n scope,\n}: AssembleInput): Promise<Context> {\n const chain = scopeChain(manifest, scope)\n const collections = await Promise.all(\n COLLECTIONS.map((name) =>\n assembleCollection(join(rnessDir, name), name, chain)\n )\n )\n return { scope, collections }\n}\n","import { join } from 'node:path'\n\nimport { BEGIN, END } from './block.ts'\nimport { isSymlink, readOrNull, writeFileAtomic } from './fs.ts'\n\nexport type FindResult =\n | { kind: 'none' }\n | { kind: 'one'; begin: number; end: number }\n | { kind: 'error'; message: string }\n\n/** Locate the single rness span (line indexes, inclusive). Anything but 0 or 1 span is an error. */\nexport function findBlock(lines: string[]): FindResult {\n const begins: number[] = []\n const ends: number[] = []\n lines.forEach((line, i) => {\n const l = line.trimEnd()\n if (l === BEGIN) begins.push(i)\n if (l === END) ends.push(i)\n })\n if (begins.length === 0 && ends.length === 0) return { kind: 'none' }\n const begin = begins[0]\n const end = ends[0]\n if (\n begins.length !== 1 ||\n ends.length !== 1 ||\n begin === undefined ||\n end === undefined\n ) {\n return {\n kind: 'error',\n message: `expected exactly one ${BEGIN} … ${END} span, found ${begins.length} BEGIN and ${ends.length} END`,\n }\n }\n if (end < begin)\n return { kind: 'error', message: `${END} comes before ${BEGIN}` }\n return { kind: 'one', begin, end }\n}\n\nexport type MergeResult =\n { ok: true; text: string; changed: boolean } | { ok: false; error: string }\n\n/**\n * Merge `block` (LF, no trailing newline) into `existing` (spec 0003 §4.3):\n * missing file → the block; one span → replaced in place; no span → after a\n * leading `# H1` + blank line, else at the top. Bytes outside the span are\n * preserved, including the file's line-ending style.\n */\nexport function mergeBlock(\n existing: string | null,\n block: string\n): MergeResult {\n if (existing === null) return { ok: true, text: `${block}\\n`, changed: true }\n const eol = existing.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const lines = existing.split(/\\r?\\n/)\n const found = findBlock(lines)\n if (found.kind === 'error') return { ok: false, error: found.message }\n const rendered = block.split('\\n').join(eol)\n // Offsets of every line start in the original text, so the regions outside the\n // span are copied byte for byte — a file mixing LF and CRLF keeps every separator.\n const starts: number[] = [0]\n for (const m of existing.matchAll(/\\r?\\n/g))\n starts.push((m.index ?? 0) + m[0].length)\n const lineStart = (i: number): number => starts[i] ?? existing.length\n let text: string\n if (found.kind === 'one') {\n const endLine = lines[found.end] ?? ''\n const afterEnd = lineStart(found.end) + endLine.length\n text = `${existing.slice(0, lineStart(found.begin))}${rendered}${existing.slice(afterEnd)}`\n } else if (\n lines.length >= 3 &&\n (lines[0] ?? '').startsWith('# ') &&\n lines[1] === ''\n ) {\n const at = lineStart(2)\n text = `${existing.slice(0, at)}${rendered}${eol}${eol}${existing.slice(at)}`\n } else {\n text = `${rendered}${eol}${eol}${existing}`\n }\n return { ok: true, text, changed: text !== existing }\n}\n\nconst POINTER = '@AGENTS.md'\n\n/**\n * The workspace root `CLAUDE.md` (spec 0011 §2): the global block in clear.\n * Claude Code loads it from every directory below, where `@AGENTS.md` would\n * be an import outside the working directory — gated behind a dialog. So the\n * pointer line rness wrote there is dropped, and the block merged like any\n * other; the rest of the file is kept.\n */\nexport function claudeMdAtRoot(\n existing: string | null,\n block: string\n): MergeResult {\n if (existing === null) return mergeBlock(null, block)\n const lines = existing.split(/\\r?\\n/)\n if (!lines.some((l) => l.trim() === POINTER))\n return mergeBlock(existing, block)\n const eol = existing.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const rest = lines.filter((l) => l.trim() !== POINTER).join(eol)\n const merged = mergeBlock(rest.trim() === '' ? null : rest, block)\n return merged.ok ? { ...merged, changed: merged.text !== existing } : merged\n}\n\n/**\n * `CLAUDE.md` next to an `AGENTS.md`: create with `@AGENTS.md`, or prepend that\n * line when absent. A symlinked `CLAUDE.md` is left exactly as it is — reading\n * would follow it and the atomic rename would replace the link with a regular\n * file holding a copy of its target. (`sync` skips such a directory outright;\n * this guard is defence in depth for any other caller.)\n */\nexport async function ensureClaudeMd(\n dir: string\n): Promise<'created' | 'prepended' | 'unchanged'> {\n const file = join(dir, 'CLAUDE.md')\n if (await isSymlink(file)) return 'unchanged'\n const existing = await readOrNull(file)\n if (existing === null) {\n await writeFileAtomic(file, '@AGENTS.md\\n')\n return 'created'\n }\n if (existing.split(/\\r?\\n/).some((l) => l.trim() === '@AGENTS.md'))\n return 'unchanged'\n const eol = existing.includes('\\r\\n') ? '\\r\\n' : '\\n'\n await writeFileAtomic(file, `@AGENTS.md${eol}${existing}`)\n return 'prepended'\n}\n","import { join } from 'node:path'\n\nimport {\n BLOCK_FILES,\n agentTargets,\n leftoverTargets,\n writtenFiles,\n} from '../core/agent-targets.ts'\nimport {\n SUPPORTED_AGENTS,\n unsupportedAgents,\n unsupportedMessage,\n} from '../core/agents.ts'\nimport { askAgents } from '../core/ask-agents.ts'\nimport {\n BLOCK_SIZE_WARNING,\n isCurrentBlock,\n renderBlock,\n} from '../core/block.ts'\nimport { assembleContext } from '../core/context.ts'\nimport type { CommandDeps } from '../core/deps.ts'\nimport { exists, isSymlink, readOrNull, writeFileAtomic } from '../core/fs.ts'\nimport { clone, isClean, pullFastForward } from '../core/git.ts'\nimport { githubProvider } from '../core/github-oauth-provider.ts'\nimport { loadManifest, workspaceName, writeManifest } from '../core/manifest.ts'\nimport {\n type MergeResult,\n claudeMdAtRoot,\n ensureClaudeMd,\n findBlock,\n mergeBlock,\n} from '../core/merge.ts'\nimport { rnessCommand } from '../core/pm.ts'\nimport type { GitCredentials } from '../core/provider.ts'\nimport { type Terminal, defaultTerminal } from '../core/terminal.ts'\nimport {\n CHECKING,\n INSTEAD_OF_LINES,\n defaultTransport,\n isSshUrl,\n sshWorkspaceLines,\n testGithubSsh,\n} from '../core/transport.ts'\nimport type { Manifest } from '../core/types.ts'\nimport { type Line, type Ui, makeUi, plainUi } from '../core/ui.ts'\nimport { clonesIn, findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\n\nexport interface SyncOptions {\n /** Only this scope's block (the root block is skipped). */\n scope?: string\n /** Render and compare; write nothing; exit 1 when any block differs. */\n check?: boolean\n /** `git pull --ff-only` in every clean clone. */\n pull?: boolean\n /** Clone every catalogue repository missing from `org/`; by default none is cloned. */\n all?: boolean\n /** Skip the confirmation prompt. */\n yes?: boolean\n /** Agents to declare in rness.json before compiling them (spec 0011 §3.2). */\n agent?: string[]\n /** Internal (tests): directory to resolve from; default `process.cwd()`. */\n cwd?: string\n}\n\ninterface Target {\n scope: string | null\n dir: string\n depth: number\n label: string\n}\n\nfunction targetsOf(\n manifest: Manifest,\n root: string,\n only: string | undefined\n): Target[] {\n const targets: Target[] = []\n if (only === undefined)\n targets.push({ scope: null, dir: root, depth: 0, label: 'AGENTS.md' })\n for (const [name, entry] of Object.entries(manifest.scopes)) {\n if (only !== undefined && name !== only) continue\n const segments = entry.path.split('/')\n targets.push({\n scope: name,\n dir: join(root, ...segments),\n depth: segments.length,\n label: `${entry.path}/AGENTS.md`,\n })\n }\n return targets\n}\n\n/**\n * Bring one file's rness block up to date — or, in `check`, only say whether\n * it is. Current by its hash, not by its text: a block an older CLI wrote,\n * whose header still names that version, is left byte for byte. At the root\n * `CLAUDE.md` a leftover `@AGENTS.md` pointer also makes it out of date.\n */\nasync function syncBlockFile(\n file: string,\n block: { text: string; hash: string },\n check: boolean,\n rootClaudeMd = false\n): Promise<'unchanged' | 'stale' | 'updated' | { error: string }> {\n const existing = await readOrNull(file)\n const existingLines = existing === null ? [] : existing.split(/\\r?\\n/)\n const span = findBlock(existingLines)\n const current =\n span.kind === 'one' &&\n isCurrentBlock(existingLines.slice(span.begin, span.end + 1), block.hash) &&\n !(rootClaudeMd && existingLines.some((l) => l.trim() === '@AGENTS.md'))\n const merged: MergeResult = current\n ? { ok: true, text: existing ?? '', changed: false }\n : rootClaudeMd\n ? claudeMdAtRoot(existing, block.text)\n : mergeBlock(existing, block.text)\n if (!merged.ok) return { error: merged.error }\n if (!merged.changed) return 'unchanged'\n if (check) return 'stale'\n await writeFileAtomic(file, merged.text)\n return 'updated'\n}\n\n/** The picker's \"select all\" entry; no repository name can take this value. */\nconst SELECT_ALL = '*'\n\n/** The directories under `org/` — the user's workspace (ADR 0008). */\n/**\n * In a terminal: offer the catalogue repositories that are not cloned, or\n * confirm when there are none. Returns the repositories to clone, or an exit\n * code when the run stops here.\n */\nasync function askWhatToSync(input: {\n org: string\n missing: readonly string[]\n offer: boolean\n terminal: Terminal\n ui: Ui\n}): Promise<string[] | number> {\n if (!input.terminal.isTty()) {\n process.stderr.write(\n 'rness sync writes files; pass --yes to run without a prompt\\n'\n )\n return 2\n }\n const p = await input.terminal.prompts()\n const cancelled = (): number => {\n input.ui.cancelled()\n return 1\n }\n if (input.offer && input.missing.length > 0) {\n const answer = await p.autocompleteMultiselect({\n message: 'Do you want to sync as well?',\n options: [\n {\n value: SELECT_ALL,\n label: 'Select all',\n hint: `${input.missing.length} repositories from rness.json`,\n },\n ...input.missing.map((name) => ({ value: name, label: name })),\n ],\n required: false,\n placeholder: 'Type to filter',\n })\n if (p.isCancel(answer) || !Array.isArray(answer)) return cancelled()\n return answer.includes(SELECT_ALL)\n ? [...input.missing]\n : answer.filter((name) => name !== SELECT_ALL)\n }\n const ok = await p.confirm({\n message: `Sync workspace \\`${input.org}\\`: rewrite the rness blocks of your clones?`,\n })\n if (p.isCancel(ok) || ok !== true) return cancelled()\n return []\n}\n\n/**\n * `rness sync`: write the blocks of the repositories cloned in `org/` (spec\n * 0003 §4). The clones are the workspace; `rness.json` is the organization's\n * catalogue, so a catalogue repository that is not cloned is offered (in a\n * terminal) or named, never cloned silently — `--all` clones them all.\n * Returns the exit code.\n */\nexport async function syncCommand(\n opts: SyncOptions,\n deps: Partial<CommandDeps> = {}\n): Promise<number> {\n const terminal = deps.terminal ?? defaultTerminal\n const transport = deps.transport ?? defaultTransport\n // Only a clone or a pull needs it, and it reads the stored login.\n let provider = deps.provider\n const credentialsFor = async (url: string): Promise<GitCredentials | null> =>\n (provider ??= await githubProvider()).credentialsFor(url)\n const cwd = opts.cwd ?? process.cwd()\n const check = opts.check === true\n // Inside another command's session (`add`, `create`) its reporter is used;\n // on its own, a sync that asks questions is a session of its own.\n const ownUi = deps.ui === undefined\n const ui =\n deps.ui ??\n (opts.yes !== true && !check ? await makeUi(terminal) : { ...plainUi })\n const agentFlags = opts.agent ?? []\n if (agentFlags.length > 0 && check) {\n process.stderr.write(\n '--agent cannot be combined with --check: it declares agents in rness.json\\n'\n )\n return 2\n }\n const unknown = unsupportedAgents(agentFlags)[0]\n if (unknown !== undefined) {\n process.stderr.write(\n `unknown agent \"${unknown}\" (supported: ${SUPPORTED_AGENTS.join(', ')})\\n`\n )\n return 2\n }\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n const org = workspaceName(manifest, ws.root)\n // An agent this copy cannot compile would leave the team's files half\n // made: refuse before anything is written (spec 0011 §3.1).\n const unsupported = unsupportedAgents(manifest.agents ?? [])[0]\n if (unsupported !== undefined) {\n process.stderr.write(`${unsupportedMessage(unsupported)}\\n`)\n return 1\n }\n if (ownUi) ui.intro(`Sync workspace ${org}`)\n if (\n opts.scope !== undefined &&\n !Object.hasOwn(manifest.scopes, opts.scope)\n ) {\n process.stderr.write(`unknown scope: ${opts.scope}\\n`)\n return 1\n }\n\n // The team's agents: named on the command line, or asked once in a\n // terminal; never asked by --yes, --check or --scope (spec 0011 §3.2).\n let declare: string[] | null = null\n if (agentFlags.length > 0) {\n const current = manifest.agents ?? []\n const added = agentFlags.filter((a) => !current.includes(a))\n if (added.length > 0) declare = [...current, ...new Set(added)]\n } else if (\n manifest.agents === null &&\n !check &&\n opts.yes !== true &&\n opts.scope === undefined &&\n terminal.isTty()\n ) {\n const answer = await askAgents(await terminal.prompts())\n if (answer === null) {\n ui.cancelled()\n return 1\n }\n declare = answer\n }\n if (declare !== null) {\n const before = manifest.agents ?? []\n manifest.agents = declare\n await writeManifest(ws.rnessDir, manifest)\n for (const name of declare.filter((a) => !before.includes(a)))\n ui.line('declared', `agent ${name} in .rness/rness.json`)\n if (declare.length === 0)\n ui.line('declared', 'no agent in .rness/rness.json')\n ui.hint('rness.json changed: commit it in .rness, for the whole team')\n }\n\n const clones = await clonesIn(ws.root)\n const missing = Object.keys(manifest.repos).filter((n) => !clones.has(n))\n let toClone = new Set<string>(opts.all === true && !check ? missing : [])\n if (!check && opts.yes !== true) {\n const answer = await askWhatToSync({\n org,\n missing,\n // `--all` already answers; `--scope` is about one block, not the workspace.\n offer: opts.all !== true && opts.scope === undefined,\n terminal,\n ui,\n })\n if (typeof answer === 'number') return answer\n if (opts.all !== true) toClone = new Set(answer)\n }\n\n // rness.json is authoritative: a git@ entry is cloned over SSH or not at\n // all. Without SSH access, stop before the first clone (spec 0005 §3).\n const overSsh = [...toClone].some((name) => {\n const repo = manifest.repos[name]\n return repo !== undefined && isSshUrl(repo.url, transport.hosts)\n })\n // Only a clone over SSH can make git ask something on the terminal.\n if (!overSsh) ui.gitIsSilent = true\n if (overSsh) {\n const interactive = opts.yes !== true && terminal.isTty()\n const { access, unattended } = await testGithubSsh(\n transport,\n interactive,\n () => ui.line(...CHECKING)\n )\n if (unattended) ui.gitIsSilent = true\n if (!access.ok) {\n process.stderr.write(\n `${[...sshWorkspaceLines(access.reason), ...INSTEAD_OF_LINES].join('\\n')}\\n`\n )\n return 1\n }\n }\n\n // A status line as `[verb, rest]`, or a sentence; said once the pass ends.\n const lines: (Line | string)[] = []\n const problems: string[] = []\n\n try {\n // 1. Repositories: clone only what was asked for; pull only on request,\n // only clean trees.\n const notCloned = new Set<string>()\n for (const [name, repo] of Object.entries(manifest.repos)) {\n const dir = join(ws.root, 'org', name)\n const label = `org/${name}`\n if (!(await exists(dir))) {\n if (!toClone.has(name)) {\n notCloned.add(name)\n continue\n }\n try {\n const credentials = await credentialsFor(repo.url)\n await ui.step({ doing: `cloning ${label}`, git: true }, () =>\n clone(repo.url, dir, credentials)\n )\n lines.push(['cloned', `${label}`])\n } catch (e) {\n problems.push(\n `${label}: ${e instanceof Error ? e.message : String(e)}`\n )\n }\n } else if (opts.pull === true && !check) {\n try {\n // The files sync writes itself are not the developer's changes:\n // the blocks, and the declared agents' files (spec 0011 §3.3). A\n // user's uncommitted edit to a tracked AGENTS.md is therefore not\n // a veto — git pull --ff-only still refuses to overwrite it and\n // that surfaces as a problem.\n if (!(await isClean(dir, writtenFiles(manifest)))) {\n lines.push(['skipped', `${label} (working tree not clean)`])\n continue\n }\n const credentials = await credentialsFor(repo.url)\n await ui.step({ doing: `pulling ${label}`, git: true }, () =>\n pullFastForward(dir, credentials)\n )\n lines.push(['pulled', `${label}`])\n } catch (e) {\n problems.push(\n `${label}: ${e instanceof Error ? e.message : String(e)}`\n )\n }\n }\n }\n\n if (notCloned.size > 0)\n lines.push(\n `not cloned: ${[...notCloned].join(', ')} (${rnessCommand()} add <name>, or ${rnessCommand()} sync --all)`\n )\n // A clone the catalogue does not know gets no block: no scope declares\n // its rules. Say how to bring it in rather than skipping it silently.\n const scoped = new Set(\n Object.values(manifest.scopes).map((s) => s.path.split('/')[1])\n )\n const undeclared = [...clones].filter(\n (n) => !Object.hasOwn(manifest.repos, n) && !scoped.has(n)\n )\n if (undeclared.length > 0)\n lines.push(\n `not in rness.json: ${undeclared.join(', ')} (${rnessCommand()} add <name> declares it)`\n )\n\n // 2. Blocks — only where repositories live; a standalone context checkout has no org/.\n if (!(await exists(join(ws.root, 'org')))) {\n lines.push(['skipped', 'blocks (no org/ directory here)'])\n } else {\n let differences = 0\n for (const t of targetsOf(manifest, ws.root, opts.scope)) {\n if (!(await exists(t.dir))) {\n // A scope inside a repository that is not cloned is covered by\n // the `not cloned:` line; only a directory missing from a present\n // clone (or from no repository at all) is worth its own line.\n const repo = t.label.split('/')[1]\n if (\n !t.label.startsWith('org/') ||\n repo === undefined ||\n !notCloned.has(repo)\n )\n lines.push(['skipped', `${t.label} (directory not present)`])\n continue\n }\n // In a scope, one of the pair symlinked to the other (the common\n // `CLAUDE.md → AGENTS.md`) leaves the directory untouched: reading\n // follows the link, and the atomic rename would replace the link with\n // a duplicate of its target. At the root a link is still never\n // rewritten, but the other file is (spec 0011 §2).\n const [agentsLinked, claudeLinked] = await Promise.all(\n BLOCK_FILES.map((f) => isSymlink(join(t.dir, f)))\n )\n const atRoot = t.scope === null\n if (!atRoot && (agentsLinked === true || claudeLinked === true)) {\n lines.push(['skipped', `${t.label} (symlink)`])\n continue\n }\n const context = await assembleContext({\n rnessDir: ws.rnessDir,\n manifest,\n scope: t.scope,\n })\n const block = renderBlock({\n scope: t.scope,\n org,\n depth: t.depth,\n context,\n })\n if (block.bytes > BLOCK_SIZE_WARNING) {\n ui.warn(\n `${t.label}: block is ${Math.round(block.bytes / 1024)} KB (over 32 KB)`\n )\n }\n const agents =\n agentsLinked === true\n ? 'skipped'\n : await syncBlockFile(join(t.dir, 'AGENTS.md'), block, check)\n if (typeof agents === 'object') {\n problems.push(`${t.label}: ${agents.error}`)\n continue\n }\n lines.push(\n agents === 'skipped'\n ? ['skipped', `${t.label} (symlink)`]\n : [agents, t.label]\n )\n if (agents === 'stale') differences += 1\n if (!atRoot) {\n if (!check) await ensureClaudeMd(t.dir)\n continue\n }\n // The root CLAUDE.md follows the root AGENTS.md: its line is said\n // only when its status differs (a pointer converted, a hand edit).\n if (claudeLinked === true) continue\n const claude = await syncBlockFile(\n join(t.dir, 'CLAUDE.md'),\n block,\n check,\n true\n )\n if (typeof claude === 'object') {\n problems.push(`CLAUDE.md: ${claude.error}`)\n continue\n }\n if (claude === 'stale') differences += 1\n if (claude !== agents) lines.push([claude, 'CLAUDE.md'])\n }\n if (check && differences > 0)\n problems.push(\n `${differences} block(s) out of date — run ${rnessCommand()} sync`\n )\n\n // 3. Agent targets — the whole workspace, so never under --scope.\n if (opts.scope === undefined) {\n let stale = 0\n for (const o of await agentTargets(ws.root, manifest, { check })) {\n if (o.status === 'invalid')\n problems.push(\n `${o.label}: ${o.detail ?? 'unreadable'}; fix it, then ${rnessCommand()} sync`\n )\n else if (o.status === 'stale') {\n stale += 1\n lines.push(['stale', `${o.label} (${o.detail ?? ''})`])\n } else lines.push([o.status, o.label])\n }\n if (stale > 0)\n problems.push(\n `${stale} agent file(s) out of date — run ${rnessCommand()} sync`\n )\n if (!check)\n for (const label of await leftoverTargets(ws.root, manifest))\n lines.push(\n `${label} still carries the values of an agent no longer in rness.json (left as is)`\n )\n }\n }\n\n return problems.length > 0 ? 1 : 0\n } finally {\n // Both flushes run even when something above throws, and stdout precedes\n // stderr so the report reads in order. The exit code above is computed\n // before this block, so it is unaffected.\n for (const l of lines)\n if (typeof l === 'string') ui.hint(l)\n else ui.line(l[0], l[1])\n for (const p of problems) ui.error(p)\n if (ownUi)\n ui.outro(\n problems.length > 0\n ? 'Done, with problems'\n : check\n ? 'Checked'\n : 'Your clones carry the current context',\n problems.length > 0 ? 'warn' : 'done'\n )\n }\n } catch (e) {\n return reportError(e)\n }\n}\n","import { mkdir } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nimport { type AgentTarget, type Guarantee, TARGETS } from './agents.ts'\nimport { exists, readOrNull, writeFileAtomic } from './fs.ts'\nimport {\n describeGuarantee,\n ensureGuarantees,\n missingGuarantees,\n} from './json-guarantees.ts'\nimport type { Manifest } from './types.ts'\n\n/** What one target file turned out to be, as `sync` and `validate` say it. */\nexport interface TargetOutcome {\n /** Workspace-relative: `org/<repo>/.claude/settings.json`. */\n label: string\n status: 'updated' | 'unchanged' | 'stale' | 'invalid'\n /** What is missing (stale) or why the file is refused (invalid). */\n detail: string | null\n}\n\ntype OwnedFile = { file: string; label: string } & (\n { guarantees: readonly Guarantee[] } | { content: string }\n)\n\n/** What a whole file lacks against what rness writes; null when equal. */\nfunction wholeDiff(existing: string | null, content: string): string | null {\n if (existing === content) return null\n return existing === null ? 'missing' : 'differs from what rness writes'\n}\n\n/**\n * Every file the given targets own a part of: the workspace root's first\n * (spec 0015 §2.1), then one per target and per repository of the catalogue\n * that is cloned under `org/`. The root of a clone only — a nested scope's\n * path to `.rness` is not verified (spec 0011 §5). Nothing where there is no\n * `org/`: a standalone checkout of `.rness` (its CI) has no workspace root of\n * its own, as `checkBlocks` has no block to check there.\n */\nasync function filesOf(\n root: string,\n manifest: Manifest,\n targets: readonly AgentTarget[]\n): Promise<OwnedFile[]> {\n const files: OwnedFile[] = []\n if (!(await exists(join(root, 'org')))) return files\n for (const target of targets)\n for (const owned of target.files)\n if (owned.at === 'root')\n files.push({\n ...owned,\n file: join(root, ...owned.file.split('/')),\n label: owned.file,\n })\n for (const repo of Object.keys(manifest.repos)) {\n if (!(await exists(join(root, 'org', repo)))) continue\n for (const target of targets)\n for (const owned of target.files)\n if (owned.at === 'clones')\n files.push({\n ...owned,\n file: join(root, 'org', repo, ...owned.file.split('/')),\n label: `org/${repo}/${owned.file}`,\n })\n }\n return files\n}\n\nfunction declared(manifest: Manifest): AgentTarget[] {\n return (manifest.agents ?? []).flatMap((name) =>\n Object.hasOwn(TARGETS, name) ? [TARGETS[name] as AgentTarget] : []\n )\n}\n\n/** The files holding the generated block, in every clone. */\nexport const BLOCK_FILES: readonly string[] = ['AGENTS.md', 'CLAUDE.md']\n\n/**\n * Every file `sync` writes in a clone, relative to it: the block's, and the\n * declared agents' (spec 0011 §3.3). Not the workspace root's: it is in no\n * repository (spec 0015 §2.1).\n */\nexport function writtenFiles(manifest: Manifest): string[] {\n return [\n ...BLOCK_FILES,\n ...declared(manifest).flatMap((t) =>\n t.files.filter((f) => f.at === 'clones').map((f) => f.file)\n ),\n ]\n}\n\n/**\n * Compile the declared agents into every clone (spec 0011 §3.3), or with\n * `check` only say what is missing. Unsupported names are the caller's to\n * refuse; they are skipped here.\n */\nexport async function agentTargets(\n root: string,\n manifest: Manifest,\n opts: { check: boolean }\n): Promise<TargetOutcome[]> {\n const outcomes: TargetOutcome[] = []\n for (const owned of await filesOf(root, manifest, declared(manifest))) {\n const { file, label } = owned\n const existing = await readOrNull(file)\n if ('content' in owned) {\n // A whole file (spec 0016 §3.2): written when missing or different.\n const diff = wholeDiff(existing, owned.content)\n if (diff === null)\n outcomes.push({ label, status: 'unchanged', detail: null })\n else if (opts.check)\n outcomes.push({ label, status: 'stale', detail: diff })\n else {\n await mkdir(dirname(file), { recursive: true })\n await writeFileAtomic(file, owned.content)\n outcomes.push({ label, status: 'updated', detail: null })\n }\n continue\n }\n const { guarantees } = owned\n if (opts.check) {\n const missing = missingGuarantees(existing, guarantees)\n if ('invalid' in missing)\n outcomes.push({ label, status: 'invalid', detail: missing.invalid })\n else if (missing.length > 0)\n outcomes.push({\n label,\n status: 'stale',\n detail: missing.map(describeGuarantee).join('; '),\n })\n else outcomes.push({ label, status: 'unchanged', detail: null })\n continue\n }\n const ensured = ensureGuarantees(existing, guarantees)\n if (ensured.kind === 'invalid') {\n outcomes.push({ label, status: 'invalid', detail: ensured.reason })\n continue\n }\n if (ensured.kind === 'unchanged') {\n outcomes.push({ label, status: 'unchanged', detail: null })\n continue\n }\n await mkdir(dirname(file), { recursive: true })\n await writeFileAtomic(file, ensured.text)\n outcomes.push({ label, status: 'updated', detail: null })\n }\n return outcomes\n}\n\n/**\n * Files that still carry every value of a target the team no longer\n * declares, or its whole content. rness cannot tell its entries from the\n * team's, so it leaves them and says where they are (spec 0011 §3.4). Nothing when `agents` was never\n * set: a file written by hand is none of rness's business then.\n */\nexport async function leftoverTargets(\n root: string,\n manifest: Manifest\n): Promise<string[]> {\n if (manifest.agents === null) return []\n const agents = manifest.agents\n const undeclared = Object.values(TARGETS).filter(\n (t) => !agents.includes(t.name)\n )\n const leftovers: string[] = []\n for (const owned of await filesOf(root, manifest, undeclared)) {\n const existing = await readOrNull(owned.file)\n if (existing === null) continue\n if ('content' in owned) {\n if (existing === owned.content) leftovers.push(owned.label)\n continue\n }\n const missing = missingGuarantees(existing, owned.guarantees)\n if (!('invalid' in missing) && missing.length === 0)\n leftovers.push(owned.label)\n }\n return leftovers\n}\n","import { VERSION } from '../version.ts'\n\n/**\n * A value a target guarantees in a JSON file it shares with the team (spec\n * 0011 §3.4): the list at `path` contains `contains` — a string, or an object\n * compared deeply (spec 0015 §2.3) — or the key at `path` is present, set to\n * `value` when missing, never replaced (spec 0014 §3). rness owns the value,\n * never the file. `label` names an object entry in messages.\n */\nexport type Guarantee =\n | { path: readonly string[]; contains: unknown; label?: string }\n | { path: readonly string[]; value: unknown }\n\n/**\n * One file of a target: relative to the root of each clone, or to the\n * workspace root, once (spec 0015 §2.1). rness either guarantees values in\n * it — the team's file — or owns it whole, byte for byte (spec 0016 §3.2).\n */\nexport type TargetFile = {\n file: string\n at: 'clones' | 'root'\n} & ({ guarantees: readonly Guarantee[] } | { content: string })\n\n/** What rness compiles for one agent, in each repository of the workspace. */\nexport interface AgentTarget {\n /** As `agents` in rness.json names it. */\n name: string\n /** As the question offers it. */\n label: string\n files: readonly TargetFile[]\n}\n\n/** The pinned copy's launcher, inside `.rness`. */\nconst PINNED_BIN = 'node_modules/@rness/cli/dist/bin/rness.js'\n\nexport type HookEvent = 'session-start' | 'post-tool-use'\n\n/**\n * The line Claude Code runs for a hook (spec 0015 §2.2), `rness` being the\n * path of `.rness` from the project directory: the pinned copy when it is\n * installed; else, at session start, a line saying why the context is not\n * loaded — there is no rness to say it. Fixed across versions: the entry is\n * compared as a whole, so a changed line would be appended next to the old\n * one and run twice (§2.3). What the hook does changes in `rness hook`.\n */\nexport function hookLine(rness: string, event: HookEvent): string {\n const run = `f=\"$CLAUDE_PROJECT_DIR/${rness}/${PINNED_BIN}\"; if [ -f \"$f\" ]; then node \"$f\" hook ${event};`\n if (event === 'post-tool-use') return `${run} fi`\n const missing = JSON.stringify({\n systemMessage: `rness: ${rness} is not installed, so the workspace context is not loaded. Clone the workspace, then install its dependencies in .rness.`,\n })\n return `${run} else echo '${missing}'; fi`\n}\n\n/** The two hook entries, for a project directory reaching `.rness` at `rness`. */\nfunction hooks(rness: string): Guarantee[] {\n return [\n {\n path: ['hooks', 'SessionStart'],\n contains: {\n hooks: [\n {\n type: 'command',\n command: hookLine(rness, 'session-start'),\n timeout: 10,\n },\n ],\n },\n label: 'the rness session-start hook',\n },\n {\n path: ['hooks', 'PostToolUse'],\n contains: {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: hookLine(rness, 'post-tool-use'),\n timeout: 10,\n },\n ],\n },\n label: 'the rness post-tool-use hook',\n },\n ]\n}\n\n/** The Claude Code plugin rness writes, whole: `/rness:status` (spec 0016 §3). */\nconst PLUGIN = '.claude/skills/rness'\n\nconst PLUGIN_JSON = `${JSON.stringify(\n {\n name: 'rness',\n description: 'The rness workspace in Claude Code: /rness:status.',\n },\n null,\n 2\n)}\\n`\n\n/**\n * The `status` skill, `rness` being the path of `.rness` from the project\n * directory. One fixed command — the arguments never reach a shell — named\n * exactly in `allowed-tools`, so it runs without a prompt. Nothing in it\n * depends on the version: an upgrade rewrites nothing.\n */\nfunction statusSkill(rness: string): string {\n const command = `node \"\\${CLAUDE_PROJECT_DIR}/${rness}/${PINNED_BIN}\" status --cwd \"\\${CLAUDE_PROJECT_DIR}\"`\n return `---\nname: status\ndescription: The status of every decision, specification, plan and other tracked document of the rness workspace, one table per directory. Read-only.\nargument-hint: '[tab]'\ndisable-model-invocation: true\nallowed-tools: Bash(${command})\n---\n\n!\\`${command}\\`\n\nShow the output above to the user as it is: the heading and the tables,\nnothing added, nothing summarised, no other tool. Arguments: \\`$ARGUMENTS\\`.\nWhen they name a tab, show only that tab's section. If the output says the\nmodule cannot be found, say instead that ${rness} is not installed next to\nthis repository.\n\nEnd with this line: _For the view with tabs and scrolling: Ctrl+Z, then\n\\`npx @rness/cli status\\` (q to close), then \\`fg\\`._\n`\n}\n\nfunction plugin(rness: string, at: TargetFile['at']): TargetFile[] {\n return [\n { file: `${PLUGIN}/.claude-plugin/plugin.json`, at, content: PLUGIN_JSON },\n {\n file: `${PLUGIN}/skills/status/SKILL.md`,\n at,\n content: statusSkill(rness),\n },\n ]\n}\n\n/**\n * The agents this version can compile for (spec 0011 §4, tier 1). Any other\n * agent that reads `AGENTS.md` works with the block alone.\n */\nexport const TARGETS: Readonly<Record<string, AgentTarget>> = {\n claude: {\n name: 'claude',\n label: 'Claude Code',\n files: [\n {\n file: '.claude/settings.json',\n at: 'clones',\n guarantees: [\n // Read the context repository from a repository without a prompt.\n // Resolved against the project directory, and applied once Claude\n // Code has trusted it (verified on 2.1.284, spec 0011 §7).\n {\n path: ['permissions', 'additionalDirectories'],\n contains: '../../.rness',\n },\n ...hooks('../../.rness'),\n ],\n },\n {\n file: '.mcp.json',\n at: 'clones',\n guarantees: [\n // The pinned copy, by a path relative to the repository — the\n // directory Claude Code starts the server in (spec 0014 §6). Not\n // pre-approved in settings: each developer approves it once, since\n // a repository approving its own command would run any change to\n // it unasked (spec 0014 §3, 0.9.1).\n {\n path: ['mcpServers', 'rness'],\n value: {\n command: 'node',\n args: [\n '../../.rness/node_modules/@rness/cli/dist/bin/rness.js',\n 'mcp',\n ],\n },\n },\n ],\n },\n ...plugin('../../.rness', 'clones'),\n // A session opened at the workspace root reads this file, one opened\n // in a clone does not (spec 0011 §1): the hooks only, `.rness` inside.\n {\n file: '.claude/settings.json',\n at: 'root',\n guarantees: hooks('.rness'),\n },\n ...plugin('.rness', 'root'),\n ],\n },\n}\n\nexport const SUPPORTED_AGENTS: readonly string[] = Object.keys(TARGETS)\n\n/** The names this version has no target for, in their order. */\nexport function unsupportedAgents(names: readonly string[]): string[] {\n return names.filter((n) => !Object.hasOwn(TARGETS, n))\n}\n\nexport function unsupportedMessage(name: string): string {\n return `rness.json: agent \"${name}\" is not supported by @rness/cli ${VERSION} (supported: ${SUPPORTED_AGENTS.join(', ')})`\n}\n","import { isDeepStrictEqual } from 'node:util'\n\nimport type { Guarantee } from './agents.ts'\n\n/**\n * Guaranteed values in a JSON file rness shares with the team (spec 0011\n * §3.4): what is missing is added, nothing else is removed, rewritten or\n * reordered, and a file rness cannot read is never overwritten. Pure: text in,\n * text out.\n */\nexport type Ensured =\n | { kind: 'created' | 'updated' | 'unchanged'; text: string }\n | { kind: 'invalid'; reason: string }\n\ntype Json = Record<string, unknown>\ntype Parsed = { ok: true; data: Json } | { ok: false; reason: string }\n\nfunction isObject(value: unknown): value is Json {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction parse(text: string): Parsed {\n let data: unknown\n try {\n data = JSON.parse(text)\n } catch {\n return { ok: false, reason: 'not valid JSON' }\n }\n return isObject(data)\n ? { ok: true, data }\n : { ok: false, reason: 'not a JSON object' }\n}\n\n/**\n * Walk to the object holding `g`'s last key, creating the objects on the way\n * when `create`.\n */\nfunction parentOf(\n root: Json,\n g: Guarantee,\n create: boolean\n):\n | { kind: 'node'; node: Json }\n | { kind: 'absent' }\n | { kind: 'invalid'; reason: string } {\n let node = root\n for (const [i, key] of g.path.slice(0, -1).entries()) {\n const next = node[key]\n if (next === undefined) {\n if (!create) return { kind: 'absent' }\n node[key] = {}\n } else if (!isObject(next))\n return {\n kind: 'invalid',\n reason: `${g.path.slice(0, i + 1).join('.')} is not an object`,\n }\n node = node[key] as Json\n }\n return { kind: 'node', node }\n}\n\n/**\n * Whether `g` holds in `root` — and, with `create`, make it hold: an entry\n * appended to its list, or its key set when missing. `changed` says whether\n * anything was written; a key already present, whatever its value, holds.\n */\nfunction apply(\n root: Json,\n g: Guarantee,\n create: boolean\n): { holds: boolean; changed: boolean } | { invalid: string } {\n const found = parentOf(root, g, create)\n if (found.kind === 'absent') return { holds: false, changed: false }\n if (found.kind === 'invalid') return { invalid: found.reason }\n const parent = found.node\n const last = g.path[g.path.length - 1] ?? ''\n const value = parent[last]\n if ('value' in g) {\n if (value !== undefined) return { holds: true, changed: false }\n if (!create) return { holds: false, changed: false }\n parent[last] = structuredClone(g.value)\n return { holds: true, changed: true }\n }\n if (value === undefined) {\n if (!create) return { holds: false, changed: false }\n parent[last] = [structuredClone(g.contains)]\n return { holds: true, changed: true }\n }\n if (!Array.isArray(value))\n return { invalid: `${g.path.join('.')} is not a list` }\n if (value.some((entry) => isDeepStrictEqual(entry, g.contains)))\n return { holds: true, changed: false }\n if (!create) return { holds: false, changed: false }\n value.push(structuredClone(g.contains))\n return { holds: true, changed: true }\n}\n\n/** The text's own indentation, line ending and final newline, reused on output. */\nfunction styleOf(text: string): {\n indent: string\n eol: string\n final: boolean\n} {\n const indent = text\n .split(/\\r?\\n/)\n .slice(1)\n .map((l) => /^[ \\t]+/.exec(l)?.[0])\n .find((w) => w !== undefined)\n return {\n indent: indent ?? ' ',\n eol: text.includes('\\r\\n') ? '\\r\\n' : '\\n',\n final: text.endsWith('\\n'),\n }\n}\n\nexport function ensureGuarantees(\n existing: string | null,\n guarantees: readonly Guarantee[]\n): Ensured {\n const parsed: Parsed =\n existing === null ? { ok: true, data: {} } : parse(existing)\n if (!parsed.ok) return { kind: 'invalid', reason: parsed.reason }\n let changed = false\n for (const g of guarantees) {\n const r = apply(parsed.data, g, true)\n if ('invalid' in r) return { kind: 'invalid', reason: r.invalid }\n changed ||= r.changed\n }\n if (existing === null)\n return {\n kind: 'created',\n text: `${JSON.stringify(parsed.data, null, 2)}\\n`,\n }\n if (!changed) return { kind: 'unchanged', text: existing }\n const { indent, eol, final } = styleOf(existing)\n const body = JSON.stringify(parsed.data, null, indent).split('\\n').join(eol)\n return { kind: 'updated', text: final ? `${body}${eol}` : body }\n}\n\n/** What `ensureGuarantees` would add, or why it would refuse the file. */\nexport function missingGuarantees(\n existing: string | null,\n guarantees: readonly Guarantee[]\n): Guarantee[] | { invalid: string } {\n if (existing === null) return [...guarantees]\n const parsed = parse(existing)\n if (!parsed.ok) return { invalid: parsed.reason }\n const missing: Guarantee[] = []\n for (const g of guarantees) {\n const r = apply(parsed.data, g, false)\n if ('invalid' in r) return { invalid: r.invalid }\n if (!r.holds) missing.push(g)\n }\n return missing\n}\n\nexport function describeGuarantee(g: Guarantee): string {\n if ('value' in g) return `${g.path.join('.')} is missing`\n const what =\n g.label ??\n (typeof g.contains === 'string' ? g.contains : JSON.stringify(g.contains))\n return `${g.path.join('.')} lacks ${what}`\n}\n","import { TARGETS } from './agents.ts'\nimport type { Prompts } from './terminal.ts'\n\nexport const AGENTS_QUESTION = 'Which agents does your team use?'\n\n/**\n * The one question that fills `agents` in rness.json (spec 0011 §3.2): the\n * targets this version compiles, none required. [] is an answer — \"none, do\n * not ask again\"; null is a cancel.\n */\nexport async function askAgents(p: Prompts): Promise<string[] | null> {\n const answer = await p.multiselect<string>({\n message: AGENTS_QUESTION,\n options: Object.values(TARGETS).map((t) => ({\n value: t.name,\n label: t.label,\n })),\n required: false,\n })\n if (p.isCancel(answer)) return null\n return Array.isArray(answer) ? answer : []\n}\n","import { paint } from './style.ts'\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\nconst INTERVAL_MS = 80\n/** Back to column 0, erase the line. */\nconst CLEAR_LINE = '\\r\\x1b[2K'\n\nexport interface StepOptions {\n /** What is happening, as a status line in the making: `cloning org/api`. */\n label: string\n /**\n * Animate a spinner. Off for anything that runs git: over SSH, git's `ssh`\n * may ask for a passphrase on the terminal, and a line redrawn every 80 ms\n * would shred the question. The label is then written once and erased.\n */\n animate: boolean\n stream?: NodeJS.WriteStream\n}\n\nfunction isLive(stream: NodeJS.WriteStream): boolean {\n return (\n stream.isTTY === true &&\n process.env['TERM'] !== 'dumb' &&\n process.env['CI'] === undefined\n )\n}\n\n/**\n * Run `work` with a transient line saying what is going on (spec 0007 §5).\n * The line is erased when `work` settles, and the caller prints the step's\n * status line as it always did — so off a terminal, where nothing transient\n * is written, the output is byte for byte what it was.\n */\nexport async function step<T>(\n options: StepOptions,\n work: () => Promise<T>\n): Promise<T> {\n const stream = options.stream ?? process.stdout\n if (!isLive(stream)) return work()\n const draw = (frame: string): void => {\n rawWrite(\n `${CLEAR_LINE}${paint('info', frame, stream)} ${paint('idle', options.label, stream)}`\n )\n }\n let timer: NodeJS.Timeout | undefined\n let shown = true\n // Erase the label, once: when the work ends, or as soon as the work itself\n // writes — its first line must not land behind `… syncing the blocks`.\n const erase = (): void => {\n if (!shown) return\n shown = false\n if (timer !== undefined) clearInterval(timer)\n rawWrite(CLEAR_LINE)\n }\n // Both streams share the terminal's line, so a write to either erases it.\n const rawWrite = stream.write.bind(stream) as NodeJS.WriteStream['write']\n const rawErr = process.stderr.write.bind(\n process.stderr\n ) as NodeJS.WriteStream['write']\n type Write = NodeJS.WriteStream['write']\n // `write` is overloaded; the guard only forwards, whatever the overload.\n const guard = (raw: Write): Write =>\n ((...args: Parameters<Write>) => {\n erase()\n return raw(...args)\n }) as Write\n if (options.animate) {\n let i = 0\n draw(FRAMES[0] ?? '')\n timer = setInterval(() => {\n i = (i + 1) % FRAMES.length\n if (shown) draw(FRAMES[i] ?? '')\n }, INTERVAL_MS)\n // Never the reason the process stays alive.\n timer.unref()\n } else {\n draw('…')\n }\n stream.write = guard(rawWrite)\n if (process.stderr !== stream) process.stderr.write = guard(rawErr)\n try {\n return await work()\n } finally {\n stream.write = rawWrite\n if (process.stderr !== stream) process.stderr.write = rawErr\n erase()\n }\n}\n","import { step as transientStep } from './progress.ts'\nimport { type Tone, badge, grey, paint, status, toneOf, warn } from './style.ts'\nimport type { Prompts, Terminal } from './terminal.ts'\n\n// How an interactive command speaks (spec 0007 §5b). Two renderings of the\n// same calls: `plain` — the status column, the bytes scripts and tests read —\n// and `session`, clack's gutter from `intro` to `outro`, in a terminal.\n\n/** A status line: the verb of the column, what follows it. */\n/** `sentence` replaces `rest verb` in the session look, where that would not read. */\nexport type Line = readonly [verb: string, rest: string, sentence?: string]\n\nexport interface StepOptions {\n /** The transient label of the plain look: `cloning org/api`. */\n doing: string\n /** What the session look shows while it runs; defaults to `doing`, tidied. */\n sentence?: string\n /** The step runs git: it animates only when git is known not to prompt. */\n git?: boolean\n /**\n * The plain look has already said what it needs (`listing acme\n * repositories…`): only the session look prints the step's outcome.\n */\n quiet?: boolean\n}\n\nexport interface Ui {\n /** True for the session look. */\n readonly session: boolean\n /**\n * Set once rness knows git will not ask anything on the terminal (SSH works\n * unattended, or the clones are not over SSH): git steps may then animate.\n */\n gitIsSilent: boolean\n intro(title: string): void\n /** The last word of a session: green for a success, the tone given otherwise. */\n outro(message: string, tone?: Tone): void\n /** `sentence` replaces `verb rest` in the session look. */\n line(verb: string, rest: string, sentence?: string): void\n warn(text: string): void\n /** A block of commands or facts under a title. */\n note(title: string, lines: readonly string[]): void\n /** An aside: a plain line in the plain look, dimmed in the session one. */\n hint(text: string, stream?: 'stdout' | 'stderr'): void\n /** A handled error the command goes on after. */\n error(text: string): void\n cancelled(): void\n /** Run `work`; then print `done(result)` unless it answers null. */\n step<T>(\n options: StepOptions,\n work: () => Promise<T>,\n done?: (result: T) => Line | null\n ): Promise<T>\n}\n\nconst capitalise = (s: string): string =>\n s === '' ? s : `${s[0]?.toUpperCase() ?? ''}${s.slice(1)}`\n\n/** `cloning org/api` → `Cloning org/api`. */\nconst tidy = (label: string): string =>\n capitalise(label.replace(/\\s+/g, ' ').trim())\n\nexport const plainUi: Ui = {\n session: false,\n gitIsSilent: false,\n intro: () => undefined,\n outro: () => undefined,\n line: (verb, rest) => {\n process.stdout.write(`${status(verb, rest)}\\n`)\n },\n warn: (text) => {\n process.stderr.write(`${warn(text)}\\n`)\n },\n note: (title, lines) => {\n process.stdout.write(\n ['', `${title}:`, ...lines.map((l) => ` ${l}`), ''].join('\\n')\n )\n },\n hint: (text, stream = 'stdout') => {\n process[stream].write(`${text}\\n`)\n },\n error: (text) => {\n process.stderr.write(`${text}\\n`)\n },\n cancelled: () => {\n process.stderr.write('cancelled\\n')\n },\n async step(options, work, done) {\n // Animation is the install's; git steps write their label once.\n const result = await transientStep(\n { label: options.doing, animate: options.git !== true },\n work\n )\n const line = options.quiet === true ? null : (done?.(result) ?? null)\n if (line !== null) this.line(line[0], line[1])\n return result\n },\n}\n\nexport type Session = Required<\n Pick<Prompts, 'intro' | 'outro' | 'cancel' | 'note' | 'log' | 'spinner'>\n>\n\n/** The session look over clack's functions; exported for tests, which script them. */\n/** What a line says, once its tone has a symbol of its own to carry it. */\nconst IDLE_SYMBOL = '\\u00b7'\n\nexport function sessionUi(p: Session): Ui {\n // clack draws the gutter symbol, so it is the coloured column the plain\n // look puts first (spec 0007 §4): the text beside it stays neutral, which\n // is what lets a path lead and the paths of a list align (§5d).\n const say = (verb: string, text: string): void => {\n const tone = toneOf(verb)\n if (tone === 'done') p.log.success(text)\n else if (tone === 'warn') p.log.warn(text)\n else if (tone === 'error') p.log.error(text)\n else if (tone === 'idle')\n p.log.message(paint('idle', text), {\n symbol: paint('idle', IDLE_SYMBOL),\n })\n else p.log.info(text)\n }\n return {\n session: true,\n gitIsSilent: false,\n intro: (title) => {\n p.intro(badge(title))\n },\n outro: (message, tone = 'done') => {\n // The verdict closes a session the way the title opened it: on a\n // background, legible before the words are read (spec 0007 §5c).\n p.outro(badge(message, tone))\n },\n line: (verb, rest, sentence) => {\n // The path leads, the verb follows: in a list the paths align on the\n // left instead of starting at whatever width the verb happened to be.\n say(verb, sentence ?? `${rest} ${verb}`)\n },\n warn: (text) => {\n p.log.warn(text)\n },\n note: (title, lines) => {\n p.note(lines.join('\\n'), title, { format: (line) => grey(line) })\n },\n hint: (text) => {\n p.log.message(paint('idle', text))\n },\n error: (text) => {\n p.log.error(text)\n },\n cancelled: () => {\n p.cancel('Cancelled')\n },\n async step(options, work, done) {\n const label = options.sentence ?? tidy(options.doing)\n // The verb is kept beside its text: a finished step is said by `say`,\n // so its symbol is the one a plain line of the same tone would wear.\n const finish = (result: Awaited<ReturnType<typeof work>>): Line | null =>\n done?.(result) ?? null\n const label_ = (line: Line): string => line[2] ?? `${line[1]} ${line[0]}`\n // A spinner redraws its line: not while git's ssh may be asking for a\n // passphrase on the same terminal.\n if (options.git === true && !this.gitIsSilent) {\n p.log.message(paint('idle', `${label}…`))\n const result = await work()\n const line = finish(result)\n if (line !== null) say(line[0], label_(line))\n return result\n }\n const spin = p.spinner()\n spin.start(label)\n try {\n const result = await work()\n const line = finish(result)\n spin.stop(line === null ? label : label_(line))\n return result\n } catch (e) {\n spin.error(`${label} — failed`)\n throw e\n }\n },\n }\n}\n\n/** The session look needs a real terminal; everything else gets the plain one. */\nexport async function makeUi(terminal: Terminal): Promise<Ui> {\n const live =\n terminal.isTty() &&\n process.stdout.isTTY === true &&\n process.env['CI'] === undefined &&\n process.env['TERM'] !== 'dumb'\n if (!live) return { ...plainUi }\n const p = await terminal.prompts()\n if (\n p.intro === undefined ||\n p.outro === undefined ||\n p.cancel === undefined ||\n p.note === undefined ||\n p.log === undefined ||\n p.spinner === undefined\n )\n return { ...plainUi }\n return sessionUi({\n intro: p.intro,\n outro: p.outro,\n cancel: p.cancel,\n note: p.note,\n log: p.log,\n spinner: p.spinner,\n })\n}\n","import { basename, join } from 'node:path'\n\nimport type { CommandDeps } from '../core/deps.ts'\nimport { exists } from '../core/fs.ts'\nimport { githubProvider } from '../core/github-oauth-provider.ts'\nimport {\n CONTEXT_REPO,\n loadManifest,\n parseRepoSpec,\n workspaceName,\n} from '../core/manifest.ts'\nimport type { GitCredentials } from '../core/provider.ts'\nimport {\n type AddRepositoryResult,\n addRepository,\n workspaceDirs,\n} from '../core/repos.ts'\nimport { defaultTerminal } from '../core/terminal.ts'\nimport {\n CHECKING,\n defaultTransport,\n httpsFlagLine,\n isSshUrl,\n sshWorkspaceLines,\n testGithubSsh,\n usingRest,\n usingSentence,\n} from '../core/transport.ts'\nimport { type Ui, makeUi, plainUi } from '../core/ui.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\nimport { syncCommand } from './sync.ts'\n\nexport interface AddOptions {\n /** Comma-separated sub-directories to declare as scopes extending the repository scope. */\n scopes?: string\n /** Force `git@github.com:` without the SSH test. */\n ssh?: boolean\n /** Force `https://github.com/` without the SSH test. */\n https?: boolean\n /** Internal: remote base (`file:///…/`, another host); wins over both flags and skips the SSH test. */\n host?: string\n yes?: boolean\n /** Internal (tests): directory to resolve from. */\n cwd?: string\n}\n\n/** One `declared scope …` line per scope of `result` not named in `already`. */\nfunction printDeclared(\n ui: Ui,\n result: AddRepositoryResult,\n already: ReadonlySet<string>\n): void {\n for (const name of result.declared) {\n if (already.has(name)) continue\n const entry = result.manifest.scopes[name]\n if (entry === undefined) continue\n const ext =\n entry.extends.length === 0 ? '' : `, extends ${entry.extends.join(', ')}`\n ui.line('declared', `scope ${name} (${entry.path}${ext})`)\n }\n}\n\nconst FULL_URL = /^(https?:\\/\\/|git@|ssh:\\/\\/|file:\\/\\/)/\n\n/**\n * `rness add <repo>`: clone or adopt, declare, sync (spec 0003 §3). A name is\n * written over SSH when github.com accepts the user's key, over HTTPS\n * otherwise — except in a workspace that clones over SSH, which never falls\n * back silently (spec 0005). Returns the exit code.\n */\nexport async function addCommand(\n spec: string,\n opts: AddOptions,\n deps: Partial<CommandDeps> = {}\n): Promise<number> {\n const terminal = deps.terminal ?? defaultTerminal\n const transport = deps.transport ?? defaultTransport\n let provider = deps.provider\n const credentialsFor = async (url: string): Promise<GitCredentials | null> =>\n (provider ??= await githubProvider()).credentialsFor(url)\n const cwd = opts.cwd ?? process.cwd()\n if (opts.ssh === true && opts.https === true) {\n process.stderr.write('--ssh and --https cannot be combined\\n')\n return 2\n }\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n // The owner of a bare `<repo>`; a blank workspace has none (spec 0012).\n const org = manifest.org\n\n // The name is checked before anything else runs; the host comes later.\n let parsed: { name: string; url: string }\n try {\n parsed = parseRepoSpec(spec, org, transport.hosts.https)\n } catch (e) {\n process.stderr.write(`${e instanceof Error ? e.message : String(e)}\\n`)\n return 2\n }\n // The context repository holds the catalogue and is already cloned as\n // `<root>/.rness`. Adding it would put a second, diverging copy under\n // `org/`, list the catalogue inside itself, and give `.rness/AGENTS.md` a\n // generated member block next to the shared one (spec 0009). The name\n // decides, whatever organization it came from: every spelling lands on\n // the same directory and the same catalogue key.\n if (parsed.name === CONTEXT_REPO) {\n process.stderr.write(\n `${CONTEXT_REPO} is the workspace context, not a member repository — it is already cloned at ${basename(ws.root)}/${CONTEXT_REPO}\\n`\n )\n return 2\n }\n const interactive = opts.yes !== true\n const ownUi = deps.ui === undefined\n if (interactive && !terminal.isTty()) {\n process.stderr.write(\n 'rness add clones and writes files; pass --yes to run without a prompt\\n'\n )\n return 2\n }\n\n const ui: Ui =\n deps.ui ?? (interactive ? await makeUi(terminal) : { ...plainUi })\n if (ownUi)\n ui.intro(\n `Add ${parsed.name} to workspace ${workspaceName(manifest, ws.root)}`\n )\n // Only SSH can make git ask something on the terminal (a passphrase).\n if (opts.host !== undefined || opts.https === true) ui.gitIsSilent = true\n let host = opts.host\n if (host === undefined && opts.ssh === true) host = transport.hosts.ssh\n if (host === undefined && opts.https === true) host = transport.hosts.https\n if (host === undefined && FULL_URL.test(spec)) host = transport.hosts.https\n if (host === undefined) {\n const { access, unattended } = await testGithubSsh(\n transport,\n interactive,\n () => ui.line(...CHECKING)\n )\n if (unattended || !access.ok) ui.gitIsSilent = true\n const overSsh = Object.values(manifest.repos).some((r) =>\n isSshUrl(r.url, transport.hosts)\n )\n if (access.ok || !overSsh) {\n ui.line('using', usingRest(access), usingSentence(access))\n host = access.ok ? transport.hosts.ssh : transport.hosts.https\n } else {\n // An SSH workspace never falls back silently: say why, then let the\n // user choose HTTPS for this one repository.\n const lines = sshWorkspaceLines(access.reason)\n if (!interactive) {\n process.stderr.write(\n `${[...lines, httpsFlagLine(spec)].join('\\n')}\\n`\n )\n return 1\n }\n ui.error(lines[0])\n ui.hint(lines[1], 'stderr')\n const p = await terminal.prompts()\n const https = await p.confirm({\n message: `Clone ${parsed.name} over HTTPS instead?`,\n initialValue: false,\n })\n if (p.isCancel(https) || https !== true) return 1\n host = transport.hosts.https\n }\n }\n parsed = parseRepoSpec(spec, org, host)\n\n const scopes = (opts.scopes ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s !== '')\n const dir = join(ws.root, 'org', parsed.name)\n const present = await exists(dir)\n\n if (interactive) {\n const { confirm, isCancel } = await terminal.prompts()\n const plan = present\n ? `adopt org/${parsed.name}`\n : `clone ${parsed.url} into org/${parsed.name}`\n const ok = await confirm({\n message: `${plan}, declare scope \"${parsed.name}\" in rness.json, then sync?`,\n })\n if (isCancel(ok) || ok !== true) {\n ui.cancelled()\n return 1\n }\n }\n\n const credentials = await credentialsFor(parsed.url)\n const chosenHost = host\n let result = await ui.step(\n {\n doing: `${present ? 'adopting' : 'cloning '} org/${parsed.name}`,\n git: true,\n },\n () =>\n addRepository({\n root: ws.root,\n rnessDir: ws.rnessDir,\n manifest,\n spec,\n org,\n host: chosenHost,\n scopes,\n credentialsFor: () => credentials,\n }),\n (r) => [r.action, `org/${r.name}`]\n )\n const announced = new Set<string>()\n printDeclared(ui, result, announced)\n for (const name of result.declared) announced.add(name)\n\n // A monorepo's workspace packages are only knowable once the clone is on\n // disk, so the offer comes after it and adds to what is already declared.\n if (opts.yes !== true && scopes.length === 0) {\n const candidates = await workspaceDirs(dir)\n if (candidates.length > 0) {\n const { isCancel, multiselect } = await terminal.prompts()\n const picked = await multiselect({\n message: 'Declare these workspace packages as scopes?',\n options: candidates.map((c) => ({ value: c, label: c })),\n required: false,\n })\n if (isCancel(picked)) {\n ui.cancelled()\n return 1\n }\n // `isCancel` narrows only the unique cancel symbol, not the broader\n // `symbol` half of clack's `Value[] | symbol` return type, so an array\n // check is what narrows the rest.\n if (Array.isArray(picked) && picked.length > 0) {\n result = await addRepository({\n root: ws.root,\n rnessDir: ws.rnessDir,\n manifest: result.manifest,\n spec,\n org,\n host,\n scopes: picked,\n credentialsFor: () => credentials,\n })\n printDeclared(ui, result, announced)\n }\n }\n }\n const code = await syncCommand({ yes: true, cwd: ws.root }, { ui })\n if (ownUi)\n ui.outro(\n code === 0\n ? `${result.name} is in your workspace`\n : 'Done, with problems',\n code === 0 ? 'done' : 'warn'\n )\n return code\n } catch (e) {\n return reportError(e)\n }\n}\n","import { posix, relative, sep } from 'node:path'\n\nimport { assembleContext } from '../core/context.ts'\nimport { loadManifest } from '../core/manifest.ts'\nimport { resolveScope } from '../core/scope.ts'\nimport type { Context } from '../core/types.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\n\nexport interface ContextOptions {\n /** Scope to resolve; default: the scope owning `cwd`. */\n scope?: string\n /** Print the resolved context as JSON instead of Markdown. */\n json?: boolean\n /** Internal (tests): directory to resolve from; default `process.cwd()`. */\n cwd?: string\n}\n\nexport function renderMarkdown(ctx: Context): string {\n const parts: string[] = []\n for (const collection of ctx.collections) {\n if (collection.files.length === 0) continue\n parts.push(`## ${collection.name}\\n`)\n for (const file of collection.files) {\n parts.push(\n `<!-- rness: ${collection.name}/${file.rel} -->\\n${file.content.trim()}\\n`\n )\n }\n }\n return `${parts.join('\\n')}\\n`\n}\n\n/** `rness context`: resolve and print the context for a scope. Returns the exit code. */\nexport async function contextCommand(opts: ContextOptions): Promise<number> {\n const cwd = opts.cwd ?? process.cwd()\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n\n let scope: string | null\n if (opts.scope !== undefined) {\n if (!Object.hasOwn(manifest.scopes, opts.scope)) {\n process.stderr.write(`unknown scope: ${opts.scope}\\n`)\n return 1\n }\n scope = opts.scope\n } else {\n const rel = relative(ws.root, cwd).split(sep).join(posix.sep)\n scope = resolveScope(manifest, rel)\n }\n\n const ctx = await assembleContext({\n rnessDir: ws.rnessDir,\n manifest,\n scope,\n })\n process.stdout.write(\n opts.json ? `${JSON.stringify(ctx, null, 2)}\\n` : renderMarkdown(ctx)\n )\n return 0\n } catch (e) {\n return reportError(e)\n }\n}\n","import { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nimport { findWorkspace } from './workspace.ts'\n\nexport interface Delegate {\n /** Absolute path of the pinned copy's `dist/index.js`. */\n entry: string\n version: string\n /** Workspace root (the directory holding `.rness/`). */\n root: string\n}\n\nexport interface PinnedCli {\n /** Absolute path of `<rnessDir>/node_modules/@rness/cli`. */\n dir: string\n /** `bin.rness` as the package declares it (package-relative, POSIX). */\n bin: string\n version: string | null\n}\n\n/** A published `@rness/cli` whose `package.json` has no usable `bin`. */\nconst DEFAULT_BIN = 'dist/bin/rness.js'\n\n/**\n * The `@rness/cli` installed under `<rnessDir>/node_modules`, or null when\n * nothing is installed there. Reading the package's own `package.json` is what\n * makes the launcher and `create` agree on which copy owns a workspace.\n */\nexport async function readPinnedCli(\n rnessDir: string\n): Promise<PinnedCli | null> {\n const dir = join(rnessDir, 'node_modules', '@rness', 'cli')\n let pkg: { version?: unknown; bin?: unknown }\n try {\n pkg = JSON.parse(await readFile(join(dir, 'package.json'), 'utf8')) as {\n version?: unknown\n bin?: unknown\n }\n } catch {\n return null\n }\n const declared = pkg.bin\n let bin = DEFAULT_BIN\n if (typeof declared === 'string') bin = declared\n else if (declared !== null && typeof declared === 'object') {\n const named = (declared as Record<string, unknown>)['rness']\n if (typeof named === 'string') bin = named\n }\n return {\n dir,\n bin,\n version: typeof pkg.version === 'string' ? pkg.version : null,\n }\n}\n\n/** Absolute path of the pinned copy's executable, or null when nothing is installed. */\nexport async function pinnedBinPath(rnessDir: string): Promise<string | null> {\n const pinned = await readPinnedCli(rnessDir)\n if (pinned === null) return null\n return join(pinned.dir, ...pinned.bin.split('/'))\n}\n\n/**\n * The `@rness/cli` pinned in `<workspace>/.rness/package.json` (installed under\n * `.rness/node_modules`), when it exists and is not the running version. The\n * pinned copy is the only one that should ever act on a workspace.\n */\nexport async function findDelegate(\n cwd: string,\n ownVersion: string\n): Promise<Delegate | null> {\n let root: string\n let rnessDir: string\n try {\n const ws = await findWorkspace(cwd)\n root = ws.root\n rnessDir = ws.rnessDir\n } catch {\n return null\n }\n const pinned = await readPinnedCli(rnessDir)\n if (pinned === null) return null\n const { version } = pinned\n if (version === null || version === ownVersion) return null\n return { entry: join(pinned.dir, 'dist', 'index.js'), version, root }\n}\n","import { statSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\n/**\n * Files shipped in `scaffold/`, POSIX-relative. `_gitignore` is renamed to\n * `.gitignore` when copied (npm would rename a packed `.gitignore`).\n */\nexport const SCAFFOLD_FILES: readonly string[] = [\n 'AGENTS.md',\n 'CONVENTIONS.md',\n 'README.md',\n 'WORKSPACE.md',\n 'rness.json',\n 'package.json',\n '_gitignore',\n '.githooks/pre-commit',\n '.github/workflows/validate.yml',\n '.github/dependabot.yml',\n 'pnpm-workspace.yaml',\n 'adr/0000-template.md',\n 'standards/.gitkeep',\n 'specs/.gitkeep',\n 'plans/.gitkeep',\n 'skills/.gitkeep',\n 'docs/.gitkeep',\n]\n\n/**\n * Absolute path of the shipped scaffold. Works from the sources\n * (`src/core/scaffold.ts` → `../../scaffold`) and from the bundle\n * (`dist/<chunk>.js` or `dist/index.js` → `../scaffold`): walk up from this\n * file until a directory containing `scaffold/rness.json` is the package root.\n */\nexport function scaffoldDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 4; i += 1) {\n const candidate = join(dir, 'scaffold')\n try {\n if (statSync(join(candidate, 'rness.json')).isFile()) return candidate\n } catch {\n // keep walking\n }\n dir = dirname(dir)\n }\n throw new Error('scaffold directory not found next to the @rness/cli package')\n}\n","import { chmod, mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nimport { SCAFFOLD_FILES, scaffoldDir } from './scaffold.ts'\n\nexport interface ScaffoldTokens {\n version: string\n packageManager: string\n}\n\n/** One file a scaffold version writes into `.rness/`, as it lands there. */\nexport interface ScaffoldFile {\n /** POSIX, relative to `.rness/`. */\n path: string\n content: string\n executable: boolean\n}\n\n// The CI workflow reads the pinned version from package.json (spec 0006 §2).\nconst TOKENISED = new Set(['package.json'])\n\n/**\n * The files the scaffold in `source` writes, rendered: `_gitignore` as\n * `.gitignore`, the tokens of `package.json` filled. `rness.json` is the\n * team's catalogue, never part of it (spec 0013 §1).\n */\nexport async function renderScaffold(\n source: string,\n tokens: ScaffoldTokens\n): Promise<ScaffoldFile[]> {\n const files: ScaffoldFile[] = []\n for (const rel of SCAFFOLD_FILES) {\n if (rel === 'rness.json') continue\n const from = join(source, ...rel.split('/'))\n let content = await readFile(from, 'utf8')\n if (TOKENISED.has(rel)) {\n content = content\n .replaceAll('__RNESS_VERSION__', tokens.version)\n .replaceAll('__RNESS_PM__', tokens.packageManager)\n }\n files.push({\n path: rel === '_gitignore' ? '.gitignore' : rel,\n content,\n executable: ((await stat(from)).mode & 0o111) !== 0,\n })\n }\n return files\n}\n\n/** Materialise the shipped skeleton into `dest` (spec 0003 §2.1 step 3); `rness.json` is the caller's. */\nexport async function copyScaffold(\n dest: string,\n tokens: ScaffoldTokens\n): Promise<void> {\n for (const file of await renderScaffold(scaffoldDir(), tokens)) {\n const to = join(dest, ...file.path.split('/'))\n await mkdir(dirname(to), { recursive: true })\n await writeFile(to, file.content, 'utf8')\n if (file.executable) await chmod(to, 0o755)\n }\n}\n","import { spawn } from 'node:child_process'\nimport { realpath } from 'node:fs/promises'\n\nimport { envToken, readAuth, resolveToken, writeAuth } from '../core/auth.ts'\nimport {\n LoginError,\n type PollDeps,\n clientId,\n pollForToken,\n requestDeviceCode,\n} from '../core/device-flow.ts'\nimport { DEFAULT_GITHUB_API, getUser } from '../core/github.ts'\nimport { rnessCommand } from '../core/pm.ts'\nimport { isStableInstall, setupGit } from '../core/setup-git.ts'\nimport { type Terminal, defaultTerminal } from '../core/terminal.ts'\nimport { type Ui, makeUi } from '../core/ui.ts'\nimport { reportError } from '../report.ts'\n\nexport interface LoginOptions {\n /** `--setup-git` / `--no-setup-git`; undefined asks in a terminal. */\n setupGit?: boolean\n /** Internal (tests): GitHub REST API base. */\n githubApi?: string\n}\n\nexport interface LoginDeps extends PollDeps {\n terminal?: Terminal\n /** The caller's reporter: `create` logs in from inside its own session. */\n ui?: Ui\n /** Open a URL in the browser; failures are nobody's problem. */\n open?: (url: string) => void\n /** This rness's launcher, as git will have to find it. */\n bin?: string\n}\n\nfunction openInBrowser(url: string): void {\n const [command, args] =\n process.platform === 'darwin'\n ? ['open', [url]]\n : process.platform === 'win32'\n ? ['cmd', ['/c', 'start', '', url]]\n : ['xdg-open', [url]]\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true })\n child.on('error', () => undefined)\n child.unref()\n } catch {\n // no browser here: the URL is on the screen\n }\n}\n\n/** The question of spec 0004 §5, or the line that replaces it under npx. */\nasync function offerSetupGit(\n opts: LoginOptions,\n terminal: Terminal,\n bin: string,\n ui: Ui\n): Promise<void> {\n if (opts.setupGit === false) return\n if (!isStableInstall(bin)) {\n ui.hint(\n 'install rness globally to let git use your login: npm i -g @rness/cli'\n )\n return\n }\n if (opts.setupGit !== true) {\n if (!terminal.isTty()) return\n const p = await terminal.prompts()\n const ok = await p.confirm({\n message: 'Use rness to authenticate git over HTTPS for github.com?',\n initialValue: true,\n })\n if (p.isCancel(ok) || ok !== true) return\n }\n const changed = await setupGit(process.execPath, bin)\n ui.line(\n changed ? 'updated' : 'unchanged',\n `git: rness answers for https://github.com (${rnessCommand()} logout undoes it)`,\n `git now asks rness for your github.com login over HTTPS (${rnessCommand()} logout undoes it)`\n )\n}\n\n/**\n * `rness login`: GitHub's device flow (spec 0004 §2). Concerns the machine,\n * not a workspace: never delegated to a pinned copy.\n */\nexport async function loginCommand(\n opts: LoginOptions,\n deps: LoginDeps = {}\n): Promise<number> {\n const terminal = deps.terminal ?? defaultTerminal\n // On its own `login` is a session of its own; inside `create` it is a part.\n const own = deps.ui === undefined\n const ui = deps.ui ?? (await makeUi(terminal))\n if (own) ui.intro('Log in to GitHub')\n try {\n const bin =\n deps.bin ?? (await realpath(process.argv[1] ?? '').catch(() => ''))\n const env = envToken()\n if (env !== null)\n ui.hint(`${env.source} is set and wins over a stored login`)\n const stored = await readAuth()\n if (stored !== null && (await resolveToken()) !== null) {\n ui.line(\n 'logged in',\n `as ${stored.login} (github.com); ${rnessCommand()} logout to switch`\n )\n await offerSetupGit(opts, terminal, bin, ui)\n if (own) ui.outro('Nothing to do', 'idle')\n return 0\n }\n\n const code = await requestDeviceCode()\n if (ui.session)\n ui.line(\n 'open',\n code.verificationUri,\n `Open ${code.verificationUri} and enter the code ${code.userCode}`\n )\n else {\n ui.line('open', code.verificationUri)\n ui.line('code', code.userCode)\n }\n if (terminal.isTty() && process.env['SSH_CONNECTION'] === undefined)\n (deps.open ?? openInBrowser)(code.verificationUri)\n // The plain look says it is waiting, then who logged in; the session\n // look spins, and the spinner ends as that second line.\n if (!ui.session)\n ui.line('waiting', 'for you to approve rness on github.com…')\n const login = await ui.step(\n {\n doing: 'waiting for you to approve rness on github.com',\n sentence: 'Waiting for your approval on github.com',\n quiet: true,\n },\n async () => {\n const tokens = await pollForToken(code, deps)\n const user = await getUser({\n token: tokens.accessToken,\n apiBase: opts.githubApi ?? DEFAULT_GITHUB_API,\n })\n await writeAuth({ login: user.login, tokens })\n return user.login\n },\n (name) => ['logged in', `as ${name} (github.com)`]\n )\n if (!ui.session) ui.line('logged in', `as ${login} (github.com)`)\n await offerSetupGit(opts, terminal, bin, ui)\n if (own) ui.outro(`You are logged in as ${login}`)\n return 0\n } catch (e) {\n if (e instanceof LoginError) {\n ui.error(e.message)\n return 1\n }\n return reportError(e)\n }\n}\n\n/** Where a user revokes what `rness login` was granted; doing it by API needs the client secret. */\nexport function revokeUrl(): string {\n return `https://github.com/settings/connections/applications/${clientId()}`\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\n\nconst execFileP = promisify(execFile)\n\n// Making rness git's credential helper for github.com (spec 0004 §5): what\n// `gh auth setup-git` does for gh. Two values under one key — an empty one,\n// which clears the helpers inherited from the system (osxkeychain would\n// otherwise answer first), then rness, by absolute path so git finds it\n// whatever PATH it runs with.\n\nconst KEY = 'credential.https://github.com.helper'\n\nexport function helperValue(node: string, bin: string): string {\n return `!'${node}' '${bin}' git-credential`\n}\n\n// The shape `helperValue` writes — not gh's `!gh auth git-credential`, nor\n// anyone else's helper that happens to end the same way.\nconst isOurs = (value: string): boolean =>\n /^!'[^']+' '[^']*rness[^']*' git-credential$/.test(value)\n\nasync function config(args: string[]): Promise<string> {\n const { stdout } = await execFileP('git', ['config', '--global', ...args])\n return stdout\n}\n\nasync function values(): Promise<string[]> {\n try {\n const out = await config(['--get-all', KEY])\n return out.replace(/\\n$/, '').split('\\n')\n } catch {\n return [] // the key is not set\n }\n}\n\n/** A copy run through npx lives in a cache that is cleared: not a path to give git. */\nexport function isStableInstall(bin: string): boolean {\n return !/[\\\\/]_npx[\\\\/]/.test(bin)\n}\n\n/** Register rness for github.com. False when it already was. */\nexport async function setupGit(node: string, bin: string): Promise<boolean> {\n const ours = helperValue(node, bin)\n if ((await values()).includes(ours)) return false\n // A stale rness entry (another install path) goes first.\n await removeGitSetup()\n await config(['--add', KEY, ''])\n await config(['--add', KEY, ours])\n return true\n}\n\n/**\n * Remove exactly what `setupGit` wrote: rness's entry and the empty one in\n * front of it. A helper someone else registered is left as it was. False\n * when there was nothing of rness's.\n */\nexport async function removeGitSetup(): Promise<boolean> {\n const current = await values()\n if (!current.some(isOurs)) return false\n const kept = current.filter(\n (value, i) =>\n !isOurs(value) && !(value === '' && isOurs(current[i + 1] ?? ''))\n )\n await config(['--unset-all', KEY])\n for (const value of kept) await config(['--add', KEY, value])\n return true\n}\n","import { mkdir, mkdtemp, rename, rm } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join, relative, resolve } from 'node:path'\n\nimport { SUPPORTED_AGENTS, unsupportedAgents } from '../core/agents.ts'\nimport { askAgents } from '../core/ask-agents.ts'\nimport type { CommandDeps } from '../core/deps.ts'\nimport { clone, publish } from '../core/git.ts'\nimport { githubProvider } from '../core/github-oauth-provider.ts'\nimport { MAX_PAGES, PER_PAGE } from '../core/github.ts'\nimport {\n NAME,\n ORG_NAME,\n isMemberRepo,\n loadManifest,\n parseRepoSpec,\n} from '../core/manifest.ts'\nimport {\n buildContext,\n commitContext,\n insideWorkspace,\n installContext,\n targetProblem,\n} from '../core/new-workspace.ts'\nimport { workspacePackageManager } from '../core/pinned.ts'\nimport {\n PACKAGE_MANAGERS,\n type PackageManager,\n detectPackageManager,\n isPackageManager,\n rnessCommand,\n} from '../core/pm.ts'\nimport type { GitCredentials, GitProvider } from '../core/provider.ts'\nimport { probeRemote, repoUrl } from '../core/remote.ts'\nimport { addRepository } from '../core/repos.ts'\nimport { PRIVATE_MARK, banner, unicode } from '../core/style.ts'\nimport { syncBlocks } from '../core/sync-blocks.ts'\nimport {\n type Prompts,\n type Terminal,\n defaultTerminal,\n} from '../core/terminal.ts'\nimport {\n CHECKING,\n INSTEAD_OF_LINES,\n type SshAccess,\n type SshTest,\n defaultTransport,\n isSshUrl,\n sshWorkspaceLines,\n testGithubSsh,\n usingRest,\n usingSentence,\n} from '../core/transport.ts'\nimport type { Manifest } from '../core/types.ts'\nimport { type Ui, makeUi, plainUi } from '../core/ui.ts'\nimport { clonesIn } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\nimport { VERSION } from '../version.ts'\nimport {\n WORKSPACE_NAME,\n createBlank,\n workspaceNameError,\n} from './create-blank.ts'\nimport { loginCommand, revokeUrl } from './login.ts'\nimport { syncCommand } from './sync.ts'\n\nexport interface CreateOptions {\n /** The GitHub organization, exact name (`github.com/<org>`); prompted for when absent. */\n org?: string\n /** Comma-separated repositories for the workspace (`<repo>` or `<owner>/<repo>`): catalogue entries are cloned, others added. */\n repos?: string\n pm?: string\n /** Force `git@github.com:` without the SSH test. */\n ssh?: boolean\n /** Force `https://github.com/` without the SSH test. */\n https?: boolean\n /** Internal: remote base; wins over both flags and skips the SSH test. */\n host?: string\n yes?: boolean\n skipInstall?: boolean\n /** Reserved; rejected. */\n template?: string\n /** A workspace with no GitHub organization (spec 0012). */\n blank?: boolean\n /** With `blank`: the workspace directory; prompted for when absent. */\n name?: string\n /** A new workspace's agents, declared in rness.json (spec 0011 §3.2). */\n agent?: string[]\n /** Internal (tests): directory to resolve from. */\n cwd?: string\n /** Internal (tests): GitHub REST API base. */\n githubApi?: string\n}\n\nexport type { Prompts }\n\n/** What create needs from the terminal; tests replace it with scripted answers. */\nexport type CreateDeps = Terminal\n\nfunction firstLine(text: string): string {\n return (\n text\n .split('\\n')\n .find((l) => l.trim() !== '')\n ?.trim() ?? 'unknown error'\n )\n}\n\nfunction splitSpecs(list: string): string[] {\n return list\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s !== '')\n}\n\n// A cancelled or declined prompt is the user's choice, not a failure: exit 0\n// so `npm create rness` does not wrap it in npm's error report.\nfunction cancelled(ui: Ui): number {\n ui.cancelled()\n return 0\n}\n\n/**\n * The repositories to offer: the organization's, listed from the GitHub API,\n * plus every catalogue repository the API did not return (a private one\n * listed anonymously). Catalogue repositories are pre-selected. A listing that\n * fails is a warning: the catalogue is still offered, and `rness add` adds\n * repositories later. `null` when the user cancels; `prompted` tells whether\n * the picker was shown at all.\n */\nasync function pickRepositories(input: {\n org: string\n provider: GitProvider\n prompts: Prompts\n ui: Ui\n catalogue: Readonly<Record<string, unknown>>\n}): Promise<{ picked: string[]; prompted: boolean } | null> {\n const { org, prompts, provider, ui } = input\n // Logged in: say as whom rness looks at the organization, and when the\n // organization hides its private repositories from OAuth apps (spec 0004 §3).\n if (provider.authenticated) {\n const access = await provider.organizationAccess(org)\n const login = (await provider.identity())?.login\n if (access === 'member')\n ui.line(\n 'member',\n `${org}${login === undefined ? '' : ` (as ${login})`}`,\n `You are a member of ${org}${login === undefined ? '' : ` (as ${login})`}`\n )\n else if (access === 'restricted') {\n ui.warn(\n `${org} restricts OAuth apps, so its private repositories are hidden from rness`\n )\n ui.hint(`ask an owner to approve it: ${revokeUrl()}`, 'stderr')\n }\n }\n let listed: { name: string; private: boolean; archived: boolean }[] = []\n let failed = false\n // The plain look announces the listing; the session look spins on it.\n if (!ui.session) ui.line('listing', `${org} repositories…`)\n try {\n const listing = await ui.step(\n {\n doing: `listing ${org} repositories`,\n sentence: `Listing the repositories of ${org}`,\n quiet: true,\n },\n () => provider.listRepositories(org),\n // What the listing offers, not what GitHub returned: the count and the\n // list below it must agree (spec 0009).\n (l) => [\n 'listed',\n `${l.repositories.filter(isMemberRepo).length} repositories of ${org}`,\n ]\n )\n listed = listing.repositories\n if (listing.owner === 'user')\n ui.hint(\n `only public repositories of ${org} are listed; add private ones later with ${rnessCommand()} add <repo>`\n )\n else if (!provider.authenticated)\n ui.hint(\n `only public repositories are listed; ${rnessCommand()} login lists the private ones you can access`\n )\n if (listing.truncated)\n ui.hint(`listed the first ${MAX_PAGES * PER_PAGE} repositories of ${org}`)\n } catch (e) {\n failed = true\n ui.warn(firstLine(e instanceof Error ? e.message : String(e)))\n }\n const inCatalogue = (name: string): boolean =>\n Object.hasOwn(input.catalogue, name)\n // Every active repository of the organization is a candidate but its context\n // repository, which is already cloned as `<root>/.rness` and is not a member\n // of the workspace it defines (spec 0009). A name beginning with a dot is an\n // ordinary repository: `.github` carries an organization's profile, its\n // issue templates and its shared workflows, and a member works on it like\n // any other. Archived repositories stay out: GitHub makes them read-only, so\n // a block written into one could never be pushed back.\n // GitHub names are case-insensitive, so a name that differs from `NAME` only\n // by case is offered — and declared — in lowercase, as `rness add` would;\n // any other name is shown but cannot be picked yet.\n const byLabel = (a: { label: string }, b: { label: string }): number =>\n a.label.localeCompare(b.label, 'en', { sensitivity: 'base' })\n const candidates = listed.filter(isMemberRepo)\n // A private repository wears a padlock next to its name — visible on every\n // line, where a hint shows on the focused one only. A terminal that cannot\n // draw it falls back to the word, as a hint.\n const padlock = unicode()\n const hint = (isPrivate: boolean, catalogued: boolean): string | null =>\n [isPrivate && !padlock ? 'private' : null, catalogued ? 'in .rness' : null]\n .filter((h) => h !== null)\n .join(' · ') || null\n const declarable = candidates\n .filter((r) => NAME.test(r.name.toLowerCase()))\n .map((r) => {\n const value = r.name.toLowerCase()\n const h = hint(r.private, inCatalogue(value))\n const label = r.private && padlock ? `${r.name} ${PRIVATE_MARK}` : r.name\n return { value, label, ...(h === null ? {} : { hint: h }) }\n })\n const offered = new Set(declarable.map((o) => o.value))\n for (const name of Object.keys(input.catalogue)) {\n if (!offered.has(name))\n declarable.push({ value: name, label: name, hint: 'in .rness' })\n }\n declarable.sort(byLabel)\n const unsupported = candidates\n .filter((r) => !NAME.test(r.name.toLowerCase()))\n .map((r) => ({\n value: r.name,\n label: r.name,\n hint: 'name not supported yet',\n disabled: true,\n }))\n .sort(byLabel)\n // clack renders a disabled option struck through but never its hint, so\n // the reason is printed here.\n if (unsupported.length > 0) {\n const names = unsupported.slice(0, 5).map((o) => o.label)\n const more =\n unsupported.length > names.length\n ? ` and ${unsupported.length - names.length} more`\n : ''\n ui.hint(\n `names rness cannot declare yet (struck through): ${names.join(', ')}${more}`\n )\n }\n if (declarable.length === 0) {\n // After a failed listing its own warning already says why.\n if (!failed) ui.warn(`no repositories to list for ${org}`)\n return { picked: [], prompted: false }\n }\n const initialValues = Object.keys(input.catalogue)\n // Disabled options go last: clack focuses the first option before any key\n // is pressed, and Tab would select it even when it is disabled.\n const answer = await prompts.autocompleteMultiselect<string>({\n message: 'Which repositories do you want in your workspace?',\n options: [...declarable, ...unsupported],\n ...(initialValues.length > 0 ? { initialValues } : {}),\n required: false,\n placeholder: 'Type to filter',\n })\n if (prompts.isCancel(answer)) return null\n const allowed = new Set(declarable.map((o) => o.value))\n return {\n picked: Array.isArray(answer) ? answer.filter((v) => allowed.has(v)) : [],\n prompted: true,\n }\n}\n\ninterface Failure {\n spec: string\n message: string\n}\n\n/**\n * Bring each selected repository into `org/`, in order. A catalogue\n * repository is cloned from its catalogue URL and `rness.json` is left alone;\n * any other goes through `addRepository` (declared, then cloned), as\n * `rness add` would. A failure is reported on one line and the next entry\n * still runs: a typo in `--repos` must not cost the workspace the\n * repositories that do exist, nor the commit and sync that follow.\n */\nasync function cloneSelection(input: {\n root: string\n rnessDir: string\n manifest: Manifest\n org: string\n host: string\n specs: readonly string[]\n provider: GitProvider\n ui: Ui\n}): Promise<Failure[]> {\n const { ui } = input\n let manifest = input.manifest\n const failures: Failure[] = []\n for (const spec of new Set(input.specs)) {\n try {\n let name: string | null = null\n try {\n name = parseRepoSpec(spec, input.org, input.host).name\n } catch {\n // `addRepository` reports the malformed spec below.\n }\n const entry = name === null ? undefined : manifest.repos[name]\n if (name !== null && entry !== undefined) {\n const repo = name\n await ui.step(\n { doing: `cloning org/${repo}`, git: true },\n () =>\n clone(\n entry.url,\n join(input.root, 'org', repo),\n input.provider.credentialsFor(entry.url)\n ),\n () => ['cloned', `org/${repo}`]\n )\n continue\n }\n const current = manifest\n const result = await ui.step(\n { doing: `cloning ${spec}`, git: true },\n () =>\n addRepository({\n root: input.root,\n rnessDir: input.rnessDir,\n manifest: current,\n spec,\n org: input.org,\n host: input.host,\n scopes: [],\n credentialsFor: (url) => input.provider.credentialsFor(url),\n }),\n (r) => [r.action, `org/${r.name}`]\n )\n manifest = result.manifest\n ui.line('declared', `scope ${result.name} (org/${result.name})`)\n } catch (e) {\n const message = firstLine(e instanceof Error ? e.message : String(e))\n ui.error(`${spec}: ${message}`)\n failures.push({ spec, message })\n }\n }\n return failures\n}\n\n/**\n * Move the staged `.rness` clone into the workspace. A rename is atomic and\n * keeps the clone's origin; across filesystems (`EXDEV`: the temporary\n * directory on another volume) the context is cloned a second time instead.\n */\nasync function placeContext(\n staged: string,\n rnessDir: string,\n url: string,\n credentials: GitCredentials | null\n): Promise<void> {\n try {\n await rename(staged, rnessDir)\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'EXDEV') throw e\n await clone(url, rnessDir, credentials)\n }\n}\n\n/** The flags that name a GitHub workspace, which a blank one has none of. */\nfunction blankConflict(opts: CreateOptions): string | null {\n if (opts.org !== undefined) return '--org'\n if (opts.repos !== undefined) return '--repos'\n if (opts.ssh === true) return '--ssh'\n if (opts.https === true) return '--https'\n if (opts.host !== undefined) return '--host'\n return null\n}\n\n/**\n * The wizard's first question (spec 0012): from a GitHub organization, the\n * flow below, or a blank local workspace. Null is a cancel.\n */\nasync function chooseStart(\n prompts: Prompts\n): Promise<'github' | 'blank' | null> {\n const answer = await prompts.select<string>({\n message: 'How do you want to start?',\n options: [\n { value: 'github', label: 'From a GitHub organization' },\n { value: 'blank', label: 'Blank local workspace' },\n ],\n })\n if (prompts.isCancel(answer)) return null\n return answer === 'blank' ? 'blank' : 'github'\n}\n\nconst OTHER = Symbol('another organization')\n\n/**\n * Logged in, the organization is picked from the user's own and their\n * account rather than typed. `OTHER` leads to the text prompt — as does\n * having nothing to offer; null is a cancel.\n */\nasync function chooseOrganization(\n provider: GitProvider,\n prompts: Prompts\n): Promise<string | typeof OTHER | null> {\n if (!provider.authenticated) return OTHER\n let names: string[]\n try {\n const self = (await provider.identity())?.login\n names = (await provider.listOrganizations()).map((o) => o.login)\n if (self !== undefined) names.push(self)\n } catch {\n return OTHER\n }\n if (names.length === 0) return OTHER\n const answer = await prompts.select<string>({\n message: 'Which GitHub organization?',\n options: [\n ...names.map((name) => ({ value: name, label: name })),\n { value: '', label: 'another one…' },\n ],\n })\n if (prompts.isCancel(answer)) return null\n if (typeof answer !== 'string' || answer === '') return OTHER\n return answer\n}\n\n/**\n * Offer to create `<org>/.rness` on GitHub and push the new context to it.\n * True when it is published, false when it is left to the user (anonymous,\n * declined, refused by GitHub — said in one warning), null on a cancel.\n */\nasync function publishContext(input: {\n ui: Ui\n prompts: Prompts\n provider: GitProvider\n org: string\n rnessDir: string\n url: string\n}): Promise<boolean | null> {\n const { ui, prompts, provider, org } = input\n if (!provider.authenticated) return false\n const ok = await prompts.confirm({\n message: `Create ${org}/.rness on GitHub (private) and push it?`,\n initialValue: true,\n })\n if (prompts.isCancel(ok)) return null\n if (ok !== true) return false\n try {\n const result = await ui.step(\n { doing: `creating ${org}/.rness on GitHub` },\n () => provider.createRepository(org, '.rness')\n )\n if (result.kind === 'exists') {\n ui.warn(`${org}/.rness already exists on GitHub; nothing was pushed`)\n return false\n }\n if (result.kind === 'refused') {\n ui.warn(`GitHub did not create ${org}/.rness: ${result.reason}`)\n return false\n }\n ui.line('created', `github.com/${org}/.rness (private)`)\n await ui.step(\n { doing: `pushing ${org}/.rness`, git: true },\n () =>\n publish(input.rnessDir, input.url, provider.credentialsFor(input.url)),\n () => ['pushed', `${org}/.rness`]\n )\n return true\n } catch (e) {\n ui.warn(firstLine(e instanceof Error ? e.message : String(e)))\n return false\n }\n}\n\n/**\n * `rness create`: join the organization's `.rness` or start a new one in\n * `./<org>` (spec 0003 §2.1). `rness.json` is the organization's catalogue;\n * the workspace is the selection of it cloned into `org/`. Every prompt comes\n * before the first write, so a cancel leaves nothing behind. URLs are written\n * over SSH when github.com accepts the user's key, over HTTPS otherwise\n * (spec 0005); a catalogue URL is cloned as written.\n */\nexport async function createCommand(\n opts: CreateOptions,\n deps: Partial<CommandDeps> = {}\n): Promise<number> {\n const terminal = deps.terminal ?? defaultTerminal\n const transport = deps.transport ?? defaultTransport\n // Built on first use: it reads the stored login, which most paths never need.\n let provider = deps.provider\n const getProvider = async (): Promise<GitProvider> =>\n (provider ??= await githubProvider(opts.githubApi))\n const cwd = opts.cwd ?? process.cwd()\n if (opts.template !== undefined) {\n process.stderr.write('--template is reserved for a later version\\n')\n return 2\n }\n if (opts.pm !== undefined && !isPackageManager(opts.pm)) {\n process.stderr.write(`--pm must be one of ${PACKAGE_MANAGERS.join(', ')}\\n`)\n return 2\n }\n const agentFlags = [...new Set(opts.agent ?? [])]\n const unknownAgent = unsupportedAgents(agentFlags)[0]\n if (unknownAgent !== undefined) {\n process.stderr.write(\n `unknown agent \"${unknownAgent}\" (supported: ${SUPPORTED_AGENTS.join(', ')})\\n`\n )\n return 2\n }\n if (opts.ssh === true && opts.https === true) {\n process.stderr.write('--ssh and --https cannot be combined\\n')\n return 2\n }\n if (opts.blank === true) {\n const clash = blankConflict(opts)\n if (clash !== null) {\n process.stderr.write(`--blank cannot be combined with ${clash}\\n`)\n return 2\n }\n if (opts.name !== undefined && !WORKSPACE_NAME.test(opts.name)) {\n process.stderr.write(`${workspaceNameError(opts.name)}\\n`)\n return 2\n }\n }\n // A malformed flag is refused before any question is asked about the rest.\n if (opts.org !== undefined && !ORG_NAME.test(opts.org)) {\n process.stderr.write(\n `organization name \"${opts.org}\" is not a valid GitHub organization name\\n`\n )\n return 2\n }\n let pm: PackageManager =\n opts.pm !== undefined && isPackageManager(opts.pm)\n ? opts.pm\n : detectPackageManager()\n const interactive = opts.yes !== true && terminal.isTty()\n // The plain look unless this is a wizard in a real terminal (spec 0007 §5b).\n const ui = interactive ? await makeUi(terminal) : { ...plainUi }\n // The SSH test runs at most once, and only when its answer is needed.\n let sshTest: SshTest | undefined\n const testSsh = async (): Promise<SshAccess> => {\n if (sshTest === undefined) {\n sshTest = await testGithubSsh(transport, interactive, () =>\n ui.line(...CHECKING)\n )\n // Unattended SSH never asks anything: git steps may animate.\n if (sshTest.unattended) ui.gitIsSilent = true\n }\n return sshTest.access\n }\n // Whether this machine's SSH access to github.com was proved. A delegated\n // child that then fails on publickey is missing an agent, not a key\n // (spec 0008 §2.1).\n const sshWorks = (): boolean => sshTest?.access.ok === true\n const chooseHost = async (): Promise<string> => {\n // Only SSH can make git ask something on the terminal (a passphrase).\n if (opts.host !== undefined || opts.https === true) ui.gitIsSilent = true\n if (opts.host !== undefined) return opts.host\n if (opts.ssh === true) return transport.hosts.ssh\n if (opts.https === true) return transport.hosts.https\n const access = await testSsh()\n const github = access.ok ? null : await getProvider()\n const login = github?.authenticated\n ? (await github.identity())?.login\n : undefined\n ui.line('using', usingRest(access, login), usingSentence(access, login))\n if (!access.ok) ui.gitIsSilent = true\n return access.ok ? transport.hosts.ssh : transport.hosts.https\n }\n let loaded: Prompts | undefined\n const prompts = async (): Promise<Prompts> =>\n (loaded ??= await terminal.prompts())\n let staging: string | undefined\n // '' off a terminal, so scripts and tests see nothing of it.\n if (interactive) process.stdout.write(banner(VERSION))\n ui.intro('Create a workspace')\n try {\n // In a terminal, before the first question: no answer could fix it.\n if (interactive && (await insideWorkspace(cwd))) {\n process.stderr.write(\n 'already inside an rness workspace; create runs from outside one\\n'\n )\n return 1\n }\n\n // Blank, or the wizard's first answer: no GitHub step at all. An\n // organization or repositories on the command line settle it.\n let blank = opts.blank === true\n if (\n !blank &&\n interactive &&\n opts.org === undefined &&\n opts.repos === undefined\n ) {\n const start = await chooseStart(await prompts())\n if (start === null) return cancelled(ui)\n blank = start === 'blank'\n }\n if (blank)\n return await createBlank({\n name: opts.name,\n agents: agentFlags,\n cwd,\n pm,\n interactive,\n mayWrite: opts.yes === true || terminal.isTty(),\n skipInstall: opts.skipInstall === true,\n ui,\n prompts,\n })\n\n let prompted = false\n let org = opts.org\n if (org === undefined && !interactive) {\n process.stderr.write('rness create needs --org <name> without a prompt\\n')\n return 2\n }\n // Anonymous, and about to list repositories: offer the login first — it is\n // what lists the private ones, and the user's organizations to pick from.\n if (\n interactive &&\n opts.repos === undefined &&\n !(await getProvider()).authenticated\n ) {\n const p = await prompts()\n const login = await p.confirm({\n message: 'Log in to GitHub to list private repositories?',\n initialValue: true,\n })\n if (p.isCancel(login)) return cancelled(ui)\n if (login === true) {\n const code = await loginCommand(\n opts.githubApi === undefined ? {} : { githubApi: opts.githubApi },\n { terminal, ui }\n )\n if (code !== 0) return code\n provider = await githubProvider(opts.githubApi)\n }\n }\n if (org === undefined) {\n const chosen = await chooseOrganization(\n await getProvider(),\n await prompts()\n )\n if (chosen === null) return cancelled(ui)\n if (chosen !== OTHER) {\n org = chosen\n prompted = true\n }\n }\n if (org === undefined) {\n const p = await prompts()\n const answer = await p.text({\n message: 'What is your GitHub organization named?',\n placeholder: 'acme',\n validate: (value) => {\n const v = value?.trim() ?? ''\n return ORG_NAME.test(v)\n ? undefined\n : `\"${v}\" is not a valid GitHub organization name`\n },\n })\n if (p.isCancel(answer) || typeof answer !== 'string') return cancelled(ui)\n org = answer.trim()\n prompted = true\n }\n\n // The organization is the workspace: its directory carries the exact name.\n const root = resolve(cwd, org)\n const shown = relative(cwd, root) || '.'\n const problem = await targetProblem(cwd, root, pm)\n if (problem !== null) {\n process.stderr.write(`${problem}\\n`)\n return 1\n }\n if (opts.yes !== true && !terminal.isTty()) {\n process.stderr.write(\n 'rness create writes files; pass --yes to run without a prompt\\n'\n )\n return 2\n }\n\n const host = await chooseHost()\n const contextUrl = repoUrl(host, org, '.rness')\n const gitProvider = await getProvider()\n const probe = await probeRemote(\n contextUrl,\n undefined,\n gitProvider.credentialsFor(contextUrl)\n )\n if (probe.kind === 'error') {\n process.stderr.write(`${probe.message}\\n`)\n return 1\n }\n const joining = probe.kind === 'found'\n // A join takes the organization's agents; declaring one is a change to\n // its rness.json, made from inside the workspace (spec 0011 §3.2).\n if (joining && agentFlags.length > 0) {\n process.stderr.write(\n `${org}/.rness exists: --agent only applies to a new workspace; after joining, run ${rnessCommand()} sync${agentFlags.map((a) => ` --agent ${a}`).join('')}\\n`\n )\n return 2\n }\n if (joining)\n ui.line(\n 'found',\n `${org}/.rness — joining`,\n `${org} has a workspace — joining it`\n )\n else\n ui.line(\n 'not found',\n `${org}/.rness (or not visible to you) — starting a new workspace`,\n `${org} has no workspace yet (or none you can see) — starting one`\n )\n\n // Joining: the catalogue is read from a clone staged outside the target,\n // so the picker can offer it before anything is written there.\n let catalogue: Manifest = {\n contract: 1,\n org,\n agents: null,\n repos: {},\n scopes: {},\n }\n const staged = async (): Promise<string> => {\n staging ??= await mkdtemp(join(tmpdir(), 'rness-join-'))\n return join(staging, '.rness')\n }\n if (joining) {\n const stagedDir = await staged()\n await ui.step(\n {\n doing: `cloning ${org}/.rness`,\n sentence: `Reading the catalogue of ${org}`,\n git: true,\n },\n () =>\n clone(contextUrl, stagedDir, gitProvider.credentialsFor(contextUrl))\n )\n // Validates that the clone is a workspace context: throws on a\n // malformed or absent rness.json.\n catalogue = await loadManifest(await staged())\n // An SSH workspace is not negotiable: without SSH access its\n // repositories cannot be cloned, so stop before any question or write.\n // `--ssh` is the user's word that SSH works; git reports otherwise.\n const overSsh = Object.values(catalogue.repos).some((r) =>\n isSshUrl(r.url, transport.hosts)\n )\n if (overSsh && opts.ssh !== true && opts.host === undefined) {\n const access = await testSsh()\n if (!access.ok) {\n process.stderr.write(\n `${[...sshWorkspaceLines(access.reason), ...INSTEAD_OF_LINES].join('\\n')}\\n`\n )\n return 1\n }\n }\n }\n\n let specs: string[]\n if (opts.repos !== undefined) specs = splitSpecs(opts.repos)\n else if (interactive) {\n const result = await pickRepositories({\n org,\n provider: gitProvider,\n ui,\n prompts: await prompts(),\n catalogue: catalogue.repos,\n })\n if (result === null) return cancelled(ui)\n specs = result.picked\n prompted ||= result.prompted\n } else {\n // Scripts and CI: a join takes the whole catalogue, a new workspace nothing.\n specs = Object.keys(catalogue.repos)\n }\n // A new workspace's agents: named, or asked with the other questions,\n // before the first write. They do not count as the confirmation.\n if (!joining) {\n if (agentFlags.length > 0) catalogue.agents = agentFlags\n else if (interactive) {\n const answer = await askAgents(await prompts())\n if (answer === null) return cancelled(ui)\n catalogue.agents = answer\n }\n }\n if (interactive && !prompted) {\n const p = await prompts()\n const ok = await p.confirm({\n message: `Create workspace ${org} in ./${shown}?`,\n })\n if (p.isCancel(ok) || ok !== true) return cancelled(ui)\n }\n\n const rnessDir = join(root, '.rness')\n const install = (): Promise<void> =>\n installContext({ ui, pm, rnessDir, skip: opts.skipInstall === true })\n\n if (joining) {\n await mkdir(root, { recursive: true })\n await placeContext(\n await staged(),\n rnessDir,\n contextUrl,\n gitProvider.credentialsFor(contextUrl)\n )\n ui.line('cloned', `${shown}/.rness (joined ${org})`)\n // The workspace declares the manager it installs with (`packageManager`,\n // else the lockfile it committed). Joining adopts it: installing with\n // the one that happened to launch `create` would drop a second lockfile\n // beside the committed one (spec 0009 §5). `--pm` still wins.\n if (opts.pm === undefined) pm = await workspacePackageManager(rnessDir)\n // The pin is the team's, in the repository just cloned. Joining aligns\n // on it and says nothing: moving an organization's version is a\n // maintainer's act, not something asked of whoever arrives\n // (spec 0008 §2).\n await install()\n await mkdir(join(root, 'org'), { recursive: true })\n const failures = await cloneSelection({\n root,\n rnessDir,\n manifest: catalogue,\n org,\n host,\n specs,\n provider: gitProvider,\n ui,\n })\n const code = await syncBlocks(\n ui,\n root,\n shown,\n () => syncCommand({ yes: true, cwd: root }),\n sshWorks()\n )\n if (code !== 0) return code\n // What is left to do, never what just scrolled past: the `cloned` lines\n // are right above (spec 0009 §6).\n const cloned = await clonesIn(root)\n const remaining = Object.keys(catalogue.repos).filter(\n (name) => !cloned.has(name)\n )\n const rness = rnessCommand()\n const next = [\n `cd ${shown}`,\n // The comment above its command, as the new-workspace note does: a\n // line that wraps in a narrow terminal is a line nobody reads.\n ...(remaining.length > 0\n ? [\n `# clone the catalogue repositories you did not pick: ${remaining.join(', ')}`,\n `${rness} sync --all`,\n ]\n : []),\n ...failures.map(\n (f) => `${rness} add ${f.spec} # failed: ${f.message}`\n ),\n ]\n if (ui.session) ui.note('Next steps', next)\n else process.stdout.write(`\\n${next.map((l) => ` ${l}`).join('\\n')}\\n`)\n ui.outro(`You joined ${org} — your workspace is in ${shown}/`)\n return failures.length > 0 ? 1 : 0\n }\n\n // Phase 1 — creating the workspace itself; a failure is rolled back. Past\n // it the workspace exists and is worth keeping, whatever a repository\n // does next.\n const built = await buildContext({\n ui,\n root,\n shown,\n manifest: catalogue,\n pm,\n skipInstall: opts.skipInstall === true,\n kind: 'new workspace',\n })\n if (!built) return 1\n\n // Phase 2 — the repositories. Nothing here is rolled back.\n await mkdir(join(root, 'org'), { recursive: true })\n const failures = await cloneSelection({\n root,\n rnessDir,\n manifest: catalogue,\n org,\n host,\n specs,\n provider: gitProvider,\n ui,\n })\n\n await commitContext({ ui, rnessDir, shown })\n\n const code = await syncBlocks(\n ui,\n root,\n shown,\n () => syncCommand({ yes: true, cwd: root }),\n sshWorks()\n )\n if (code !== 0) return code\n\n // Teammates join once <org>/.rness is on GitHub. Logged in, in a\n // terminal, rness offers to put it there; otherwise it says how, with\n // nothing but git (spec 0004 §3b).\n const name = org\n const published = interactive\n ? await publishContext({\n ui,\n prompts: await prompts(),\n provider: gitProvider,\n org: name,\n rnessDir,\n url: contextUrl,\n })\n : false\n if (published === null) return cancelled(ui)\n const rness = rnessCommand()\n const next = [\n `cd ${shown}/.rness`,\n // What was asked for and did not happen, as the command that retries\n // it — the workspace is complete otherwise.\n ...failures.map((f) => `${rness} add ${f.spec} # failed: ${f.message}`),\n ...(published\n ? []\n : [\n `# create the empty private repository ${org}/.rness on github.com, then:`,\n `git remote add origin ${contextUrl} && git push -u origin main`,\n // git first: everyone has it. The GitHub CLI second, for those\n // who do — it creates the repository and pushes in one step.\n '# or, with the GitHub CLI (gh) installed, in one step:',\n `gh repo create ${org}/.rness --private --source . --push`,\n ]),\n // How this command was launched (npm when rness was typed directly),\n // whatever --pm installed with.\n `# then, for every teammate: ${detectPackageManager()} create rness ${org}`,\n ]\n if (ui.session) {\n ui.note('Next steps', next)\n ui.outro(`Workspace for ${org} is ready in ${shown}/`)\n } else\n process.stdout.write(\n [\n '',\n `Workspace for \\`${org}\\` is ready in ${shown}/.`,\n '',\n 'Next:',\n ...next.map((line) => ` ${line}`),\n '',\n ].join('\\n')\n )\n return failures.length > 0 ? 1 : 0\n } catch (e) {\n return reportError(e)\n } finally {\n // The staged context is either moved into place or no longer needed.\n if (staging !== undefined)\n await rm(staging, { recursive: true, force: true }).catch(() => undefined)\n }\n}\n","import { mkdir, readdir, rm, stat } from 'node:fs/promises'\nimport { dirname, join, relative } from 'node:path'\n\nimport { reportError } from '../report.ts'\nimport { VERSION } from '../version.ts'\nimport { exists } from './fs.ts'\nimport { commitAll, init } from './git.ts'\nimport { writeManifest } from './manifest.ts'\nimport { hasLockfile } from './pinned.ts'\nimport {\n type PackageManager,\n installDependencies,\n packageManagerVersion,\n rnessCommand,\n} from './pm.ts'\nimport { copyScaffold } from './scaffold-copy.ts'\nimport { CREATE_SUBJECT, scaffoldMessage } from './scaffold-git.ts'\nimport type { Manifest } from './types.ts'\nimport type { Ui } from './ui.ts'\nimport { findWorkspace } from './workspace.ts'\n\n/**\n * The steps `create` takes to bring a workspace into being, shared by the\n * organization path and the blank one (spec 0012): where it may go, the\n * context scaffolded and installed, then committed.\n */\n\nexport async function isEmptyDir(dir: string): Promise<boolean> {\n return (await readdir(dir)).length === 0\n}\n\nexport async function insideWorkspace(dir: string): Promise<boolean> {\n try {\n await findWorkspace(dir)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Why `root` cannot receive a new workspace, as the one-line message the\n * guards print; `null` when it can. Both ends of the operation count: the\n * directory create runs in, and the parent of the target — either one inside\n * a workspace would nest a second `.rness` under the first.\n */\nexport async function targetProblem(\n cwd: string,\n root: string,\n pm: PackageManager\n): Promise<string | null> {\n const shown = relative(cwd, root) || '.'\n if ((await insideWorkspace(cwd)) || (await insideWorkspace(dirname(root))))\n return 'already inside an rness workspace; create runs from outside one'\n if (!(await exists(root))) return null\n if (await exists(join(root, '.rness', 'rness.json'))) {\n // A join whose install failed leaves exactly this: a context clone and\n // no dependencies. Re-running create cannot help — point at the install\n // that finishes the job instead of at `rness add`.\n if (!(await exists(join(root, '.rness', 'node_modules'))))\n return `${shown} holds an rness workspace whose dependencies are not installed; cd ${shown}/.rness && ${pm} install, then ${rnessCommand()} sync`\n return `${shown} already holds an rness workspace (.rness/); run ${rnessCommand()} add inside it to add repositories`\n }\n if (!(await stat(root)).isDirectory()) return `${shown} is not a directory`\n if (!(await isEmptyDir(root))) return `${shown} is not empty`\n return null\n}\n\n/** Install the dependencies of `.rness/`, or say how to when `skip`. */\nexport async function installContext(input: {\n ui: Ui\n pm: PackageManager\n rnessDir: string\n skip: boolean\n}): Promise<void> {\n const { ui, pm, rnessDir } = input\n if (input.skip) {\n // Naming the manager says what to run by hand — and, on a join, which\n // one the workspace declared (spec 0009 §5).\n ui.line('skipped', `install with ${pm} (--skip-install)`)\n return\n }\n // A joined workspace carries the lockfile its clone brought, so the\n // install is frozen and leaves the working tree clean (spec 0008 §2). A\n // new workspace has no lockfile yet and resolves freely.\n const frozen = await hasLockfile(rnessDir, pm)\n await ui.step(\n { doing: `installing dependencies with ${pm}` },\n () => installDependencies(pm, rnessDir, { frozen }),\n () => ['installed', `dependencies with ${pm}`]\n )\n}\n\n/**\n * Create `root` and a new `.rness/` in it: the scaffold, `manifest`, the\n * install. False when a step failed: the error is reported and everything\n * this call wrote is removed, so the retry the message asks for is not\n * refused.\n */\nexport async function buildContext(input: {\n ui: Ui\n root: string\n shown: string\n manifest: Manifest\n pm: PackageManager\n skipInstall: boolean\n /** What the `created` line calls it: `new workspace`, `blank workspace`. */\n kind: string\n}): Promise<boolean> {\n const { ui, root, shown, pm } = input\n const rnessDir = join(root, '.rness')\n // Resolved before anything touches the filesystem: a missing package\n // manager binary must not leave an empty `<shown>/` behind.\n const pmVersion = await packageManagerVersion(pm)\n await mkdir(root, { recursive: true })\n try {\n await copyScaffold(rnessDir, {\n version: VERSION,\n packageManager: `${pm}@${pmVersion}`,\n })\n await writeManifest(rnessDir, input.manifest)\n ui.line('created', `${shown}/.rness (${input.kind})`)\n await installContext({ ui, pm, rnessDir, skip: input.skipInstall })\n return true\n } catch (e) {\n // Report the cause before the consequence: the original error first,\n // then the rollback note. Everything under `rnessDir` was written by\n // this call, so removing it is safe; `root` goes too when it is left\n // empty (this call created it, or found it empty), or the retry the\n // message asks for would be refused with \"<shown> is not empty\". A\n // failing `rm` is swallowed rather than thrown, since it must never\n // mask the original error.\n reportError(e)\n await rm(rnessDir, { recursive: true, force: true }).catch(() => undefined)\n if (await isEmptyDir(root).catch(() => false))\n await rm(root, { recursive: true, force: true }).catch(() => undefined)\n process.stderr.write(\n `removed ${shown}/.rness after the failure; fix it and retry\\n`\n )\n return false\n }\n}\n\n/** Make `.rness/` a repository with one commit; a failure is a warning. */\nexport async function commitContext(input: {\n ui: Ui\n rnessDir: string\n shown: string\n}): Promise<void> {\n const { ui, rnessDir, shown } = input\n await init(rnessDir)\n try {\n // The first scaffold commit: the base of every later scaffold merge\n // (spec 0013 §1).\n await commitAll(rnessDir, scaffoldMessage(CREATE_SUBJECT, VERSION))\n ui.line('committed', `${shown}/.rness`)\n } catch (e) {\n ui.warn(\n `${e instanceof Error ? e.message : String(e)} — commit ${shown}/.rness yourself`\n )\n }\n}\n","import { execFile } from 'node:child_process'\nimport { readFile } from 'node:fs/promises'\nimport { basename, join } from 'node:path'\nimport { promisify } from 'node:util'\n\nimport { readPinnedCli } from './delegate.ts'\nimport { exists, writeFileAtomic } from './fs.ts'\nimport {\n type PackageManager,\n installDependencies,\n isPackageManager,\n rnessCommand,\n} from './pm.ts'\nimport { warn } from './style.ts'\nimport { agentHintLines } from './transport.ts'\nimport { findWorkspace } from './workspace.ts'\n\nconst execFileP = promisify(execFile)\n\nconst PACKAGE = '@rness/cli'\n\n/** A released version, pre-releases included; never a range or a tag. */\nexport const EXACT_VERSION = /^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$/\n\n/** Negative when `a` is the older version. A pre-release is older than its release. */\nexport function compareVersions(a: string, b: string): number {\n const split = (v: string): [number[], string | null] => {\n const dash = v.indexOf('-')\n const core = dash === -1 ? v : v.slice(0, dash)\n return [core.split('.').map(Number), dash === -1 ? null : v.slice(dash + 1)]\n }\n const [coreA, preA] = split(a)\n const [coreB, preB] = split(b)\n for (let i = 0; i < 3; i += 1) {\n const diff = (coreA[i] ?? 0) - (coreB[i] ?? 0)\n if (diff !== 0) return diff\n }\n if (preA === preB) return 0\n if (preA === null) return 1\n if (preB === null) return -1\n return preA.localeCompare(preB, 'en', { numeric: true })\n}\n\nexport interface Pin {\n /** What `package.json` says: an exact version in a workspace rness created. */\n spec: string\n field: 'devDependencies' | 'dependencies'\n}\n\nasync function readPackageJson(\n rnessDir: string\n): Promise<Record<string, unknown> | null> {\n try {\n const parsed: unknown = JSON.parse(\n await readFile(join(rnessDir, 'package.json'), 'utf8')\n )\n return parsed !== null && typeof parsed === 'object'\n ? (parsed as Record<string, unknown>)\n : null\n } catch {\n return null\n }\n}\n\n/** The `@rness/cli` entry of `.rness/package.json` — the one place the version is written (spec 0006). */\nexport async function readPin(rnessDir: string): Promise<Pin | null> {\n const pkg = await readPackageJson(rnessDir)\n if (pkg === null) return null\n for (const field of ['devDependencies', 'dependencies'] as const) {\n const deps = pkg[field]\n if (deps === null || typeof deps !== 'object') continue\n const spec = (deps as Record<string, unknown>)[PACKAGE]\n if (typeof spec === 'string') return { spec, field }\n }\n return null\n}\n\n/**\n * Replace the pinned version in place: every other byte of `package.json` —\n * its indentation, its inline objects, its key order — is the user's.\n */\nexport async function writePin(\n rnessDir: string,\n from: string,\n to: string\n): Promise<void> {\n const file = join(rnessDir, 'package.json')\n const text = await readFile(file, 'utf8')\n const entry = new RegExp(\n `(\"${PACKAGE}\"\\\\s*:\\\\s*\")${from.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(\")`\n )\n if (!entry.test(text))\n throw new Error(`\"${PACKAGE}\": \"${from}\" not found in package.json`)\n await writeFileAtomic(file, text.replace(entry, `$1${to}$2`))\n}\n\nconst LOCKFILES: readonly (readonly [string, PackageManager])[] = [\n ['pnpm-lock.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['bun.lock', 'bun'],\n ['bun.lockb', 'bun'],\n ['package-lock.json', 'npm'],\n]\n\n/** The package manager a workspace installs with: `packageManager`, else its lockfile, else npm. */\nexport async function workspacePackageManager(\n rnessDir: string\n): Promise<PackageManager> {\n const declared = (await readPackageJson(rnessDir))?.['packageManager']\n if (typeof declared === 'string') {\n const name = declared.split('@')[0] ?? ''\n if (isPackageManager(name)) return name\n }\n for (const [lockfile, pm] of LOCKFILES)\n if (await exists(join(rnessDir, lockfile))) return pm\n return 'npm'\n}\n\n/**\n * Whether the workspace carries a lockfile **this** manager can install from.\n * A frozen install is per-manager: `npm ci` needs `package-lock.json` and\n * fails outright next to a `pnpm-lock.yaml`, which is the common case when the\n * manager running `create` is not the one the workspace declares.\n */\nexport async function hasLockfile(\n rnessDir: string,\n pm: PackageManager\n): Promise<boolean> {\n for (const [lockfile, owner] of LOCKFILES)\n if (owner === pm && (await exists(join(rnessDir, lockfile)))) return true\n return false\n}\n\n/**\n * An exact pin that is not the installed copy: someone pulled an upgrade and\n * did not reinstall, or never installed. Null when they agree, and when the\n * pin is a range — it says nothing precise about what should be installed.\n */\nexport async function pinDrift(\n rnessDir: string\n): Promise<{ pin: string; installed: string | null } | null> {\n const pin = await readPin(rnessDir)\n if (pin === null || !EXACT_VERSION.test(pin.spec)) return null\n const installed = (await readPinnedCli(rnessDir))?.version ?? null\n return installed === pin.spec ? null : { pin: pin.spec, installed }\n}\n\n/**\n * The line the launcher prints when the workspace around `cwd` pins one\n * version and holds another (spec 0006 §4): the teammate who pulled an\n * upgrade and did not reinstall. Null outside a workspace, and without drift.\n */\nexport async function driftWarning(cwd: string): Promise<string | null> {\n let root: string\n let rnessDir: string\n try {\n const ws = await findWorkspace(cwd)\n root = ws.root\n rnessDir = ws.rnessDir\n } catch {\n return null\n }\n const drift = await pinDrift(rnessDir)\n if (drift === null) return null\n const pm = await workspacePackageManager(rnessDir)\n return warn(\n `${basename(root)}/.rness pins @rness/cli ${drift.pin} but ${drift.installed ?? 'nothing'} is installed — run ${pm} install in .rness`\n )\n}\n\n/** A delegated child is killed after this long without finishing (spec 0008 §5). */\nexport const CHILD_DEADLINE_MS = 120_000\n\n/**\n * The environment of a delegated child. Its output is piped and the parent\n * owns the terminal, so a prompt from `ssh` or from git's credential helper is\n * invisible and blocks forever. `GIT_SSH_COMMAND` is composed, not replaced:\n * a user's own agent command (1Password, a named key) must survive.\n */\nexport function childEnv(\n env: NodeJS.ProcessEnv = process.env\n): NodeJS.ProcessEnv {\n return {\n ...env,\n GIT_SSH_COMMAND: `${env['GIT_SSH_COMMAND'] ?? 'ssh'} -o BatchMode=yes`,\n GIT_TERMINAL_PROMPT: '0',\n }\n}\n\nexport interface InstallOutcome {\n installed: boolean\n pin: string\n /** Why it did not install; null when it did. */\n reason: string | null\n}\n\nexport interface EnsureOptions {\n env?: NodeJS.ProcessEnv\n announce?: (pin: string) => void\n install?: (\n pm: PackageManager,\n dir: string,\n opts: { frozen: boolean }\n ) => Promise<void>\n}\n\n/**\n * Bring `.rness/node_modules` back to the pin (spec 0008 §4). The version was\n * decided by the pull request that moved the pin, so this asks nothing. Null\n * when there is no drift. A failure is reported, never thrown: the caller\n * falls back to the warning and runs the command anyway.\n */\nexport async function ensureInstalled(\n rnessDir: string,\n opts: EnsureOptions = {}\n): Promise<InstallOutcome | null> {\n const drift = await pinDrift(rnessDir)\n if (drift === null) return null\n const env = opts.env ?? process.env\n if (env['RNESS_NO_INSTALL'] === '1')\n return { installed: false, pin: drift.pin, reason: 'RNESS_NO_INSTALL=1' }\n const pm = await workspacePackageManager(rnessDir)\n const frozen = await hasLockfile(rnessDir, pm)\n const install = opts.install ?? installDependencies\n opts.announce?.(drift.pin)\n try {\n await install(pm, rnessDir, { frozen })\n return { installed: true, pin: drift.pin, reason: null }\n } catch (e) {\n return {\n installed: false,\n pin: drift.pin,\n reason: e instanceof Error ? e.message : String(e),\n }\n }\n}\n\nexport interface PinnedSyncResult {\n code: number\n stdout: string\n stderr: string\n}\n\n/** `sync --yes` through the installed copy, its output kept. Null when nothing is installed. */\nexport async function runPinnedSync(\n root: string\n): Promise<PinnedSyncResult | null> {\n const installed = await readPinnedCli(join(root, '.rness'))\n if (installed === null) return null\n const pinned = join(installed.dir, ...installed.bin.split('/'))\n if (!(await exists(pinned)))\n return {\n code: 1,\n stdout: '',\n stderr: `@rness/cli in .rness is not installed correctly (missing ${installed.bin}); reinstall in .rness/\\n`,\n }\n try {\n const { stdout, stderr } = await execFileP(\n process.execPath,\n [pinned, 'sync', '--yes'],\n {\n cwd: root,\n maxBuffer: 16 * 1024 * 1024,\n env: childEnv(),\n timeout: CHILD_DEADLINE_MS,\n killSignal: 'SIGKILL',\n }\n )\n return { code: 0, stdout, stderr }\n } catch (e) {\n const err = e as {\n code?: number\n killed?: boolean\n stdout?: string\n stderr?: string\n }\n const deadline =\n err.killed === true\n ? `rness sync in .rness did not finish within ${CHILD_DEADLINE_MS / 1000}s and was stopped\\n`\n : ''\n return {\n code: typeof err.code === 'number' ? err.code : 1,\n stdout: err.stdout ?? '',\n stderr: `${err.stderr ?? ''}${deadline}`,\n }\n }\n}\n\nconst SYNC_VERBS = ['updated', 'unchanged', 'stale'] as const\n\n/**\n * `3 blocks: 2 updated, 1 unchanged`, the verbs always in that order —\n * nothing after the count when none.\n */\nfunction counted(noun: string, counts: ReadonlyMap<string, number>): string {\n const total = [...counts.values()].reduce((a, b) => a + b, 0)\n const detail = SYNC_VERBS.filter((verb) => counts.has(verb))\n .map((verb) => `${counts.get(verb) ?? 0} ${verb}`)\n .join(', ')\n return `${total} ${noun}${total === 1 ? '' : 's'}${detail === '' ? '' : `: ${detail}`}`\n}\n\n/**\n * What a sync printed, in one line: `3 blocks: 2 updated, 1 unchanged`, then\n * the agent files when there are any — `; 2 agent files: 2 unchanged`. A\n * block is an `AGENTS.md` or a `CLAUDE.md`; any other file is an agent's\n * (spec 0011). The lines about neither (`not cloned: …`) are returned as\n * they are.\n */\nexport function summariseSync(stdout: string): {\n summary: string\n others: string[]\n} {\n const blocks = new Map<string, number>()\n const agentFiles = new Map<string, number>()\n const others: string[] = []\n for (const line of stdout.split('\\n')) {\n if (line.trim() === '') continue\n const m = /^(updated|unchanged|stale)\\s+(\\S+)/.exec(line)\n if (m === null) {\n others.push(line)\n continue\n }\n const [, verb = '', path = ''] = m\n const counts = /(^|\\/)(AGENTS|CLAUDE)\\.md$/.test(path) ? blocks : agentFiles\n counts.set(verb, (counts.get(verb) ?? 0) + 1)\n }\n return {\n summary: [\n counted('block', blocks),\n ...(agentFiles.size > 0 ? [counted('agent file', agentFiles)] : []),\n ].join('; '),\n others,\n }\n}\n\n/**\n * What the parent makes of a delegated sync (spec 0008 §2.1). A pinned copy\n * older than 0.5.0 clones catalogue repositories nobody picked and exits 1 when\n * one fails; it cannot be made to exit 0, so the blocks decide. One block line\n * on stdout means the sync did its job: what the child wrote to stderr is then\n * context, not the command's outcome.\n */\nexport function syncOutcome(\n result: PinnedSyncResult,\n opts: { sshWorks?: boolean } = {}\n): { code: number; hints: string[]; errors: string[] } {\n const { others } = summariseSync(result.stdout)\n const wrote = /^(updated|unchanged|stale)\\s/m.test(result.stdout)\n const stderr = result.stderr\n .split('\\n')\n .map((l) => l.trimEnd())\n .filter((l) => l.trim() !== '')\n const hints = wrote ? [...others, ...stderr] : others\n if (\n opts.sshWorks === true &&\n /Permission denied \\(publickey\\)/.test(result.stderr)\n )\n hints.push(...agentHintLines())\n return {\n code: wrote ? 0 : result.code,\n hints,\n errors: wrote ? [] : stderr,\n }\n}\n\n/**\n * Run `sync --yes` through the copy installed in `.rness/`. With nothing\n * installed, `fallback` runs instead (`create --skip-install`); without a\n * fallback that is an error, never the caller's own code standing in for the\n * pinned copy (spec 0003 §2.2).\n */\nexport async function syncPinned(\n root: string,\n shown: string,\n fallback?: () => Promise<number>\n): Promise<number> {\n const rnessDir = join(root, '.rness')\n const installed = await readPinnedCli(rnessDir)\n if (installed === null) {\n if (fallback !== undefined) return fallback()\n process.stderr.write(\n `@rness/cli is not installed in ${shown}/.rness; install in .rness/, then ${rnessCommand()} sync\\n`\n )\n return 1\n }\n const pinned = join(installed.dir, ...installed.bin.split('/'))\n if (!(await exists(pinned))) {\n process.stderr.write(\n `@rness/cli in ${shown}/.rness is not installed correctly (missing ${installed.bin}); reinstall in .rness/\\n`\n )\n return 1\n }\n try {\n const { stdout, stderr } = await execFileP(\n process.execPath,\n [pinned, 'sync', '--yes'],\n {\n cwd: root,\n maxBuffer: 16 * 1024 * 1024,\n env: childEnv(),\n timeout: CHILD_DEADLINE_MS,\n killSignal: 'SIGKILL',\n }\n )\n process.stdout.write(stdout)\n if (stderr !== '') process.stderr.write(stderr)\n return 0\n } catch (e) {\n const err = e as { code?: number; stdout?: string; stderr?: string }\n if (err.stdout !== undefined && err.stdout !== '')\n process.stdout.write(err.stdout)\n if (err.stderr !== undefined && err.stderr !== '')\n process.stderr.write(err.stderr)\n return typeof err.code === 'number' ? err.code : 1\n }\n}\n","import { execFile } from 'node:child_process'\nimport { mkdtemp, realpath, rm, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { promisify } from 'node:util'\n\nimport type { ScaffoldFile } from './scaffold-copy.ts'\n\n/**\n * The scaffold as git history in `.rness/` (spec 0013): the commits in which\n * rness wrote the scaffold, found by their subject; the commit holding a\n * target version's scaffold, built on the last one; the three-way merge git\n * does from there.\n */\n\nconst execFileP = promisify(execFile)\n\nexport const CREATE_SUBJECT = 'chore: rness workspace context'\nconst SCAFFOLD_SUBJECT = /^chore: rness scaffold (\\S+)$/\nexport const SCAFFOLD_TRAILER = 'Rness-Scaffold'\n\ninterface Ran {\n code: number\n stdout: string\n stderr: string\n}\n\n/** git in `dir` only (no walking up), with extra environment; never throws. */\nasync function run(\n dir: string,\n args: readonly string[],\n env: Record<string, string> = {}\n): Promise<Ran> {\n try {\n const { stdout, stderr } = await execFileP('git', [...args], {\n cwd: dir,\n env: {\n ...process.env,\n ...env,\n GIT_TERMINAL_PROMPT: '0',\n GIT_CEILING_DIRECTORIES: dirname(resolve(dir)),\n },\n maxBuffer: 16 * 1024 * 1024,\n })\n return { code: 0, stdout, stderr }\n } catch (e) {\n const err = e as { code?: unknown; stdout?: string; stderr?: string }\n return {\n code: typeof err.code === 'number' ? err.code : 1,\n stdout: err.stdout ?? '',\n stderr: err.stderr ?? String(e),\n }\n }\n}\n\nasync function must(\n dir: string,\n args: readonly string[],\n env: Record<string, string> = {}\n): Promise<string> {\n const r = await run(dir, args, env)\n if (r.code !== 0) {\n const first =\n r.stderr.split('\\n').find((l) => l.trim() !== '') ?? 'unknown error'\n throw new Error(`git ${args[0] ?? ''} failed: ${first.trim()}`)\n }\n return r.stdout.trim()\n}\n\n/** The message of a scaffold commit: its subject names the version. */\nexport function scaffoldMessage(subject: string, version: string): string {\n return `${subject}\\n\\n${SCAFFOLD_TRAILER}: ${version}`\n}\n\n/**\n * Commit everything in `rnessDir` — the end of an upgrade, which found it\n * clean (spec 0013 §8). The hooks run: a refusal hands back what they said,\n * and leaves everything staged. Nothing to commit and no merge: `nothing`.\n */\nexport async function commitUpgrade(\n rnessDir: string,\n message: string\n): Promise<\n { kind: 'committed' | 'nothing' } | { kind: 'refused'; output: string }\n> {\n const add = await run(rnessDir, ['add', '-A'])\n if (add.code !== 0) return { kind: 'refused', output: add.stderr.trim() }\n const staged = await run(rnessDir, ['diff', '--cached', '--quiet'])\n if (staged.code === 0 && !(await mergeInProgress(rnessDir)))\n return { kind: 'nothing' }\n const commit = await run(rnessDir, ['commit', '-q', '-m', message])\n if (commit.code !== 0)\n return {\n kind: 'refused',\n output: `${commit.stdout}\\n${commit.stderr}`.trim(),\n }\n return { kind: 'committed' }\n}\n\n/** Whether a merge waits for its commit in `dir` (`MERGE_HEAD` exists). */\nexport async function mergeInProgress(dir: string): Promise<boolean> {\n const r = await run(dir, ['rev-parse', '-q', '--verify', 'MERGE_HEAD'])\n return r.code === 0\n}\n\n/**\n * The last commit in which rness wrote the scaffold (spec 0013 §1): the most\n * recent `chore: rness scaffold <v>`, else a root `chore: rness workspace\n * context`. The subject decides: a squash carries the trailer in its body\n * but mixes the team's edits in. Null when there is none — adoption.\n */\nexport async function findScaffoldBase(\n rnessDir: string\n): Promise<{ commit: string; version: string | null } | null> {\n // Topological order: a child before its parent, whatever the commit dates\n // (two commits in the same second otherwise come in either order). A merge\n // in progress counts: the commit recording it runs the pre-commit hook\n // before it exists (spec 0013 §8).\n const merging = await mergeInProgress(rnessDir)\n const log = await run(rnessDir, [\n 'log',\n '--topo-order',\n `--format=%H%x1f%P%x1f%s%x1f%(trailers:key=${SCAFFOLD_TRAILER},valueonly,separator=%x2C)%x1e`,\n 'HEAD',\n ...(merging ? ['MERGE_HEAD'] : []),\n ])\n if (log.code !== 0) return null\n const commits = log.stdout\n .split('\\x1e')\n .map((r) => r.trim())\n .filter((r) => r !== '')\n .map((r) => {\n const [hash = '', parents = '', subject = '', trailer = ''] =\n r.split('\\x1f')\n return { hash, parents: parents.trim(), subject, trailer: trailer.trim() }\n })\n for (const c of commits) {\n const m = SCAFFOLD_SUBJECT.exec(c.subject)\n if (m !== null) return { commit: c.hash, version: m[1] ?? null }\n }\n const root = commits.find(\n (c) => c.parents === '' && c.subject === CREATE_SUBJECT\n )\n if (root === undefined) return null\n return {\n commit: root.hash,\n version: root.trailer === '' ? null : root.trailer,\n }\n}\n\n/**\n * The commit holding `version`'s scaffold: the base's tree with `files`\n * written over it, the base as parent (none on adoption). Built with a\n * temporary index — the working tree and the real index are untouched.\n */\nexport async function buildScaffoldCommit(\n rnessDir: string,\n base: string | null,\n files: readonly ScaffoldFile[],\n version: string\n): Promise<string> {\n const scratch = await mkdtemp(join(tmpdir(), 'rness-scaffold-'))\n const env = { GIT_INDEX_FILE: join(scratch, 'index') }\n try {\n await must(\n rnessDir,\n ['read-tree', ...(base === null ? ['--empty'] : [base])],\n env\n )\n for (const [i, file] of files.entries()) {\n const tmp = join(scratch, `blob-${i}`)\n await writeFile(tmp, file.content, 'utf8')\n const blob = await must(rnessDir, [\n 'hash-object',\n '-w',\n '--no-filters',\n '--',\n tmp,\n ])\n await must(\n rnessDir,\n [\n 'update-index',\n '--add',\n '--cacheinfo',\n `${file.executable ? '100755' : '100644'},${blob},${file.path}`,\n ],\n env\n )\n }\n const tree = await must(rnessDir, ['write-tree'], env)\n return await must(rnessDir, [\n 'commit-tree',\n tree,\n ...(base === null ? [] : ['-p', base]),\n '-m',\n scaffoldMessage(`chore: rness scaffold ${version}`, version),\n ])\n } finally {\n await rm(scratch, { recursive: true, force: true })\n }\n}\n\nexport type ScaffoldChange = 'added' | 'updated' | 'merged' | 'removed'\n\nasync function blobAt(\n rnessDir: string,\n rev: string,\n path: string\n): Promise<string | null> {\n const r = await run(rnessDir, [\n 'rev-parse',\n '--verify',\n '--quiet',\n `${rev}:${path}`,\n ])\n return r.code === 0 ? r.stdout.trim() : null\n}\n\n/**\n * `git merge --no-commit` of a scaffold commit: what changed, and what\n * conflicts. `updated` is a file the team never touched since `base`,\n * `merged` one it had edited; without a base, histories are unrelated.\n */\nexport async function mergeScaffold(\n rnessDir: string,\n commit: string,\n base: string | null\n): Promise<{ conflicts: string[]; changes: Array<[ScaffoldChange, string]> }> {\n await run(rnessDir, [\n 'merge',\n '--no-commit',\n '--no-ff',\n ...(base === null ? ['--allow-unrelated-histories'] : []),\n commit,\n ])\n const conflicts = (\n await must(rnessDir, ['diff', '--name-only', '--diff-filter=U'])\n )\n .split('\\n')\n .filter((l) => l !== '')\n const changes: Array<[ScaffoldChange, string]> = []\n const status = await must(rnessDir, [\n 'diff',\n '--cached',\n '--name-status',\n 'HEAD',\n ])\n for (const line of status.split('\\n')) {\n const [letter = '', path = ''] = line.split('\\t')\n if (path === '' || conflicts.includes(path)) continue\n if (letter === 'A') changes.push(['added', path])\n else if (letter === 'D') changes.push(['removed', path])\n else if (letter === 'M') {\n const untouched =\n base !== null &&\n (await blobAt(rnessDir, 'HEAD', path)) ===\n (await blobAt(rnessDir, base, path))\n changes.push([untouched ? 'updated' : 'merged', path])\n }\n }\n return { conflicts, changes }\n}\n\n/** A one-commit checkout (CI): the history to read is not there. */\nexport async function isShallow(rnessDir: string): Promise<boolean> {\n const r = await run(rnessDir, ['rev-parse', '--is-shallow-repository'])\n return r.code === 0 && r.stdout.trim() === 'true'\n}\n\n/** Whether `rnessDir` is itself a git repository (not merely inside one). */\nexport async function isRepository(rnessDir: string): Promise<boolean> {\n const r = await run(rnessDir, ['rev-parse', '--show-toplevel'])\n if (r.code !== 0) return false\n // Real paths on both sides: /tmp is a link to /private/tmp on macOS.\n const real = (p: string) => realpath(p).catch(() => resolve(p))\n return (await real(r.stdout.trim())) === (await real(rnessDir))\n}\n\n/**\n * Adoption only: `<dir>/.gitkeep` holds a directory open until it has files.\n * Where `HEAD` already tracks something in that directory, the scaffold\n * commit leaves it out, so the merge does not add a placeholder the team\n * never needed.\n */\nexport async function withoutRedundantKeeps(\n rnessDir: string,\n files: readonly ScaffoldFile[]\n): Promise<ScaffoldFile[]> {\n const kept: ScaffoldFile[] = []\n for (const file of files) {\n if (file.path.endsWith('/.gitkeep')) {\n const dir = file.path.slice(0, -'/.gitkeep'.length)\n const listed = await run(rnessDir, [\n 'ls-tree',\n '--name-only',\n 'HEAD',\n '--',\n `${dir}/`,\n ])\n if (listed.code === 0 && listed.stdout.trim() !== '') continue\n }\n kept.push(file)\n }\n return kept\n}\n","import {\n runPinnedSync,\n summariseSync,\n syncOutcome,\n syncPinned,\n} from './pinned.ts'\nimport { rnessCommand } from './pm.ts'\nimport type { Ui } from './ui.ts'\n\n/**\n * `sync --yes` through the copy installed in `.rness/` (spec 0003 §2.2), said\n * the way `ui` speaks. The plain look passes the child's lines through, as it\n * always did. The session look keeps them to itself and says them in one —\n * `Synced 3 blocks: 2 updated, 1 unchanged` — since the child, whose stdout\n * is a pipe, can only print the plain look. `inPlace` runs when nothing is\n * installed (`create --skip-install`), or when delegation is off.\n */\nexport async function syncBlocks(\n ui: Ui,\n root: string,\n shown: string,\n inPlace?: () => Promise<number>,\n sshWorks?: boolean\n): Promise<number> {\n // Delegation off (`rness-dev`, `RNESS_NO_DELEGATE=1`): the sources under\n // test write the blocks, not the published copy the install just pinned.\n if (process.env['RNESS_NO_DELEGATE'] === '1' && inPlace !== undefined)\n return inPlace()\n if (!ui.session)\n return ui.step({ doing: 'syncing the blocks', git: true }, () =>\n syncPinned(root, shown, inPlace)\n )\n const result = await ui.step(\n {\n doing: 'syncing the blocks',\n sentence: 'Writing the rness block into every AGENTS.md',\n },\n () => runPinnedSync(root),\n (r) =>\n r === null || r.code !== 0\n ? null\n : (() => {\n const { summary } = summariseSync(r.stdout)\n return ['synced', summary, `Synced ${summary}`] as const\n })()\n )\n if (result === null) {\n if (inPlace !== undefined) return inPlace()\n ui.error(\n `@rness/cli is not installed in ${shown}/.rness; install in .rness/, then ${rnessCommand()} sync`\n )\n return 1\n }\n const outcome = syncOutcome(result, { sshWorks: sshWorks === true })\n for (const line of outcome.hints) ui.hint(line)\n for (const line of outcome.errors) ui.error(line)\n return outcome.code\n}\n","import { mkdir } from 'node:fs/promises'\nimport { join, relative, resolve } from 'node:path'\n\nimport { askAgents } from '../core/ask-agents.ts'\nimport {\n buildContext,\n commitContext,\n targetProblem,\n} from '../core/new-workspace.ts'\nimport { type PackageManager, rnessCommand } from '../core/pm.ts'\nimport { syncBlocks } from '../core/sync-blocks.ts'\nimport type { Prompts } from '../core/terminal.ts'\nimport type { Ui } from '../core/ui.ts'\nimport { syncCommand } from './sync.ts'\n\n/**\n * A blank workspace's directory name: one path segment of letters, digits,\n * `.`, `_` and `-`, not `.` or `..`, no leading `-`. Case is kept: it names a\n * local directory, not a GitHub account.\n */\nexport const WORKSPACE_NAME = /^(?!\\.{1,2}$)[A-Za-z0-9._][A-Za-z0-9._-]*$/\n\nexport function workspaceNameError(name: string): string {\n return `workspace name \"${name}\" may only contain letters, digits, '.', '_' and '-', not starting with '-'`\n}\n\n/**\n * `rness create --blank`: a workspace with no GitHub organization\n * (spec 0012) — `.rness/` scaffolded with a `rness.json` without `org`, an\n * empty `org/`, the root `AGENTS.md` and `CLAUDE.md`. No login, SSH test,\n * probe or listing: the install of `.rness/` is the only network access.\n * Every prompt comes before the first write.\n */\nexport async function createBlank(input: {\n /** Already checked against `WORKSPACE_NAME`; prompted for when absent. */\n name: string | undefined\n /** `--agent`, already checked; asked for in the wizard when empty. */\n agents: readonly string[]\n cwd: string\n pm: PackageManager\n /** A wizard in a terminal: questions may be asked. */\n interactive: boolean\n /** `--yes`, or a terminal: allowed to write. */\n mayWrite: boolean\n skipInstall: boolean\n ui: Ui\n prompts: () => Promise<Prompts>\n}): Promise<number> {\n const { cwd, pm, ui } = input\n let name = input.name\n let prompted = false\n if (name === undefined) {\n if (!input.interactive) {\n process.stderr.write(\n 'rness create --blank needs a <name> without a prompt\\n'\n )\n return 2\n }\n const p = await input.prompts()\n const answer = await p.text({\n message: 'What should the workspace be called?',\n placeholder: 'my-workspace',\n validate: (value) => {\n const v = value?.trim() ?? ''\n return WORKSPACE_NAME.test(v) ? undefined : workspaceNameError(v)\n },\n })\n if (p.isCancel(answer) || typeof answer !== 'string') {\n ui.cancelled()\n return 0\n }\n name = answer.trim()\n prompted = true\n }\n\n const root = resolve(cwd, name)\n const shown = relative(cwd, root) || '.'\n const problem = await targetProblem(cwd, root, pm)\n if (problem !== null) {\n process.stderr.write(`${problem}\\n`)\n return 1\n }\n if (!input.mayWrite) {\n process.stderr.write(\n 'rness create writes files; pass --yes to run without a prompt\\n'\n )\n return 2\n }\n // The team's agents, before the first write (spec 0011 §3.2). The question\n // does not count as the confirmation.\n let agents: string[] | null =\n input.agents.length > 0 ? [...input.agents] : null\n if (agents === null && input.interactive) {\n agents = await askAgents(await input.prompts())\n if (agents === null) {\n ui.cancelled()\n return 0\n }\n }\n if (input.interactive && !prompted) {\n const p = await input.prompts()\n const ok = await p.confirm({\n message: `Create blank workspace ${name} in ./${shown}?`,\n })\n if (p.isCancel(ok) || ok !== true) {\n ui.cancelled()\n return 0\n }\n }\n\n const built = await buildContext({\n ui,\n root,\n shown,\n manifest: { contract: 1, org: null, agents, repos: {}, scopes: {} },\n pm,\n skipInstall: input.skipInstall,\n kind: 'blank workspace',\n })\n if (!built) return 1\n await mkdir(join(root, 'org'), { recursive: true })\n await commitContext({ ui, rnessDir: join(root, '.rness'), shown })\n const code = await syncBlocks(ui, root, shown, () =>\n syncCommand({ yes: true, cwd: root })\n )\n if (code !== 0) return code\n\n // No organization to publish to: say how to bring repositories in, and how\n // the workspace becomes an organization's once there is one.\n const next = [\n `cd ${shown}`,\n '# bring a repository in: <owner>/<repo> on GitHub, or any git URL',\n `${rnessCommand()} add <owner>/<repo>`,\n '# to share it: set \"org\" in .rness/rness.json, then push .rness to github.com/<org>/.rness',\n ]\n if (ui.session) {\n ui.note('Next steps', next)\n ui.outro(`Workspace ${name} is ready in ${shown}/`)\n } else\n process.stdout.write(\n [\n '',\n `Workspace \\`${name}\\` is ready in ${shown}/.`,\n '',\n 'Next:',\n ...next.map((line) => ` ${line}`),\n '',\n ].join('\\n')\n )\n return 0\n}\n","import { join } from 'node:path'\n\nimport { isCurrentBlock, renderBlock } from './block.ts'\nimport { assembleContext } from './context.ts'\nimport { exists, readOrNull } from './fs.ts'\nimport { findBlock } from './merge.ts'\nimport { rnessCommand } from './pm.ts'\nimport type { Manifest } from './types.ts'\n\nexport interface CheckBlocksInput {\n root: string\n rnessDir: string\n manifest: Manifest\n org: string\n}\n\n/**\n * What a target's `AGENTS.md` turned out to be. `stale` and `malformed` are\n * problems, `missing-dir` and `no-block` only warnings; `current` says\n * nothing and carries no message.\n */\nexport type BlockStatus =\n 'current' | 'stale' | 'malformed' | 'missing-dir' | 'no-block'\n\nexport interface BlockCheck {\n label: string\n status: BlockStatus\n /** The line the plain look prints; null when the block is current. */\n message: string | null\n}\n\nexport interface CheckBlocksResult {\n problems: string[]\n warnings: string[]\n /** One entry per target, in the order they were checked (spec 0007 §5c). */\n checks: BlockCheck[]\n}\n\nconst PROBLEM: ReadonlySet<BlockStatus> = new Set(['stale', 'malformed'])\n\n/**\n * Compare every present block with a fresh render (spec 0003 §4.6): a\n * different hash is a problem, a missing block only a warning, and nothing\n * is checked where no `org/` directory exists (a standalone context checkout).\n */\nexport async function checkBlocks({\n root,\n rnessDir,\n manifest,\n org,\n}: CheckBlocksInput): Promise<CheckBlocksResult> {\n const checks: BlockCheck[] = []\n const note = (\n label: string,\n status: BlockStatus,\n message: string | null = null\n ): void => {\n checks.push({ label, status, message })\n }\n // The two flat arrays are a view over `checks`, so a line printed today\n // cannot drift from what the terminal renders.\n const derive = (): CheckBlocksResult => ({\n problems: checks\n .filter((c) => PROBLEM.has(c.status) && c.message !== null)\n .map((c) => c.message as string),\n warnings: checks\n .filter((c) => !PROBLEM.has(c.status) && c.message !== null)\n .map((c) => c.message as string),\n checks,\n })\n if (!(await exists(join(root, 'org')))) return derive()\n\n // The root carries the global block twice: in AGENTS.md, and in CLAUDE.md\n // with no `@AGENTS.md` pointer left (spec 0011 §2). A scope, in AGENTS.md.\n const targets: Array<{\n scope: string | null\n dir: string\n depth: number\n file: string\n label: string\n }> = [\n { scope: null, dir: root, depth: 0, file: 'AGENTS.md', label: 'AGENTS.md' },\n { scope: null, dir: root, depth: 0, file: 'CLAUDE.md', label: 'CLAUDE.md' },\n ]\n for (const [name, entry] of Object.entries(manifest.scopes)) {\n const segments = entry.path.split('/')\n targets.push({\n scope: name,\n dir: join(root, ...segments),\n depth: segments.length,\n file: 'AGENTS.md',\n label: `${entry.path}/AGENTS.md`,\n })\n }\n\n for (const t of targets) {\n if (!(await exists(t.dir))) {\n note(\n t.label,\n 'missing-dir',\n `${t.label}: directory not present, block not checked`\n )\n continue\n }\n const text = await readOrNull(join(t.dir, t.file))\n const lines = text === null ? [] : text.split(/\\r?\\n/)\n const found = findBlock(lines)\n if (found.kind === 'none') {\n note(\n t.label,\n 'no-block',\n `${t.label}: no rness block yet (run ${rnessCommand()} sync)`\n )\n continue\n }\n if (found.kind === 'error') {\n note(t.label, 'malformed', `${t.label}: ${found.message}`)\n continue\n }\n const context = await assembleContext({\n rnessDir,\n manifest,\n scope: t.scope,\n })\n const fresh = renderBlock({\n scope: t.scope,\n org,\n depth: t.depth,\n context,\n })\n // Two ways to be stale: the header no longer matches a fresh render, or the\n // body no longer matches its own header — a hand edit inside the block.\n const pointerLeft =\n t.file === 'CLAUDE.md' && lines.some((l) => l.trim() === '@AGENTS.md')\n if (\n isCurrentBlock(lines.slice(found.begin, found.end + 1), fresh.hash) &&\n !pointerLeft\n )\n note(t.label, 'current')\n else\n note(\n t.label,\n 'stale',\n `${t.label}: stale rness block (run ${rnessCommand()} sync)`\n )\n }\n return derive()\n}\n","import { join } from 'node:path'\n\nimport { collectMarkdown } from './collect.ts'\nimport { COLLECTIONS } from './context.ts'\nimport type { CollectionName } from './types.ts'\n\n/** Collections whose files must carry front matter with a `status`. */\nexport const STATUSES: Partial<Record<CollectionName, readonly string[]>> = {\n adr: ['Proposed', 'Accepted', 'Rejected', 'Superseded'],\n specs: [\n 'Draft',\n 'Proposed',\n 'Approved',\n 'Implemented',\n 'Superseded',\n 'Rejected',\n ],\n plans: ['Draft', 'Ready', 'In progress', 'Blocked', 'Completed', 'Abandoned'],\n}\nconst SKIP = new Set(['adr/0000-template.md'])\n/** Front-matter keys from the withdrawn routing feature — the directory decides. */\nconst PLACEMENT_KEYS = ['scopes', 'scope'] as const\n\n/** Human-readable problems across every collection; empty when the tree is valid. */\nexport async function checkContract(rnessDir: string): Promise<string[]> {\n const problems: string[] = []\n for (const name of COLLECTIONS) {\n const allowed = STATUSES[name]\n const items = await collectMarkdown(join(rnessDir, name))\n for (const item of items) {\n const where = `${name}/${item.rel}`\n if (SKIP.has(where)) continue\n if (item.fieldsError !== null) {\n problems.push(`${where}: invalid front matter (${item.fieldsError})`)\n continue\n }\n if (item.fields !== null) {\n for (const key of PLACEMENT_KEYS) {\n if (Object.hasOwn(item.fields, key)) {\n problems.push(\n `${where}: front matter \"${key}\" is not supported — the directory decides the scope; move the file`\n )\n }\n }\n }\n if (allowed === undefined) continue\n if (item.fields === null) {\n problems.push(`${where}: missing a front-matter block`)\n continue\n }\n if (item.title === null) problems.push(`${where}: missing a \"# \" title`)\n const status = item.fields['status']\n if (status === undefined || status === null || status === '') {\n problems.push(`${where}: missing \"status\"`)\n } else if (typeof status !== 'string' || !allowed.includes(status)) {\n problems.push(\n `${where}: unknown status ${JSON.stringify(status)} (expected ${allowed.join(', ')})`\n )\n }\n }\n }\n return problems\n}\n","import { clearAuth, readAuth } from '../core/auth.ts'\nimport { removeGitSetup } from '../core/setup-git.ts'\nimport { status } from '../core/style.ts'\nimport { reportError } from '../report.ts'\nimport { revokeUrl } from './login.ts'\n\n/** `rness logout`: forget the stored login and undo `setup-git` (spec 0004 §2, §5). */\nexport async function logoutCommand(): Promise<number> {\n try {\n const stored = await readAuth()\n await clearAuth()\n const undone = await removeGitSetup().catch(() => false)\n if (stored === null && !undone) {\n process.stdout.write('not logged in\\n')\n return 0\n }\n if (stored !== null)\n process.stdout.write(\n `${status('logged out', `${stored.login} (github.com)`)}\\n`\n )\n if (undone)\n process.stdout.write(\n `${status('updated', 'git: rness no longer answers for https://github.com')}\\n`\n )\n process.stdout.write(`revoke rness on GitHub: ${revokeUrl()}\\n`)\n return 0\n } catch (e) {\n return reportError(e)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { mkdtemp, readFile, rm } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { basename, join, relative } from 'node:path'\nimport { promisify } from 'node:util'\n\nimport { writtenFiles } from '../core/agent-targets.ts'\nimport { readPinnedCli } from '../core/delegate.ts'\nimport { exists, writeFileAtomic } from '../core/fs.ts'\nimport { changedPaths, isClean } from '../core/git.ts'\nimport { loadManifest } from '../core/manifest.ts'\nimport {\n EXACT_VERSION,\n compareVersions,\n readPin,\n workspacePackageManager,\n writePin,\n} from '../core/pinned.ts'\nimport {\n type PackageManager,\n installDependencies,\n packageManagerVersion,\n rnessCommand,\n} from '../core/pm.ts'\nimport { renderScaffold } from '../core/scaffold-copy.ts'\nimport {\n buildScaffoldCommit,\n commitUpgrade,\n findScaffoldBase,\n isRepository,\n mergeInProgress,\n mergeScaffold,\n withoutRedundantKeeps,\n} from '../core/scaffold-git.ts'\nimport { scaffoldDir } from '../core/scaffold.ts'\nimport { status } from '../core/style.ts'\nimport { syncBlocks } from '../core/sync-blocks.ts'\nimport { type Terminal, defaultTerminal } from '../core/terminal.ts'\nimport type { Manifest } from '../core/types.ts'\nimport { type Ui, makeUi, plainUi } from '../core/ui.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\nimport { VERSION } from '../version.ts'\n\nconst execFileP = promisify(execFile)\n\nexport interface UpgradeOptions {\n yes?: boolean\n /** Internal (tests): directory to resolve from. */\n cwd?: string\n}\n\nconst NOTES = 'https://github.com/rness-dev/rness/tree/main/packages/cli#readme'\n\n/** `npm view`: npm ships with Node and follows the user's registry configuration. */\nasync function latestVersion(): Promise<string | null> {\n try {\n const { stdout } = await execFileP(\n 'npm',\n ['view', '@rness/cli@latest', 'version'],\n { timeout: 30_000 }\n )\n const version = stdout.trim()\n return EXACT_VERSION.test(version) ? version : null\n } catch {\n return null\n }\n}\n\n/** What upgrade takes from outside; tests replace where the scaffold comes from. */\nexport interface UpgradeDeps {\n /** The directory holding `version`'s scaffold, and how to clean it up. */\n scaffoldFor?: (\n version: string,\n rnessDir: string\n ) => Promise<{ dir: string; cleanup?: () => Promise<void> }>\n}\n\n/**\n * Where `version`'s scaffold is read from (spec 0013 §2): the running copy\n * when it is that version, the copy installed in `.rness` when it is (the\n * pin already moved by pull request), else the published package, through\n * `npm pack` — npm follows the user's registry configuration.\n */\nasync function scaffoldFor(\n version: string,\n rnessDir: string\n): Promise<{ dir: string; cleanup?: () => Promise<void> }> {\n if (version === VERSION) return { dir: scaffoldDir() }\n const installed = await readPinnedCli(rnessDir)\n const inside = installed === null ? null : join(installed.dir, 'scaffold')\n if (\n installed?.version === version &&\n inside !== null &&\n (await exists(join(inside, 'package.json')))\n )\n return { dir: inside }\n const scratch = await mkdtemp(join(tmpdir(), 'rness-pack-'))\n const cleanup = () => rm(scratch, { recursive: true, force: true })\n try {\n const { stdout } = await execFileP(\n 'npm',\n [\n 'pack',\n `@rness/cli@${version}`,\n '--pack-destination',\n scratch,\n '--silent',\n ],\n { timeout: 60_000 }\n )\n const tarball = stdout.trim().split('\\n').at(-1) ?? ''\n await execFileP('tar', ['-xzf', join(scratch, tarball), '-C', scratch])\n return { dir: join(scratch, 'package', 'scaffold'), cleanup }\n } catch (e) {\n await cleanup()\n throw new Error(\n `cannot get the @rness/cli ${version} scaffold (npm pack): ${e instanceof Error ? e.message.split('\\n')[0] : String(e)}`,\n { cause: e }\n )\n }\n}\n\n/** The `packageManager` line the workspace declares, kept through every merge. */\nasync function declaredManager(\n rnessDir: string,\n pm: PackageManager\n): Promise<string> {\n try {\n const pkg = JSON.parse(\n await readFile(join(rnessDir, 'package.json'), 'utf8')\n ) as { packageManager?: unknown }\n if (typeof pkg.packageManager === 'string') return pkg.packageManager\n } catch {\n // the install below reports an unreadable package.json\n }\n return `${pm}@${await packageManagerVersion(pm)}`\n}\n\n/** A clone whose files sync writes changed: its path from `cwd`, and those files. */\ninterface CloneChanges {\n dir: string\n paths: string[]\n}\n\n/**\n * The clones where the sync changed a file it writes — never the developer's\n * other files. Other repositories, other review flows: `upgrade` commits\n * none of them, the next steps say what to add (spec 0013 §8).\n */\nasync function clonesToCommit(\n root: string,\n cwd: string,\n manifest: Manifest\n): Promise<CloneChanges[]> {\n const files = writtenFiles(manifest)\n const clones: CloneChanges[] = []\n for (const repo of Object.keys(manifest.repos)) {\n const dir = join(root, 'org', repo)\n if (!(await exists(dir))) continue\n try {\n const paths = await changedPaths(dir, files)\n if (paths.length > 0)\n clones.push({ dir: relative(cwd, dir) || '.', paths })\n } catch {\n // Not a repository: sync reported it already.\n }\n }\n return clones\n}\n\n/**\n * The next steps: what `upgrade` did not do. A refused commit is the\n * maintainer's to make, and the command's exit code.\n */\nfunction finish(\n ui: Ui,\n cwd: string,\n rnessDir: string,\n label: string,\n target: string,\n ending: {\n commit: 'committed' | 'nothing' | 'refused'\n clones: readonly CloneChanges[]\n }\n): number {\n const rel = relative(cwd, rnessDir) || '.'\n const message = `chore: rness ${target}`\n const next: string[] = []\n if (ending.commit === 'committed') next.push(`git -C ${rel} push`)\n if (ending.commit === 'refused')\n next.push(`git -C ${rel} commit -m \"${message}\"`)\n for (const c of ending.clones)\n next.push(\n `git -C ${c.dir} add ${c.paths.join(' ')} && git -C ${c.dir} commit -m \"${message}\"`\n )\n if (ending.commit !== 'nothing')\n next.push('# teammates: git pull — the next rness command installs it')\n if (ui.session) {\n if (next.length > 0) ui.note('Next steps', next)\n ui.outro(`${label} runs @rness/cli ${target}`)\n } else\n process.stdout.write(\n [\n '',\n status('upgraded', `${label} to @rness/cli ${target}`),\n '',\n ...(next.length > 0\n ? ['Next:', ...next.map((line) => ` ${line}`), '']\n : []),\n ].join('\\n')\n )\n return ending.commit === 'refused' ? 1 : 0\n}\n\n/**\n * `rness upgrade [version]`: move a workspace to another `@rness/cli` — merge\n * its scaffold, pin it in `.rness/package.json` (the one place the version is\n * written), install with the workspace's package manager, sync through the\n * new copy (spec 0006 §3), commit `.rness` (spec 0013 §8). Never delegated:\n * the pinned copy is what is being replaced.\n */\nexport async function upgradeCommand(\n version: string | undefined,\n opts: UpgradeOptions,\n terminal: Terminal = defaultTerminal,\n deps: UpgradeDeps = {}\n): Promise<number> {\n const cwd = opts.cwd ?? process.cwd()\n if (version !== undefined && !EXACT_VERSION.test(version)) {\n process.stderr.write(\n `version \"${version}\" is not an exact version (for example 0.5.0)\\n`\n )\n return 2\n }\n try {\n const ws = await findWorkspace(cwd)\n const label = `${basename(ws.root)}/.rness`\n const pin = await readPin(ws.rnessDir)\n if (pin === null) {\n process.stderr.write(\n `no @rness/cli entry in ${label}/package.json; add it to devDependencies, then run ${rnessCommand()} upgrade\\n`\n )\n return 1\n }\n const interactive = opts.yes !== true\n if (interactive && !terminal.isTty()) {\n process.stderr.write(\n 'rness upgrade installs and writes files; pass --yes to run without a prompt\\n'\n )\n return 2\n }\n\n const ui = interactive ? await makeUi(terminal) : { ...plainUi }\n ui.intro(`Upgrade workspace ${basename(ws.root)}`)\n const target =\n version ??\n (await ui.step(\n { doing: 'asking the registry for the latest release', quiet: true },\n () => latestVersion(),\n (v) => (v === null ? null : ['latest', `@rness/cli ${v}`])\n ))\n if (target === null) {\n process.stderr.write(\n `cannot reach the registry; name the version: ${rnessCommand()} upgrade <version>\\n`\n )\n return 1\n }\n const installed = (await readPinnedCli(ws.rnessDir))?.version ?? null\n // The scaffold is merged with git (spec 0013 §2): `.rness` must be a\n // repository with nothing uncommitted.\n if (!(await isRepository(ws.rnessDir))) {\n process.stderr.write(`${label} is not a git repository\\n`)\n return 1\n }\n if (await mergeInProgress(ws.rnessDir)) {\n process.stderr.write(\n `${label} has a merge in progress; commit it, or abort it with git -C ${relative(cwd, ws.rnessDir) || '.'} merge --abort, then ${rnessCommand()} upgrade\\n`\n )\n return 1\n }\n if (!(await isClean(ws.rnessDir))) {\n process.stderr.write(\n `${label} has uncommitted changes; commit or stash them, then ${rnessCommand()} upgrade\\n`\n )\n return 1\n }\n const base = await findScaffoldBase(ws.rnessDir)\n const scaffoldCurrent = base !== null && base.version === target\n if (pin.spec === target && installed === target && scaffoldCurrent) {\n if (ui.session) ui.outro(`Already at ${target}`)\n else process.stdout.write(`already at ${target}\\n`)\n return 0\n }\n const downgrading =\n EXACT_VERSION.test(pin.spec) && compareVersions(target, pin.spec) < 0\n if (downgrading && version === undefined) {\n process.stderr.write(\n `${label} pins @rness/cli ${pin.spec}, newer than the latest release ${target}; to downgrade: ${rnessCommand()} upgrade ${target}\\n`\n )\n return 1\n }\n\n const pm = await workspacePackageManager(ws.rnessDir)\n if (pin.spec === target && installed === target)\n ui.line(\n 'scaffold',\n `@rness/cli ${target} — merging it into ${label}`,\n `Merging the @rness/cli ${target} scaffold into ${label}`\n )\n else if (pin.spec === target)\n ui.line(\n 'install',\n `@rness/cli ${target} in ${label} (${pm}) — ${installed ?? 'nothing'} is installed`\n )\n else {\n ui.line(\n 'upgrade',\n `@rness/cli ${pin.spec} → ${target} in ${label} (${pm})${downgrading ? ' — downgrading' : ''}`\n )\n ui.line('notes', NOTES, `Release notes: ${NOTES}`)\n }\n if (interactive) {\n const p = await terminal.prompts()\n const ok = await p.confirm({\n message: `Upgrade @rness/cli to ${target}?`,\n })\n if (p.isCancel(ok) || ok !== true) {\n ui.cancelled()\n return 1\n }\n }\n\n // 1. The scaffold of the target version, merged with git (spec 0013).\n let merged = false\n if (!scaffoldCurrent) {\n const source = await (deps.scaffoldFor ?? scaffoldFor)(\n target,\n ws.rnessDir\n )\n try {\n const files = await renderScaffold(source.dir, {\n version: target,\n packageManager: await declaredManager(ws.rnessDir, pm),\n })\n if (base === null)\n ui.line(\n 'adopting',\n `the @rness/cli ${target} scaffold (no scaffold commit in ${label} yet)`,\n `Adopting the @rness/cli ${target} scaffold — ${label} has no scaffold commit yet`\n )\n else\n ui.line(\n 'merging',\n `the @rness/cli ${target} scaffold`,\n `Merging the @rness/cli ${target} scaffold`\n )\n const commit = await buildScaffoldCommit(\n ws.rnessDir,\n base?.commit ?? null,\n base === null\n ? await withoutRedundantKeeps(ws.rnessDir, files)\n : files,\n target\n )\n const result = await mergeScaffold(\n ws.rnessDir,\n commit,\n base?.commit ?? null\n )\n for (const [change, path] of result.changes) ui.line(change, path)\n if (result.conflicts.length > 0) {\n for (const path of result.conflicts) ui.error(`conflict ${path}`)\n const rel = relative(cwd, ws.rnessDir) || '.'\n ui.hint(\n `resolve them in ${rel} (git checkout --ours <file> keeps yours, --theirs takes the scaffold's, or edit), git add, git commit, then ${rnessCommand()} upgrade again`,\n 'stderr'\n )\n return 1\n }\n merged = true\n } finally {\n await source.cleanup?.()\n }\n }\n\n // 2. The pin — a merge usually moved it already. Restored when the\n // install fails, unless a merge is in progress: `git merge --abort` then.\n const packageFile = join(ws.rnessDir, 'package.json')\n const restore = new Map<string, string>([\n [packageFile, await readFile(packageFile, 'utf8')],\n ])\n const moved = await readPin(ws.rnessDir)\n if (moved !== null && moved.spec !== target)\n await writePin(ws.rnessDir, moved.spec, target)\n\n // Only the scaffold was behind: the pinned copy is already installed.\n const mustInstall = !(pin.spec === target && installed === target)\n if (mustInstall) {\n try {\n await ui.step(\n { doing: `installing dependencies with ${pm}` },\n () => installDependencies(pm, ws.rnessDir),\n () => ['installed', `dependencies with ${pm}`]\n )\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n ui.error(message)\n // After a merge, `git merge --abort` puts package.json back; rewriting\n // it here, even byte for byte, would make git refuse the abort.\n if (!merged) {\n for (const [file, text] of restore) await writeFileAtomic(file, text)\n ui.hint(\n `restored ${relative(cwd, packageFile) || packageFile}`,\n 'stderr'\n )\n }\n if (merged)\n ui.hint(\n `the scaffold merge is still staged; undo it with: git -C ${relative(cwd, ws.rnessDir) || '.'} merge --abort`,\n 'stderr'\n )\n if (/minimum.?release.?age|NO_MATURE/i.test(message))\n ui.hint(\n \"pnpm refuses versions published less than 24 h ago: add '@rness/cli' under minimumReleaseAgeExclude in .rness/pnpm-workspace.yaml\",\n 'stderr'\n )\n return 1\n }\n const now = (await readPinnedCli(ws.rnessDir))?.version ?? null\n if (now !== target) {\n process.stderr.write(\n `${pm} install left @rness/cli ${now ?? 'not installed'} in ${label}, not ${target}\\n`\n )\n return 1\n }\n }\n\n // Whatever the upgrade had to do: a release may add to the agent files\n // as well as to the blocks (spec 0013 §8). The installed copy is a child\n // with plain output: never a prompt.\n ui.gitIsSilent = true\n const code = await syncBlocks(ui, ws.root, basename(ws.root))\n if (code !== 0) return code\n\n // 3. The commit, the end of the upgrade (spec 0013 §8): `.rness` was\n // clean, so everything in it now is the upgrade's.\n const message = `chore: rness ${target}`\n const committed = await commitUpgrade(ws.rnessDir, message)\n if (committed.kind === 'committed')\n ui.line(\n 'committed',\n `${label} — ${message}`,\n `Committed ${label}: ${message}`\n )\n if (committed.kind === 'refused') {\n ui.error(\n `the commit of ${label} was refused; everything is staged — deal with what git said, then commit`\n )\n for (const line of committed.output.split('\\n'))\n if (line.trim() !== '') ui.hint(line, 'stderr')\n }\n return finish(ui, cwd, ws.rnessDir, label, target, {\n commit: committed.kind,\n clones: await clonesToCommit(\n ws.root,\n cwd,\n await loadManifest(ws.rnessDir)\n ),\n })\n } catch (e) {\n return reportError(e)\n }\n}\n","import { type TargetOutcome, agentTargets } from './agent-targets.ts'\nimport { unsupportedAgents, unsupportedMessage } from './agents.ts'\nimport { type CheckBlocksResult, checkBlocks } from './blocks.ts'\nimport { checkContract } from './contract.ts'\nimport { workspaceName } from './manifest.ts'\nimport { rnessCommand } from './pm.ts'\nimport { scopeChain } from './scope.ts'\nimport type { Manifest, Workspace } from './types.ts'\n\nexport interface WorkspaceCheck {\n /** One line each, as `validate` prints them off a terminal. */\n problems: string[]\n blocks: CheckBlocksResult\n targets: TargetOutcome[]\n}\n\n/**\n * The problems `rness validate` reports: extends cycles (thrown), the\n * front-matter contract, stale or malformed blocks, agents this copy cannot\n * compile, and values a declared target guarantees but a file lacks (spec\n * 0011 §3). Read-only. Shared with the session-start hook (spec 0015 §3).\n */\nexport async function checkWorkspace(\n ws: Workspace,\n manifest: Manifest\n): Promise<WorkspaceCheck> {\n // loadManifest only checks that extends targets exist; walk every scope so\n // an extends cycle is reported here rather than breaking `context` later.\n for (const s of Object.keys(manifest.scopes)) scopeChain(manifest, s)\n const problems = await checkContract(ws.rnessDir)\n const blocks = await checkBlocks({\n root: ws.root,\n rnessDir: ws.rnessDir,\n manifest,\n org: workspaceName(manifest, ws.root),\n })\n problems.push(...blocks.problems)\n for (const name of unsupportedAgents(manifest.agents ?? []))\n problems.push(unsupportedMessage(name))\n const targets = await agentTargets(ws.root, manifest, { check: true })\n for (const o of targets)\n if (o.status === 'stale')\n problems.push(\n `${o.label}: ${o.detail ?? ''} (run ${rnessCommand()} sync)`\n )\n else if (o.status === 'invalid')\n problems.push(`${o.label}: ${o.detail ?? 'unreadable'}`)\n return { problems, blocks, targets }\n}\n","import { checkWorkspace } from '../core/check-workspace.ts'\nimport type { CommandDeps } from '../core/deps.ts'\nimport { loadManifest, workspaceName } from '../core/manifest.ts'\nimport { EXACT_VERSION, readPin } from '../core/pinned.ts'\nimport { rnessCommand } from '../core/pm.ts'\nimport {\n findScaffoldBase,\n isRepository,\n isShallow,\n} from '../core/scaffold-git.ts'\nimport { warn } from '../core/style.ts'\nimport { defaultTerminal } from '../core/terminal.ts'\nimport { makeUi } from '../core/ui.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\n\nexport interface ValidateOptions {\n /** Internal (tests): directory to resolve from; default `process.cwd()`. */\n cwd?: string\n}\n\n/**\n * `rness validate`: manifest, extends cycles, front-matter contract, stale\n * blocks. Returns the exit code.\n *\n * Off a terminal — CI, a git hook, an agent, a pipe — it writes the bytes it\n * always has (spec 0007 rule 1), and never loads a prompt library: that path\n * is ADR 0004's trust anchor. In a real terminal it speaks through the same\n * reporter as the interactive commands (spec 0007 §5c): a count of the blocks\n * that are current, a line for each that is not, and the verdict as the outro.\n */\nexport async function validateCommand(\n opts: ValidateOptions,\n deps: Partial<CommandDeps> = {}\n): Promise<number> {\n const cwd = opts.cwd ?? process.cwd()\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n const org = workspaceName(manifest, ws.root)\n const { problems, blocks, targets } = await checkWorkspace(ws, manifest)\n\n // The scaffold (spec 0013 §4): a warning, never a problem — and nothing\n // in a one-commit CI checkout, whose history is not there to read.\n const scaffoldWarnings: string[] = []\n if ((await isRepository(ws.rnessDir)) && !(await isShallow(ws.rnessDir))) {\n const pin = await readPin(ws.rnessDir)\n const base = await findScaffoldBase(ws.rnessDir)\n if (base === null || base.version === null)\n scaffoldWarnings.push(\n `the scaffold is not tracked in .rness yet: run ${rnessCommand()} upgrade`\n )\n else if (\n pin !== null &&\n EXACT_VERSION.test(pin.spec) &&\n pin.spec !== base.version\n )\n scaffoldWarnings.push(\n `the @rness/cli ${pin.spec} scaffold is not merged here: run ${rnessCommand()} upgrade`\n )\n }\n\n const ui = await makeUi(deps.terminal ?? defaultTerminal)\n if (!ui.session) {\n for (const p of problems) process.stderr.write(`${p}\\n`)\n for (const w of [...blocks.warnings, ...scaffoldWarnings])\n process.stderr.write(`${warn(w)}\\n`)\n if (problems.length > 0) return 1\n process.stdout.write('context ok\\n')\n return 0\n }\n\n ui.intro(`Validate ${org}`)\n // One line per target, as `sync` reports one per file it walked: the two\n // commands cross the same targets, so they read the same (spec 0007 §5c).\n // A conforming block is grey — green means something was written, and on a\n // large organization that is what must stand out (spec 0007 §4).\n // The root CLAUDE.md follows the root AGENTS.md, as in `sync`: its line\n // is said only when its status differs.\n const rootStatus = blocks.checks.find(\n (c) => c.label === 'AGENTS.md'\n )?.status\n const shown = blocks.checks.filter(\n (c) => !(c.label === 'CLAUDE.md' && c.status === rootStatus)\n )\n for (const c of shown)\n if (c.message === null) ui.line('current', c.label)\n else if (c.status === 'stale' || c.status === 'malformed')\n ui.error(c.message)\n else ui.warn(c.message)\n for (const o of targets)\n if (o.status === 'unchanged') ui.line('current', o.label)\n for (const p of problems) if (!blocks.problems.includes(p)) ui.error(p)\n for (const w of scaffoldWarnings) ui.warn(w)\n ui.outro(\n problems.length > 0 ? 'Context mismatch' : 'Context OK',\n problems.length > 0 ? 'error' : 'done'\n )\n return problems.length > 0 ? 1 : 0\n } catch (e) {\n return reportError(e)\n }\n}\n","import { Command, CommanderError, Option } from 'commander'\n\nimport { type AddOptions, addCommand } from './commands/add.ts'\nimport { type ContextOptions, contextCommand } from './commands/context.ts'\nimport { type CreateOptions, createCommand } from './commands/create.ts'\nimport { gitCredentialCommand } from './commands/git-credential.ts'\nimport { hookCommand } from './commands/hook.ts'\nimport { type LoginOptions, loginCommand } from './commands/login.ts'\nimport { logoutCommand } from './commands/logout.ts'\nimport { type McpOptions, mcpCommand } from './commands/mcp.ts'\nimport { type StatusOptions, statusCommand } from './commands/status.ts'\nimport { type SyncOptions, syncCommand } from './commands/sync.ts'\nimport { type UpgradeOptions, upgradeCommand } from './commands/upgrade.ts'\nimport { type ValidateOptions, validateCommand } from './commands/validate.ts'\nimport { PACKAGE_MANAGERS } from './core/pm.ts'\nimport { banner, bold, paint } from './core/style.ts'\nimport { VERSION } from './version.ts'\n\ninterface RunState {\n code: number\n}\n\nfunction buildProgram(state: RunState): Command {\n const program = new Command()\n .name('rness')\n .description('Configuration-plane CLI for rness workspaces')\n .version(VERSION, '-v, --version', 'print the version')\n .exitOverride()\n .showHelpAfterError()\n .configureOutput({\n writeOut: (s) => {\n process.stdout.write(s)\n },\n writeErr: (s) => {\n process.stderr.write(s)\n },\n outputError: (s, write) => {\n write(paint('error', s, process.stderr))\n },\n })\n // Before any sub-command is created: they inherit it. The painters answer\n // plain text off a terminal, so a piped help is what it always was.\n .configureHelp({\n styleTitle: (s) => bold(s),\n styleUsage: (s) => paint('done', s),\n styleCommandText: (s) => paint('info', s),\n styleSubcommandText: (s) => paint('info', s),\n styleArgumentText: (s) => paint('info', s),\n styleOptionText: (s) => paint('warn', s),\n styleDescriptionText: (s) => paint('idle', s),\n })\n // The root help only: a sub-command's help stays short.\n .addHelpText('before', () => banner(VERSION))\n\n program\n .command('context')\n .description('Resolve and print the context for a scope')\n .option(\n '--scope <name>',\n 'scope to resolve (default: the scope owning the current directory)'\n )\n .option('--json', 'print JSON instead of Markdown')\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (opts: ContextOptions) => {\n state.code = await contextCommand(opts)\n })\n\n program\n .command('status')\n .description(\n 'Show the status of every decision, specification and plan, a tab per directory'\n )\n .argument('[tab]', 'open on this tab: adr, specs, plans, …')\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (tab: string | undefined, opts: StatusOptions) => {\n state.code = await statusCommand(tab, opts)\n })\n\n program\n .command('validate')\n .description(\n 'Check the .rness/ tree against the contract and every generated block'\n )\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (opts: ValidateOptions) => {\n state.code = await validateCommand(opts)\n })\n\n program\n .command('sync')\n .description(\n 'Write the rness block into every AGENTS.md of the cloned repositories'\n )\n .option('--scope <name>', 'only this scope (the root block is skipped)')\n .option(\n '--check',\n 'render and compare only; exit 1 when a block is out of date'\n )\n .option('--pull', 'git pull --ff-only in every clean clone')\n .option('--all', 'clone every rness.json repository missing from org/')\n .option(\n '--agent <name>',\n 'declare an agent in rness.json, then write its files (repeatable; supported: claude)',\n (value: string, previous: string[] = []) => [...previous, value]\n )\n .option('-y, --yes', 'do not ask for confirmation')\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (opts: SyncOptions) => {\n state.code = await syncCommand(opts)\n })\n\n program\n .command('mcp')\n .description(\n 'Serve the workspace context to agents over MCP (stdio, read-only)'\n )\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (opts: McpOptions) => {\n state.code = await mcpCommand(opts)\n })\n\n program\n .command('add')\n .description(\n 'Clone (or adopt) a repository under org/ and declare it in rness.json'\n )\n .argument('<repo>', '<repo>, <owner>/<repo>, or a clone URL')\n .option(\n '--scopes <list>',\n 'comma-separated sub-directories to declare as scopes extending the repository'\n )\n .option(\n '--ssh',\n 'force git@github.com: (default: SSH when it works, else HTTPS)'\n )\n .option('--https', 'force https://github.com/')\n .option('-y, --yes', 'do not ask for confirmation')\n .addOption(new Option('--host <base>').hideHelp())\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (repo: string, opts: AddOptions) => {\n state.code = await addCommand(repo, opts)\n })\n\n program\n .command('login')\n .description('Log in to GitHub, to list and clone private repositories')\n .option('--setup-git', \"make rness git's credential helper for github.com\")\n .option('--no-setup-git', 'do not ask about git')\n .addOption(new Option('--github-api <base>').hideHelp())\n .action(async (opts: LoginOptions) => {\n state.code = await loginCommand(opts)\n })\n\n program\n .command('logout')\n .description('Forget the GitHub login of this machine')\n .action(async () => {\n state.code = await logoutCommand()\n })\n\n // What git runs once `rness login` made rness its credential helper.\n program\n .command('git-credential', { hidden: true })\n .argument('<operation>')\n .action(async (operation: string) => {\n state.code = await gitCredentialCommand(operation)\n })\n\n // What Claude Code runs for the hooks the Claude target writes (spec 0015).\n program\n .command('hook', { hidden: true })\n .argument('<event>', 'session-start or post-tool-use')\n .action(async (event: string) => {\n state.code = await hookCommand(event)\n })\n\n program\n .command('upgrade')\n .alias('update')\n .description(\n 'Move this workspace to another @rness/cli: pin it in .rness/package.json, install, sync'\n )\n .argument('[version]', 'an exact version (default: the latest release)')\n .option('-y, --yes', 'do not ask for confirmation')\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (version: string | undefined, opts: UpgradeOptions) => {\n state.code = await upgradeCommand(version, opts)\n })\n\n program\n .command('create')\n .description(\n \"Create or join a GitHub organization's workspace, or a blank one with --blank\"\n )\n .argument(\n '[name]',\n 'the GitHub organization, same as --org; with --blank, the workspace directory'\n )\n .option(\n '--org <name>',\n 'the GitHub organization, exact name (github.com/<name>)'\n )\n .option(\n '--repos <list>',\n 'comma-separated repositories for your workspace (catalogue entries are cloned, others added)'\n )\n .option(\n '--pm <name>',\n `package manager for .rness/ (${PACKAGE_MANAGERS.join(', ')}; default: the one running this command)`\n )\n .option(\n '--ssh',\n 'force git@github.com: (default: SSH when it works, else HTTPS)'\n )\n .option('--https', 'force https://github.com/')\n .option(\n '--blank',\n 'a local workspace with no GitHub organization: .rness/, an empty org/, the root files'\n )\n .option(\n '--agent <name>',\n \"a new workspace's agent, declared in rness.json (repeatable; supported: claude)\",\n (value: string, previous: string[] = []) => [...previous, value]\n )\n .option('--skip-install', 'do not install .rness/ dependencies')\n .option('-y, --yes', 'do not ask for confirmation')\n .option('--template <name>', 'reserved')\n .addOption(new Option('--host <base>').hideHelp())\n .addOption(new Option('--github-api <base>').hideHelp())\n .addOption(new Option('--cwd <dir>').hideHelp())\n .action(async (orgArg: string | undefined, opts: CreateOptions) => {\n // Blank, the positional names the directory; --org is refused there.\n if (opts.blank === true) {\n state.code = await createCommand(\n orgArg === undefined ? opts : { ...opts, name: orgArg }\n )\n return\n }\n if (\n orgArg !== undefined &&\n opts.org !== undefined &&\n orgArg !== opts.org\n ) {\n process.stderr.write(\n `organization given twice: \"${orgArg}\" and --org \"${opts.org}\"\\n`\n )\n state.code = 2\n return\n }\n const org = opts.org ?? orgArg\n state.code = await createCommand(\n org === undefined ? opts : { ...opts, org }\n )\n })\n\n return program\n}\n\n/**\n * Parse user arguments and run the matching command. Returns the exit code\n * and never calls process.exit: 0 success, 1 handled error, 2 bad usage.\n */\nexport async function run(argv: string[]): Promise<number> {\n const state: RunState = { code: 0 }\n const program = buildProgram(state)\n if (argv.length === 0) {\n process.stdout.write(banner(VERSION) + program.helpInformation())\n return 0\n }\n try {\n await program.parseAsync(argv, { from: 'user' })\n } catch (e) {\n if (e instanceof CommanderError) {\n // Commander 15 reuses `commander.help`'s code for both the successful\n // `--help` path and error paths (e.g. `help wat`, a lone `--`), so the\n // exit code it already computed is the only reliable signal here.\n return e.exitCode === 0 ? 0 : 2\n }\n throw e\n }\n return state.code\n}\n","import { resolveToken } from '../core/auth.ts'\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer)\n return Buffer.concat(chunks).toString('utf8')\n}\n\n/**\n * `rness git-credential <get|store|erase>`: git's credential-helper protocol\n * (spec 0004 §5). Only `get` for https://github.com is answered, with the\n * token of this machine; everything else is silence, which tells git to look\n * elsewhere. `input` is what git writes on stdin.\n */\nexport async function gitCredentialCommand(\n operation: string,\n input?: string\n): Promise<number> {\n if (operation !== 'get') return 0\n const fields = new Map<string, string>()\n for (const line of (input ?? (await readStdin())).split('\\n')) {\n const eq = line.indexOf('=')\n if (eq > 0) fields.set(line.slice(0, eq), line.slice(eq + 1).trimEnd())\n }\n if (fields.get('protocol') !== 'https' || fields.get('host') !== 'github.com')\n return 0\n const resolved = await resolveToken().catch(() => null)\n if (resolved === null) return 0\n process.stdout.write(`username=x-access-token\\npassword=${resolved.token}\\n`)\n return 0\n}\n","import { realpath } from 'node:fs/promises'\nimport { isAbsolute, posix, relative, resolve, sep } from 'node:path'\nimport type { Readable, Writable } from 'node:stream'\n\nimport { checkWorkspace } from '../core/check-workspace.ts'\nimport { COLLECTIONS } from '../core/context.ts'\nimport { checkContract } from '../core/contract.ts'\nimport { loadManifest, workspaceName } from '../core/manifest.ts'\nimport { pinDrift, workspacePackageManager } from '../core/pinned.ts'\nimport { resolveScope, scopeChain } from '../core/scope.ts'\nimport type { CollectionName, Workspace } from '../core/types.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { scopeSummary } from '../mcp/tools.ts'\nimport { VERSION } from '../version.ts'\n\n/**\n * `rness hook <event>`: what Claude Code runs for the hooks the Claude\n * target writes (spec 0015). Never installs, delegates or writes a file:\n * `hook` is one of the launcher's own commands (`OWN_COMMANDS`).\n */\n\nexport interface HookIo {\n input: Readable & { isTTY?: boolean }\n output: Writable\n error: Writable\n env: NodeJS.ProcessEnv\n}\n\ntype Input = Record<string, unknown>\n\nconst NOUNS: Record<CollectionName, [string, string]> = {\n standards: ['standard', 'standards'],\n adr: ['decision', 'decisions'],\n specs: ['specification', 'specifications'],\n plans: ['plan', 'plans'],\n skills: ['skill', 'skills'],\n}\n/** How many of `validate`'s problems the session start spells out. */\nconst SHOWN_PROBLEMS = 3\n\n/** The hook's JSON on stdin; `{}` from a terminal or for anything else. */\nasync function readInput(input: HookIo['input']): Promise<Input> {\n if (input.isTTY === true) return {}\n let text = ''\n for await (const chunk of input) text += String(chunk)\n try {\n const data: unknown = JSON.parse(text)\n return data !== null && typeof data === 'object' && !Array.isArray(data)\n ? (data as Input)\n : {}\n } catch {\n return {}\n }\n}\n\nconst message = (e: unknown): string =>\n e instanceof Error ? e.message : String(e)\n\n/** The session's directory: the input's, else the project's, else ours. */\nfunction cwdOf(input: Input, env: NodeJS.ProcessEnv): string {\n const cwd = input['cwd']\n if (typeof cwd === 'string' && cwd !== '') return cwd\n return env['CLAUDE_PROJECT_DIR'] ?? process.cwd()\n}\n\nconst toPosix = (p: string): string => p.split(sep).join(posix.sep)\n\nfunction count(n: number, [one, many]: [string, string]): string {\n return `${n} ${n === 1 ? one : many}`\n}\n\n/** Why the context may be wrong: the installed copy, then validate's problems. */\nasync function safetyNet(\n ws: Workspace,\n manifest: Awaited<ReturnType<typeof loadManifest>>\n): Promise<string[]> {\n const notes: string[] = []\n const drift = await pinDrift(ws.rnessDir)\n if (drift !== null)\n notes.push(\n `.rness pins @rness/cli ${drift.pin} but ${drift.installed ?? 'nothing'} is installed — run ${await workspacePackageManager(ws.rnessDir)} install in .rness`\n )\n try {\n const { problems } = await checkWorkspace(ws, manifest)\n if (problems.length > 0)\n notes.push(\n `${count(problems.length, ['problem', 'problems'])} in the workspace context — run rness validate`,\n ...problems.slice(0, SHOWN_PROBLEMS).map((p) => ` ${p}`)\n )\n } catch (e) {\n notes.push(message(e))\n }\n return notes\n}\n\n/**\n * A banner for the developer and the scope's summary for the model (spec\n * 0015 §3). One JSON object, always, and exit 0: a failure is a line of it.\n */\nasync function sessionStart(\n input: Input,\n env: NodeJS.ProcessEnv\n): Promise<Record<string, unknown>> {\n const cwd = cwdOf(input, env)\n let banner: string | null = null\n let context: string[] = []\n let notes: string[]\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n const scope = resolveScope(manifest, toPosix(relative(ws.root, cwd)))\n const summary = await scopeSummary(ws, manifest, scope)\n const counts = COLLECTIONS.flatMap((c) => {\n const n = summary.counts[c]\n return n === undefined ? [] : [count(n, NOUNS[c])]\n })\n banner = `rness ${VERSION} · ${workspaceName(manifest, ws.root)} · ${scope === null ? 'global scope' : `scope ${scope}`} — ${counts.length === 0 ? 'nothing applies yet' : counts.join(', ')}`\n const at = toPosix(relative(cwd, ws.rnessDir)) || '.rness'\n context = [\n ...summary.lines,\n `These documents are in ${at}: read one there, or with rness_read when the rness MCP server is connected.`,\n ]\n notes = await safetyNet(ws, manifest)\n } catch (e) {\n notes = [message(e)]\n }\n const warnings = notes.map((n) => `rness: ${n}`)\n const shown = [\n ...(banner !== null && input['source'] !== 'compact' ? [banner] : []),\n ...warnings,\n ]\n return {\n ...(shown.length > 0 ? { systemMessage: shown.join('\\n') } : {}),\n hookSpecificOutput: {\n hookEventName: 'SessionStart',\n additionalContext: [...context, ...warnings].join('\\n'),\n },\n }\n}\n\n/** `relative(from, to)` when `to` is inside `from`, else null. */\nfunction inside(from: string, to: string): string | null {\n const rel = relative(from, to)\n return rel === '' || rel.startsWith('..') || isAbsolute(rel)\n ? null\n : toPosix(rel)\n}\n\n/**\n * After an edit (spec 0015 §4): the problems the edited file of `.rness/`\n * now has, or those of `rness.json`. Exit 2 with them on stderr — Claude\n * Code hands them to the model — else 0, silent. The path is checked before\n * anything is read: this runs after every edit of the session.\n */\nasync function postToolUse(input: Input, io: HookIo): Promise<number> {\n const toolInput = input['tool_input']\n const path =\n toolInput !== null && typeof toolInput === 'object'\n ? (toolInput as Input)['file_path']\n : undefined\n if (typeof path !== 'string' || path === '') return 0\n const cwd = cwdOf(input, io.env)\n let ws: Workspace\n try {\n ws = await findWorkspace(cwd)\n } catch {\n return 0\n }\n const file = resolve(cwd, path)\n // The session may name the file through a link the workspace path does\n // not take (macOS: /tmp and /private/tmp): compare real paths as well.\n const rel =\n inside(ws.rnessDir, file) ??\n inside(\n await realpath(ws.rnessDir).catch(() => ws.rnessDir),\n await realpath(file).catch(() => file)\n )\n if (rel === null) return 0\n const first = rel.split('/')[0] ?? ''\n let problems: string[] = []\n if (rel === 'rness.json') {\n try {\n const manifest = await loadManifest(ws.rnessDir)\n for (const s of Object.keys(manifest.scopes)) scopeChain(manifest, s)\n } catch (e) {\n problems = [message(e)]\n }\n } else if (\n (COLLECTIONS as readonly string[]).includes(first) &&\n rel.endsWith('.md')\n )\n problems = (await checkContract(ws.rnessDir)).filter((p) =>\n p.startsWith(`${rel}:`)\n )\n if (problems.length === 0) return 0\n io.error.write(\n [\n ...problems.map((p) => `rness: ${p}`),\n `Fix it in ${rel}; rness validate checks the whole workspace.`,\n '',\n ].join('\\n')\n )\n return 2\n}\n\nexport async function hookCommand(\n event: string,\n io: HookIo = {\n input: process.stdin,\n output: process.stdout,\n error: process.stderr,\n env: process.env,\n }\n): Promise<number> {\n if (event !== 'session-start' && event !== 'post-tool-use') {\n io.error.write(\n `unknown hook event ${JSON.stringify(event)} (known: session-start, post-tool-use)\\n`\n )\n return 1\n }\n const input = await readInput(io.input)\n if (event === 'post-tool-use') return postToolUse(input, io)\n io.output.write(`${JSON.stringify(await sessionStart(input, io.env))}\\n`)\n return 0\n}\n","import { readFile, realpath, stat } from 'node:fs/promises'\nimport { isAbsolute, join, posix, relative, resolve, sep } from 'node:path'\n\nimport { collectMarkdown } from '../core/collect.ts'\nimport { COLLECTIONS, assembleContext, ownerScope } from '../core/context.ts'\nimport { STATUSES } from '../core/contract.ts'\nimport { documentNumber, documentTitle } from '../core/documents.ts'\nimport { loadManifest, workspaceName } from '../core/manifest.ts'\nimport { resolveScope } from '../core/scope.ts'\nimport type { CollectionName, Manifest, Workspace } from '../core/types.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport type { McpTool } from './protocol.ts'\n\n/**\n * The four read-only tools of `rness mcp` (spec 0014 §2), over the\n * workspace found from `cwd`. Everything is read again on each call: an\n * edit in `.rness/` shows at once. Text out, for a model to read.\n */\n\nconst LABELS: Record<CollectionName, string> = {\n standards: 'Standards',\n adr: 'Decisions',\n specs: 'Specifications',\n plans: 'Plans',\n skills: 'Skills',\n}\n/** The scaffold's ADR template is not a decision. */\nconst TEMPLATE = 'adr/0000-template.md'\nconst READ_LIMIT = 256 * 1024\nconst SEARCH_LIMIT = 20\nconst LINES_PER_HIT = 3\nconst LINE_WIDTH = 200\n\ninterface Doc {\n collection: CollectionName\n path: string\n scope: string | null\n id: string | null\n status: string | null\n title: string\n text: string\n}\n\ntype Result = { text: string; isError?: boolean }\nconst refuse = (text: string): Result => ({ text, isError: true })\n\n/** A failure (no workspace, an unreadable rness.json) is an answer too. */\nasync function guard(run: () => Promise<Result>): Promise<Result> {\n try {\n return await run()\n } catch (e) {\n return refuse(e instanceof Error ? e.message : String(e))\n }\n}\n\nasync function workspaceAt(\n cwd: string\n): Promise<{ ws: Workspace; manifest: Manifest }> {\n const ws = await findWorkspace(cwd)\n return { ws, manifest: await loadManifest(ws.rnessDir) }\n}\n\nasync function documents(\n rnessDir: string,\n only?: CollectionName\n): Promise<Doc[]> {\n const docs: Doc[] = []\n for (const collection of COLLECTIONS) {\n if (only !== undefined && collection !== only) continue\n for (const item of await collectMarkdown(join(rnessDir, collection))) {\n const path = `${collection}/${item.rel}`\n if (path === TEMPLATE) continue\n const status = item.fields?.['status']\n const id = documentNumber(item.rel)\n docs.push({\n collection,\n path,\n scope: ownerScope(item.rel),\n id,\n status: typeof status === 'string' ? status : null,\n title: documentTitle(item.title ?? posix.basename(item.rel, '.md'), id),\n text: item.body,\n })\n }\n }\n return docs\n}\n\nfunction line(d: Doc, withScope = false): string {\n const head = [d.id, d.status].filter((x) => x !== null).join(' ')\n return `- ${head === '' ? '' : `${head} — `}${d.title}${withScope ? ` — ${d.scope ?? 'global'}` : ''} — ${d.path}`\n}\n\nfunction isCollection(value: unknown): value is CollectionName {\n return (COLLECTIONS as readonly unknown[]).includes(value)\n}\n\nconst collectionError = (value: unknown): Result =>\n refuse(\n `unknown collection ${JSON.stringify(value)}; one of ${COLLECTIONS.join(', ')}`\n )\n\nasync function context(cwd: string, args: Record<string, unknown>) {\n const { ws, manifest } = await workspaceAt(cwd)\n let scope: string | null\n if (args['scope'] !== undefined) {\n const known = Object.keys(manifest.scopes).sort()\n if (\n typeof args['scope'] !== 'string' ||\n !Object.hasOwn(manifest.scopes, args['scope'])\n )\n return refuse(\n `unknown scope ${JSON.stringify(args['scope'])}; known: ${known.length === 0 ? 'none' : known.join(', ')}`\n )\n scope = args['scope']\n } else\n scope = resolveScope(\n manifest,\n relative(ws.root, cwd).split(sep).join(posix.sep)\n )\n const summary = await scopeSummary(ws, manifest, scope)\n return {\n text: [\n ...summary.lines,\n 'Read one with rness_read; search with rness_search.',\n ].join('\\n'),\n }\n}\n\n/** What applies to one scope, as `rness_context` and the session-start hook say it. */\nexport interface ScopeSummary {\n /** `scope web (org/web, extends platform)`, or `global scope`. */\n where: string\n /** The documents that apply, by collection; empty collections left out. */\n counts: Partial<Record<CollectionName, number>>\n /** The heading line, then each non-empty collection and its documents. */\n lines: string[]\n}\n\n/**\n * The documents that apply to `scope` (null: the global scope) — ids,\n * statuses, titles and paths, no bodies (spec 0014 §2).\n */\nexport async function scopeSummary(\n ws: Workspace,\n manifest: Manifest,\n scope: string | null\n): Promise<ScopeSummary> {\n const entry = scope === null ? undefined : manifest.scopes[scope]\n const where =\n scope === null || entry === undefined\n ? 'global scope'\n : `scope ${scope} (${entry.path}${entry.extends.length > 0 ? `, extends ${entry.extends.join(', ')}` : ''})`\n const ctx = await assembleContext({ rnessDir: ws.rnessDir, manifest, scope })\n const index = new Map(\n (await documents(ws.rnessDir)).map((d) => [d.path, d] as const)\n )\n const lines = [`Workspace ${workspaceName(manifest, ws.root)} · ${where}`]\n const counts: Partial<Record<CollectionName, number>> = {}\n for (const collection of ctx.collections) {\n const docs = collection.files\n .map((f) => index.get(`${collection.name}/${f.rel}`))\n .filter((d): d is Doc => d !== undefined)\n if (docs.length === 0) continue\n counts[collection.name] = docs.length\n lines.push(`${LABELS[collection.name]} (${docs.length}):`)\n for (const d of docs) lines.push(line(d))\n }\n return { where, counts, lines }\n}\n\nasync function list(cwd: string, args: Record<string, unknown>) {\n const { ws } = await workspaceAt(cwd)\n const collection = args['collection']\n if (!isCollection(collection)) return collectionError(collection)\n const status = args['status']\n const allowed = STATUSES[collection]\n if (status !== undefined) {\n if (allowed === undefined)\n return refuse(`${collection} have no status to filter on`)\n if (typeof status !== 'string' || !allowed.includes(status))\n return refuse(\n `unknown status ${JSON.stringify(status)} for ${collection}; one of ${allowed.join(', ')}`\n )\n }\n const docs = (await documents(ws.rnessDir, collection)).filter(\n (d) => status === undefined || d.status === status\n )\n if (docs.length === 0)\n return {\n text: `No document in ${collection}${status === undefined ? '' : ` with status ${String(status)}`}.`,\n }\n return {\n text: [\n `${LABELS[collection]} (${docs.length}):`,\n ...docs.map((d) => line(d, true)),\n ].join('\\n'),\n }\n}\n\nasync function read(cwd: string, args: Record<string, unknown>) {\n const { ws } = await workspaceAt(cwd)\n const path = args['path']\n if (typeof path !== 'string' || path.trim() === '')\n return refuse('path is required, relative to .rness/')\n const segments = path.split(/[\\\\/]/)\n if (\n isAbsolute(path) ||\n segments.includes('..') ||\n segments[0] === '.git' ||\n segments.includes('node_modules')\n )\n return refuse(\n `${path}: not a document of .rness/ (a relative path, no \"..\", nothing under .git/ or node_modules/)`\n )\n const root = await realpath(ws.rnessDir)\n let real: string\n try {\n real = await realpath(resolve(ws.rnessDir, path))\n } catch {\n return refuse(`${path}: no such file in .rness/`)\n }\n if (!real.startsWith(`${root}${sep}`))\n return refuse(`${path}: leads outside .rness/`)\n const info = await stat(real)\n if (!info.isFile()) return refuse(`${path}: not a file`)\n if (info.size > READ_LIMIT)\n return refuse(\n `${path}: ${info.size} bytes, over the 256 KiB rness_read returns`\n )\n return { text: await readFile(real, 'utf8') }\n}\n\nasync function search(cwd: string, args: Record<string, unknown>) {\n const { ws } = await workspaceAt(cwd)\n const query = args['query']\n if (typeof query !== 'string' || query.trim() === '')\n return refuse('query is required')\n const collection = args['collection']\n if (collection !== undefined && !isCollection(collection))\n return collectionError(collection)\n const needle = query.toLowerCase()\n const hits = (await documents(ws.rnessDir, collection))\n .map((d) => ({\n d,\n lines: d.text\n .split(/\\r?\\n/)\n .map((text, i) => ({ n: i + 1, text }))\n .filter((l) => l.text.toLowerCase().includes(needle)),\n }))\n .filter((h) => h.lines.length > 0)\n .sort(\n (a, b) =>\n b.lines.length - a.lines.length || a.d.path.localeCompare(b.d.path)\n )\n if (hits.length === 0)\n return { text: `No document matches ${JSON.stringify(query)}.` }\n const shown = hits.slice(0, SEARCH_LIMIT)\n const out = [\n `${hits.length} document${hits.length === 1 ? '' : 's'} match${hits.length === 1 ? 'es' : ''} ${JSON.stringify(query)}${hits.length > SEARCH_LIMIT ? ` (the ${SEARCH_LIMIT} most matching)` : ''}`,\n ]\n for (const h of shown) {\n out.push(line(h.d, true))\n for (const l of h.lines.slice(0, LINES_PER_HIT))\n out.push(` ${l.n}: ${l.text.trim().slice(0, LINE_WIDTH)}`)\n }\n return { text: out.join('\\n') }\n}\n\nconst collectionProperty = {\n type: 'string',\n enum: [...COLLECTIONS],\n description:\n 'standards (rules), adr (decisions), specs (specifications), plans, skills',\n}\n\nexport function mcpTools(cwd: string): McpTool[] {\n return [\n {\n name: 'rness_context',\n title: 'rness: what applies here',\n description:\n 'The rness scope of the current repository (or the one named) and what applies to it: the standards, decisions (ADRs), specifications and plans of that scope and of the scopes it extends — ids, statuses, titles and paths, no bodies. Start here, then read a document with rness_read.',\n inputSchema: {\n type: 'object',\n properties: {\n scope: {\n type: 'string',\n description:\n 'A scope of rness.json; default: the one owning the working directory',\n },\n },\n additionalProperties: false,\n },\n call: (args) => guard(() => context(cwd, args)),\n },\n {\n name: 'rness_list',\n title: 'rness: a collection',\n description:\n 'Every document of one collection of .rness/, across all scopes, with id, status, title, scope and path; optionally only those with a given status (for example the Accepted decisions).',\n inputSchema: {\n type: 'object',\n properties: {\n collection: collectionProperty,\n status: {\n type: 'string',\n description:\n 'adr: Proposed, Accepted, Rejected, Superseded; specs: Draft, Proposed, Approved, Implemented, Superseded, Rejected; plans: Draft, Ready, In progress, Blocked, Completed, Abandoned',\n },\n },\n required: ['collection'],\n additionalProperties: false,\n },\n call: (args) => guard(() => list(cwd, args)),\n },\n {\n name: 'rness_read',\n title: 'rness: read a document',\n description:\n 'One file of .rness/ as it is, by its path relative to .rness/ (as rness_context, rness_list and rness_search give it). Nothing outside .rness/.',\n inputSchema: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'For example adr/0006-workspace.md',\n },\n },\n required: ['path'],\n additionalProperties: false,\n },\n call: (args) => guard(() => read(cwd, args)),\n },\n {\n name: 'rness_search',\n title: 'rness: search the context',\n description:\n 'Where a subject is decided, specified or planned: a case-insensitive search of the documents of .rness/, most matching first, with the matching lines.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Text to find' },\n collection: collectionProperty,\n },\n required: ['query'],\n additionalProperties: false,\n },\n call: (args) => guard(() => search(cwd, args)),\n },\n ]\n}\n","import { posix } from 'node:path'\n\n/** A document's number: the `NNNN` its file name starts with, else null. */\nexport function documentNumber(rel: string): string | null {\n return /^(\\d{4})-/.exec(posix.basename(rel))?.[1] ?? null\n}\n\n/** The scaffold's heading is `NNNN — Title`; the number is shown once. */\nexport function documentTitle(heading: string, number: string | null): string {\n if (number === null) return heading\n const rest = new RegExp(`^${number}\\\\s*[—–:-]\\\\s*(.+)$`).exec(heading)?.[1]\n return rest ?? heading\n}\n","import { createInterface } from 'node:readline'\nimport type { Readable, Writable } from 'node:stream'\n\nimport { createProtocol } from '../mcp/protocol.ts'\nimport { mcpTools } from '../mcp/tools.ts'\nimport { VERSION } from '../version.ts'\n\nexport interface McpOptions {\n /** Internal (tests): directory to resolve from; default `process.cwd()`. */\n cwd?: string\n}\n\n/**\n * `rness mcp`: the workspace context for agents, over MCP on stdio\n * (spec 0014). One message per line in, one answer per line out; stdout\n * carries nothing else. Ends when stdin closes.\n */\nexport async function mcpCommand(\n opts: McpOptions,\n io: { input: Readable; output: Writable } = {\n input: process.stdin,\n output: process.stdout,\n }\n): Promise<number> {\n const protocol = createProtocol({\n name: 'rness',\n version: VERSION,\n tools: mcpTools(opts.cwd ?? process.cwd()),\n })\n const lines = createInterface({ input: io.input, crlfDelay: Infinity })\n for await (const line of lines) {\n if (line.trim() === '') continue\n const answer = await protocol.handle(line)\n if (answer !== null) io.output.write(`${answer}\\n`)\n }\n return 0\n}\n","/**\n * The part of MCP `rness mcp` speaks (spec 0014 §1): JSON-RPC 2.0, one\n * message per line, tools only. Both generations of the protocol: the\n * current revision, where every request carries its version and the client's\n * capabilities in `_meta`, and the earlier ones that open with `initialize`.\n * Knows nothing of rness: tools come in, lines go out.\n */\n\nexport interface McpTool {\n name: string\n title: string\n description: string\n inputSchema: Record<string, unknown>\n /** A refusal the model can act on is `isError: true`, not a throw. */\n call(\n args: Record<string, unknown>\n ): Promise<{ text: string; isError?: boolean }>\n}\n\n/** Checked against the MCP specification on 2026-09-29. */\nconst MODERN_VERSIONS: readonly string[] = ['2026-07-28']\nconst LEGACY_VERSIONS: readonly string[] = [\n '2025-11-25',\n '2025-06-18',\n '2025-03-26',\n '2024-11-05',\n]\nconst SUPPORTED = [...MODERN_VERSIONS, ...LEGACY_VERSIONS]\n\nconst VERSION_KEY = 'io.modelcontextprotocol/protocolVersion'\nconst CAPABILITIES_KEY = 'io.modelcontextprotocol/clientCapabilities'\nconst SERVER_INFO_KEY = 'io.modelcontextprotocol/serverInfo'\n\ntype Json = Record<string, unknown>\ntype Id = string | number | null\n\nfunction isObject(value: unknown): value is Json {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction errorLine(\n id: Id,\n code: number,\n message: string,\n data?: unknown\n): string {\n return JSON.stringify({\n jsonrpc: '2.0',\n id,\n error: data === undefined ? { code, message } : { code, message, data },\n })\n}\n\nexport function createProtocol(opts: {\n name: string\n version: string\n tools: readonly McpTool[]\n}): { handle(line: string): Promise<string | null> } {\n const serverInfo = { name: opts.name, version: opts.version }\n\n return {\n async handle(line: string): Promise<string | null> {\n let message: unknown\n try {\n message = JSON.parse(line)\n } catch {\n return errorLine(null, -32700, 'Parse error')\n }\n const rawId = isObject(message) ? message['id'] : undefined\n const id: Id =\n typeof rawId === 'string' || typeof rawId === 'number' ? rawId : null\n if (\n !isObject(message) ||\n message['jsonrpc'] !== '2.0' ||\n typeof message['method'] !== 'string'\n )\n return errorLine(id, -32600, 'Invalid Request')\n // A notification has no id and gets no answer, whatever it says.\n if (!('id' in message)) return null\n if (id === null) return errorLine(null, -32600, 'Invalid Request')\n\n const method = message['method']\n const params = isObject(message['params']) ? message['params'] : {}\n const meta = isObject(params['_meta']) ? params['_meta'] : null\n const modern = meta !== null && typeof meta[VERSION_KEY] === 'string'\n if (modern) {\n const requested = meta[VERSION_KEY] as string\n if (!MODERN_VERSIONS.includes(requested))\n return errorLine(id, -32022, 'Unsupported protocol version', {\n supported: SUPPORTED,\n requested,\n })\n if (!isObject(meta[CAPABILITIES_KEY]))\n return errorLine(\n id,\n -32602,\n `Invalid params: ${CAPABILITIES_KEY} is required`\n )\n }\n const answer = (result: Json): string =>\n JSON.stringify({\n jsonrpc: '2.0',\n id,\n result: modern\n ? {\n resultType: 'complete',\n ...result,\n _meta: { [SERVER_INFO_KEY]: serverInfo },\n }\n : result,\n })\n\n switch (method) {\n case 'server/discover':\n return answer({\n supportedVersions: SUPPORTED,\n capabilities: { tools: {} },\n })\n case 'initialize': {\n const asked = params['protocolVersion']\n const protocolVersion =\n typeof asked === 'string' && LEGACY_VERSIONS.includes(asked)\n ? asked\n : (LEGACY_VERSIONS[0] as string)\n return JSON.stringify({\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion,\n capabilities: { tools: {} },\n serverInfo,\n },\n })\n }\n case 'ping':\n return answer({})\n case 'tools/list':\n return answer({\n tools: opts.tools.map((t) => ({\n name: t.name,\n title: t.title,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n })\n case 'tools/call': {\n const name = params['name']\n const tool = opts.tools.find((t) => t.name === name)\n if (tool === undefined)\n return errorLine(id, -32602, `Unknown tool: ${String(name)}`)\n const args = isObject(params['arguments']) ? params['arguments'] : {}\n try {\n const r = await tool.call(args)\n return answer({\n content: [{ type: 'text', text: r.text }],\n isError: r.isError === true,\n })\n } catch (e) {\n return answer({\n content: [\n {\n type: 'text',\n text: `${tool.name} failed: ${e instanceof Error ? e.message : String(e)}`,\n },\n ],\n isError: true,\n })\n }\n }\n default:\n return errorLine(id, -32601, 'Method not found')\n }\n },\n }\n}\n","import { emitKeypressEvents } from 'node:readline'\n\nimport { loadManifest, workspaceName } from '../core/manifest.ts'\nimport {\n type Key,\n type Look,\n type View,\n clampView,\n pageSize,\n press,\n renderView,\n} from '../core/status-view.ts'\nimport {\n type StatusTab,\n findTab,\n statusMarkdown,\n statusTabs,\n} from '../core/status.ts'\nimport { bold, grey, inverse, paint } from '../core/style.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\n\nexport interface StatusOptions {\n /** Internal (tests, the Claude skill): directory to resolve from; default `process.cwd()`. */\n cwd?: string\n}\n\n/** The terminal the view takes: the process's own, a fake one in tests. */\nexport interface StatusTerminal {\n input: NodeJS.ReadStream\n output: NodeJS.WriteStream\n}\n\nconst ENTER = '\\x1b[?1049h\\x1b[?25l' // alternate screen, cursor hidden\nconst LEAVE = '\\x1b[?25h\\x1b[?1049l' // cursor shown, the screen as it was\n\nfunction lookFor(output: NodeJS.WriteStream): Look {\n return {\n bold: (text) => bold(text, output),\n dim: (text) => grey(text, output),\n inverse: (text) => inverse(text, output),\n tone: (tone, text) =>\n tone === 'done'\n ? paint('done', text, output)\n : tone === 'dropped'\n ? grey(text, output)\n : tone === 'missing'\n ? paint('error', text, output)\n : paint('warn', text, output),\n }\n}\n\ninterface Keypress {\n name?: string\n ctrl?: boolean\n shift?: boolean\n}\n\nconst MOVES: ReadonlySet<string> = new Set([\n 'left',\n 'right',\n 'up',\n 'down',\n 'pageup',\n 'pagedown',\n 'home',\n 'end',\n])\n\n/** A keypress as the view reads it, `close`, or nothing it knows. */\nfunction keyOf(key: Keypress | undefined): Key | 'close' | null {\n const name = key?.name\n if (name === undefined) return null\n if (name === 'q' || name === 'escape' || (key?.ctrl === true && name === 'c'))\n return 'close'\n if (name === 'tab') return key?.shift === true ? 'backtab' : 'tab'\n return MOVES.has(name) ? (name as Key) : null\n}\n\n/**\n * The view (spec 0016 §2.2): the alternate screen, raw keys, a redraw on\n * each key and each resize. Resolves when closed, the terminal restored —\n * also when drawing throws.\n */\nfunction showView(\n tabs: readonly StatusTab[],\n workspace: string,\n start: number,\n { input, output }: StatusTerminal\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const look = lookFor(output)\n let view: View = { tab: start, top: 0 }\n const rows = (): number => output.rows || 24\n const draw = (): void => {\n view = clampView(view, tabs, pageSize(rows()))\n const lines = renderView(\n view,\n tabs,\n workspace,\n output.columns || 80,\n rows(),\n look\n )\n output.write(`\\x1b[H${lines.map((l) => `${l}\\x1b[K`).join('\\r\\n')}\\x1b[J`)\n }\n const restore = (): void => {\n output.write(LEAVE)\n }\n const close = (error?: unknown): void => {\n input.off('keypress', onKey)\n output.off('resize', onResize)\n process.off('exit', restore)\n input.setRawMode(false)\n input.pause()\n restore()\n if (error === undefined) resolve()\n else reject(error)\n }\n const guarded = (step: () => void): void => {\n try {\n step()\n } catch (e) {\n close(e)\n }\n }\n const onKey = (_: string | undefined, key: Keypress | undefined): void => {\n const k = keyOf(key)\n if (k === 'close') close()\n else if (k !== null)\n guarded(() => {\n view = press(view, k, tabs, pageSize(rows()))\n draw()\n })\n }\n const onResize = (): void => {\n guarded(draw)\n }\n emitKeypressEvents(input)\n input.setRawMode(true)\n input.resume()\n output.write(ENTER)\n // Should the process end another way, the shell gets its screen back.\n process.on('exit', restore)\n input.on('keypress', onKey)\n output.on('resize', onResize)\n guarded(draw)\n })\n}\n\n/**\n * `rness status [tab]`: every tracked document of `.rness/` and its status,\n * a tab per directory (spec 0016). In a terminal, a view to move around;\n * off one, Markdown. Read-only.\n */\nexport async function statusCommand(\n tab: string | undefined,\n opts: StatusOptions,\n terminal: StatusTerminal = { input: process.stdin, output: process.stdout }\n): Promise<number> {\n try {\n const ws = await findWorkspace(opts.cwd ?? process.cwd())\n const manifest = await loadManifest(ws.rnessDir)\n const workspace = workspaceName(manifest, ws.root)\n const tabs = await statusTabs(ws.rnessDir)\n const wanted = tab === undefined ? undefined : findTab(tabs, tab)\n if (tab !== undefined && wanted === undefined) {\n process.stderr.write(\n `unknown tab \"${tab}\" (tabs: ${tabs.map((t) => t.name).join(', ')})\\n`\n )\n return 2\n }\n if (terminal.input.isTTY === true && terminal.output.isTTY === true) {\n await showView(\n tabs,\n workspace,\n wanted === undefined ? 0 : tabs.indexOf(wanted),\n terminal\n )\n return 0\n }\n terminal.output.write(\n statusMarkdown(workspace, wanted === undefined ? tabs : [wanted])\n )\n return 0\n } catch (e) {\n return reportError(e)\n }\n}\n","import { readdir } from 'node:fs/promises'\nimport { join, posix } from 'node:path'\n\nimport { collectMarkdown } from './collect.ts'\nimport { documentNumber, documentTitle } from './documents.ts'\nimport type { MarkdownItem } from './types.ts'\n\n/** One document of a tab (spec 0016 §2.1). */\nexport interface StatusRow {\n /** `NNNN`, else `YYYY-MM-DD`, else the file name. */\n id: string\n title: string\n /** As written; null when missing or when the front matter does not parse. */\n status: string | null\n /** Relative to `.rness/`. */\n path: string\n}\n\nexport interface StatusTab {\n /** The directory. */\n name: string\n label: string\n rows: StatusRow[]\n}\n\n/** The contract's collections that carry a status: always shown. */\nconst FIXED: readonly (readonly [string, string])[] = [\n ['adr', 'ADR'],\n ['specs', 'Specs'],\n ['plans', 'Plans'],\n]\n/** Never a discovered tab: the fixed ones, the contract's other collections, dependencies. */\nconst NOT_DISCOVERED: ReadonlySet<string> = new Set([\n ...FIXED.map(([name]) => name),\n 'standards',\n 'skills',\n 'node_modules',\n])\nconst TEMPLATE = 'adr/0000-template.md'\n\nfunction statusOf(item: MarkdownItem): string | null {\n const status = item.fields?.['status']\n return typeof status === 'string' && status !== '' ? status : null\n}\n\nfunction rowOf(dir: string, item: MarkdownItem): StatusRow {\n const base = posix.basename(item.rel, '.md')\n // A dated file name (`2026-10-02-slug`) starts with four digits too.\n const date = /^(\\d{4}-\\d{2}-\\d{2})-/.exec(base)?.[1] ?? null\n const number = date === null ? documentNumber(item.rel) : null\n return {\n id: date ?? number ?? base,\n title: documentTitle(item.title ?? base, number),\n status: statusOf(item),\n path: `${dir}/${item.rel}`,\n }\n}\n\n/** Newest first: file names descending, then paths. */\nfunction newestFirst(a: StatusRow, b: StatusRow): number {\n const [x, y] = [posix.basename(a.path), posix.basename(b.path)]\n if (x !== y) return x < y ? 1 : -1\n return a.path < b.path ? 1 : a.path > b.path ? -1 : 0\n}\n\n/**\n * The tabs of `rness status` (spec 0016 §2.1): ADR, Specs and Plans, then\n * every other top-level directory of `.rness/` holding a Markdown file\n * whose front matter has a status — alphabetically, with those files only.\n */\nexport async function statusTabs(rnessDir: string): Promise<StatusTab[]> {\n const tabs: StatusTab[] = []\n for (const [name, label] of FIXED) {\n const rows = (await collectMarkdown(join(rnessDir, name)))\n .map((item) => rowOf(name, item))\n .filter((row) => row.path !== TEMPLATE)\n tabs.push({ name, label, rows: rows.sort(newestFirst) })\n }\n const entries = await readdir(rnessDir, { withFileTypes: true }).catch(\n () => []\n )\n const discovered = entries\n .filter(\n (e) =>\n e.isDirectory() &&\n !e.name.startsWith('.') &&\n !NOT_DISCOVERED.has(e.name)\n )\n .map((e) => e.name)\n .sort()\n for (const name of discovered) {\n const rows = (await collectMarkdown(join(rnessDir, name)))\n .filter((item) => statusOf(item) !== null)\n .map((item) => rowOf(name, item))\n if (rows.length > 0)\n tabs.push({\n name,\n label: `${name.charAt(0).toUpperCase()}${name.slice(1)}`,\n rows: rows.sort(newestFirst),\n })\n }\n return tabs\n}\n\n/** A tab by its name or label, whatever the case. */\nexport function findTab(\n tabs: readonly StatusTab[],\n wanted: string\n): StatusTab | undefined {\n const w = wanted.toLowerCase()\n return tabs.find(\n (tab) => tab.name.toLowerCase() === w || tab.label.toLowerCase() === w\n )\n}\n\nexport type StatusTone = 'done' | 'dropped' | 'missing' | 'active'\n\nconst DONE: ReadonlySet<string> = new Set([\n 'accepted',\n 'implemented',\n 'completed',\n 'published',\n])\nconst DROPPED: ReadonlySet<string> = new Set([\n 'rejected',\n 'superseded',\n 'abandoned',\n])\n\n/** What a status says at a glance (spec 0016 §2.1), whatever its case. */\nexport function statusTone(status: string | null): StatusTone {\n if (status === null) return 'missing'\n const s = status.toLowerCase()\n if (DONE.has(s)) return 'done'\n if (DROPPED.has(s)) return 'dropped'\n return 'active'\n}\n\nconst cell = (text: string): string => text.replaceAll('|', '\\\\|')\n\n/** The tabs as Markdown, off a terminal (spec 0016 §2.3). */\nexport function statusMarkdown(\n workspace: string,\n tabs: readonly StatusTab[]\n): string {\n const out = [`${workspace} · status`, '']\n for (const tab of tabs) {\n out.push(`## ${tab.label} (${tab.rows.length})`, '')\n if (tab.rows.length === 0) {\n out.push('_Nothing yet._', '')\n continue\n }\n out.push('| Id | Title | Status |', '| --- | --- | --- |')\n for (const row of tab.rows)\n out.push(\n `| ${cell(row.id)} | ${cell(row.title)} | ${cell(row.status ?? '?')} |`\n )\n out.push('')\n }\n return out.join('\\n')\n}\n","import { type StatusTab, type StatusTone, statusTone } from './status.ts'\n\n/**\n * The view of `rness status` in a terminal (spec 0016 §2.2), as pure\n * functions: a key moves the view, a view at a size is a list of lines. The\n * terminal — alternate screen, raw mode, keypresses — is the command's.\n */\n\nexport interface View {\n /** The active tab. */\n tab: number\n /** The first row shown. */\n top: number\n}\n\nexport type Key =\n | 'left'\n | 'right'\n | 'tab'\n | 'backtab'\n | 'up'\n | 'down'\n | 'pageup'\n | 'pagedown'\n | 'home'\n | 'end'\n\n/** How text is styled: ANSI in a terminal, the identity in tests. */\nexport interface Look {\n bold(text: string): string\n dim(text: string): string\n inverse(text: string): string\n tone(tone: StatusTone, text: string): string\n}\n\n/** Lines around the rows: the name, the tabs, a rule — a rule, the footer. */\nconst FRAME = 5\n\n/** The rows a terminal of `height` lines shows: one at least. */\nexport function pageSize(height: number): number {\n return Math.max(1, height - FRAME)\n}\n\nfunction lastTop(tab: StatusTab | undefined, page: number): number {\n return Math.max(0, (tab?.rows.length ?? 0) - page)\n}\n\n/** `view` moved by `key`: tabs wrap and start at the top; scrolling stops at the ends. */\nexport function press(\n view: View,\n key: Key,\n tabs: readonly StatusTab[],\n page: number\n): View {\n const n = tabs.length\n if (key === 'right' || key === 'tab')\n return { tab: (view.tab + 1) % n, top: 0 }\n if (key === 'left' || key === 'backtab')\n return { tab: (view.tab - 1 + n) % n, top: 0 }\n const moved: Record<string, number> = {\n up: view.top - 1,\n down: view.top + 1,\n pageup: view.top - page,\n pagedown: view.top + page,\n home: 0,\n end: Number.MAX_SAFE_INTEGER,\n }\n const top = moved[key] ?? view.top\n return {\n tab: view.tab,\n top: Math.min(Math.max(0, top), lastTop(tabs[view.tab], page)),\n }\n}\n\n/** The view kept in range after a resize changed the page. */\nexport function clampView(\n view: View,\n tabs: readonly StatusTab[],\n page: number\n): View {\n return {\n tab: view.tab,\n top: Math.min(view.top, lastTop(tabs[view.tab], page)),\n }\n}\n\n// --- rendering ---------------------------------------------------------------\n\n/** A piece of a line and how to style it once cut. */\ntype Segment = readonly [text: string, style?: (text: string) => string]\n\nconst width = (text: string): number => [...text].length\n\n/** `text` in `n` columns: cut with `…` when longer, padded when shorter. */\nfunction fit(text: string, n: number): string {\n if (n <= 0) return ''\n const chars = [...text]\n if (chars.length <= n) return text + ' '.repeat(n - chars.length)\n return `${chars\n .slice(0, n - 1)\n .join('')\n .trimEnd()}…`.padEnd(n)\n}\n\n/** The segments cut to `columns`, then styled: a style never spans a cut. */\nfunction line(segments: readonly Segment[], columns: number): string {\n let left = columns\n let out = ''\n for (const [text, style] of segments) {\n if (left <= 0) break\n const chars = [...text]\n const kept = chars.length <= left ? text : chars.slice(0, left).join('')\n left -= width(kept)\n out += style === undefined ? kept : style(kept)\n }\n return out\n}\n\nfunction tabBar(\n tabs: readonly StatusTab[],\n active: number,\n look: Look\n): Segment[] {\n const segments: Segment[] = [[' ']]\n tabs.forEach((tab, i) => {\n if (i > 0) segments.push([' '])\n const label = ` ${tab.label} (${tab.rows.length}) `\n segments.push(i === active ? [label, look.inverse] : [label])\n })\n return segments\n}\n\nfunction rowLines(\n tab: StatusTab | undefined,\n top: number,\n page: number,\n columns: number,\n look: Look\n): Segment[][] {\n if (tab === undefined || tab.rows.length === 0)\n return [[[' Nothing here yet.', look.dim]]]\n const idWidth = Math.max(...tab.rows.map((r) => width(r.id)))\n const statusWidth = Math.max(...tab.rows.map((r) => width(r.status ?? '?')))\n // Two spaces before each column, one free at the right edge.\n const titleWidth = Math.max(\n 1,\n columns - 1 - (2 + idWidth + 2 + 2 + statusWidth)\n )\n return tab.rows\n .slice(top, top + page)\n .map((row) => [\n [' '],\n [row.id.padEnd(idWidth)],\n [' '],\n [fit(row.title, titleWidth)],\n [' '],\n [\n (row.status ?? '?').padEnd(statusWidth),\n (text) => look.tone(statusTone(row.status), text),\n ],\n ])\n}\n\n/** The footer: what is out of sight, then the keys. */\nfunction footer(above: number, below: number): string {\n const parts = [\n ...(above > 0 ? [`↑ ${above} above`] : []),\n ...(below > 0 ? [`↓ ${below} more`] : []),\n '←/→ tab · ↑/↓ scroll · q close',\n ]\n return ` ${parts.join(' · ')}`\n}\n\n/** The whole screen for `view`, `columns` wide and at most `height` lines. */\nexport function renderView(\n view: View,\n tabs: readonly StatusTab[],\n workspace: string,\n columns: number,\n height: number,\n look: Look\n): string[] {\n const page = pageSize(height)\n const tab = tabs[view.tab]\n const rule: Segment[] = [[` ${'─'.repeat(Math.max(0, columns - 2))}`]]\n const rows = rowLines(tab, view.top, page, columns, look)\n const shown = Math.min(page, rows.length)\n const total = tab?.rows.length ?? 0\n const lines: Segment[][] = [\n [[` rness · ${workspace}`, look.bold]],\n tabBar(tabs, view.tab, look),\n rule,\n ...rows,\n ...Array.from({ length: page - shown }, (): Segment[] => [['']]),\n rule,\n [[footer(view.top, Math.max(0, total - view.top - page)), look.dim]],\n ]\n return lines.slice(0, Math.max(0, height)).map((l) => line(l, columns))\n}\n","import { spawnSync } from 'node:child_process'\n\nimport { pinnedBinPath } from './delegate.ts'\nimport {\n type EnsureOptions,\n driftWarning,\n ensureInstalled,\n pinDrift,\n} from './pinned.ts'\nimport { findWorkspace } from './workspace.ts'\n\n/**\n * `create` makes a workspace and `upgrade` replaces the pinned copy: both are\n * served by the copy the user invoked (spec 0006 §3). The login concerns the\n * machine, not a workspace — and git runs `git-credential` from inside a\n * clone, on every fetch: no delegation, no install and no warning there.\n * Claude Code runs `hook` at every session start and after every edit, and\n * it is already the pinned copy: a drift is reported, never installed (spec\n * 0015 §3).\n */\nexport const OWN_COMMANDS: readonly string[] = [\n 'create',\n 'upgrade',\n 'update',\n 'login',\n 'logout',\n 'git-credential',\n 'hook',\n]\n\n/**\n * Set in the environment once an invocation has looked at the drift. Two\n * copies can look in one invocation — the launcher, then the installed copy it\n * delegates to — and they are different modules, in one process or in a child:\n * the environment is the only state they share. Private, not a user setting.\n */\nexport const CATCH_UP_DONE = 'RNESS_CATCH_UP_DONE'\n\nexport interface CatchUpDeps {\n cwd?: string\n env?: NodeJS.ProcessEnv\n stderr?: (text: string) => void\n install?: EnsureOptions['install']\n /** Run the installed bin with the user's arguments; its exit code. */\n spawn?: (bin: string, argv: string[], cwd: string) => number\n}\n\n/**\n * Close the gap between the pin and what is installed, then hand the command\n * to the freshly installed copy (spec 0008 §4). Returns that copy's exit code,\n * or null when the caller should run the command itself: no workspace, no\n * drift, nothing to do for this command, or an install that did not close the\n * drift (reported as a warning).\n *\n * It runs in two places. The launcher calls it before delegating. The\n * package's exported `run` calls it too, because a launcher older than 0.5.1\n * never does: it imports the installed copy's `run` and knows nothing about\n * drift. Everything on this path is imported statically — after the install,\n * the tree this module was loaded from may be gone.\n */\nexport async function catchUp(\n argv: string[],\n deps: CatchUpDeps = {}\n): Promise<number | null> {\n const env = deps.env ?? process.env\n const cwd = deps.cwd ?? process.cwd()\n const command = argv[0]\n if (\n command === undefined ||\n command.startsWith('-') ||\n OWN_COMMANDS.includes(command) ||\n env['RNESS_NO_DELEGATE'] === '1' ||\n env[CATCH_UP_DONE] === '1'\n )\n return null\n const ws = await findWorkspace(cwd).catch(() => null)\n if (ws === null) return null\n env[CATCH_UP_DONE] = '1'\n\n const stderr = deps.stderr ?? ((text) => void process.stderr.write(text))\n // The version was decided by the pull request that moved the pin, so\n // catching up asks nothing.\n const outcome = await ensureInstalled(ws.rnessDir, {\n env,\n announce: (pin) => stderr(`installing @rness/cli ${pin} in .rness…\\n`),\n ...(deps.install === undefined ? {} : { install: deps.install }),\n })\n if (outcome === null) return null\n if (!outcome.installed) {\n const warning = await driftWarning(cwd)\n if (warning !== null) stderr(`${warning}\\n`)\n return null\n }\n // Only hand off when the install actually closed the drift: a child that\n // would install again on every run must never be spawned.\n if ((await pinDrift(ws.rnessDir)) !== null) return null\n const bin = await pinnedBinPath(ws.rnessDir)\n if (bin === null) return null\n // The pinned tree was just rebuilt: importing out of it in this process is\n // fragile, so the freshly installed copy runs as its own process.\n const spawn =\n deps.spawn ??\n ((file, args, dir) =>\n spawnSync(process.execPath, [file, ...args], {\n cwd: dir,\n env,\n stdio: 'inherit',\n }).status ?? 1)\n return spawn(bin, argv, cwd)\n}\n"],"mappings":"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","names":["readFile","rm","join","join","readFile","rm","reason","status","message","post","execFile","dirname","promisify","execFileP","message","firstLine","resolve","finish","readFile","basename","join","message","basename","readFile","join","readFile","rm","join","join","declared","rm","readFile","spawn","line","firstLine","STDERR_FLUSH_MS","resolve","spawn","access","finish","stderr","reason","dirname","join","resolve","resolve","dirname","join","message","context","line","header","parse","fail","message","glob","readFile","join","posix","sep","sep","posix","glob","join","readFile","join","join","join","line","join","join","mkdir","dirname","join","run","parse","join","mkdir","dirname","guard","line","message","finish","join","cancelled","access","context","basename","join","FULL_URL","basename","access","join","posix","sep","sep","posix","readFile","join","join","readFile","declared","dirname","join","chmod","mkdir","readFile","stat","writeFile","dirname","join","join","readFile","stat","mkdir","dirname","writeFile","chmod","spawn","execFile","promisify","execFileP","spawn","mkdir","mkdtemp","rename","rm","tmpdir","join","relative","resolve","mkdir","readdir","rm","stat","dirname","join","relative","execFile","readFile","basename","join","promisify","execFileP","promisify","execFile","readFile","join","declared","basename","line","execFile","realpath","rm","writeFile","dirname","join","resolve","promisify","execFileP","message","status","line","isRepository","readdir","relative","dirname","join","stat","mkdir","rm","line","mkdir","join","relative","resolve","resolve","relative","mkdir","join","line","firstLine","list","access","join","message","rename","code","resolve","relative","mkdtemp","tmpdir","mkdir","failures","name","rness","next","line","rm","join","status","message","join","context","fresh","join","join","status","execFile","mkdtemp","readFile","rm","tmpdir","basename","join","relative","promisify","execFileP","promisify","execFile","inside","join","mkdtemp","tmpdir","rm","readFile","relative","message","line","basename","isRepository","isRepository","line","realpath","isAbsolute","posix","relative","resolve","sep","readFile","realpath","stat","join","posix","relative","resolve","sep","posix","run","join","status","posix","relative","sep","realpath","resolve","stat","readFile","toPosix","sep","posix","banner","context","relative","isAbsolute","resolve","realpath","isObject","message","line","line","readdir","join","posix","TEMPLATE","status","posix","join","readdir","DONE","line","resolve","step","run","spawn"]}
|