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.
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/ci/expo.yml +28 -0
- package/ci/laravel.yml +49 -0
- package/ci/nextjs.yml +29 -0
- package/ci/springboot.yml +33 -0
- package/ci/vite.yml +36 -0
- package/compatibility/profiles.json +237 -0
- package/docs/ARCHITECTURE.md +118 -0
- package/docs/CONTENT_MODEL.md +36 -0
- package/docs/DEPENDENCY_MAINTENANCE.md +31 -0
- package/index.js +431 -0
- package/lib/application-shapes.js +95 -0
- package/lib/banner.js +45 -0
- package/lib/catalog.js +343 -0
- package/lib/compatibility.js +116 -0
- package/lib/constants.js +3 -0
- package/lib/doctor.js +45 -0
- package/lib/files.js +158 -0
- package/lib/generator.js +366 -0
- package/lib/interview.js +77 -0
- package/lib/laravel-scaffold.js +3 -0
- package/lib/playbooks.js +172 -0
- package/lib/project-location.js +18 -0
- package/lib/scaffold.js +467 -0
- package/lib/stacks/context.js +27 -0
- package/lib/stacks/contract.js +142 -0
- package/lib/stacks/index.js +8 -0
- package/lib/stacks/laravel/architecture.js +27 -0
- package/lib/stacks/laravel/auth/oidc.js +13 -0
- package/lib/stacks/laravel/auth/public.js +28 -0
- package/lib/stacks/laravel/auth/sanctum.js +14 -0
- package/lib/stacks/laravel/auth/session.js +17 -0
- package/lib/stacks/laravel/composer.js +50 -0
- package/lib/stacks/laravel/generate.js +362 -0
- package/lib/stacks/laravel/index.js +18 -0
- package/lib/stacks/laravel/ui/blade.js +15 -0
- package/lib/stacks/laravel/ui/index.js +29 -0
- package/lib/stacks/laravel/ui/inertia-react.js +35 -0
- package/lib/stacks/laravel/ui/livewire.js +39 -0
- package/lib/stacks/laravel/ui/shared.js +14 -0
- package/lib/stacks/registry.js +42 -0
- package/lib/stacks/shared/contributions.js +25 -0
- package/lib/template.js +62 -0
- package/package.json +49 -0
- package/playbooks/INDEX.md +58 -0
- package/playbooks/capabilities/auth/oidc-resource-server.md +15 -0
- package/playbooks/capabilities/auth/spring-session.md +15 -0
- package/playbooks/capabilities/ci/github-actions.manifest.json +10 -0
- package/playbooks/capabilities/ci/github-actions.md +61 -0
- package/playbooks/capabilities/docker/docker.manifest.json +11 -0
- package/playbooks/capabilities/docker/overview.md +55 -0
- package/playbooks/capabilities/flyway/environments.md +5 -0
- package/playbooks/capabilities/flyway/flyway.manifest.json +12 -0
- package/playbooks/capabilities/flyway/migrations.md +7 -0
- package/playbooks/capabilities/flyway/testing.md +5 -0
- package/playbooks/capabilities/laravel/database.md +8 -0
- package/playbooks/capabilities/laravel/migrations.md +15 -0
- package/playbooks/capabilities/laravel/observability.md +8 -0
- package/playbooks/capabilities/laravel/oidc-resource-server.md +10 -0
- package/playbooks/capabilities/laravel/queues.md +8 -0
- package/playbooks/capabilities/laravel/sanctum-spa.md +8 -0
- package/playbooks/capabilities/laravel/scheduler.md +7 -0
- package/playbooks/capabilities/laravel/session-auth.md +8 -0
- package/playbooks/capabilities/laravel/storage-uploads.md +7 -0
- package/playbooks/capabilities/postgresql/architecture.md +5 -0
- package/playbooks/capabilities/postgresql/migrations.md +5 -0
- package/playbooks/capabilities/postgresql/postgresql.manifest.json +15 -0
- package/playbooks/capabilities/postgresql/schema-design.md +7 -0
- package/playbooks/capabilities/postgresql/security.md +5 -0
- package/playbooks/capabilities/postgresql/testing.md +5 -0
- package/playbooks/capabilities/prisma/architecture.md +5 -0
- package/playbooks/capabilities/prisma/migrations.md +11 -0
- package/playbooks/capabilities/prisma/prisma.manifest.json +14 -0
- package/playbooks/capabilities/prisma/runtime.md +5 -0
- package/playbooks/capabilities/prisma/schema.md +5 -0
- package/playbooks/capabilities/prisma/testing.md +5 -0
- package/playbooks/capabilities/supabase/architecture.md +5 -0
- package/playbooks/capabilities/supabase/authentication.md +5 -0
- package/playbooks/capabilities/supabase/expo.md +16 -0
- package/playbooks/capabilities/supabase/migrations.md +7 -0
- package/playbooks/capabilities/supabase/nextjs.md +24 -0
- package/playbooks/capabilities/supabase/rls.md +7 -0
- package/playbooks/capabilities/supabase/supabase.manifest.json +32 -0
- package/playbooks/capabilities/supabase/testing.md +5 -0
- package/playbooks/capabilities/supabase/vite.md +14 -0
- package/playbooks/concerns/axios.md +123 -0
- package/playbooks/concerns/next-safe-action.md +66 -0
- package/playbooks/concerns/next-themes.md +87 -0
- package/playbooks/concerns/nuqs.md +59 -0
- package/playbooks/concerns/t3-env.md +48 -0
- package/playbooks/concerns/tanstack-query.md +145 -0
- package/playbooks/concerns/zod.md +174 -0
- package/playbooks/concerns/zustand.md +93 -0
- package/playbooks/devops/makefile.manifest.json +10 -0
- package/playbooks/devops/makefile.md +556 -0
- package/playbooks/devops/pr-template.manifest.json +10 -0
- package/playbooks/devops/pr-template.md +106 -0
- package/playbooks/platform/laravel-ui/blade/architecture.md +5 -0
- package/playbooks/platform/laravel-ui/blade/runtime.md +5 -0
- package/playbooks/platform/laravel-ui/blade/security.md +5 -0
- package/playbooks/platform/laravel-ui/blade/structure.md +5 -0
- package/playbooks/platform/laravel-ui/blade/testing.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/architecture.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/runtime.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/security.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/structure.md +5 -0
- package/playbooks/platform/laravel-ui/inertia-react/testing.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/architecture.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/runtime.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/security.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/structure.md +5 -0
- package/playbooks/platform/laravel-ui/livewire/testing.md +5 -0
- package/playbooks/platform/mobile.manifest.json +17 -0
- package/playbooks/platform/mobile.md +15 -0
- package/playbooks/platform/web.manifest.json +17 -0
- package/playbooks/platform/web.md +17 -0
- package/playbooks/stack/expo/architecture.md +27 -0
- package/playbooks/stack/expo/runtime.md +14 -0
- package/playbooks/stack/expo/security.md +18 -0
- package/playbooks/stack/expo/structure.md +26 -0
- package/playbooks/stack/expo/testing.md +13 -0
- package/playbooks/stack/laravel/architecture.md +34 -0
- package/playbooks/stack/laravel/runtime.md +27 -0
- package/playbooks/stack/laravel/security.md +23 -0
- package/playbooks/stack/laravel/structure.md +29 -0
- package/playbooks/stack/laravel/testing.md +22 -0
- package/playbooks/stack/laravel-ui.manifest.json +42 -0
- package/playbooks/stack/laravel.manifest.json +35 -0
- package/playbooks/stack/nextjs/architecture.md +62 -0
- package/playbooks/stack/nextjs/runtime.md +31 -0
- package/playbooks/stack/nextjs/security.md +32 -0
- package/playbooks/stack/nextjs/structure.md +50 -0
- package/playbooks/stack/nextjs/testing.md +20 -0
- package/playbooks/stack/nextjs.manifest.json +49 -0
- package/playbooks/stack/no-frontend.manifest.json +25 -0
- package/playbooks/stack/none.manifest.json +21 -0
- package/playbooks/stack/react-native.manifest.json +49 -0
- package/playbooks/stack/react-vite/architecture.md +33 -0
- package/playbooks/stack/react-vite/runtime.md +13 -0
- package/playbooks/stack/react-vite/security.md +16 -0
- package/playbooks/stack/react-vite/structure.md +23 -0
- package/playbooks/stack/react-vite/testing.md +12 -0
- package/playbooks/stack/react-vite.manifest.json +46 -0
- package/playbooks/stack/springboot/architecture.md +40 -0
- package/playbooks/stack/springboot/runtime.md +28 -0
- package/playbooks/stack/springboot/security.md +28 -0
- package/playbooks/stack/springboot/structure.md +30 -0
- package/playbooks/stack/springboot/testing.md +22 -0
- package/playbooks/stack/springboot.manifest.json +38 -0
- package/playbooks/styling/css-modules-extensions.md +267 -0
- package/playbooks/styling/css-modules.manifest.json +11 -0
- package/playbooks/styling/native-styles.manifest.json +9 -0
- package/playbooks/styling/native-styles.md +29 -0
- package/playbooks/styling/tailwind-extensions.md +182 -0
- package/playbooks/styling/tailwind.manifest.json +11 -0
- package/playbooks/universal/accessibility.manifest.json +11 -0
- package/playbooks/universal/accessibility.md +45 -0
- package/playbooks/universal/coding-rules.manifest.json +12 -0
- package/playbooks/universal/coding-rules.md +281 -0
- package/playbooks/universal/error-handling.manifest.json +10 -0
- package/playbooks/universal/error-handling.md +21 -0
- package/playbooks/universal/git-conventions.manifest.json +10 -0
- package/playbooks/universal/git-conventions.md +186 -0
- package/playbooks/universal/observability.manifest.json +10 -0
- package/playbooks/universal/observability.md +29 -0
- package/playbooks/universal/security.manifest.json +11 -0
- package/playbooks/universal/security.md +30 -0
- package/playbooks/universal/typescript.manifest.json +11 -0
- package/playbooks/universal/typescript.md +272 -0
- package/scripts/compatibility-matrix.mjs +48 -0
- package/scripts/validate-content.mjs +76 -0
- package/scripts/verify-generated.mjs +153 -0
- package/templates/agents/nextjs.md +47 -0
- package/templates/agents/react-native.md +48 -0
- package/templates/agents/react-vite.md +48 -0
- package/templates/docker/compose/postgres.yml +29 -0
- package/templates/docker/compose/springboot.yml +69 -0
- package/templates/docker/compose/supabase.yml +18 -0
- package/templates/docker/compose-prod/springboot.yml +64 -0
- package/templates/docker/dockerfile/laravel-inertia.dev.dockerfile +21 -0
- package/templates/docker/dockerfile/laravel.dev.dockerfile +12 -0
- package/templates/docker/dockerfile/laravel.prod.dockerfile +13 -0
- package/templates/docker/dockerfile/nextjs.dev.dockerfile +6 -0
- package/templates/docker/dockerfile/nextjs.prod.dockerfile +18 -0
- package/templates/docker/dockerfile/springboot.dev.dockerfile +5 -0
- package/templates/docker/dockerfile/springboot.prod.dockerfile +10 -0
- package/templates/docker/dockerfile/vite.dev.dockerfile +6 -0
- package/templates/docker/dockerfile/vite.prod.dockerfile +12 -0
- package/templates/gitignore/base.gitignore +32 -0
- package/templates/gitignore/nextjs.gitignore +40 -0
- package/templates/gitignore/react-native.gitignore +43 -0
- package/templates/gitignore/react-vite.gitignore +39 -0
- package/templates/makefile/frontend.mk +31 -0
- package/templates/makefile/laravel.mk +47 -0
- package/templates/makefile/postgres.mk +40 -0
- package/templates/makefile/springboot.mk +125 -0
- 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
|
+
[](https://github.com/itsw1n/create-win-project/actions/workflows/ci.yml)
|
|
21
|
+
[](https://nodejs.org)
|
|
22
|
+
[](./playbooks)
|
|
23
|
+
[](./playbooks)
|
|
24
|
+
[](./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
|
+
}
|