create-win-project 1.3.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.
Files changed (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +187 -0
  3. package/ci/expo.yml +28 -0
  4. package/ci/laravel.yml +49 -0
  5. package/ci/nextjs.yml +29 -0
  6. package/ci/springboot.yml +33 -0
  7. package/ci/vite.yml +36 -0
  8. package/compatibility/profiles.json +237 -0
  9. package/docs/ARCHITECTURE.md +118 -0
  10. package/docs/CONTENT_MODEL.md +36 -0
  11. package/docs/DEPENDENCY_MAINTENANCE.md +31 -0
  12. package/index.js +431 -0
  13. package/lib/application-shapes.js +95 -0
  14. package/lib/banner.js +45 -0
  15. package/lib/catalog.js +343 -0
  16. package/lib/compatibility.js +116 -0
  17. package/lib/constants.js +3 -0
  18. package/lib/doctor.js +45 -0
  19. package/lib/files.js +158 -0
  20. package/lib/generator.js +366 -0
  21. package/lib/interview.js +77 -0
  22. package/lib/laravel-scaffold.js +3 -0
  23. package/lib/playbooks.js +172 -0
  24. package/lib/project-location.js +18 -0
  25. package/lib/scaffold.js +467 -0
  26. package/lib/stacks/context.js +27 -0
  27. package/lib/stacks/contract.js +142 -0
  28. package/lib/stacks/index.js +8 -0
  29. package/lib/stacks/laravel/architecture.js +27 -0
  30. package/lib/stacks/laravel/auth/oidc.js +13 -0
  31. package/lib/stacks/laravel/auth/public.js +28 -0
  32. package/lib/stacks/laravel/auth/sanctum.js +14 -0
  33. package/lib/stacks/laravel/auth/session.js +17 -0
  34. package/lib/stacks/laravel/composer.js +50 -0
  35. package/lib/stacks/laravel/generate.js +362 -0
  36. package/lib/stacks/laravel/index.js +18 -0
  37. package/lib/stacks/laravel/ui/blade.js +15 -0
  38. package/lib/stacks/laravel/ui/index.js +29 -0
  39. package/lib/stacks/laravel/ui/inertia-react.js +35 -0
  40. package/lib/stacks/laravel/ui/livewire.js +39 -0
  41. package/lib/stacks/laravel/ui/shared.js +14 -0
  42. package/lib/stacks/registry.js +42 -0
  43. package/lib/stacks/shared/contributions.js +25 -0
  44. package/lib/template.js +62 -0
  45. package/package.json +49 -0
  46. package/playbooks/INDEX.md +58 -0
  47. package/playbooks/capabilities/auth/oidc-resource-server.md +15 -0
  48. package/playbooks/capabilities/auth/spring-session.md +15 -0
  49. package/playbooks/capabilities/ci/github-actions.manifest.json +10 -0
  50. package/playbooks/capabilities/ci/github-actions.md +61 -0
  51. package/playbooks/capabilities/docker/docker.manifest.json +11 -0
  52. package/playbooks/capabilities/docker/overview.md +55 -0
  53. package/playbooks/capabilities/flyway/environments.md +5 -0
  54. package/playbooks/capabilities/flyway/flyway.manifest.json +12 -0
  55. package/playbooks/capabilities/flyway/migrations.md +7 -0
  56. package/playbooks/capabilities/flyway/testing.md +5 -0
  57. package/playbooks/capabilities/laravel/database.md +8 -0
  58. package/playbooks/capabilities/laravel/migrations.md +15 -0
  59. package/playbooks/capabilities/laravel/observability.md +8 -0
  60. package/playbooks/capabilities/laravel/oidc-resource-server.md +10 -0
  61. package/playbooks/capabilities/laravel/queues.md +8 -0
  62. package/playbooks/capabilities/laravel/sanctum-spa.md +8 -0
  63. package/playbooks/capabilities/laravel/scheduler.md +7 -0
  64. package/playbooks/capabilities/laravel/session-auth.md +8 -0
  65. package/playbooks/capabilities/laravel/storage-uploads.md +7 -0
  66. package/playbooks/capabilities/postgresql/architecture.md +5 -0
  67. package/playbooks/capabilities/postgresql/migrations.md +5 -0
  68. package/playbooks/capabilities/postgresql/postgresql.manifest.json +15 -0
  69. package/playbooks/capabilities/postgresql/schema-design.md +7 -0
  70. package/playbooks/capabilities/postgresql/security.md +5 -0
  71. package/playbooks/capabilities/postgresql/testing.md +5 -0
  72. package/playbooks/capabilities/prisma/architecture.md +5 -0
  73. package/playbooks/capabilities/prisma/migrations.md +11 -0
  74. package/playbooks/capabilities/prisma/prisma.manifest.json +14 -0
  75. package/playbooks/capabilities/prisma/runtime.md +5 -0
  76. package/playbooks/capabilities/prisma/schema.md +5 -0
  77. package/playbooks/capabilities/prisma/testing.md +5 -0
  78. package/playbooks/capabilities/supabase/architecture.md +5 -0
  79. package/playbooks/capabilities/supabase/authentication.md +5 -0
  80. package/playbooks/capabilities/supabase/expo.md +16 -0
  81. package/playbooks/capabilities/supabase/migrations.md +7 -0
  82. package/playbooks/capabilities/supabase/nextjs.md +24 -0
  83. package/playbooks/capabilities/supabase/rls.md +7 -0
  84. package/playbooks/capabilities/supabase/supabase.manifest.json +32 -0
  85. package/playbooks/capabilities/supabase/testing.md +5 -0
  86. package/playbooks/capabilities/supabase/vite.md +14 -0
  87. package/playbooks/concerns/axios.md +123 -0
  88. package/playbooks/concerns/next-safe-action.md +66 -0
  89. package/playbooks/concerns/next-themes.md +87 -0
  90. package/playbooks/concerns/nuqs.md +59 -0
  91. package/playbooks/concerns/t3-env.md +48 -0
  92. package/playbooks/concerns/tanstack-query.md +145 -0
  93. package/playbooks/concerns/zod.md +174 -0
  94. package/playbooks/concerns/zustand.md +93 -0
  95. package/playbooks/devops/makefile.manifest.json +10 -0
  96. package/playbooks/devops/makefile.md +556 -0
  97. package/playbooks/devops/pr-template.manifest.json +10 -0
  98. package/playbooks/devops/pr-template.md +106 -0
  99. package/playbooks/platform/laravel-ui/blade/architecture.md +5 -0
  100. package/playbooks/platform/laravel-ui/blade/runtime.md +5 -0
  101. package/playbooks/platform/laravel-ui/blade/security.md +5 -0
  102. package/playbooks/platform/laravel-ui/blade/structure.md +5 -0
  103. package/playbooks/platform/laravel-ui/blade/testing.md +5 -0
  104. package/playbooks/platform/laravel-ui/inertia-react/architecture.md +5 -0
  105. package/playbooks/platform/laravel-ui/inertia-react/runtime.md +5 -0
  106. package/playbooks/platform/laravel-ui/inertia-react/security.md +5 -0
  107. package/playbooks/platform/laravel-ui/inertia-react/structure.md +5 -0
  108. package/playbooks/platform/laravel-ui/inertia-react/testing.md +5 -0
  109. package/playbooks/platform/laravel-ui/livewire/architecture.md +5 -0
  110. package/playbooks/platform/laravel-ui/livewire/runtime.md +5 -0
  111. package/playbooks/platform/laravel-ui/livewire/security.md +5 -0
  112. package/playbooks/platform/laravel-ui/livewire/structure.md +5 -0
  113. package/playbooks/platform/laravel-ui/livewire/testing.md +5 -0
  114. package/playbooks/platform/mobile.manifest.json +17 -0
  115. package/playbooks/platform/mobile.md +15 -0
  116. package/playbooks/platform/web.manifest.json +17 -0
  117. package/playbooks/platform/web.md +17 -0
  118. package/playbooks/stack/expo/architecture.md +27 -0
  119. package/playbooks/stack/expo/runtime.md +14 -0
  120. package/playbooks/stack/expo/security.md +18 -0
  121. package/playbooks/stack/expo/structure.md +26 -0
  122. package/playbooks/stack/expo/testing.md +13 -0
  123. package/playbooks/stack/laravel/architecture.md +34 -0
  124. package/playbooks/stack/laravel/runtime.md +27 -0
  125. package/playbooks/stack/laravel/security.md +23 -0
  126. package/playbooks/stack/laravel/structure.md +29 -0
  127. package/playbooks/stack/laravel/testing.md +22 -0
  128. package/playbooks/stack/laravel-ui.manifest.json +42 -0
  129. package/playbooks/stack/laravel.manifest.json +35 -0
  130. package/playbooks/stack/nextjs/architecture.md +62 -0
  131. package/playbooks/stack/nextjs/runtime.md +31 -0
  132. package/playbooks/stack/nextjs/security.md +32 -0
  133. package/playbooks/stack/nextjs/structure.md +50 -0
  134. package/playbooks/stack/nextjs/testing.md +20 -0
  135. package/playbooks/stack/nextjs.manifest.json +49 -0
  136. package/playbooks/stack/no-frontend.manifest.json +25 -0
  137. package/playbooks/stack/none.manifest.json +21 -0
  138. package/playbooks/stack/react-native.manifest.json +49 -0
  139. package/playbooks/stack/react-vite/architecture.md +33 -0
  140. package/playbooks/stack/react-vite/runtime.md +13 -0
  141. package/playbooks/stack/react-vite/security.md +16 -0
  142. package/playbooks/stack/react-vite/structure.md +23 -0
  143. package/playbooks/stack/react-vite/testing.md +12 -0
  144. package/playbooks/stack/react-vite.manifest.json +46 -0
  145. package/playbooks/stack/springboot/architecture.md +40 -0
  146. package/playbooks/stack/springboot/runtime.md +28 -0
  147. package/playbooks/stack/springboot/security.md +28 -0
  148. package/playbooks/stack/springboot/structure.md +30 -0
  149. package/playbooks/stack/springboot/testing.md +22 -0
  150. package/playbooks/stack/springboot.manifest.json +38 -0
  151. package/playbooks/styling/css-modules-extensions.md +267 -0
  152. package/playbooks/styling/css-modules.manifest.json +11 -0
  153. package/playbooks/styling/native-styles.manifest.json +9 -0
  154. package/playbooks/styling/native-styles.md +29 -0
  155. package/playbooks/styling/tailwind-extensions.md +182 -0
  156. package/playbooks/styling/tailwind.manifest.json +11 -0
  157. package/playbooks/universal/accessibility.manifest.json +11 -0
  158. package/playbooks/universal/accessibility.md +45 -0
  159. package/playbooks/universal/coding-rules.manifest.json +12 -0
  160. package/playbooks/universal/coding-rules.md +281 -0
  161. package/playbooks/universal/error-handling.manifest.json +10 -0
  162. package/playbooks/universal/error-handling.md +21 -0
  163. package/playbooks/universal/git-conventions.manifest.json +10 -0
  164. package/playbooks/universal/git-conventions.md +186 -0
  165. package/playbooks/universal/observability.manifest.json +10 -0
  166. package/playbooks/universal/observability.md +29 -0
  167. package/playbooks/universal/security.manifest.json +11 -0
  168. package/playbooks/universal/security.md +30 -0
  169. package/playbooks/universal/typescript.manifest.json +11 -0
  170. package/playbooks/universal/typescript.md +272 -0
  171. package/scripts/compatibility-matrix.mjs +48 -0
  172. package/scripts/validate-content.mjs +76 -0
  173. package/scripts/verify-generated.mjs +153 -0
  174. package/templates/agents/nextjs.md +47 -0
  175. package/templates/agents/react-native.md +48 -0
  176. package/templates/agents/react-vite.md +48 -0
  177. package/templates/docker/compose/postgres.yml +29 -0
  178. package/templates/docker/compose/springboot.yml +69 -0
  179. package/templates/docker/compose/supabase.yml +18 -0
  180. package/templates/docker/compose-prod/springboot.yml +64 -0
  181. package/templates/docker/dockerfile/laravel-inertia.dev.dockerfile +21 -0
  182. package/templates/docker/dockerfile/laravel.dev.dockerfile +12 -0
  183. package/templates/docker/dockerfile/laravel.prod.dockerfile +13 -0
  184. package/templates/docker/dockerfile/nextjs.dev.dockerfile +6 -0
  185. package/templates/docker/dockerfile/nextjs.prod.dockerfile +18 -0
  186. package/templates/docker/dockerfile/springboot.dev.dockerfile +5 -0
  187. package/templates/docker/dockerfile/springboot.prod.dockerfile +10 -0
  188. package/templates/docker/dockerfile/vite.dev.dockerfile +6 -0
  189. package/templates/docker/dockerfile/vite.prod.dockerfile +12 -0
  190. package/templates/gitignore/base.gitignore +32 -0
  191. package/templates/gitignore/nextjs.gitignore +40 -0
  192. package/templates/gitignore/react-native.gitignore +43 -0
  193. package/templates/gitignore/react-vite.gitignore +39 -0
  194. package/templates/makefile/frontend.mk +31 -0
  195. package/templates/makefile/laravel.mk +47 -0
  196. package/templates/makefile/postgres.mk +40 -0
  197. package/templates/makefile/springboot.mk +125 -0
  198. package/templates/makefile/supabase.mk +42 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Win
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ ```
2
+ ██╗ ██╗ ██╗ ███╗ ██╗
3
+ ██║ ██║ ███║ ████╗ ██║
4
+ ██║ █╗ ██║ ╚██║ ██╔██╗██║
5
+ ██║███╗██║ ██║ ██║╚████║
6
+ ╚███╔███╔╝ ██║ ██║ ╚███║
7
+ ╚══╝╚══╝ ╚═╝ ╚═╝ ╚══╝
8
+
9
+ █▀█ █▀█ █▀█ █ █▀▀ █▀▀ ▀█▀
10
+ █▀▀ █▀█ █ █ █ █▀ █ █
11
+ █ █ █ █▄█ █▄█ █▄▄ █▄▄ █
12
+ ```
13
+
14
+ # Are you confused creating architecture rules, AGENTS.md, and folder structures from scratch every time you pick a new stack?
15
+
16
+ > **Just answer what tech stack you want.** `create-win-project` turns your answers into a runnable, tested, agent-ready foundation — not an empty folder with a giant doc dump.
17
+
18
+ Stop bikeshedding folders for 3 days. Stop pasting a 500-line `AGENTS.md` that burns tokens and still lets the agent hallucinate your stack. Your stack, your rules, already wired.
19
+
20
+ [![CI](https://github.com/itsw1n/create-win-project/actions/workflows/ci.yml/badge.svg)](https://github.com/itsw1n/create-win-project/actions/workflows/ci.yml)
21
+ [![Node](https://img.shields.io/badge/node-24_LTS-green)](https://nodejs.org)
22
+ [![Manifest-driven](https://img.shields.io/badge/architecture-manifest--driven-blue)](./playbooks)
23
+ [![Lean docs](https://img.shields.io/badge/AGENTS.md-lean%20%26%20lazy-9cf)](./playbooks)
24
+ [![Interactive](https://img.shields.io/badge/cli-interactive-ff69b4)](./index.js)
25
+
26
+ Next.js · React + Vite · Expo (React Native) · Spring Boot · Supabase · PostgreSQL · Tailwind · CSS Modules
27
+
28
+ ---
29
+
30
+ ## Why this exists
31
+
32
+ You were that dev who rebuilt the same foundation twice — Next.js App Router one week, Expo the next, Spring Boot after that. Same questions: where do components live? How does auth refresh? What goes in `AGENTS.md` without drowning the context window?
33
+
34
+ **The fix:** answer a short, plain-language interview and get **two coordinated outputs**:
35
+
36
+ 1. **A small runnable app** — real page/screen, strict TypeScript, ESLint, health endpoint, tests, and the exact config for your stack.
37
+ 2. **A task-routed docs layer** — a tiny always-on `AGENTS.md` + a lazy `RULES.md` (`concern → playbook §`). The agent reads only what it touches, when it touches it.
38
+
39
+ Manifests declare capabilities and package names. A tested compatibility profile owns every exact version, so generated stacks are declarative without letting version strings drift.
40
+
41
+ ## Prerequisites — what you actually need to install
42
+
43
+ ### Lane 1 — To run *this generator*
44
+ **Node 24 LTS *OR* Docker — that's it.**
45
+
46
+ - No global `prettier`, `eslint`, or `typescript` — they are generated inside your project (`package.json` devDeps + `.prettierrc` + `.editorconfig` + `eslint.config` via `lib/scaffold.js`).
47
+ - Prefer zero host setup? Use Docker directly. Make is an optional convenience, never a prerequisite.
48
+
49
+ ### Lane 2 — To run *what it generates* (depends on your answers)
50
+ | You picked | You need | What the generator includes |
51
+ |---|---|---|
52
+ | **Next.js** or **React + Vite** | Node 24 LTS → `npm install` → `npm run dev` | Page/entry, Vite/Next config, strict TS, ESLint, tests, `frontend/.env.example` |
53
+ | **Expo** | Node 24 LTS + Expo Go app → `npm install` → `npx expo start` | Expo Router layout/screen, `app.json`, Jest, TS |
54
+ | **Supabase** | Docker for the generated local Supabase stack | Pinned local CLI, migrations/RLS tests, platform-native clients; login/callback/secure lifecycle only when login is selected |
55
+ | **Spring Boot / PostgreSQL** | JDK 21 + Docker for DB **only if you selected them** | Maven app, public health + fail-closed security, Flyway/PostgreSQL; server session or OIDC Resource Server when login is selected |
56
+
57
+ **Hybrid:** the exact commands for *your* stack live in the README inside `./your-project` and `docs/guides/setup.md` — no duplication here. If you didn't enable Docker/Make, no compose file is generated.
58
+
59
+ ## Quick start
60
+
61
+ **Fastest (no clone required):**
62
+
63
+ ```bash
64
+ npx create-win-project@latest
65
+ ```
66
+
67
+ **From a clone with Node:**
68
+
69
+ ```bash
70
+ npm ci
71
+ npm run doctor
72
+ npm start
73
+ ```
74
+
75
+ **Docker-first (no host Node or Make needed):**
76
+
77
+ ```bash
78
+ git clone https://github.com/itsw1n/create-win-project && cd create-win-project
79
+ docker compose build
80
+ docker compose run --rm app
81
+ ```
82
+
83
+ `docker compose run` creates a disposable CLI container and reuses the existing image. It does not rebuild an existing image unless you explicitly build again. On systems with Make, `make build` and `make generate` are shortcuts; `make run` remains an alias for `make generate`.
84
+
85
+ <details>
86
+ <summary>Prefer host Node?</summary>
87
+
88
+ ```bash
89
+ npx create-win-project --install # install generated dependencies now
90
+ npx create-win-project --no-install # generate files only
91
+ npx create-win-project doctor # diagnose available tools
92
+ # then follow the same interview
93
+ ```
94
+
95
+ Requires Node 24 LTS. Still dockerizes the *generated* app only if you enabled it.
96
+
97
+ </details>
98
+
99
+ **Then run what you generated:**
100
+
101
+ ```bash
102
+ # Next.js or Expo
103
+ cd your-project
104
+ npm install
105
+ npm run dev
106
+
107
+ # React + Vite (frontend workspace)
108
+ cd your-project/frontend
109
+ npm install
110
+ npm run dev
111
+ ```
112
+
113
+ The generator asks whether to install dependencies. One local `npm install` provides Prettier, ESLint, TypeScript, and the selected test tools; global installs are neither required nor silently performed.
114
+
115
+ > The generator **never overwrites a non-empty folder** — it stages to a temp dir and moves into place only on success.
116
+
117
+ ## Features
118
+
119
+ - **Three frontend families** — Next.js App Router, React + Vite, and Expo Router.
120
+ - **Optional backends** — every frontend can choose no backend, Supabase, PostgreSQL where supported, or Spring Boot.
121
+ - **Styling** — Tailwind CSS or CSS Modules (native-styles for Expo).
122
+ - **Lean agent docs** — `AGENTS.md` (tiny, always on) + `RULES.md` (lazy index) generated per project.
123
+ - **Stack-native profiles** — Small, Medium (recommended/default), and Large map to familiar architecture for each selected stack; Large defaults to a modular monolith, not microservices.
124
+ - **Intent-based authentication** — choose Yes, Not yet, or No; the generator maps that intent to Supabase Auth, Spring server sessions, or external-provider OIDC validation as appropriate.
125
+ - **Manifest-driven** — `*.manifest.json` drives compatibility, exact dependency requests, env prefixes (`NEXT_PUBLIC_`/`VITE_`/`EXPO_PUBLIC_`), conditional playbooks, and concern wiring.
126
+ - **Tested compatibility profiles** — exact direct dependencies and runtime/container versions are resolved from one catalog; current and previous profiles are verified in CI.
127
+ - **Optional concerns, never mandated** — validation/Zod, data-fetching, state, t3-env, URL state are advisory (`CONTEXT.md` only) not forced.
128
+ - **Runnable foundations** — profile-specific feature slices, health endpoints, security headers, selected auth plumbing, Spring `ProblemDetail`, PostgreSQL Testcontainers, and risk-based tests.
129
+ - **Safety + contracts** — destination-exists guard, manifest ↔ heading checks, and a generated-output matrix covering every pairing, architecture profile, and applicable auth model.
130
+
131
+ ## What you get
132
+
133
+ | File | Purpose |
134
+ |------|---------|
135
+ | `AGENTS.md` | Lean, always-loaded guidance for your coding agent. |
136
+ | `RULES.md` | Lazy index — `concern → playbook §`. Read only what you touch. |
137
+ | `CONTEXT.md` | Project context + any advisory "expected concerns". |
138
+ | `playbooks/` | Curated rule playbooks (shipped lean). |
139
+ | `package.json` | Generated from the selected stack's manifest. |
140
+ | `create-win-project.profile.json` | Separately records compatibility, architecture, and authentication selections. |
141
+ | `.env.example` | Generated from the stack's declared env vars (prefixes already applied). |
142
+ | Framework source/config | A working page or screen, health endpoint where applicable, strict TypeScript, lint, tests, and build scripts. |
143
+ | `Makefile` / `docker-compose.yml` / `.github/workflows` | Optional, interview-toggled. |
144
+
145
+ ## How it works
146
+
147
+ The generator never hardcodes the folder or playbook list. It loads `playbooks/**/*.manifest.json` and resolves a *stack*:
148
+
149
+ ```jsonc
150
+ // playbooks/stack/nextjs.manifest.json (excerpt)
151
+ {
152
+ "id": "nextjs",
153
+ "kind": "frontend",
154
+ "label": "Next.js",
155
+ "appliesTo": { "backend": ["none", "supabase", "springboot", "postgres"] },
156
+ "architectureProfiles": ["small", "medium", "large"],
157
+ "playbooks": [
158
+ "stack/nextjs/architecture.md",
159
+ "stack/nextjs/structure.md",
160
+ "stack/nextjs/runtime.md",
161
+ "stack/nextjs/security.md",
162
+ "stack/nextjs/testing.md"
163
+ ],
164
+ "deps": ["next", "react", "react-dom"],
165
+ "concerns": [
166
+ { "id": "validation", "required": false, "when": "runtime validation needed", "sections": ["Zod for Runtime Validation"] }
167
+ ]
168
+ }
169
+ ```
170
+
171
+ Versions are resolved from `compatibility/profiles.json`; manifests never own them. The current tested profile is the default, while `--profile=YYYY.MM` selects a retained profile explicitly. Add a policy-only concern with a manifest + playbook. A new executable stack also needs a focused `lib/scaffold.js` implementation and a contract test — this prevents docs from advertising code that doesn't exist.
172
+
173
+ ## Topics
174
+
175
+ Next.js · React · Spring Boot · Supabase · PostgreSQL · TypeScript · Tailwind CSS · CSS Modules · project scaffolding · project template · `AGENTS.md` · coding agents · manifest-driven · lean documentation · lazy rules index
176
+
177
+ ## Contributing
178
+
179
+ 1. Fork and create a feature branch.
180
+ 2. `npm install` and `npm test` must stay green.
181
+ 3. Add or update a `*.manifest.json` for new stacks/concerns; put package versions only in `compatibility/profiles.json`.
182
+ 4. Run `npm run verify:generated -- --profile=2026.09 --case=nextjs-supabase --architecture=medium --authentication=yes` for a focused executable check. CI runs every supported combination, architecture/auth model, and retained profile.
183
+ 5. Document migration work for major upgrades, then open a pull request.
184
+
185
+ ## License
186
+
187
+ MIT — see [LICENSE](./LICENSE) if added, otherwise free to use and adapt.
package/ci/expo.yml ADDED
@@ -0,0 +1,28 @@
1
+ name: CI — React Native (Expo)
2
+
3
+ on:
4
+ push:
5
+ branches: [dev, main]
6
+ pull_request:
7
+ branches: [dev, main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ ci:
14
+ name: Lint, Test
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-node@v4
19
+ with:
20
+ node-version: "{{NODE_VERSION}}"
21
+ cache: npm
22
+ - run: npm ci
23
+ - run: npm run lint --if-present
24
+ - run: npm test
25
+ - name: Type check
26
+ run: npx tsc --noEmit
27
+ - name: Check Expo dependency compatibility
28
+ run: CI=1 npx expo install --check
package/ci/laravel.yml ADDED
@@ -0,0 +1,49 @@
1
+ name: CI — Laravel
2
+
3
+ on:
4
+ push:
5
+ branches: [dev, main]
6
+ pull_request:
7
+ branches: [dev, main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ laravel:
14
+ runs-on: ubuntu-latest
15
+ defaults:
16
+ run:
17
+ working-directory: {{LARAVEL_DIR}}
18
+ services:
19
+ postgres:
20
+ image: {{POSTGRES_IMAGE}}
21
+ env:
22
+ POSTGRES_DB: app_test
23
+ POSTGRES_USER: postgres
24
+ POSTGRES_PASSWORD: postgres
25
+ ports:
26
+ - 5432:5432
27
+ options: >-
28
+ --health-cmd "pg_isready -U postgres -d app_test"
29
+ --health-interval 5s
30
+ --health-timeout 5s
31
+ --health-retries 10
32
+ env:
33
+ APP_ENV: testing
34
+ APP_KEY: base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
35
+ DB_CONNECTION: pgsql
36
+ DB_HOST: 127.0.0.1
37
+ DB_PORT: 5432
38
+ DB_DATABASE: app_test
39
+ DB_USERNAME: postgres
40
+ DB_PASSWORD: postgres
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+ - uses: shivammathur/setup-php@v2
44
+ with:
45
+ php-version: "{{PHP_VERSION}}"
46
+ extensions: pdo_pgsql
47
+ coverage: none
48
+ - run: composer install --no-interaction --prefer-dist
49
+ - run: composer check
package/ci/nextjs.yml ADDED
@@ -0,0 +1,29 @@
1
+ name: CI — Next.js
2
+
3
+ on:
4
+ push:
5
+ branches: [dev, main]
6
+ pull_request:
7
+ branches: [dev, main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ ci:
14
+ name: Lint, Test, Build
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-node@v4
19
+ with:
20
+ node-version: "{{NODE_VERSION}}"
21
+ cache: npm
22
+ - run: npm ci
23
+ - run: npm run lint
24
+ - run: npm run typecheck
25
+ - run: npm run test
26
+ - run: npm run build
27
+ env:
28
+ NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}
29
+ NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY }}
@@ -0,0 +1,33 @@
1
+ name: CI — Backend
2
+
3
+ on:
4
+ push:
5
+ branches: [dev, main]
6
+ paths:
7
+ - backend/**
8
+ pull_request:
9
+ branches: [dev, main]
10
+ paths:
11
+ - backend/**
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ ci-backend:
18
+ name: Test, Build
19
+ runs-on: ubuntu-latest
20
+ defaults:
21
+ run:
22
+ working-directory: backend
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: actions/setup-java@v4
26
+ with:
27
+ java-version: "{{JAVA_VERSION}}"
28
+ distribution: temurin
29
+ cache: maven
30
+ - name: Run tests
31
+ run: ./mvnw --batch-mode test
32
+ - name: Build JAR
33
+ run: ./mvnw --batch-mode package -DskipTests
package/ci/vite.yml ADDED
@@ -0,0 +1,36 @@
1
+ name: CI — Frontend
2
+
3
+ on:
4
+ push:
5
+ branches: [dev, main]
6
+ paths:
7
+ - frontend/**
8
+ pull_request:
9
+ branches: [dev, main]
10
+ paths:
11
+ - frontend/**
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ ci-frontend:
18
+ name: Lint, Test, Build
19
+ runs-on: ubuntu-latest
20
+ defaults:
21
+ run:
22
+ working-directory: frontend
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: actions/setup-node@v4
26
+ with:
27
+ node-version: "{{NODE_VERSION}}"
28
+ cache: npm
29
+ cache-dependency-path: frontend/package-lock.json
30
+ - run: npm ci
31
+ - run: npm run lint
32
+ - run: npm run typecheck
33
+ - run: npm run test
34
+ - run: npm run build
35
+ env:
36
+ VITE_API_URL: http://localhost:8080
@@ -0,0 +1,237 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "defaultProfile": "2026.09",
4
+ "profiles": {
5
+ "2026.09": {
6
+ "status": "current",
7
+ "supportedUntil": "2027-09-30",
8
+ "springBoot": "4.0.3",
9
+ "springModulith": "2.0.8",
10
+ "runtimes": {
11
+ "node": "24.20.0",
12
+ "java": "21",
13
+ "maven": "3.9.16",
14
+ "postgres": "16",
15
+ "php": "8.5.10",
16
+ "composer": "2.10.3"
17
+ },
18
+ "images": {
19
+ "node": {
20
+ "repository": "node",
21
+ "tag": "24.20.0-alpine"
22
+ },
23
+ "maven": {
24
+ "repository": "maven",
25
+ "tag": "3.9.16-eclipse-temurin-21-alpine"
26
+ },
27
+ "java": {
28
+ "repository": "eclipse-temurin",
29
+ "tag": "21-jre-alpine"
30
+ },
31
+ "postgres": {
32
+ "repository": "postgres",
33
+ "tag": "16-alpine"
34
+ },
35
+ "nginx": {
36
+ "repository": "nginx",
37
+ "tag": "alpine"
38
+ },
39
+ "php": {
40
+ "repository": "php",
41
+ "tag": "8.5.10-fpm-alpine3.23"
42
+ },
43
+ "composer": {
44
+ "repository": "composer",
45
+ "tag": "2.10.3"
46
+ }
47
+ },
48
+ "composerPackages": {
49
+ "auth0/login": "7.22.0",
50
+ "fakerphp/faker": "1.24.1",
51
+ "laravel/framework": "13.30.1",
52
+ "laravel/sanctum": "4.3.3",
53
+ "laravel/pint": "1.30.5",
54
+ "larastan/larastan": "3.11.0",
55
+ "mockery/mockery": "1.6.12",
56
+ "pestphp/pest": "5.1.3",
57
+ "pestphp/pest-plugin-laravel": "5.0.1",
58
+ "inertiajs/inertia-laravel": "3.3.2",
59
+ "livewire/livewire": "4.4.3"
60
+ },
61
+ "packages": {
62
+ "@eslint/js": "9.39.5",
63
+ "@inertiajs/react": "3.7.0",
64
+ "@expo/metro-runtime": "57.0.15",
65
+ "@playwright/test": "1.62.1",
66
+ "@prisma/client": "7.10.0",
67
+ "@prisma/adapter-pg": "7.10.0",
68
+ "@supabase/ssr": "0.12.5",
69
+ "@supabase/supabase-js": "2.114.0",
70
+ "@tailwindcss/postcss": "4.3.3",
71
+ "@tailwindcss/vite": "4.3.3",
72
+ "@testing-library/jest-dom": "6.9.1",
73
+ "@testing-library/react": "16.3.3",
74
+ "@testing-library/react-native": "14.0.1",
75
+ "@types/jest": "29.5.14",
76
+ "@types/node": "24.13.3",
77
+ "@types/pg": "8.23.1",
78
+ "@types/react": "19.2.18",
79
+ "@types/react-dom": "19.2.5",
80
+ "@vitejs/plugin-react": "6.1.1",
81
+ "eslint": "9.39.5",
82
+ "eslint-config-next": "16.3.4",
83
+ "dotenv": "17.4.2",
84
+ "expo": "57.0.20",
85
+ "expo-router": "57.0.19",
86
+ "expo-secure-store": "57.0.3",
87
+ "jest": "29.7.0",
88
+ "jest-expo": "57.0.5",
89
+ "jsdom": "30.0.1",
90
+ "laravel-vite-plugin": "3.2.0",
91
+ "next": "16.3.4",
92
+ "prettier": "3.6.2",
93
+ "pg": "8.23.0",
94
+ "prisma": "7.10.0",
95
+ "react": {
96
+ "default": "19.2.8",
97
+ "overrides": {
98
+ "react-native": "19.2.3"
99
+ }
100
+ },
101
+ "react-dom": {
102
+ "default": "19.2.8",
103
+ "overrides": {
104
+ "react-native": "19.2.3"
105
+ }
106
+ },
107
+ "react-native": "0.86.3",
108
+ "react-native-safe-area-context": "5.7.0",
109
+ "react-native-web": "0.21.2",
110
+ "supabase": "2.116.0",
111
+ "tailwindcss": "4.3.3",
112
+ "testcontainers-junit-jupiter": "1.19.8",
113
+ "testcontainers-postgresql": "1.19.8",
114
+ "typescript": "6.0.3",
115
+ "typescript-eslint": "8.69.0",
116
+ "vite": "8.2.2",
117
+ "vitest": "4.1.11"
118
+ }
119
+ },
120
+ "2026.08": {
121
+ "status": "previous",
122
+ "supportedUntil": "2027-03-31",
123
+ "supersededBy": "2026.09",
124
+ "springBoot": "4.0.3",
125
+ "springModulith": "2.0.8",
126
+ "runtimes": {
127
+ "node": "24.20.0",
128
+ "java": "21",
129
+ "maven": "3.9.16",
130
+ "postgres": "16",
131
+ "php": "8.5.10",
132
+ "composer": "2.10.3"
133
+ },
134
+ "images": {
135
+ "node": {
136
+ "repository": "node",
137
+ "tag": "24.20.0-alpine"
138
+ },
139
+ "maven": {
140
+ "repository": "maven",
141
+ "tag": "3.9.16-eclipse-temurin-21-alpine"
142
+ },
143
+ "java": {
144
+ "repository": "eclipse-temurin",
145
+ "tag": "21-jre-alpine"
146
+ },
147
+ "postgres": {
148
+ "repository": "postgres",
149
+ "tag": "16-alpine"
150
+ },
151
+ "nginx": {
152
+ "repository": "nginx",
153
+ "tag": "alpine"
154
+ },
155
+ "php": {
156
+ "repository": "php",
157
+ "tag": "8.5.10-fpm-alpine3.23"
158
+ },
159
+ "composer": {
160
+ "repository": "composer",
161
+ "tag": "2.10.3"
162
+ }
163
+ },
164
+ "composerPackages": {
165
+ "auth0/login": "7.22.0",
166
+ "fakerphp/faker": "1.24.1",
167
+ "laravel/framework": "12.69.1",
168
+ "laravel/sanctum": "4.3.3",
169
+ "laravel/pint": "1.30.5",
170
+ "larastan/larastan": "3.11.0",
171
+ "mockery/mockery": "1.6.12",
172
+ "pestphp/pest": "4.7.8",
173
+ "pestphp/pest-plugin-laravel": "4.1.0",
174
+ "inertiajs/inertia-laravel": "3.3.2",
175
+ "livewire/livewire": "4.4.3"
176
+ },
177
+ "packages": {
178
+ "@eslint/js": "9.39.5",
179
+ "@inertiajs/react": "3.7.0",
180
+ "@expo/metro-runtime": "57.0.15",
181
+ "@playwright/test": "1.62.1",
182
+ "@prisma/client": "7.10.0",
183
+ "@prisma/adapter-pg": "7.10.0",
184
+ "@supabase/ssr": "0.12.5",
185
+ "@supabase/supabase-js": "2.114.0",
186
+ "@tailwindcss/postcss": "4.3.3",
187
+ "@tailwindcss/vite": "4.3.3",
188
+ "@testing-library/jest-dom": "6.9.1",
189
+ "@testing-library/react": "16.3.3",
190
+ "@testing-library/react-native": "14.0.1",
191
+ "@types/jest": "29.5.14",
192
+ "@types/node": "24.13.3",
193
+ "@types/pg": "8.23.1",
194
+ "@types/react": "19.2.18",
195
+ "@types/react-dom": "19.2.5",
196
+ "@vitejs/plugin-react": "6.1.1",
197
+ "eslint": "9.39.5",
198
+ "eslint-config-next": "16.3.4",
199
+ "dotenv": "17.4.2",
200
+ "expo": "57.0.20",
201
+ "expo-router": "57.0.19",
202
+ "expo-secure-store": "57.0.3",
203
+ "jest": "29.7.0",
204
+ "jest-expo": "57.0.5",
205
+ "jsdom": "30.0.1",
206
+ "laravel-vite-plugin": "3.2.0",
207
+ "next": "16.3.4",
208
+ "prettier": "3.6.2",
209
+ "pg": "8.23.0",
210
+ "prisma": "7.10.0",
211
+ "react": {
212
+ "default": "19.2.8",
213
+ "overrides": {
214
+ "react-native": "19.2.3"
215
+ }
216
+ },
217
+ "react-dom": {
218
+ "default": "19.2.8",
219
+ "overrides": {
220
+ "react-native": "19.2.3"
221
+ }
222
+ },
223
+ "react-native": "0.86.3",
224
+ "react-native-safe-area-context": "5.7.0",
225
+ "react-native-web": "0.21.2",
226
+ "supabase": "2.116.0",
227
+ "tailwindcss": "4.3.3",
228
+ "testcontainers-junit-jupiter": "1.19.8",
229
+ "testcontainers-postgresql": "1.19.8",
230
+ "typescript": "6.0.3",
231
+ "typescript-eslint": "8.69.0",
232
+ "vite": "8.2.2",
233
+ "vitest": "4.1.11"
234
+ }
235
+ }
236
+ }
237
+ }