@kood/claude-code 0.1.1 → 0.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.
- package/dist/index.js +81 -38
- package/package.json +2 -2
- package/templates/hono/CLAUDE.md +20 -2
- package/templates/hono/docs/architecture/architecture.md +909 -0
- package/templates/hono/docs/deployment/cloudflare.md +537 -190
- package/templates/hono/docs/deployment/docker.md +517 -0
- package/templates/hono/docs/deployment/index.md +181 -213
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +572 -0
- package/templates/hono/docs/git/git.md +285 -0
- package/templates/hono/docs/library/ai-sdk/index.md +427 -0
- package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
- package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
- package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
- package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
- package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
- package/templates/hono/docs/library/hono/env-setup.md +458 -0
- package/templates/hono/docs/library/hono/index.md +1 -0
- package/templates/hono/docs/library/pino/index.md +437 -0
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
- package/templates/hono/docs/library/prisma/config.md +362 -0
- package/templates/hono/docs/library/prisma/index.md +86 -13
- package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
- package/templates/npx/CLAUDE.md +309 -0
- package/templates/npx/docs/git/git.md +307 -0
- package/templates/npx/docs/library/commander/index.md +164 -0
- package/templates/npx/docs/library/fs-extra/index.md +171 -0
- package/templates/npx/docs/library/prompts/index.md +253 -0
- package/templates/npx/docs/mcp/index.md +60 -0
- package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
- package/templates/tanstack-start/CLAUDE.md +43 -5
- package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
- package/templates/tanstack-start/docs/deployment/cloudflare.md +234 -51
- package/templates/tanstack-start/docs/deployment/index.md +322 -32
- package/templates/tanstack-start/docs/deployment/nitro.md +201 -20
- package/templates/tanstack-start/docs/deployment/railway.md +305 -153
- package/templates/tanstack-start/docs/deployment/vercel.md +353 -78
- package/templates/tanstack-start/docs/git/{index.md → git.md} +81 -7
- package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
- package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
- package/templates/tanstack-start/docs/library/pino/index.md +320 -0
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
- package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +3 -1
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
- package/templates/hono/docs/git/index.md +0 -180
package/dist/index.js
CHANGED
|
@@ -36,29 +36,59 @@ var getTemplatesDir = () => {
|
|
|
36
36
|
var getTemplatePath = (template) => {
|
|
37
37
|
return path.join(getTemplatesDir(), template);
|
|
38
38
|
};
|
|
39
|
-
var
|
|
39
|
+
var copyRecursive = async (src, dest, counter) => {
|
|
40
|
+
const stat = await fs.stat(src);
|
|
41
|
+
if (stat.isDirectory()) {
|
|
42
|
+
await fs.ensureDir(dest);
|
|
43
|
+
counter.directories++;
|
|
44
|
+
const items = await fs.readdir(src);
|
|
45
|
+
for (const item of items) {
|
|
46
|
+
await copyRecursive(path.join(src, item), path.join(dest, item), counter);
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
await fs.copy(src, dest);
|
|
50
|
+
counter.files++;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var copySingleTemplate = async (template, targetDir) => {
|
|
40
54
|
const templatePath = getTemplatePath(template);
|
|
41
55
|
if (!await fs.pathExists(templatePath)) {
|
|
42
56
|
throw new Error(`Template "${template}" not found at ${templatePath}`);
|
|
43
57
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
} else {
|
|
56
|
-
await fs.copy(src, dest);
|
|
57
|
-
files++;
|
|
58
|
+
const counter = { files: 0, directories: 0 };
|
|
59
|
+
const claudeMdSrc = path.join(templatePath, "CLAUDE.md");
|
|
60
|
+
if (await fs.pathExists(claudeMdSrc)) {
|
|
61
|
+
await fs.copy(claudeMdSrc, path.join(targetDir, "CLAUDE.md"));
|
|
62
|
+
counter.files++;
|
|
63
|
+
}
|
|
64
|
+
const docsSrc = path.join(templatePath, "docs");
|
|
65
|
+
const docsDest = path.join(targetDir, "docs");
|
|
66
|
+
if (await fs.pathExists(docsSrc)) {
|
|
67
|
+
if (await fs.pathExists(docsDest)) {
|
|
68
|
+
await fs.remove(docsDest);
|
|
58
69
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
return
|
|
70
|
+
await copyRecursive(docsSrc, docsDest, counter);
|
|
71
|
+
}
|
|
72
|
+
return counter;
|
|
73
|
+
};
|
|
74
|
+
var copyMultipleTemplates = async (templates, targetDir) => {
|
|
75
|
+
const counter = { files: 0, directories: 0 };
|
|
76
|
+
const docsDir = path.join(targetDir, "docs");
|
|
77
|
+
if (await fs.pathExists(docsDir)) {
|
|
78
|
+
await fs.remove(docsDir);
|
|
79
|
+
}
|
|
80
|
+
for (const template of templates) {
|
|
81
|
+
const templatePath = getTemplatePath(template);
|
|
82
|
+
if (!await fs.pathExists(templatePath)) {
|
|
83
|
+
throw new Error(`Template "${template}" not found at ${templatePath}`);
|
|
84
|
+
}
|
|
85
|
+
await copyRecursive(
|
|
86
|
+
templatePath,
|
|
87
|
+
path.join(targetDir, "docs", template),
|
|
88
|
+
counter
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return counter;
|
|
62
92
|
};
|
|
63
93
|
var checkExistingFiles = async (targetDir) => {
|
|
64
94
|
const existingFiles = [];
|
|
@@ -116,14 +146,14 @@ var copySkills = async (template, targetDir) => {
|
|
|
116
146
|
let files = 0;
|
|
117
147
|
let directories = 0;
|
|
118
148
|
const installedSkills = [];
|
|
119
|
-
const
|
|
149
|
+
const copyRecursive2 = async (src, dest) => {
|
|
120
150
|
const stat = await fs.stat(src);
|
|
121
151
|
if (stat.isDirectory()) {
|
|
122
152
|
await fs.ensureDir(dest);
|
|
123
153
|
directories++;
|
|
124
154
|
const items = await fs.readdir(src);
|
|
125
155
|
for (const item of items) {
|
|
126
|
-
await
|
|
156
|
+
await copyRecursive2(path.join(src, item), path.join(dest, item));
|
|
127
157
|
}
|
|
128
158
|
} else {
|
|
129
159
|
await fs.copy(src, dest);
|
|
@@ -136,7 +166,7 @@ var copySkills = async (template, targetDir) => {
|
|
|
136
166
|
const skillDestPath = path.join(targetSkillsDir, skill);
|
|
137
167
|
const stat = await fs.stat(skillSrcPath);
|
|
138
168
|
if (stat.isDirectory()) {
|
|
139
|
-
await
|
|
169
|
+
await copyRecursive2(skillSrcPath, skillDestPath);
|
|
140
170
|
installedSkills.push(skill);
|
|
141
171
|
}
|
|
142
172
|
}
|
|
@@ -157,7 +187,8 @@ var checkExistingSkills = async (targetDir, skills) => {
|
|
|
157
187
|
// src/commands/init.ts
|
|
158
188
|
var TEMPLATE_DESCRIPTIONS = {
|
|
159
189
|
"tanstack-start": "TanStack Start + React \uD480\uC2A4\uD0DD \uD504\uB85C\uC81D\uD2B8",
|
|
160
|
-
hono: "Hono \uC11C\uBC84 \uD504\uB808\uC784\uC6CC\uD06C \uD504\uB85C\uC81D\uD2B8"
|
|
190
|
+
hono: "Hono \uC11C\uBC84 \uD504\uB808\uC784\uC6CC\uD06C \uD504\uB85C\uC81D\uD2B8",
|
|
191
|
+
npx: "NPX CLI \uB3C4\uAD6C \uD504\uB85C\uC81D\uD2B8"
|
|
161
192
|
};
|
|
162
193
|
var init = async (options) => {
|
|
163
194
|
const targetDir = options.cwd || process.cwd();
|
|
@@ -210,33 +241,45 @@ var init = async (options) => {
|
|
|
210
241
|
process.exit(0);
|
|
211
242
|
}
|
|
212
243
|
}
|
|
244
|
+
const isSingleTemplate = templates.length === 1;
|
|
213
245
|
let totalFiles = 0;
|
|
214
246
|
let totalDirectories = 0;
|
|
215
247
|
const allSkills = [];
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
248
|
+
logger.blank();
|
|
249
|
+
try {
|
|
250
|
+
if (isSingleTemplate) {
|
|
251
|
+
const template = templates[0];
|
|
252
|
+
logger.info(`Installing ${template} template...`);
|
|
253
|
+
logger.step(`Target: ${targetDir}`);
|
|
254
|
+
logger.blank();
|
|
255
|
+
const result = await copySingleTemplate(template, targetDir);
|
|
256
|
+
totalFiles = result.files;
|
|
257
|
+
totalDirectories = result.directories;
|
|
225
258
|
logger.success(`${template}: ${result.files} files copied`);
|
|
226
259
|
const availableSkills = await listAvailableSkills(template);
|
|
227
|
-
|
|
260
|
+
allSkills.push(...availableSkills);
|
|
261
|
+
} else {
|
|
262
|
+
logger.info(`Installing ${templates.length} templates...`);
|
|
263
|
+
logger.step(`Target: ${targetDir}/docs/`);
|
|
264
|
+
logger.blank();
|
|
265
|
+
const result = await copyMultipleTemplates(templates, targetDir);
|
|
266
|
+
totalFiles = result.files;
|
|
267
|
+
totalDirectories = result.directories;
|
|
268
|
+
for (const template of templates) {
|
|
269
|
+
logger.success(`${template}: installed to docs/${template}/`);
|
|
270
|
+
const availableSkills = await listAvailableSkills(template);
|
|
228
271
|
for (const skill of availableSkills) {
|
|
229
272
|
if (!allSkills.includes(skill)) {
|
|
230
273
|
allSkills.push(skill);
|
|
231
274
|
}
|
|
232
275
|
}
|
|
233
276
|
}
|
|
234
|
-
} catch (error) {
|
|
235
|
-
logger.error(
|
|
236
|
-
`Failed to install ${template}: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
237
|
-
);
|
|
238
|
-
process.exit(1);
|
|
239
277
|
}
|
|
278
|
+
} catch (error) {
|
|
279
|
+
logger.error(
|
|
280
|
+
`Failed to install templates: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
281
|
+
);
|
|
282
|
+
process.exit(1);
|
|
240
283
|
}
|
|
241
284
|
logger.blank();
|
|
242
285
|
logger.success(`Total: ${totalFiles} files, ${totalDirectories} directories`);
|
|
@@ -303,7 +346,7 @@ var installAllSkills = async (templates, targetDir) => {
|
|
|
303
346
|
|
|
304
347
|
// src/index.ts
|
|
305
348
|
var program = new Command();
|
|
306
|
-
program.name("claude-code").description("Claude Code documentation installer for projects").version("1.
|
|
349
|
+
program.name("claude-code").description("Claude Code documentation installer for projects").version("0.1.2");
|
|
307
350
|
program.option(
|
|
308
351
|
"-t, --template <names>",
|
|
309
352
|
"template names (comma-separated: tanstack-start,hono)"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kood/claude-code",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Claude Code documentation installer for projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": "./dist/index.js",
|
|
@@ -44,4 +44,4 @@
|
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=18"
|
|
46
46
|
}
|
|
47
|
-
}
|
|
47
|
+
}
|
package/templates/hono/CLAUDE.md
CHANGED
|
@@ -52,6 +52,24 @@
|
|
|
52
52
|
✅ 코드베이스 검색 시 sgrep 사용 필수
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
### 코드 작성 규칙
|
|
56
|
+
```
|
|
57
|
+
✅ 모든 한글 텍스트는 UTF-8 인코딩 유지
|
|
58
|
+
✅ 코드 묶음 단위로 한글 주석 작성 (너무 세세하게 X)
|
|
59
|
+
✅ Prisma Multi-File 모든 요소에 한글 주석 필수
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Prisma Multi-File 구조 (필수)
|
|
63
|
+
```
|
|
64
|
+
prisma/
|
|
65
|
+
├── schema/
|
|
66
|
+
│ ├── +base.prisma # datasource, generator 설정
|
|
67
|
+
│ ├── +enum.prisma # 모든 enum 정의
|
|
68
|
+
│ ├── user.prisma # User 모델
|
|
69
|
+
│ ├── post.prisma # Post 모델
|
|
70
|
+
│ └── ... # 기타 모델별 파일
|
|
71
|
+
```
|
|
72
|
+
|
|
55
73
|
---
|
|
56
74
|
|
|
57
75
|
## ✅ ALWAYS DO (필수 실행)
|
|
@@ -110,7 +128,7 @@ docs: API 문서 업데이트
|
|
|
110
128
|
|
|
111
129
|
| 작업 | 문서 경로 | 필독 여부 |
|
|
112
130
|
|------|----------|----------|
|
|
113
|
-
| **Git 규칙** | `docs/git/
|
|
131
|
+
| **Git 규칙** | `docs/git/git.md` | 🔴 필수 |
|
|
114
132
|
| **MCP 도구** | `docs/mcp/` | 🔴 필수 |
|
|
115
133
|
| **Gemini Review** | `docs/skills/gemini-review/` | 🟡 복잡한 작업 시 |
|
|
116
134
|
| **API 개발** | `docs/library/hono/` | 🔴 필수 |
|
|
@@ -371,6 +389,6 @@ const data = await res.json() // { users: [] }
|
|
|
371
389
|
## 🔗 Quick Links
|
|
372
390
|
|
|
373
391
|
- [Hono 가이드](./docs/library/hono/index.md)
|
|
374
|
-
- [Git 규칙](./docs/git/
|
|
392
|
+
- [Git 규칙](./docs/git/git.md)
|
|
375
393
|
- [MCP 가이드](./docs/mcp/index.md)
|
|
376
394
|
- [배포 가이드](./docs/deployment/index.md)
|