create-ragen-app 0.6.1 → 0.6.2

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
@@ -33,14 +33,32 @@ yourself.
33
33
 
34
34
  ## Node version
35
35
 
36
- A Ragen installation needs Node 24, and the wizard refuses to create one on
37
- anything older _before_ it clones. Not because the CLI needs it — it does not,
38
- and 0.2.0 was published and verified on Node 22 by accident — but because the
39
- setup it runs for you (`npm install` across the monorepo, `prisma generate`,
40
- `migrate deploy`, the seed) runs under the caller's Node and leaves a tree
41
- that fails much later, nowhere near the cause. npm's `EBADENGINE` does warn,
36
+ A Ragen installation runs on `^24.15.0 || >=26.0.0`, and the wizard refuses
37
+ anything outside that _before_ it clones. Not because the CLI needs it —
38
+ it does not, and 0.2.0 was published and verified on Node 22 by accident — but
39
+ because the setup it runs for you (`npm install` across the monorepo, `prisma
40
+ generate`, `migrate deploy`, the seed) runs under the caller's Node and leaves a
41
+ tree that fails much later, nowhere near the cause. npm's `EBADENGINE` does warn,
42
42
  as one line inside a wall of install output that does not say what breaks.
43
43
 
44
+ **It is a range rather than a minimum, and both ends matter.** `jsdom` — a
45
+ transitive dependency, which narrowed its range with no version bump of ours —
46
+ requires `^22.22.2 || ^24.15.0 || >=26.0.0`, and the repository sets
47
+ `engine-strict=true`, so npm stops rather than warns. Two consequences:
48
+
49
+ - Node 24.0 through 24.14 fail `npm install` while looking, to every other
50
+ check, like a supported Node. The refusal names the reason, because "needs
51
+ Node 24" read by someone who has Node 24 is a riddle.
52
+ - **Node 25 fails too**, and no minimum version can say so — `>=24.15.0` accepts
53
+ it. Odd-numbered Node lines never become LTS and libraries routinely omit
54
+ them, so the gap is normal rather than an oversight. A caller on 25 gets a
55
+ refusal that says "newer than the minimum and still not supported", not "too
56
+ old", which would send them to upgrade again.
57
+
58
+ Node 22 is inside jsdom's range and deliberately outside ours: this repository
59
+ has required 24 since long before any of this, and widening support is a
60
+ decision rather than a consequence of a dependency's range.
61
+
44
62
  `--skip-install` turns the refusal into a warning, because then the wizard
45
63
  runs nothing itself: scaffold here, run the setup on a supported Node. `--yes`
46
64
  does not bypass it — that flag means "accept the defaults", not "ignore a
@@ -66,7 +84,8 @@ What counts as install-affecting:
66
84
  | An app the web app can no longer run without | the outro in `src/cli.ts`, which tells people what to start |
67
85
  | A variable a provider seam makes required | `src/worker-runtime.ts`, `src/storage-provider.ts` or `src/encryption-provider.ts` — the selection writes it, and `tests/architecture/create-ragen-app-knows-the-provider-seams.test.ts` fails when it does not |
68
86
  | A new first-run step (migration, seed, generate) | `src/tasks.ts` and `maybeRunFirstTimeSetup` |
69
- | A `docker-compose.yml` service, port or name change | `src/tasks.ts`, and the collision check in `ragenStackVolumeExists` |
87
+ | A `docker-compose.yml` service or published port change | `PUBLISHED_PORTS` in `src/tasks.ts` — the wizard probes those ports before starting the stack, and `tests/architecture/installer-ports-agree-with-compose.test.ts` fails when the two tables disagree |
88
+ | A change to how Compose scopes its resources | `resolveComposeProjectName` in `src/tasks.ts` — it writes `COMPOSE_PROJECT_NAME` into the install's `.env`, which is the only thing keeping two installs in same-named directories apart |
70
89
  | A gate that a brand-new install cannot pass (registration, licensing, onboarding) | usually the app, not this package — a fresh install must be able to reach a working chat without an administrator who does not exist yet |
71
90
 
72
91
  `tests/architecture/create-ragen-app-manifest-is-current.test.ts` catches one
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAoFA;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAqQ1D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAuFA;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CA2Q1D"}
package/dist/cli.js CHANGED
@@ -154,6 +154,11 @@ async function run(argv) {
154
154
  ].join('\n'));
155
155
  return false;
156
156
  }
157
+ // Compose's project name, pinned for this directory before anything starts.
158
+ // Two installs whose directories share a basename would otherwise share the
159
+ // project — and therefore the containers and volumes — and a *stopped* first
160
+ // stack makes that silent: no port is held, so nothing refuses.
161
+ await writeComposeProjectName(targetDir);
157
162
  // After the env write, so a run that stops on drifted keys has not already
158
163
  // rewritten a file in the clone.
159
164
  try {
@@ -321,6 +326,98 @@ function overridesForTarget(target, resolved) {
321
326
  }
322
327
  return overrides;
323
328
  }
