create-kuckit-app 0.1.1 → 0.2.1

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 (96) hide show
  1. package/dist/bin.js +1 -1
  2. package/dist/{create-project-DTm05G7D.js → create-project-CP-h4Ygi.js} +7 -5
  3. package/dist/index.js +1 -1
  4. package/package.json +3 -2
  5. package/templates/base/.claude/CLAUDE.md +44 -0
  6. package/templates/base/.claude/agents/daidalos.md +76 -0
  7. package/templates/base/.claude/agents/episteme.md +79 -0
  8. package/templates/base/.claude/agents/librarian.md +132 -0
  9. package/templates/base/.claude/agents/oracle.md +210 -0
  10. package/templates/base/.claude/commands/create-plan.md +159 -0
  11. package/templates/base/.claude/commands/file-beads.md +98 -0
  12. package/templates/base/.claude/commands/review-beads.md +161 -0
  13. package/templates/base/.claude/settings.json +11 -0
  14. package/templates/base/.claude/skills/kuckit/SKILL.md +436 -0
  15. package/templates/base/.claude/skills/kuckit/references/ARCHITECTURE.md +388 -0
  16. package/templates/base/.claude/skills/kuckit/references/CLI-COMMANDS.md +365 -0
  17. package/templates/base/.claude/skills/kuckit/references/MODULE-DEVELOPMENT.md +581 -0
  18. package/templates/base/.claude/skills/kuckit/references/PACKAGES.md +112 -0
  19. package/templates/base/.claude/skills/kuckit/references/PUBLISHING.md +231 -0
  20. package/templates/base/.env.example +13 -0
  21. package/templates/base/.github/workflows/ci.yml +28 -0
  22. package/templates/base/.husky/pre-commit +1 -0
  23. package/templates/base/.prettierignore +5 -0
  24. package/templates/base/.prettierrc +8 -0
  25. package/templates/base/AGENTS.md +351 -0
  26. package/templates/base/apps/server/.env.example +18 -0
  27. package/templates/base/apps/server/AGENTS.md +93 -0
  28. package/templates/base/apps/server/package.json +13 -2
  29. package/templates/base/apps/server/src/app.ts +20 -0
  30. package/templates/base/apps/server/src/auth.ts +10 -0
  31. package/templates/base/apps/server/src/config/modules.ts +22 -0
  32. package/templates/base/apps/server/src/container.ts +81 -0
  33. package/templates/base/apps/server/src/health.ts +27 -0
  34. package/templates/base/apps/server/src/middleware/container.ts +41 -0
  35. package/templates/base/apps/server/src/rpc-router-registry.ts +26 -0
  36. package/templates/base/apps/server/src/rpc.ts +31 -0
  37. package/templates/base/apps/server/src/server.ts +42 -14
  38. package/templates/base/apps/web/.env.example +4 -0
  39. package/templates/base/apps/web/AGENTS.md +127 -0
  40. package/templates/base/apps/web/index.html +1 -1
  41. package/templates/base/apps/web/package.json +15 -2
  42. package/templates/base/apps/web/src/components/KuckitModuleRoute.tsx +82 -0
  43. package/templates/base/apps/web/src/lib/kuckit-router.ts +42 -0
  44. package/templates/base/apps/web/src/main.tsx +26 -14
  45. package/templates/base/apps/web/src/modules.client.ts +4 -3
  46. package/templates/base/apps/web/src/providers/KuckitProvider.tsx +147 -0
  47. package/templates/base/apps/web/src/providers/ServicesProvider.tsx +47 -0
  48. package/templates/base/apps/web/src/routeTree.gen.ts +91 -0
  49. package/templates/base/apps/web/src/routes/$.tsx +14 -0
  50. package/templates/base/apps/web/src/routes/__root.tsx +31 -0
  51. package/templates/base/apps/web/src/routes/index.tsx +46 -0
  52. package/templates/base/apps/web/src/routes/login.tsx +108 -0
  53. package/templates/base/apps/web/src/services/auth-client.ts +12 -0
  54. package/templates/base/apps/web/src/services/index.ts +3 -0
  55. package/templates/base/apps/web/src/services/rpc.ts +29 -0
  56. package/templates/base/apps/web/src/services/types.ts +14 -0
  57. package/templates/base/apps/web/tsconfig.json +5 -1
  58. package/templates/base/apps/web/vite.config.ts +8 -1
  59. package/templates/base/docker-compose.yml +23 -0
  60. package/templates/base/eslint.config.js +18 -0
  61. package/templates/base/package.json +32 -2
  62. package/templates/base/packages/api/AGENTS.md +66 -0
  63. package/templates/base/packages/api/package.json +35 -0
  64. package/templates/base/packages/api/src/context.ts +48 -0
  65. package/templates/base/packages/api/src/index.ts +22 -0
  66. package/templates/base/packages/api/tsconfig.json +8 -0
  67. package/templates/base/packages/auth/AGENTS.md +61 -0
  68. package/templates/base/packages/auth/package.json +27 -0
  69. package/templates/base/packages/auth/src/index.ts +22 -0
  70. package/templates/base/packages/auth/tsconfig.json +8 -0
  71. package/templates/base/packages/db/AGENTS.md +74 -0
  72. package/templates/base/packages/db/drizzle.config.ts +19 -0
  73. package/templates/base/packages/db/package.json +36 -0
  74. package/templates/base/packages/db/src/connection.ts +40 -0
  75. package/templates/base/packages/db/src/index.ts +4 -0
  76. package/templates/base/packages/db/src/migrations/0000_init.sql +54 -0
  77. package/templates/base/packages/db/src/migrations/meta/_journal.json +13 -0
  78. package/templates/base/packages/db/src/schema/auth.ts +51 -0
  79. package/templates/base/packages/db/tsconfig.json +8 -0
  80. package/templates/base/packages/items-module/AGENTS.md +210 -0
  81. package/templates/base/packages/items-module/package.json +32 -0
  82. package/templates/base/packages/items-module/src/adapters/item.drizzle.ts +66 -0
  83. package/templates/base/packages/items-module/src/api/items.router.ts +47 -0
  84. package/templates/base/packages/items-module/src/client-module.ts +39 -0
  85. package/templates/base/packages/items-module/src/domain/item.entity.ts +36 -0
  86. package/templates/base/packages/items-module/src/index.ts +15 -0
  87. package/templates/base/packages/items-module/src/module.ts +53 -0
  88. package/templates/base/packages/items-module/src/ports/item.repository.ts +13 -0
  89. package/templates/base/packages/items-module/src/ui/ItemsPage.tsx +144 -0
  90. package/templates/base/packages/items-module/src/usecases/create-item.ts +25 -0
  91. package/templates/base/packages/items-module/src/usecases/delete-item.ts +18 -0
  92. package/templates/base/packages/items-module/src/usecases/get-item.ts +19 -0
  93. package/templates/base/packages/items-module/src/usecases/list-items.ts +21 -0
  94. package/templates/base/packages/items-module/tsconfig.json +9 -0
  95. package/templates/base/turbo.json +13 -1
  96. package/templates/base/apps/web/src/App.tsx +0 -16
