@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.
- package/dist/index.js +21 -243
- package/package.json +1 -1
- package/templates/hono/CLAUDE.md +10 -6
- package/templates/hono/docs/deployment/index.md +5 -0
- package/templates/hono/docs/library/hono/index.md +6 -0
- package/templates/hono/docs/library/prisma/index.md +3 -0
- package/templates/npx/CLAUDE.md +8 -2
- package/templates/tanstack-start/CLAUDE.md +105 -259
- package/templates/tanstack-start/docs/deployment/cloudflare.md +37 -424
- package/templates/tanstack-start/docs/deployment/index.md +57 -286
- package/templates/tanstack-start/docs/deployment/nitro.md +36 -318
- package/templates/tanstack-start/docs/deployment/railway.md +40 -409
- package/templates/tanstack-start/docs/deployment/vercel.md +43 -465
- package/templates/tanstack-start/docs/design/accessibility.md +56 -326
- package/templates/tanstack-start/docs/design/color.md +37 -179
- package/templates/tanstack-start/docs/design/components.md +77 -311
- package/templates/tanstack-start/docs/design/index.md +24 -87
- package/templates/tanstack-start/docs/design/safe-area.md +51 -250
- package/templates/tanstack-start/docs/design/spacing.md +57 -276
- package/templates/tanstack-start/docs/design/tailwind-setup.md +45 -359
- package/templates/tanstack-start/docs/design/typography.md +40 -284
- package/templates/tanstack-start/docs/guides/best-practices.md +3 -8
- package/templates/tanstack-start/docs/guides/env-setup.md +3 -3
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +27 -115
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +22 -105
- package/templates/tanstack-start/docs/library/better-auth/index.md +17 -66
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +11 -88
- package/templates/tanstack-start/docs/library/better-auth/session.md +12 -92
- package/templates/tanstack-start/docs/library/better-auth/setup.md +9 -91
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +30 -358
- package/templates/tanstack-start/docs/library/prisma/config.md +27 -327
- package/templates/tanstack-start/docs/library/prisma/crud.md +46 -174
- package/templates/tanstack-start/docs/library/prisma/index.md +23 -113
- package/templates/tanstack-start/docs/library/prisma/relations.md +31 -153
- package/templates/tanstack-start/docs/library/prisma/schema.md +40 -217
- package/templates/tanstack-start/docs/library/prisma/setup.md +13 -113
- package/templates/tanstack-start/docs/library/prisma/transactions.md +20 -110
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -99
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +28 -107
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +44 -146
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +11 -73
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +33 -127
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +49 -149
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +19 -112
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +33 -80
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +28 -106
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +21 -118
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +41 -172
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +6 -39
- package/templates/tanstack-start/docs/library/zod/basic-types.md +33 -145
- package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
- package/templates/tanstack-start/docs/library/zod/index.md +22 -150
- package/templates/tanstack-start/docs/library/zod/transforms.md +20 -129
- package/templates/tanstack-start/docs/library/zod/validation.md +39 -155
- package/templates/hono/docs/commands/git.md +0 -145
- package/templates/hono/docs/mcp/context7.md +0 -106
- package/templates/hono/docs/mcp/index.md +0 -176
- package/templates/hono/docs/mcp/sequential-thinking.md +0 -101
- package/templates/hono/docs/mcp/serena.md +0 -269
- package/templates/hono/docs/mcp/sgrep.md +0 -105
- package/templates/hono/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +0 -136
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +0 -303
- package/templates/npx/docs/commands/git.md +0 -145
- package/templates/npx/docs/mcp/index.md +0 -60
- package/templates/npx/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +0 -134
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +0 -301
- package/templates/tanstack-start/docs/commands/git.md +0 -145
- package/templates/tanstack-start/docs/mcp/context7.md +0 -204
- package/templates/tanstack-start/docs/mcp/index.md +0 -177
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +0 -180
- package/templates/tanstack-start/docs/mcp/serena.md +0 -269
- package/templates/tanstack-start/docs/mcp/sgrep.md +0 -174
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +0 -144
- 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.
|
|
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("
|
|
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
package/templates/hono/CLAUDE.md
CHANGED
|
@@ -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 규칙** |
|
|
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 규칙](
|
|
396
|
+
- [Git 규칙](../../commands/git.md)
|
|
393
397
|
- [MCP 가이드](./docs/mcp/index.md)
|
|
394
398
|
- [배포 가이드](./docs/deployment/index.md)
|
package/templates/npx/CLAUDE.md
CHANGED
|
@@ -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 규칙** |
|
|
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/` | 🔴 필수 |
|