@rness/cli 0.4.0 → 0.5.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 +156 -4
- package/dist/bin/rness.js +18 -2
- package/dist/bin/rness.js.map +1 -1
- package/dist/chunk-WSGPDTPQ.js +3857 -0
- package/dist/chunk-WSGPDTPQ.js.map +1 -0
- package/dist/index.js +23 -1
- package/package.json +4 -4
- package/scaffold/.github/workflows/validate.yml +2 -1
- package/scaffold/README.md +1 -1
- package/scaffold/WORKSPACE.md +7 -5
- package/dist/chunk-IW5IHSPC.js +0 -1740
- package/dist/chunk-IW5IHSPC.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/fs.ts","../src/core/remote.ts","../src/core/git.ts","../src/core/manifest.ts","../src/core/repos.ts","../src/core/workspace.ts","../src/report.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/version.ts","../src/commands/sync.ts","../src/commands/add.ts","../src/commands/context.ts","../src/core/delegate.ts","../src/core/pm.ts","../src/core/scaffold.ts","../src/core/scaffold-copy.ts","../src/commands/create.ts","../src/core/blocks.ts","../src/core/contract.ts","../src/commands/validate.ts","../src/cli.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 { spawn } from 'node:child_process'\n\nimport { positional } from './git.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): 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 child = spawn('git', ['ls-remote', '--exit-code', url, 'HEAD'], {\n stdio: ['ignore', 'ignore', 'pipe'],\n env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },\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\nconst execFileP = promisify(execFile)\n\nasync function git(args: readonly string[], cwd?: string): Promise<string> {\n try {\n const { stdout } = await execFileP('git', [...args], {\n ...(cwd === undefined ? {} : { cwd }),\n env: {\n ...process.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(url: string, dir: string): Promise<void> {\n await git([\n 'clone',\n '--quiet',\n '--',\n positional(url, 'repository url'),\n positional(dir, 'directory'),\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 ...(pathspec.length > 0 ? ['--', ...pathspec] : []),\n ],\n dir\n )\n ).trim() === ''\n )\n}\n\nexport async function pullFastForward(dir: string): Promise<void> {\n await git(['pull', '--ff-only', '--quiet'], dir)\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\nexport const NAME = /^[a-z0-9][a-z0-9-]*$/\n\n/** Every top-level key contract 1 defines. */\nconst KEYS = ['contract', 'org', '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' || !NAME.test(value)) {\n fail(\n `\"org\" must be a name matching [a-z0-9-] (got ${JSON.stringify(value)})`\n )\n }\n return value\n}\n\n/** The organisation name every block and `add` use: `org`, else the root directory's name. */\nexport function resolveOrg(\n manifest: Manifest,\n root: string\n): { org: string; warning: string | null } {\n if (manifest.org !== null) return { org: manifest.org, warning: null }\n const name = basename(root)\n return {\n org: name,\n warning: `rness.json: no \"org\"; using the directory name \"${name}\"`,\n }\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)) fail(`repo name \"${name}\" is not [a-z0-9-]`)\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)) fail(`scope name \"${name}\" is not [a-z0-9-]`)\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 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 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,\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) 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-z0-9-] (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}\" is not [a-z0-9-]`)\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, parseRepoSpec, writeManifest } from './manifest.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 org: string\n host: string\n /** Sub-scopes relative to the repository (`apps/web`); each becomes scope `<basename>` extending `<repo>`. */\n scopes: readonly string[]\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(`sub-scope \"${clean}\" needs a [a-z0-9-] last segment`)\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)\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 { dirname, join, parse, resolve } from 'node:path'\n\nimport { exists } from './fs.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 * 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(`${message}\\n`)\n }\n return 1\n}\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 version: string\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 version: string\n scope: string\n hash: string\n}\n\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 'read `STATUS.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}\\` — read \\`STATUS.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(version: string, scope: string | null, hash: string): string {\n return `<!-- rness ${version} · 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 version,\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(version, 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] ?? '', 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","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\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","// Single source of the package version. test/version.test.ts keeps it equal\n// to package.json; bump both together.\nexport const VERSION = '0.4.0'\n","import { join } from 'node:path'\n\nimport { BLOCK_SIZE_WARNING, renderBlock } from '../core/block.ts'\nimport { assembleContext } from '../core/context.ts'\nimport { exists, isSymlink, readOrNull, writeFileAtomic } from '../core/fs.ts'\nimport { clone, isClean, pullFastForward } from '../core/git.ts'\nimport { loadManifest, resolveOrg } from '../core/manifest.ts'\nimport { ensureClaudeMd, mergeBlock } from '../core/merge.ts'\nimport type { Manifest } from '../core/types.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\nimport { VERSION } from '../version.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 /** Skip the confirmation prompt. */\n yes?: boolean\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\n// Excluded from the cleanliness check whatever their status: sync writes them itself. A\n// user's uncommitted edit to a tracked AGENTS.md is therefore not a veto — git pull\n// --ff-only still refuses to overwrite it and that surfaces as a problem.\nconst MANAGED_FILES = ['AGENTS.md', 'CLAUDE.md']\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\nasync function confirmOrExit(org: string): Promise<number | null> {\n if (!process.stdin.isTTY || !process.stdout.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 { confirm, isCancel } = await import('@clack/prompts')\n const answer = await confirm({\n message: `Sync workspace \\`${org}\\`: clone missing repositories and rewrite the rness blocks?`,\n })\n if (isCancel(answer) || answer !== true) {\n process.stderr.write('cancelled\\n')\n return 1\n }\n return null\n}\n\n/** `rness sync`: clone missing repositories, write every block (spec 0003 §4). Returns the exit code. */\nexport async function syncCommand(opts: SyncOptions): Promise<number> {\n const cwd = opts.cwd ?? process.cwd()\n const check = opts.check === true\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n const { org, warning } = resolveOrg(manifest, ws.root)\n if (warning !== null) process.stderr.write(`warning: ${warning}\\n`)\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 if (!check && opts.yes !== true) {\n const refused = await confirmOrExit(org)\n if (refused !== null) return refused\n }\n\n const lines: string[] = []\n const problems: string[] = []\n\n try {\n // 1. Repositories: clone what is missing; pull only on request, only clean trees.\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 (check) {\n lines.push(`missing ${label} (would clone ${repo.url})`)\n continue\n }\n try {\n await clone(repo.url, dir)\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 if (!(await isClean(dir, MANAGED_FILES))) {\n lines.push(`skipped ${label} (working tree not clean)`)\n continue\n }\n await pullFastForward(dir)\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 // 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 lines.push(`skipped ${t.label} (directory not present)`)\n continue\n }\n // One of the pair symlinked to the other (the common `CLAUDE.md →\n // AGENTS.md`) is left untouched: reading follows the link, and the\n // atomic rename would replace the link with a duplicate of its target.\n const linked = await Promise.all(\n MANAGED_FILES.map((f) => isSymlink(join(t.dir, f)))\n )\n if (linked.includes(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 version: VERSION,\n })\n if (block.bytes > BLOCK_SIZE_WARNING) {\n process.stderr.write(\n `warning: ${t.label}: block is ${Math.round(block.bytes / 1024)} KB (over 32 KB)\\n`\n )\n }\n const file = join(t.dir, 'AGENTS.md')\n const merged = mergeBlock(await readOrNull(file), block.text)\n if (!merged.ok) {\n problems.push(`${t.label}: ${merged.error}`)\n continue\n }\n if (!merged.changed) {\n lines.push(`unchanged ${t.label}`)\n if (!check) await ensureClaudeMd(t.dir)\n continue\n }\n if (check) {\n lines.push(`stale ${t.label}`)\n differences += 1\n continue\n }\n await writeFileAtomic(file, merged.text)\n await ensureClaudeMd(t.dir)\n lines.push(`updated ${t.label}`)\n }\n if (check && differences > 0)\n problems.push(`${differences} block(s) out of date — run rness sync`)\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) process.stdout.write(`${l}\\n`)\n for (const p of problems) process.stderr.write(`${p}\\n`)\n }\n } catch (e) {\n return reportError(e)\n }\n}\n","import { join } from 'node:path'\n\nimport { exists } from '../core/fs.ts'\nimport { loadManifest, parseRepoSpec, resolveOrg } from '../core/manifest.ts'\nimport { DEFAULT_HOST, SSH_HOST } from '../core/remote.ts'\nimport {\n type AddRepositoryResult,\n addRepository,\n workspaceDirs,\n} from '../core/repos.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 ssh?: boolean\n /** Internal: remote base (`https://github.com/`, `git@github.com:`, `file:///…/`). */\n host?: string\n yes?: boolean\n /** Internal (tests): directory to resolve from. */\n cwd?: string\n}\n\nfunction isTty(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\n/** One `declared scope …` line per scope of `result` not named in `already`. */\nfunction printDeclared(\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 process.stdout.write(`declared scope ${name} (${entry.path}${ext})\\n`)\n }\n}\n\n/** `rness add <repo>`: clone or adopt, declare, sync (spec 0003 §3). Returns the exit code. */\nexport async function addCommand(\n spec: string,\n opts: AddOptions\n): Promise<number> {\n const cwd = opts.cwd ?? process.cwd()\n const host = opts.host ?? (opts.ssh === true ? SSH_HOST : DEFAULT_HOST)\n try {\n const ws = await findWorkspace(cwd)\n const manifest = await loadManifest(ws.rnessDir)\n const { org, warning } = resolveOrg(manifest, ws.root)\n if (warning !== null) process.stderr.write(`warning: ${warning}\\n`)\n\n let parsed: { name: string; url: string }\n try {\n parsed = parseRepoSpec(spec, org, host)\n } catch (e) {\n process.stderr.write(`${e instanceof Error ? e.message : String(e)}\\n`)\n return 2\n }\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 (opts.yes !== true) {\n if (!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 const { confirm, isCancel } = await import('@clack/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 process.stderr.write('cancelled\\n')\n return 1\n }\n }\n\n let result = await addRepository({\n root: ws.root,\n rnessDir: ws.rnessDir,\n manifest,\n spec,\n org,\n host,\n scopes,\n })\n process.stdout.write(\n `${result.action === 'cloned' ? 'cloned ' : 'adopted '} org/${result.name}\\n`\n )\n const announced = new Set<string>()\n printDeclared(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 import('@clack/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 process.stderr.write('cancelled\\n')\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 })\n printDeclared(result, announced)\n }\n }\n }\n return syncCommand({ yes: true, cwd: ws.root })\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/**\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 { 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/** `<pm> install` in `dir`; output is swallowed, failure is one line. */\nexport async function installDependencies(\n pm: PackageManager,\n dir: string\n): Promise<void> {\n try {\n await execFileP(pm, ['install'], { cwd: dir, maxBuffer: 16 * 1024 * 1024 })\n } catch (e) {\n const err = e as { stderr?: string; message: string }\n throw new Error(\n `${pm} install failed in ${dir}: ${firstLine(err.stderr ?? err.message)}`,\n { cause: e }\n )\n }\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 '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\nconst TOKENISED = new Set(['package.json', '.github/workflows/validate.yml'])\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 const source = scaffoldDir()\n for (const rel of SCAFFOLD_FILES) {\n if (rel === 'rness.json') continue\n const from = join(source, ...rel.split('/'))\n const targetRel = rel === '_gitignore' ? '.gitignore' : rel\n const to = join(dest, ...targetRel.split('/'))\n await mkdir(dirname(to), { recursive: true })\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 await writeFile(to, content, 'utf8')\n const mode = (await stat(from)).mode & 0o777\n if (mode & 0o111) await chmod(to, mode)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { mkdir, readdir, rm } from 'node:fs/promises'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { promisify } from 'node:util'\n\nimport { readPinnedCli } from '../core/delegate.ts'\nimport { exists } from '../core/fs.ts'\nimport { clone, commitAll, init } from '../core/git.ts'\nimport { NAME, loadManifest, writeManifest } from '../core/manifest.ts'\nimport {\n PACKAGE_MANAGERS,\n type PackageManager,\n detectPackageManager,\n installDependencies,\n isPackageManager,\n packageManagerVersion,\n} from '../core/pm.ts'\nimport { DEFAULT_HOST, SSH_HOST, probeRemote, repoUrl } from '../core/remote.ts'\nimport { addRepository } from '../core/repos.ts'\nimport { copyScaffold } from '../core/scaffold-copy.ts'\nimport type { Manifest } from '../core/types.ts'\nimport { findWorkspace } from '../core/workspace.ts'\nimport { reportError } from '../report.ts'\nimport { VERSION } from '../version.ts'\nimport { syncCommand } from './sync.ts'\n\nconst execFileP = promisify(execFile)\n\nexport interface CreateOptions {\n dir?: string\n /** Comma-separated repositories to add right away (`<repo>` or `<owner>/<repo>`). */\n repos?: string\n pm?: string\n ssh?: boolean\n /** Internal: remote base. */\n host?: string\n yes?: boolean\n skipInstall?: boolean\n /** Reserved; rejected. */\n template?: string\n /** Internal (tests): directory to resolve from. */\n cwd?: string\n}\n\nfunction isTty(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nasync function isEmptyDir(dir: string): Promise<boolean> {\n return (await readdir(dir)).length === 0\n}\n\nasync function ghAvailable(): Promise<boolean> {\n try {\n await execFileP('gh', ['--version'])\n return true\n } catch {\n return false\n }\n}\n\nasync function insideWorkspace(dir: string): Promise<boolean> {\n try {\n await findWorkspace(dir)\n return true\n } catch {\n return false\n }\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\nfunction splitSpecs(list: string): string[] {\n return list\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s !== '')\n}\n\ninterface Failure {\n spec: string\n message: string\n}\n\n/**\n * Add each repository, in order. A failure is reported on one line and the\n * next entry 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 addRepositories(input: {\n root: string\n rnessDir: string\n manifest: Manifest\n org: string\n host: string\n specs: readonly string[]\n}): Promise<Failure[]> {\n let manifest = input.manifest\n const failures: Failure[] = []\n for (const spec of input.specs) {\n try {\n const result = await addRepository({\n root: input.root,\n rnessDir: input.rnessDir,\n manifest,\n spec,\n org: input.org,\n host: input.host,\n scopes: [],\n })\n manifest = result.manifest\n process.stdout.write(\n `${result.action === 'cloned' ? 'cloned ' : 'adopted '} org/${result.name}\\ndeclared scope ${result.name} (org/${result.name})\\n`\n )\n } catch (e) {\n const message = firstLine(e instanceof Error ? e.message : String(e))\n process.stderr.write(`${spec}: ${message}\\n`)\n failures.push({ spec, message })\n }\n }\n return failures\n}\n\n/** Run `sync --yes` through the copy installed in `.rness/` when there is one, else in place. */\nasync function syncPinned(root: string, shown: string): Promise<number> {\n const rnessDir = join(root, '.rness')\n const installed = await readPinnedCli(rnessDir)\n if (installed === null) return syncCommand({ yes: true, cwd: root })\n // Installed but unusable: the launcher's own code must never stand in for a\n // pinned copy (spec 0003 §2.2), so say what is missing and stop.\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 }\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\n/** `rness create <org>`: join the organisation's `.rness` or start a new one (spec 0003 §2.1). */\nexport async function createCommand(\n org: string,\n opts: CreateOptions\n): Promise<number> {\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 (!NAME.test(org)) {\n process.stderr.write(`organisation name \"${org}\" is not [a-z0-9-]\\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 pm: PackageManager =\n opts.pm !== undefined && isPackageManager(opts.pm)\n ? opts.pm\n : detectPackageManager()\n const host = opts.host ?? (opts.ssh === true ? SSH_HOST : DEFAULT_HOST)\n try {\n const root = resolve(cwd, opts.dir ?? org)\n const shown = relative(cwd, root) || '.'\n // Both ends of the operation: the directory create runs in, and the parent\n // of the target `--dir` points at. Either one inside a workspace would\n // nest a second `.rness` under the first.\n if (\n (await insideWorkspace(cwd)) ||\n (await insideWorkspace(dirname(root)))\n ) {\n process.stderr.write(\n 'already inside an rness workspace; create runs from outside one\\n'\n )\n return 1\n }\n if (await exists(root)) {\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\n // install that finishes the job instead of at `rness add`.\n if (!(await exists(join(root, '.rness', 'node_modules')))) {\n process.stderr.write(\n `${shown} holds an rness workspace whose dependencies are not installed; cd ${shown}/.rness && ${pm} install, then rness sync\\n`\n )\n return 1\n }\n process.stderr.write(\n `${shown} already holds an rness workspace (.rness/); run rness add inside it to add repositories\\n`\n )\n return 1\n }\n if (!(await isEmptyDir(root))) {\n process.stderr.write(`${shown} is not empty\\n`)\n return 1\n }\n }\n if (opts.yes !== true && !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 contextUrl = repoUrl(host, org, '.rness')\n const probe = await probeRemote(contextUrl)\n if (probe.kind === 'error') {\n process.stderr.write(`${probe.message}\\n`)\n return 1\n }\n const joining = probe.kind === 'found'\n\n if (opts.yes !== true) {\n const { confirm, isCancel } = await import('@clack/prompts')\n const message = joining\n ? `Join organisation \\`${org}\\`: clone ${contextUrl} into ${shown}/.rness and sync its repositories?`\n : `No ${contextUrl} found (or no access to it). Start a new workspace \\`${org}\\` in ${shown}/?`\n const ok = await confirm({ message })\n if (isCancel(ok) || ok !== true) {\n process.stderr.write('cancelled\\n')\n return 1\n }\n }\n\n const rnessDir = join(root, '.rness')\n\n if (joining) {\n await mkdir(root, { recursive: true })\n await clone(contextUrl, rnessDir)\n // Validates that the clone is a workspace context: throws on a\n // malformed or absent rness.json.\n const manifest = await loadManifest(rnessDir)\n process.stdout.write(`cloned ${shown}/.rness (joined ${org})\\n`)\n if (opts.skipInstall === true)\n process.stdout.write('skipped install (--skip-install)\\n')\n else {\n await installDependencies(pm, rnessDir)\n process.stdout.write(`installed dependencies with ${pm}\\n`)\n }\n await mkdir(join(root, 'org'), { recursive: true })\n // `--repos` only: the organisation's manifest is what a join follows, so\n // nothing is prompted for here. Each addition edits the cloned\n // `rness.json`, exactly as `rness add` would leave it.\n const failures = await addRepositories({\n root,\n rnessDir,\n manifest,\n org,\n host,\n specs: splitSpecs(opts.repos ?? ''),\n })\n const code = await syncPinned(root, shown)\n if (code !== 0) return code\n return failures.length > 0 ? 1 : 0\n }\n\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 const manifest: Manifest = { contract: 1, org, repos: {}, scopes: {} }\n // Phase 1 — creating the workspace itself. Only these steps are rolled\n // back: past them the workspace exists and is worth keeping, whatever a\n // repository does next.\n try {\n await copyScaffold(rnessDir, {\n version: VERSION,\n packageManager: `${pm}@${pmVersion}`,\n })\n await writeManifest(rnessDir, manifest)\n process.stdout.write(`created ${shown}/.rness (new workspace)\\n`)\n if (opts.skipInstall === true)\n process.stdout.write('skipped install (--skip-install)\\n')\n else {\n await installDependencies(pm, rnessDir)\n process.stdout.write(`installed dependencies with ${pm}\\n`)\n }\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\" — but\n // never the directory the command was run from (`--dir .`), whose\n // removal would pull the ground from under the user's shell. A failing\n // `rm` is swallowed rather than thrown, since it must never mask the\n // original error.\n reportError(e)\n await rm(rnessDir, { recursive: true, force: true }).catch(\n () => undefined\n )\n if (root !== resolve(cwd) && (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 1\n }\n\n // Phase 2 — the repositories. Nothing here is rolled back.\n await mkdir(join(root, 'org'), { recursive: true })\n let specs = splitSpecs(opts.repos ?? '')\n if (opts.repos === undefined && opts.yes !== true) {\n const { isCancel, text } = await import('@clack/prompts')\n const answer = await text({\n message:\n 'Repositories to add now (owner/repo, comma-separated; empty for none)',\n defaultValue: '',\n })\n if (isCancel(answer)) {\n process.stderr.write('cancelled\\n')\n return 1\n }\n // `isCancel` narrows only the unique cancel symbol, not the broader\n // `symbol` half of `text()`'s `string | symbol` return type, so a\n // `typeof` check is what narrows the rest.\n if (typeof answer === 'string') specs = splitSpecs(answer)\n }\n const failures = await addRepositories({\n root,\n rnessDir,\n manifest,\n org,\n host,\n specs,\n })\n\n await init(rnessDir)\n try {\n await commitAll(rnessDir, 'chore: rness workspace context')\n process.stdout.write(`committed ${shown}/.rness\\n`)\n } catch (e) {\n process.stderr.write(\n `warning: ${e instanceof Error ? e.message : String(e)} — commit ${shown}/.rness yourself\\n`\n )\n }\n\n const code = await syncPinned(root, shown)\n if (code !== 0) return code\n\n const gh = await ghAvailable()\n process.stdout.write(\n [\n '',\n `Workspace \\`${org}\\` is ready in ${shown}/.`,\n '',\n '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(\n (f) => ` rness add ${f.spec} # failed: ${f.message}`\n ),\n gh\n ? ` gh repo create ${org}/.rness --private --source . --push`\n : ` git remote add origin ${contextUrl} && git push -u origin main`,\n ` # then, for every teammate: npm create rness ${org}`,\n '',\n ].join('\\n')\n )\n return failures.length > 0 ? 1 : 0\n } catch (e) {\n return reportError(e)\n }\n}\n","import { join } from 'node:path'\n\nimport { VERSION } from '../version.ts'\nimport { blockHash, bodyOf, parseHeader, renderBlock } from './block.ts'\nimport { assembleContext } from './context.ts'\nimport { exists, readOrNull } from './fs.ts'\nimport { findBlock } from './merge.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\nexport interface CheckBlocksResult {\n problems: string[]\n warnings: string[]\n}\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 problems: string[] = []\n const warnings: string[] = []\n if (!(await exists(join(root, 'org')))) return { problems, warnings }\n\n const targets: Array<{\n scope: string | null\n dir: string\n depth: number\n label: string\n }> = [{ scope: null, dir: root, depth: 0, label: 'AGENTS.md' }]\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 label: `${entry.path}/AGENTS.md`,\n })\n }\n\n for (const t of targets) {\n if (!(await exists(t.dir))) {\n warnings.push(`${t.label}: directory not present, block not checked`)\n continue\n }\n const text = await readOrNull(join(t.dir, 'AGENTS.md'))\n const lines = text === null ? [] : text.split(/\\r?\\n/)\n const found = findBlock(lines)\n if (found.kind === 'none') {\n warnings.push(`${t.label}: no rness block yet (run rness sync)`)\n continue\n }\n if (found.kind === 'error') {\n problems.push(`${t.label}: ${found.message}`)\n continue\n }\n const header = parseHeader(lines[found.begin + 1] ?? '')\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 version: VERSION,\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 actual = blockHash(bodyOf(lines.slice(found.begin, found.end + 1)))\n if (\n header === null ||\n header.hash !== fresh.hash ||\n header.hash !== actual\n ) {\n problems.push(`${t.label}: stale rness block (run rness sync)`)\n }\n }\n return { problems, warnings }\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 { checkBlocks } from '../core/blocks.ts'\nimport { checkContract } from '../core/contract.ts'\nimport { loadManifest, resolveOrg } from '../core/manifest.ts'\nimport { scopeChain } from '../core/scope.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/** `rness validate`: manifest, extends cycles, front-matter contract, stale blocks. Returns the exit code. */\nexport async function validateCommand(opts: ValidateOptions): 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 // 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 { org, warning } = resolveOrg(manifest, ws.root)\n const warnings: string[] = warning === null ? [] : [warning]\n const problems = await checkContract(ws.rnessDir)\n const blocks = await checkBlocks({\n root: ws.root,\n rnessDir: ws.rnessDir,\n manifest,\n org,\n })\n problems.push(...blocks.problems)\n warnings.push(...blocks.warnings)\n for (const p of problems) process.stderr.write(`${p}\\n`)\n for (const w of warnings) process.stderr.write(`warning: ${w}\\n`)\n if (problems.length > 0) return 1\n process.stdout.write('context ok\\n')\n return 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 { type SyncOptions, syncCommand } from './commands/sync.ts'\nimport { type ValidateOptions, validateCommand } from './commands/validate.ts'\nimport { PACKAGE_MANAGERS } from './core/pm.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 })\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('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 'Clone missing repositories and write the rness block into every AGENTS.md'\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('-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('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('--ssh', 'use git@github.com: instead of 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('create')\n .description(\n 'Start a workspace for a GitHub organisation, or join its existing .rness'\n )\n .argument('<org>', 'the GitHub organisation (github.com/<org>)')\n .option('--dir <path>', 'target directory (default: ./<org>)')\n .option('--repos <list>', 'comma-separated repositories to add right away')\n .option(\n '--pm <name>',\n `package manager for .rness/ (${PACKAGE_MANAGERS.join(', ')}; default: the one running this command)`\n )\n .option('--ssh', 'use git@github.com: instead of https://github.com/')\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('--cwd <dir>').hideHelp())\n .action(async (org: string, opts: CreateOptions) => {\n state.code = await createCommand(org, opts)\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(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"],"mappings":"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","names":["dirname","resolve","readFile","basename","join","basename","readFile","join","readFile","rm","join","join","rm","readFile","dirname","join","resolve","resolve","dirname","join","parse","fail","glob","readFile","join","posix","sep","sep","posix","glob","join","readFile","join","join","join","join","join","join","join","join","posix","sep","sep","posix","readFile","join","join","readFile","execFile","promisify","execFileP","firstLine","dirname","join","readFile","writeFile","dirname","join","join","dirname","readFile","writeFile","execFile","mkdir","rm","dirname","join","relative","resolve","promisify","execFileP","promisify","execFile","isTty","firstLine","join","resolve","relative","dirname","mkdir","manifest","failures","code","rm","join","join","header","join","join"]}
|