@rindle/cli 0.5.0 → 0.6.3

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 CHANGED
@@ -1,26 +1,32 @@
1
1
  # @rindle/cli — the Rindle toolchain, prebuilt for npm
2
2
 
3
- The Rindle **CLI** (`rindle`) and **daemon** (`rindled`), shipped as prebuilt, per-platform binaries
4
- you can `npm install`. This is how a JS/TS developer runs Rindle locally:
5
-
6
- - **`rindled`** — the production Rindle server: the `rindle-server` crate (the SQLite-backed
7
- [`rindle-replica`](../../rindle-replica) live-query engine plus the public subscription/lease
8
- plane).
9
- - **`rindle`** the CLI to inspect, run, and manage a daemon: `rindle status` / `migrate` /
10
- `schema`, plus the local-dev pair **`rindle init`** (scaffold) and **`rindle up`**
11
- (run-and-supervise a local `rindled`, respawning it on crash or migrate-restart).
3
+ The Rindle CLI and local fleet components ship as prebuilt, per-platform binaries you can
4
+ `npm install`. This is how a JS/TS developer runs Rindle locally:
5
+
6
+ - **`rindled`** — the Rindle **read-follower** server: the `rindle-server` crate (the
7
+ SQLite-backed [`rindle-replica`](../../rindle-replica) live-query engine plus the public
8
+ subscription/lease plane). It tails a `rindle-replicator` write-master and has no write
9
+ ingress of its own.
10
+ - **`rindle`** the CLI to inspect, run, and manage the data tier: `rindle status` / `migrate` /
11
+ `schema`, plus the local-dev pair **`rindle init`** (scaffold `rindle.ncl`) and **`rindle up`**
12
+ (render it and run-and-supervise the local write-master + follower pair, respawning on crash or
13
+ migrate-restart).
14
+ - **`rindle-dev-edge`** — the development-only stable HTTP/WebSocket fleet endpoint. `rindle up`
15
+ supervises it automatically; applications never install or launch it directly.
12
16
 
13
17
  This is the network counterpart of [`@rindle/replica`](../replica): both run the same
14
18
  `rindle-replica` engine, but `@rindle/replica` is a napi addon that embeds it **in-process**,
15
- whereas `rindled` is the standalone daemon **executable** that serves many clients over the wire.
16
- Talk to a running daemon from JS with [`@rindle/daemon-client`](../daemon-client).
19
+ whereas `rindled` is the daemon **executable** (a read-follower) that serves many clients over
20
+ the wire. Talk to a running daemon from JS with [`@rindle/daemon-client`](../daemon-client).
17
21
 
18
22
  ```sh
19
23
  npm i -D @rindle/cli
20
- npx rindle init # scaffold daemon.json + migrations/
24
+ npx rindle init # scaffold rindle.ncl (the colocated pair) + migrations/
21
25
  npx rindle up --migrate --gen shared/schema.gen.ts --watch
22
- # start + supervise rindled, apply migrations, regenerate the typed schema,
23
- # and re-run apply/gen whenever migrations/ changes
26
+ # render rindle.ncl + supervise the write-master + follower, apply migrations to the master,
27
+ # regenerate the typed schema from the follower, and re-run apply/gen whenever migrations/ changes
28
+ npx rindle exec -- vite dev
29
+ # launch the app with stable read/write/ws bindings derived from rindle.ncl
24
30
  ```
25
31
 
26
32
  Installing pulls in exactly one prebuilt-binary package for your platform via
@@ -36,14 +42,14 @@ Full docs — the command reference, flags & env vars, the local dev loop, and r
36
42
 
37
43
  ## Embedding the daemon in your own supervisor
38
44
 
39
- `rindled` is **not** exposed as a CLI command here — `rindle up` is the way to run a local daemon.
40
- The binary still ships (co-located with `rindle`), so for embedding it in your own Node supervisor
41
- there are programmatic helpers:
45
+ `rindled` is **not** exposed as a CLI command here — `rindle up` is the way to run the local pair.
46
+ The binary still ships (co-located with `rindle`), so for embedding a follower in your own Node
47
+ supervisor there are programmatic helpers:
42
48
 
