kodu 2.1.1 → 2.1.3

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 (32) hide show
  1. package/AGENTS.md +23 -1
  2. package/__tests__/core/fs/fs.service.test.ts +72 -0
  3. package/__tests__/shared/cleaner/cleaner.service.test.ts +102 -0
  4. package/__tests__/shared/git/git.service.test.ts +84 -0
  5. package/__tests__/shared/tokenizer/tokenizer.service.test.ts +45 -0
  6. package/dist/package.json +14 -3
  7. package/dist/src/commands/init/init.command.d.ts +1 -0
  8. package/dist/src/commands/init/init.command.js +34 -1
  9. package/dist/src/commands/init/init.command.js.map +1 -1
  10. package/dist/src/core/config/config.service.js +2 -4
  11. package/dist/src/core/config/config.service.js.map +1 -1
  12. package/dist/tsconfig.build.tsbuildinfo +1 -1
  13. package/lefthook.yml +9 -2
  14. package/package.json +14 -3
  15. package/skills/doc-gen/SKILL.md +490 -0
  16. package/skills/doc-gen/scripts/doc_gen.py +911 -0
  17. package/skills/implement-project/SKILL.md +409 -0
  18. package/skills/liteend-init/SKILL.md +84 -0
  19. package/skills/litefront-init/SKILL.md +96 -0
  20. package/skills/litefront-prototype/SKILL.md +484 -0
  21. package/skills/project-setup-standardizer/SKILL.md +285 -0
  22. package/skills/start/SKILL.md +319 -0
  23. package/skills/tech-blueprint/SKILL.md +890 -0
  24. package/skills/tech-blueprint/scripts/blueprint_validator.py +417 -0
  25. package/src/commands/init/init.command.ts +43 -1
  26. package/src/core/config/config.service.ts +3 -6
  27. package/tsconfig.build.json +3 -0
  28. package/tsconfig.json +5 -2
  29. package/dist/scripts/generate-json-schema.d.ts +0 -1
  30. package/dist/scripts/generate-json-schema.js +0 -17
  31. package/dist/scripts/generate-json-schema.js.map +0 -1
  32. package/skills/kodu-ops/SKILL.md +0 -184
