@kood/claude-code 0.1.6 → 0.1.7

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 (75) hide show
  1. package/dist/index.js +21 -243
  2. package/package.json +1 -1
  3. package/templates/hono/CLAUDE.md +10 -6
  4. package/templates/hono/docs/deployment/index.md +5 -0
  5. package/templates/hono/docs/library/hono/index.md +6 -0
  6. package/templates/hono/docs/library/prisma/index.md +3 -0
  7. package/templates/npx/CLAUDE.md +8 -2
  8. package/templates/tanstack-start/CLAUDE.md +103 -255
  9. package/templates/tanstack-start/docs/deployment/cloudflare.md +37 -424
  10. package/templates/tanstack-start/docs/deployment/index.md +57 -286
  11. package/templates/tanstack-start/docs/deployment/nitro.md +36 -318
  12. package/templates/tanstack-start/docs/deployment/railway.md +40 -409
  13. package/templates/tanstack-start/docs/deployment/vercel.md +43 -465
  14. package/templates/tanstack-start/docs/design/accessibility.md +56 -326
  15. package/templates/tanstack-start/docs/design/color.md +37 -179
  16. package/templates/tanstack-start/docs/design/components.md +77 -311
  17. package/templates/tanstack-start/docs/design/index.md +24 -87
  18. package/templates/tanstack-start/docs/design/safe-area.md +51 -250
  19. package/templates/tanstack-start/docs/design/spacing.md +57 -276
  20. package/templates/tanstack-start/docs/design/tailwind-setup.md +45 -359
  21. package/templates/tanstack-start/docs/design/typography.md +40 -284
  22. package/templates/tanstack-start/docs/library/better-auth/2fa.md +27 -115
  23. package/templates/tanstack-start/docs/library/better-auth/advanced.md +22 -105
  24. package/templates/tanstack-start/docs/library/better-auth/index.md +17 -66
  25. package/templates/tanstack-start/docs/library/better-auth/plugins.md +11 -88
  26. package/templates/tanstack-start/docs/library/better-auth/session.md +12 -92
  27. package/templates/tanstack-start/docs/library/better-auth/setup.md +9 -91
  28. package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +30 -358
  29. package/templates/tanstack-start/docs/library/prisma/config.md +27 -327
  30. package/templates/tanstack-start/docs/library/prisma/crud.md +46 -174
  31. package/templates/tanstack-start/docs/library/prisma/index.md +23 -113
  32. package/templates/tanstack-start/docs/library/prisma/relations.md +31 -153
  33. package/templates/tanstack-start/docs/library/prisma/schema.md +40 -217
  34. package/templates/tanstack-start/docs/library/prisma/setup.md +12 -112
  35. package/templates/tanstack-start/docs/library/prisma/transactions.md +20 -110
  36. package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -99
  37. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +28 -107
  38. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +44 -146
  39. package/templates/tanstack-start/docs/library/tanstack-query/setup.md +11 -70
  40. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +33 -127
  41. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +49 -149
  42. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +19 -112
  43. package/templates/tanstack-start/docs/library/tanstack-start/index.md +33 -80
  44. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +28 -106
  45. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +21 -118
  46. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +34 -246
  47. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +6 -39
  48. package/templates/tanstack-start/docs/library/zod/basic-types.md +33 -145
  49. package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
  50. package/templates/tanstack-start/docs/library/zod/index.md +22 -150
  51. package/templates/tanstack-start/docs/library/zod/transforms.md +20 -129
  52. package/templates/tanstack-start/docs/library/zod/validation.md +39 -155
  53. package/templates/hono/docs/commands/git.md +0 -145
  54. package/templates/hono/docs/mcp/context7.md +0 -106
  55. package/templates/hono/docs/mcp/index.md +0 -176
  56. package/templates/hono/docs/mcp/sequential-thinking.md +0 -101
  57. package/templates/hono/docs/mcp/serena.md +0 -269
  58. package/templates/hono/docs/mcp/sgrep.md +0 -105
  59. package/templates/hono/docs/skills/gemini-review/SKILL.md +0 -220
  60. package/templates/hono/docs/skills/gemini-review/references/checklists.md +0 -136
  61. package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +0 -303
  62. package/templates/npx/docs/commands/git.md +0 -145
  63. package/templates/npx/docs/mcp/index.md +0 -60
  64. package/templates/npx/docs/skills/gemini-review/SKILL.md +0 -220
  65. package/templates/npx/docs/skills/gemini-review/references/checklists.md +0 -134
  66. package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +0 -301
  67. package/templates/tanstack-start/docs/commands/git.md +0 -145
  68. package/templates/tanstack-start/docs/mcp/context7.md +0 -204
  69. package/templates/tanstack-start/docs/mcp/index.md +0 -177
  70. package/templates/tanstack-start/docs/mcp/sequential-thinking.md +0 -180
  71. package/templates/tanstack-start/docs/mcp/serena.md +0 -269
  72. package/templates/tanstack-start/docs/mcp/sgrep.md +0 -174
  73. package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +0 -220
  74. package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +0 -144
  75. package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +0 -292
