@skyf0xx/hedgehog-core-full-stack-app 1.0.13 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,80 +1,57 @@
1
- # @skyf0xx/hedgehog-core-full-stack-app
1
+ # Hedgehog Full-Stack App Core ⭐
2
2
 
3
- Hedgehog's full-stack-app core: a pre-built, pre-verified Nx/pnpm
4
- workspace (NestJS + Drizzle + PostgreSQL on the backend, Next.js +
5
- ShadCN + Tailwind on the frontend, ts-rest contracts, TanStack Query
6
- hooks) plus the agents, skills, and manifest that drive a Hedgehog
7
- project built on it.
3
+ ### For: Well Architechted Full Stack Apps
8
4
 
9
- ## Contents
5
+ Every AI coding tool can scaffold an app. Most let the backend rot as it
6
+ grows: auth logic scattered across routes, contracts drifting from the
7
+ client, schema changes nobody tested.
10
8
 
11
- - `workspace/` the workspace a Hedgehog install copies to a
12
- project's repo root: Nx configuration, `packages/config`,
13
- `packages/db`, `apps/api`, `apps/web`, and every enforcement file
14
- (lefthook, commitlint, the CI phase gate).
15
- - `agents/` — `backend-eng`, `ux-planner`, `front-end-eng`.
16
- - `skills/` — `hedgehog-loop`, `hedgehog-bootstrap`,
17
- `hedgehog-bootstrap-full-stack-app-core`, and the Nx tooling skills
18
- (`nx-generate`, `nx-run-tasks`, `nx-workspace`,
19
- `link-workspace-packages`).
20
- - `vendor-skills/GSAP` — the vendored asset set `hedgehog-loop`'s
21
- build steps reference.
22
- - `CLAUDE.core.md` — fills a Hedgehog project's root `CLAUDE.md`
23
- `{{CORE_SECTION}}` placeholder for this core.
24
- - `hedgehog-core.yaml` — this package's manifest: name, flag, the
25
- selection prose the Hedgehog planner matches a project description
26
- against, and which agents/skills/vendor skills it carries.
27
- - `scripts/regenerate-full-stack-app-core.sh` — the deterministic
28
- generator that regenerates `workspace/` from scratch. Run by hand
29
- when a workspace dependency needs bumping; not part of any install
30
- path.
31
- - `repro/` — reproductions that drive `workspace/`'s real lefthook
32
- configuration and pinned lefthook binary against a real `git commit`,
33
- proving the commit gate runs on a fresh install and fails closed when
34
- its tooling is missing.
9
+ This core gives Hedgehog a backend that stays honest as it grows: one
10
+ opinionated stack, one enforced build order, and a phase gate that
11
+ blocks the next layer until the current one passes.
35
12
 
36
- ## Using this package
13
+ ```mermaid
14
+ flowchart LR
15
+ A[Schema] --> B[Contract]
16
+ B --> C[Repository]
17
+ C --> D[Service]
18
+ D --> E[Controller]
19
+ E --> F[Hook]
20
+ F --> G[Screen]
21
+ ```
37
22
 
38
- A Hedgehog installation depends on this package for the `full-stack-app`
39
- core rather than carrying its content directly. See the Hedgehog engine
40
- (`@skyf0xx/hedgehog`) for the installer and build-graph tooling that
41
- consumes it.
23
+ ## What you get
42
24
 
43
- ## Working on this core
25
+ - **NestJS + Drizzle + PostgreSQL** on the backend, **Next.js + ShadCN +
26
+ Tailwind** on the frontend, locked in once so every feature reuses the
27
+ same stack.
28
+ - **ts-rest contracts** so the client can't drift from the API: one
29
+ shared type definition feeds both sides.
30
+ - **TanStack Query hooks**, generated straight from the contracts.
31
+ - **A commit gate** (lefthook + commitlint) that blocks a broken build
32
+ from ever reaching your history.
44
33
 
