@rness/cli 0.2.0 → 0.3.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 +18 -5
- package/dist/bin/rness.js +5 -1
- package/dist/bin/rness.js.map +1 -1
- package/dist/chunk-4KNZT4G4.js +791 -0
- package/dist/chunk-4KNZT4G4.js.map +1 -0
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/scaffold/CONVENTIONS.md +4 -2
- package/dist/chunk-6ASX7VBO.js +0 -402
- package/dist/chunk-6ASX7VBO.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @rness/cli
|
|
2
2
|
|
|
3
3
|
The `rness` command: configuration-plane CLI for rness workspaces. It
|
|
4
|
-
resolves, validates and
|
|
5
|
-
|
|
4
|
+
resolves, validates and syncs an organisation's context for AI coding agents.
|
|
5
|
+
Not an agent — no LLM loop.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -14,11 +14,24 @@ Inside a workspace, every `rness` delegates to the copy pinned in
|
|
|
14
14
|
|
|
15
15
|
## Commands
|
|
16
16
|
|
|
17
|
-
rness context [--scope <name>] [--json]
|
|
18
|
-
rness validate
|
|
17
|
+
rness context [--scope <name>] [--json] Resolve the context for a scope
|
|
18
|
+
rness validate Check .rness/ and every generated block
|
|
19
|
+
rness sync [--scope <name>] [--check] [--pull] -y Clone repositories, write the blocks
|
|
19
20
|
|
|
20
21
|
Exit codes: 0 success, 1 handled error, 2 bad usage. `RNESS_DEBUG=1` adds
|
|
21
|
-
stack traces; `RNESS_NO_DELEGATE=1` skips the delegation.
|
|
22
|
+
stack traces; `RNESS_NO_DELEGATE=1` skips the delegation. `sync` asks for
|
|
23
|
+
confirmation in a terminal; pass `-y`/`--yes` in scripts. `--check` writes
|
|
24
|
+
nothing and exits 1 when a block is out of date — use it in CI.
|
|
25
|
+
|
|
26
|
+
## 0.3.0 — what changed for a 0.2.0 workspace
|
|
27
|
+
|
|
28
|
+
- The directory decides a file's scope. `scopes: […]` and `scope: global`
|
|
29
|
+
front-matter keys no longer route anything; `rness validate` reports them.
|
|
30
|
+
Move the file instead (`standards/<scope>/…` or the collection root).
|
|
31
|
+
- `rness.json` may declare `"org": "<github-org>"`; without it the
|
|
32
|
+
workspace directory name is used and `validate` warns.
|
|
33
|
+
- `validate` now checks every generated block: a stale block is an error,
|
|
34
|
+
a missing one a warning — run `rness sync`.
|
|
22
35
|
|
|
23
36
|
## Develop
|
|
24
37
|
|
package/dist/bin/rness.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
findWorkspace,
|
|
5
5
|
reportError,
|
|
6
6
|
run
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-4KNZT4G4.js";
|
|
8
8
|
|
|
9
9
|
// src/bin/rness.ts
|
|
10
10
|
import { pathToFileURL } from "url";
|
|
@@ -59,6 +59,10 @@ async function main() {
|
|
|
59
59
|
const delegate = skipDelegation ? null : await findDelegate(process.cwd(), VERSION);
|
|
60
60
|
if (delegate !== null) {
|
|
61
61
|
const broken = (reason) => new Error(`@rness/cli ${delegate.version} pinned in ${delegate.root}/.rness is not installed correctly (${reason}); reinstall in .rness/`);
|
|
62
|
+
if (process.env["RNESS_DEBUG"] === "1") {
|
|
63
|
+
process.stderr.write(`rness: delegating to @rness/cli ${delegate.version} (${delegate.entry})
|
|
64
|
+
`);
|
|
65
|
+
}
|
|
62
66
|
let mod;
|
|
63
67
|
try {
|
|
64
68
|
mod = await import(pathToFileURL(delegate.entry).href);
|
package/dist/bin/rness.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/rness.ts","../../src/core/delegate.ts","../../src/core/node-version.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { pathToFileURL } from 'node:url'\nimport { run } from '../cli.ts'\nimport { VERSION } from '../version.ts'\nimport { findDelegate } from '../core/delegate.ts'\nimport { isSupportedNode, MIN_NODE_MAJOR } from '../core/node-version.ts'\nimport { reportError } from '../report.ts'\n\n// `rness context | head`: once the reader has its lines it closes the pipe and\n// every further write emits EPIPE on stdout. Nothing is left to deliver, so end\n// quietly with success. This is the one process.exit() in the code base — it\n// runs only when there is no output left to drain (see main() below).\nprocess.stdout.on('error', (e: NodeJS.ErrnoException) => {\n if (e.code === 'EPIPE') process.exit(0)\n throw e\n})\n\n// Set process.exitCode rather than calling process.exit(): process.exit()\n// terminates before Node drains an async stdout pipe, truncating piped output\n// at the ~64 KiB pipe buffer (breaks `rness context --json | jq`, `$(...)`).\nasync function main(): Promise<number> {\n if (!isSupportedNode(process.versions.node)) {\n process.stderr.write(`rness needs Node ${MIN_NODE_MAJOR} or newer (running ${process.version})\\n`)\n return 1\n }\n const argv = process.argv.slice(2)\n const skipDelegation = argv[0] === 'create' || process.env['RNESS_NO_DELEGATE'] === '1'\n const delegate = skipDelegation ? null : await findDelegate(process.cwd(), VERSION)\n if (delegate !== null) {\n const broken = (reason: string): Error =>\n new Error(`@rness/cli ${delegate.version} pinned in ${delegate.root}/.rness is not installed correctly (${reason}); reinstall in .rness/`)\n let mod: Record<string, unknown>\n try {\n mod = (await import(pathToFileURL(delegate.entry).href)) as Record<string, unknown>\n } catch (e) {\n throw broken(e instanceof Error ? e.message : String(e))\n }\n if (typeof mod['run'] !== 'function') throw broken('dist/index.js does not export run')\n const delegateRun = mod['run'] as (argv: string[]) => Promise<unknown>\n const code = await delegateRun(argv)\n return typeof code === 'number' ? code : 1\n }\n return run(argv)\n}\n\nmain()\n .then((code) => {\n process.exitCode = code\n })\n .catch((e: unknown) => {\n process.exitCode = reportError(e)\n })\n","import { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\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\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(cwd: string, ownVersion: string): 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 pkgDir = join(rnessDir, 'node_modules', '@rness', 'cli')\n let version: unknown\n try {\n version = (JSON.parse(await readFile(join(pkgDir, 'package.json'), 'utf8')) as { version?: unknown }).version\n } catch {\n return null\n }\n if (typeof version !== 'string' || version === ownVersion) return null\n return { entry: join(pkgDir, 'dist', 'index.js'), version, root }\n}\n","export const MIN_NODE_MAJOR = 24\n\nexport function nodeMajor(version: string): number {\n const major = Number.parseInt(version.split('.')[0] ?? '', 10)\n return Number.isNaN(major) ? 0 : major\n}\n\nexport function isSupportedNode(version: string): boolean {\n return nodeMajor(version) >= MIN_NODE_MAJOR\n}\n"],"mappings":";;;;;;;;;AACA,SAAS,qBAAqB;;;ACD9B,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAgBrB,eAAsB,aAAa,KAAa,YAA8C;AAC5F,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,cAAc,GAAG;AAClC,WAAO,GAAG;AACV,eAAW,GAAG;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,UAAU,gBAAgB,UAAU,KAAK;AAC7D,MAAI;AACJ,MAAI;AACF,cAAW,KAAK,MAAM,MAAM,SAAS,KAAK,QAAQ,cAAc,GAAG,MAAM,CAAC,EAA4B;AAAA,EACxG,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,WAAY,QAAO;AAClE,SAAO,EAAE,OAAO,KAAK,QAAQ,QAAQ,UAAU,GAAG,SAAS,KAAK;AAClE;;;ACpCO,IAAM,iBAAiB;AAEvB,SAAS,UAAU,SAAyB;AACjD,QAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;AAC7D,SAAO,OAAO,MAAM,KAAK,IAAI,IAAI;AACnC;AAEO,SAAS,gBAAgB,SAA0B;AACxD,SAAO,UAAU,OAAO,KAAK;AAC/B;;;AFGA,QAAQ,OAAO,GAAG,SAAS,CAAC,MAA6B;AACvD,MAAI,EAAE,SAAS,QAAS,SAAQ,KAAK,CAAC;AACtC,QAAM;AACR,CAAC;AAKD,eAAe,OAAwB;AACrC,MAAI,CAAC,gBAAgB,QAAQ,SAAS,IAAI,GAAG;AAC3C,YAAQ,OAAO,MAAM,oBAAoB,cAAc,sBAAsB,QAAQ,OAAO;AAAA,CAAK;AACjG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,iBAAiB,KAAK,CAAC,MAAM,YAAY,QAAQ,IAAI,mBAAmB,MAAM;AACpF,QAAM,WAAW,iBAAiB,OAAO,MAAM,aAAa,QAAQ,IAAI,GAAG,OAAO;AAClF,MAAI,aAAa,MAAM;AACrB,UAAM,SAAS,CAAC,WACd,IAAI,MAAM,cAAc,SAAS,OAAO,cAAc,SAAS,IAAI,uCAAuC,MAAM,yBAAyB;AAC3I,QAAI;AACJ,QAAI;AACF,YAAO,MAAM,OAAO,cAAc,SAAS,KAAK,EAAE;AAAA,IACpD,SAAS,GAAG;AACV,YAAM,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACzD;AACA,QAAI,OAAO,IAAI,KAAK,MAAM,WAAY,OAAM,OAAO,mCAAmC;AACtF,UAAM,cAAc,IAAI,KAAK;AAC7B,UAAM,OAAO,MAAM,YAAY,IAAI;AACnC,WAAO,OAAO,SAAS,WAAW,OAAO;AAAA,EAC3C;AACA,SAAO,IAAI,IAAI;AACjB;AAEA,KAAK,EACF,KAAK,CAAC,SAAS;AACd,UAAQ,WAAW;AACrB,CAAC,EACA,MAAM,CAAC,MAAe;AACrB,UAAQ,WAAW,YAAY,CAAC;AAClC,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/rness.ts","../../src/core/delegate.ts","../../src/core/node-version.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { pathToFileURL } from 'node:url'\nimport { run } from '../cli.ts'\nimport { VERSION } from '../version.ts'\nimport { findDelegate } from '../core/delegate.ts'\nimport { isSupportedNode, MIN_NODE_MAJOR } from '../core/node-version.ts'\nimport { reportError } from '../report.ts'\n\n// `rness context | head`: once the reader has its lines it closes the pipe and\n// every further write emits EPIPE on stdout. Nothing is left to deliver, so end\n// quietly with success. This is the one process.exit() in the code base — it\n// runs only when there is no output left to drain (see main() below).\nprocess.stdout.on('error', (e: NodeJS.ErrnoException) => {\n if (e.code === 'EPIPE') process.exit(0)\n throw e\n})\n\n// Set process.exitCode rather than calling process.exit(): process.exit()\n// terminates before Node drains an async stdout pipe, truncating piped output\n// at the ~64 KiB pipe buffer (breaks `rness context --json | jq`, `$(...)`).\nasync function main(): Promise<number> {\n if (!isSupportedNode(process.versions.node)) {\n process.stderr.write(`rness needs Node ${MIN_NODE_MAJOR} or newer (running ${process.version})\\n`)\n return 1\n }\n const argv = process.argv.slice(2)\n const skipDelegation = argv[0] === 'create' || process.env['RNESS_NO_DELEGATE'] === '1'\n const delegate = skipDelegation ? null : await findDelegate(process.cwd(), VERSION)\n if (delegate !== null) {\n const broken = (reason: string): Error =>\n new Error(`@rness/cli ${delegate.version} pinned in ${delegate.root}/.rness is not installed correctly (${reason}); reinstall in .rness/`)\n if (process.env['RNESS_DEBUG'] === '1') {\n process.stderr.write(`rness: delegating to @rness/cli ${delegate.version} (${delegate.entry})\\n`)\n }\n let mod: Record<string, unknown>\n try {\n mod = (await import(pathToFileURL(delegate.entry).href)) as Record<string, unknown>\n } catch (e) {\n throw broken(e instanceof Error ? e.message : String(e))\n }\n if (typeof mod['run'] !== 'function') throw broken('dist/index.js does not export run')\n const delegateRun = mod['run'] as (argv: string[]) => Promise<unknown>\n const code = await delegateRun(argv)\n return typeof code === 'number' ? code : 1\n }\n return run(argv)\n}\n\nmain()\n .then((code) => {\n process.exitCode = code\n })\n .catch((e: unknown) => {\n process.exitCode = reportError(e)\n })\n","import { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\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\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(cwd: string, ownVersion: string): 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 pkgDir = join(rnessDir, 'node_modules', '@rness', 'cli')\n let version: unknown\n try {\n version = (JSON.parse(await readFile(join(pkgDir, 'package.json'), 'utf8')) as { version?: unknown }).version\n } catch {\n return null\n }\n if (typeof version !== 'string' || version === ownVersion) return null\n return { entry: join(pkgDir, 'dist', 'index.js'), version, root }\n}\n","export const MIN_NODE_MAJOR = 24\n\nexport function nodeMajor(version: string): number {\n const major = Number.parseInt(version.split('.')[0] ?? '', 10)\n return Number.isNaN(major) ? 0 : major\n}\n\nexport function isSupportedNode(version: string): boolean {\n return nodeMajor(version) >= MIN_NODE_MAJOR\n}\n"],"mappings":";;;;;;;;;AACA,SAAS,qBAAqB;;;ACD9B,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAgBrB,eAAsB,aAAa,KAAa,YAA8C;AAC5F,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,cAAc,GAAG;AAClC,WAAO,GAAG;AACV,eAAW,GAAG;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,UAAU,gBAAgB,UAAU,KAAK;AAC7D,MAAI;AACJ,MAAI;AACF,cAAW,KAAK,MAAM,MAAM,SAAS,KAAK,QAAQ,cAAc,GAAG,MAAM,CAAC,EAA4B;AAAA,EACxG,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,WAAY,QAAO;AAClE,SAAO,EAAE,OAAO,KAAK,QAAQ,QAAQ,UAAU,GAAG,SAAS,KAAK;AAClE;;;ACpCO,IAAM,iBAAiB;AAEvB,SAAS,UAAU,SAAyB;AACjD,QAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;AAC7D,SAAO,OAAO,MAAM,KAAK,IAAI,IAAI;AACnC;AAEO,SAAS,gBAAgB,SAA0B;AACxD,SAAO,UAAU,OAAO,KAAK;AAC/B;;;AFGA,QAAQ,OAAO,GAAG,SAAS,CAAC,MAA6B;AACvD,MAAI,EAAE,SAAS,QAAS,SAAQ,KAAK,CAAC;AACtC,QAAM;AACR,CAAC;AAKD,eAAe,OAAwB;AACrC,MAAI,CAAC,gBAAgB,QAAQ,SAAS,IAAI,GAAG;AAC3C,YAAQ,OAAO,MAAM,oBAAoB,cAAc,sBAAsB,QAAQ,OAAO;AAAA,CAAK;AACjG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,iBAAiB,KAAK,CAAC,MAAM,YAAY,QAAQ,IAAI,mBAAmB,MAAM;AACpF,QAAM,WAAW,iBAAiB,OAAO,MAAM,aAAa,QAAQ,IAAI,GAAG,OAAO;AAClF,MAAI,aAAa,MAAM;AACrB,UAAM,SAAS,CAAC,WACd,IAAI,MAAM,cAAc,SAAS,OAAO,cAAc,SAAS,IAAI,uCAAuC,MAAM,yBAAyB;AAC3I,QAAI,QAAQ,IAAI,aAAa,MAAM,KAAK;AACtC,cAAQ,OAAO,MAAM,mCAAmC,SAAS,OAAO,KAAK,SAAS,KAAK;AAAA,CAAK;AAAA,IAClG;AACA,QAAI;AACJ,QAAI;AACF,YAAO,MAAM,OAAO,cAAc,SAAS,KAAK,EAAE;AAAA,IACpD,SAAS,GAAG;AACV,YAAM,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACzD;AACA,QAAI,OAAO,IAAI,KAAK,MAAM,WAAY,OAAM,OAAO,mCAAmC;AACtF,UAAM,cAAc,IAAI,KAAK;AAC7B,UAAM,OAAO,MAAM,YAAY,IAAI;AACnC,WAAO,OAAO,SAAS,WAAW,OAAO;AAAA,EAC3C;AACA,SAAO,IAAI,IAAI;AACjB;AAEA,KAAK,EACF,KAAK,CAAC,SAAS;AACd,UAAQ,WAAW;AACrB,CAAC,EACA,MAAM,CAAC,MAAe;AACrB,UAAQ,WAAW,YAAY,CAAC;AAClC,CAAC;","names":[]}
|