@horiastanxd/claude-init 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.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/analyzer/code-patterns.d.ts +2 -0
  4. package/dist/analyzer/code-patterns.js +71 -0
  5. package/dist/analyzer/code-patterns.js.map +1 -0
  6. package/dist/analyzer/commands.d.ts +2 -0
  7. package/dist/analyzer/commands.js +86 -0
  8. package/dist/analyzer/commands.js.map +1 -0
  9. package/dist/analyzer/env-vars.d.ts +3 -0
  10. package/dist/analyzer/env-vars.js +42 -0
  11. package/dist/analyzer/env-vars.js.map +1 -0
  12. package/dist/analyzer/git-history.d.ts +2 -0
  13. package/dist/analyzer/git-history.js +41 -0
  14. package/dist/analyzer/git-history.js.map +1 -0
  15. package/dist/analyzer/index.d.ts +3 -0
  16. package/dist/analyzer/index.js +44 -0
  17. package/dist/analyzer/index.js.map +1 -0
  18. package/dist/analyzer/project-structure.d.ts +2 -0
  19. package/dist/analyzer/project-structure.js +95 -0
  20. package/dist/analyzer/project-structure.js.map +1 -0
  21. package/dist/analyzer/tech-stack.d.ts +2 -0
  22. package/dist/analyzer/tech-stack.js +141 -0
  23. package/dist/analyzer/tech-stack.js.map +1 -0
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +129 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/generators/agents-md.d.ts +6 -0
  28. package/dist/generators/agents-md.js +12 -0
  29. package/dist/generators/agents-md.js.map +1 -0
  30. package/dist/generators/claude-md.d.ts +2 -0
  31. package/dist/generators/claude-md.js +5 -0
  32. package/dist/generators/claude-md.js.map +1 -0
  33. package/dist/generators/copilot-instructions.d.ts +2 -0
  34. package/dist/generators/copilot-instructions.js +5 -0
  35. package/dist/generators/copilot-instructions.js.map +1 -0
  36. package/dist/generators/cursor-rules.d.ts +2 -0
  37. package/dist/generators/cursor-rules.js +5 -0
  38. package/dist/generators/cursor-rules.js.map +1 -0
  39. package/dist/generators/gemini-md.d.ts +2 -0
  40. package/dist/generators/gemini-md.js +5 -0
  41. package/dist/generators/gemini-md.js.map +1 -0
  42. package/dist/generators/index.d.ts +11 -0
  43. package/dist/generators/index.js +43 -0
  44. package/dist/generators/index.js.map +1 -0
  45. package/dist/generators/registry.d.ts +21 -0
  46. package/dist/generators/registry.js +108 -0
  47. package/dist/generators/registry.js.map +1 -0
  48. package/dist/generators/render.d.ts +19 -0
  49. package/dist/generators/render.js +58 -0
  50. package/dist/generators/render.js.map +1 -0
  51. package/dist/generators/sections.d.ts +9 -0
  52. package/dist/generators/sections.js +96 -0
  53. package/dist/generators/sections.js.map +1 -0
  54. package/dist/index.d.ts +12 -0
  55. package/dist/index.js +11 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp-server.d.ts +1 -0
  58. package/dist/mcp-server.js +98 -0
  59. package/dist/mcp-server.js.map +1 -0
  60. package/dist/types.d.ts +84 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/utils.d.ts +5 -0
  64. package/dist/utils.js +53 -0
  65. package/dist/utils.js.map +1 -0
  66. package/dist/version.d.ts +2 -0
  67. package/dist/version.js +13 -0
  68. package/dist/version.js.map +1 -0
  69. package/package.json +79 -0