329
+ /**
330
+ * Writes `COMPOSE_PROJECT_NAME` into the new tree's `.env`.
331
+ *
332
+ * `.env`, not `.env.local`, and the distinction is the point: Compose reads
333
+ * `.env` from the project directory by itself, so every later `docker compose`
334
+ * the caller runs — days after this wizard exited — uses the same name. A
335
+ * value passed only in the installer's own environment would name one project
336
+ * here and a different one afterwards, which is the empty-database failure
337
+ * rather than a fix for it.
338
+ *
339
+ * Safe to sit beside the install's own config: `scripts/load-root-env.mjs`
340
+ * reads `.env` last, `.env.local` wins over it, nothing in the apps reads this
341
+ * variable, and `.env` is gitignored.
342
+ *
343
+ * Failure here is a warning, not an abort. The files are correct and Compose
344
+ * still works — it simply falls back to the basename, which is where this
345
+ * started.
346
+ */
347
+ async function writeComposeProjectName(targetDir) {
348
+ // An existing value wins over anything resolved here, and this is not
349
+ // politeness — it is what makes the mechanism stable. Re-running the wizard
350
+ // over a tree that already has a stack must not rename its project: the new
351
+ // name would address empty volumes and abandon the database the first run
352
+ // migrated. That can happen for an innocent reason too — the first run
353
+ // decided while Docker was up, this one cannot reach it — so the rule is
354
+ // "whatever this directory already decided", not "whatever we would decide
355
+ // again".
356
+ const existing = readComposeProjectName(targetDir);
357
+ if (existing) {
358
+ clack.log.info(`Keeping this directory's Compose project name: ${existing} (from .env).`);
359
+ return;
360
+ }
361
+ const project = await (0, tasks_1.resolveComposeProjectName)(targetDir);
362
+ try {
363
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(targetDir, '.env'), [
364
+ "# Read by docker compose, not by the apps. It scopes this install's",
365
+ '# containers, volumes and network, so a second Ragen checkout cannot',
366
+ '# reuse them — which it would if both directories had the same name,',
367
+ '# since that basename is what Compose uses when this is unset.',
368
+ `COMPOSE_PROJECT_NAME=${project.name}`,
369
+ '',
370
+ ].join('\n'), { mode: 0o600 });
371
+ }
372
+ catch (error) {
373
+ clack.log.warn([
374
+ `Could not write .env with COMPOSE_PROJECT_NAME: ${String(error)}`,
375
+ "Compose will fall back to this directory's name, which another",
376
+ `install in a directory called "${(0, node_path_1.basename)((0, node_path_1.resolve)(targetDir))}" would`,
377
+ 'share — add the line by hand if you have one.',
378
+ ].join('\n'));
379
+ return;
380
+ }
381
+ if (project.daemonUnreachable) {
382
+ // Not a collision — a question that could not be asked. Said plainly, or
383
+ // the hashed name in `docker ps` looks like something went wrong.
384
+ clack.log.info([
385
+ 'Could not ask Docker which Compose projects exist, so this install',
386
+ `took a name derived from its path: ${project.name}. A stopped daemon`,
387
+ 'still holds the volumes of earlier installs, and the plain directory',
388
+ 'name would have reused them.',
389
+ ].join(' '));
390
+ return;
391
+ }
392
+ if (project.disambiguated) {
393
+ clack.log.warn([
394
+ `This machine already runs a Compose project called "${(0, node_path_1.basename)((0, node_path_1.resolve)(targetDir))}"`,
395
+ project.takenBy ? `(from ${project.takenBy}).` : '.',
396
+ '',
397
+ 'Compose names a project after its directory, so this install would',
398
+ "have reused that one's containers and volumes — including its",
399
+ `database. Written .env with COMPOSE_PROJECT_NAME=${project.name}`,
400
+ 'instead, so the two stay apart. Host ports are separate and may still',
401
+ 'collide; see below.',
402
+ ].join(' '));
403
+ }
404
+ }
405
+ /**
406
+ * Reads `COMPOSE_PROJECT_NAME` back out of an install's `.env`, or undefined
407
+ * when there is no such file or no such line. Parsed with dotenv rather than a
408
+ * regex so a quoted value reads the same way Compose reads it.
409
+ */
410
+ function readComposeProjectName(targetDir) {
411
+ try {
412
+ const parsed = (0, dotenv_1.parse)((0, node_fs_1.readFileSync)((0, node_path_1.join)(targetDir, '.env'), 'utf8'));
413
+ const name = parsed.COMPOSE_PROJECT_NAME?.trim();
414
+ return name === undefined || name === '' ? undefined : name;
415
+ }
416
+ catch {
417
+ // No `.env` is the normal case on a fresh clone.
418
+ return undefined;
419
+ }
420
+ }
324
421
  function writeEnvFile(targetDir, target, overrides) {
325
422
  const paths = ENV_PATHS[target];
326
423
  const examplePath = (0, node_path_1.join)(targetDir, paths.example);
@@ -716,33 +813,41 @@ async function runStep(spinner, label, successMessage, task) {
716
813
  */
717
814
  async function maybeStartDocker(targetDir, yes, profiles = []) {
718
815
  const withPii = profiles.includes(pii_masking_1.PII_COMPOSE_PROFILE);
719
- // Before the confirm, not after: sharing a database with an install you
720
- // already depend on is the kind of thing to decline, and you can only
816
+ // Before the confirm, not after: starting a stack onto ports something else
817
+ // already answers on is the kind of thing to decline, and you can only
721
818
  // decline it if you are told first.
722
- if (await (0, tasks_1.ragenStackVolumeExists)()) {
819
+ //
820
+ // This used to warn about *data* — pinned volume names meant a second
821
+ // install silently opened the first one's database. docker-compose.yml no
822
+ // longer pins them, so containers, volumes and the network are scoped to the
823
+ // project directory and two installs coexist. Ports are the half that
824
+ // prefixing cannot fix: a published port is a host port either way.
825
+ const candidates = withPii
826
+ ? [...tasks_1.PUBLISHED_PORTS, ...tasks_1.PII_PUBLISHED_PORTS]
827
+ : tasks_1.PUBLISHED_PORTS;
828
+ const busy = await (0, tasks_1.busyPublishedPorts)(candidates);
829
+ if (busy.length > 0) {
723
830
  clack.log.warn([
724
- 'This machine already runs a Ragen stack, and docker-compose.yml pins',
725
- 'container, volume and network names globally — so starting this one',
726
- 'would reuse the existing Postgres and Qdrant data, not create its own.',
831
+ 'Something is already listening on ports this stack publishes:',
832
+ '',
833
+ ...busy.map(({ service, variable, port }) => ` ${port} ${service} (${variable})`),
834
+ '',
835
+ 'Usually that is another Ragen install. Its containers and volumes no',
836
+ 'longer collide with this one — Compose scopes those to the directory —',
837
+ 'but a host port belongs to whoever bound it first, so `docker compose',
838
+ 'up` will fail, and worse, DATABASE_URL here would point at that other',
839
+ "install's Postgres if it did not.",
727
840
  '',
728
- 'To keep them apart, answer no here and start the stack yourself under a',
729
- 'distinct name *and* distinct host ports — the name only moves the',
730
- 'containers and volumes, while the published ports would still collide',
731
- 'with the running stack:',
841
+ 'Answer no here and start this stack on ports of its own:',
732
842
  '',
733
843
  ` cd ${targetDir} \\`,
734
- ' && RAGEN_STACK_NAME=my-ragen \\',
735
- ' POSTGRES_PORT=55532 QDRANT_PORT=6343 QDRANT_GRPC_PORT=6344 \\',
736
- ' DOCLING_PORT=5011 REDIS_PORT=56479 \\',
844
+ ` && ${busy.map(({ variable, port }) => `${variable}=${port + 100}`).join(' ')} \\`,
737
845
  // Built from what this install actually chose. A command that omits
738
846
  // the profile starts a stack without the services whose urls were just
739
847
  // written — which is the same half-configuration the profile exists to
740
848
  // prevent, only printed instead of executed.
741
849
  ...(withPii
742
- ? [
743
- ' PRESIDIO_ANALYZER_PORT=5012 PRESIDIO_ANONYMIZER_PORT=5013 \\',
744
- ` docker compose --profile ${pii_masking_1.PII_COMPOSE_PROFILE} up -d`,
745
- ]
850
+ ? [` docker compose --profile ${pii_masking_1.PII_COMPOSE_PROFILE} up -d`]
746
851
  : [' docker compose up -d']),
747
852
  '',
748
853
  'Then update .env.local to match: DATABASE_URL, QDRANT_URL, REDIS_URL',
@@ -782,12 +887,11 @@ async function maybeStartDocker(targetDir, yes, profiles = []) {
782
887
  clack.log.warn([
783
888
  'docker compose could not start the services, and the install carried',
784
889
  'on: the files are written, so this is the one step you can redo by',
785
- 'hand. The usual cause is another Ragen stack already holding these',
786
- 'container names and host ports — compose says so with "Conflict. The',
787
- 'container name … is already in use".',
890
+ 'hand. The usual cause is another stack already holding these host',
891
+ 'ports — compose says so with "port is already allocated".',
788
892
  '',
789
- 'Either stop the other stack, or start this one under its own name and',
790
- 'ports with the command printed above, then point .env.local at them.',
893
+ 'Either stop the other stack, or start this one on ports of its own,',
894
+ 'then point .env.local at them.',
791
895
  '',
792
896
  `The error was: ${String(error)}`,
793
897
  ].join('\n'));
@@ -797,9 +901,9 @@ async function maybeStartDocker(targetDir, yes, profiles = []) {
797
901
  }
798
902
  /**
799
903
  * `skipDatabaseSteps` is the compose failure reaching this far, and it is not
800
- * caution for its own sake. The usual cause of that failure is another Ragen
801
- * stack holding these container names — which means its Postgres is answering
802
- * on the very port this install was just configured for. Running `migrate
904
+ * caution for its own sake. The usual cause of that failure is another stack
905
+ * holding these host ports — which means its Postgres is answering on the very
906
+ * port this install was just configured for. Running `migrate
803
907
  * deploy` and the seed then writes into *that* install's database: the exact
804
908
  * thing the warning two prompts earlier exists to prevent, arrived at by a
805
909
  * different road.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2FA,kBAqQC;AAhWD,qCAMiB;AACjB,yCAAiC;AAEjC,sDAAwC;AACxC,mCAA8C;AAE9C,iCAAqE;AACrE,mCAAwC;AACxC,+CAAiD;AACjD,+DAK+B;AAC/B,yCAA+C;AAC/C,iDAA4D;AAC5D,+CAAkE;AAClE,iDAAkD;AAClD,iDAKwB;AACxB,yCAKoB;AACpB,+CAIuB;AACvB,uCAA2C;AAC3C,yDAI4B;AAC5B,qDAK0B;AAC1B,mCAQiB;AAEjB,mFAAmF;AACnF,MAAM,qBAAqB,GAAG,cAAc,CAAC;AAE7C,MAAM,SAAS,GAA0D;IACvE,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE;IACtD,KAAK,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,uBAAuB,EAAE;CAC9E,CAAC;AAcF;;;;;;GAMG;AACI,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAC;IAE7B,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEhC,2EAA2E;IAC3E,0CAA0C;IAC1C,MAAM,WAAW,GAAG,IAAA,+BAAgB,EAAC;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,CAAC,IAAI,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACnE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACrC,YAAY,CAAC,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,IAAA,qBAAa,EAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,MAAM,CACV,sBAAsB,IAAI,CAAC,GAAG,+BAA+B,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7E,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7B,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;IAC/C,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAEnE,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;IACnC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,uEAAuE;IACvE,6EAA6E;IAC7E,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC;IACvC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAEpD,yEAAyE;IACzE,4EAA4E;IAC5E,4EAA4E;IAC5E,8CAA8C;IAC9C,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC;IAC9C,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC;IACxC,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAE9C,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAExE,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,MAAM,CACV;YACE,+FAA+F,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACxH,sNAAsN;SACvN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2EAA2E;IAC3E,iCAAiC;IACjC,IAAI,CAAC;QACH,IAAA,8BAAgB,EAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,MAAM,CACV,qCAAqC,MAAM,CAAC,KAAK,CAAC,IAAI;YACpD,yHAAyH,CAC5H,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;YACE,uEAAuE;YACvE,qEAAqE;YACrE,2CAA2C;SAC5C,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;YACE,uEAAuE;YACvE,yEAAyE;YACzE,8BAA8B;SAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,yEAAyE;QACzE,oEAAoE;QACpE,IAAA,6BAAe,EAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;gBACE,mEAAmE;gBACnE,qDAAqD;gBACrD,GAAG,qBAAqB,wBAAwB;aACjD,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;YACF,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,+DAA+D;QAC/D,wEAAwE;QACxE,qDAAqD;QACrD,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CACR;YACE,qEAAqE;YACrE,EAAE;YACF,oBAAoB;YACpB,4DAA4D;YAC5D,qEAAqE;YACrE,+CAA+C;YAC/C,KAAK,8BAAgB,sBAAsB;YAC3C,EAAE;YACF,wDAAwD,SAAS,GAAG;SACrE,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,gBAAgB,CAChD,SAAS,EACT,IAAI,CAAC,GAAG,EACR,UAAU,CAAC,eAAe,CAC3B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,qEAAqE;QACrE,8DAA8D;QAC9D,oEAAoE;QACpE,uEAAuE;QACvE,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAA,cAAW,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/C,IACE,CAAC,CAAC,MAAM,sBAAsB,CAC5B,SAAS,EACT,IAAI,CAAC,GAAG,EACR,OAAO,EACP,YAAY,CACb,CAAC,EACF,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,qDAAqD;YACnD,iCAAmB;YACnB,+DAA+D;YAC/D,iCAAmB;YACnB,sEAAsE;YACtE,mCAAmC,CACtC,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC;QACzD,KAAK,CAAC,IAAI,CACR;YACE,oBAAoB,IAAI,EAAE;YAC1B,aAAa,IAAI,EAAE;YACnB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,mEAAmE;YACnE,qEAAqE;YACrE,yCAAyC;SAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,iBAAiB,CAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CACT;QACE,mBAAmB;QACnB,QAAQ,SAAS,EAAE;QACnB,yCAAyC;QACzC,oCAAoC;QACpC,gEAAgE;QAChE,EAAE;QACF,qEAAqE;QACrE,uEAAuE;QACvE,oEAAoE;QACpE,UAAU;QACV,oEAAoE;QACpE,wEAAwE;QACxE,sDAAsD;QACtD,EAAE;QACF,8BAA8B;QAC9B,8BAA8B;QAC9B,mDAAmD;QACnD,EAAE;QACF,oEAAoE;QACpE,iDAAiD;KAClD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,KAAyB,EACzB,GAAY;IAEZ,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,GAAG,yBAAkB,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;gBAC9B,OAAO,EAAE,gCAAgC;gBACzC,WAAW,EAAE,yBAAkB;gBAC/B,YAAY,EAAE,yBAAkB;aACjC,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC3B,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,SAAS,GAAG,MAAM,IAAI,yBAAkB,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,yCAAyC,CAAC,CAAC;YACpE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAA,qBAAW,EAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAC;YAC9D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,mBAAQ,EAAE,CAAC;QAC7B,QAAQ,CAAC,GAAG,CACV,KAAK,EACL,KAAK,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAA,wBAAc,GAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CACtE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAiB,EACjB,QAAoC;IAEpC,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAA,2BAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAW,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAOD,SAAS,YAAY,CACnB,SAAiB,EACjB,MAAiB,EACjB,SAAiC;IAEjC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,IAAA,sBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAA,4BAAiB,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxE,qEAAqE;IACrE,IAAA,uBAAa,EAAC,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC;AAQD;;;;;;;;;;;GAWG;AACH,SAAS,YAAY,CAAC,IAAa;IACjC,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,cAAc,CAAC,IAAa;IACzC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAA,0CAAuB,EAAC,OAAO,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAKD;;;;;;;GAOG;AACH,KAAK,UAAU,iBAAiB,CAAC,IAAa;IAC5C,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAA,wCAA0B,EAAC,KAAK,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC;QAClC,OAAO,EACL,6EAA6E;QAC/E,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,IAAA,wCAA0B,EAAC,OAAO,KAAK,IAAI,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAa;IAEb,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAA,gDAA0B,EAAC,OAAO,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC;AAKD;;;;;;;;;GASG;AACH,KAAK,UAAU,oBAAoB,CACjC,IAAa;IAEb,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAA,8CAA6B,EAAC,QAAQ,CAAC;SACnD,CAAC;IACJ,CAAC;IACD,OAAO,mBAAmB,EAAE,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,0CAA0C;QACnD,qEAAqE;QACrE,0EAA0E;QAC1E,OAAO,EAAG,CAAC,QAAQ,EAAE,UAAU,CAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzD,KAAK;YACL,KAAK,EAAE,sCAAqB,CAAC,KAAK,CAAC;SACpC,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAA,8CAA6B,EAAC,QAAQ,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,6EAA6E;IAC7E,sEAAsE;IACtE,6EAA6E;IAC7E,2DAA2D;IAC3D,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;QACE,0EAA0E;QAC1E,yEAAyE;KAC1E,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAC/B,OAAO,EAAE,0BAA0B;QACnC,YAAY,EAAE,gDAA+B;QAC7C,WAAW,EAAE,gDAA+B;KAC7C,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,IAAA,8CAA6B,EAAC,UAAU,EAAE;YACnD,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC;SACvC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,4CAA4C;QACrD,OAAO,EAAG,CAAC,OAAO,EAAE,IAAI,CAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK;YACL,KAAK,EAAE,iCAAc,CAAC,KAAK,CAAC;SAC7B,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAA,0CAAuB,EAAC,OAAO,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAC9B,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC;KACrE,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAC9B,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC;KACrE,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAChC,OAAO,EAAE,8BAA8B;QACvC,WAAW,EAAE,6BAA6B;QAC1C,YAAY,EAAE,EAAE;KACjB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC;KACrE,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,2EAA2E;IAC3E,gDAAgD;IAChD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;QAC3C,OAAO,EAAE,mBAAmB;KAC7B,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACvE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAA,0CAAuB,EAAC,OAAO,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,IAAA,0CAAuB,EAAC,IAAI,EAAE;YACvC,MAAM;YACN,MAAM;YACN,QAAQ;YACR,WAAW;YACX,eAAe;SAChB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAG,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvE,KAAK;YACL,KAAK,EAAE,uCAAiB,CAAC,KAAK,CAAC;SAChC,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,MAA0B,CAAC;IAC5C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAA,gDAA0B,EAAC,QAAQ,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAC7B,OAAO,EAAE,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB;QACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KAC9D,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAA,gDAA0B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,0EAA0E;IAC1E,4CAA4C;IAC5C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;QAClC,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC;KAC3E,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,IAAA,gDAA0B,EAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAa;IAEb,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,uBAAuB,CAC9B,MAAyB;IAEzB,MAAM,MAAM,GAAG,4BAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,MAAM,CACV,cAAc,MAAM,cAAc,KAAK,WAAW,YAAY,6FAA6F,CAC5J,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,2EAA2E;IAC3E,8DAA8D;IAC9D,yEAAyE;IACzE,oEAAoE;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;QAC5B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE;QAC5C,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,KAAK,CAAC,MAAM,CACV,cAAc,MAAM,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,0FAA0F,CACnJ,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,IAAA,uCAAwB,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,uCAAuC;QAChD,yEAAyE;QACzE,yEAAyE;QACzE,iCAAiC;QACjC,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,YAAqB,EAAE,KAAK,EAAE,4BAAa,CAAC,UAAU,CAAC,KAAK,EAAE;YACvE,EAAE,KAAK,EAAE,UAAmB,EAAE,KAAK,EAAE,4BAAa,CAAC,QAAQ,CAAC,KAAK,EAAE;YACnE,EAAE,KAAK,EAAE,QAAiB,EAAE,KAAK,EAAE,4BAAa,CAAC,MAAM,CAAC,KAAK,EAAE;YAC/D,EAAE,KAAK,EAAE,WAAoB,EAAE,KAAK,EAAE,4BAAa,CAAC,SAAS,CAAC,KAAK,EAAE;YACrE,EAAE,KAAK,EAAE,MAAe,EAAE,KAAK,EAAE,oCAAoC,EAAE;SACxE;KACF,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,4BAAa,CAAC,MAA2B,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;QAClC,OAAO,EAAE,cAAc,MAAM,CAAC,KAAK,UAAU;KAC9C,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,IAAI,OAA2B,CAAC;IAChC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QACD,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,iEAAiE;QACjE,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,IAAA,uCAAwB,EAC9B,MAA2B,EAC3B,MAAM,EACN,OAAO,CACR;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACpD,IAAA,uBAAa,EAAC,IAAI,EAAE,IAAA,yCAA0B,GAAE,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,GAAY;IACxD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,OAAO,CACpB,OAAyC,EACzC,KAAa,EACb,cAAsB,EACtB,IAAyB;IAEzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAC7B,SAAiB,EACjB,GAAY,EACZ,WAAqB,EAAE;IAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,iCAAmB,CAAC,CAAC;IAEvD,wEAAwE;IACxE,sEAAsE;IACtE,oCAAoC;IACpC,IAAI,MAAM,IAAA,8BAAsB,GAAE,EAAE,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;YACE,sEAAsE;YACtE,qEAAqE;YACrE,wEAAwE;YACxE,EAAE;YACF,yEAAyE;YACzE,mEAAmE;YACnE,uEAAuE;YACvE,yBAAyB;YACzB,EAAE;YACF,QAAQ,SAAS,KAAK;YACtB,qCAAqC;YACrC,sEAAsE;YACtE,8CAA8C;YAC9C,oEAAoE;YACpE,uEAAuE;YACvE,uEAAuE;YACvE,6CAA6C;YAC7C,GAAG,CAAC,OAAO;gBACT,CAAC,CAAC;oBACE,qEAAqE;oBACrE,mCAAmC,iCAAmB,QAAQ;iBAC/D;gBACH,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;YACpC,EAAE;YACF,sEAAsE;YACtE,OAAO;gBACL,CAAC,CAAC,+DAA+D;gBACjE,CAAC,CAAC,uCAAuC;YAC3C,EAAE;YACF,qEAAqE;YACrE,sEAAsE;YACtE,kEAAkE;YAClE,gEAAgE;SACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,8DAA8D,EAC9D,GAAG,CACJ,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAA,yBAAiB,GAAE,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,0GAA0G,CAC3G,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,IAAA,2BAAmB,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2EAA2E;QAC3E,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,yEAAyE;QACzE,6DAA6D;QAC7D,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;YACE,sEAAsE;YACtE,oEAAoE;YACpE,oEAAoE;YACpE,sEAAsE;YACtE,sCAAsC;YACtC,EAAE;YACF,uEAAuE;YACvE,sEAAsE;YACtE,EAAE;YACF,kBAAkB,MAAM,CAAC,KAAK,CAAC,EAAE;SAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,sBAAsB,CACnC,SAAiB,EACjB,GAAY,EACZ,GAAsB,EACtB,iBAAiB,GAAG,KAAK;IAEzB,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,iFAAiF,EACjF,GAAG,CACJ,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAiD;QAC1D;YACE,aAAa;YACb,yBAAyB;YACzB,GAAG,EAAE,CAAC,IAAA,2BAAmB,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;SAC9C;QACD;YACE,8BAA8B;YAC9B,0BAA0B;YAC1B,GAAG,EAAE,CAAC,IAAA,4BAAoB,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;SACpD;QACD,GAAG,CAAC,iBAAiB;YACnB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAE;gBACC;oBACE,8BAA8B;oBAC9B,qBAAqB;oBACrB,GAAG,EAAE,CAAC,IAAA,uBAAe,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;iBAC/C;gBACD;oBACE,sBAAsB;oBACtB,kBAAkB;oBAClB,GAAG,EAAE,CAAC,IAAA,oBAAY,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;iBAC5C;aAC+C,CAAC;KACxD,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAClD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;YACE,mEAAmE;YACnE,gEAAgE;YAChE,uEAAuE;YACvE,uDAAuD;YACvD,EAAE;YACF,4CAA4C;YAC5C,6BAA6B;YAC7B,mBAAmB;SACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Whether this Node can be used to create a Ragen installation.
3
3
  *
4
- * The distinction that matters: **the installation** needs Node 24, not this
5
- * CLI. The CLI itself runs happily on older majors — it was published and
4
+ * The distinction that matters: **the installation** needs a recent Node, not
5
+ * this CLI. The CLI itself runs happily on older majors — it was published and
6
6
  * verified on Node 22 by accident — so refusing on the grounds that "this
7
7
  * tool requires Node 24" would be both untrue and unhelpfully broad.
8
8
  *
@@ -18,17 +18,52 @@
18
18
  *
19
19
  * - running the setup steps → refuse, before anything is cloned
20
20
  * - `--skip-install` → proceed, because nothing runs here; warn instead,
21
- * since the scaffolded app still needs Node 24 to start
21
+ * since the scaffolded app still needs a supported Node to start
22
22
  *
23
23
  * `--yes` deliberately does not bypass it. That flag means "accept the
24
24
  * defaults", not "ignore a requirement".
25
25
  */
26
26
  /**
27
- * Kept in step with this package's `engines.node` by
28
- * `src/__tests__/node-version.test.ts`, and with the repository's own Node
29
- * version documented in AGENTS.md ("Node.js 24.x (Active LTS)").
27
+ * What the install actually runs on — a set of ranges, not a floor, and both
28
+ * the patch digit and the gap are load-bearing.
29
+ *
30
+ * A bare major used to be enough, and stopped being enough when a transitive
31
+ * dependency narrowed its own range mid-line. `jsdom@30.0.1` requires
32
+ * `^22.22.2 || ^24.15.0 || >=26.0.0`, and the repository sets
33
+ * `engine-strict=true`, so npm *stops* on a mismatch rather than warning.
34
+ * Two consequences, and only the first was obvious:
35
+ *
36
+ * - **Node 24.0–24.14 fail `npm install`.** The old `>=24` check waved them
37
+ * through, so someone on 24.13 got a cloned tree, a written `.env.local`, a
38
+ * running docker compose, and then EBADENGINE.
39
+ * - **Node 25 fails too, and a floor cannot say that.** `>=24.15.0` accepts
40
+ * 25.x, which that range skips entirely. Odd-numbered Node lines are never
41
+ * LTS and libraries routinely omit them, so the gap is normal rather than an
42
+ * oversight — and a single minimum version cannot express it.
43
+ *
44
+ * Node 22 is inside jsdom's range and deliberately *not* here: the repository
45
+ * has required 24 since long before this, and widening support is a decision,
46
+ * not a consequence of a dependency's range.
47
+ *
48
+ * Kept in step with `engines.node` across the root and every workspace by
49
+ * `tests/architecture/the-node-floor-is-one-number.test.ts`, with this
50
+ * package's own `engines` by `src/__tests__/node-version.test.ts`, and proved
51
+ * against real Nodes by `.github/workflows/installer.yml`, which pins 24.14
52
+ * (must refuse), 25 (must refuse) and 24.15 (must scaffold).
53
+ */
54
+ export declare const SUPPORTED_NODE_RANGES: readonly [{
55
+ readonly from: "24.15.0";
56
+ readonly belowMajor: 25;
57
+ }, {
58
+ readonly from: "26.0.0";
59
+ }];
60
+ /** The oldest Node the install accepts — the first range's start. */
61
+ export declare const REQUIRED_NODE_VERSION: "24.15.0";
62
+ /**
63
+ * The same thing in the notation `engines.node` uses, so one constant can be
64
+ * compared against twenty-one manifests instead of being retyped into them.
30
65
  */
31
- export declare const REQUIRED_NODE_MAJOR = 24;
66
+ export declare const SUPPORTED_NODE_ENGINES_RANGE: string;
32
67
  export type NodeVersionVerdict = {
33
68
  kind: 'ok';
34
69
  } | {
@@ -39,16 +74,41 @@ export type NodeVersionVerdict = {
39
74
  message: string;
40
75
  };
41
76
  export interface NodeVersionCheck {
42
- /** As `process.version` gives it, e.g. `v22.22.3`. */
77
+ /** As `process.version` gives it, e.g. `v24.13.0`. */
43
78
  version: string;
44
79
  /** False when `--skip-install` means the wizard runs nothing itself. */
45
80
  willRunSetup: boolean;
46
81
  }
82
+ export interface NodeVersion {
83
+ major: number;
84
+ minor: number;
85
+ patch: number;
86
+ /**
87
+ * The `-nightly`/`-rc.1` tail, without its dash. Kept because dropping it
88
+ * would make a prerelease compare equal to the release it precedes, and
89
+ * semver puts it *below*: `24.15.0-nightly` does not satisfy `^24.15.0`.
90
+ * npm checks engines with `includePrerelease: true`, which changes which
91
+ * prereleases pass but not that one — so ignoring the tail would accept a
92
+ * Node whose `npm install` fails, which is this whole exercise again.
93
+ */
94
+ prerelease?: string;
95
+ }
47
96
  /**
48
97
  * Returns undefined for anything that is not a recognisable Node version, so
49
- * an unexpected format cannot be read as "too old" and block an install that
50
- * would have worked.
98
+ * an unexpected format cannot be read as unsupported and block an install that
99
+ * would have worked. A version missing its patch digit counts as unreadable
100
+ * for the same reason: guessing `.0` would refuse a release that may be fine.
101
+ */
102
+ export declare function parseNodeVersion(version: string): NodeVersion | undefined;
103
+ export declare function formatNodeVersion({ major, minor, patch, prerelease, }: NodeVersion): string;
104
+ /**
105
+ * Whether a version falls inside any supported range.
106
+ *
107
+ * A range with `belowMajor` is closed at that major (`^24.15.0`); one without
108
+ * is open above (`>=26.0.0`). An unparseable range entry cannot happen — the
109
+ * table is a literal in this file — but it fails *open* if it ever does,
110
+ * matching `parseNodeVersion`.
51
111
  */
52
- export declare function parseNodeMajor(version: string): number | undefined;
112
+ export declare function isSupportedNodeVersion(version: NodeVersion): boolean;
53
113
  export declare function checkNodeVersion({ version, willRunSetup, }: NodeVersionCheck): NodeVersionVerdict;
54
114
  //# sourceMappingURL=node-version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-version.d.ts","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,GACb,EAAE,gBAAgB,GAAG,kBAAkB,CAkCvC"}
1
+ {"version":3,"file":"node-version.d.ts","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,qBAAqB;;;;;EAGxB,CAAC;AAEX,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,WAAgC,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAE3B,CAAC;AAWf,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAazE;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,KAAK,EACL,UAAU,GACX,EAAE,WAAW,GAAG,MAAM,CAGtB;AAqBD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAWpE;AA6CD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,GACb,EAAE,gBAAgB,GAAG,kBAAkB,CA4CvC"}
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Whether this Node can be used to create a Ragen installation.
4
4
  *
5
- * The distinction that matters: **the installation** needs Node 24, not this
6
- * CLI. The CLI itself runs happily on older majors — it was published and
5
+ * The distinction that matters: **the installation** needs a recent Node, not
6
+ * this CLI. The CLI itself runs happily on older majors — it was published and
7
7
  * verified on Node 22 by accident — so refusing on the grounds that "this
8
8
  * tool requires Node 24" would be both untrue and unhelpfully broad.
9
9
  *
@@ -19,43 +19,172 @@
19
19
  *
20
20
  * - running the setup steps → refuse, before anything is cloned
21
21
  * - `--skip-install` → proceed, because nothing runs here; warn instead,
22
- * since the scaffolded app still needs Node 24 to start
22
+ * since the scaffolded app still needs a supported Node to start
23
23
  *
24
24
  * `--yes` deliberately does not bypass it. That flag means "accept the
25
25
  * defaults", not "ignore a requirement".
26
26
  */
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.REQUIRED_NODE_MAJOR = void 0;
29
- exports.parseNodeMajor = parseNodeMajor;
28
+ exports.SUPPORTED_NODE_ENGINES_RANGE = exports.REQUIRED_NODE_VERSION = exports.SUPPORTED_NODE_RANGES = void 0;
29
+ exports.parseNodeVersion = parseNodeVersion;
30
+ exports.formatNodeVersion = formatNodeVersion;
31
+ exports.isSupportedNodeVersion = isSupportedNodeVersion;
30
32
  exports.checkNodeVersion = checkNodeVersion;
31
33
  /**
32
- * Kept in step with this package's `engines.node` by
33
- * `src/__tests__/node-version.test.ts`, and with the repository's own Node
34
- * version documented in AGENTS.md ("Node.js 24.x (Active LTS)").
34
+ * What the install actually runs on — a set of ranges, not a floor, and both
35
+ * the patch digit and the gap are load-bearing.
36
+ *
37
+ * A bare major used to be enough, and stopped being enough when a transitive
38
+ * dependency narrowed its own range mid-line. `jsdom@30.0.1` requires
39
+ * `^22.22.2 || ^24.15.0 || >=26.0.0`, and the repository sets
40
+ * `engine-strict=true`, so npm *stops* on a mismatch rather than warning.
41
+ * Two consequences, and only the first was obvious:
42
+ *
43
+ * - **Node 24.0–24.14 fail `npm install`.** The old `>=24` check waved them
44
+ * through, so someone on 24.13 got a cloned tree, a written `.env.local`, a
45
+ * running docker compose, and then EBADENGINE.
46
+ * - **Node 25 fails too, and a floor cannot say that.** `>=24.15.0` accepts
47
+ * 25.x, which that range skips entirely. Odd-numbered Node lines are never
48
+ * LTS and libraries routinely omit them, so the gap is normal rather than an
49
+ * oversight — and a single minimum version cannot express it.
50
+ *
51
+ * Node 22 is inside jsdom's range and deliberately *not* here: the repository
52
+ * has required 24 since long before this, and widening support is a decision,
53
+ * not a consequence of a dependency's range.
54
+ *
55
+ * Kept in step with `engines.node` across the root and every workspace by
56
+ * `tests/architecture/the-node-floor-is-one-number.test.ts`, with this
57
+ * package's own `engines` by `src/__tests__/node-version.test.ts`, and proved
58
+ * against real Nodes by `.github/workflows/installer.yml`, which pins 24.14
59
+ * (must refuse), 25 (must refuse) and 24.15 (must scaffold).
60
+ */
61
+ exports.SUPPORTED_NODE_RANGES = [
62
+ { from: '24.15.0', belowMajor: 25 },
63
+ { from: '26.0.0' },
64
+ ];
65
+ /** The oldest Node the install accepts — the first range's start. */
66
+ exports.REQUIRED_NODE_VERSION = exports.SUPPORTED_NODE_RANGES[0].from;
67
+ /**
68
+ * The same thing in the notation `engines.node` uses, so one constant can be
69
+ * compared against twenty-one manifests instead of being retyped into them.
70
+ */
71
+ exports.SUPPORTED_NODE_ENGINES_RANGE = exports.SUPPORTED_NODE_RANGES.map((range) => ('belowMajor' in range ? `^${range.from}` : `>=${range.from}`)).join(' || ');
72
+ /**
73
+ * Why the range is shaped the way it is. Named in the refusal, because
74
+ * "you need 24.15" read by someone who *has* Node 24 is a riddle, not an
75
+ * instruction — and "you need 24.15 or newer" read by someone on Node 25 is
76
+ * simply wrong.
35
77
  */
36
- exports.REQUIRED_NODE_MAJOR = 24;
78
+ const REQUIRED_NODE_REASON = 'jsdom, a transitive dependency, requires ^22.22.2 || ^24.15.0 || >=26.0.0, and this repository sets engine-strict=true — so npm stops rather than warns.';
37
79
  /**
38
80
  * Returns undefined for anything that is not a recognisable Node version, so
39
- * an unexpected format cannot be read as "too old" and block an install that
40
- * would have worked.
81
+ * an unexpected format cannot be read as unsupported and block an install that
82
+ * would have worked. A version missing its patch digit counts as unreadable
83
+ * for the same reason: guessing `.0` would refuse a release that may be fine.
41
84
  */
42
- function parseNodeMajor(version) {
43
- const match = /^v?(\d+)\./.exec(version.trim());
85
+ function parseNodeVersion(version) {
86
+ const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/.exec(version.trim());
44
87
  if (!match) {
45
88
  return undefined;
46
89
  }
47
- return Number(match[1]);
90
+ return {
91
+ major: Number(match[1]),
92
+ minor: Number(match[2]),
93
+ patch: Number(match[3]),
94
+ ...(match[4] === undefined ? {} : { prerelease: match[4] }),
95
+ };
96
+ }
97
+ function formatNodeVersion({ major, minor, patch, prerelease, }) {
98
+ const base = `${major}.${minor}.${patch}`;
99
+ return prerelease === undefined ? base : `${base}-${prerelease}`;
100
+ }
101
+ /**
102
+ * Negative when `a` is older than `b`, positive when newer, 0 when equal.
103
+ *
104
+ * Prereleases follow semver: `24.15.0-rc.1` is *older* than `24.15.0`, which
105
+ * is the rule that matters here — it is what makes a prerelease of a range's
106
+ * starting version fall outside that range, exactly as npm finds it.
107
+ * Prereleases are not ordered against each other, because nothing here needs
108
+ * it: a version either reaches a range's start or it does not.
109
+ */
110
+ function compareNodeVersions(a, b) {
111
+ const numeric = a.major - b.major || a.minor - b.minor || a.patch - b.patch;
112
+ if (numeric !== 0) {
113
+ return numeric;
114
+ }
115
+ const aPre = a.prerelease === undefined ? 0 : -1;
116
+ const bPre = b.prerelease === undefined ? 0 : -1;
117
+ return aPre - bPre;
118
+ }
119
+ /**
120
+ * Whether a version falls inside any supported range.
121
+ *
122
+ * A range with `belowMajor` is closed at that major (`^24.15.0`); one without
123
+ * is open above (`>=26.0.0`). An unparseable range entry cannot happen — the
124
+ * table is a literal in this file — but it fails *open* if it ever does,
125
+ * matching `parseNodeVersion`.
126
+ */
127
+ function isSupportedNodeVersion(version) {
128
+ return exports.SUPPORTED_NODE_RANGES.some((range) => {
129
+ const from = parseNodeVersion(range.from);
130
+ if (!from) {
131
+ return true;
132
+ }
133
+ if (compareNodeVersions(version, from) < 0) {
134
+ return false;
135
+ }
136
+ return !('belowMajor' in range) || version.major < range.belowMajor;
137
+ });
138
+ }
139
+ /**
140
+ * One deliberate difference from npm, in the safe direction.
141
+ *
142
+ * npm passes `includePrerelease: true`, under which `25.0.0-rc.1` satisfies
143
+ * `^24.15.0` — it sorts below the `<25.0.0` bound. The check here refuses it,
144
+ * because the *released* 25 line is unsupported and scaffolding onto a release
145
+ * candidate of it would work today and stop working at 25.0.0 final. The cases
146
+ * that matter agree with npm exactly: a prerelease of a range's own starting
147
+ * version (`24.15.0-nightly`, `26.0.0-rc.1`) is refused by both, and one above
148
+ * it (`24.16.0-rc.1`, `27.0.0-nightly`) is accepted by both.
149
+ */
150
+ /**
151
+ * A line the caller can paste. `nvm install`, not `nvm use`: someone in this
152
+ * position usually has *some* Node of that major already, and `nvm use 24`
153
+ * would select exactly the one that does not work.
154
+ */
155
+ const REMEDY = ` nvm install ${exports.REQUIRED_NODE_VERSION} # or fnm, volta, asdf, …`;
156
+ /**
157
+ * Whether this Node is below every supported range, or inside a gap between
158
+ * two of them. The distinction is the whole message: "too old" is actionable
159
+ * and "unsupported release line" is a different instruction.
160
+ */
161
+ function describeUnsupported(version) {
162
+ const floor = parseNodeVersion(exports.REQUIRED_NODE_VERSION);
163
+ const tooOld = floor ? compareNodeVersions(version, floor) < 0 : false;
164
+ const current = formatNodeVersion(version);
165
+ // A prerelease reads as a supported version to the eye, so the message has
166
+ // to say which part of it is the problem — otherwise the number in the
167
+ // refusal looks identical to the number in the requirement.
168
+ if (version.prerelease !== undefined) {
169
+ return `Node ${current} is a prerelease, and a Ragen installation needs ${exports.SUPPORTED_NODE_ENGINES_RANGE}. semver sorts a prerelease below the release it precedes, so ${current} does not satisfy that range and npm will refuse it — use a released Node.`;
170
+ }
171
+ if (tooOld) {
172
+ return `A Ragen installation needs Node ${exports.SUPPORTED_NODE_ENGINES_RANGE}, and this is Node ${current}.`;
173
+ }
174
+ return `Node ${current} is newer than the minimum and still not supported: a Ragen installation needs ${exports.SUPPORTED_NODE_ENGINES_RANGE}, which skips the ${version.major}.x line. Odd-numbered Node lines never become LTS, and libraries routinely omit them.`;
48
175
  }
49
176
  function checkNodeVersion({ version, willRunSetup, }) {
50
- const major = parseNodeMajor(version);
51
- if (major === undefined || major >= exports.REQUIRED_NODE_MAJOR) {
177
+ const current = parseNodeVersion(version);
178
+ if (current === undefined || isSupportedNodeVersion(current)) {
52
179
  return { kind: 'ok' };
53
180
  }
181
+ const headline = describeUnsupported(current);
54
182
  if (!willRunSetup) {
55
183
  return {
56
184
  kind: 'warn',
57
185
  message: [
58
- `You are on Node ${major}, and a Ragen installation needs Node ${exports.REQUIRED_NODE_MAJOR}.`,
186
+ headline,
187
+ REQUIRED_NODE_REASON,
59
188
  'Nothing is being installed here, so the files will be written anyway —',
60
189
  'but switch before running npm install or the app in the new directory.',
61
190
  ].join(' '),
@@ -64,14 +193,21 @@ function checkNodeVersion({ version, willRunSetup, }) {
64
193
  return {
65
194
  kind: 'refuse',
66
195
  message: [
67
- `A Ragen installation needs Node ${exports.REQUIRED_NODE_MAJOR}, and this is Node ${major}.`,
196
+ headline,
197
+ '',
198
+ // The reason comes second and in full, because the interesting cases are
199
+ // someone who already has the right major and someone on a *newer* Node,
200
+ // both of whom read the line above as nonsense without it.
201
+ `Why: ${REQUIRED_NODE_REASON}`,
202
+ 'On this Node, npm install fails with EBADENGINE partway through the',
203
+ 'setup below.',
68
204
  '',
69
205
  'Stopping before anything is written: the setup this runs for you —',
70
206
  'npm install, prisma generate, migrate and seed — would run under this',
71
207
  'Node and leave a tree that fails later, somewhere that does not point',
72
208
  'back here.',
73
209
  '',
74
- ` nvm use ${exports.REQUIRED_NODE_MAJOR} # or fnm, volta, asdf, …`,
210
+ REMEDY,
75
211
  '',
76
212
  'Or pass --skip-install to write the files now and run the setup',
77
213
  'yourself on a supported Node.',
@@ -1 +1 @@
1
- {"version":3,"file":"node-version.js","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;;AA0BH,wCAMC;AAED,4CAqCC;AArED;;;;GAIG;AACU,QAAA,mBAAmB,GAAG,EAAE,CAAC;AActC;;;;GAIG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,GACK;IACjB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,2BAAmB,EAAE,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,mBAAmB,KAAK,yCAAyC,2BAAmB,GAAG;gBACvF,wEAAwE;gBACxE,wEAAwE;aACzE,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,mCAAmC,2BAAmB,sBAAsB,KAAK,GAAG;YACpF,EAAE;YACF,oEAAoE;YACpE,uEAAuE;YACvE,uEAAuE;YACvE,YAAY;YACZ,EAAE;YACF,aAAa,2BAAmB,6BAA6B;YAC7D,EAAE;YACF,iEAAiE;YACjE,+BAA+B;SAChC,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"node-version.js","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"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"}
package/dist/tasks.d.ts CHANGED
@@ -15,20 +15,110 @@ export interface MigrateOptions {
15
15
  }
16
16
  export declare function isDockerAvailable(): Promise<boolean>;
17
17
  /**
18
- * Whether this Docker daemon already runs a Ragen stack.
18
+ * Compose takes its project name from the **directory basename**, which is not
19
+ * the same as being unique per install.
19
20
  *
20
- * docker-compose.yml pins container, volume and network names instead of
21
- * letting Compose prefix them per project, so a second install does not just
22
- * collide on the container names — it silently attaches to the *same*
23
- * postgres and qdrant volumes as the first one. Checking the volume rather
24
- * than a container catches a stack that is merely stopped, which is the
25
- * case that looks safest and is not.
21
+ * Removing the pinned `container_name`/volume `name:` from docker-compose.yml
22
+ * scopes every resource to the project, and that is what lets two checkouts
23
+ * coexist. But `/work/a/ragen` and `/work/b/ragen` produce the same project
24
+ * name, and therefore the same containers, volumes and network — the original
25
+ * bug, narrowed to same-named directories rather than fixed. Worse than the
26
+ * port collision, because a *stopped* first stack collides silently: no port
27
+ * is held, nothing refuses, and the second install opens the first one's
28
+ * database.
26
29
  *
27
- * Reads RAGEN_STACK_NAME for the same reason compose does: someone already
28
- * running a stack under a name of their own would otherwise be told their
29
- * machine is clear, and collide with it.
30
+ * So the name is decided here, at install time, and written to the new tree's
31
+ * `.env` — which Compose reads from the project directory on every later
32
+ * `docker compose` the user runs, with no flag to remember. `.env` is the
33
+ * lowest-precedence file `scripts/load-root-env.mjs` reads and is gitignored,
34
+ * and nothing in the apps reads `COMPOSE_PROJECT_NAME`, so it cannot collide
35
+ * with the install's own configuration.
36
+ *
37
+ * The basename is kept whenever it is free, because the readability given up
38
+ * with the pinned names is worth not giving up twice. A suffix appears only
39
+ * when this daemon already runs a project of that name from somewhere else.
40
+ */
41
+ export interface ComposeProjectName {
42
+ name: string;
43
+ /** True when the plain basename was taken and a suffix was added. */
44
+ disambiguated: boolean;
45
+ /** The compose file of the project that took it, for the message. */
46
+ takenBy?: string;
47
+ /**
48
+ * True when the suffix was added because Docker could not be asked, rather
49
+ * than because a collision was seen. A different sentence to the reader:
50
+ * nothing is wrong, and the name is cautious rather than forced.
51
+ */
52
+ daemonUnreachable?: boolean;
53
+ }
54
+ /**
55
+ * Compose accepts `[a-z0-9][a-z0-9_-]*`. A directory called `My Ragen!` or
56
+ * `.ragen` is perfectly legal and would otherwise make every compose command
57
+ * fail with a validation error after the install had finished.
58
+ */
59
+ export declare function normalizeComposeProjectName(raw: string): string;
60
+ export declare function resolveComposeProjectName(targetDir: string): Promise<ComposeProjectName>;
61
+ /**
62
+ * Every host port a default `docker compose up` publishes, with the variable
63
+ * that moves it. The order is the order the warning prints them in.
64
+ *
65
+ * Defaults are duplicated from docker-compose.yml rather than parsed out of
66
+ * it, because this runs *before* the repository is cloned — there is no file
67
+ * to read yet. `ports-agree-with-compose.test.ts` holds the two in step.
68
+ */
69
+ export declare const PUBLISHED_PORTS: readonly [{
70
+ readonly service: "Postgres";
71
+ readonly variable: "POSTGRES_PORT";
72
+ readonly port: 55432;
73
+ }, {
74
+ readonly service: "Qdrant";
75
+ readonly variable: "QDRANT_PORT";
76
+ readonly port: 6333;
77
+ }, {
78
+ readonly service: "Qdrant (gRPC)";
79
+ readonly variable: "QDRANT_GRPC_PORT";
80
+ readonly port: 6334;
81
+ }, {
82
+ readonly service: "Docling";
83
+ readonly variable: "DOCLING_PORT";
84
+ readonly port: 5001;
85
+ }, {
86
+ readonly service: "Redis";
87
+ readonly variable: "REDIS_PORT";
88
+ readonly port: 56379;
89
+ }];
90
+ /** The two more, behind the `pii` profile, that only a masking install starts. */
91
+ export declare const PII_PUBLISHED_PORTS: readonly [{
92
+ readonly service: "Presidio analyzer";
93
+ readonly variable: "PRESIDIO_ANALYZER_PORT";
94
+ readonly port: 5002;
95
+ }, {
96
+ readonly service: "Presidio anonymizer";
97
+ readonly variable: "PRESIDIO_ANONYMIZER_PORT";
98
+ readonly port: 5003;
99
+ }];
100
+ export interface PublishedPort {
101
+ service: string;
102
+ variable: string;
103
+ port: number;
104
+ }
105
+ /**
106
+ * Which of these host ports something is already listening on.
107
+ *
108
+ * This replaces a check for the volume `ragen-postgres-data`. That volume name
109
+ * was pinned in docker-compose.yml, which is what made a second install share
110
+ * the first one's database — and removing the pin removed the sharing, so the
111
+ * old check now answers a question nobody is asking and would answer "clear"
112
+ * for every install made after the change. A guard that quietly stops firing
113
+ * is worse than no guard.
114
+ *
115
+ * Ports are what is genuinely left: Compose prefixes names per project, and
116
+ * prefixes nothing about a published port, so two stacks still collide on
117
+ * 55432. Binding is also a better probe than asking Docker — it sees a native
118
+ * Postgres on the port as well, which is the other way this install ends up
119
+ * talking to a database it did not start.
30
120
  */
31
- export declare function ragenStackVolumeExists(): Promise<boolean>;
121
+ export declare function busyPublishedPorts(candidates?: readonly PublishedPort[]): Promise<PublishedPort[]>;
32
122
  /**
33
123
  * `profiles` names compose profiles to add to the default set.
34
124
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAU1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAgB/D;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,GAAG,EACH,QAAa,GACd,EAAE,UAAU,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED,wBAAsB,mBAAmB,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,oBAAoB,CAAC,EACzC,GAAG,EACH,GAAG,GACJ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5B;AAED,wBAAsB,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EACxB,EAAE,OAAW,EAAE,YAAmB,EAAE,GAAE,cAAmB,GACxD,OAAO,CAAC,IAAI,CAAC,CAsBf"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAU1D;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/D;AA4BD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;EAMlB,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,mBAAmB;;;;;;;;EAWtB,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,GAAE,SAAS,aAAa,EAAoB,GACrD,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B;AAyBD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,GAAG,EACH,QAAa,GACd,EAAE,UAAU,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED,wBAAsB,mBAAmB,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,oBAAoB,CAAC,EACzC,GAAG,EACH,GAAG,GACJ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5B;AAED,wBAAsB,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EACxB,EAAE,OAAW,EAAE,YAAmB,EAAE,GAAE,cAAmB,GACxD,OAAO,CAAC,IAAI,CAAC,CAsBf"}
package/dist/tasks.js CHANGED
@@ -1,12 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PII_PUBLISHED_PORTS = exports.PUBLISHED_PORTS = void 0;
3
4
  exports.isDockerAvailable = isDockerAvailable;
4
- exports.ragenStackVolumeExists = ragenStackVolumeExists;
5
+ exports.normalizeComposeProjectName = normalizeComposeProjectName;
6
+ exports.resolveComposeProjectName = resolveComposeProjectName;
7
+ exports.busyPublishedPorts = busyPublishedPorts;
5
8
  exports.startDockerServices = startDockerServices;
6
9
  exports.installDependencies = installDependencies;
7
10
  exports.generatePrismaClient = generatePrismaClient;
8
11
  exports.seedDatabase = seedDatabase;
9
12
  exports.migrateDatabase = migrateDatabase;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const node_net_1 = require("node:net");
15
+ const node_path_1 = require("node:path");
10
16
  const execa_1 = require("execa");
11
17
  async function isDockerAvailable() {
12
18
  try {
@@ -21,31 +27,148 @@ async function isDockerAvailable() {
21
27
  }
22
28
  }
23
29
  /**
24
- * Whether this Docker daemon already runs a Ragen stack.
30
+ * Compose accepts `[a-z0-9][a-z0-9_-]*`. A directory called `My Ragen!` or
31
+ * `.ragen` is perfectly legal and would otherwise make every compose command
32
+ * fail with a validation error after the install had finished.
33
+ */
34
+ function normalizeComposeProjectName(raw) {
35
+ const cleaned = raw
36
+ .toLowerCase()
37
+ .replace(/[^a-z0-9_-]+/g, '-')
38
+ .replace(/^[^a-z0-9]+/, '')
39
+ .replace(/-+$/, '');
40
+ return cleaned || 'ragen';
41
+ }
42
+ /** Six hex characters of the absolute path — stable for this directory. */
43
+ function pathSuffix(absoluteDir) {
44
+ return (0, node_crypto_1.createHash)('sha256').update(absoluteDir).digest('hex').slice(0, 6);
45
+ }
46
+ /**
47
+ * Whether a compose file belongs to the install in `absoluteDir`.
25
48
  *
26
- * docker-compose.yml pins container, volume and network names instead of
27
- * letting Compose prefix them per project, so a second install does not just
28
- * collide on the container names — it silently attaches to the *same*
29
- * postgres and qdrant volumes as the first one. Checking the volume rather
30
- * than a container catches a stack that is merely stopped, which is the
31
- * case that looks safest and is not.
49
+ * `relative()` rather than a `startsWith(dir + '/')` prefix test, for two
50
+ * reasons: on Windows `resolve()` returns backslashes, so a forward-slash
51
+ * prefix never matches and every re-run would look like a collision — which
52
+ * renames the stack and abandons its volumes, the worst outcome available
53
+ * here. And a prefix test is true for `/work/ragen-app-2` against
54
+ * `/work/ragen-app` unless the separator is appended exactly right.
32
55
  *
33
- * Reads RAGEN_STACK_NAME for the same reason compose does: someone already
34
- * running a stack under a name of their own would otherwise be told their
35
- * machine is clear, and collide with it.
56
+ * A file *inside* the directory counts, at any depth: `-f infra/compose.yml`
57
+ * is a legitimate way to run this stack, and treating it as someone else's
58
+ * project is the same destructive mistake.
36
59
  */
37
- async function ragenStackVolumeExists() {
38
- const stackName = process.env.RAGEN_STACK_NAME?.trim() || 'ragen';
39
- const postgresVolume = `${stackName}-postgres-data`;
60
+ function isInsideDirectory(file, absoluteDir) {
61
+ const path = (0, node_path_1.relative)(absoluteDir, (0, node_path_1.resolve)(file.trim()));
62
+ // `..` means outside; an absolute result means a different Windows drive,
63
+ // where "inside" is not a question that has a yes.
64
+ return !path.startsWith('..') && !(0, node_path_1.isAbsolute)(path);
65
+ }
66
+ async function resolveComposeProjectName(targetDir) {
67
+ const absoluteDir = (0, node_path_1.resolve)(targetDir);
68
+ const base = normalizeComposeProjectName((0, node_path_1.basename)(absoluteDir));
69
+ const suffixed = `${base}-${pathSuffix(absoluteDir)}`;
70
+ let projects = [];
40
71
  try {
41
- const { stdout } = await (0, execa_1.execa)('docker', ['volume', 'ls', '--format', '{{.Name}}'], { timeout: 10_000 });
42
- return stdout.split('\n').some((name) => name.trim() === postgresVolume);
72
+ const { stdout } = await (0, execa_1.execa)('docker', ['compose', 'ls', '--all', '--format', 'json'], { timeout: 10_000 });
73
+ projects = JSON.parse(stdout);
43
74
  }
44
75
  catch {
45
- // Same reasoning as isDockerAvailable: an unreachable daemon is not a
46
- // reason to fail, the caller is about to find that out anyway.
47
- return false;
76
+ // An unreachable daemon, or a Compose too old for `ls --format json`.
77
+ //
78
+ // The plain basename is *not* the safe answer here, which is what it first
79
+ // looked like. A daemon that cannot be reached still holds the volumes of
80
+ // every install made before it stopped, and they collide as soon as it
81
+ // starts — so falling back to the basename fails in the silent, expensive
82
+ // direction: a second install quietly opening the first one's database.
83
+ // The suffix fails in the visible, cheap one: a less pretty name in
84
+ // `docker ps`.
85
+ return { name: suffixed, disambiguated: true, daemonUnreachable: true };
48
86
  }
87
+ // A project whose compose files live under *this* directory is this install
88
+ // — a re-run of the wizard over an existing tree — and must keep its name,
89
+ // or the second run would point at empty volumes.
90
+ const collision = projects.find((project) => project.Name === base &&
91
+ !(project.ConfigFiles ?? '')
92
+ .split(',')
93
+ .some((file) => isInsideDirectory(file, absoluteDir)));
94
+ if (!collision) {
95
+ return { name: base, disambiguated: false };
96
+ }
97
+ return {
98
+ name: suffixed,
99
+ disambiguated: true,
100
+ takenBy: collision.ConfigFiles?.split(',')[0]?.trim(),
101
+ };
102
+ }
103
+ /**
104
+ * Every host port a default `docker compose up` publishes, with the variable
105
+ * that moves it. The order is the order the warning prints them in.
106
+ *
107
+ * Defaults are duplicated from docker-compose.yml rather than parsed out of
108
+ * it, because this runs *before* the repository is cloned — there is no file
109
+ * to read yet. `ports-agree-with-compose.test.ts` holds the two in step.
110
+ */
111
+ exports.PUBLISHED_PORTS = [
112
+ { service: 'Postgres', variable: 'POSTGRES_PORT', port: 55432 },
113
+ { service: 'Qdrant', variable: 'QDRANT_PORT', port: 6333 },
114
+ { service: 'Qdrant (gRPC)', variable: 'QDRANT_GRPC_PORT', port: 6334 },
115
+ { service: 'Docling', variable: 'DOCLING_PORT', port: 5001 },
116
+ { service: 'Redis', variable: 'REDIS_PORT', port: 56379 },
117
+ ];
118
+ /** The two more, behind the `pii` profile, that only a masking install starts. */
119
+ exports.PII_PUBLISHED_PORTS = [
120
+ {
121
+ service: 'Presidio analyzer',
122
+ variable: 'PRESIDIO_ANALYZER_PORT',
123
+ port: 5002,
124
+ },
125
+ {
126
+ service: 'Presidio anonymizer',
127
+ variable: 'PRESIDIO_ANONYMIZER_PORT',
128
+ port: 5003,
129
+ },
130
+ ];
131
+ /**
132
+ * Which of these host ports something is already listening on.
133
+ *
134
+ * This replaces a check for the volume `ragen-postgres-data`. That volume name
135
+ * was pinned in docker-compose.yml, which is what made a second install share
136
+ * the first one's database — and removing the pin removed the sharing, so the
137
+ * old check now answers a question nobody is asking and would answer "clear"
138
+ * for every install made after the change. A guard that quietly stops firing
139
+ * is worse than no guard.
140
+ *
141
+ * Ports are what is genuinely left: Compose prefixes names per project, and
142
+ * prefixes nothing about a published port, so two stacks still collide on
143
+ * 55432. Binding is also a better probe than asking Docker — it sees a native
144
+ * Postgres on the port as well, which is the other way this install ends up
145
+ * talking to a database it did not start.
146
+ */
147
+ async function busyPublishedPorts(candidates = exports.PUBLISHED_PORTS) {
148
+ const results = await Promise.all(candidates.map(async (candidate) => (await isPortInUse(candidate.port)) ? candidate : undefined));
149
+ return results.filter((candidate) => Boolean(candidate));
150
+ }
151
+ /**
152
+ * Loopback only, because that is where docker-compose.yml publishes
153
+ * (`RAGEN_BIND_ADDR` defaults to 127.0.0.1). Anything other than EADDRINUSE —
154
+ * a permission error, a system without IPv4 loopback — reports "free": the
155
+ * cost of a missed warning is a compose error the caller then reads, and the
156
+ * cost of a false one is telling someone their machine is occupied when it is
157
+ * not.
158
+ */
159
+ function isPortInUse(port) {
160
+ return new Promise((resolve) => {
161
+ const server = (0, node_net_1.createServer)();
162
+ server.once('error', (error) => {
163
+ resolve(error.code === 'EADDRINUSE');
164
+ });
165
+ server.once('listening', () => {
166
+ server.close(() => {
167
+ resolve(false);
168
+ });
169
+ });
170
+ server.listen(port, '127.0.0.1');
171
+ });
49
172
  }
50
173
  /**
51
174
  * `profiles` names compose profiles to add to the default set.
package/dist/tasks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ragen-app",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "private": false,
5
5
  "description": "Scaffold a self-hosted Ragen AI installation with one command",
6
6
  "license": "Apache-2.0",
@@ -39,6 +39,6 @@
39
39
  "typescript": "~5.7.0"
40
40
  },
41
41
  "engines": {
42
- "node": ">=24"
42
+ "node": "^24.15.0 || >=26.0.0"
43
43
  }
44
44
  }