@kood/claude-code 0.1.5 → 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 (77) 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 +105 -259
  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/guides/best-practices.md +3 -8
  23. package/templates/tanstack-start/docs/guides/env-setup.md +3 -3
  24. package/templates/tanstack-start/docs/library/better-auth/2fa.md +27 -115
  25. package/templates/tanstack-start/docs/library/better-auth/advanced.md +22 -105
  26. package/templates/tanstack-start/docs/library/better-auth/index.md +17 -66
  27. package/templates/tanstack-start/docs/library/better-auth/plugins.md +11 -88
  28. package/templates/tanstack-start/docs/library/better-auth/session.md +12 -92
  29. package/templates/tanstack-start/docs/library/better-auth/setup.md +9 -91
  30. package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +30 -358
  31. package/templates/tanstack-start/docs/library/prisma/config.md +27 -327
  32. package/templates/tanstack-start/docs/library/prisma/crud.md +46 -174
  33. package/templates/tanstack-start/docs/library/prisma/index.md +23 -113
  34. package/templates/tanstack-start/docs/library/prisma/relations.md +31 -153
  35. package/templates/tanstack-start/docs/library/prisma/schema.md +40 -217
  36. package/templates/tanstack-start/docs/library/prisma/setup.md +13 -113
  37. package/templates/tanstack-start/docs/library/prisma/transactions.md +20 -110
  38. package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -99
  39. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +28 -107
  40. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +44 -146
  41. package/templates/tanstack-start/docs/library/tanstack-query/setup.md +11 -73
  42. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +33 -127
  43. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +49 -149
  44. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +19 -112
  45. package/templates/tanstack-start/docs/library/tanstack-start/index.md +33 -80
  46. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +28 -106
  47. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +21 -118
  48. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +41 -172
  49. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +6 -39
  50. package/templates/tanstack-start/docs/library/zod/basic-types.md +33 -145
  51. package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
  52. package/templates/tanstack-start/docs/library/zod/index.md +22 -150
  53. package/templates/tanstack-start/docs/library/zod/transforms.md +20 -129
  54. package/templates/tanstack-start/docs/library/zod/validation.md +39 -155
  55. package/templates/hono/docs/commands/git.md +0 -145
  56. package/templates/hono/docs/mcp/context7.md +0 -106
  57. package/templates/hono/docs/mcp/index.md +0 -176
  58. package/templates/hono/docs/mcp/sequential-thinking.md +0 -101
  59. package/templates/hono/docs/mcp/serena.md +0 -269
  60. package/templates/hono/docs/mcp/sgrep.md +0 -105
  61. package/templates/hono/docs/skills/gemini-review/SKILL.md +0 -220
  62. package/templates/hono/docs/skills/gemini-review/references/checklists.md +0 -136
  63. package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +0 -303
  64. package/templates/npx/docs/commands/git.md +0 -145
  65. package/templates/npx/docs/mcp/index.md +0 -60
  66. package/templates/npx/docs/skills/gemini-review/SKILL.md +0 -220
  67. package/templates/npx/docs/skills/gemini-review/references/checklists.md +0 -134
  68. package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +0 -301
  69. package/templates/tanstack-start/docs/commands/git.md +0 -145
  70. package/templates/tanstack-start/docs/mcp/context7.md +0 -204
  71. package/templates/tanstack-start/docs/mcp/index.md +0 -177
  72. package/templates/tanstack-start/docs/mcp/sequential-thinking.md +0 -180
  73. package/templates/tanstack-start/docs/mcp/serena.md +0 -269
  74. package/templates/tanstack-start/docs/mcp/sgrep.md +0 -174
  75. package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +0 -220
  76. package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +0 -144
  77. 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.5",
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/` | 🔴 필수 |