@skyf0xx/hedgehog-core-full-stack-app 1.0.14 → 1.2.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/CLAUDE.core.md CHANGED
@@ -22,46 +22,25 @@ steps from memory:
22
22
  `hedgehog verify`, which commits it on a pass. Also holds the Correction
23
23
  Protocol for fixing a wrong upstream step. Invoke it at the start of any
24
24
  build session and for "what's next".
25
+ <!-- hedgehog:bootstrap-only start -->
25
26
  - **`hedgehog-bootstrap`** — run **once**, at project start, to scaffold
26
27
  the core stack, the enforcement config, and whichever add-ons (Auth,
27
28
  Queue, Mobile) planning intake turned on. Skip if `nx.json` already
28
29
  exists.
30
+ <!-- hedgehog:bootstrap-only end -->
29
31
  - **`conventional-commits`** — when a change spans several steps in one
30
32
  working-tree pass and needs splitting back into per-step commits (mainly
31
33
  Correction Protocol cleanups).
32
34
 
33
35
  ### The agents — delegate the judgment calls
34
36
 
35
- - **`planner`** — planning intake (which core applies, then
36
- `hedgehog-planning-intake`'s BMAD-METHOD brainstorming/brief/PRD/UX-spec
37
- shelf, mined into intent records, the Add-ons decision, and domain
38
- vocabulary) at project start. Writes intents via `hedgehog intent add`,
39
- `.hedgehog/addons.yaml`, and `.hedgehog/BMAD/`. On first run, hands off
40
- to the `bootstrap` agent once Confirm & Lock holds. Runs again whenever
41
- new scope enters play — including after the build is complete — taking
42
- `hedgehog-planning-intake`'s **Re-entry pass**: the BMAD shelf and
43
- `bootstrap` are both skipped, new modules are mined into additional
44
- intents, and `hedgehog plan` appends their tasks without touching
45
- anything already built.
46
- - **`bootstrap`** — runs `hedgehog-bootstrap`'s core steps (always) plus
47
- whichever add-on steps planning intake turned on. Triggered
48
- automatically by `planner` after its first run; skip if `nx.json`
49
- already exists.
50
- - **`backend-eng`** — builds each module's Phase A layers (schema →
51
- contract → repository → service → controller → queue?), one
52
- `hedgehog claim`ed packet at a time, gated by `hedgehog verify`.
53
- - **`ux-planner`** — once per module in Phase B, after the hook exists and
54
- before the screen: writes `docs/design/<module>.md`, reading
55
- `.hedgehog/BMAD/05-ux-spec/` directly (or
56
- `docs/design/<module>-notes.md` if a prior run already filed one). Where
57
- the archive holds no UX spec, it asks for visual input rather than
58
- inferring a direction.
59
- - **`front-end-eng`** — builds each module's Phase B layers (hook, screen)
60
- from the ux-planner rationale, one `hedgehog claim`ed packet at a time,
61
- gated by `hedgehog verify`.
62
- - **`reviewer`** — phase-transition and Correction Protocol checks the
63
- mechanical gate can't make (port discipline, FK-by-ID discipline,
64
- contract shape).
37
+ `backend-eng` builds each module's Phase A layers (schema → contract →
38
+ repository → service → controller → queue?), one `hedgehog claim`ed
39
+ packet at a time, gated by `hedgehog verify`. `front-end-eng` builds
40
+ each module's Phase B layers (hook, screen) from `ux-planner`'s
41
+ rationale, the same way. See `hedgehog-loop` for exactly which agent
42
+ owns which layer and the claim/verify sequencing — that skill is the
43
+ source, not restated here.
65
44
 
66
45
  ## The constants (do not deviate)
67
46
 
@@ -121,9 +100,6 @@ docs/
121
100
  design <module>.md (ux-planner, reading .hedgehog/BMAD/05-ux-spec/ directly)