@@ -0,0 +1,409 @@
1
+ ---
2
+ name: implement-project
3
+ description: Реализует полный проект по готовым документации, ТЗ и прототипу. Инициализирует бэкенд (liteend-init) и фронтенд (litefront-init), реализует все сущности/операции/страницы, покрывает тестами, верифицирует соответствие документам. Запускай когда VISION.md + SPEC.md готовы и tech-blueprint утверждён. НЕ запускай если ТЗ ещё черновик или проект уже частично реализован.
4
+ license: MIT
5
+ compatibility: opencode
6
+ metadata:
7
+ level: multi
8
+ output: папка projects/<ИмяПроекта>/
9
+ ---
10
+
11
+ ## Назначение
12
+
13
+ Скилл берёт готовые артефакты проектирования и **реализует проект от нуля до работающего состояния с тестами**:
14
+ - Инициализирует бэкенд и фронтенд из стартовых шаблонов
15
+ - Имплементирует всю бизнес-логику строго по ТЗ
16
+ - Покрывает тестами согласно TESTING_PLAN.md
17
+ - Верифицирует соответствие документации и запускает полный прогон проверок
18
+
19
+ **Когда запускать:**
20
+ - `docs/<name>/` и `blueprint/<name>/3_TECH_BLUEPRINT/` готовы и утверждены
21
+ - ТЗ прошло валидацию `blueprint_validator.py` без ошибок
22
+ - Команда готова к разработке
23
+
24
+ **Когда НЕ запускать:**
25
+ - ТЗ в черновике или не прошло валидацию
26
+ - Проект уже частично реализован (это не скилл для рефакторинга)
27
+ - Задача — добавить одну фичу, а не построить проект с нуля
28
+
29
+ ---
30
+
31
+ ## Входные данные
32
+
33
+ Перед началом **обязательно прочитать** все документы:
34
+
35
+ ```
36
+ docs/<ИмяПроекта>/
37
+ ├── 1_PRODUCT_VISION/VISION.md ← бизнес-цели, границы, роли
38
+ └── 2_PRODUCT_SPEC/SPEC.md ← сущности, операции, страницы, бизнес-правила
39
+
40
+ blueprint/<ИмяПроекта>/3_TECH_BLUEPRINT/
41
+ ├── IMPLEMENTATION_GUIDE.md ← стек, что уже готово, команды запуска
42
+ ├── DATABASE_MODEL.md ← Prisma-схема всех моделей
43
+ ├── API_CONTRACTS.md ← GraphQL-схема, guards, пагинация
44
+ ├── ARCHITECTURE.md ← NestJS-модули, FSD-слайсы, состояние
45
+ └── TESTING_PLAN.md ← unit-тесты, E2E-сценарии, coverage
46
+
47
+ prototype/ ← UI-прототип (только для понимания UX-потоков)
48
+ ```
49
+
50
+ Если любой из первых шести документов отсутствует — **остановиться** и сообщить пользователю какого файла не хватает. Прототип опционален.
51
+
52
+ ---
53
+
54
+ ## Структура вывода
55
+
56
+ ```
57
+ projects/<ИмяПроекта>/
58
+ ├── backend/ ← NestJS + Fastify API (инициализируется через liteend-init)
59
+ └── frontend/ ← React SPA (инициализируется через litefront-init)
60
+ ```
61
+
62
+ Создать корневую папку до инициализации:
63
+ ```bash
64
+ mkdir -p projects/<ИмяПроекта>
65
+ ```
66
+
67
+ ---
68
+
69
+ ## Процесс реализации
70
+
71
+ ### Шаг 0. Анализ документации
72
+
73
+ 1. Прочитать все документы целиком
74
+ 2. Составить внутренний рабочий список:
75
+ - Prisma-модели из DATABASE_MODEL.md (без Profile/ProfileRole — они уже в шаблоне)
76
+ - GraphQL-операции по доменам из API_CONTRACTS.md (без `me`, `updateProfile`, `profileUpdated`, `debug`, `echo`)
77
+ - NestJS-модули из ARCHITECTURE.md §Backend
78
+ - FSD-слайсы для реализации из ARCHITECTURE.md §Frontend (без `features/auth`, `widgets/Header`, `pages/404`, `shared/api/graphql-client`)
79
+ - Тест-сценарии из TESTING_PLAN.md
80
+ 3. Зафиксировать: всё из стартовых шаблонов — **не трогать и не дублировать**
81
+
82
+ ---
83
+
84
+ ### Шаг 1. Инициализация бэкенда
85
+
86
+ Запустить скилл **liteend-init** (`~/.config/opencode/skills/liteend-init/SKILL.md`):
87
+
88
+ ```
89
+ project_name: projects/<ИмяПроекта>/backend
90
+ use_docker: true
91
+ install_deps: true
92
+ ```
93
+
94
+ После завершения:
95
+ - Прочитать `projects/<ИмяПроекта>/backend/AGENTS.md` — понять доступные команды проекта
96
+ - Убедиться что `GET /health` отвечает 200 (бэкенд запустился)
97
+
98
+ ---
99
+
100
+ ### Шаг 2. Реализация бэкенда
101
+
102
+ **2.1. Схема базы данных**
103
+
104
+ Открыть `backend/prisma/schema.prisma` и **добавить** новые модели из DATABASE_MODEL.md к существующим:
105
+ - Существующие модели `Profile`, `ProfileRole` — не изменять
106
+ - Для связи новых сущностей с пользователем: `profileId Int` + `@relation(fields: [profileId], references: [id], onDelete: Cascade)`
107
+ - Все связи — с явным `onDelete`; все перечислимые значения — только через `enum`
108
+
109
+ Применить миграцию:
110
+ ```bash
111
+ # внутри backend/
112
+ npm run db:migrations:apply
113
+ ```
114
+
115
+ **2.2. NestJS-модули**
116
+
117
+ Для каждого модуля из ARCHITECTURE.md §Backend создать структуру:
118
+ ```
119
+ src/modules/<domain>/
120
+ ├── <domain>.module.ts ← @Module({ imports, providers, exports })
121
+ ├── <domain>.resolver.ts ← @Resolver() с GraphQL-операциями
122
+ ├── <domain>.service.ts ← бизнес-логика, Prisma-запросы
123
+ └── dto/
124
+ └── <entity>.input.ts ← ZodDto или class-validator Input для мутаций
125
+ ```
126
+
127
+ Правила реализации резолверов:
128
+ - Guards соответствуют директивам доступа из API_CONTRACTS.md:
129
+ ```typescript
130
+ @UseGuards(JwtAuthGuard) // # @auth в API_CONTRACTS.md
131
+ @UseGuards(JwtOptionalAuthGuard) // # @auth? в API_CONTRACTS.md
132
+ @Roles(ProfileRole.ADMIN) // # @auth @hasRole(ADMIN)
133
+ // без guard // # @public
134
+ ```
135
+ - Текущий пользователь: `@CurrentUser() profile: Profile`
136
+ - Ошибки: выбрасывать `HttpException` или `ZodValidationException` — `gqlErrorFormatter` сам преобразует
137
+ - Soft delete: при `deletedAt DateTime?` в модели → фильтровать `{ deletedAt: null }` во **всех** запросах Prisma
138
+ - Пагинация: все списочные операции принимают `limit`/`offset` и возвращают `{ items, total, hasMore }`
139
+
140
+ **2.3. Subscriptions**
141
+
142
+ Если в API_CONTRACTS.md есть Subscription-операции — реализовывать через Redis pub/sub (уже настроен). Не добавлять новых transport-зависимостей.
143
+
144
+ **2.4. Коммит бэкенда**
145
+ ```bash
146
+ git add .
147
+ git commit -m "feat(backend): реализация бизнес-логики <ИмяПроекта>"
148
+ ```
149
+
150
+ ---
151
+
152
+ ### Шаг 3. Инициализация фронтенда
153
+
154
+ Запустить скилл **litefront-init** (`~/.config/opencode/skills/litefront-init/SKILL.md`):
155
+
156
+ ```
157
+ project_name: projects/<ИмяПроекта>/frontend
158
+ install_deps: true
159
+ setup_env: true
160
+ run_dev: false
161
+ ```
162
+
163
+ Настроить `.env` фронтенда:
164
+ ```
165
+ VITE_GRAPHQL_API_URL=http://localhost:<PORT>/graphql
166
+ VITE_BASE_URL=http://localhost:<FRONT_PORT>
167
+ VITE_OIDC_AUTHORITY=<из IMPLEMENTATION_GUIDE.md>
168
+ VITE_OIDC_CLIENT_ID=<из IMPLEMENTATION_GUIDE.md>
169
+ ```
170
+
171
+ Запустить бэкенд в фоне и сгенерировать GraphQL-типы:
172
+ ```bash
173
+ # в backend/:
174
+ npm run start:dev &
175
+
176
+ # в frontend/:
177
+ npm run gen
178
+ ```
179
+
180
+ Прочитать `projects/<ИмяПроекта>/frontend/AGENTS.md` — понять доступные команды.
181
+
182
+ **3.5. Корневой AGENTS.md проекта**
183
+
184
+ Создать `projects/<ИмяПроекта>/AGENTS.md`:
185
+
186
+ ```markdown
187
+ # <ИмяПроекта>
188
+
189
+ ## Структура проекта
190
+
191
+ - `backend/` — NestJS + Fastify API
192
+ - `frontend/` — React SPA
193
+
194
+ ## Важно
195
+
196
+ При работе с бэкендом **обязательно прочитать** `backend/AGENTS.md`.
197
+ При работе с фронтендом **обязательно прочитать** `frontend/AGENTS.md`.
198
+
199
+ Каждый подпроект содержит специфичные команды, соглашения и особенности среды,
200
+ которые необходимо знать перед внесением изменений.
201
+ ```
202
+
203
+ ---
204
+
205
+ ### Шаг 4. Реализация фронтенда
206
+
207
+ **4.1. FSD-слайсы (только новые)**
208
+
209
+ Для каждого слайса из ARCHITECTURE.md §Frontend: FSD-слайсы создать структуру:
210
+ ```
211
+ src/
212
+ ├── entities/<name>/
213
+ │ ├── api/ ← URQL useQuery / useMutation с типами из npm run gen
214
+ │ └── model/ ← TypeScript-типы, трансформации данных
215
+ ├── features/<name>/
216
+ │ ├── ui/ ← React-компоненты
217
+ │ └── model/ ← Zustand-стор или локальное состояние
218
+ └── widgets/<name>/
219
+ └── ui/
220
+ ```
221
+
222
+ Правила:
223
+ - GraphQL-запросы: только через URQL, типы из `npm run gen` — без `any`
224
+ - Zustand-стор: `create(devtools<MyStore>((set, get) => ({ ... })))` — только UI-состояние, не дублировать серверные данные
225
+ - Компоненты: из прототипа брать только UX-логику (потоки, формы), не копировать код
226
+ - **Тема и стиль:** взять из прототипа как базовую основу — цветовая схема, типографика, отступы, визуальный язык. Реальные компоненты должны выглядеть узнаваемо по сравнению с прототипом
227
+ - **Никаких замоканных данных в production-коде:** все данные получаются через GraphQL-запросы к бэкенду. Хардкод данных и `mockData`-константы допустимы только в тестах (`*.test.ts`, `*.spec.ts`, `tests/`)
228
+
229
+ **4.2. Страницы и роутинг**
230
+
231
+ Для каждой страницы из ARCHITECTURE.md §Pages создать файл в `src/routes/`:
232
+
233
+ ```typescript
234
+ // Защищённая страница (паттерн beforeLoad):
235
+ export const Route = createFileRoute('/my-page')({
236
+ beforeLoad: ({ context: { auth } }) => {
237
+ if (!auth.isAuthenticated) throw redirect({ to: '/' })
238
+ },
239
+ component: () => <AuthGuard><MyPage /></AuthGuard>,
240
+ })
241
+
242
+ // Публичная страница:
243
+ export const Route = createFileRoute('/public-page')({
244
+ component: MyPublicPage,
245
+ })
246
+ ```
247
+
248
+ **4.3. Переменные окружения**
249
+
250
+ Добавить в `.env` переменные из ARCHITECTURE.md §Переменные окружения (только бизнес-специфичные).
251
+
252
+ **4.4. i18n**
253
+
254
+ Если ARCHITECTURE.md §Frontend: локализация содержит namespace'ы — создать файлы переводов в `messages/`.
255
+
256
+ **4.5. Коммит фронтенда**
257
+ ```bash
258
+ git add .
259
+ git commit -m "feat(frontend): реализация <ИмяПроекта>"
260
+ ```
261
+
262
+ ---
263
+
264
+ ### Шаг 5. Тесты
265
+
266
+ Реализовать все сценарии из TESTING_PLAN.md. **Не пропускать сценарии** — каждый описан в документе.
267
+
268
+ **Backend E2E (Vitest + E2EClient):**
269
+ ```typescript
270
+ describe('<Domain>Resolver', () => {
271
+ let client: E2EClient
272
+
273
+ beforeEach(async () => {
274
+ await clearDatabase()
275
+ await clearRedis()
276
+ client = await createTestClient()
277
+ })
278
+
279
+ it('успешный сценарий', async () => {
280
+ const profile = await createTestProfile()
281
+ await client.loginAs(profile)
282
+ const result = await client.requestGraphQL<QueryType>(QUERY, vars)
283
+ expect(result.data).toBeDefined()
284
+ })
285
+
286
+ it('негативный сценарий — нет прав', async () => {
287
+ const result = await client.requestGraphQL<QueryType>(QUERY, vars)
288
+ expect(result.errors?.[0].message).toContain('Unauthorized')
289
+ })
290
+ })
291
+ ```
292
+
293
+ **Backend unit (Vitest + NestJS Testing Module):**
294
+ ```typescript
295
+ describe('<Domain>Service.complexMethod', () => {
296
+ it('корректно рассчитывает ...', () => {
297
+ const result = service.complexMethod(input)
298
+ expect(result).toEqual(expected)
299
+ })
300
+ })
301
+ ```
302
+
303
+ **Frontend component (Vitest + React Testing Library):**
304
+ ```typescript
305
+ describe('<ComponentName>', () => {
306
+ it('отображает состояние загрузки', () => {
307
+ render(<MyComponent loading />)
308
+ expect(screen.getByRole('progressbar')).toBeInTheDocument()
309
+ })
310
+ })
311
+ // OIDC автоматически замокан через tests/setup.ts — дополнительная настройка не нужна
312
+ ```
313
+
314
+ **Frontend E2E (Playwright):**
315
+ ```typescript
316
+ // Запускать с VITE_MOCK_AUTH=true — MockAuthProvider авторизует автоматически
317
+ test('критический путь: <название>', async ({ page }) => {
318
+ await page.goto('/target-page')
319
+ await page.getByRole('button', { name: 'Действие' }).click()
320
+ await expect(page.getByText('Успех')).toBeVisible()
321
+ })
322
+ ```
323
+
324
+ **Коммит тестов:**
325
+ ```bash
326
+ git add .
327
+ git commit -m "test(<ИмяПроекта>): покрытие по TESTING_PLAN.md"
328
+ ```
329
+
330
+ ---
331
+
332
+ ### Шаг 6. Верификация (обязательна — не пропускать)
333
+
334
+ **6.1. Автоматические проверки**
335
+
336
+ Запустить в обоих проектах:
337
+ ```bash
338
+ # Бэкенд:
339
+ cd projects/<ИмяПроекта>/backend && npm run check && npm run test:all
340
+
341
+ # Фронтенд:
342
+ cd projects/<ИмяПроекта>/frontend && npm run check && npm run test:all
343
+ ```
344
+
345
+ **Если хотя бы одна команда завершается с ошибкой — устранить причину и запустить повторно.** Проект не считается реализованным, пока все проверки не зелёные.
346
+
347
+ **6.2. Ручной чеклист по документам**
348
+
349
+ Сверить реализацию с каждым документом:
350
+
351
+ **DATABASE_MODEL.md:**
352
+ - [ ] Каждая Prisma-модель из документа существует в `schema.prisma`
353
+ - [ ] Все миграции применены — `prisma migrate status` без pending
354
+ - [ ] Индексы `@@index`, уникальные ограничения `@@unique` соответствуют документу
355
+ - [ ] Каскадные операции `onDelete`/`onUpdate` соответствуют документу
356
+
357
+ **API_CONTRACTS.md:**
358
+ - [ ] Каждая Query/Mutation/Subscription реализована в соответствующем резолвере
359
+ - [ ] Guards соответствуют директивам (`# @auth` → `JwtAuthGuard`, `# @public` → без guard)
360
+ - [ ] Типы возвращаемых значений совпадают (включая wrapper-типы пагинации)
361
+ - [ ] Input-типы мутаций соответствуют схеме
362
+
363
+ **ARCHITECTURE.md:**
364
+ - [ ] Все NestJS-модули из §Backend реализованы и зарегистрированы в AppModule
365
+ - [ ] Все FSD-слайсы из §Frontend реализованы (кроме boilerplate-слайсов)
366
+ - [ ] Все страницы из §Pages существуют и маршрутизируются корректно
367
+ - [ ] Серверный стейт управляется через URQL, UI-стейт — через Zustand
368
+
369
+ **TESTING_PLAN.md:**
370
+ - [ ] Все сценарии из §Unit-тесты реализованы
371
+ - [ ] Все сценарии из §E2E-сценарии реализованы
372
+ - [ ] Все сценарии из §Критические пути покрыты
373
+ - [ ] Все сценарии из §Негативные сценарии покрыты
374
+ - [ ] Coverage: statements / functions / lines ≥ 80%, branches ≥ 70%
375
+
376
+ **SPEC.md:**
377
+ - [ ] Все бизнес-сущности из §Сущности присутствуют в коде
378
+ - [ ] Все бизнес-правила из §Ключевые операции реализованы и соблюдены
379
+ - [ ] Все страницы из §Страницы реализованы
380
+
381
+ **Прототип:**
382
+ - [ ] Ключевые UX-потоки прототипа воспроизводятся в готовом продукте
383
+ - [ ] Формы, действия и обратная связь пользователю соответствуют прототипу
384
+ - [ ] Визуальный стиль (цвета, типографика, компоновка) соответствует прототипу
385
+ - [ ] В production-коде нет замоканных данных, хардкод-констант и `TODO: replace with API`
386
+
387
+ ---
388
+
389
+ ### Шаг 7. Финальный коммит
390
+
391
+ ```bash
392
+ git add .
393
+ git commit -m "feat(<ИмяПроекта>): полная реализация — все тесты зелёные"
394
+ ```
395
+
396
+ ---
397
+
398
+ ## Ключевые ограничения
399
+
400
+ - **Не дублировать стартовый шаблон:** модель `Profile`, операции `me`/`updateProfile`/`profileUpdated`, слайсы `features/auth`, `widgets/Header`, `pages/404`, `shared/api/graphql-client` — уже готовы, не трогать
401
+ - **Только типизированный код:** TypeScript без `any`; GraphQL-типы — только из `npm run gen`
402
+ - **Soft delete:** при `deletedAt DateTime?` → фильтровать `{ deletedAt: null }` во всех Prisma-запросах
403
+ - **Пагинация:** все списочные операции возвращают `{ items: [...], total: Int, hasMore: Boolean }`
404
+ - **Тесты обязательны** для каждого сценария из TESTING_PLAN.md — не пропускать, не заглушать
405
+ - **Читать AGENTS.md** обоих проектов — там могут быть специфичные команды и соглашения
406
+ - **Порядок имплементации:** бэкенд → фронтенд (генерация GraphQL-типов требует работающего бэкенда)
407
+ - **Нет замоканным данным в production:** `mockData`, хардкод-массивы, `TODO: replace with API` — запрещены в production-коде; допустимы только в тестовых файлах
408
+ - **Тема берётся из прототипа:** реальный UI должен воспроизводить визуальный язык прототипа — цвета, типографику, компоновку
409
+ - **Верификация блокирующая:** `npm run check && npm run test:all` должны быть зелёными перед финальным коммитом
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: liteend-init
3
+ description: Bootstrap a new backend project from LiteEnd template with Docker, Prisma, and initial setup
4
+ ---
5
+
6
+ You are a senior backend engineer. Your task is to initialize a new project from the LiteEnd template in a clean,
7
+ reproducible way.
8
+
9
+ ## Input
10
+
11
+ - project_name: string (required)
12
+ - use_docker: boolean (default: true)
13
+ - install_deps: boolean (default: true)
14
+
15
+ ## Steps
16
+
17
+ 1. Validate input
18
+
19
+ - Check Node.js version: `node -v` must be >= 20. Fail with a clear message if not.
20
+ - project_name must be a valid folder name (no spaces, no special chars except `-` and `_`)
21
+ - fail if directory already exists and is not empty
22
+
23
+ 2. Scaffold project
24
+ Run:
25
+ npx degit uxname/liteend {{project_name}}
26
+
27
+ 3. Enter directory
28
+ cd {{project_name}}
29
+
30
+ 4. Initialize git (if .git does not exist)
31
+ git init
32
+ git add .
33
+ git commit -m "Initial commit"
34
+
35
+ 5. Setup environment
36
+ If .env does not exist:
37
+ cp .env.example .env
38
+
39
+ 6. Install dependencies (if install_deps = true)
40
+ npm install
41
+
42
+ 7. Start infrastructure (if use_docker = true)
43
+ docker compose up -d db redis
44
+
45
+ 8. Run database migrations
46
+ npm run db:migrations:apply
47
+
48
+ 9. Seed database
49
+ Check if `db:seed` key exists in package.json scripts. If yes:
50
+ npm run db:seed
51
+
52
+ 10. Verify setup
53
+ Launch dev server in background, then check endpoints:
54
+ npm run start:dev &
55
+ - GET /health → expect 200
56
+ - GET /swagger → expect 200
57
+ Stop the dev server after verification.
58
+
59
+ 11. Read project AGENTS.md
60
+ Read the file `AGENTS.md` in the project root to understand conventions,
61
+ available commands, and how to work with this project further.
62
+
63
+ 12. Output result
64
+
65
+ Return:
66
+
67
+ - project path
68
+ - next steps:
69
+ - edit .env (DATABASE_URL, Redis config, etc.)
70
+ - run `docker compose up -d` (if skipped)
71
+ - `npm run start:dev`
72
+
73
+ ## Failure handling
74
+
75
+ - If Node.js < 20 → stop immediately, instruct user to upgrade
76
+ - If docker is not running → suggest fallback to manual PostgreSQL + Redis
77
+ - If migrations fail → show prisma error and suggest checking DATABASE_URL
78
+ - If port is busy → suggest changing PORT in .env
79
+
80
+ ## Notes
81
+
82
+ - Requires Node.js LTS (>=20)
83
+ - Requires Docker for full setup
84
+ - Uses Prisma + PostgreSQL + Redis
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: litefront-init
3
+ description: Bootstrap a new frontend project from LiteFront template with Vite, React, GraphQL, and OIDC setup
4
+ ---
5
+
6
+ You are a senior frontend engineer. Your task is to initialize a new project from the LiteFront template in a
7
+ deterministic and production-aware way.
8
+
9
+ ## Input
10
+
11
+ - project_name: string (required)
12
+ - install_deps: boolean (default: true)
13
+ - setup_env: boolean (default: true)
14
+ - run_dev: boolean (default: true)
15
+
16
+ ## Steps
17
+
18
+ 1. Validate input
19
+
20
+ - Check Node.js version: `node -v` must be >= 20. Fail with a clear message if not.
21
+ - project_name must be a valid folder name (no spaces, no special chars except `-` and `_`)
22
+ - fail if directory exists and is not empty
23
+
24
+ 2. Scaffold project
25
+ Run:
26
+ npx degit uxname/litefront {{project_name}}
27
+
28
+ 3. Enter directory
29
+ cd {{project_name}}
30
+
31
+ 4. Initialize git (if .git does not exist)
32
+ git init
33
+ git add .
34
+ git commit -m "Initial commit"
35
+
36
+ 5. Install dependencies (if install_deps = true)
37
+ npm install
38
+ After install, commit the generated lockfile:
39
+ git add package-lock.json && git commit -m "Add package-lock.json"
40
+
41
+ 6. Setup environment (if setup_env = true)
42
+ If .env does not exist:
43
+ cp .env.example .env
44
+
45
+ Warn user — these variables are REQUIRED before the app works:
46
+ - VITE_GRAPHQL_API_URL (GraphQL endpoint)
47
+ - VITE_BASE_URL
48
+ - VITE_OIDC_AUTHORITY
49
+ - VITE_OIDC_CLIENT_ID
50
+
51
+ 7. Generate GraphQL types
52
+ Only run if VITE_GRAPHQL_API_URL is set in .env AND the endpoint is reachable.
53
+ Run:
54
+ npm run gen
55
+
56
+ If endpoint is not reachable or gen fails:
57
+ - warn user that types generation was skipped
58
+ - instruct to run `npm run gen` manually once the backend is available
59
+
60
+ 8. Run dev server (if run_dev = true)
61
+ npm run start:dev
62
+
63
+ 9. Verify setup (only if run_dev = true)
64
+ - app is accessible at http://localhost:3000 (or PORT from .env)
65
+ - no critical runtime errors in console
66
+ - GraphQL client initializes
67
+
68
+ 10. Read project AGENTS.md
69
+ Read the file `AGENTS.md` in the project root to understand conventions,
70
+ available commands, and how to work with this project further.
71
+
72
+ 11. Output result
73
+
74
+ Return:
75
+
76
+ - project path
77
+ - dev URL
78
+ - checklist:
79
+ - configure .env (OIDC + GraphQL) if not done yet
80
+ - run `npm run gen` after every schema change
81
+ - run `npm run check` before commits
82
+
83
+ ## Failure handling
84
+
85
+ - If Node.js < 20 → stop immediately, instruct user to upgrade
86
+ - If npm install fails → suggest clearing cache: `npm cache clean --force`, then retry
87
+ - If dev server fails → check PORT conflict, suggest changing PORT in .env
88
+ - If GraphQL types fail → backend likely not running; skip gen and continue
89
+ - If auth fails → OIDC misconfiguration; check VITE_OIDC_* vars
90
+
91
+ ## Notes
92
+
93
+ - Requires Node.js LTS (>=20)
94
+ - Designed to pair with LiteEnd backend
95
+ - Uses Vite dev server (fast HMR)
96
+ - GraphQL types MUST be regenerated on schema change