@@ -0,0 +1,95 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { isDir, pathExists } from '../utils.js';
4
+ const IGNORE = new Set([
5
+ 'node_modules',
6
+ '.git',
7
+ 'dist',
8
+ 'build',
9
+ '.next',
10
+ '__pycache__',
11
+ 'target',
12
+ '.cargo',
13
+ 'vendor',
14
+ 'coverage',
15
+ '.turbo',
16
+ '.cache',
17
+ '.venv',
18
+ 'venv',
19
+ ]);
20
+ const ENTRY_CANDIDATES = [
21
+ 'src/index.ts',
22
+ 'src/main.ts',
23
+ 'src/app.ts',
24
+ 'src/cli.ts',
25
+ 'index.ts',
26
+ 'main.ts',
27
+ 'app.ts',
28
+ 'src/index.js',
29
+ 'index.js',
30
+ 'main.py',
31
+ 'app.py',
32
+ 'src/main.rs',
33
+ 'main.go',
34
+ 'cmd/main.go',
35
+ ];
36
+ const CONFIG_CANDIDATES = [
37
+ '.env.example',
38
+ '.env.sample',
39
+ 'tsconfig.json',
40
+ 'vite.config.ts',
41
+ 'vitest.config.ts',
42
+ 'docker-compose.yml',
43
+ 'Dockerfile',
44
+ 'Makefile',
45
+ ];
46
+ export async function analyzeStructure(projectDir, extraIgnore = []) {
47
+ const ignore = new Set([...IGNORE, ...extraIgnore]);
48
+ const [tree, entryPoints, configFiles, srcDir, testDir] = await Promise.all([
49
+ buildTree(projectDir, 0, 2, ignore),
50
+ findExisting(projectDir, ENTRY_CANDIDATES),
51
+ findExisting(projectDir, CONFIG_CANDIDATES),
52
+ (async () => ((await isDir(join(projectDir, 'src'))) ? 'src' : null))(),
53
+ detectTestDir(projectDir),
54
+ ]);
55
+ return { tree, entryPoints, configFiles, srcDir, testDir };
56
+ }
57
+ async function buildTree(dir, depth, maxDepth, ignore) {
58
+ if (depth > maxDepth)
59
+ return '';
60
+ const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
61
+ const sorted = entries
62
+ .filter((e) => !ignore.has(e.name) && !e.name.startsWith('.'))
63
+ .sort((a, b) => {
64
+ if (a.isDirectory() !== b.isDirectory())
65
+ return a.isDirectory() ? -1 : 1;
66
+ return a.name.localeCompare(b.name);
67
+ })
68
+ .slice(0, 25);
69
+ const lines = [];
70
+ for (const entry of sorted) {
71
+ const prefix = ' '.repeat(depth);
72
+ if (entry.isDirectory()) {
73
+ lines.push(`${prefix}${entry.name}/`);
74
+ const sub = await buildTree(join(dir, entry.name), depth + 1, maxDepth, ignore);
75
+ if (sub)
76
+ lines.push(sub);
77
+ }
78
+ else {
79
+ lines.push(`${prefix}${entry.name}`);
80
+ }
81
+ }
82
+ return lines.join('\n');
83
+ }
84
+ async function findExisting(dir, candidates) {
85
+ const checks = await Promise.all(candidates.map(async (c) => ((await pathExists(join(dir, c))) ? c : null)));
86
+ return checks.filter((c) => c !== null);
87
+ }
88
+ async function detectTestDir(dir) {
89
+ for (const candidate of ['tests', 'test', '__tests__', 'spec', 'e2e']) {
90
+ if (await isDir(join(dir, candidate)))
91
+ return candidate;
92
+ }
93
+ return null;
94
+ }
95
+ //# sourceMappingURL=project-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-structure.js","sourceRoot":"","sources":["../../src/analyzer/project-structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { TechStack } from '../types.js';
2
+ export declare function detectTechStack(projectDir: string): Promise<TechStack>;
@@ -0,0 +1,141 @@
1
+ import { join } from 'node:path';
2
+ import { pathExists, readJson, readText, detectPackageManager } from '../utils.js';
3
+ const EMPTY = {
4
+ language: 'unknown',
5
+ framework: null,
6
+ runtime: null,
7
+ packageManager: 'unknown',
8
+ database: null,
9
+ testing: null,
10
+ buildTool: null,
11
+ extraLibraries: [],
12
+ };
13
+ export async function detectTechStack(projectDir) {
14
+ const manifest = [
15
+ ['package.json', parsePackageJson],
16
+ ['Cargo.toml', parseCargoToml],
17
+ ['go.mod', parseGoMod],
18
+ ['pyproject.toml', parsePyproject],
19
+ ['requirements.txt', async () => ({ language: 'Python', packageManager: 'pip' })],
20
+ ['pom.xml', async () => ({ language: 'Java', packageManager: 'maven' })],
21
+ ['build.gradle', async () => ({ language: 'Java/Kotlin', packageManager: 'gradle' })],
22
+ ['Gemfile', async () => ({ language: 'Ruby', packageManager: 'bundler' })],
23
+ ['composer.json', async () => ({ language: 'PHP', packageManager: 'composer' })],
24
+ ];
25
+ for (const [file, parser] of manifest) {
26
+ if (await pathExists(join(projectDir, file))) {
27
+ return { ...EMPTY, ...(await parser(projectDir)) };
28
+ }
29
+ }
30
+ return { ...EMPTY };
31
+ }
32
+ async function parsePackageJson(dir) {
33
+ const pkg = await readJson(join(dir, 'package.json'));
34
+ if (!pkg)
35
+ return {};
36
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
37
+ const has = (name) => name in deps;
38
+ const result = {
39
+ language: has('typescript') || has('ts-node') || has('tsx') ? 'TypeScript' : 'JavaScript',
40
+ packageManager: await detectPackageManager(dir),
41
+ runtime: has('bun') ? 'Bun' : 'Node.js',
42
+ };
43
+ if (has('next'))
44
+ result.framework = 'Next.js';
45
+ else if (has('@remix-run/node') || has('@remix-run/react'))
46
+ result.framework = 'Remix';
47
+ else if (has('@nestjs/core'))
48
+ result.framework = 'NestJS';
49
+ else if (has('express'))
50
+ result.framework = 'Express';
51
+ else if (has('fastify'))
52
+ result.framework = 'Fastify';
53
+ else if (has('hono'))
54
+ result.framework = 'Hono';
55
+ else if (has('@sveltejs/kit'))
56
+ result.framework = 'SvelteKit';
57
+ else if (has('nuxt'))
58
+ result.framework = 'Nuxt';
59
+ else if (has('vue'))
60
+ result.framework = 'Vue';
61
+ else if (has('svelte'))
62
+ result.framework = 'Svelte';
63
+ else if (has('react'))
64
+ result.framework = 'React';
65
+ if (has('@prisma/client') || has('prisma'))
66
+ result.database = 'Prisma ORM';
67
+ else if (has('drizzle-orm'))
68
+ result.database = 'Drizzle ORM';
69
+ else if (has('mongoose'))
70
+ result.database = 'MongoDB/Mongoose';
71
+ else if (has('pg') || has('postgres'))
72
+ result.database = 'PostgreSQL';
73
+ else if (has('mysql2'))
74
+ result.database = 'MySQL';
75
+ if (has('vitest'))
76
+ result.testing = 'Vitest';
77
+ else if (has('jest'))
78
+ result.testing = 'Jest';
79
+ else if (has('@playwright/test'))
80
+ result.testing = 'Playwright';
81
+ else if (has('mocha'))
82
+ result.testing = 'Mocha';
83
+ if (has('vite'))
84
+ result.buildTool = 'Vite';
85
+ else if (has('turbo'))
86
+ result.buildTool = 'Turborepo';
87
+ else if (has('esbuild'))
88
+ result.buildTool = 'esbuild';
89
+ else if (has('webpack'))
90
+ result.buildTool = 'webpack';
91
+ const notable = ['zod', 'tailwindcss', 'trpc', '@tanstack/react-query', 'redux', 'zustand', 'graphql'];
92
+ result.extraLibraries = notable.filter(has);
93
+ return result;
94
+ }
95
+ async function parseCargoToml(dir) {
96
+ const content = (await readText(join(dir, 'Cargo.toml'))) ?? '';
97
+ return {
98
+ language: 'Rust',
99
+ packageManager: 'cargo',
100
+ runtime: content.includes('tokio') ? 'Tokio (async)' : 'sync',
101
+ framework: content.includes('axum')
102
+ ? 'Axum'
103
+ : content.includes('actix-web')
104
+ ? 'Actix Web'
105
+ : content.includes('rocket')
106
+ ? 'Rocket'
107
+ : null,
108
+ };
109
+ }
110
+ async function parseGoMod(dir) {
111
+ const content = (await readText(join(dir, 'go.mod'))) ?? '';
112
+ return {
113
+ language: 'Go',
114
+ packageManager: 'go modules',
115
+ framework: content.includes('gin-gonic/gin')
116
+ ? 'Gin'
117
+ : content.includes('gofiber/fiber')
118
+ ? 'Fiber'
119
+ : content.includes('labstack/echo')
120
+ ? 'Echo'
121
+ : null,
122
+ };
123
+ }
124
+ async function parsePyproject(dir) {
125
+ const content = (await readText(join(dir, 'pyproject.toml'))) ?? '';
126
+ const hasUv = content.includes('[tool.uv]') || (await pathExists(join(dir, 'uv.lock')));
127
+ const hasPoetry = content.includes('[tool.poetry]');
128
+ return {
129
+ language: 'Python',
130
+ packageManager: hasUv ? 'uv' : hasPoetry ? 'poetry' : 'pip',
131
+ framework: content.includes('fastapi')
132
+ ? 'FastAPI'
133
+ : content.includes('django')
134
+ ? 'Django'
135
+ : content.includes('flask')
136
+ ? 'Flask'
137
+ : null,
138
+ testing: content.includes('pytest') ? 'pytest' : null,
139
+ };
140
+ }
141
+ //# sourceMappingURL=tech-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/analyzer/tech-stack.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { resolve } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { analyzeProject } from './analyzer/index.js';
7
+ import { generateAll, checkAll } from './generators/index.js';
8
+ import { TARGETS, TARGET_IDS, invalidTargets } from './generators/registry.js';
9
+ import { getVersion } from './version.js';
10
+ function parseTargets(raw) {
11
+ const parts = raw
12
+ .split(',')
13
+ .map((t) => t.trim().toLowerCase())
14
+ .filter(Boolean);
15
+ const bad = invalidTargets(parts);
16
+ if (bad.length) {
17
+ throw new Error(`Unknown target(s): ${bad.join(', ')}. Valid: ${TARGET_IDS.join(', ')}, all`);
18
+ }
19
+ return parts;
20
+ }
21
+ async function runGenerate(dir, opts) {
22
+ const projectDir = resolve(dir ?? '.');
23
+ const targets = parseTargets(opts.targets);
24
+ const spinner = ora(`Analyzing ${projectDir}`).start();
25
+ let analysis;
26
+ try {
27
+ analysis = await analyzeProject(projectDir);
28
+ }
29
+ catch (err) {
30
+ spinner.fail(`Analysis failed: ${err.message}`);
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ spinner.succeed(`Analyzed ${chalk.bold(analysis.name)} ` +
35
+ chalk.dim(`(${analysis.techStack.language}${analysis.techStack.framework ? `, ${analysis.techStack.framework}` : ''})`));
36
+ if (opts.dryRun) {
37
+ console.log(JSON.stringify(analysis, null, 2));
38
+ return;
39
+ }
40
+ const { written, skipped } = await generateAll(analysis, {
41
+ outputDir: resolve(opts.output),
42
+ targets,
43
+ overwrite: opts.overwrite,
44
+ minimal: false,
45
+ });
46
+ for (const f of written)
47
+ console.log(chalk.green(' +'), f);
48
+ for (const f of skipped) {
49
+ console.log(chalk.yellow(' -'), `${f} ${chalk.dim('(exists, use --overwrite)')}`);
50
+ }
51
+ if (!written.length && skipped.length) {
52
+ console.log(chalk.yellow('\nNothing written. Re-run with --overwrite to replace existing files.'));
53
+ }
54
+ else {
55
+ console.log(chalk.bold(`\nDone. ${written.length} file(s) generated.`));
56
+ }
57
+ }
58
+ async function runCheck(dir, opts) {
59
+ const projectDir = resolve(dir ?? '.');
60
+ const targets = parseTargets(opts.targets);
61
+ const analysis = await analyzeProject(projectDir);
62
+ const { entries, drifted } = await checkAll(analysis, resolve(opts.output), targets);
63
+ for (const e of entries) {
64
+ const mark = e.status === 'ok'
65
+ ? chalk.green(' ok ')
66
+ : e.status === 'stale'
67
+ ? chalk.yellow(' stale ')
68
+ : chalk.red(' missing');
69
+ console.log(mark, e.path);
70
+ }
71
+ if (drifted) {
72
+ console.log(chalk.red('\nContext files are out of date. Run `claude-init --overwrite` to refresh.'));
73
+ process.exitCode = 1;
74
+ }
75
+ else {
76
+ console.log(chalk.green('\nAll context files are up to date.'));
77
+ }
78
+ }
79
+ function runList() {
80
+ console.log(chalk.bold('Supported targets:\n'));
81
+ const width = Math.max(...TARGETS.map((t) => t.id.length));
82
+ for (const t of TARGETS) {
83
+ console.log(` ${chalk.cyan(t.id.padEnd(width))} ${t.files.map((f) => f.path).join(', ')}`);
84
+ console.log(` ${' '.repeat(width)} ${chalk.dim(t.tools)}`);
85
+ }
86
+ }
87
+ async function main() {
88
+ if (process.argv.includes('--mcp')) {
89
+ const { startMcpServer } = await import('./mcp-server.js');
90
+ await startMcpServer();
91
+ return;
92
+ }
93
+ const program = new Command();
94
+ program
95
+ .name('claude-init')
96
+ .description('Auto-generate AI context files (CLAUDE.md, AGENTS.md, .cursor/rules, GEMINI.md, Copilot, and more)')
97
+ .version(getVersion());
98
+ program
99
+ .command('generate', { isDefault: true })
100
+ .alias('g')
101
+ .description('Analyze a repository and generate AI context files')
102
+ .argument('[dir]', 'project directory', '.')
103
+ .option('-t, --targets <list>', `comma-separated (${TARGET_IDS.join(',')},all)`, 'all')
104
+ .option('-o, --output <dir>', 'output directory', '.')
105
+ .option('--overwrite', 'overwrite existing files', false)
106
+ .option('--dry-run', 'print the analysis as JSON without writing files', false)
107
+ .action(runGenerate);
108
+ program
109
+ .command('check')
110
+ .description('Verify generated files match the current repo (exit 1 on drift; for CI / pre-commit)')
111
+ .argument('[dir]', 'project directory', '.')
112
+ .option('-t, --targets <list>', `comma-separated (${TARGET_IDS.join(',')},all)`, 'all')
113
+ .option('-o, --output <dir>', 'output directory', '.')
114
+ .action(runCheck);
115
+ program.command('list').description('List supported targets and their output paths').action(runList);
116
+ program
117
+ .command('mcp')
118
+ .description('Run as an MCP server over stdio')
119
+ .action(async () => {
120
+ const { startMcpServer } = await import('./mcp-server.js');
121
+ await startMcpServer();
122
+ });
123
+ await program.parseAsync();
124
+ }
125
+ main().catch((err) => {
126
+ console.error(chalk.red(`Error: ${err.message}`));
127
+ process.exit(1);
128
+ });
129
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ProjectAnalysis } from '../types.js';
2
+ /**
3
+ * AGENTS.md - the cross-tool standard read by OpenAI Codex, Jules, Amp, Zed,
4
+ * Devin and a growing list of agents. Same content, agent-instruction framing.
5
+ */
6
+ export declare function generateAgentsMd(a: ProjectAnalysis): string;
@@ -0,0 +1,12 @@
1
+ import { renderFull } from './render.js';
2
+ /**
3
+ * AGENTS.md - the cross-tool standard read by OpenAI Codex, Jules, Amp, Zed,
4
+ * Devin and a growing list of agents. Same content, agent-instruction framing.
5
+ */
6
+ export function generateAgentsMd(a) {
7
+ return renderFull(a, {
8
+ title: 'AGENTS.md',
9
+ intro: `Instructions for AI coding agents working in **${a.name}**.`,
10
+ });
11
+ }
12
+ //# sourceMappingURL=agents-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/generators/agents-md.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAkB;IACjD,OAAO,UAAU,CAAC,CAAC,EAAE;QACnB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,kDAAkD,CAAC,CAAC,IAAI,KAAK;KACrE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ProjectAnalysis } from '../types.js';
2
+ export declare function generateClaudeMd(a: ProjectAnalysis): string;
@@ -0,0 +1,5 @@
1
+ import { renderFull } from './render.js';
2
+ export function generateClaudeMd(a) {
3
+ return renderFull(a, { title: a.name });
4
+ }
5
+ //# sourceMappingURL=claude-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/generators/claude-md.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAAC,CAAkB;IACjD,OAAO,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ProjectAnalysis } from '../types.js';
2
+ export declare function generateCopilotInstructions(a: ProjectAnalysis): string;
@@ -0,0 +1,5 @@
1
+ import { renderRules } from './render.js';
2
+ export function generateCopilotInstructions(a) {
3
+ return renderRules(a, { title: `Copilot instructions for ${a.name}` });
4
+ }
5
+ //# sourceMappingURL=copilot-instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-instructions.js","sourceRoot":"","sources":["../../src/generators/copilot-instructions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,2BAA2B,CAAC,CAAkB;IAC5D,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ProjectAnalysis } from '../types.js';
2
+ export declare function generateCursorRules(a: ProjectAnalysis): string;
@@ -0,0 +1,5 @@
1
+ import { renderRules } from './render.js';
2
+ export function generateCursorRules(a) {
3
+ return renderRules(a, { title: a.name });
4
+ }
5
+ //# sourceMappingURL=cursor-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.js","sourceRoot":"","sources":["../../src/generators/cursor-rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,mBAAmB,CAAC,CAAkB;IACpD,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ProjectAnalysis } from '../types.js';
2
+ export declare function generateGeminiMd(a: ProjectAnalysis): string;
@@ -0,0 +1,5 @@
1
+ import { renderFull } from './render.js';
2
+ export function generateGeminiMd(a) {
3
+ return renderFull(a, { title: a.name });
4
+ }
5
+ //# sourceMappingURL=gemini-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-md.js","sourceRoot":"","sources":["../../src/generators/gemini-md.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAAC,CAAkB;IACjD,OAAO,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProjectAnalysis, GeneratorOptions, GenerateResult, CheckResult } from '../types.js';
2
+ export interface PlannedFile {
3
+ targetId: string;
4
+ relPath: string;
5
+ content: string;
6
+ }
7
+ /** Render the files for the requested targets without touching disk. */
8
+ export declare function buildFiles(analysis: ProjectAnalysis, targets?: string[]): PlannedFile[];
9
+ export declare function generateAll(analysis: ProjectAnalysis, options: GeneratorOptions): Promise<GenerateResult>;
10
+ /** Compare generated output against what is on disk (for CI / pre-commit). */
11
+ export declare function checkAll(analysis: ProjectAnalysis, outputDir: string, targets: string[]): Promise<CheckResult>;
@@ -0,0 +1,43 @@
1
+ import { writeFile, mkdir, readFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { pathExists } from '../utils.js';
4
+ import { resolveTargets } from './registry.js';
5
+ /** Render the files for the requested targets without touching disk. */
6
+ export function buildFiles(analysis, targets = ['all']) {
7
+ const planned = [];
8
+ for (const target of resolveTargets(targets)) {
9
+ for (const file of target.files) {
10
+ planned.push({ targetId: target.id, relPath: file.path, content: file.render(analysis) });
11
+ }
12
+ }
13
+ return planned;
14
+ }
15
+ export async function generateAll(analysis, options) {
16
+ const planned = buildFiles(analysis, options.targets);
17
+ const written = [];
18
+ const skipped = [];
19
+ for (const file of planned) {
20
+ const fullPath = join(options.outputDir, file.relPath);
21
+ if (!options.overwrite && (await pathExists(fullPath))) {
22
+ skipped.push(fullPath);
23
+ continue;
24
+ }
25
+ await mkdir(dirname(fullPath), { recursive: true });
26
+ await writeFile(fullPath, file.content, 'utf-8');
27
+ written.push(fullPath);
28
+ }
29
+ return { written, skipped };
30
+ }
31
+ /** Compare generated output against what is on disk (for CI / pre-commit). */
32
+ export async function checkAll(analysis, outputDir, targets) {
33
+ const planned = buildFiles(analysis, targets);
34
+ const entries = [];
35
+ for (const file of planned) {
36
+ const fullPath = join(outputDir, file.relPath);
37
+ const current = await readFile(fullPath, 'utf-8').catch(() => null);
38
+ const status = current === null ? 'missing' : current === file.content ? 'ok' : 'stale';
39
+ entries.push({ path: fullPath, status });
40
+ }
41
+ return { entries, drifted: entries.some((e) => e.status !== 'ok') };
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ProjectAnalysis } from '../types.js';
2
+ export interface Target {
3
+ /** CLI id, e.g. "claude". */
4
+ id: string;
5
+ /** Human label, e.g. "Claude Code". */
6
+ label: string;
7
+ /** Which tools read the produced file(s). */
8
+ tools: string;
9
+ /** One file per output (most targets have exactly one). */
10
+ files: Array<{
11
+ /** Path relative to the output directory. Uses POSIX separators in docs. */
12
+ path: string;
13
+ render: (a: ProjectAnalysis) => string;
14
+ }>;
15
+ }
16
+ export declare const TARGETS: Target[];
17
+ export declare const TARGET_IDS: string[];
18
+ /** Resolve requested ids (supports "all") into Target objects, preserving registry order. */
19
+ export declare function resolveTargets(requested: string[]): Target[];
20
+ /** Returns the invalid ids from a request, if any. */
21
+ export declare function invalidTargets(requested: string[]): string[];