45
- This is a versioned npm package that the Hedgehog engine's `init` fetches
46
- by name, carrying `full-stack-app`'s own agents, skills, a pre-built
47
- workspace, and the `hedgehog-core.yaml` manifest that names all three to
48
- the engine. See the engine repo
49
- ([`skyf0xx/hedgehog`](https://github.com/skyf0xx/hedgehog)) and its
50
- [`ARCHITECTURE.md`](https://github.com/skyf0xx/hedgehog/blob/master/ARCHITECTURE.md)
51
- for how `init` resolves and fetches a core package — that mechanism lives
52
- there, not here.
34
+ ## Built for production backend work
53
35
 
54
- No root `CLAUDE.md` lives in this repo. `CLAUDE.core.md` is a payload
55
- file: its content is installed into a *consuming project's* generated
56
- `CLAUDE.md`, filling that project's `{{CORE_SECTION}}` placeholder. A
57
- plain root `CLAUDE.md` here would auto-load into any coding agent working
58
- on this package itself, bleeding project-build context into a repo where
59
- no Hedgehog build ever runs — build guidance for a project using this
60
- core lives in that project's own generated `CLAUDE.md`, never here.
36
+ Reach for this core when the project needs authorization beyond
37
+ per-object rules, background jobs, scheduled work, webhooks, or
38
+ server-rendered pages. These are the features that turn "add a database"
39
+ into an ongoing maintenance job.
61
40
 
62
- Changing this core means editing one of: the `workspace/` template (the
63
- scaffold a Hedgehog install copies into a project's repo root), an agent
64
- under `agents/`, a skill under `skills/`, or the vendored asset set under
65
- `vendor-skills/GSAP`. `scripts/regenerate-full-stack-app-core.sh` is the
66
- deterministic generator that rebuilds `workspace/` from scratch — run it
67
- by hand after bumping a workspace dependency, then diff the result before
68
- committing. A change here is a release of this package, not of the
69
- engine: bump `package.json`'s version, commit, and merge to `main` — this
70
- repo's own `publish.yml` tags and publishes from there.
41
+ ## Easy to install and use
71
42
 
72
- When `workspace/`'s template needs a new piece of repeatable boilerplate
73
- a new module shape, a new generated file type — prefer building or
74
- extending a generator over hand-authoring the output once. This core
75
- already models the pattern: `workspace/tools/generators/` carries Nx
76
- generators for every domain-module layer (`schema`, `contract`,
77
- `repository`, `service`, `controller`, `hook`, `screen`) that
78
- `nx-generate` drives instead of an agent writing that boilerplate
79
- freehand. Other cores and future add-ons should model new scaffolding
80
- against this one.
43
+ Ask your agent:
44
+ *"Install Hedgehog and build me a [your app idea]"*
45
+
46
+ <details>
47
+ <summary>For your agent</summary>
48
+
49
+ ```
50
+ npx @skyf0xx/hedgehog init
51
+ ```
52
+
53
+ ```
54
+ npx @skyf0xx/hedgehog init --ts-full-stack-app
55
+ ```
56
+
57
+ Technical details: [ARCHITECTURE.md](ARCHITECTURE.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyf0xx/hedgehog-core-full-stack-app",
3
- "version": "1.0.13",
3
+ "version": "1.1.0",
4
4
  "description": "Hedgehog's full-stack-app core: an Nx/pnpm/NestJS/Next.js workspace, backend-first domain module build discipline, and the agents and skills that drive it.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -163,9 +163,14 @@ write — same treatment as an out-of-scope `apps/mobile`.
163
163
 
164
164
  ```bash
165
165
  npx nx g @nx/js:lib packages/auth --bundler=none --unitTestRunner=vitest
166
- pnpm add better-auth @thallesp/nestjs-better-auth
167
166
  ```
168
167
 
168
+ `better-auth` and `@thallesp/nestjs-better-auth` are already declared in
169
+ root `package.json` and resolved by `pnpm-lock.yaml` — the core ships
170
+ them, so there is nothing to install here. Don't run `pnpm add` for
171
+ either: an add resolves against npm at whatever is latest today, which
172
+ is the drift this core pins them to avoid.
173
+
169
174
  Configure the Drizzle adapter against `packages/db`. Add
170
175
  `BETTER_AUTH_SECRET: z.string().min(32)` to `packages/config/env.schema.ts`
171
176
  now (it doesn't exist in the core schema `hedgehog-bootstrap-full-stack-app-core`
@@ -175,9 +180,10 @@ line reproduces the exact `loadEnv()` crash-on-boot that
175
180
  `hedgehog-bootstrap-full-stack-app-core`'s `DATABASE_URL` entry exists to prevent, just
176
181
  for this var instead. Tag: `scope:auth`, `type:adapter`.
177
182
 
178
- Also wire the global auth guard on `apps/api`: `pnpm add
179
- @thallesp/nestjs-better-auth` there too and register the guard
180
- (secure-by-default) against `packages/auth`. `apps/api`'s
183
+ Also wire the global auth guard on `apps/api`: register the guard
184
+ (secure-by-default) against `packages/auth` the root declaration
185
+ already resolves `@thallesp/nestjs-better-auth` for every project in the
186
+ workspace, so `apps/api` needs no add of its own. `apps/api`'s
181
187
  `depConstraints` entry needs `scope:auth` added to its allowed
182
188
  dependencies now — the one deliberate exception to "api reaches things
183
189
  only through ports," since auth is cross-cutting infra, not a domain
@@ -195,9 +201,12 @@ skipped, say so plainly and move on — same treatment as an out-of-scope
195
201
 
196
202
  ```bash
197
203
  npx nx g @nx/node:app apps/worker
198
- pnpm add bullmq ioredis
199
204
  ```
200
205
 
206
+ `bullmq` and `ioredis` are already declared in root `package.json` and
207
+ resolved by `pnpm-lock.yaml` — same as Auth's packages above. Nothing to
208
+ install here; don't run `pnpm add` for either.
209
+
201
210
  Add a `redis` service to the root `docker-compose.yml` that
202
211
  `hedgehog-bootstrap-full-stack-app-core` landed (Postgres-only) and
203
212
  `REDIS_URL: z.string().url()` to `packages/config/env.schema.ts` (it
@@ -235,12 +244,49 @@ Skip this step entirely if Mobile isn't on for this project (check
235
244
  say so plainly and move on — same pattern as Auth (step 1) and Queue
236
245
  (step 2) when their add-on is off.
237
246
 
247
+ Mobile's packages are pinned in `addon-versions.json` at the workspace
248
+ root, not named inline here and not declared in root `package.json` —
249
+ Expo pulls a native build matrix that has no business in a project that
250
+ never scaffolds `apps/mobile`. Read every version from that file rather
251
+ than typing one, so this step installs what the core was last gated
252
+ against:
253
+
238
254
  ```bash
255
+ NX_EXPO=$(node -p "require('./addon-versions.json').mobile['@nx/expo']")
256
+ NATIVEWIND=$(node -p "require('./addon-versions.json').mobile.nativewind")
257
+ RNR=$(node -p "require('./addon-versions.json').mobile['@react-native-reusables/cli']")
258
+
259
+ pnpm add -w -D "@nx/expo@$NX_EXPO"
260
+ pnpm add -w "nativewind@$NATIVEWIND"
261
+
239
262
  npx nx g @nx/expo:app apps/mobile --unitTestRunner=jest
240
- npx @react-native-reusables/cli@latest init
241
- npx @react-native-reusables/cli@latest add button text
263
+
264
+ npx "@react-native-reusables/cli@$RNR" init
265
+ npx "@react-native-reusables/cli@$RNR" add button text
242
266
  ```
243
267
 
268
+ `-w` is required: this is a pnpm workspace, and an add without it fails
269
+ with `ERR_PNPM_ADDING_TO_ROOT` rather than installing.
270
+
271
+ `@nx/expo:app` generates `apps/mobile/src/test-setup.ts` with an untyped
272
+ `defineGlobal` helper, which is a `TS7006` error under the core's
273
+ `strict: true` base tsconfig — `mobile:typecheck` fails on a fresh
274
+ scaffold until it is annotated:
275
+
276
+ ```ts
277
+ const defineGlobal = (name: string, value: unknown) => {
278
+ ```
279
+
280
+ Make that edit before the step's commit. `nx-migrate.yml`'s add-on gate
281
+ applies the same annotation, so the day `@nx/expo` ships the types both
282
+ stop being needed together.
283
+
284
+ `@nx/expo`'s pin is byte-identical to every other `@nx/*` entry in root
285
+ `package.json` — Nx requires its plugin matrix to be version-identical,
286
+ and a mismatch fails at generator time with a resolution error rather
287
+ than at install. If the pin and the `@nx/*` entries have drifted apart,
288
+ stop and fix `addon-versions.json` rather than installing anyway.
289
+
244
290
  `@nx/expo:app`'s own default for `--unitTestRunner` is `none` — pass it
245
291
  explicitly, or `apps/mobile` has no `test` target at all and the `screen`
246
292
  layer's verify command below fails on a missing target rather than a
@@ -253,7 +299,7 @@ NativeWind and the `@/*` path alias into `apps/mobile/tsconfig.json`
253
299
  named components' source into `apps/mobile/src/components/ui/`. `button`
254
300
  and `text` are the two the `screen` generator's mobile output imports —
255
301
  add any further components `front-end-eng` needs the same way, per
256
- module, as it builds.
302
+ module, as it builds, at the same pinned CLI version.
257
303
 
258
304
  Edit `init`'s generated theme (`tailwind.config.js` colors, light/dark)
259
305
  to match `apps/web`'s base theme (landed by
@@ -355,6 +401,19 @@ time via `hedgehog next`/`hedgehog verify`, each its own commit.
355
401
  (written by `planner` at planning intake) turns that add-on on — say so
356
402
  plainly and skip otherwise, don't leave it ambiguous whether the step
357
403
  was considered.
404
+ - A skipped Auth or Queue step leaves that add-on's packages declared but
405
+ unused, since the core ships them in root `package.json`. Delete the
406
+ skipped add-on's entries (`better-auth` and
407
+ `@thallesp/nestjs-better-auth` for Auth; `bullmq` and `ioredis` for
408
+ Queue) and re-run `pnpm install` so the lockfile drops them. Do this in
409
+ the same commit that records the skip. Mobile needs nothing — its
410
+ packages were never in the install to begin with.
411
+ - Never write a version number into a command in this file. Auth and
412
+ Queue versions come from root `package.json`; Mobile's come from
413
+ `addon-versions.json`. A version typed into a step is invisible to
414
+ `nx migrate`, to `pnpm outdated`, and to CI's add-on gate, so it drifts
415
+ silently in whichever direction the day's npm resolution happens to
416
+ take it.
358
417
  - Don't add domain schema, contracts, or any `libs/<module>/*` content —
359
418
  that's Phase A, started after Bootstrap, one module at a time.
360
419
  - Don't deviate from the package/library choices above, for whichever
@@ -153,20 +153,42 @@ writes `docs/design/<module>.md`, not its own compiled layer — the
153
153
  zero. `hedgehog ready` previews the same decision without claiming
154
154
  anything — CLAIMABLE vs HELD BACK, with the reason for each holdback —
155
155
  useful for understanding the scheduler before committing to a claim.
156
- 2. **Dispatch each claimed packet to its own subagent** `backend-eng`
157
- (Phase A) or `front-end-eng` (Phase B), matching each packet's ALLOWED
158
- SCOPE in ONE message with parallel tool calls, not one agent call
159
- after another. This is a Claude session orchestrating via the Agent
160
- tool's parallel-call mechanism: N claimed tasks means N Agent calls in
161
- the same message. If a dispatch by name reports the agent as not
162
- found expected right after `init`/`update` installed it this same
156
+ 2. **For each claimed packet, decide inline vs. dispatch, then act.**
157
+ Default to dispatching to its own subagent — `backend-eng` (Phase A)
158
+ or `front-end-eng` (Phase B), matching the packet's ALLOWED SCOPE
159
+ in ONE message with parallel tool calls, not one agent call after
160
+ another. This is a Claude session orchestrating via the Agent tool's
161
+ parallel-call mechanism: N claimed tasks dispatched this way means N
162
+ Agent calls in the same message. Build or confirm the packet
163
+ directly instead, with no subagent, only when the packet clears one
164
+ of these from the packet alone:
165
+ - **ALLOWED SCOPE** names a small, bounded set of files the
166
+ orchestrator can read directly without ballooning its own context.
167
+ - **RELEVANT RULES or the module name** make the layer's irrelevance
168
+ checkable in one read — the task's own rules describe a concern
169
+ that plainly doesn't touch this layer's area.
170
+ - The change, once its shape is known, is small and mechanical — a
171
+ rename, an import fix, a one-line registration — rather than
172
+ something needing a subagent's isolated, fresh-context judgment.
173
+
174
+ Escalate to a full `backend-eng`/`front-end-eng` dispatch mid-layer
175
+ the moment any of these turns out false — a "quick check" that
176
+ surfaces real cross-file reasoning, an unclear scope, or a diff
177
+ bigger than expected. Never lock in "inline" once guessed. Either
178
+ way, the layer's own VERIFICATION command and ALLOWED SCOPE gate
179
+ apply identically in step 4 — this choice changes who reads, writes,
180
+ and checks, never what gets checked before it's accepted. A no-op
181
+ found inline is still reported per the packet's HONESTY rules, never
182
+ assumed. If a dispatch by name reports the agent as not found —
183
+ expected right after `init`/`update` installed it this same
163
184
  session — see root CLAUDE.md's "Delegating on this host" note rather
164
185
  than treating it as fatal.
165
- 3. Each agent **runs typecheck/lint/test on its own work** (mirrors
166
- lefthook, wired at bootstrap) as a sanity check before reporting
167
- back necessary, not sufficient. Per task, per agent: the agent
168
- reports its work as done; it does not move the task and does not
169
- commit.
186
+ 3. Whoever built the packet the dispatched agent, or the orchestrator
187
+ itself when it went inline **runs typecheck/lint/test on that
188
+ work** (mirrors lefthook, wired at bootstrap) as a sanity check
189
+ before reporting back necessary, not sufficient. Per task: the
190
+ work is reported as done; the task is not moved and nothing is
191
+ committed yet.
170
192
  4. **As each report arrives, verify it — one at a time, serially.** Run
171
193
  `hedgehog verify <task-id> --owner <owner>` (the same owner that
172
194
  claimed it; verify requires the lease owner). Building happens in
@@ -0,0 +1,39 @@
1
+ {
2
+ "$comment": [
3
+ "Pinned versions for the Mobile add-on's packages, which are NOT declared in",
4
+ "workspace/package.json. Expo pulls a native build matrix (Metro, the",
5
+ "React Native toolchain, the @react-native-reusables CLI's own tree) that",
6
+ "every consuming project would otherwise install whether or not it ever",
7
+ "scaffolds apps/mobile. Declaring them here keeps the version a tracked,",
8
+ "tool-visible fact — nx-migrate.yml's add-on gate scaffolds against these",
9
+ "pins every Monday, and a bump is a reviewable diff — without putting the",
10
+ "matrix in the default install.",
11
+ "",
12
+ "Auth and Queue packages are NOT here: they are plain Node dependencies with",
13
+ "no native matrix, so they are declared in workspace/package.json and",
14
+ "resolved by pnpm-lock.yaml like every other core dependency.",
15
+ "",
16
+ "@nx/expo must stay byte-identical to every other @nx/* entry in",
17
+ "workspace/package.json — Nx requires its plugin matrix to be version-",
18
+ "identical, and a mismatch fails at generator time, not install time.",
19
+ "nx-migrate.yml's add-on gate asserts that equality before it scaffolds.",
20
+ "",
21
+ "nativewind stays on 4.x: 5.x, the line that targets Tailwind v4, is still",
22
+ "a preview release. 4.x declares a `tailwindcss@~3` peer (through",
23
+ "react-native-css-interop) against the v4 that apps/web pins, which the",
24
+ "`react-native-css-interop>tailwindcss` peerDependencyRules entry in",
25
+ "package.json accepts — apps/mobile carries its own NativeWind-side Tailwind",
26
+ "config, written by the @react-native-reusables CLI's init, so the two",
27
+ "never share a config. Revisit both when nativewind 5 goes stable.",
28
+ "",
29
+ "@react-native-reusables/cli is a scaffolder, not a runtime dependency — it",
30
+ "copies component source into apps/mobile and is never installed. Pinning it",
31
+ "is what stops `npx @react-native-reusables/cli@latest` from resolving to a",
32
+ "different generator on every Bootstrap run."
33
+ ],
34
+ "mobile": {
35
+ "@nx/expo": "23.1.2",
36
+ "nativewind": "4.2.6",
37
+ "@react-native-reusables/cli": "0.7.1"
38
+ }
39
+ }
@@ -46,11 +46,23 @@
46
46
  "executor": "@nx/js:prune-lockfile",
47
47
  "outputs": [
48
48
  "{workspaceRoot}/apps/api/dist/package.json",
49
- "{workspaceRoot}/apps/api/dist/pnpm-lock.yaml"
49
+ "{workspaceRoot}/apps/api/dist/pnpm-lock.yaml",
50
+ "{workspaceRoot}/apps/api/dist/pnpm-workspace.yaml",
51
+ "{workspaceRoot}/apps/api/dist/patches",
52
+ "{workspaceRoot}/apps/api/dist/local_path_modules"
50
53
  ],
51
54
  "options": {
52
55
  "buildTarget": "build"
53
- }
56
+ },
57
+ "inputs": [
58
+ "default",
59
+ "^default",
60
+ "{workspaceRoot}/pnpm-workspace.yaml",
61
+ "{workspaceRoot}/package.json",
62
+ {
63
+ "runtime": "node -e \"try{console.log('pnpm major '+require('child_process').execSync('pnpm --version',{stdio:['ignore','pipe','ignore']}).toString().trim().split('.')[0])}catch{console.log('pnpm major unavailable')}\""
64
+ }
65
+ ]
54
66
  },
55
67
  "copy-workspace-modules": {
56
68
  "dependsOn": [
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from 'vitest/config';
2
2
 
3
3
  export default defineConfig(() => ({
4
- root: __dirname,
4
+ root: import.meta.dirname,
5
5
  cacheDir: '../../node_modules/.vite/apps/api',
6
6
  test: {
7
7
  name: 'api',
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from 'vitest/config';
2
2
 
3
3
  export default defineConfig(() => ({
4
- root: __dirname,
4
+ root: import.meta.dirname,
5
5
  cacheDir: '../../node_modules/.vite/apps/api-e2e',
6
6
  test: {
7
7
  name: 'api-e2e',
@@ -0,0 +1,9 @@
1
+ <!-- BEGIN:nextjs-agent-rules -->
2
+
3
+ # This is NOT the Next.js you know
4
+
5
+ This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
6
+
7
+ This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8
+
9
+ <!-- END:nextjs-agent-rules -->
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -1,7 +1,7 @@
1
1
  /// <reference types="next" />
2
2
  /// <reference types="next/image-types/global" />
3
- import "./.next/types/routes.d.ts";
4
- import "./.next/types/root-params.d.ts";
3
+ import "./.next/dev/types/routes.d.ts";
4
+ import "./.next/dev/types/root-params.d.ts";
5
5
 
6
6
  // NOTE: This file should not be edited
7
7
  // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -3,7 +3,7 @@ import react from '@vitejs/plugin-react';
3
3
  import { fileURLToPath } from 'node:url';
4
4
 
5
5
  export default defineConfig(() => ({
6
- root: __dirname,
6
+ root: import.meta.dirname,
7
7
  cacheDir: '../../node_modules/.vite/apps/web',
8
8
  plugins: [react()],
9
9
  resolve: {
@@ -14,17 +14,17 @@
14
14
  "@nestjs/schematics": "^11.0.0",
15
15
  "@nestjs/testing": "^11.0.0",
16
16
  "@next/eslint-plugin-next": "^16.1.6",
17
- "@nx/devkit": "23.1.2",
18
- "@nx/eslint": "23.1.2",
19
- "@nx/eslint-plugin": "23.1.2",
20
- "@nx/js": "23.1.2",
21
- "@nx/nest": "23.1.2",
22
- "@nx/next": "23.1.2",
23
- "@nx/node": "23.1.2",
24
- "@nx/playwright": "23.1.2",
25
- "@nx/vitest": "23.1.2",
26
- "@nx/web": "23.1.2",
27
- "@nx/webpack": "23.1.2",
17
+ "@nx/devkit": "23.2.0",
18
+ "@nx/eslint": "23.2.0",
19
+ "@nx/eslint-plugin": "23.2.0",
20
+ "@nx/js": "23.2.0",
21
+ "@nx/nest": "23.2.0",
22
+ "@nx/next": "23.2.0",
23
+ "@nx/node": "23.2.0",
24
+ "@nx/playwright": "23.2.0",
25
+ "@nx/vitest": "23.2.0",
26
+ "@nx/web": "23.2.0",
27
+ "@nx/webpack": "23.2.0",
28
28
  "@playwright/test": "^1.37.0",
29
29
  "@swc-node/register": "~1.11.1",
30
30
  "@swc/cli": "~0.8.1",
@@ -52,7 +52,7 @@
52
52
  "eslint-plugin-react-hooks": "7.1.1",
53
53
  "jsdom": "^30.0.1",
54
54
  "lefthook": "^2.1.10",
55
- "nx": "23.1.2",
55
+ "nx": "23.2.0",
56
56
  "prettier": "~3.6.2",
57
57
  "tslib": "^2.3.0",
58
58
  "typescript": "~6.0.3",
@@ -67,8 +67,12 @@
67
67
  "@nestjs/common": "^11.0.0",
68
68
  "@nestjs/core": "^11.0.0",
69
69
  "@nestjs/platform-express": "^11.0.0",
70
+ "@thallesp/nestjs-better-auth": "^2.7.0",
70
71
  "axios": "^1.18.0",
72
+ "better-auth": "^1.7.2",
73
+ "bullmq": "^6.3.4",
71
74
  "drizzle-orm": "^0.45.2",
75
+ "ioredis": "^6.0.0",
72
76
  "nestjs-pino": "^4.6.1",
73
77
  "next": "~16.3.0",
74
78
  "pg": "^8.22.0",
@@ -88,11 +92,12 @@
88
92
  "eslint-plugin-import>eslint": "10",
89
93
  "eslint-plugin-jsx-a11y>eslint": "10",
90
94
  "eslint-plugin-react>eslint": "10",
91
- "@exodus/bytes>@noble/hashes": "1"
95
+ "@exodus/bytes>@noble/hashes": "1",
96
+ "react-native-css-interop>tailwindcss": "4"
92
97
  }
93
98
  },
94
99
  "overrides": {
95
- "@nx/module-federation": "23.1.2",
100
+ "@nx/module-federation": "23.2.0",
96
101
  "esbuild": "0.25.12",
97
102
  "axios": "^1.18.0",
98
103
  "brace-expansion@1": "^1.1.18",
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from 'vitest/config';
2
2
 
3
3
  export default defineConfig(() => ({
4
- root: __dirname,
4
+ root: import.meta.dirname,
5
5
  cacheDir: '../../node_modules/.vite/packages/config',
6
6
  test: {
7
7
  name: 'config',
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from 'vitest/config';
2
2
 
3
3
  export default defineConfig(() => ({
4
- root: __dirname,
4
+ root: import.meta.dirname,
5
5
  cacheDir: '../../node_modules/.vite/packages/db',
6
6
  test: {
7
7
  name: 'db',