create-agent-config 1.0.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/LICENSE +21 -0
- package/README.md +163 -0
- package/dist/index.cjs +561 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +28 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +558 -0
- package/dist/index.js.map +1 -0
- package/package.json +112 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface StackInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
languages: string[];
|
|
4
|
+
frameworks: string[];
|
|
5
|
+
buildTools: string[];
|
|
6
|
+
testFrameworks: string[];
|
|
7
|
+
packageManager: "npm" | "yarn" | "pnpm" | "bun" | "unknown";
|
|
8
|
+
scripts: Record<string, string>;
|
|
9
|
+
hasTypeScript: boolean;
|
|
10
|
+
hasPython: boolean;
|
|
11
|
+
isMonorepo: boolean;
|
|
12
|
+
directories: string[];
|
|
13
|
+
}
|
|
14
|
+
declare function detectStack(rootDir?: string): StackInfo;
|
|
15
|
+
|
|
16
|
+
type OutputFormat = "agents-md" | "claude-md" | "cursor-mdc" | "copilot-md" | "windsurfrules" | "clinerules";
|
|
17
|
+
interface UserChoices {
|
|
18
|
+
projectName: string;
|
|
19
|
+
formats: OutputFormat[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface GeneratedFile {
|
|
23
|
+
path: string;
|
|
24
|
+
content: string;
|
|
25
|
+
}
|
|
26
|
+
declare function generateFiles(projectName: string, stack: StackInfo, formats: OutputFormat[], rootDir: string): GeneratedFile[];
|
|
27
|
+
|
|
28
|
+
export { type OutputFormat, type StackInfo, type UserChoices, detectStack, generateFiles };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve, join, dirname } from 'path';
|
|
3
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
4
|
+
import { createInterface } from 'readline';
|
|
5
|
+
|
|
6
|
+
function readJsonSafe(path) {
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
9
|
+
} catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function fileExists(root, ...paths) {
|
|
14
|
+
return paths.some((p) => existsSync(join(root, p)));
|
|
15
|
+
}
|
|
16
|
+
function detectPackageManager(root) {
|
|
17
|
+
if (existsSync(join(root, "bun.lockb")) || existsSync(join(root, "bun.lock")))
|
|
18
|
+
return "bun";
|
|
19
|
+
if (existsSync(join(root, "pnpm-lock.yaml"))) return "pnpm";
|
|
20
|
+
if (existsSync(join(root, "yarn.lock"))) return "yarn";
|
|
21
|
+
if (existsSync(join(root, "package-lock.json"))) return "npm";
|
|
22
|
+
return "unknown";
|
|
23
|
+
}
|
|
24
|
+
function detectFrameworks(root, deps) {
|
|
25
|
+
const found = [];
|
|
26
|
+
const checks = [
|
|
27
|
+
[
|
|
28
|
+
"Next.js",
|
|
29
|
+
() => fileExists(root, "next.config.js", "next.config.mjs", "next.config.ts")
|
|
30
|
+
],
|
|
31
|
+
["Nuxt", () => fileExists(root, "nuxt.config.ts", "nuxt.config.js")],
|
|
32
|
+
["Remix", ["@remix-run/react", "@remix-run/node"]],
|
|
33
|
+
["Astro", ["astro"]],
|
|
34
|
+
["SvelteKit", ["@sveltejs/kit"]],
|
|
35
|
+
["Angular", () => fileExists(root, "angular.json")],
|
|
36
|
+
["React", ["react"]],
|
|
37
|
+
["Vue", ["vue"]],
|
|
38
|
+
["Svelte", ["svelte"]],
|
|
39
|
+
["Express", ["express"]],
|
|
40
|
+
["Fastify", ["fastify"]],
|
|
41
|
+
["NestJS", ["@nestjs/core"]],
|
|
42
|
+
["Hono", ["hono"]],
|
|
43
|
+
["Elysia", ["elysia"]],
|
|
44
|
+
["Electron", ["electron"]],
|
|
45
|
+
["Vite", ["vite"]],
|
|
46
|
+
["Webpack", ["webpack"]],
|
|
47
|
+
["Turborepo", () => fileExists(root, "turbo.json")],
|
|
48
|
+
["Nx", () => fileExists(root, "nx.json")],
|
|
49
|
+
["Django", () => fileExists(root, "manage.py")],
|
|
50
|
+
["Flask", ["flask"]],
|
|
51
|
+
["FastAPI", ["fastapi"]]
|
|
52
|
+
];
|
|
53
|
+
for (const [name, check] of checks) {
|
|
54
|
+
if (typeof check === "function") {
|
|
55
|
+
if (check()) found.push(name);
|
|
56
|
+
} else {
|
|
57
|
+
if (check.some((dep) => dep in deps)) found.push(name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return found;
|
|
61
|
+
}
|
|
62
|
+
function detectTestFrameworks(deps) {
|
|
63
|
+
const found = [];
|
|
64
|
+
const checks = [
|
|
65
|
+
["Vitest", ["vitest"]],
|
|
66
|
+
["Jest", ["jest"]],
|
|
67
|
+
["Mocha", ["mocha"]],
|
|
68
|
+
["Playwright", ["@playwright/test"]],
|
|
69
|
+
["Cypress", ["cypress"]],
|
|
70
|
+
["pytest", ["pytest"]]
|
|
71
|
+
];
|
|
72
|
+
for (const [name, pkgs] of checks) {
|
|
73
|
+
if (pkgs.some((dep) => dep in deps)) found.push(name);
|
|
74
|
+
}
|
|
75
|
+
return found;
|
|
76
|
+
}
|
|
77
|
+
function getTopLevelDirs(root) {
|
|
78
|
+
try {
|
|
79
|
+
return readdirSync(root).filter((f) => {
|
|
80
|
+
if (f.startsWith(".") || f === "node_modules" || f === "dist" || f === "build" || f === "coverage")
|
|
81
|
+
return false;
|
|
82
|
+
try {
|
|
83
|
+
return statSync(join(root, f)).isDirectory();
|
|
84
|
+
} catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}).slice(0, 20);
|
|
88
|
+
} catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function detectStack(rootDir) {
|
|
93
|
+
const root = resolve(rootDir ?? ".");
|
|
94
|
+
const languages = [];
|
|
95
|
+
const buildTools = [];
|
|
96
|
+
const pkg = readJsonSafe(join(root, "package.json"));
|
|
97
|
+
const allDeps = {
|
|
98
|
+
...pkg?.dependencies ?? {},
|
|
99
|
+
...pkg?.devDependencies ?? {}
|
|
100
|
+
};
|
|
101
|
+
const scripts = pkg?.scripts ?? {};
|
|
102
|
+
const name = pkg?.name ?? "";
|
|
103
|
+
const hasTypeScript = fileExists(root, "tsconfig.json", "tsconfig.base.json");
|
|
104
|
+
const hasPython = fileExists(
|
|
105
|
+
root,
|
|
106
|
+
"requirements.txt",
|
|
107
|
+
"pyproject.toml",
|
|
108
|
+
"Pipfile",
|
|
109
|
+
"setup.py",
|
|
110
|
+
"setup.cfg"
|
|
111
|
+
);
|
|
112
|
+
const hasJs = pkg !== null || fileExists(root, "package.json");
|
|
113
|
+
if (hasTypeScript) languages.push("TypeScript");
|
|
114
|
+
if (hasJs && !hasTypeScript) languages.push("JavaScript");
|
|
115
|
+
if (hasPython) languages.push("Python");
|
|
116
|
+
if (fileExists(root, "Cargo.toml")) languages.push("Rust");
|
|
117
|
+
if (fileExists(root, "go.mod")) languages.push("Go");
|
|
118
|
+
if (hasTypeScript && "tsup" in allDeps) buildTools.push("tsup");
|
|
119
|
+
if ("esbuild" in allDeps) buildTools.push("esbuild");
|
|
120
|
+
if ("rollup" in allDeps) buildTools.push("rollup");
|
|
121
|
+
const isMonorepo = fileExists(root, "turbo.json", "nx.json", "lerna.json") || pkg?.workspaces !== void 0;
|
|
122
|
+
const frameworks = detectFrameworks(root, allDeps);
|
|
123
|
+
const testFrameworks = detectTestFrameworks(allDeps);
|
|
124
|
+
return {
|
|
125
|
+
name,
|
|
126
|
+
languages,
|
|
127
|
+
frameworks,
|
|
128
|
+
buildTools,
|
|
129
|
+
testFrameworks,
|
|
130
|
+
packageManager: detectPackageManager(root),
|
|
131
|
+
scripts,
|
|
132
|
+
hasTypeScript,
|
|
133
|
+
hasPython,
|
|
134
|
+
isMonorepo,
|
|
135
|
+
directories: getTopLevelDirs(root)
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
var FORMAT_LABELS = {
|
|
139
|
+
"agents-md": "AGENTS.md (open standard - Codex, Devin, Jules, 40+ tools)",
|
|
140
|
+
"claude-md": "CLAUDE.md (Claude Code)",
|
|
141
|
+
"cursor-mdc": ".cursor/rules/ (Cursor IDE - modern .mdc format)",
|
|
142
|
+
"copilot-md": "copilot-instructions.md (GitHub Copilot)",
|
|
143
|
+
windsurfrules: ".windsurfrules (Windsurf / Codeium)",
|
|
144
|
+
clinerules: ".clinerules (Cline)"
|
|
145
|
+
};
|
|
146
|
+
var ALL_FORMATS = [
|
|
147
|
+
"agents-md",
|
|
148
|
+
"claude-md",
|
|
149
|
+
"cursor-mdc",
|
|
150
|
+
"copilot-md",
|
|
151
|
+
"windsurfrules",
|
|
152
|
+
"clinerules"
|
|
153
|
+
];
|
|
154
|
+
function ask(rl, question) {
|
|
155
|
+
return new Promise((resolve3) => rl.question(question, resolve3));
|
|
156
|
+
}
|
|
157
|
+
async function promptUser(stack) {
|
|
158
|
+
const rl = createInterface({
|
|
159
|
+
input: process.stdin,
|
|
160
|
+
output: process.stdout
|
|
161
|
+
});
|
|
162
|
+
try {
|
|
163
|
+
const defaultName = stack.name || "my-project";
|
|
164
|
+
const nameAnswer = await ask(rl, `
|
|
165
|
+
Project name (${defaultName}): `);
|
|
166
|
+
const projectName = nameAnswer.trim() || defaultName;
|
|
167
|
+
console.log("\n Which config files should I generate?\n");
|
|
168
|
+
ALL_FORMATS.forEach((fmt, i) => {
|
|
169
|
+
console.log(` ${i + 1}. ${FORMAT_LABELS[fmt]}`);
|
|
170
|
+
});
|
|
171
|
+
console.log(` a. All of the above`);
|
|
172
|
+
const formatAnswer = await ask(
|
|
173
|
+
rl,
|
|
174
|
+
`
|
|
175
|
+
Pick formats (comma-separated numbers, or 'a' for all) [a]: `
|
|
176
|
+
);
|
|
177
|
+
let formats;
|
|
178
|
+
const trimmed = formatAnswer.trim().toLowerCase();
|
|
179
|
+
if (!trimmed || trimmed === "a" || trimmed === "all") {
|
|
180
|
+
formats = [...ALL_FORMATS];
|
|
181
|
+
} else {
|
|
182
|
+
const indices = trimmed.split(/[,\s]+/).map((s) => parseInt(s, 10) - 1).filter((n) => n >= 0 && n < ALL_FORMATS.length);
|
|
183
|
+
formats = indices.length > 0 ? [...new Set(indices.map((i) => ALL_FORMATS[i]))] : [...ALL_FORMATS];
|
|
184
|
+
}
|
|
185
|
+
return { projectName, formats };
|
|
186
|
+
} finally {
|
|
187
|
+
rl.close();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// src/templates/shared.ts
|
|
192
|
+
function stackSummary(stack) {
|
|
193
|
+
const parts = [];
|
|
194
|
+
if (stack.languages.length > 0)
|
|
195
|
+
parts.push(`Languages: ${stack.languages.join(", ")}`);
|
|
196
|
+
if (stack.frameworks.length > 0)
|
|
197
|
+
parts.push(`Frameworks: ${stack.frameworks.join(", ")}`);
|
|
198
|
+
if (stack.testFrameworks.length > 0)
|
|
199
|
+
parts.push(`Testing: ${stack.testFrameworks.join(", ")}`);
|
|
200
|
+
if (stack.buildTools.length > 0)
|
|
201
|
+
parts.push(`Build: ${stack.buildTools.join(", ")}`);
|
|
202
|
+
parts.push(`Package manager: ${stack.packageManager}`);
|
|
203
|
+
return parts.join("\n");
|
|
204
|
+
}
|
|
205
|
+
function commandsSection(stack) {
|
|
206
|
+
const lines = [];
|
|
207
|
+
const s = stack.scripts;
|
|
208
|
+
if (s.dev) lines.push(`- Dev server: \`${runner(stack)} dev\``);
|
|
209
|
+
if (s.build) lines.push(`- Build: \`${runner(stack)} build\``);
|
|
210
|
+
if (s.test) lines.push(`- Test: \`${runner(stack)} test\``);
|
|
211
|
+
if (s.lint) lines.push(`- Lint: \`${runner(stack)} lint\``);
|
|
212
|
+
if (s.typecheck) lines.push(`- Typecheck: \`${runner(stack)} typecheck\``);
|
|
213
|
+
if (s.format) lines.push(`- Format: \`${runner(stack)} format\``);
|
|
214
|
+
if (s.start) lines.push(`- Start: \`${runner(stack)} start\``);
|
|
215
|
+
return lines.length > 0 ? lines.join("\n") : "- Check package.json for available scripts";
|
|
216
|
+
}
|
|
217
|
+
function runner(stack) {
|
|
218
|
+
switch (stack.packageManager) {
|
|
219
|
+
case "pnpm":
|
|
220
|
+
return "pnpm";
|
|
221
|
+
case "yarn":
|
|
222
|
+
return "yarn";
|
|
223
|
+
case "bun":
|
|
224
|
+
return "bun run";
|
|
225
|
+
default:
|
|
226
|
+
return "npm run";
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function directorySection(stack) {
|
|
230
|
+
if (stack.directories.length === 0) return "";
|
|
231
|
+
return stack.directories.map((d) => `- \`${d}/\``).join("\n");
|
|
232
|
+
}
|
|
233
|
+
function conventionsSection(stack) {
|
|
234
|
+
const lines = [];
|
|
235
|
+
if (stack.hasTypeScript) {
|
|
236
|
+
lines.push("- Use TypeScript strict mode");
|
|
237
|
+
lines.push("- Prefer `const` over `let`, avoid `any`");
|
|
238
|
+
lines.push("- Use explicit return types on exported functions");
|
|
239
|
+
}
|
|
240
|
+
if (stack.frameworks.includes("React") || stack.frameworks.includes("Next.js")) {
|
|
241
|
+
lines.push("- Functional components only, no class components");
|
|
242
|
+
lines.push("- Use hooks for state and side effects");
|
|
243
|
+
}
|
|
244
|
+
if (stack.frameworks.includes("NestJS")) {
|
|
245
|
+
lines.push("- Follow NestJS module/controller/service pattern");
|
|
246
|
+
lines.push("- Use dependency injection");
|
|
247
|
+
}
|
|
248
|
+
if (stack.hasPython) {
|
|
249
|
+
lines.push("- Follow PEP 8 style");
|
|
250
|
+
lines.push("- Use type hints");
|
|
251
|
+
}
|
|
252
|
+
if (lines.length === 0) {
|
|
253
|
+
lines.push("- Follow existing code patterns");
|
|
254
|
+
lines.push("- Keep functions small and focused");
|
|
255
|
+
}
|
|
256
|
+
return lines.join("\n");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// src/templates/agents-md.ts
|
|
260
|
+
function generateAgentsMd(projectName, stack) {
|
|
261
|
+
const sections = [];
|
|
262
|
+
sections.push(`# ${projectName}
|
|
263
|
+
`);
|
|
264
|
+
sections.push(`## Project
|
|
265
|
+
`);
|
|
266
|
+
sections.push(stackSummary(stack));
|
|
267
|
+
if (stack.isMonorepo) {
|
|
268
|
+
sections.push(`
|
|
269
|
+
This is a monorepo.`);
|
|
270
|
+
}
|
|
271
|
+
sections.push(`
|
|
272
|
+
## Commands
|
|
273
|
+
`);
|
|
274
|
+
sections.push(commandsSection(stack));
|
|
275
|
+
const dirs = directorySection(stack);
|
|
276
|
+
if (dirs) {
|
|
277
|
+
sections.push(`
|
|
278
|
+
## Structure
|
|
279
|
+
`);
|
|
280
|
+
sections.push(dirs);
|
|
281
|
+
}
|
|
282
|
+
sections.push(`
|
|
283
|
+
## Conventions
|
|
284
|
+
`);
|
|
285
|
+
sections.push(conventionsSection(stack));
|
|
286
|
+
sections.push(`
|
|
287
|
+
## Rules
|
|
288
|
+
`);
|
|
289
|
+
sections.push(`- Do not modify generated files in \`dist/\` or \`build/\``);
|
|
290
|
+
sections.push(`- Run tests before committing`);
|
|
291
|
+
sections.push(`- Keep commits small and focused`);
|
|
292
|
+
return sections.join("\n") + "\n";
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// src/templates/claude-md.ts
|
|
296
|
+
function generateClaudeMd(projectName, stack) {
|
|
297
|
+
const sections = [];
|
|
298
|
+
sections.push(`# ${projectName}
|
|
299
|
+
`);
|
|
300
|
+
sections.push(stackSummary(stack));
|
|
301
|
+
if (stack.isMonorepo) {
|
|
302
|
+
sections.push(`
|
|
303
|
+
Monorepo project.`);
|
|
304
|
+
}
|
|
305
|
+
sections.push(`
|
|
306
|
+
## Commands
|
|
307
|
+
`);
|
|
308
|
+
sections.push(commandsSection(stack));
|
|
309
|
+
sections.push(`
|
|
310
|
+
## Conventions
|
|
311
|
+
`);
|
|
312
|
+
sections.push(conventionsSection(stack));
|
|
313
|
+
sections.push(`
|
|
314
|
+
## Important
|
|
315
|
+
`);
|
|
316
|
+
sections.push(`- Always run tests after changes`);
|
|
317
|
+
sections.push(`- Do not edit files in \`dist/\` or \`build/\``);
|
|
318
|
+
sections.push(`- Prefer editing existing files over creating new ones`);
|
|
319
|
+
return sections.join("\n") + "\n";
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// src/templates/cursor-mdc.ts
|
|
323
|
+
function generateCursorMdc(projectName, stack) {
|
|
324
|
+
const lines = [];
|
|
325
|
+
lines.push(`---`);
|
|
326
|
+
lines.push(`description: Project rules for ${projectName}`);
|
|
327
|
+
lines.push(`globs:`);
|
|
328
|
+
lines.push(`alwaysApply: true`);
|
|
329
|
+
lines.push(`---
|
|
330
|
+
`);
|
|
331
|
+
lines.push(`# ${projectName}
|
|
332
|
+
`);
|
|
333
|
+
const techParts = [];
|
|
334
|
+
if (stack.languages.length > 0) techParts.push(stack.languages.join(", "));
|
|
335
|
+
if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(", "));
|
|
336
|
+
if (techParts.length > 0) {
|
|
337
|
+
lines.push(`Stack: ${techParts.join(" + ")}
|
|
338
|
+
`);
|
|
339
|
+
}
|
|
340
|
+
lines.push(`## Commands
|
|
341
|
+
`);
|
|
342
|
+
lines.push(commandsSection(stack));
|
|
343
|
+
lines.push(`
|
|
344
|
+
## Conventions
|
|
345
|
+
`);
|
|
346
|
+
lines.push(conventionsSection(stack));
|
|
347
|
+
lines.push(`
|
|
348
|
+
## Rules
|
|
349
|
+
`);
|
|
350
|
+
lines.push(`- Do not modify generated files in \`dist/\` or \`build/\``);
|
|
351
|
+
lines.push(`- Run tests before suggesting changes are complete`);
|
|
352
|
+
lines.push(`- Prefer editing existing files over creating new ones`);
|
|
353
|
+
return lines.join("\n") + "\n";
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// src/templates/copilot-md.ts
|
|
357
|
+
function generateCopilotMd(projectName, stack) {
|
|
358
|
+
const sections = [];
|
|
359
|
+
sections.push(`# ${projectName}
|
|
360
|
+
`);
|
|
361
|
+
const techParts = [];
|
|
362
|
+
if (stack.languages.length > 0) techParts.push(stack.languages.join(", "));
|
|
363
|
+
if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(", "));
|
|
364
|
+
if (techParts.length > 0) {
|
|
365
|
+
sections.push(`Tech: ${techParts.join(", ")}
|
|
366
|
+
`);
|
|
367
|
+
}
|
|
368
|
+
sections.push(`## Commands
|
|
369
|
+
`);
|
|
370
|
+
sections.push(commandsSection(stack));
|
|
371
|
+
sections.push(`
|
|
372
|
+
## Conventions
|
|
373
|
+
`);
|
|
374
|
+
sections.push(conventionsSection(stack));
|
|
375
|
+
return sections.join("\n") + "\n";
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// src/templates/windsurf.ts
|
|
379
|
+
function generateWindsurfrules(projectName, stack) {
|
|
380
|
+
const sections = [];
|
|
381
|
+
sections.push(`# ${projectName}
|
|
382
|
+
`);
|
|
383
|
+
const techParts = [];
|
|
384
|
+
if (stack.languages.length > 0) techParts.push(stack.languages.join(", "));
|
|
385
|
+
if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(", "));
|
|
386
|
+
if (techParts.length > 0) {
|
|
387
|
+
sections.push(`Stack: ${techParts.join(" + ")}
|
|
388
|
+
`);
|
|
389
|
+
}
|
|
390
|
+
sections.push(`## Commands
|
|
391
|
+
`);
|
|
392
|
+
sections.push(commandsSection(stack));
|
|
393
|
+
sections.push(`
|
|
394
|
+
## Conventions
|
|
395
|
+
`);
|
|
396
|
+
sections.push(conventionsSection(stack));
|
|
397
|
+
sections.push(`
|
|
398
|
+
## Rules
|
|
399
|
+
`);
|
|
400
|
+
sections.push(`- Run tests before completing tasks`);
|
|
401
|
+
sections.push(`- Do not modify generated files in dist/ or build/`);
|
|
402
|
+
return sections.join("\n") + "\n";
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// src/templates/cline.ts
|
|
406
|
+
function generateClinerules(projectName, stack) {
|
|
407
|
+
const sections = [];
|
|
408
|
+
sections.push(`# ${projectName}
|
|
409
|
+
`);
|
|
410
|
+
const techParts = [];
|
|
411
|
+
if (stack.languages.length > 0) techParts.push(stack.languages.join(", "));
|
|
412
|
+
if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(", "));
|
|
413
|
+
if (techParts.length > 0) {
|
|
414
|
+
sections.push(`Stack: ${techParts.join(" + ")}
|
|
415
|
+
`);
|
|
416
|
+
}
|
|
417
|
+
sections.push(`## Commands
|
|
418
|
+
`);
|
|
419
|
+
sections.push(commandsSection(stack));
|
|
420
|
+
sections.push(`
|
|
421
|
+
## Conventions
|
|
422
|
+
`);
|
|
423
|
+
sections.push(conventionsSection(stack));
|
|
424
|
+
sections.push(`
|
|
425
|
+
## Rules
|
|
426
|
+
`);
|
|
427
|
+
sections.push(`- Run tests before completing tasks`);
|
|
428
|
+
sections.push(`- Do not modify generated files in dist/ or build/`);
|
|
429
|
+
sections.push(`- Prefer editing existing files over creating new ones`);
|
|
430
|
+
return sections.join("\n") + "\n";
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// src/generate.ts
|
|
434
|
+
function getOutputPath(format) {
|
|
435
|
+
switch (format) {
|
|
436
|
+
case "agents-md":
|
|
437
|
+
return "AGENTS.md";
|
|
438
|
+
case "claude-md":
|
|
439
|
+
return "CLAUDE.md";
|
|
440
|
+
case "cursor-mdc":
|
|
441
|
+
return ".cursor/rules/project.mdc";
|
|
442
|
+
case "copilot-md":
|
|
443
|
+
return ".github/copilot-instructions.md";
|
|
444
|
+
case "windsurfrules":
|
|
445
|
+
return ".windsurfrules";
|
|
446
|
+
case "clinerules":
|
|
447
|
+
return ".clinerules";
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
function renderTemplate(format, projectName, stack) {
|
|
451
|
+
switch (format) {
|
|
452
|
+
case "agents-md":
|
|
453
|
+
return generateAgentsMd(projectName, stack);
|
|
454
|
+
case "claude-md":
|
|
455
|
+
return generateClaudeMd(projectName, stack);
|
|
456
|
+
case "cursor-mdc":
|
|
457
|
+
return generateCursorMdc(projectName, stack);
|
|
458
|
+
case "copilot-md":
|
|
459
|
+
return generateCopilotMd(projectName, stack);
|
|
460
|
+
case "windsurfrules":
|
|
461
|
+
return generateWindsurfrules(projectName, stack);
|
|
462
|
+
case "clinerules":
|
|
463
|
+
return generateClinerules(projectName, stack);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
function generateFiles(projectName, stack, formats, rootDir) {
|
|
467
|
+
const files = [];
|
|
468
|
+
for (const format of formats) {
|
|
469
|
+
const relativePath = getOutputPath(format);
|
|
470
|
+
const fullPath = join(rootDir, relativePath);
|
|
471
|
+
const content = renderTemplate(format, projectName, stack);
|
|
472
|
+
if (existsSync(fullPath)) {
|
|
473
|
+
console.log(` \u26A0 skipped ${relativePath} (already exists)`);
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
const dir = dirname(fullPath);
|
|
477
|
+
if (!existsSync(dir)) {
|
|
478
|
+
mkdirSync(dir, { recursive: true });
|
|
479
|
+
}
|
|
480
|
+
writeFileSync(fullPath, content, "utf-8");
|
|
481
|
+
files.push({ path: relativePath, content });
|
|
482
|
+
console.log(` \u2713 ${relativePath}`);
|
|
483
|
+
}
|
|
484
|
+
return files;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// src/index.ts
|
|
488
|
+
var VERSION = "1.0.0";
|
|
489
|
+
async function main() {
|
|
490
|
+
const args = process.argv.slice(2);
|
|
491
|
+
if (args.includes("--version") || args.includes("-v")) {
|
|
492
|
+
console.log(VERSION);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
496
|
+
console.log(`
|
|
497
|
+
create-agent-config v${VERSION}
|
|
498
|
+
|
|
499
|
+
Scaffold AI agent config files for your project.
|
|
500
|
+
|
|
501
|
+
Usage:
|
|
502
|
+
npm create agent-config Interactive mode
|
|
503
|
+
npx create-agent-config Same thing
|
|
504
|
+
npx create-agent-config [dir] Target a specific directory
|
|
505
|
+
|
|
506
|
+
Options:
|
|
507
|
+
-v, --version Print version
|
|
508
|
+
-h, --help Print this help
|
|
509
|
+
`);
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
const targetDir = resolve(args[0] ?? ".");
|
|
513
|
+
console.log(`
|
|
514
|
+
create-agent-config v${VERSION}
|
|
515
|
+
`);
|
|
516
|
+
console.log(` Scanning ${targetDir}...
|
|
517
|
+
`);
|
|
518
|
+
const stack = detectStack(targetDir);
|
|
519
|
+
if (stack.languages.length > 0) {
|
|
520
|
+
console.log(` Detected: ${stack.languages.join(", ")}`);
|
|
521
|
+
}
|
|
522
|
+
if (stack.frameworks.length > 0) {
|
|
523
|
+
console.log(` Frameworks: ${stack.frameworks.join(", ")}`);
|
|
524
|
+
}
|
|
525
|
+
if (stack.testFrameworks.length > 0) {
|
|
526
|
+
console.log(` Testing: ${stack.testFrameworks.join(", ")}`);
|
|
527
|
+
}
|
|
528
|
+
const choices = await promptUser(stack);
|
|
529
|
+
console.log(`
|
|
530
|
+
Generating config files...
|
|
531
|
+
`);
|
|
532
|
+
const files = generateFiles(
|
|
533
|
+
choices.projectName,
|
|
534
|
+
stack,
|
|
535
|
+
choices.formats,
|
|
536
|
+
targetDir
|
|
537
|
+
);
|
|
538
|
+
if (files.length > 0) {
|
|
539
|
+
console.log(
|
|
540
|
+
`
|
|
541
|
+
Done. ${files.length} file${files.length === 1 ? "" : "s"} created.`
|
|
542
|
+
);
|
|
543
|
+
console.log(` Edit them to match your project's specific needs.
|
|
544
|
+
`);
|
|
545
|
+
} else {
|
|
546
|
+
console.log(`
|
|
547
|
+
No files generated (all already exist).
|
|
548
|
+
`);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
main().catch((err) => {
|
|
552
|
+
console.error(err);
|
|
553
|
+
process.exit(1);
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
export { detectStack, generateFiles };
|
|
557
|
+
//# sourceMappingURL=index.js.map
|
|
558
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/detect.ts","../src/prompt.ts","../src/templates/shared.ts","../src/templates/agents-md.ts","../src/templates/claude-md.ts","../src/templates/cursor-mdc.ts","../src/templates/copilot-md.ts","../src/templates/windsurf.ts","../src/templates/cline.ts","../src/generate.ts","../src/index.ts"],"names":["resolve","join","existsSync"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nexport interface StackInfo {\n name: string;\n languages: string[];\n frameworks: string[];\n buildTools: string[];\n testFrameworks: string[];\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | \"unknown\";\n scripts: Record<string, string>;\n hasTypeScript: boolean;\n hasPython: boolean;\n isMonorepo: boolean;\n directories: string[];\n}\n\nfunction readJsonSafe(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction fileExists(root: string, ...paths: string[]): boolean {\n return paths.some((p) => existsSync(join(root, p)));\n}\n\nfunction detectPackageManager(root: string): StackInfo[\"packageManager\"] {\n if (existsSync(join(root, \"bun.lockb\")) || existsSync(join(root, \"bun.lock\")))\n return \"bun\";\n if (existsSync(join(root, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(root, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(root, \"package-lock.json\"))) return \"npm\";\n return \"unknown\";\n}\n\nfunction detectFrameworks(\n root: string,\n deps: Record<string, unknown>,\n): string[] {\n const found: string[] = [];\n\n const checks: [string, string[] | (() => boolean)][] = [\n [\n \"Next.js\",\n () =>\n fileExists(root, \"next.config.js\", \"next.config.mjs\", \"next.config.ts\"),\n ],\n [\"Nuxt\", () => fileExists(root, \"nuxt.config.ts\", \"nuxt.config.js\")],\n [\"Remix\", [\"@remix-run/react\", \"@remix-run/node\"]],\n [\"Astro\", [\"astro\"]],\n [\"SvelteKit\", [\"@sveltejs/kit\"]],\n [\"Angular\", () => fileExists(root, \"angular.json\")],\n [\"React\", [\"react\"]],\n [\"Vue\", [\"vue\"]],\n [\"Svelte\", [\"svelte\"]],\n [\"Express\", [\"express\"]],\n [\"Fastify\", [\"fastify\"]],\n [\"NestJS\", [\"@nestjs/core\"]],\n [\"Hono\", [\"hono\"]],\n [\"Elysia\", [\"elysia\"]],\n [\"Electron\", [\"electron\"]],\n [\"Vite\", [\"vite\"]],\n [\"Webpack\", [\"webpack\"]],\n [\"Turborepo\", () => fileExists(root, \"turbo.json\")],\n [\"Nx\", () => fileExists(root, \"nx.json\")],\n [\"Django\", () => fileExists(root, \"manage.py\")],\n [\"Flask\", [\"flask\"]],\n [\"FastAPI\", [\"fastapi\"]],\n ];\n\n for (const [name, check] of checks) {\n if (typeof check === \"function\") {\n if (check()) found.push(name);\n } else {\n if (check.some((dep) => dep in deps)) found.push(name);\n }\n }\n\n return found;\n}\n\nfunction detectTestFrameworks(deps: Record<string, unknown>): string[] {\n const found: string[] = [];\n const checks: [string, string[]][] = [\n [\"Vitest\", [\"vitest\"]],\n [\"Jest\", [\"jest\"]],\n [\"Mocha\", [\"mocha\"]],\n [\"Playwright\", [\"@playwright/test\"]],\n [\"Cypress\", [\"cypress\"]],\n [\"pytest\", [\"pytest\"]],\n ];\n\n for (const [name, pkgs] of checks) {\n if (pkgs.some((dep) => dep in deps)) found.push(name);\n }\n\n return found;\n}\n\nfunction getTopLevelDirs(root: string): string[] {\n try {\n return readdirSync(root)\n .filter((f) => {\n if (\n f.startsWith(\".\") ||\n f === \"node_modules\" ||\n f === \"dist\" ||\n f === \"build\" ||\n f === \"coverage\"\n )\n return false;\n try {\n return statSync(join(root, f)).isDirectory();\n } catch {\n return false;\n }\n })\n .slice(0, 20);\n } catch {\n return [];\n }\n}\n\nexport function detectStack(rootDir?: string): StackInfo {\n const root = resolve(rootDir ?? \".\");\n const languages: string[] = [];\n const buildTools: string[] = [];\n\n const pkg = readJsonSafe(join(root, \"package.json\"));\n const allDeps: Record<string, unknown> = {\n ...((pkg?.dependencies as Record<string, unknown>) ?? {}),\n ...((pkg?.devDependencies as Record<string, unknown>) ?? {}),\n };\n\n const scripts = (pkg?.scripts as Record<string, string>) ?? {};\n const name = (pkg?.name as string) ?? \"\";\n\n const hasTypeScript = fileExists(root, \"tsconfig.json\", \"tsconfig.base.json\");\n const hasPython = fileExists(\n root,\n \"requirements.txt\",\n \"pyproject.toml\",\n \"Pipfile\",\n \"setup.py\",\n \"setup.cfg\",\n );\n const hasJs = pkg !== null || fileExists(root, \"package.json\");\n\n if (hasTypeScript) languages.push(\"TypeScript\");\n if (hasJs && !hasTypeScript) languages.push(\"JavaScript\");\n if (hasPython) languages.push(\"Python\");\n if (fileExists(root, \"Cargo.toml\")) languages.push(\"Rust\");\n if (fileExists(root, \"go.mod\")) languages.push(\"Go\");\n\n if (hasTypeScript && \"tsup\" in allDeps) buildTools.push(\"tsup\");\n if (\"esbuild\" in allDeps) buildTools.push(\"esbuild\");\n if (\"rollup\" in allDeps) buildTools.push(\"rollup\");\n\n const isMonorepo =\n fileExists(root, \"turbo.json\", \"nx.json\", \"lerna.json\") ||\n pkg?.workspaces !== undefined;\n\n const frameworks = detectFrameworks(root, allDeps);\n const testFrameworks = detectTestFrameworks(allDeps);\n\n return {\n name,\n languages,\n frameworks,\n buildTools,\n testFrameworks,\n packageManager: detectPackageManager(root),\n scripts,\n hasTypeScript,\n hasPython,\n isMonorepo,\n directories: getTopLevelDirs(root),\n };\n}\n","import { createInterface } from \"node:readline\";\nimport type { StackInfo } from \"./detect.js\";\n\nexport type OutputFormat =\n | \"agents-md\"\n | \"claude-md\"\n | \"cursor-mdc\"\n | \"copilot-md\"\n | \"windsurfrules\"\n | \"clinerules\";\n\nexport interface UserChoices {\n projectName: string;\n formats: OutputFormat[];\n}\n\nconst FORMAT_LABELS: Record<OutputFormat, string> = {\n \"agents-md\":\n \"AGENTS.md (open standard - Codex, Devin, Jules, 40+ tools)\",\n \"claude-md\": \"CLAUDE.md (Claude Code)\",\n \"cursor-mdc\": \".cursor/rules/ (Cursor IDE - modern .mdc format)\",\n \"copilot-md\": \"copilot-instructions.md (GitHub Copilot)\",\n windsurfrules: \".windsurfrules (Windsurf / Codeium)\",\n clinerules: \".clinerules (Cline)\",\n};\n\nconst ALL_FORMATS: OutputFormat[] = [\n \"agents-md\",\n \"claude-md\",\n \"cursor-mdc\",\n \"copilot-md\",\n \"windsurfrules\",\n \"clinerules\",\n];\n\nfunction ask(\n rl: ReturnType<typeof createInterface>,\n question: string,\n): Promise<string> {\n return new Promise((resolve) => rl.question(question, resolve));\n}\n\nexport async function promptUser(stack: StackInfo): Promise<UserChoices> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const defaultName = stack.name || \"my-project\";\n const nameAnswer = await ask(rl, `\\n Project name (${defaultName}): `);\n const projectName = nameAnswer.trim() || defaultName;\n\n console.log(\"\\n Which config files should I generate?\\n\");\n\n ALL_FORMATS.forEach((fmt, i) => {\n console.log(` ${i + 1}. ${FORMAT_LABELS[fmt]}`);\n });\n\n console.log(` a. All of the above`);\n\n const formatAnswer = await ask(\n rl,\n `\\n Pick formats (comma-separated numbers, or 'a' for all) [a]: `,\n );\n\n let formats: OutputFormat[];\n const trimmed = formatAnswer.trim().toLowerCase();\n\n if (!trimmed || trimmed === \"a\" || trimmed === \"all\") {\n formats = [...ALL_FORMATS];\n } else {\n const indices = trimmed\n .split(/[,\\s]+/)\n .map((s) => parseInt(s, 10) - 1)\n .filter((n) => n >= 0 && n < ALL_FORMATS.length);\n formats =\n indices.length > 0\n ? [...new Set(indices.map((i) => ALL_FORMATS[i] as OutputFormat))]\n : [...ALL_FORMATS];\n }\n\n return { projectName, formats };\n } finally {\n rl.close();\n }\n}\n","import type { StackInfo } from \"../detect.js\";\n\nexport function stackSummary(stack: StackInfo): string {\n const parts: string[] = [];\n if (stack.languages.length > 0)\n parts.push(`Languages: ${stack.languages.join(\", \")}`);\n if (stack.frameworks.length > 0)\n parts.push(`Frameworks: ${stack.frameworks.join(\", \")}`);\n if (stack.testFrameworks.length > 0)\n parts.push(`Testing: ${stack.testFrameworks.join(\", \")}`);\n if (stack.buildTools.length > 0)\n parts.push(`Build: ${stack.buildTools.join(\", \")}`);\n parts.push(`Package manager: ${stack.packageManager}`);\n return parts.join(\"\\n\");\n}\n\nexport function commandsSection(stack: StackInfo): string {\n const lines: string[] = [];\n const s = stack.scripts;\n if (s.dev) lines.push(`- Dev server: \\`${runner(stack)} dev\\``);\n if (s.build) lines.push(`- Build: \\`${runner(stack)} build\\``);\n if (s.test) lines.push(`- Test: \\`${runner(stack)} test\\``);\n if (s.lint) lines.push(`- Lint: \\`${runner(stack)} lint\\``);\n if (s.typecheck) lines.push(`- Typecheck: \\`${runner(stack)} typecheck\\``);\n if (s.format) lines.push(`- Format: \\`${runner(stack)} format\\``);\n if (s.start) lines.push(`- Start: \\`${runner(stack)} start\\``);\n return lines.length > 0\n ? lines.join(\"\\n\")\n : \"- Check package.json for available scripts\";\n}\n\nfunction runner(stack: StackInfo): string {\n switch (stack.packageManager) {\n case \"pnpm\":\n return \"pnpm\";\n case \"yarn\":\n return \"yarn\";\n case \"bun\":\n return \"bun run\";\n default:\n return \"npm run\";\n }\n}\n\nexport function directorySection(stack: StackInfo): string {\n if (stack.directories.length === 0) return \"\";\n return stack.directories.map((d) => `- \\`${d}/\\``).join(\"\\n\");\n}\n\nexport function conventionsSection(stack: StackInfo): string {\n const lines: string[] = [];\n if (stack.hasTypeScript) {\n lines.push(\"- Use TypeScript strict mode\");\n lines.push(\"- Prefer `const` over `let`, avoid `any`\");\n lines.push(\"- Use explicit return types on exported functions\");\n }\n if (\n stack.frameworks.includes(\"React\") ||\n stack.frameworks.includes(\"Next.js\")\n ) {\n lines.push(\"- Functional components only, no class components\");\n lines.push(\"- Use hooks for state and side effects\");\n }\n if (stack.frameworks.includes(\"NestJS\")) {\n lines.push(\"- Follow NestJS module/controller/service pattern\");\n lines.push(\"- Use dependency injection\");\n }\n if (stack.hasPython) {\n lines.push(\"- Follow PEP 8 style\");\n lines.push(\"- Use type hints\");\n }\n if (lines.length === 0) {\n lines.push(\"- Follow existing code patterns\");\n lines.push(\"- Keep functions small and focused\");\n }\n return lines.join(\"\\n\");\n}\n","import type { StackInfo } from \"../detect.js\";\nimport {\n stackSummary,\n commandsSection,\n directorySection,\n conventionsSection,\n} from \"./shared.js\";\n\nexport function generateAgentsMd(\n projectName: string,\n stack: StackInfo,\n): string {\n const sections: string[] = [];\n\n sections.push(`# ${projectName}\\n`);\n sections.push(`## Project\\n`);\n sections.push(stackSummary(stack));\n\n if (stack.isMonorepo) {\n sections.push(`\\nThis is a monorepo.`);\n }\n\n sections.push(`\\n## Commands\\n`);\n sections.push(commandsSection(stack));\n\n const dirs = directorySection(stack);\n if (dirs) {\n sections.push(`\\n## Structure\\n`);\n sections.push(dirs);\n }\n\n sections.push(`\\n## Conventions\\n`);\n sections.push(conventionsSection(stack));\n\n sections.push(`\\n## Rules\\n`);\n sections.push(`- Do not modify generated files in \\`dist/\\` or \\`build/\\``);\n sections.push(`- Run tests before committing`);\n sections.push(`- Keep commits small and focused`);\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { StackInfo } from \"../detect.js\";\nimport { stackSummary, commandsSection, conventionsSection } from \"./shared.js\";\n\nexport function generateClaudeMd(\n projectName: string,\n stack: StackInfo,\n): string {\n const sections: string[] = [];\n\n sections.push(`# ${projectName}\\n`);\n sections.push(stackSummary(stack));\n\n if (stack.isMonorepo) {\n sections.push(`\\nMonorepo project.`);\n }\n\n sections.push(`\\n## Commands\\n`);\n sections.push(commandsSection(stack));\n\n sections.push(`\\n## Conventions\\n`);\n sections.push(conventionsSection(stack));\n\n sections.push(`\\n## Important\\n`);\n sections.push(`- Always run tests after changes`);\n sections.push(`- Do not edit files in \\`dist/\\` or \\`build/\\``);\n sections.push(`- Prefer editing existing files over creating new ones`);\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { StackInfo } from \"../detect.js\";\nimport { commandsSection, conventionsSection } from \"./shared.js\";\n\nexport function generateCursorMdc(\n projectName: string,\n stack: StackInfo,\n): string {\n const lines: string[] = [];\n\n lines.push(`---`);\n lines.push(`description: Project rules for ${projectName}`);\n lines.push(`globs:`);\n lines.push(`alwaysApply: true`);\n lines.push(`---\\n`);\n\n lines.push(`# ${projectName}\\n`);\n\n const techParts: string[] = [];\n if (stack.languages.length > 0) techParts.push(stack.languages.join(\", \"));\n if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(\", \"));\n if (techParts.length > 0) {\n lines.push(`Stack: ${techParts.join(\" + \")}\\n`);\n }\n\n lines.push(`## Commands\\n`);\n lines.push(commandsSection(stack));\n\n lines.push(`\\n## Conventions\\n`);\n lines.push(conventionsSection(stack));\n\n lines.push(`\\n## Rules\\n`);\n lines.push(`- Do not modify generated files in \\`dist/\\` or \\`build/\\``);\n lines.push(`- Run tests before suggesting changes are complete`);\n lines.push(`- Prefer editing existing files over creating new ones`);\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { StackInfo } from \"../detect.js\";\nimport { commandsSection, conventionsSection } from \"./shared.js\";\n\nexport function generateCopilotMd(\n projectName: string,\n stack: StackInfo,\n): string {\n const sections: string[] = [];\n\n sections.push(`# ${projectName}\\n`);\n\n const techParts: string[] = [];\n if (stack.languages.length > 0) techParts.push(stack.languages.join(\", \"));\n if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(\", \"));\n if (techParts.length > 0) {\n sections.push(`Tech: ${techParts.join(\", \")}\\n`);\n }\n\n sections.push(`## Commands\\n`);\n sections.push(commandsSection(stack));\n\n sections.push(`\\n## Conventions\\n`);\n sections.push(conventionsSection(stack));\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { StackInfo } from \"../detect.js\";\nimport { commandsSection, conventionsSection } from \"./shared.js\";\n\nexport function generateWindsurfrules(\n projectName: string,\n stack: StackInfo,\n): string {\n const sections: string[] = [];\n\n sections.push(`# ${projectName}\\n`);\n\n const techParts: string[] = [];\n if (stack.languages.length > 0) techParts.push(stack.languages.join(\", \"));\n if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(\", \"));\n if (techParts.length > 0) {\n sections.push(`Stack: ${techParts.join(\" + \")}\\n`);\n }\n\n sections.push(`## Commands\\n`);\n sections.push(commandsSection(stack));\n\n sections.push(`\\n## Conventions\\n`);\n sections.push(conventionsSection(stack));\n\n sections.push(`\\n## Rules\\n`);\n sections.push(`- Run tests before completing tasks`);\n sections.push(`- Do not modify generated files in dist/ or build/`);\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { StackInfo } from \"../detect.js\";\nimport { commandsSection, conventionsSection } from \"./shared.js\";\n\nexport function generateClinerules(\n projectName: string,\n stack: StackInfo,\n): string {\n const sections: string[] = [];\n\n sections.push(`# ${projectName}\\n`);\n\n const techParts: string[] = [];\n if (stack.languages.length > 0) techParts.push(stack.languages.join(\", \"));\n if (stack.frameworks.length > 0) techParts.push(stack.frameworks.join(\", \"));\n if (techParts.length > 0) {\n sections.push(`Stack: ${techParts.join(\" + \")}\\n`);\n }\n\n sections.push(`## Commands\\n`);\n sections.push(commandsSection(stack));\n\n sections.push(`\\n## Conventions\\n`);\n sections.push(conventionsSection(stack));\n\n sections.push(`\\n## Rules\\n`);\n sections.push(`- Run tests before completing tasks`);\n sections.push(`- Do not modify generated files in dist/ or build/`);\n sections.push(`- Prefer editing existing files over creating new ones`);\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { StackInfo } from \"./detect.js\";\nimport type { OutputFormat } from \"./prompt.js\";\nimport { generateAgentsMd } from \"./templates/agents-md.js\";\nimport { generateClaudeMd } from \"./templates/claude-md.js\";\nimport { generateCursorMdc } from \"./templates/cursor-mdc.js\";\nimport { generateCopilotMd } from \"./templates/copilot-md.js\";\nimport { generateWindsurfrules } from \"./templates/windsurf.js\";\nimport { generateClinerules } from \"./templates/cline.js\";\n\ninterface GeneratedFile {\n path: string;\n content: string;\n}\n\nfunction getOutputPath(format: OutputFormat): string {\n switch (format) {\n case \"agents-md\":\n return \"AGENTS.md\";\n case \"claude-md\":\n return \"CLAUDE.md\";\n case \"cursor-mdc\":\n return \".cursor/rules/project.mdc\";\n case \"copilot-md\":\n return \".github/copilot-instructions.md\";\n case \"windsurfrules\":\n return \".windsurfrules\";\n case \"clinerules\":\n return \".clinerules\";\n }\n}\n\nfunction renderTemplate(\n format: OutputFormat,\n projectName: string,\n stack: StackInfo,\n): string {\n switch (format) {\n case \"agents-md\":\n return generateAgentsMd(projectName, stack);\n case \"claude-md\":\n return generateClaudeMd(projectName, stack);\n case \"cursor-mdc\":\n return generateCursorMdc(projectName, stack);\n case \"copilot-md\":\n return generateCopilotMd(projectName, stack);\n case \"windsurfrules\":\n return generateWindsurfrules(projectName, stack);\n case \"clinerules\":\n return generateClinerules(projectName, stack);\n }\n}\n\nexport function generateFiles(\n projectName: string,\n stack: StackInfo,\n formats: OutputFormat[],\n rootDir: string,\n): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n for (const format of formats) {\n const relativePath = getOutputPath(format);\n const fullPath = join(rootDir, relativePath);\n const content = renderTemplate(format, projectName, stack);\n\n if (existsSync(fullPath)) {\n console.log(` ⚠ skipped ${relativePath} (already exists)`);\n continue;\n }\n\n const dir = dirname(fullPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(fullPath, content, \"utf-8\");\n files.push({ path: relativePath, content });\n console.log(` ✓ ${relativePath}`);\n }\n\n return files;\n}\n","import { resolve } from \"node:path\";\nimport { detectStack } from \"./detect.js\";\nimport { promptUser } from \"./prompt.js\";\nimport { generateFiles } from \"./generate.js\";\n\nconst VERSION = \"1.0.0\";\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(VERSION);\n return;\n }\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`\n create-agent-config v${VERSION}\n\n Scaffold AI agent config files for your project.\n\n Usage:\n npm create agent-config Interactive mode\n npx create-agent-config Same thing\n npx create-agent-config [dir] Target a specific directory\n\n Options:\n -v, --version Print version\n -h, --help Print this help\n`);\n return;\n }\n\n const targetDir = resolve(args[0] ?? \".\");\n\n console.log(`\\n create-agent-config v${VERSION}\\n`);\n console.log(` Scanning ${targetDir}...\\n`);\n\n const stack = detectStack(targetDir);\n\n if (stack.languages.length > 0) {\n console.log(` Detected: ${stack.languages.join(\", \")}`);\n }\n if (stack.frameworks.length > 0) {\n console.log(` Frameworks: ${stack.frameworks.join(\", \")}`);\n }\n if (stack.testFrameworks.length > 0) {\n console.log(` Testing: ${stack.testFrameworks.join(\", \")}`);\n }\n\n const choices = await promptUser(stack);\n\n console.log(`\\n Generating config files...\\n`);\n\n const files = generateFiles(\n choices.projectName,\n stack,\n choices.formats,\n targetDir,\n );\n\n if (files.length > 0) {\n console.log(\n `\\n Done. ${files.length} file${files.length === 1 ? \"\" : \"s\"} created.`,\n );\n console.log(` Edit them to match your project's specific needs.\\n`);\n } else {\n console.log(`\\n No files generated (all already exist).\\n`);\n }\n}\n\nmain().catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\n\nexport { detectStack } from \"./detect.js\";\nexport type { StackInfo } from \"./detect.js\";\nexport type { OutputFormat, UserChoices } from \"./prompt.js\";\nexport { generateFiles } from \"./generate.js\";\n"]}
|