@lenne.tech/cli 1.19.0 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/commands.md CHANGED
@@ -12,6 +12,8 @@ This document provides a comprehensive reference for all `lt` CLI commands. For
12
12
 
13
13
  - [CLI Commands](#cli-commands)
14
14
  - [Server Commands](#server-commands)
15
+ - [Local Development Commands](#local-development-commands)
16
+ - [Ports Commands](#ports-commands)
15
17
  - [Git Commands](#git-commands)
16
18
  - [Fullstack Commands](#fullstack-commands)
17
19
  - [Deployment Commands](#deployment-commands)
@@ -67,7 +69,7 @@ lt cli rename <new-name>
67
69
 
68
70
  ### `lt server create`
69
71
 
70
- Creates a new NestJS server project.
72
+ Creates a new standalone NestJS server project in a sibling directory. For an in-workspace API, prefer [`lt fullstack add-api`](#lt-fullstack-add-api).
71
73
 
72
74
  **Usage:**
73
75
  ```bash
@@ -77,17 +79,27 @@ lt server create [name] [options]
77
79
  **Options:**
78
80
  | Option | Description |
79
81
  |--------|-------------|
82
+ | `--name <name>` | Server name (preferred over the positional argument) |
80
83
  | `--description <text>` | Project description |
81
84
  | `--author <name>` | Author name |
82
85
  | `--api-mode <Rest\|GraphQL\|Both>` | API mode (ignored with `--next`) |
83
86
  | `--framework-mode <npm\|vendor>` | Framework consumption mode (ignored with `--next`) |
87
+ | `--framework-upstream-branch <ref>` | Upstream `nest-server` branch/tag/commit to vendor (only with `--framework-mode vendor`) |
84
88
  | `--branch <branch>` / `-b` | Branch of nest-server-starter to use as template |
85
89
  | `--copy <path>` / `-c` | Copy from local template directory instead of cloning |
86
90
  | `--link <path>` | Symlink to local template directory (fastest, changes affect original) |
87
91
  | `--git` | Initialize git repository |
88
92
  | `--next` | **Experimental:** clone [`nest-base`](https://github.com/lenneTech/nest-base) (Bun + Prisma 7 + Postgres + Better-Auth) instead of `nest-server-starter`. Skips API-mode / vendor-mode / install / lt.config.json processing. |
93
+ | `--dry-run` | Print the resolved plan and exit without making any changes |
94
+ | `--force` | Override the workspace-detection abort under `--noConfirm` |
89
95
  | `--noConfirm` | Skip confirmation prompts |
90
96
 
97
+ **Workspace-awareness:** When run inside a directory that already looks like a fullstack workspace (contains `pnpm-workspace.yaml` or `projects/`), the command behaves differently per mode:
98
+
99
+ - **interactive** → asks for confirmation before creating a stray standalone clone
100
+ - **`--noConfirm` without `--force`** → **refuses** with exit code 1 and points the caller to `lt fullstack add-api`. This is the default behaviour for AI agents and CI scripts: fail loud rather than produce a stray clone that pnpm-workspace.yaml does not pick up.
101
+ - **`--noConfirm --force`** → proceeds and logs a hint so the override is visible in CI logs.
102
+
91
103
  **CLAUDE.md Patching:** If the project contains a `CLAUDE.md`, the generic API mode description is replaced with the selected mode. In single-mode projects (`Rest` or `GraphQL`), the "API Mode System" documentation section is condensed to a brief note. Skipped when `--next` is used.
92
104
 
93
105
  **Configuration:** `commands.server.create.*`, `defaults.author`, `defaults.noConfirm`
@@ -272,6 +284,193 @@ For mode-aware update workflows after conversion, use:
272
284
 
273
285
  ---
274
286
 
287
+ ## Local Development Commands
288
+
289
+ Orchestrate parallel lt projects on the same machine without port collisions. Each project gets a deterministic port slot derived from its slug; API/App ports are always slot-paired (`3000+slot*10` / `3001+slot*10`). Slot allocation is reproducible across machines (FNV-1a hash) and persisted in `~/.lenneTech/ports.json`.
290
+
291
+ ### `lt local`
292
+
293
+ Open the local-orchestration submenu.
294
+
295
+ **Usage:**
296
+ ```bash
297
+ lt local
298
+ ```
299
+
300
+ **Alias:** `lt l`
301
+
302
+ ---
303
+
304
+ ### `lt local init`
305
+
306
+ Register the current project in the central port registry, optionally patching legacy hardcoded ports to be env-aware.
307
+
308
+ **Usage:**
309
+ ```bash
310
+ lt local init [options]
311
+ ```
312
+
313
+ **Alias:** `lt l i`
314
+
315
+ **Options:**
316
+ | Option | Description |
317
+ |--------|-------------|
318
+ | `--slot <n>` | Force a specific slot index (0..89) instead of the deterministic slug hash |
319
+ | `--patch` | Apply env-aware port patches non-interactively |
320
+ | `--no-patch` | Skip the patch detection / prompt entirely |
321
+ | `--noConfirm` | Skip confirmation prompts (without `--patch`, patches are skipped) |
322
+
323
+ **What it does:**
324
+ 1. Detects the workspace layout (monorepo with `projects/api/` + `projects/app/`, or standalone API/App project).
325
+ 2. Looks up or allocates a slot via FNV-1a hash of the project slug. If the slot is taken, falls through linearly to the next free slot.
326
+ 3. Detects legacy hardcoded ports in `config.env.ts` (`port: 3000`), `nuxt.config.ts` (`port: 3001`, vite proxy `target: 'http://localhost:3000'`), and `playwright.config.ts` (`baseURL`/`host`/`url: 'http://localhost:3001'`). If `--patch` (or interactive confirm), rewrites them to env-overridable form (`Number(process.env.PORT) || 3000`, `process.env.NUXT_API_URL || …`, etc.) — defaults preserved, idempotent.
327
+ 4. Persists the entry to `~/.lenneTech/ports.json`.
328
+ 5. Adds `.lt-local/` to the project's `.gitignore`.
329
+ 6. Injects (or refreshes) a "Local Development (lt local)" port block into `CLAUDE.md` files at the workspace root and inside each subproject — bracketed by HTML comment markers so it can be replaced cleanly when ports change.
330
+
331
+ **Examples:**
332
+ ```bash
333
+ # Inside a workspace or standalone project
334
+ lt local init
335
+
336
+ # Force slot 5 for predictable cross-team ports
337
+ lt local init --slot 5 --noConfirm --patch
338
+
339
+ # Register without touching any source files
340
+ lt local init --no-patch --noConfirm
341
+ ```
342
+
343
+ ---
344
+
345
+ ### `lt local up`
346
+
347
+ Start the API + App with project-specific ports. Spawns `pnpm start` (api) and `pnpm dev` (app) detached; persists PIDs to `<root>/.lt-local/state.json`.
348
+
349
+ **Usage:**
350
+ ```bash
351
+ lt local up
352
+ ```
353
+
354
+ **Alias:** `lt l u`
355
+
356
+ **Environment variables injected into both children:**
357
+ | Variable | Consumer | Example value |
358
+ |----------|----------|---------------|
359
+ | `PORT` | Nest (api) / Nuxt dev server (app) | slot-derived |
360
+ | `BASE_URL` | nest-server config.env.ts (canonical API base) | `http://localhost:3030` |
361
+ | `APP_URL` | nest-server config.env.ts (frontend origin for redirects/CORS) | `http://localhost:3031` |
362
+ | `NUXT_API_URL` | Nuxt vite-proxy target for `/api`, `/iam`, … | `http://localhost:3030` |
363
+ | `NUXT_PUBLIC_API_URL` | Nuxt `useRuntimeConfig().public.apiUrl` | `http://localhost:3030` |
364
+ | `NUXT_PUBLIC_SITE_URL` | Nuxt `useRuntimeConfig().public.siteUrl` + Playwright | `http://localhost:3031` |
365
+ | `NUXT_PUBLIC_STORAGE_PREFIX` | namespaces sessionStorage/localStorage so parallel projects don't share auth tokens | `crm-local` |
366
+ | `NSC__MONGOOSE__URI` | nest-server-config Mongoose URI (only when `dbName` is known) | `mongodb://127.0.0.1/crm-local` |
367
+
368
+ **Override the binary** used for both spawns by setting `LT_PNPM_BIN` (e.g. `LT_PNPM_BIN=/usr/local/bin/pnpm lt local up`).
369
+
370
+ **Pre-flight guards (exit code 1 each):**
371
+ - Project not registered (`lt local init` first)
372
+ - Already running (run `lt local down` first)
373
+ - Port already in use by another process
374
+
375
+ **Logs:** `<root>/.lt-local/api.log`, `<root>/.lt-local/app.log` (append-mode).
376
+
377
+ ---
378
+
379
+ ### `lt local down`
380
+
381
+ Stop processes started by `lt local up`. Sends `SIGTERM` to the detached process group (negative PID) so descendants — Vite, the Nest watcher, etc. — receive the signal too. Falls back to single-PID kill if the process group send fails (`EPERM`).
382
+
383
+ **Usage:**
384
+ ```bash
385
+ lt local down
386
+ ```
387
+
388
+ **Alias:** `lt l d`
389
+
390
+ PID values from `state.json` are validated (positive integer in `[100, 2^31)`) before any signal is sent, so a tampered state file cannot cause `lt local down` to signal arbitrary process groups.
391
+
392
+ ---
393
+
394
+ ### `lt local status`
395
+
396
+ Show what is registered + running for the current project: slot, ports, db URI, PIDs (alive/dead), and live `lsof` state of the assigned ports.
397
+
398
+ **Usage:**
399
+ ```bash
400
+ lt local status
401
+ ```
402
+
403
+ **Alias:** `lt l s`
404
+
405
+ ---
406
+
407
+ ## Ports Commands
408
+
409
+ Inspect the port registry and currently-bound dev ports across all your lt projects. Useful for diagnosing collisions and rebuilding the registry from disk.
410
+
411
+ ### `lt ports`
412
+
413
+ List all reserved registry entries side-by-side with the live `lsof` state. Issues a single `lsof` call internally for the entire slot range (3000–3899) instead of per port — runs in ~150ms regardless of how many projects are registered.
414
+
415
+ **Usage:**
416
+ ```bash
417
+ lt ports
418
+ ```
419
+
420
+ **Alias:** `lt p`
421
+
422
+ **Output sections:**
423
+ 1. **Reserved ports (registry)** — every project entry with a `●` (bound) or `○` (free) indicator per port.
424
+ 2. **Currently bound dev ports (3000–3899)** — every port in the slot range that currently has a LISTEN socket, with command + PID + owning registry entry (if any).
425
+
426
+ ---
427
+
428
+ ### `lt ports check <port>`
429
+
430
+ Exit-coded port probe — useful in shell scripts.
431
+
432
+ **Usage:**
433
+ ```bash
434
+ lt ports check <port>
435
+ ```
436
+
437
+ **Exit codes:**
438
+ | Code | Meaning |
439
+ |------|---------|
440
+ | `0` | Port is free |
441
+ | `1` | Port is in use |
442
+ | `2` | `lsof` not available, or `<port>` argument missing/invalid |
443
+
444
+ **Example:**
445
+ ```bash
446
+ if lt ports check 3000; then
447
+ echo "API port free"
448
+ else
449
+ echo "API port already bound"
450
+ fi
451
+ ```
452
+
453
+ ---
454
+
455
+ ### `lt ports scan [dir]`
456
+
457
+ Rebuild the registry from the filesystem. Walks the given directory (default: cwd) up to depth 3, looking for `lt.config.json` + `package.json` pairs or workspace markers (`pnpm-workspace.yaml`, `projects/`). Re-allocates a slot for new projects; preserves slots for existing entries (only refreshing the path if it moved). Writes only when the registry actually changed (no mtime churn for cloud-sync tools).
458
+
459
+ **Usage:**
460
+ ```bash
461
+ lt ports scan [dir]
462
+ ```
463
+
464
+ **Examples:**
465
+ ```bash
466
+ lt ports scan # scan from cwd
467
+ lt ports scan ~/code/lenneTech # scan a specific tree
468
+ ```
469
+
470
+ Symlinks are skipped to avoid traversal loops; dotdirs and `node_modules` are not descended into.
471
+
472
+ ---
473
+
275
474
  ## Git Commands
276
475
 
277
476
  All git commands support the `--noConfirm` flag and can be configured via `defaults.noConfirm` or `commands.git.noConfirm`.
@@ -558,6 +757,82 @@ Additionally, the API's `CLAUDE.md` is patched to reflect the selected API mode
558
757
 
559
758
  **Configuration:** `commands.fullstack.*`, `defaults.noConfirm`
560
759
 
760
+ **Auto-detection in existing workspaces:** When `lt fullstack init` runs without a name argument inside a directory that already looks like a fullstack workspace (contains `pnpm-workspace.yaml` or `projects/`), it inspects the layout and dispatches to the matching incremental command:
761
+
762
+ - both `projects/api` and `projects/app` exist → refuses with a hint to use `add-api` / `add-app` directly
763
+ - only `projects/app` exists → delegates to `lt fullstack add-api` (with all original flags forwarded)
764
+ - only `projects/api` exists → delegates to `lt fullstack add-app`
765
+ - neither exists → falls through to the regular new-workspace flow
766
+
767
+ To force a brand-new workspace from inside an existing one, pass `--name <slug>`.
768
+
769
+ ---
770
+
771
+ ### `lt fullstack add-api`
772
+
773
+ Add a NestJS API (`projects/api/`) to an existing fullstack workspace that currently only contains a frontend (`projects/app/`). Mirrors every API-related flag from `lt fullstack init` so configuration stays consistent across both flows.
774
+
775
+ **Usage:**
776
+ ```bash
777
+ lt fullstack add-api [options]
778
+ ```
779
+
780
+ **Options:**
781
+ | Option | Description |
782
+ |--------|-------------|
783
+ | `--api-mode <mode>` | API mode: `Rest`, `GraphQL`, or `Both` |
784
+ | `--framework-mode <mode>` | Backend framework consumption mode: `npm` (classic) or `vendor` (core copied to `src/core/`) |
785
+ | `--framework-upstream-branch <ref>` | Upstream `nest-server` branch/tag/commit to vendor (only with `--framework-mode vendor`) |
786
+ | `--api-branch <branch>` | Branch of `nest-server-starter` to clone |
787
+ | `--api-copy <path>` | Copy API from a local template directory |
788
+ | `--api-link <path>` | Symlink API to a local template directory (fastest, changes affect original) |
789
+ | `--next` | **Experimental:** clone [`nest-base`](https://github.com/lenneTech/nest-base) (Bun + Prisma 7 + Postgres + Better-Auth) instead of `nest-server-starter`. Forces `--api-mode Rest` and `--framework-mode npm`, runs `bun run rename` post-clone, skips workspace install. |
790
+ | `--workspace-dir <path>` | Workspace root. When omitted, defaults to cwd; if cwd is not a workspace, the command walks up until it finds one (so it works from inside `projects/api/src/`). |
791
+ | `--skip-install` | Skip `pnpm install` and the post-install format pass |
792
+ | `--dry-run` | Print the resolved plan without making any changes |
793
+ | `--noConfirm` | Skip all interactive prompts |
794
+
795
+ **Refusal cases:**
796
+ - `projects/api/` already exists → suggests `lt fullstack init` in a fresh directory
797
+ - no workspace detected at the target path → asks the user to run `lt fullstack init` first
798
+
799
+ **Side effects:** writes `projects/api/lt.config.json` with the resolved `apiMode` + `frameworkMode`, hoists workspace-scoped `pnpm.overrides` from sub-projects to the root, runs `pnpm install` + `oxfmt` on the new sub-project (unless `--skip-install` is set).
800
+
801
+ **Configuration:** Reads `commands.fullstack.*` (same keys as `lt fullstack init`).
802
+
803
+ ---
804
+
805
+ ### `lt fullstack add-app`
806
+
807
+ Add a frontend app (`projects/app/`) to an existing fullstack workspace that currently only contains an API (`projects/api/`). Mirrors every frontend-related flag from `lt fullstack init`.
808
+
809
+ **Usage:**
810
+ ```bash
811
+ lt fullstack add-app [options]
812
+ ```
813
+
814
+ **Options:**
815
+ | Option | Description |
816
+ |--------|-------------|
817
+ | `--frontend <type>` | Frontend framework: `nuxt` or `angular` |
818
+ | `--frontend-framework-mode <mode>` | Frontend framework consumption mode: `npm` or `vendor` (nuxt-extensions copied to `app/core/`) |
819
+ | `--frontend-branch <branch>` | Branch of the frontend starter to clone (`ng-base-starter` or `nuxt-base-starter`) |
820
+ | `--frontend-copy <path>` | Copy frontend from a local template directory |
821
+ | `--frontend-link <path>` | Symlink frontend to a local template directory (fastest, changes affect original) |
822
+ | `--next` | Default the nuxt-base-starter ref to the `next` branch (auth `basePath` aligned with the experimental `--next` API) |
823
+ | `--workspace-dir <path>` | Workspace root. When omitted, defaults to cwd; if cwd is not a workspace, the command walks up until it finds one (so it works from inside `projects/api/src/`). |
824
+ | `--skip-install` | Skip `pnpm install` and the post-install format pass |
825
+ | `--dry-run` | Print the resolved plan without making any changes |
826
+ | `--noConfirm` | Skip all interactive prompts |
827
+
828
+ **Refusal cases:**
829
+ - `projects/app/` already exists → suggests `lt fullstack init` in a fresh directory
830
+ - no workspace detected at the target path → asks the user to run `lt fullstack init` first
831
+
832
+ **Side effects:** patches `projects/app/.env` with a project-specific `NUXT_PUBLIC_STORAGE_PREFIX`, optionally vendorizes `nuxt-extensions` into `app/core/`, hoists workspace-scoped `pnpm.overrides`, runs `pnpm install` + `oxfmt` on the new sub-project (unless `--skip-install` is set).
833
+
834
+ **Configuration:** Reads `commands.fullstack.*` (same keys as `lt fullstack init`).
835
+
561
836
  ---
562
837
 
563
838
  ### `lt fullstack convert-mode`
@@ -689,7 +964,7 @@ lt npm update
689
964
 
690
965
  ### `lt frontend angular`
691
966
 
692
- Creates a new Angular workspace using ng-base-starter.
967
+ Creates a new standalone Angular workspace using ng-base-starter. For an in-workspace app, prefer [`lt fullstack add-app --frontend angular`](#lt-fullstack-add-app).
693
968
 
694
969
  **Usage:**
695
970
  ```bash
@@ -699,21 +974,26 @@ lt frontend angular [name] [options]
699
974
  **Options:**
700
975
  | Option | Description |
701
976
  |--------|-------------|
977
+ | `--name <name>` | Workspace name (preferred over the positional argument) |
702
978
  | `--branch <branch>` / `-b` | Branch of ng-base-starter to use as template |
703
979
  | `--copy <path>` / `-c` | Copy from local template directory instead of cloning |
704
980
  | `--link <path>` | Symlink to local template directory (fastest, changes affect original) |
705
981
  | `--localize` | Enable Angular localize |
706
982
  | `--noLocalize` | Disable Angular localize |
707
983
  | `--gitLink <url>` | Git repository URL to link |
984
+ | `--dry-run` | Print the resolved plan and exit without making any changes |
985
+ | `--force` | Override the workspace-detection abort under `--noConfirm` |
708
986
  | `--noConfirm` / `-y` | Skip confirmation prompts |
709
987
 
988
+ **Workspace-awareness:** Inside a fullstack workspace the command is interactive (confirm prompt), but under `--noConfirm` it **refuses** with exit code 1 and points the caller to `lt fullstack add-app --frontend angular`. Pass `--noConfirm --force` to override (rare).
989
+
710
990
  **Configuration:** `commands.frontend.angular.*`, `defaults.noConfirm`
711
991
 
712
992
  ---
713
993
 
714
994
  ### `lt frontend nuxt`
715
995
 
716
- Creates a new Nuxt workspace using nuxt-base-starter.
996
+ Creates a new standalone Nuxt workspace using nuxt-base-starter. For an in-workspace app, prefer [`lt fullstack add-app --frontend nuxt`](#lt-fullstack-add-app).
717
997
 
718
998
  **Usage:**
719
999
  ```bash
@@ -723,16 +1003,24 @@ lt frontend nuxt [options]
723
1003
  **Options:**
724
1004
  | Option | Description |
725
1005
  |--------|-------------|
1006
+ | `--name <name>` | Workspace name |
726
1007
  | `--branch <branch>` / `-b` | Branch of nuxt-base-starter to use (uses git clone instead of create-nuxt-base) |
727
1008
  | `--copy <path>` / `-c` | Copy from local template directory instead of cloning |
728
1009
  | `--link <path>` | Symlink to local template directory (fastest, changes affect original) |
1010
+ | `--frontend-framework-mode <npm\|vendor>` | Frontend framework consumption mode (`vendor` copies `nuxt-extensions` into `app/core/`) |
1011
+ | `--next` | Default branch to `nuxt-base-starter#next` (auth `basePath` aligned with the experimental `--next` API) |
1012
+ | `--dry-run` | Print the resolved plan and exit without making any changes |
1013
+ | `--force` | Override the workspace-detection abort under `--noConfirm` |
1014
+ | `--noConfirm` | Skip confirmation prompts (requires `--name`) |
729
1015
 
730
1016
  **Note:** For `--copy` and `--link`, specify the path to the `nuxt-base-template/` subdirectory, not the repository root:
731
1017
  ```bash
732
1018
  lt frontend nuxt --copy /path/to/nuxt-base-starter/nuxt-base-template
733
1019
  ```
734
1020
 
735
- **Configuration:** `commands.frontend.nuxt.*`
1021
+ **Workspace-awareness:** Inside a fullstack workspace the command is interactive (confirm prompt), but under `--noConfirm` it **refuses** with exit code 1 and points the caller to `lt fullstack add-app --frontend nuxt`. Pass `--noConfirm --force` to override (rare).
1022
+
1023
+ **Configuration:** `commands.frontend.nuxt.*`, `commands.fullstack.frontendFrameworkMode` (shared with `init` / `add-app`)
736
1024
 
737
1025
  ---
738
1026
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lenne.tech/cli",
3
- "version": "1.19.0",
3
+ "version": "1.21.0",
4
4
  "description": "lenne.Tech CLI: lt",
5
5
  "keywords": [
6
6
  "lenne.Tech",
@@ -31,6 +31,7 @@
31
31
  "coverage": "jest --coverage",
32
32
  "test:vendor-init": "bash scripts/test-vendor-init.sh",
33
33
  "test:frontend-vendor-init": "bash scripts/test-frontend-vendor-init.sh",
34
+ "test:incremental-fullstack": "bash scripts/test-incremental-fullstack.sh",
34
35
  "format": "prettier --write 'src/**/*.{js,ts,tsx,json}' '!src/templates/**/*'",
35
36
  "lint": "eslint './src/**/*.{ts,js,vue}'",
36
37
  "lint:fix": "eslint './src/**/*.{ts,js,vue}' --fix",
@@ -57,16 +58,16 @@
57
58
  "bin"
58
59
  ],
59
60
  "dependencies": {
60
- "@aws-sdk/client-s3": "3.1032.0",
61
+ "@aws-sdk/client-s3": "3.1045.0",
61
62
  "@lenne.tech/cli-plugin-helper": "0.0.14",
62
- "axios": "1.15.0",
63
+ "axios": "1.16.0",
63
64
  "bcrypt": "6.0.0",
64
- "defuddle": "0.17.0",
65
+ "defuddle": "0.18.1",
65
66
  "glob": "13.0.6",
66
67
  "gluegun": "5.2.2",
67
68
  "js-sha256": "0.11.1",
68
69
  "js-yaml": "4.1.1",
69
- "jsdom": "29.0.2",
70
+ "jsdom": "29.1.1",
70
71
  "lodash": "4.18.1",
71
72
  "open": "11.0.0",
72
73
  "playwright-core": "1.59.1",
@@ -84,15 +85,12 @@
84
85
  "@types/js-yaml": "4.0.9",
85
86
  "@types/jsdom": "28.0.1",
86
87
  "@types/lodash": "4.17.24",
87
- "@types/node": "25.6.0",
88
+ "@types/node": "25.6.2",
88
89
  "@types/turndown": "5.0.6",
89
- "@typescript-eslint/eslint-plugin": "8.58.2",
90
- "@typescript-eslint/parser": "8.58.2",
91
90
  "ejs": "5.0.2",
92
91
  "eslint": "9.39.4",
93
- "eslint-config-prettier": "10.1.8",
94
92
  "husky": "9.1.7",
95
- "jest": "30.3.0",
93
+ "jest": "30.4.2",
96
94
  "prettier": "3.8.3",
97
95
  "rimraf": "6.1.3",
98
96
  "standard-version": "9.5.0",