43
49
  ```ts
44
50
  import { spawnRindled, rindledBinaryPath } from "@rindle/cli";
45
51
 
46
- const child = spawnRindled(["--config", "./daemon.json"]); // inherits stdio
52
+ const child = spawnRindled(["--config", "./follower.json"]); // inherits stdio
47
53
  // …or just locate the binary and manage the process yourself:
48
54
  const bin = rindledBinaryPath();
49
55
  ```
@@ -57,29 +63,29 @@ const bin = rindledBinaryPath();
57
63
  (`dist/cli.js`) resolves the matching `rindle` binary for the host and execs it, forwarding
58
64
  argv/stdio and the exit code.
59
65
  - **`@rindle/cli-<key>`** — one package per target (`darwin-arm64`, `darwin-x64`, `linux-x64-gnu`,
60
- `linux-arm64-gnu`, `linux-x64-musl`, `linux-arm64-musl`, `win32-x64-msvc`), each carrying **both**
61
- `rindle` and `rindled` for that platform under `bin/`,
66
+ `linux-arm64-gnu`, `linux-x64-musl`, `linux-arm64-musl`, `win32-x64-msvc`), each carrying
67
+ `rindle`, `rindled`, `rindle-replicator`, and `rindle-dev-edge` for that platform under `bin/`,
62
68
  gated by `os`/`cpu`/`libc`. They're listed as `optionalDependencies` of this package, so the
63
69
  installer fetches only the matching one. They are **generated at release time** (like the napi
64
70
  platform packages for `@rindle/replica`), never committed.
65
71
 
66
- Both binaries ship **co-located** on purpose: even though only `rindle` is a bin, `rindle up` runs
67
- `rindled` by finding it as a sibling of its own executable (rindle-cli §7.1), so the two must live in
68
- the same `bin/` directory.
72
+ All four binaries ship **co-located** on purpose: even though only `rindle` is an npm bin,
73
+ `rindle up` finds every supervised component beside its own executable.
69
74
 
70
75
  Resolution order at runtime (`src/index.ts`):
71
76
 
72
- 1. `RINDLE_BINARY_PATH` / `RINDLED_BINARY_PATH` explicit path to that one binary.
73
- 2. `RINDLE_BIN_DIR` — a directory holding both (see dev usage below).
77
+ 1. The binary-specific `*_BINARY_PATH` override (`RINDLE_BINARY_PATH`, `RINDLED_BINARY_PATH`,
78
+ `RINDLE_REPLICATOR_BINARY_PATH`, or `RINDLE_DEV_EDGE_BINARY_PATH`).
79
+ 2. `RINDLE_BIN_DIR` — a directory holding the native toolchain (see dev usage below).
74
80
  3. the installed `@rindle/cli-<key>` optional dependency.
75
81
 
76
82
  ## Local development (in this monorepo)
77
83
 
78
84
  No platform packages are installed in the workspace, so build the binaries and point the launcher at
79
- the build directory — one env var lights up both (and keeps them co-located for `rindle up`):
85
+ the build directory — one env var lights up the whole fleet:
80
86
 
81
87
  ```sh
82
- cargo build -p rindle-cli -p rindle-server --bin rindle --bin rindled --release
88
+ cargo build -p rindle-cli -p rindle-server -p rindle-replicator -p rindle-dev-edge --bins --release
83
89
  RINDLE_BIN_DIR="$PWD/target/release" npx rindle up # finds rindled in the same dir
84
90
  RINDLE_BIN_DIR="$PWD/target/release" npx rindle status
85
91
  ```
@@ -89,9 +95,8 @@ RINDLE_BIN_DIR="$PWD/target/release" npx rindle status
89
95
 
90
96
  ## Releasing
91
97
 
92
- The native binaries already come from dist (cargo-dist): `rindle-cli` and `rindle-server` are both
93
- `[package.metadata.dist] dist = true`, so dist builds `rindle` and `rindled` for all four targets
94
- and uploads the archives + `dist-manifest.json` to a GitHub release.
98
+ The native binaries come from dist (cargo-dist): all four binary crates opt into dist, which uploads
99
+ their archives plus `dist-manifest.json` to a GitHub release.
95
100
  `scripts/build-npm-packages.mjs` is the bridge from those artifacts to npm:
