@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 +9 -33
- package/README.md +47 -70
- package/agents/backend-eng.md +12 -17
- package/agents/front-end-eng.md +5 -8
- package/package.json +1 -1
- package/skills/hedgehog-loop/SKILL.md +46 -28
- package/workspace/apps/api/package.json +14 -2
- package/workspace/apps/api/vitest.config.mts +1 -1
- package/workspace/apps/api-e2e/vitest.config.mts +1 -1
- package/workspace/apps/web/AGENTS.md +9 -0
- package/workspace/apps/web/CLAUDE.md +1 -0
- package/workspace/apps/web/next-env.d.ts +2 -2
- package/workspace/apps/web/vitest.config.mts +1 -1
- package/workspace/package.json +13 -13
- package/workspace/packages/config/vitest.config.mts +1 -1
- package/workspace/packages/db/vitest.config.mts +1 -1
- package/workspace/pnpm-lock.yaml +410 -242
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
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
#
|
|
1
|
+
# Hedgehog Full-Stack App Core ⭐
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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/agents/backend-eng.md
CHANGED
|
@@ -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
|
|
55
|
-
|
|
56
|
-
module to `packages/db/src/schema/index.ts`
|
|
57
|
-
layer) so the table is importable outside
|
|
58
|
-
package's own `src/index.ts` re-exports that
|
|
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>"
|
|
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.**
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
—
|
|
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
|
package/agents/front-end-eng.md
CHANGED
|
@@ -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>"
|
|
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.**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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. **
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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.
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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.
|
|
175
|
-
|
|
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.
|
|
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
|
|
597
|
-
|
|
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": [
|
|
@@ -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.
|
package/workspace/package.json
CHANGED
|
@@ -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.
|
|
18
|
-
"@nx/eslint": "23.
|
|
19
|
-
"@nx/eslint-plugin": "23.
|
|
20
|
-
"@nx/js": "23.
|
|
21
|
-
"@nx/nest": "23.
|
|
22
|
-
"@nx/next": "23.
|
|
23
|
-
"@nx/node": "23.
|
|
24
|
-
"@nx/playwright": "23.
|
|
25
|
-
"@nx/vitest": "23.
|
|
26
|
-
"@nx/web": "23.
|
|
27
|
-
"@nx/webpack": "23.
|
|
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.
|
|
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.
|
|
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",
|