package/dist/index.js CHANGED
@@ -88,8 +88,26 @@ var copyMultipleTemplates = async (templates, targetDir) => {
88
88
  counter
89
89
  );
90
90
  }
91
+ const indexContent = generateIndexClaudeMd(templates);
92
+ await fs.writeFile(path.join(targetDir, "CLAUDE.md"), indexContent);
93
+ counter.files++;
91
94
  return counter;
92
95
  };
96
+ var generateIndexClaudeMd = (templates) => {
97
+ const templateLinks = templates.map((t) => `- [${t}](docs/${t}/CLAUDE.md)`).join("\n");
98
+ return `# CLAUDE.md
99
+
100
+ > \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC5EC\uB7EC \uD15C\uD50C\uB9BF\uC758 Claude Code \uBB38\uC11C\uB97C \uD3EC\uD568\uD569\uB2C8\uB2E4.
101
+
102
+ ## \uD15C\uD50C\uB9BF \uBB38\uC11C
103
+
104
+ ${templateLinks}
105
+
106
+ ## \uC0AC\uC6A9\uBC95
107
+
108
+ \uAC01 \uD15C\uD50C\uB9BF\uC758 \`CLAUDE.md\`\uB97C \uCC38\uC870\uD558\uC5EC \uD574\uB2F9 \uAE30\uC220 \uC2A4\uD0DD\uC758 \uAC00\uC774\uB4DC\uB77C\uC778\uC744 \uD655\uC778\uD558\uC138\uC694.
109
+ `;
110
+ };
93
111
  var checkExistingFiles = async (targetDir) => {
94
112
  const existingFiles = [];
95
113
  const claudeMd = path.join(targetDir, "CLAUDE.md");
@@ -118,123 +136,6 @@ var listAvailableTemplates = async () => {
118
136
  }
119
137
  return templates;
120
138
  };