@@ -0,0 +1,388 @@
1
+ # Kuckit Architecture Reference
2
+
3
+ Quick reference for Clean Architecture layers and patterns in Kuckit.
4
+
5
+ ## Layer Diagram
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────────────────┐
9
+ │ Interface Layer │
10
+ │ ┌─────────────────────────────┐ ┌─────────────────────────────────┐ │
11
+ │ │ apps/web │ │ apps/server │ │
12
+ │ │ React + TanStack Router │◄──►│ Express + oRPC + Better-Auth │ │
13
+ │ │ + sdk-react │ │ + sdk │ │
14
+ │ └─────────────────────────────┘ └─────────────────────────────────┘ │
15
+ └─────────────────────────────────────────────────────────────────────────┘
16
+
17
+
18
+ ┌─────────────────────────────────────────────────────────────────────────┐
19
+ │ SDK Layer (Module System) │
20
+ │ ┌─────────────────────────────┐ ┌─────────────────────────────────┐ │
21
+ │ │ packages/sdk │ │ packages/sdk-react │ │
22
+ │ │ - DI Container (Awilix) │ │ - Client Module Loader │ │
23
+ │ │ - Module Loader │ │ - Route/Nav/Slot Registries │ │
24
+ │ │ - Core Services │ │ - Context Providers │ │
25
+ │ │ - Lifecycle Hooks │ │ - TanStack Router Integration │ │
26
+ │ └─────────────────────────────┘ └─────────────────────────────────┘ │
27
+ └─────────────────────────────────────────────────────────────────────────┘
28
+
29
+
30
+ ┌─────────────────────────────────────────────────────────────────────────┐
31
+ │ Application Layer │
32
+ │ ┌─────────────────────────────┐ ┌─────────────────────────────────┐ │
33
+ │ │ packages/application │ │ packages/api │ │
34
+ │ │ - Use Cases │◄───│ - oRPC Procedures │ │
35
+ │ │ - Business Logic │ │ - Request Context │ │
36
+ │ │ - Orchestration │ │ - Validation │ │
37
+ │ └─────────────────────────────┘ └─────────────────────────────────┘ │
38
+ └─────────────────────────────────────────────────────────────────────────┘
39
+
40
+
41
+ ┌─────────────────────────────────────────────────────────────────────────┐
42
+ │ Domain Layer │
43
+ │ ┌─────────────────────────────┐ ┌─────────────────────────────────┐ │
44
+ │ │ packages/domain │ │ packages/contracts │ │
45
+ │ │ - Business Entities │ │ - DTOs │ │
46
+ │ │ - Port Interfaces │ │ - Zod Schemas │ │
47
+ │ │ - Business Rules │ │ - Validation │ │
48
+ │ └─────────────────────────────┘ └─────────────────────────────────┘ │
49
+ └─────────────────────────────────────────────────────────────────────────┘
50
+
51
+
52
+ ┌─────────────────────────────────────────────────────────────────────────┐
53
+ │ Infrastructure Layer │
54
+ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │
55
+ │ │ packages/infra │ │ packages/db │ │ packages/auth │ │
56
+ │ │ - Repositories │ │ - Drizzle ORM │ │ - Better-Auth Config │ │
57
+ │ │ - Adapters │ │ - Migrations │ │ - Session Management │ │
58
+ │ └─────────────────┘ └─────────────────┘ └─────────────────────────┘ │
59
+ └─────────────────────────────────────────────────────────────────────────┘
60
+ ```
61
+
62
+ ---
63
+
64
+ ## Dependency Rules
65
+
66
+ ### What Can Import What
67
+
68
+ ```
69
+ ALLOWED IMPORTS
70
+ ═══════════════
71
+
72
+ ┌─────────────┐
73
+ │ domain │◄─────────────────────────────────────┐
74
+ │ (no deps) │ │
75
+ └─────────────┘ │
76
+ ▲ │
77
+ │ │
78
+ ┌─────────────┐ ┌─────────────┐ ┌──────────┴────┐
79
+ │ application │ │ contracts │ │ infrastructure │
80
+ │ │ │ (zod) │ │ │
81
+ └─────────────┘ └─────────────┘ └───────────────┘
82
+ ▲ ▲
83
+ │ │
84
+ └────────┬──────────┘
85
+
86
+ ┌─────┴─────┐
87
+ │ api │
88
+ └───────────┘
89
+
90
+
91
+ ┌─────┴─────┐
92
+ │ sdk │◄─── (imports all core packages)
93
+ └───────────┘
94
+
95
+
96
+ ┌──────────┴──────────┐
97
+ │ │
98
+ ┌───┴───┐ ┌─────┴─────┐
99
+ │ server│ │ sdk-react │
100
+ └───────┘ └───────────┘
101
+
102
+
103
+ ┌─────┴─────┐
104
+ │ web │
105
+ └───────────┘
106
+ ```
107
+
108
+ ### Dependency Matrix
109
+
110
+ | Package | Can Import From |
111
+ | -------------- | ------------------------------ |
112
+ | domain | (none) |
113
+ | contracts | zod |
114
+ | application | domain |
115
+ | infrastructure | domain, external libs |
116
+ | api | domain, application, contracts |
117
+ | sdk | all core packages, awilix |
118
+ | sdk-react | sdk types |
119
+ | server | ALL packages |
120
+ | web | sdk-react, contracts |
121
+
122
+ ---
123
+
124
+ ## Layer Responsibilities
125
+
126
+ ### Domain Layer (`packages/domain`)
127
+
128
+ **Purpose:** Pure business logic, zero external dependencies
129
+
130
+ **Contains:**
131
+
132
+ - Business entities (User, Invoice, etc.)
133
+ - Port interfaces (repository contracts)
134
+ - Business rules and invariants
135
+ - Value objects
136
+
137
+ ```typescript
138
+ // packages/domain/src/entities/user.ts
139
+ export interface User {
140
+ id: string
141
+ email: string
142
+ name: string
143
+ createdAt: Date
144
+ }
145
+
146
+ // packages/domain/src/ports/user-repository.ts
147
+ export interface UserRepository {
148
+ findById(id: string): Promise<User | null>
149
+ findByEmail(email: string): Promise<User | null>
150
+ save(user: User): Promise<User>
151
+ }
152
+ ```
153
+
154
+ ### Contracts Layer (`packages/contracts`)
155
+
156
+ **Purpose:** DTOs and validation schemas shared between layers
157
+
158
+ **Contains:**
159
+
160
+ - Zod schemas for validation
161
+ - DTOs for API requests/responses
162
+ - Type definitions derived from schemas
163
+
164
+ ```typescript
165
+ // packages/contracts/src/user.ts
166
+ import { z } from 'zod'
167
+
168
+ export const createUserSchema = z.object({
169
+ email: z.string().email(),
170
+ name: z.string().min(1).max(100),
171
+ password: z.string().min(8),
172
+ })
173
+
174
+ export type CreateUserInput = z.infer<typeof createUserSchema>
175
+
176
+ export const userDTOSchema = z.object({
177
+ id: z.string().uuid(),
178
+ email: z.string().email(),
179
+ name: z.string(),
180
+ createdAt: z.string().datetime(),
181
+ })
182
+
183
+ export type UserDTO = z.infer<typeof userDTOSchema>
184
+ ```
185
+
186
+ ### Application Layer (`packages/application`)
187
+
188
+ **Purpose:** Use cases and business workflows
189
+
190
+ **Contains:**
191
+
192
+ - Use case implementations
193
+ - Business logic orchestration
194
+ - Application services
195
+
196
+ ```typescript
197
+ // packages/application/src/use-cases/create-user.ts
198
+ import type { UserRepository } from '@kuckit/domain'
199
+ import type { CreateUserInput } from '@kuckit/contracts'
200
+
201
+ export function makeCreateUserUseCase(deps: {
202
+ userRepository: UserRepository
203
+ passwordHasher: PasswordHasher
204
+ eventBus: EventBus
205
+ }) {
206
+ return async function createUser(input: CreateUserInput) {
207
+ const existing = await deps.userRepository.findByEmail(input.email)
208
+ if (existing) {
209
+ throw new UserAlreadyExistsError(input.email)
210
+ }
211
+
212
+ const hashedPassword = await deps.passwordHasher.hash(input.password)
213
+ const user = await deps.userRepository.save({
214
+ id: generateId(),
215
+ email: input.email,
216
+ name: input.name,
217
+ passwordHash: hashedPassword,
218
+ createdAt: new Date(),
219
+ })
220
+
221
+ await deps.eventBus.publish('user.created', { userId: user.id })
222
+ return user
223
+ }
224
+ }
225
+ ```
226
+
227
+ ### Infrastructure Layer (`packages/infrastructure`)
228
+
229
+ **Purpose:** Concrete implementations of domain ports
230
+
231
+ **Contains:**
232
+
233
+ - Repository implementations (Drizzle)
234
+ - External service adapters
235
+ - Third-party integrations
236
+
237
+ ```typescript
238
+ // packages/infrastructure/src/repositories/drizzle-user-repository.ts
239
+ import type { UserRepository, User } from '@kuckit/domain'
240
+ import { eq } from 'drizzle-orm'
241
+ import { users } from '@kuckit/db'
242
+
243
+ export class DrizzleUserRepository implements UserRepository {
244
+ constructor(private db: DrizzleInstance) {}
245
+
246
+ async findById(id: string): Promise<User | null> {
247
+ return this.db.query.users.findFirst({
248
+ where: eq(users.id, id),
249
+ })
250
+ }
251
+
252
+ async findByEmail(email: string): Promise<User | null> {
253
+ return this.db.query.users.findFirst({
254
+ where: eq(users.email, email),
255
+ })
256
+ }
257
+
258
+ async save(user: User): Promise<User> {
259
+ const [result] = await this.db.insert(users).values(user).returning()
260
+ return result
261
+ }
262
+ }
263
+ ```
264
+
265
+ ### API Layer (`packages/api`)
266
+
267
+ **Purpose:** Expose use cases to clients via oRPC
268
+
269
+ **Contains:**
270
+
271
+ - oRPC procedures
272
+ - Request context handling
273
+ - Input validation
274
+ - Response mapping
275
+
276
+ ```typescript
277
+ // packages/api/src/procedures/user.ts
278
+ import { createORPCRouter, createProcedure } from '@kuckit/api'
279
+ import { createUserSchema, userDTOSchema } from '@kuckit/contracts'
280
+
281
+ export function createUserRouter(container: AwilixContainer) {
282
+ return createORPCRouter({
283
+ create: createProcedure()
284
+ .input(createUserSchema)
285
+ .output(userDTOSchema)
286
+ .mutation(async ({ input, ctx }) => {
287
+ const createUser = container.resolve('createUser')
288
+ const user = await createUser(input)
289
+ return mapToDTO(user)
290
+ }),
291
+
292
+ get: createProcedure()
293
+ .input(z.object({ id: z.string().uuid() }))
294
+ .output(userDTOSchema)
295
+ .query(async ({ input }) => {
296
+ const userRepository = container.resolve('userRepository')
297
+ const user = await userRepository.findById(input.id)
298
+ if (!user) throw new NotFoundError('User not found')
299
+ return mapToDTO(user)
300
+ }),
301
+ })
302
+ }
303
+ ```
304
+
305
+ ---
306
+
307
+ ## Module System Flow
308
+
309
+ ### Server-Side Loading
310
+
311
+ ```
312
+ 1. createKuckitContainer()
313
+ └─► Core services registered (logger, db, cache, eventBus)
314
+
315
+ 2. loadKuckitModules({ modules: [...] })
316
+ ├─► For each module:
317
+ │ ├─► register(ctx) - Register DI dependencies
318
+ │ ├─► registerApi(ctx) - Register API routes
319
+ │ └─► onBootstrap(ctx) - Run startup logic
320
+ └─► onApiRegistrations callback with all routes
321
+
322
+ 3. Application runs...
323
+
324
+ 4. disposeContainer()
325
+ └─► For each module: onShutdown(ctx)
326
+ ```
327
+
328
+ ### Client-Side Loading
329
+
330
+ ```
331
+ 1. loadKuckitClientModules({ modules: [...] })
332
+ └─► Returns: routes, navItems, slots, components
333
+
334
+ 2. TanStack Router receives routes
335
+ └─► Dynamic route registration
336
+
337
+ 3. KuckitNavProvider receives navItems
338
+ └─► useKuckitNav() hook for navigation
339
+
340
+ 4. Components render with SlotRegistry
341
+ └─► Module UI slots in shell
342
+ ```
343
+
344
+ ---
345
+
346
+ ## Core Services
347
+
348
+ | Service | Token | Purpose |
349
+ | --------------- | ------------------ | ------------------------- |
350
+ | Configuration | `config` | Application settings |
351
+ | Database | `db` | Drizzle query builder |
352
+ | Connection Pool | `dbPool` | PostgreSQL pool |
353
+ | Logging | `logger` | Structured logger |
354
+ | Events | `eventBus` | Pub/sub system |
355
+ | Time | `clock` | Testable time abstraction |
356
+ | Caching | `cacheStore` | Key-value cache |
357
+ | Rate Limiting | `rateLimiterStore` | Request rate limiting |
358
+
359
+ ---
360
+
361
+ ## Adding a New Feature Checklist
362
+
363
+ 1. **Domain Layer**
364
+ - [ ] Create entity in `packages/domain/src/entities/`
365
+ - [ ] Define port interface in `packages/domain/src/ports/`
366
+
367
+ 2. **Contracts Layer**
368
+ - [ ] Create Zod schemas in `packages/contracts/src/`
369
+ - [ ] Export DTOs
370
+
371
+ 3. **Infrastructure Layer**
372
+ - [ ] Implement repository in `packages/infrastructure/src/repositories/`
373
+ - [ ] Add Drizzle schema in `packages/db/src/schema/`
374
+
375
+ 4. **Application Layer**
376
+ - [ ] Create use case in `packages/application/src/use-cases/`
377
+
378
+ 5. **API Layer**
379
+ - [ ] Add oRPC procedure in `packages/api/src/procedures/`
380
+
381
+ 6. **Module Integration**
382
+ - [ ] Register dependencies in module's `register()` hook
383
+ - [ ] Register API in module's `registerApi()` hook
384
+
385
+ 7. **Client Side** (if needed)
386
+ - [ ] Add route in client module
387
+ - [ ] Create page component
388
+ - [ ] Add navigation item