create-kuckit-app 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +1 -1
- package/dist/{create-project-DTm05G7D.js → create-project-CP-h4Ygi.js} +7 -5
- package/dist/index.js +1 -1
- package/package.json +3 -2
- package/templates/base/.claude/CLAUDE.md +44 -0
- package/templates/base/.claude/agents/daidalos.md +76 -0
- package/templates/base/.claude/agents/episteme.md +79 -0
- package/templates/base/.claude/agents/librarian.md +132 -0
- package/templates/base/.claude/agents/oracle.md +210 -0
- package/templates/base/.claude/commands/create-plan.md +159 -0
- package/templates/base/.claude/commands/file-beads.md +98 -0
- package/templates/base/.claude/commands/review-beads.md +161 -0
- package/templates/base/.claude/settings.json +11 -0
- package/templates/base/.claude/skills/kuckit/SKILL.md +436 -0
- package/templates/base/.claude/skills/kuckit/references/ARCHITECTURE.md +388 -0
- package/templates/base/.claude/skills/kuckit/references/CLI-COMMANDS.md +365 -0
- package/templates/base/.claude/skills/kuckit/references/MODULE-DEVELOPMENT.md +581 -0
- package/templates/base/.claude/skills/kuckit/references/PACKAGES.md +112 -0
- package/templates/base/.claude/skills/kuckit/references/PUBLISHING.md +231 -0
- package/templates/base/.env.example +13 -0
- package/templates/base/.github/workflows/ci.yml +28 -0
- package/templates/base/.husky/pre-commit +1 -0
- package/templates/base/.prettierignore +5 -0
- package/templates/base/.prettierrc +8 -0
- package/templates/base/AGENTS.md +148 -0
- package/templates/base/apps/server/.env.example +18 -0
- package/templates/base/apps/server/AGENTS.md +37 -0
- package/templates/base/apps/server/package.json +13 -2
- package/templates/base/apps/server/src/app.ts +20 -0
- package/templates/base/apps/server/src/auth.ts +10 -0
- package/templates/base/apps/server/src/config/modules.ts +22 -0
- package/templates/base/apps/server/src/container.ts +81 -0
- package/templates/base/apps/server/src/health.ts +27 -0
- package/templates/base/apps/server/src/middleware/container.ts +41 -0
- package/templates/base/apps/server/src/rpc-router-registry.ts +26 -0
- package/templates/base/apps/server/src/rpc.ts +31 -0
- package/templates/base/apps/server/src/server.ts +42 -14
- package/templates/base/apps/web/.env.example +4 -0
- package/templates/base/apps/web/AGENTS.md +53 -0
- package/templates/base/apps/web/index.html +1 -1
- package/templates/base/apps/web/package.json +15 -2
- package/templates/base/apps/web/src/lib/kuckit-router.ts +42 -0
- package/templates/base/apps/web/src/main.tsx +26 -14
- package/templates/base/apps/web/src/providers/KuckitProvider.tsx +147 -0
- package/templates/base/apps/web/src/providers/ServicesProvider.tsx +47 -0
- package/templates/base/apps/web/src/routeTree.gen.ts +91 -0
- package/templates/base/apps/web/src/routes/__root.tsx +31 -0
- package/templates/base/apps/web/src/routes/index.tsx +46 -0
- package/templates/base/apps/web/src/routes/login.tsx +108 -0
- package/templates/base/apps/web/src/services/auth-client.ts +12 -0
- package/templates/base/apps/web/src/services/index.ts +3 -0
- package/templates/base/apps/web/src/services/rpc.ts +29 -0
- package/templates/base/apps/web/src/services/types.ts +14 -0
- package/templates/base/apps/web/vite.config.ts +2 -1
- package/templates/base/docker-compose.yml +23 -0
- package/templates/base/eslint.config.js +18 -0
- package/templates/base/package.json +32 -2
- package/templates/base/packages/api/AGENTS.md +27 -0
- package/templates/base/packages/api/package.json +35 -0
- package/templates/base/packages/api/src/context.ts +48 -0
- package/templates/base/packages/api/src/index.ts +22 -0
- package/templates/base/packages/api/tsconfig.json +8 -0
- package/templates/base/packages/auth/AGENTS.md +45 -0
- package/templates/base/packages/auth/package.json +27 -0
- package/templates/base/packages/auth/src/index.ts +22 -0
- package/templates/base/packages/auth/tsconfig.json +8 -0
- package/templates/base/packages/db/AGENTS.md +59 -0
- package/templates/base/packages/db/drizzle.config.ts +19 -0
- package/templates/base/packages/db/package.json +36 -0
- package/templates/base/packages/db/src/connection.ts +40 -0
- package/templates/base/packages/db/src/index.ts +4 -0
- package/templates/base/packages/db/src/migrations/0000_init.sql +54 -0
- package/templates/base/packages/db/src/migrations/meta/_journal.json +13 -0
- package/templates/base/packages/db/src/schema/auth.ts +51 -0
- package/templates/base/packages/db/tsconfig.json +8 -0
- package/templates/base/packages/items-module/AGENTS.md +112 -0
- package/templates/base/packages/items-module/package.json +32 -0
- package/templates/base/packages/items-module/src/adapters/item.drizzle.ts +66 -0
- package/templates/base/packages/items-module/src/api/items.router.ts +47 -0
- package/templates/base/packages/items-module/src/client-module.ts +39 -0
- package/templates/base/packages/items-module/src/domain/item.entity.ts +36 -0
- package/templates/base/packages/items-module/src/index.ts +15 -0
- package/templates/base/packages/items-module/src/module.ts +53 -0
- package/templates/base/packages/items-module/src/ports/item.repository.ts +13 -0
- package/templates/base/packages/items-module/src/ui/ItemsPage.tsx +162 -0
- package/templates/base/packages/items-module/src/usecases/create-item.ts +25 -0
- package/templates/base/packages/items-module/src/usecases/delete-item.ts +18 -0
- package/templates/base/packages/items-module/src/usecases/get-item.ts +19 -0
- package/templates/base/packages/items-module/src/usecases/list-items.ts +21 -0
- package/templates/base/packages/items-module/tsconfig.json +9 -0
- package/templates/base/turbo.json +13 -1
- 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
|