121
- var getSkillsPath = (template) => {
122
- return path.join(getTemplatePath(template), "docs", "skills");
123
- };
124
- var listAvailableSkills = async (template) => {
125
- const skillsPath = getSkillsPath(template);
126
- if (!await fs.pathExists(skillsPath)) {
127
- return [];
128
- }
129
- const items = await fs.readdir(skillsPath);
130
- const skills = [];
131
- for (const item of items) {
132
- const itemPath = path.join(skillsPath, item);
133
- const stat = await fs.stat(itemPath);
134
- if (stat.isDirectory()) {
135
- skills.push(item);
136
- }
137
- }
138
- return skills;
139
- };
140
- var copySkills = async (template, targetDir) => {
141
- const skillsPath = getSkillsPath(template);
142
- const targetSkillsDir = path.join(targetDir, ".claude", "skills");
143
- if (!await fs.pathExists(skillsPath)) {
144
- return { files: 0, directories: 0, skills: [] };
145
- }
146
- let files = 0;
147
- let directories = 0;
148
- const installedSkills = [];
149
- const copyRecursive2 = async (src, dest) => {
150
- const stat = await fs.stat(src);
151
- if (stat.isDirectory()) {
152
- await fs.ensureDir(dest);
153
- directories++;
154
- const items = await fs.readdir(src);
155
- for (const item of items) {
156
- await copyRecursive2(path.join(src, item), path.join(dest, item));
157
- }
158
- } else {
159
- await fs.copy(src, dest);
160
- files++;
161
- }
162
- };
163
- const skillItems = await fs.readdir(skillsPath);
164
- for (const skill of skillItems) {
165
- const skillSrcPath = path.join(skillsPath, skill);
166
- const skillDestPath = path.join(targetSkillsDir, skill);
167
- const stat = await fs.stat(skillSrcPath);
168
- if (stat.isDirectory()) {
169
- await copyRecursive2(skillSrcPath, skillDestPath);
170
- installedSkills.push(skill);
171
- }
172
- }
173
- return { files, directories, skills: installedSkills };
174
- };
175
- var checkExistingSkills = async (targetDir, skills) => {
176
- const existingSkills = [];
177
- const targetSkillsDir = path.join(targetDir, ".claude", "skills");
178
- for (const skill of skills) {
179
- const skillPath = path.join(targetSkillsDir, skill);
180
- if (await fs.pathExists(skillPath)) {
181
- existingSkills.push(skill);
182
- }
183
- }
184
- return existingSkills;
185
- };
186
- var getCommandsPath = (template) => {
187
- return path.join(getTemplatePath(template), "docs", "commands");
188
- };
189
- var listAvailableCommands = async (template) => {
190
- const commandsPath = getCommandsPath(template);
191
- if (!await fs.pathExists(commandsPath)) {
192
- return [];
193
- }
194
- const items = await fs.readdir(commandsPath);
195
- const commands = [];
196
- for (const item of items) {
197
- const itemPath = path.join(commandsPath, item);
198
- const stat = await fs.stat(itemPath);
199
- if (stat.isFile() && item.endsWith(".md")) {
200
- commands.push(item.replace(".md", ""));
201
- }
202
- }
203
- return commands;
204
- };
205
- var copyCommands = async (template, targetDir) => {
206
- const commandsPath = getCommandsPath(template);
207
- const targetCommandsDir = path.join(targetDir, ".claude", "commands");
208
- if (!await fs.pathExists(commandsPath)) {
209
- return { files: 0, commands: [] };
210
- }
211
- let files = 0;
212
- const installedCommands = [];
213
- await fs.ensureDir(targetCommandsDir);
214
- const items = await fs.readdir(commandsPath);
215
- for (const item of items) {
216
- const srcPath = path.join(commandsPath, item);
217
- const stat = await fs.stat(srcPath);
218
- if (stat.isFile() && item.endsWith(".md")) {
219
- const destPath = path.join(targetCommandsDir, item);
220
- await fs.copy(srcPath, destPath);
221
- files++;
222
- installedCommands.push(item.replace(".md", ""));
223
- }
224
- }
225
- return { files, commands: installedCommands };
226
- };
227
- var checkExistingCommands = async (targetDir, commands) => {
228
- const existingCommands = [];
229
- const targetCommandsDir = path.join(targetDir, ".claude", "commands");
230
- for (const command of commands) {
231
- const commandPath = path.join(targetCommandsDir, `${command}.md`);
232
- if (await fs.pathExists(commandPath)) {
233
- existingCommands.push(command);
234
- }
235
- }
236
- return existingCommands;
237
- };
238
139
 
239
140
  // src/commands/init.ts
