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,144 @@
1
+ import { useState } from 'react'
2
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
3
+ import { useRpc } from '@kuckit/sdk-react'
4
+
5
+ interface Item {
6
+ id: string
7
+ name: string
8
+ description?: string
9
+ createdAt: Date
10
+ updatedAt: Date
11
+ }
12
+
13
+ interface ItemsRpc {
14
+ items: {
15
+ list: (input: Record<string, never>) => Promise<Item[]>
16
+ create: (input: { name: string; description?: string }) => Promise<Item>
17
+ delete: (input: { id: string }) => Promise<void>
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Items page component
23
+ * Demonstrates CRUD operations using the items module with useRpc and TanStack Query
24
+ */
25
+ export function ItemsPage() {
26
+ const rpc = useRpc<ItemsRpc>()
27
+ const queryClient = useQueryClient()
28
+ const [newItemName, setNewItemName] = useState('')
29
+ const [newItemDescription, setNewItemDescription] = useState('')
30
+
31
+ const {
32
+ data: items = [],
33
+ isLoading,
34
+ error,
35
+ } = useQuery({
36
+ queryKey: ['items'],
37
+ queryFn: () => rpc.items.list({}),
38
+ })
39
+
40
+ const createMutation = useMutation({
41
+ mutationFn: (data: { name: string; description?: string }) => rpc.items.create(data),
42
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: ['items'] }),
43
+ })
44
+
45
+ const deleteMutation = useMutation({
46
+ mutationFn: (id: string) => rpc.items.delete({ id }),
47
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: ['items'] }),
48
+ })
49
+
50
+ const createItem = async (e: React.FormEvent) => {
51
+ e.preventDefault()
52
+ if (!newItemName.trim()) return
53
+
54
+ createMutation.mutate(
55
+ { name: newItemName, description: newItemDescription || undefined },
56
+ {
57
+ onSuccess: () => {
58
+ setNewItemName('')
59
+ setNewItemDescription('')
60
+ },
61
+ }
62
+ )
63
+ }
64
+
65
+ const deleteItem = (id: string) => {
66
+ deleteMutation.mutate(id)
67
+ }
68
+
69
+ if (isLoading) {
70
+ return <div style={{ padding: '2rem' }}>Loading items...</div>
71
+ }
72
+
73
+ return (
74
+ <div style={{ padding: '2rem', fontFamily: 'system-ui', maxWidth: '600px', margin: '0 auto' }}>
75
+ <h1>Items</h1>
76
+
77
+ {(error || createMutation.error || deleteMutation.error) && (
78
+ <div style={{ color: 'red', marginBottom: '1rem' }}>
79
+ {error?.message || createMutation.error?.message || deleteMutation.error?.message}
80
+ </div>
81
+ )}
82
+
83
+ <form onSubmit={createItem} style={{ marginBottom: '2rem' }}>
84
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
85
+ <input
86
+ type="text"
87
+ placeholder="Item name"
88
+ value={newItemName}
89
+ onChange={(e) => setNewItemName(e.target.value)}
90
+ required
91
+ style={{ padding: '0.5rem', fontSize: '1rem' }}
92
+ />
93
+ <input
94
+ type="text"
95
+ placeholder="Description (optional)"
96
+ value={newItemDescription}
97
+ onChange={(e) => setNewItemDescription(e.target.value)}
98
+ style={{ padding: '0.5rem', fontSize: '1rem' }}
99
+ />
100
+ <button
101
+ type="submit"
102
+ disabled={createMutation.isPending}
103
+ style={{ padding: '0.5rem 1rem', cursor: 'pointer' }}
104
+ >
105
+ {createMutation.isPending ? 'Adding...' : 'Add Item'}
106
+ </button>
107
+ </div>
108
+ </form>
109
+
110
+ <ul style={{ listStyle: 'none', padding: 0 }}>
111
+ {items.map((item) => (
112
+ <li
113
+ key={item.id}
114
+ style={{
115
+ padding: '1rem',
116
+ border: '1px solid #ccc',
117
+ marginBottom: '0.5rem',
118
+ borderRadius: '4px',
119
+ display: 'flex',
120
+ justifyContent: 'space-between',
121
+ alignItems: 'center',
122
+ }}
123
+ >
124
+ <div>
125
+ <strong>{item.name}</strong>
126
+ {item.description && (
127
+ <p style={{ margin: '0.5rem 0 0 0', color: '#666' }}>{item.description}</p>
128
+ )}
129
+ </div>
130
+ <button
131
+ onClick={() => deleteItem(item.id)}
132
+ disabled={deleteMutation.isPending}
133
+ style={{ cursor: 'pointer', color: 'red', background: 'none', border: 'none' }}
134
+ >
135
+ Delete
136
+ </button>
137
+ </li>
138
+ ))}
139
+ </ul>
140
+
141
+ {items.length === 0 && <p>No items yet. Create one above!</p>}
142
+ </div>
143
+ )
144
+ }
@@ -0,0 +1,25 @@
1
+ import type { ItemRepository } from '../ports/item.repository'
2
+ import type { Item, CreateItemInput } from '../domain/item.entity'
3
+
4
+ export interface CreateItemUseCaseInput extends CreateItemInput {
5
+ userId: string
6
+ }
7
+
8
+ interface CreateItemDeps {
9
+ itemRepository: ItemRepository
10
+ }
11
+
12
+ /**
13
+ * Create item use case
14
+ */
15
+ export function makeCreateItem(deps: CreateItemDeps) {
16
+ return async (input: CreateItemUseCaseInput): Promise<Item> => {
17
+ const id = crypto.randomUUID()
18
+ return deps.itemRepository.create({
19
+ id,
20
+ name: input.name,
21
+ description: input.description,
22
+ userId: input.userId,
23
+ })
24
+ }
25
+ }
@@ -0,0 +1,18 @@
1
+ import type { ItemRepository } from '../ports/item.repository'
2
+
3
+ export interface DeleteItemInput {
4
+ id: string
5
+ }
6
+
7
+ interface DeleteItemDeps {
8
+ itemRepository: ItemRepository
9
+ }
10
+
11
+ /**
12
+ * Delete item use case
13
+ */
14
+ export function makeDeleteItem(deps: DeleteItemDeps) {
15
+ return async (input: DeleteItemInput): Promise<boolean> => {
16
+ return deps.itemRepository.delete(input.id)
17
+ }
18
+ }
@@ -0,0 +1,19 @@
1
+ import type { ItemRepository } from '../ports/item.repository'
2
+ import type { Item } from '../domain/item.entity'
3
+
4
+ export interface GetItemInput {
5
+ id: string
6
+ }
7
+
8
+ interface GetItemDeps {
9
+ itemRepository: ItemRepository
10
+ }
11
+
12
+ /**
13
+ * Get item use case
14
+ */
15
+ export function makeGetItem(deps: GetItemDeps) {
16
+ return async (input: GetItemInput): Promise<Item | null> => {
17
+ return deps.itemRepository.findById(input.id)
18
+ }
19
+ }
@@ -0,0 +1,21 @@
1
+ import type { ItemRepository } from '../ports/item.repository'
2
+ import type { Item } from '../domain/item.entity'
3
+
4
+ export interface ListItemsInput {
5
+ userId: string
6
+ }
7
+
8
+ export type ListItemsOutput = Item[]
9
+
10
+ interface ListItemsDeps {
11
+ itemRepository: ItemRepository
12
+ }
13
+
14
+ /**
15
+ * List items use case
16
+ */
17
+ export function makeListItems(deps: ListItemsDeps) {
18
+ return async (input: ListItemsInput): Promise<ListItemsOutput> => {
19
+ return deps.itemRepository.findByUserId(input.userId)
20
+ }
21
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src",
6
+ "jsx": "react-jsx"
7
+ },
8
+ "include": ["src/**/*"]
9
+ }
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "$schema": "https://turbo.build/schema.json",
3
+ "ui": "tui",
3
4
  "tasks": {
4
5
  "build": {
5
6
  "dependsOn": ["^build"],
7
+ "inputs": ["$TURBO_DEFAULT$", ".env*"],
6
8
  "outputs": ["dist/**"]
7
9
  },
8
10
  "dev": {
@@ -10,7 +12,17 @@
10
12
  "persistent": true
11
13
  },
12
14
  "check-types": {
13
- "dependsOn": ["^build"]
15
+ "dependsOn": ["^check-types"]
16
+ },
17
+ "db:generate": {
18
+ "cache": false
19
+ },
20
+ "db:migrate": {
21
+ "cache": false
22
+ },
23
+ "db:studio": {
24
+ "cache": false,
25
+ "persistent": true
14
26
  }
15
27
  }
16
28
  }
@@ -1,16 +0,0 @@
1
- export function App() {
2
- return (
3
- <div style={{ fontFamily: 'system-ui', padding: '2rem' }}>
4
- <h1>Welcome to __APP_NAME__</h1>
5
- <p>Your Kuckit application is ready!</p>
6
- <ul>
7
- <li>
8
- Server: <a href="http://localhost:3000/health">http://localhost:3000/health</a>
9
- </li>
10
- <li>
11
- Web: <a href="http://localhost:3001">http://localhost:3001</a>
12
- </li>
13
- </ul>
14
- </div>
15
- )
16
- }