@kood/claude-code 0.1.0
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.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
|
|
6
|
+
// src/utils/logger.ts
|
|
7
|
+
import pc from "picocolors";
|
|
8
|
+
var logger = {
|
|
9
|
+
info: (msg) => console.log(pc.cyan("\u2139"), msg),
|
|
10
|
+
success: (msg) => console.log(pc.green("\u2713"), msg),
|
|
11
|
+
warn: (msg) => console.log(pc.yellow("\u26A0"), msg),
|
|
12
|
+
error: (msg) => console.log(pc.red("\u2717"), msg),
|
|
13
|
+
title: (msg) => console.log("\n" + pc.bold(pc.blue(msg)) + "\n"),
|
|
14
|
+
step: (msg) => console.log(pc.gray(" \u2192"), msg),
|
|
15
|
+
blank: () => console.log()
|
|
16
|
+
};
|
|
17
|
+
var banner = () => {
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(pc.bold(pc.cyan(" \u{1F680} Claude Code Docs Installer")));
|
|
20
|
+
console.log(pc.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
21
|
+
console.log();
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/commands/init.ts
|
|
25
|
+
import prompts from "prompts";
|
|
26
|
+
|
|
27
|
+
// src/utils/copy.ts
|
|
28
|
+
import fs from "fs-extra";
|
|
29
|
+
import path from "path";
|
|
30
|
+
import { fileURLToPath } from "url";
|
|
31
|
+
var __filename2 = fileURLToPath(import.meta.url);
|
|
32
|
+
var __dirname2 = path.dirname(__filename2);
|
|
33
|
+
var getTemplatesDir = () => {
|
|
34
|
+
return path.resolve(__dirname2, "../templates");
|
|
35
|
+
};
|
|
36
|
+
var getTemplatePath = (template) => {
|
|
37
|
+
return path.join(getTemplatesDir(), template);
|
|
38
|
+
};
|
|
39
|
+
var copyTemplate = async (template, targetDir) => {
|
|
40
|
+
const templatePath = getTemplatePath(template);
|
|
41
|
+
if (!await fs.pathExists(templatePath)) {
|
|
42
|
+
throw new Error(`Template "${template}" not found at ${templatePath}`);
|
|
43
|
+
}
|
|
44
|
+
let files = 0;
|
|
45
|
+
let directories = 0;
|
|
46
|
+
const copyRecursive = async (src, dest) => {
|
|
47
|
+
const stat = await fs.stat(src);
|
|
48
|
+
if (stat.isDirectory()) {
|
|
49
|
+
await fs.ensureDir(dest);
|
|
50
|
+
directories++;
|
|
51
|
+
const items = await fs.readdir(src);
|
|
52
|
+
for (const item of items) {
|
|
53
|
+
await copyRecursive(path.join(src, item), path.join(dest, item));
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
await fs.copy(src, dest);
|
|
57
|
+
files++;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
await copyRecursive(templatePath, targetDir);
|
|
61
|
+
return { files, directories };
|
|
62
|
+
};
|
|
63
|
+
var checkExistingFiles = async (targetDir) => {
|
|
64
|
+
const existingFiles = [];
|
|
65
|
+
const claudeMd = path.join(targetDir, "CLAUDE.md");
|
|
66
|
+
const docsDir = path.join(targetDir, "docs");
|
|
67
|
+
if (await fs.pathExists(claudeMd)) {
|
|
68
|
+
existingFiles.push("CLAUDE.md");
|
|
69
|
+
}
|
|
70
|
+
if (await fs.pathExists(docsDir)) {
|
|
71
|
+
existingFiles.push("docs/");
|
|
72
|
+
}
|
|
73
|
+
return existingFiles;
|
|
74
|
+
};
|
|
75
|
+
var listAvailableTemplates = async () => {
|
|
76
|
+
const templatesDir = getTemplatesDir();
|
|
77
|
+
if (!await fs.pathExists(templatesDir)) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const items = await fs.readdir(templatesDir);
|
|
81
|
+
const templates = [];
|
|
82
|
+
for (const item of items) {
|
|
83
|
+
const itemPath = path.join(templatesDir, item);
|
|
84
|
+
const stat = await fs.stat(itemPath);
|
|
85
|
+
if (stat.isDirectory()) {
|
|
86
|
+
templates.push(item);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return templates;
|
|
90
|
+
};
|
|
91
|
+
var getSkillsPath = (template) => {
|
|
92
|
+
return path.join(getTemplatePath(template), "docs", "skills");
|
|
93
|
+
};
|
|
94
|
+
var listAvailableSkills = async (template) => {
|
|
95
|
+
const skillsPath = getSkillsPath(template);
|
|
96
|
+
if (!await fs.pathExists(skillsPath)) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const items = await fs.readdir(skillsPath);
|
|
100
|
+
const skills = [];
|
|
101
|
+
for (const item of items) {
|
|
102
|
+
const itemPath = path.join(skillsPath, item);
|
|
103
|
+
const stat = await fs.stat(itemPath);
|
|
104
|
+
if (stat.isDirectory()) {
|
|
105
|
+
skills.push(item);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return skills;
|
|
109
|
+
};
|
|
110
|
+
var copySkills = async (template, targetDir) => {
|
|
111
|
+
const skillsPath = getSkillsPath(template);
|
|
112
|
+
const targetSkillsDir = path.join(targetDir, ".claude", "skills");
|
|
113
|
+
if (!await fs.pathExists(skillsPath)) {
|
|
114
|
+
return { files: 0, directories: 0, skills: [] };
|
|
115
|
+
}
|
|
116
|
+
let files = 0;
|
|
117
|
+
let directories = 0;
|
|
118
|
+
const installedSkills = [];
|
|
119
|
+
const copyRecursive = async (src, dest) => {
|
|
120
|
+
const stat = await fs.stat(src);
|
|
121
|
+
if (stat.isDirectory()) {
|
|
122
|
+
await fs.ensureDir(dest);
|
|
123
|
+
directories++;
|
|
124
|
+
const items = await fs.readdir(src);
|
|
125
|
+
for (const item of items) {
|
|
126
|
+
await copyRecursive(path.join(src, item), path.join(dest, item));
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
await fs.copy(src, dest);
|
|
130
|
+
files++;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const skillItems = await fs.readdir(skillsPath);
|
|
134
|
+
for (const skill of skillItems) {
|
|
135
|
+
const skillSrcPath = path.join(skillsPath, skill);
|
|
136
|
+
const skillDestPath = path.join(targetSkillsDir, skill);
|
|
137
|
+
const stat = await fs.stat(skillSrcPath);
|
|
138
|
+
if (stat.isDirectory()) {
|
|
139
|
+
await copyRecursive(skillSrcPath, skillDestPath);
|
|
140
|
+
installedSkills.push(skill);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { files, directories, skills: installedSkills };
|
|
144
|
+
};
|
|
145
|
+
var checkExistingSkills = async (targetDir, skills) => {
|
|
146
|
+
const existingSkills = [];
|
|
147
|
+
const targetSkillsDir = path.join(targetDir, ".claude", "skills");
|
|
148
|
+
for (const skill of skills) {
|
|
149
|
+
const skillPath = path.join(targetSkillsDir, skill);
|
|
150
|
+
if (await fs.pathExists(skillPath)) {
|
|
151
|
+
existingSkills.push(skill);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return existingSkills;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// src/commands/init.ts
|
|
158
|
+
var TEMPLATE_DESCRIPTIONS = {
|
|
159
|
+
"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"
|
|
161
|
+
};
|
|
162
|
+
var init = async (options) => {
|
|
163
|
+
const targetDir = options.cwd || process.cwd();
|
|
164
|
+
const availableTemplates = await listAvailableTemplates();
|
|
165
|
+
if (availableTemplates.length === 0) {
|
|
166
|
+
logger.error("No templates found. Package may be corrupted.");
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
let template = options.template;
|
|
170
|
+
if (!template) {
|
|
171
|
+
const response = await prompts({
|
|
172
|
+
type: "select",
|
|
173
|
+
name: "template",
|
|
174
|
+
message: "Select a template:",
|
|
175
|
+
choices: availableTemplates.map((t) => ({
|
|
176
|
+
title: t,
|
|
177
|
+
description: TEMPLATE_DESCRIPTIONS[t] || "",
|
|
178
|
+
value: t
|
|
179
|
+
}))
|
|
180
|
+
});
|
|
181
|
+
if (!response.template) {
|
|
182
|
+
logger.warn("Operation cancelled.");
|
|
183
|
+
process.exit(0);
|
|
184
|
+
}
|
|
185
|
+
template = response.template;
|
|
186
|
+
}
|
|
187
|
+
if (!availableTemplates.includes(template)) {
|
|
188
|
+
logger.error(`Template "${template}" not found.`);
|
|
189
|
+
logger.info(`Available templates: ${availableTemplates.join(", ")}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
const existingFiles = await checkExistingFiles(targetDir);
|
|
193
|
+
if (existingFiles.length > 0 && !options.force) {
|
|
194
|
+
logger.warn("The following files/folders already exist:");
|
|
195
|
+
existingFiles.forEach((f) => logger.step(f));
|
|
196
|
+
logger.blank();
|
|
197
|
+
const response = await prompts({
|
|
198
|
+
type: "confirm",
|
|
199
|
+
name: "overwrite",
|
|
200
|
+
message: "Overwrite existing files?",
|
|
201
|
+
initial: false
|
|
202
|
+
});
|
|
203
|
+
if (!response.overwrite) {
|
|
204
|
+
logger.info("Operation cancelled.");
|
|
205
|
+
process.exit(0);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
logger.blank();
|
|
209
|
+
logger.info(`Installing ${template} template...`);
|
|
210
|
+
logger.step(`Target: ${targetDir}`);
|
|
211
|
+
logger.blank();
|
|
212
|
+
try {
|
|
213
|
+
const result = await copyTemplate(template, targetDir);
|
|
214
|
+
logger.success(`${result.files} files copied`);
|
|
215
|
+
logger.success(`${result.directories} directories created`);
|
|
216
|
+
logger.blank();
|
|
217
|
+
const availableSkills = await listAvailableSkills(template);
|
|
218
|
+
if (availableSkills.length > 0) {
|
|
219
|
+
let installSkills = options.skills;
|
|
220
|
+
if (installSkills === void 0) {
|
|
221
|
+
const response = await prompts({
|
|
222
|
+
type: "confirm",
|
|
223
|
+
name: "installSkills",
|
|
224
|
+
message: `Install Claude Code skills? (${availableSkills.join(", ")})`,
|
|
225
|
+
initial: true
|
|
226
|
+
});
|
|
227
|
+
installSkills = response.installSkills;
|
|
228
|
+
}
|
|
229
|
+
if (installSkills) {
|
|
230
|
+
const existingSkills = await checkExistingSkills(
|
|
231
|
+
targetDir,
|
|
232
|
+
availableSkills
|
|
233
|
+
);
|
|
234
|
+
if (existingSkills.length > 0 && !options.force) {
|
|
235
|
+
logger.warn("The following skills already exist:");
|
|
236
|
+
existingSkills.forEach((s) => logger.step(s));
|
|
237
|
+
logger.blank();
|
|
238
|
+
const response = await prompts({
|
|
239
|
+
type: "confirm",
|
|
240
|
+
name: "overwrite",
|
|
241
|
+
message: "Overwrite existing skills?",
|
|
242
|
+
initial: false
|
|
243
|
+
});
|
|
244
|
+
if (!response.overwrite) {
|
|
245
|
+
logger.info("Skipping skills installation.");
|
|
246
|
+
} else {
|
|
247
|
+
const skillsResult = await copySkills(
|
|
248
|
+
template,
|
|
249
|
+
targetDir
|
|
250
|
+
);
|
|
251
|
+
logger.success(
|
|
252
|
+
`Skills installed: ${skillsResult.skills.join(", ")}`
|
|
253
|
+
);
|
|
254
|
+
logger.step(`Location: .claude/skills/`);
|
|
255
|
+
}
|
|
256
|
+
} else {
|
|
257
|
+
const skillsResult = await copySkills(template, targetDir);
|
|
258
|
+
logger.success(`Skills installed: ${skillsResult.skills.join(", ")}`);
|
|
259
|
+
logger.step(`Location: .claude/skills/`);
|
|
260
|
+
}
|
|
261
|
+
logger.blank();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
logger.success("Claude Code documentation installed!");
|
|
265
|
+
logger.blank();
|
|
266
|
+
logger.info("Next steps:");
|
|
267
|
+
logger.step("Read CLAUDE.md for project guidelines");
|
|
268
|
+
logger.step("Explore docs/ for detailed documentation");
|
|
269
|
+
logger.blank();
|
|
270
|
+
} catch (error) {
|
|
271
|
+
logger.error(
|
|
272
|
+
`Failed to install template: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
273
|
+
);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
// src/index.ts
|
|
279
|
+
var program = new Command();
|
|
280
|
+
program.name("claude-code").description("Claude Code documentation installer for projects").version("1.0.0");
|
|
281
|
+
program.option("-t, --template <name>", "template name (tanstack-start, hono)").option("-f, --force", "overwrite existing files without prompting").option("-s, --skills", "install Claude Code skills").option("--no-skills", "skip skills installation").option("--cwd <path>", "target directory (default: current directory)").option("--list", "list available templates").action(async (options) => {
|
|
282
|
+
banner();
|
|
283
|
+
if (options.list) {
|
|
284
|
+
const templates = await listAvailableTemplates();
|
|
285
|
+
logger.info("Available templates:");
|
|
286
|
+
templates.forEach((t) => logger.step(t));
|
|
287
|
+
logger.blank();
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
await init({
|
|
291
|
+
template: options.template,
|
|
292
|
+
force: options.force,
|
|
293
|
+
cwd: options.cwd,
|
|
294
|
+
skills: options.skills
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
program.parse();
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kood/claude-code",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Claude Code documentation installer for projects",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": "./dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"templates"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"copy-templates": "node scripts/copy-templates.js",
|
|
13
|
+
"build": "tsup && npm run copy-templates",
|
|
14
|
+
"dev": "npm run build && node dist/index.js",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"claude",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"documentation",
|
|
21
|
+
"cli",
|
|
22
|
+
"tanstack",
|
|
23
|
+
"hono"
|
|
24
|
+
],
|
|
25
|
+
"author": "alpoxdev",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/alpoxdev/claude-code"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"commander": "^12.1.0",
|
|
33
|
+
"fs-extra": "^11.2.0",
|
|
34
|
+
"picocolors": "^1.1.1",
|
|
35
|
+
"prompts": "^2.4.2"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/fs-extra": "^11.0.4",
|
|
39
|
+
"@types/node": "^22.10.0",
|
|
40
|
+
"@types/prompts": "^2.4.9",
|
|
41
|
+
"tsup": "^8.3.5",
|
|
42
|
+
"typescript": "^5.7.2"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18"
|
|
46
|
+
}
|
|
47
|
+
}
|