240
141
  var TEMPLATE_DESCRIPTIONS = {
@@ -296,8 +197,6 @@ var init = async (options) => {
296
197
  const isSingleTemplate = templates.length === 1;
297
198
  let totalFiles = 0;
298
199
  let totalDirectories = 0;
299
- const allSkills = [];
300
- const allCommands = [];
301
200
  logger.blank();
302
201
  try {
303
202
  if (isSingleTemplate) {
@@ -309,10 +208,6 @@ var init = async (options) => {
309
208
  totalFiles = result.files;
310
209
  totalDirectories = result.directories;
311
210
  logger.success(`${template}: ${result.files} files copied`);
312
- const availableSkills = await listAvailableSkills(template);
313
- allSkills.push(...availableSkills);
314
- const availableCommands = await listAvailableCommands(template);
315
- allCommands.push(...availableCommands);
316
211
  } else {
317
212
  logger.info(`Installing ${templates.length} templates...`);
318
213
  logger.step(`Target: ${targetDir}/docs/`);
@@ -322,18 +217,6 @@ var init = async (options) => {
322
217
  totalDirectories = result.directories;
323
218
  for (const template of templates) {
324
219
  logger.success(`${template}: installed to docs/${template}/`);
325
- const availableSkills = await listAvailableSkills(template);
326
- for (const skill of availableSkills) {
327
- if (!allSkills.includes(skill)) {
328
- allSkills.push(skill);
329
- }
330
- }
331
- const availableCommands = await listAvailableCommands(template);
332
- for (const command of availableCommands) {
333
- if (!allCommands.includes(command)) {
334
- allCommands.push(command);
335
- }
336
- }
337
220
  }
338
221
  }
339
222
  } catch (error) {
@@ -344,79 +227,6 @@ var init = async (options) => {
344
227
  }
345
228
  logger.blank();
346
229
  logger.success(`Total: ${totalFiles} files, ${totalDirectories} directories`);
347
- if (allSkills.length > 0) {
348
- let installSkills = options.skills;
349
- if (installSkills === void 0) {
350
- logger.blank();
351
- const response = await prompts({
352
- type: "confirm",
353
- name: "installSkills",
354
- message: `Install Claude Code skills? (${allSkills.join(", ")})`,
355
- initial: true
356
- });
357
- installSkills = response.installSkills;
358
- }
359
- if (installSkills) {
360
- const existingSkills = await checkExistingSkills(targetDir, allSkills);
361
- if (existingSkills.length > 0 && !options.force) {
362
- logger.warn("The following skills already exist:");
363
- existingSkills.forEach((s) => logger.step(s));
364
- logger.blank();
365
- const response = await prompts({
366
- type: "confirm",
367
- name: "overwrite",
368
- message: "Overwrite existing skills?",
369
- initial: false
370
- });
371
- if (!response.overwrite) {
372
- logger.info("Skipping skills installation.");
373
- } else {
374
- await installAllSkills(templates, targetDir);
375
- }
376
- } else {
377
- await installAllSkills(templates, targetDir);
378
- }
379
- logger.blank();
380
- }
381
- }
382
- if (allCommands.length > 0) {
383
- let installCommands = options.commands;
384
- if (installCommands === void 0) {
385
- logger.blank();
386
- const response = await prompts({
387
- type: "confirm",
388
- name: "installCommands",
389
- message: `Install Claude Code commands? (${allCommands.join(", ")})`,
390
- initial: true
391
- });
392
- installCommands = response.installCommands;
393
- }
394
- if (installCommands) {
395
- const existingCommands = await checkExistingCommands(
396
- targetDir,
397
- allCommands
398
- );
399
- if (existingCommands.length > 0 && !options.force) {
400
- logger.warn("The following commands already exist:");
401
- existingCommands.forEach((c) => logger.step(c));
402
- logger.blank();
403
- const response = await prompts({
404
- type: "confirm",
405
- name: "overwrite",
406
- message: "Overwrite existing commands?",
407
- initial: false
408
- });
409
- if (!response.overwrite) {
410
- logger.info("Skipping commands installation.");
411
- } else {
412
- await installAllCommands(templates, targetDir);
413
- }
414
- } else {
415
- await installAllCommands(templates, targetDir);
416
- }
417
- logger.blank();
418
- }
419
- }
420
230
  logger.success("Claude Code documentation installed!");
421
231
  logger.blank();
422
232
  logger.info("Installed templates:");
@@ -427,44 +237,14 @@ var init = async (options) => {
427
237
  logger.step("Explore docs/ for detailed documentation");
428
238
  logger.blank();
429
239
  };
430
- var installAllSkills = async (templates, targetDir) => {
431
- const installedSkills = [];
432
- for (const template of templates) {
433
- const skillsResult = await copySkills(template, targetDir);
434
- for (const skill of skillsResult.skills) {
435
- if (!installedSkills.includes(skill)) {
436
- installedSkills.push(skill);
437
- }
438
- }
439
- }
440
- if (installedSkills.length > 0) {
441
- logger.success(`Skills installed: ${installedSkills.join(", ")}`);
442
- logger.step(`Location: .claude/skills/`);
443
- }
444
- };
445
- var installAllCommands = async (templates, targetDir) => {
446
- const installedCommands = [];
447
- for (const template of templates) {
448
- const commandsResult = await copyCommands(template, targetDir);
449
- for (const command of commandsResult.commands) {
450
- if (!installedCommands.includes(command)) {
451
- installedCommands.push(command);
452
- }
453
- }
454
- }
455
- if (installedCommands.length > 0) {
456
- logger.success(`Commands installed: ${installedCommands.join(", ")}`);
457
- logger.step(`Location: .claude/commands/`);
458
- }
459
- };
460
240
 
461
241
  // src/index.ts
462
242
  var program = new Command();
463
- program.name("claude-code").description("Claude Code documentation installer for projects").version("0.1.5");
243
+ program.name("claude-code").description("Claude Code documentation installer for projects").version("0.1.7");
464
244
  program.option(
465
245
  "-t, --template <names>",
466
246
  "template names (comma-separated: tanstack-start,hono)"
467
- ).option("-f, --force", "overwrite existing files without prompting").option("-s, --skills", "install Claude Code skills").option("--no-skills", "skip skills installation").option("-c, --commands", "install Claude Code commands").option("--no-commands", "skip commands installation").option("--cwd <path>", "target directory (default: current directory)").option("--list", "list available templates").action(async (options) => {
247
+ ).option("-f, --force", "overwrite existing files without prompting").option("--cwd <path>", "target directory (default: current directory)").option("--list", "list available templates").action(async (options) => {
468
248
  banner();
469
249
  if (options.list) {
470
250
  const templates = await listAvailableTemplates();
@@ -476,9 +256,7 @@ program.option(
476
256
  await init({
477
257
  templates: options.template?.split(",").map((t) => t.trim()),
478
258
  force: options.force,
479
- cwd: options.cwd,
480
- skills: options.skills,
481
- commands: options.commands
259
+ cwd: options.cwd
482
260
  });
483
261
  });
484
262
  program.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kood/claude-code",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Claude Code documentation installer for projects",
5
5
  "type": "module",
6
6
  "bin": "./dist/index.js",
@@ -2,6 +2,14 @@
2
2
 
3
3
  > Hono 서버 프레임워크 프로젝트 작업 지침
4
4
 
5
+ ## Instructions
6
+
7
+ @../../commands/git.md
8
+ @docs/library/hono/index.md
9
+ @docs/library/prisma/index.md
10
+ @docs/library/zod/index.md
11
+ @docs/deployment/index.md
12
+
5
13
  ---
6
14
 
7
15
  ## 🚨 STOP - 작업 전 필수 확인
@@ -103,8 +111,6 @@ DB 작업 → docs/library/prisma/ 읽기
103
111
  - 보안 관련 코드 (인증, 권한, 암호화)
104
112
  - 성능 크리티컬 코드
105
113
 
106
- **상세**: `docs/skills/gemini-review/SKILL.md` 참고
107
-
108
114
  ### 4. 작업 완료 후: Git 커밋
109
115
  ```bash
110
116
  git add .
@@ -128,9 +134,7 @@ docs: API 문서 업데이트
128
134
 
129
135
  | 작업 | 문서 경로 | 필독 여부 |
130
136
  |------|----------|----------|
131
- | **Git 규칙** | `docs/git/git.md` | 🔴 필수 |
132
- | **MCP 도구** | `docs/mcp/` | 🔴 필수 |
133
- | **Gemini Review** | `docs/skills/gemini-review/` | 🟡 복잡한 작업 시 |
137
+ | **Git 규칙** | `../../commands/git.md` | 🔴 필수 |
134
138
  | **API 개발** | `docs/library/hono/` | 🔴 필수 |
135
139
  | **DB** | `docs/library/prisma/` | 🟡 해당 시 |
136
140
  | **검증** | `docs/library/zod/` | 🟡 해당 시 |
@@ -389,6 +393,6 @@ const data = await res.json() // { users: [] }
389
393
  ## 🔗 Quick Links
390
394
 
391
395
  - [Hono 가이드](./docs/library/hono/index.md)
392
- - [Git 규칙](./docs/git/git.md)
396
+ - [Git 규칙](../../commands/git.md)
393
397
  - [MCP 가이드](./docs/mcp/index.md)
394
398
  - [배포 가이드](./docs/deployment/index.md)
@@ -2,6 +2,11 @@
2
2
 
3
3
  > **Version**: Nitro 3.x | Hono 프레임워크 배포
4
4
 
5
+ @docker.md
6
+ @railway.md
7
+ @vercel.md
8
+ @cloudflare.md
9
+
5
10
  ---
6
11
 
7
12
  ## 🚀 Quick Reference (복사용)
@@ -2,6 +2,12 @@
2
2
 
3
3
  > Web Standards 기반 초경량, 초고속 서버 프레임워크
4
4
 
5
+ @env-setup.md
6
+ @middleware.md
7
+ @validation.md
8
+ @error-handling.md
9
+ @rpc.md
10
+
5
11
  ---
6
12
 
7
13
  ## 개요
@@ -2,6 +2,9 @@
2
2
 
3
3
  > Type-safe 데이터베이스 ORM
4
4
 
5
+ @config.md
6
+ @cloudflare-d1.md
7
+
5
8
  ---
6
9
 
7
10
  ## ⚠️ 버전 주의
@@ -2,6 +2,13 @@
2
2
 
3
3
  > NPX CLI 도구 프로젝트 작업 지침
4
4
 
5
+ ## Instructions
6
+
7
+ @../../commands/git.md
8
+ @docs/library/commander/index.md
9
+ @docs/library/fs-extra/index.md
10
+ @docs/library/prompts/index.md
11
+
5
12
  ---
6
13
 
7
14
  ## 🚨 STOP - 작업 전 필수 확인
@@ -87,8 +94,7 @@ docs: README 업데이트
87
94
 
88
95
  | 작업 | 문서 경로 | 필독 여부 |
89
96
  |------|----------|----------|
90
- | **Git 규칙** | `docs/git/git.md` | 🔴 필수 |
91
- | **MCP 도구** | `docs/mcp/` | 🔴 필수 |
97
+ | **Git 규칙** | `../../commands/git.md` | 🔴 필수 |
92
98
  | **Commander** | `docs/library/commander/` | 🔴 필수 |
93
99
  | **fs-extra** | `docs/library/fs-extra/` | 🔴 필수 |
94
100
  | **prompts** | `docs/library/prompts/` | 🔴 필수 |