122
101
  ```
123
102
 
124
- Check `.hedgehog/addons.yaml` before assuming any "only if" line above is
125
- actually present in this codebase.
126
-
127
103
  ### Core rules
128
104
 
129
105
  - **One table = one domain module.** Each carries the full step sequence.
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)
@@ -51,12 +51,12 @@ catch.
51
51
  ## Core Responsibilities
52
52
 
53
53
  - **`schema`**: define the table in `packages/db` (Drizzle). One domain
54
- module = one table. Cross-module references are FK-by-ID columns
55
- only — never a foreign schema import. Add one re-export line for the
56
- module to `packages/db/src/schema/index.ts` (in scope for this
57
- layer) so the table is importable outside `packages/db` — the
58
- package's own `src/index.ts` re-exports that barrel and never
59
- changes after bootstrap.
54
+ module per table, cross-module references FK-by-ID only (root
55
+ CLAUDE.md's Core rules) — never a foreign schema import. Add one
56
+ re-export line for the module to `packages/db/src/schema/index.ts`
57
+ (in scope for this layer) so the table is importable outside
58
+ `packages/db` — the package's own `src/index.ts` re-exports that
59
+ barrel and never changes after bootstrap.
60
60
  - **`contract`**: derive the Zod schema from Drizzle (`drizzle-zod`) and
61
61
  wire the ts-rest contract in `packages/contracts`. A `date`-mode
62
62
  `timestamp` column reflected through `createSelectSchema` is overridden
@@ -101,8 +101,7 @@ catch.
101
101
  the packet's scope and rules don't account for; your own tests prove
102
102
  internal consistency, never coverage of what was asked. INHERITED DEBT
103
103
  is what the layers you depend on declared they left for you; declare
104
- your own with `hedgehog debt add <task-id> "<note>"` rather than a
105
- code comment nothing reads. Its WHY NOW section
104
+ your own with `hedgehog debt add <task-id> "<note>"`. Its WHY NOW section
106
105
  already confirms the module is in scope and every dependency is
107
106
  `complete` — no need to re-derive that by hand. Cross-module FK
108
107
  targets should already have their own schema landed (the packet's
@@ -122,14 +121,10 @@ catch.
122
121
  name the shared files that changed (typically `pnpm-lock.yaml`, root
123
122
  `tsconfig.json`) in your report — the orchestrating session commits
124
123
  them separately, since you report but never commit (next step).
125
- 3. **Report the work as done; do not commit it yourself.** Per the build
126
- graph's design, an agent reporting success never moves a task — only
127
- `hedgehog verify <task-id>`'s passing exit code does. It checks your
128
- changes against the packet's ALLOWED SCOPE, re-runs the real
129
- verification command, and on a pass writes the commit (the packet's
130
- exact Conventional Commit message) itself. Any shared workspace files
131
- you flagged in step 2 are a separate commit the orchestrating session
132
- makes before dispatching `hedgehog verify`, not something you commit.
124
+ 3. **Report the work as done; do not commit it yourself.** Any shared
125
+ workspace files you flagged in step 2 are a separate commit the
126
+ orchestrating session makes before dispatching `hedgehog verify`, not
127
+ something you commit.
133
128
  4. One layer at a time — never start the next layer before
134
129
  `hedgehog verify` reports the current one `complete`.
135
130
  5. Once `hedgehog verify` reports the `controller` layer (and any bundled
@@ -154,7 +149,7 @@ catch.
154
149
  reported rather than chosen here. `verify` cannot check any of this,
155
150
  which is exactly why it's on you.
156
151
  - Never import another module's repository, service, or schema directly
157
- — cross-module references are FK-by-ID, resolved at the
152
+ — FK-by-ID only (root CLAUDE.md's Core rules), resolved at the
158
153
  contract/controller layer (parallel calls) or via a same-repository
159
154
  Drizzle join against the other module's *schema*, never its adapter.
160
155
  - Never write queue infra when the Queue add-on is off (per
@@ -96,8 +96,7 @@ don't reach for a second one.
96
96
  and rules don't account for; your own tests prove internal
97
97
  consistency, never coverage of what was asked. INHERITED DEBT is what
98
98
  the layers you depend on declared they left for you; declare your own
99
- with `hedgehog debt add <task-id> "<note>"` rather than a code comment
100
- nothing reads. Its WHY NOW section already
99
+ with `hedgehog debt add <task-id> "<note>"`. Its WHY NOW section already
101
100
  confirms Phase A is closed for this module (the `hook`/`screen`
102
101
  layer's dependencies wouldn't be `complete` otherwise) — no need to
103
102
  re-derive that by hand. If you're handed a step outside a packet with
@@ -116,12 +115,10 @@ don't reach for a second one.
116
115
  the workspace, and name the shared files that changed (typically
117
116
  `pnpm-lock.yaml`, root `tsconfig.json`) in your report — the
118
117
  orchestrating session commits them separately (next step).
119
- 3. **Report the work as done; do not commit it yourself.** Only
120
- `hedgehog verify <task-id>`'s passing exit code moves the task to
121
- `complete` and writes the commit (the packet's exact Conventional
122
- Commit message). Any shared workspace files you flagged in step 2 are a
123
- separate commit the orchestrating session makes before dispatching
124
- `hedgehog verify`, not something you commit.
118
+ 3. **Report the work as done; do not commit it yourself.** Any shared
119
+ workspace files you flagged in step 2 are a separate commit the
120
+ orchestrating session makes before dispatching `hedgehog verify`, not
121
+ something you commit.
125
122
  4. Build the screen consuming the hook the same way — packet, build,
126
123
  report, `hedgehog verify`.
127
124
  5. One layer at a time — `hook` fully `complete` before the `screen`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyf0xx/hedgehog-core-full-stack-app",
3
- "version": "1.0.14",
3
+ "version": "1.2.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": {
@@ -44,14 +44,14 @@ Phase A.
44
44
 
45
45
  ## The Domain Module Pattern
46
46
 
47
- A **domain module = one table.** `users`, `orders`, `order_items` are each
48
- their own module, carrying the full step sequence below. The schema is the
49
- source of truth for module boundaries.
47
+ Root CLAUDE.md's Core rules own "one table = one domain module" and
48
+ "FK-by-ID only" — this section is their mechanics. `users`, `orders`,
49
+ `order_items` are each their own module, carrying the full step sequence
50
+ below. The schema is the source of truth for module boundaries.
50
51
 
51
- **Cross-module references are FK-by-ID only.** If `orders.user_id`
52
- references `users`, the `orders` schema holds a plain FK column. The
53
- `orders` repository and service depend only on their own ports — a service
54
- knows related entities only as an ID.
52
+ If `orders.user_id` references `users`, the `orders` schema holds a plain
53
+ FK column. The `orders` repository and service depend only on their own
54
+ ports — a service knows related entities only as an ID.
55
55
 
56
56
  - Need the related row? Resolve it at the contract/controller layer
57
57
  (parallel calls to each module's own endpoint), or join against the
@@ -153,30 +153,48 @@ 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
173
195
  parallel; verifying does not — verify writes a commit, and commits go
174
- through one at a time. It checks the touched files against the
175
- packet's ALLOWED SCOPE, runs the layer's VERIFICATION command, and on
176
- a pass writes the commit (the exact Conventional Commit message from
177
- the tables above, plus the updated build graph) and unlocks the next
178
- layer. On a scope violation or a failing check, the task moves to
179
- `blocked` with a `blocked_reason` of `scope_violation` or
196
+ through one at a time. On a scope violation or a failing check, the
197
+ task moves to `blocked` with a `blocked_reason` of `scope_violation` or
180
198
  `verification_failed`, and nothing downstream unlocks. Fix the work,
181
199
  then run `hedgehog retry <task-id>` to return the task to `planned`,
182
200
  claim it again (by task id — see below), and verify again —
@@ -216,7 +234,7 @@ the built work against it there, because nothing else in the build does.
216
234
  A layer that hits a limitation the next layer must compensate for
217
235
  declares it with `hedgehog debt add <task-id> "<note>"`; the note lands
218
236
  in the **INHERITED DEBT** section of every packet that depends on that
219
- task. A comment in a source file is not a mechanism — nothing reads it.
237
+ task.
220
238
 
221
239
  Each `hedgehog verify` call commits exactly one layer, built right for
222
240
  what's known now; a wrong layer is fixed forward later via the
@@ -593,8 +611,8 @@ the graph doesn't have a task for.
593
611
  committed.
594
612
  - The screen step doesn't start blank — `ux-planner` runs once per module,
595
613
  after the hook is committed, before `front-end-eng` starts the screen.
596
- - `packages/config` is the single source for shared config; a per-app
597
- override request signals to fix the base config at the source.
614
+ - `packages/config` is the single source for shared config (root
615
+ CLAUDE.md's Core rules).
598
616
 
599
617
  ## Stop Condition
600
618
 
@@ -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",
@@ -97,7 +97,7 @@
97
97
  }
98
98
  },
99
99
  "overrides": {
100
- "@nx/module-federation": "23.1.2",
100
+ "@nx/module-federation": "23.2.0",
101
101
  "esbuild": "0.25.12",
102
102
  "axios": "^1.18.0",
103
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',