96
101
 
97
102
  ```sh
package/dist/index.d.ts CHANGED
@@ -3,13 +3,12 @@ import { type Binary } from "./platform.ts";
3
3
  export { binaryName, platformKey, platformPackageName, UnsupportedPlatformError, } from "./platform.ts";
4
4
  export type { Binary, Libc } from "./platform.ts";
5
5
  /**
6
- * Absolute path to a Rindle binary (`"rindle"` or `"rindled"`) for the current platform.
6
+ * Absolute path to a native Rindle toolchain binary for the current platform.
7
7
  *
8
- * Resolution order (the first three are dev overrides for working in this monorepo):
9
- * 1. `RINDLE_BINARY_PATH` / `RINDLED_BINARY_PATH` — an explicit path to that one binary.
10
- * 2. `RINDLE_BIN_DIR` — a directory holding both binaries. Point it at `target/release` after
11
- * `cargo build -p rindle-cli -p rindle-server --release` and a single env var lights up both
12
- * (and keeps them co-located, so `rindle up` still finds `rindled` as a sibling).
8
+ * Resolution order:
9
+ * 1. The binary's explicit `*_BINARY_PATH` override.
10
+ * 2. `RINDLE_BIN_DIR` — a directory holding the co-located toolchain. Point it at
11
+ * `target/release` after building the four binary crates and one env var lights up the fleet.
13
12
  * 3. The matching `@rindle/cli-<key>` optional dependency that npm/pnpm installed.
14
13
  *
15
14
  * Throws `UnsupportedPlatformError` for an un-targeted host, or a descriptive Error if the
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKjF,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIlD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA8B9C;AAED,iGAAiG;AACjG,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,uGAAuG;AACvG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY,CAEtG;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY,CAEzF;AAED,8GAA8G;AAC9G,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY,CAE1F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKjF,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIlD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoC9C;AAED,iGAAiG;AACjG,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,uGAAuG;AACvG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY,CAEtG;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY,CAEzF;AAED,8GAA8G;AAC9G,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY,CAE1F"}
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
- // @rindle/cli — the Rindle toolchain (`rindle` CLI + `rindled` daemon) as prebuilt npm binaries.
1
+ // @rindle/cli — the Rindle CLI and supervised local-fleet components as prebuilt npm binaries.
2
2
  //
3
3
  // `rindled` is the *network front* of the engine: the `rindle-server` crate — the SQLite-backed
4
4
  // `rindle-replica` live-query engine plus the public subscription/lease plane. `rindle` is the CLI
5
5
  // that inspects and manages a deployed daemon (`rindle status`/`migrate`/…) and, for local dev,
6
6
  // scaffolds and supervises one (`rindle init` / `rindle up`). Where `@rindle/replica` is a napi
7
7
  // addon that embeds the engine *in-process*, this package ships the standalone executables,
8
- // prebuilt per platform by dist (cargo-dist), **co-located** so `rindle up` finds `rindled` beside
9
- // it. This module resolves the right binary for the host; the `rindle` bin (dist/cli.js) execs the
10
- // CLI, and the daemon runs via `rindle up` or `spawnRindled()` (it is not exposed as its own bin —
11
- // this package is a dev convenience). Pair with `@rindle/daemon-client` to talk to a running daemon.
8
+ // prebuilt per platform by dist (cargo-dist), **co-located** so `rindle up` finds every component
9
+ // beside it. This module resolves the right binary for the host; the `rindle` bin (dist/cli.js)
10
+ // execs the CLI, and the daemon runs via `rindle up` or `spawnRindled()` (it is not exposed as its
11
+ // own bin — this package is a dev convenience). Pair with `@rindle/daemon-client` to talk to a
12
+ // running daemon.
12
13
  import { spawn } from "node:child_process";
13
14
  import { existsSync } from "node:fs";
14
15
  import { createRequire } from "node:module";
@@ -17,13 +18,12 @@ import { binaryName, platformKey, platformPackageName, UnsupportedPlatformError,
17
18
  export { binaryName, platformKey, platformPackageName, UnsupportedPlatformError, } from "./platform.js";
18
19
  const require = createRequire(import.meta.url);
19
20
  /**
20
- * Absolute path to a Rindle binary (`"rindle"` or `"rindled"`) for the current platform.
21
+ * Absolute path to a native Rindle toolchain binary for the current platform.
21
22
  *
22
- * Resolution order (the first three are dev overrides for working in this monorepo):
23
- * 1. `RINDLE_BINARY_PATH` / `RINDLED_BINARY_PATH` — an explicit path to that one binary.
24
- * 2. `RINDLE_BIN_DIR` — a directory holding both binaries. Point it at `target/release` after
25
- * `cargo build -p rindle-cli -p rindle-server --release` and a single env var lights up both
26
- * (and keeps them co-located, so `rindle up` still finds `rindled` as a sibling).
23
+ * Resolution order:
24
+ * 1. The binary's explicit `*_BINARY_PATH` override.
25
+ * 2. `RINDLE_BIN_DIR` — a directory holding the co-located toolchain. Point it at
26
+ * `target/release` after building the four binary crates and one env var lights up the fleet.
27
27
  * 3. The matching `@rindle/cli-<key>` optional dependency that npm/pnpm installed.
28
28
  *
29
29
  * Throws `UnsupportedPlatformError` for an un-targeted host, or a descriptive Error if the
@@ -31,10 +31,16 @@ const require = createRequire(import.meta.url);
31
31
  * publish didn't target) and no override is set.
32
32
  */
33
33
  export function binaryPath(bin) {
34
- const explicit = process.env[`${bin.toUpperCase()}_BINARY_PATH`];
34
+ const explicitName = {
35
+ rindle: "RINDLE_BINARY_PATH",
36
+ rindled: "RINDLED_BINARY_PATH",
37
+ "rindle-replicator": "RINDLE_REPLICATOR_BINARY_PATH",
38
+ "rindle-dev-edge": "RINDLE_DEV_EDGE_BINARY_PATH",
39
+ };
40
+ const explicit = process.env[explicitName[bin]];
35
41
  if (explicit) {
36
42
  if (!existsSync(explicit)) {
37
- throw new Error(`${bin.toUpperCase()}_BINARY_PATH points at a missing file: ${explicit}`);
43
+ throw new Error(`${explicitName[bin]} points at a missing file: ${explicit}`);
38
44
  }
39
45
  return explicit;
40
46
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export type Libc = "gnu" | "musl";
2
- /** A Rindle binary shipped by this toolchain: the CLI (`rindle`) or the daemon (`rindled`). */
3
- export type Binary = "rindle" | "rindled";
2
+ /** A native binary shipped by the Rindle development toolchain. */
3
+ export type Binary = "rindle" | "rindled" | "rindle-replicator" | "rindle-dev-edge";
4
4
  /**
5
5
  * The package-name suffix identifying a build target for the current (or given) host:
6
6
  * `darwin-{arm64,x64}`, `linux-{x64,arm64}-{gnu,musl}`, `win32-x64-msvc`. Throws
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAElC,+FAA+F;AAC/F,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAqB,EAC3B,IAAI,GAAE,IAA2B,GAChC,MAAM,CAWR;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEvE;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAE5F;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI3C"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAElC,mEAAmE;AACnE,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEpF;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAqB,EAC3B,IAAI,GAAE,IAA2B,GAChC,MAAM,CAcR;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEvE;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAE5F;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAY3C"}
package/dist/platform.js CHANGED
@@ -1,11 +1,13 @@
1
1
  // Single source of truth for mapping the *running* Node platform to the per-platform package that
2
- // carries the prebuilt Rindle binaries (`rindle` + `rindled`) for it. Those packages
3
- // (`@rindle/cli-<key>`) are generated at release time by `scripts/build-npm-packages.mjs` from
4
- // dist's (cargo-dist) release archives, and declared as optionalDependencies of this umbrella
5
- // package so npm/pnpm install only the one whose `os`/`cpu` match the host. Both binaries ship
2
+ // carries the prebuilt Rindle binaries (`rindle`, `rindled`, `rindle-replicator`, and the local
3
+ // `rindle-dev-edge`) for it. Those
4
+ // packages (`@rindle/cli-<key>`) are generated at release time by `scripts/build-npm-packages.mjs`
5
+ // from dist's (cargo-dist) release archives, and declared as optionalDependencies of this umbrella
6
+ // package — so npm/pnpm install only the one whose `os`/`cpu` match the host. All binaries ship
6
7
  // **co-located** in that one package's `bin/`, which is required: the `rindle` CLI's `rindle up`
7
- // finds `rindled` as a sibling of its own executable (rindle-cli §7.1). This module and the
8
- // generator MUST agree on the `<key>` scheme; it is defined here and mirrored in the generator.
8
+ // finds every component as a sibling of its own executable (rindle-cli §7.1) so it can supervise
9
+ // the local topology. This module and the generator MUST agree on the `<key>`
10
+ // scheme; it is defined here and mirrored in the generator.
9
11
  /**
10
12
  * The package-name suffix identifying a build target for the current (or given) host:
11
13
  * `darwin-{arm64,x64}`, `linux-{x64,arm64}-{gnu,musl}`, `win32-x64-msvc`. Throws
@@ -17,8 +19,11 @@ export function platformKey(platform = process.platform, arch = process.arch, li
17
19
  return `darwin-${arch}`;
18
20
  case "linux":
19
21
  return `linux-${arch}-${libc}`;
20
- case "win32":
21
- return `win32-${arch}-msvc`;
22
+ // `win32` is deliberately absent, and must stay in step with `"rindle".targets` in
23
+ // package.json: we publish no Windows binaries, so returning a key here would only trade this
24
+ // actionable error for a MODULE_NOT_FOUND on a package that was never published. Restoring
25
+ // Windows means re-adding the target there AND a `case "win32"` here — see
26
+ // follow-ups/windows-hctree.md.
22
27
  default:
23
28
  throw new UnsupportedPlatformError(platform, arch);
24
29
  }
@@ -33,7 +38,13 @@ export function binaryName(bin, platform = process.platform) {
33
38
  }
34
39
  export class UnsupportedPlatformError extends Error {
35
40
  constructor(platform, arch) {
36
- super(`@rindle/cli ships no prebuilt Rindle binaries for ${platform}-${arch}`);
41
+ super(`@rindle/cli ships no prebuilt Rindle binaries for ${platform}-${arch}` +
42
+ (platform === "win32"
43
+ ? ". Rindle's storage engine is Linux-only, so there is no native Windows build. Run the " +
44
+ "toolchain under WSL2 and keep the database on the WSL filesystem (~/), NOT under " +
45
+ "/mnt/c — the Windows drive mount cannot back a memory-mapped database. Your app and " +
46
+ "browser can stay on Windows: WSL2 forwards localhost."
47
+ : ""));
37
48
  this.name = "UnsupportedPlatformError";
38
49
  }
39
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,qFAAqF;AACrF,+FAA+F;AAC/F,8FAA8F;AAC9F,iGAAiG;AACjG,iGAAiG;AACjG,4FAA4F;AAC5F,gGAAgG;AAOhG;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAe,OAAO,CAAC,IAAI,EAC3B,OAAa,UAAU,CAAC,QAAQ,CAAC;IAEjC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,UAAU,IAAI,EAAE,CAAC;QAC1B,KAAK,OAAO;YACV,OAAO,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;QACjC,KAAK,OAAO;YACV,OAAO,SAAS,IAAI,OAAO,CAAC;QAC9B;YACE,MAAM,IAAI,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,mBAAmB,CAAC,MAAc,WAAW,EAAE;IAC7D,OAAO,eAAe,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAClF,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,QAAgB,EAAE,IAAY;QACxC,KAAK,CAAC,qDAAqD,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,gGAAgG;AAChG,gGAAgG;AAChG,6FAA6F;AAC7F,SAAS,UAAU,CAAC,QAAyB;IAC3C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,EAE3B,CAAC;QACd,OAAO,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,gGAAgG;AAChG,mCAAmC;AACnC,mGAAmG;AACnG,mGAAmG;AACnG,gGAAgG;AAChG,iGAAiG;AACjG,iGAAiG;AACjG,8EAA8E;AAC9E,4DAA4D;AAO5D;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAe,OAAO,CAAC,IAAI,EAC3B,OAAa,UAAU,CAAC,QAAQ,CAAC;IAEjC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,UAAU,IAAI,EAAE,CAAC;QAC1B,KAAK,OAAO;YACV,OAAO,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;QACjC,mFAAmF;QACnF,8FAA8F;QAC9F,2FAA2F;QAC3F,2EAA2E;QAC3E,gCAAgC;QAChC;YACE,MAAM,IAAI,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,mBAAmB,CAAC,MAAc,WAAW,EAAE;IAC7D,OAAO,eAAe,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAClF,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,QAAgB,EAAE,IAAY;QACxC,KAAK,CACH,qDAAqD,QAAQ,IAAI,IAAI,EAAE;YACrE,CAAC,QAAQ,KAAK,OAAO;gBACnB,CAAC,CAAC,wFAAwF;oBACxF,mFAAmF;oBACnF,sFAAsF;oBACtF,uDAAuD;gBACzD,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,gGAAgG;AAChG,gGAAgG;AAChG,6FAA6F;AAC7F,SAAS,UAAU,CAAC,QAAyB;IAC3C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,EAE3B,CAAC;QACd,OAAO,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rindle/cli",
3
- "version": "0.5.0",
3
+ "version": "0.6.3",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,7 +8,7 @@
8
8
  "directory": "packages/cli"
9
9
  },
10
10
  "type": "module",
11
- "description": "The Rindle toolchain for JS devs: the `rindle` CLI and the `rindled` daemon as prebuilt, per-platform binaries you can `npm install`. `rindle up` scaffolds and supervises a local daemon.",
11
+ "description": "The Rindle toolchain for JS devs: prebuilt CLI, write-master, follower, and local fleet-edge binaries. `rindle up` supervises the fleet and `rindle exec` injects topology-derived app bindings.",
12
12
  "main": "./dist/index.js",
13
13
  "types": "./dist/index.d.ts",
14
14
  "sideEffects": false,
@@ -39,7 +39,9 @@
39
39
  "rindle": {
40
40
  "binaries": [
41
41
  "rindle",
42
- "rindled"
42
+ "rindled",
43
+ "rindle-replicator",
44
+ "rindle-dev-edge"
43
45
  ],
44
46
  "repository": "rindle-sh/rindle",
45
47
  "targets": [
@@ -76,11 +78,6 @@
76
78
  "os": "linux",
77
79
  "cpu": "arm64",
78
80
  "libc": "musl"
79
- },
80
- {
81
- "rust": "x86_64-pc-windows-msvc",
82
- "os": "win32",
83
- "cpu": "x64"
84
81
  }
85
82
  ]
86
83
  },
@@ -89,12 +86,11 @@
89
86
  "typescript": "^5.7.0"
90
87
  },
91
88
  "optionalDependencies": {
92
- "@rindle/cli-darwin-arm64": "0.5.0",
93
- "@rindle/cli-darwin-x64": "0.5.0",
94
- "@rindle/cli-linux-arm64-gnu": "0.5.0",
95
- "@rindle/cli-linux-arm64-musl": "0.5.0",
96
- "@rindle/cli-linux-x64-gnu": "0.5.0",
97
- "@rindle/cli-linux-x64-musl": "0.5.0",
98
- "@rindle/cli-win32-x64-msvc": "0.5.0"
89
+ "@rindle/cli-darwin-arm64": "0.6.3",
90
+ "@rindle/cli-darwin-x64": "0.6.3",
91
+ "@rindle/cli-linux-arm64-gnu": "0.6.3",
92
+ "@rindle/cli-linux-arm64-musl": "0.6.3",
93
+ "@rindle/cli-linux-x64-gnu": "0.6.3",
94
+ "@rindle/cli-linux-x64-musl": "0.6.3"
99
95
  }
100
96
  }
package/src/index.ts CHANGED
@@ -1,14 +1,15 @@
1
- // @rindle/cli — the Rindle toolchain (`rindle` CLI + `rindled` daemon) as prebuilt npm binaries.
1
+ // @rindle/cli — the Rindle CLI and supervised local-fleet components as prebuilt npm binaries.
2
2
  //
3
3
  // `rindled` is the *network front* of the engine: the `rindle-server` crate — the SQLite-backed
4
4
  // `rindle-replica` live-query engine plus the public subscription/lease plane. `rindle` is the CLI
5
5
  // that inspects and manages a deployed daemon (`rindle status`/`migrate`/…) and, for local dev,
6
6
  // scaffolds and supervises one (`rindle init` / `rindle up`). Where `@rindle/replica` is a napi
7
7
  // addon that embeds the engine *in-process*, this package ships the standalone executables,
8
- // prebuilt per platform by dist (cargo-dist), **co-located** so `rindle up` finds `rindled` beside
9
- // it. This module resolves the right binary for the host; the `rindle` bin (dist/cli.js) execs the
10
- // CLI, and the daemon runs via `rindle up` or `spawnRindled()` (it is not exposed as its own bin —
11
- // this package is a dev convenience). Pair with `@rindle/daemon-client` to talk to a running daemon.
8
+ // prebuilt per platform by dist (cargo-dist), **co-located** so `rindle up` finds every component
9
+ // beside it. This module resolves the right binary for the host; the `rindle` bin (dist/cli.js)
10
+ // execs the CLI, and the daemon runs via `rindle up` or `spawnRindled()` (it is not exposed as its
11
+ // own bin — this package is a dev convenience). Pair with `@rindle/daemon-client` to talk to a
12
+ // running daemon.
12
13
  import { spawn, type ChildProcess, type SpawnOptions } from "node:child_process";
13
14
  import { existsSync } from "node:fs";
14
15
  import { createRequire } from "node:module";
@@ -33,13 +34,12 @@ export type { Binary, Libc } from "./platform.ts";
33
34
  const require = createRequire(import.meta.url);
34
35
 
35
36
  /**
36
- * Absolute path to a Rindle binary (`"rindle"` or `"rindled"`) for the current platform.
37
+ * Absolute path to a native Rindle toolchain binary for the current platform.
37
38
  *
38
- * Resolution order (the first three are dev overrides for working in this monorepo):
39
- * 1. `RINDLE_BINARY_PATH` / `RINDLED_BINARY_PATH` — an explicit path to that one binary.
40
- * 2. `RINDLE_BIN_DIR` — a directory holding both binaries. Point it at `target/release` after
41
- * `cargo build -p rindle-cli -p rindle-server --release` and a single env var lights up both
42
- * (and keeps them co-located, so `rindle up` still finds `rindled` as a sibling).
39
+ * Resolution order:
40
+ * 1. The binary's explicit `*_BINARY_PATH` override.
41
+ * 2. `RINDLE_BIN_DIR` — a directory holding the co-located toolchain. Point it at
42
+ * `target/release` after building the four binary crates and one env var lights up the fleet.
43
43
  * 3. The matching `@rindle/cli-<key>` optional dependency that npm/pnpm installed.
44
44
  *
45
45
  * Throws `UnsupportedPlatformError` for an un-targeted host, or a descriptive Error if the
@@ -47,10 +47,16 @@ const require = createRequire(import.meta.url);
47
47
  * publish didn't target) and no override is set.
48
48
  */
49
49
  export function binaryPath(bin: Binary): string {
50
- const explicit = process.env[`${bin.toUpperCase()}_BINARY_PATH`];
50
+ const explicitName: Record<Binary, string> = {
51
+ rindle: "RINDLE_BINARY_PATH",
52
+ rindled: "RINDLED_BINARY_PATH",
53
+ "rindle-replicator": "RINDLE_REPLICATOR_BINARY_PATH",
54
+ "rindle-dev-edge": "RINDLE_DEV_EDGE_BINARY_PATH",
55
+ };
56
+ const explicit = process.env[explicitName[bin]];
51
57
  if (explicit) {
52
58
  if (!existsSync(explicit)) {
53
- throw new Error(`${bin.toUpperCase()}_BINARY_PATH points at a missing file: ${explicit}`);
59
+ throw new Error(`${explicitName[bin]} points at a missing file: ${explicit}`);
54
60
  }
55
61
  return explicit;
56
62
  }
package/src/platform.ts CHANGED
@@ -1,16 +1,18 @@
1
1
  // Single source of truth for mapping the *running* Node platform to the per-platform package that
2
- // carries the prebuilt Rindle binaries (`rindle` + `rindled`) for it. Those packages
3
- // (`@rindle/cli-<key>`) are generated at release time by `scripts/build-npm-packages.mjs` from
4
- // dist's (cargo-dist) release archives, and declared as optionalDependencies of this umbrella
5
- // package so npm/pnpm install only the one whose `os`/`cpu` match the host. Both binaries ship
2
+ // carries the prebuilt Rindle binaries (`rindle`, `rindled`, `rindle-replicator`, and the local
3
+ // `rindle-dev-edge`) for it. Those
4
+ // packages (`@rindle/cli-<key>`) are generated at release time by `scripts/build-npm-packages.mjs`
5
+ // from dist's (cargo-dist) release archives, and declared as optionalDependencies of this umbrella
6
+ // package — so npm/pnpm install only the one whose `os`/`cpu` match the host. All binaries ship
6
7
  // **co-located** in that one package's `bin/`, which is required: the `rindle` CLI's `rindle up`
7
- // finds `rindled` as a sibling of its own executable (rindle-cli §7.1). This module and the
8
- // generator MUST agree on the `<key>` scheme; it is defined here and mirrored in the generator.
8
+ // finds every component as a sibling of its own executable (rindle-cli §7.1) so it can supervise
9
+ // the local topology. This module and the generator MUST agree on the `<key>`
10
+ // scheme; it is defined here and mirrored in the generator.
9
11
 
10
12
  export type Libc = "gnu" | "musl";
11
13
 
12
- /** A Rindle binary shipped by this toolchain: the CLI (`rindle`) or the daemon (`rindled`). */
13
- export type Binary = "rindle" | "rindled";
14
+ /** A native binary shipped by the Rindle development toolchain. */
15
+ export type Binary = "rindle" | "rindled" | "rindle-replicator" | "rindle-dev-edge";
14
16
 
15
17
  /**
16
18
  * The package-name suffix identifying a build target for the current (or given) host:
@@ -27,8 +29,11 @@ export function platformKey(
27
29
  return `darwin-${arch}`;
28
30
  case "linux":
29
31
  return `linux-${arch}-${libc}`;
30
- case "win32":
31
- return `win32-${arch}-msvc`;
32
+ // `win32` is deliberately absent, and must stay in step with `"rindle".targets` in
33
+ // package.json: we publish no Windows binaries, so returning a key here would only trade this
34
+ // actionable error for a MODULE_NOT_FOUND on a package that was never published. Restoring
35
+ // Windows means re-adding the target there AND a `case "win32"` here — see
36
+ // follow-ups/windows-hctree.md.
32
37
  default:
33
38
  throw new UnsupportedPlatformError(platform, arch);
34
39
  }
@@ -46,7 +51,15 @@ export function binaryName(bin: Binary, platform: NodeJS.Platform = process.plat
46
51
 
47
52
  export class UnsupportedPlatformError extends Error {
48
53
  constructor(platform: string, arch: string) {
49
- super(`@rindle/cli ships no prebuilt Rindle binaries for ${platform}-${arch}`);
54
+ super(
55
+ `@rindle/cli ships no prebuilt Rindle binaries for ${platform}-${arch}` +
56
+ (platform === "win32"
57
+ ? ". Rindle's storage engine is Linux-only, so there is no native Windows build. Run the " +
58
+ "toolchain under WSL2 and keep the database on the WSL filesystem (~/), NOT under " +
59
+ "/mnt/c — the Windows drive mount cannot back a memory-mapped database. Your app and " +
60
+ "browser can stay on Windows: WSL2 forwards localhost."
61
+ : ""),
62
+ );
50
63
  this.name = "UnsupportedPlatformError";
51
64
  }
52
65
  }