@malikasadjaved/readme-ai 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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +309 -0
  3. package/dist/analyzers/badge-generator.d.ts +12 -0
  4. package/dist/analyzers/badge-generator.d.ts.map +1 -0
  5. package/dist/analyzers/badge-generator.js +139 -0
  6. package/dist/analyzers/badge-generator.js.map +1 -0
  7. package/dist/analyzers/code-analyzer.d.ts +34 -0
  8. package/dist/analyzers/code-analyzer.d.ts.map +1 -0
  9. package/dist/analyzers/code-analyzer.js +210 -0
  10. package/dist/analyzers/code-analyzer.js.map +1 -0
  11. package/dist/analyzers/dependency-analyzer.d.ts +16 -0
  12. package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
  13. package/dist/analyzers/dependency-analyzer.js +169 -0
  14. package/dist/analyzers/dependency-analyzer.js.map +1 -0
  15. package/dist/analyzers/diagram-builder.d.ts +11 -0
  16. package/dist/analyzers/diagram-builder.d.ts.map +1 -0
  17. package/dist/analyzers/diagram-builder.js +163 -0
  18. package/dist/analyzers/diagram-builder.js.map +1 -0
  19. package/dist/analyzers/file-scanner.d.ts +17 -0
  20. package/dist/analyzers/file-scanner.d.ts.map +1 -0
  21. package/dist/analyzers/file-scanner.js +103 -0
  22. package/dist/analyzers/file-scanner.js.map +1 -0
  23. package/dist/analyzers/index.d.ts +7 -0
  24. package/dist/analyzers/index.d.ts.map +1 -0
  25. package/dist/analyzers/index.js +7 -0
  26. package/dist/analyzers/index.js.map +1 -0
  27. package/dist/analyzers/repo-fetcher.d.ts +22 -0
  28. package/dist/analyzers/repo-fetcher.d.ts.map +1 -0
  29. package/dist/analyzers/repo-fetcher.js +134 -0
  30. package/dist/analyzers/repo-fetcher.js.map +1 -0
  31. package/dist/cli.d.ts +2 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +54 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/generate.d.ts +17 -0
  36. package/dist/commands/generate.d.ts.map +1 -0
  37. package/dist/commands/generate.js +189 -0
  38. package/dist/commands/generate.js.map +1 -0
  39. package/dist/config.d.ts +17 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +28 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/generators/changelog.d.ts +7 -0
  44. package/dist/generators/changelog.d.ts.map +1 -0
  45. package/dist/generators/changelog.js +15 -0
  46. package/dist/generators/changelog.js.map +1 -0
  47. package/dist/generators/contributing.d.ts +5 -0
  48. package/dist/generators/contributing.d.ts.map +1 -0
  49. package/dist/generators/contributing.js +28 -0
  50. package/dist/generators/contributing.js.map +1 -0
  51. package/dist/generators/index.d.ts +6 -0
  52. package/dist/generators/index.d.ts.map +1 -0
  53. package/dist/generators/index.js +6 -0
  54. package/dist/generators/index.js.map +1 -0
  55. package/dist/generators/install.d.ts +14 -0
  56. package/dist/generators/install.d.ts.map +1 -0
  57. package/dist/generators/install.js +95 -0
  58. package/dist/generators/install.js.map +1 -0
  59. package/dist/generators/overview.d.ts +20 -0
  60. package/dist/generators/overview.d.ts.map +1 -0
  61. package/dist/generators/overview.js +87 -0
  62. package/dist/generators/overview.js.map +1 -0
  63. package/dist/generators/usage.d.ts +33 -0
  64. package/dist/generators/usage.d.ts.map +1 -0
  65. package/dist/generators/usage.js +130 -0
  66. package/dist/generators/usage.js.map +1 -0
  67. package/dist/index.d.ts +3 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +47 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/providers/anthropic.d.ts +3 -0
  72. package/dist/providers/anthropic.d.ts.map +1 -0
  73. package/dist/providers/anthropic.js +47 -0
  74. package/dist/providers/anthropic.js.map +1 -0
  75. package/dist/providers/gemini.d.ts +3 -0
  76. package/dist/providers/gemini.d.ts.map +1 -0
  77. package/dist/providers/gemini.js +28 -0
  78. package/dist/providers/gemini.js.map +1 -0
  79. package/dist/providers/index.d.ts +8 -0
  80. package/dist/providers/index.d.ts.map +1 -0
  81. package/dist/providers/index.js +24 -0
  82. package/dist/providers/index.js.map +1 -0
  83. package/dist/providers/ollama.d.ts +3 -0
  84. package/dist/providers/ollama.d.ts.map +1 -0
  85. package/dist/providers/ollama.js +46 -0
  86. package/dist/providers/ollama.js.map +1 -0
  87. package/dist/providers/openai.d.ts +3 -0
  88. package/dist/providers/openai.d.ts.map +1 -0
  89. package/dist/providers/openai.js +40 -0
  90. package/dist/providers/openai.js.map +1 -0
  91. package/dist/themes/academic.d.ts +3 -0
  92. package/dist/themes/academic.d.ts.map +1 -0
  93. package/dist/themes/academic.js +113 -0
  94. package/dist/themes/academic.js.map +1 -0
  95. package/dist/themes/default.d.ts +3 -0
  96. package/dist/themes/default.d.ts.map +1 -0
  97. package/dist/themes/default.js +114 -0
  98. package/dist/themes/default.js.map +1 -0
  99. package/dist/themes/hacker.d.ts +3 -0
  100. package/dist/themes/hacker.d.ts.map +1 -0
  101. package/dist/themes/hacker.js +100 -0
  102. package/dist/themes/hacker.js.map +1 -0
  103. package/dist/themes/index.d.ts +26 -0
  104. package/dist/themes/index.d.ts.map +1 -0
  105. package/dist/themes/index.js +23 -0
  106. package/dist/themes/index.js.map +1 -0
  107. package/dist/themes/minimal.d.ts +3 -0
  108. package/dist/themes/minimal.d.ts.map +1 -0
  109. package/dist/themes/minimal.js +85 -0
  110. package/dist/themes/minimal.js.map +1 -0
  111. package/dist/themes/modern.d.ts +3 -0
  112. package/dist/themes/modern.d.ts.map +1 -0
  113. package/dist/themes/modern.js +114 -0
  114. package/dist/themes/modern.js.map +1 -0
  115. package/dist/utils/file-utils.d.ts +9 -0
  116. package/dist/utils/file-utils.d.ts.map +1 -0
  117. package/dist/utils/file-utils.js +93 -0
  118. package/dist/utils/file-utils.js.map +1 -0
  119. package/dist/utils/github-api.d.ts +27 -0
  120. package/dist/utils/github-api.d.ts.map +1 -0
  121. package/dist/utils/github-api.js +68 -0
  122. package/dist/utils/github-api.js.map +1 -0
  123. package/dist/utils/language-detector.d.ts +18 -0
  124. package/dist/utils/language-detector.d.ts.map +1 -0
  125. package/dist/utils/language-detector.js +139 -0
  126. package/dist/utils/language-detector.js.map +1 -0
  127. package/dist/utils/markdown-writer.d.ts +5 -0
  128. package/dist/utils/markdown-writer.d.ts.map +1 -0
  129. package/dist/utils/markdown-writer.js +19 -0
  130. package/dist/utils/markdown-writer.js.map +1 -0
  131. package/dist/utils/template-engine.d.ts +9 -0
  132. package/dist/utils/template-engine.d.ts.map +1 -0
  133. package/dist/utils/template-engine.js +29 -0
  134. package/dist/utils/template-engine.js.map +1 -0
  135. package/package.json +60 -0
  136. package/templates/.readmeaiignore.example +41 -0
  137. package/templates/github-action.yml +35 -0
@@ -0,0 +1,210 @@
1
+ import { readFileContent } from '../utils/file-utils.js';
2
+ export async function analyzeCode(keyFiles) {
3
+ const exports = [];
4
+ const mainFunctions = [];
5
+ const apiEndpoints = [];
6
+ const cliCommands = [];
7
+ const envVariables = new Set();
8
+ const externalDependencies = new Set();
9
+ for (const file of keyFiles) {
10
+ try {
11
+ const content = await readFileContent(file.absolutePath);
12
+ if (['TypeScript', 'JavaScript'].includes(file.language)) {
13
+ extractTSExports(content, file.path, exports);
14
+ extractTSFunctions(content, file.path, mainFunctions);
15
+ extractExpressEndpoints(content, file.path, apiEndpoints);
16
+ extractCommanderCommands(content, file.path, cliCommands);
17
+ extractEnvVars(content, envVariables);
18
+ extractTSImports(content, externalDependencies);
19
+ }
20
+ else if (file.language === 'Python') {
21
+ extractPythonFunctions(content, file.path, mainFunctions);
22
+ extractFastAPIEndpoints(content, file.path, apiEndpoints);
23
+ extractEnvVars(content, envVariables);
24
+ extractPythonImports(content, externalDependencies);
25
+ }
26
+ }
27
+ catch {
28
+ // Skip files that can't be read
29
+ }
30
+ }
31
+ return {
32
+ exports,
33
+ mainFunctions,
34
+ apiEndpoints,
35
+ cliCommands,
36
+ envVariables: [...envVariables],
37
+ externalDependencies: [...externalDependencies],
38
+ };
39
+ }
40
+ function extractTSExports(content, filePath, exports) {
41
+ // export function name(...)
42
+ const funcRegex = /export\s+(?:async\s+)?function\s+(\w+)\s*(\([^)]*\)(?:\s*:\s*[^{]+)?)/g;
43
+ let match;
44
+ while ((match = funcRegex.exec(content)) !== null) {
45
+ exports.push({
46
+ name: match[1],
47
+ type: 'function',
48
+ signature: `function ${match[1]}${match[2]}`,
49
+ file: filePath,
50
+ });
51
+ }
52
+ // export class Name
53
+ const classRegex = /export\s+class\s+(\w+)(?:\s+extends\s+\w+)?(?:\s+implements\s+[\w,\s]+)?/g;
54
+ while ((match = classRegex.exec(content)) !== null) {
55
+ exports.push({
56
+ name: match[1],
57
+ type: 'class',
58
+ signature: match[0],
59
+ file: filePath,
60
+ });
61
+ }
62
+ // export const name
63
+ const constRegex = /export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/g;
64
+ while ((match = constRegex.exec(content)) !== null) {
65
+ exports.push({
66
+ name: match[1],
67
+ type: 'const',
68
+ signature: `const ${match[1]}${match[2] ? ': ' + match[2].trim() : ''}`,
69
+ file: filePath,
70
+ });
71
+ }
72
+ // export interface Name
73
+ const ifaceRegex = /export\s+interface\s+(\w+)(?:<[^>]+>)?/g;
74
+ while ((match = ifaceRegex.exec(content)) !== null) {
75
+ exports.push({
76
+ name: match[1],
77
+ type: 'interface',
78
+ signature: match[0],
79
+ file: filePath,
80
+ });
81
+ }
82
+ // export type Name
83
+ const typeRegex = /export\s+type\s+(\w+)(?:<[^>]+>)?/g;
84
+ while ((match = typeRegex.exec(content)) !== null) {
85
+ exports.push({
86
+ name: match[1],
87
+ type: 'type',
88
+ signature: match[0],
89
+ file: filePath,
90
+ });
91
+ }
92
+ }
93
+ function extractTSFunctions(content, filePath, functions) {
94
+ // Match exported async/sync functions with JSDoc
95
+ const funcWithDocRegex = /\/\*\*\s*([\s\S]*?)\*\/\s*export\s+(?:async\s+)?function\s+(\w+)\s*(\([^)]*\)(?:\s*:\s*[^{]+)?)/g;
96
+ let match;
97
+ while ((match = funcWithDocRegex.exec(content)) !== null) {
98
+ const doc = match[1].replace(/\s*\*\s*/g, ' ').trim();
99
+ functions.push({
100
+ name: match[2],
101
+ signature: `function ${match[2]}${match[3]}`,
102
+ description: doc,
103
+ file: filePath,
104
+ });
105
+ }
106
+ // Functions without JSDoc
107
+ const funcRegex = /export\s+(?:async\s+)?function\s+(\w+)\s*(\([^)]*\)(?:\s*:\s*[^{]+)?)/g;
108
+ while ((match = funcRegex.exec(content)) !== null) {
109
+ if (!functions.some(f => f.name === match[1] && f.file === filePath)) {
110
+ functions.push({
111
+ name: match[1],
112
+ signature: `function ${match[1]}${match[2]}`,
113
+ description: '',
114
+ file: filePath,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ function extractExpressEndpoints(content, filePath, endpoints) {
120
+ // router.get('/path', handler) or app.post('/path', handler)
121
+ const routeRegex = /(?:router|app|server)\.(get|post|put|patch|delete|all)\s*\(\s*['"`]([^'"`]+)['"`]/gi;
122
+ let match;
123
+ while ((match = routeRegex.exec(content)) !== null) {
124
+ endpoints.push({
125
+ method: match[1].toUpperCase(),
126
+ path: match[2],
127
+ handler: '',
128
+ file: filePath,
129
+ });
130
+ }
131
+ }
132
+ function extractFastAPIEndpoints(content, filePath, endpoints) {
133
+ // @app.get("/path") or @router.post("/path")
134
+ const routeRegex = /@(?:app|router)\.(get|post|put|patch|delete)\s*\(\s*["']([^"']+)["']/gi;
135
+ let match;
136
+ while ((match = routeRegex.exec(content)) !== null) {
137
+ endpoints.push({
138
+ method: match[1].toUpperCase(),
139
+ path: match[2],
140
+ handler: '',
141
+ file: filePath,
142
+ });
143
+ }
144
+ }
145
+ function extractCommanderCommands(content, filePath, commands) {
146
+ // .command('name') or .name('name')
147
+ const cmdRegex = /\.command\s*\(\s*['"`]([^'"`]+)['"`]\)[\s\S]*?\.description\s*\(\s*['"`]([^'"`]+)['"`]\)/g;
148
+ let match;
149
+ while ((match = cmdRegex.exec(content)) !== null) {
150
+ commands.push({
151
+ name: match[1],
152
+ description: match[2],
153
+ file: filePath,
154
+ });
155
+ }
156
+ }
157
+ function extractPythonFunctions(content, filePath, functions) {
158
+ // def name(params): with optional docstring
159
+ const funcRegex = /def\s+(\w+)\s*\(([^)]*)\)(?:\s*->\s*[^:]+)?:\s*\n\s*(?:"""([\s\S]*?)"""|'''([\s\S]*?)''')?/g;
160
+ let match;
161
+ while ((match = funcRegex.exec(content)) !== null) {
162
+ const name = match[1];
163
+ if (name.startsWith('_'))
164
+ continue; // skip private
165
+ functions.push({
166
+ name,
167
+ signature: `def ${name}(${match[2]})`,
168
+ description: (match[3] || match[4] || '').trim(),
169
+ file: filePath,
170
+ });
171
+ }
172
+ }
173
+ function extractEnvVars(content, envVars) {
174
+ // process.env.VAR_NAME or os.environ["VAR_NAME"] or os.getenv("VAR_NAME")
175
+ const patterns = [
176
+ /process\.env\.(\w+)/g,
177
+ /os\.environ\[["'](\w+)["']\]/g,
178
+ /os\.getenv\(["'](\w+)["']\)/g,
179
+ /os\.environ\.get\(["'](\w+)["']\)/g,
180
+ ];
181
+ for (const pattern of patterns) {
182
+ let match;
183
+ while ((match = pattern.exec(content)) !== null) {
184
+ envVars.add(match[1]);
185
+ }
186
+ }
187
+ }
188
+ function extractTSImports(content, deps) {
189
+ const importRegex = /(?:import|from)\s+['"]([^'"./][^'"]*)['"]/g;
190
+ let match;
191
+ while ((match = importRegex.exec(content)) !== null) {
192
+ const pkg = match[1].startsWith('@')
193
+ ? match[1].split('/').slice(0, 2).join('/')
194
+ : match[1].split('/')[0];
195
+ if (!pkg.startsWith('node:')) {
196
+ deps.add(pkg);
197
+ }
198
+ }
199
+ }
200
+ function extractPythonImports(content, deps) {
201
+ const importRegex = /(?:^|\n)\s*(?:import|from)\s+(\w+)/g;
202
+ const stdLib = new Set(['os', 'sys', 'json', 'pathlib', 'typing', 'datetime', 'collections', 're', 'functools', 'itertools', 'math', 'random', 'string', 'time', 'logging', 'unittest', 'abc', 'io', 'copy', 'enum', 'dataclasses', 'contextlib', 'asyncio', 'http', 'urllib', 'hashlib', 'base64', 'struct', 'argparse', 'shutil', 'glob', 'subprocess', 'threading', 'multiprocessing']);
203
+ let match;
204
+ while ((match = importRegex.exec(content)) !== null) {
205
+ if (!stdLib.has(match[1])) {
206
+ deps.add(match[1]);
207
+ }
208
+ }
209
+ }
210
+ //# sourceMappingURL=code-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/code-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { RepoContent } from './repo-fetcher.js';
2
+ export interface DependencyAnalysis {
3
+ packageManager: 'npm' | 'yarn' | 'pnpm' | 'pip' | 'cargo' | 'go' | null;
4
+ installCommand: string;
5
+ runCommand: string;
6
+ buildCommand?: string;
7
+ testCommand?: string;
8
+ mainDependencies: string[];
9
+ devDependencies: string[];
10
+ pythonVersion?: string;
11
+ nodeVersion?: string;
12
+ requiresDatabase: boolean;
13
+ requiresEnvFile: boolean;
14
+ }
15
+ export declare function analyzeDependencies(repo: RepoContent): Promise<DependencyAnalysis>;
16
+ //# sourceMappingURL=dependency-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/dependency-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAcD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoCxF"}
@@ -0,0 +1,169 @@
1
+ import { readFileContent } from '../utils/file-utils.js';
2
+ const DB_PACKAGES = new Set([
3
+ 'pg', 'mysql', 'mysql2', 'mongodb', 'mongoose', 'redis', 'ioredis',
4
+ 'prisma', '@prisma/client', 'typeorm', 'sequelize', 'knex', 'drizzle-orm',
5
+ 'better-sqlite3', 'sqlite3',
6
+ 'psycopg2', 'pymongo', 'sqlalchemy', 'django', 'peewee', 'tortoise-orm',
7
+ 'diesel', 'sqlx', 'sea-orm',
8
+ ]);
9
+ const ENV_PACKAGES = new Set([
10
+ 'dotenv', 'python-dotenv', 'django-environ', 'envy',
11
+ ]);
12
+ export async function analyzeDependencies(repo) {
13
+ // Check for Node.js project
14
+ if (repo.packageJson) {
15
+ return analyzeNodeProject(repo);
16
+ }
17
+ // Check for Python project
18
+ if (repo.pythonRequirements) {
19
+ return analyzePythonProject(repo);
20
+ }
21
+ // Check for Rust project
22
+ if (repo.cargoToml) {
23
+ return analyzeRustProject(repo);
24
+ }
25
+ // Check for Go project
26
+ if (repo.goMod) {
27
+ return analyzeGoProject(repo);
28
+ }
29
+ // Check for pyproject.toml
30
+ const pyprojectFile = repo.files.find(f => f.path === 'pyproject.toml');
31
+ if (pyprojectFile) {
32
+ return analyzePyprojectProject(repo, pyprojectFile.absolutePath);
33
+ }
34
+ return {
35
+ packageManager: null,
36
+ installCommand: '',
37
+ runCommand: '',
38
+ mainDependencies: [],
39
+ devDependencies: [],
40
+ requiresDatabase: false,
41
+ requiresEnvFile: false,
42
+ };
43
+ }
44
+ function analyzeNodeProject(repo) {
45
+ const pkg = repo.packageJson;
46
+ const scripts = (pkg.scripts || {});
47
+ const deps = Object.keys((pkg.dependencies || {}));
48
+ const devDeps = Object.keys((pkg.devDependencies || {}));
49
+ const allDeps = [...deps, ...devDeps];
50
+ // Detect package manager
51
+ let packageManager = 'npm';
52
+ const hasYarnLock = repo.files.some(f => f.path === 'yarn.lock');
53
+ const hasPnpmLock = repo.files.some(f => f.path === 'pnpm-lock.yaml');
54
+ if (hasPnpmLock)
55
+ packageManager = 'pnpm';
56
+ else if (hasYarnLock)
57
+ packageManager = 'yarn';
58
+ const installCommand = `${packageManager} install`;
59
+ let runCommand = '';
60
+ if (scripts.start)
61
+ runCommand = `${packageManager} start`;
62
+ else if (scripts.dev)
63
+ runCommand = `${packageManager} run dev`;
64
+ else
65
+ runCommand = `${packageManager} start`;
66
+ const buildCommand = scripts.build ? `${packageManager} run build` : undefined;
67
+ const testCommand = scripts.test ? `${packageManager} test` : undefined;
68
+ // Node version
69
+ const engines = (pkg.engines || {});
70
+ const nodeVersion = engines.node;
71
+ return {
72
+ packageManager,
73
+ installCommand,
74
+ runCommand,
75
+ buildCommand,
76
+ testCommand,
77
+ mainDependencies: deps.slice(0, 10),
78
+ devDependencies: devDeps.slice(0, 5),
79
+ nodeVersion,
80
+ requiresDatabase: allDeps.some(d => DB_PACKAGES.has(d)),
81
+ requiresEnvFile: allDeps.some(d => ENV_PACKAGES.has(d)),
82
+ };
83
+ }
84
+ function analyzePythonProject(repo) {
85
+ const requirements = repo.pythonRequirements;
86
+ const deps = requirements.split('\n')
87
+ .map(l => l.trim())
88
+ .filter(l => l && !l.startsWith('#'))
89
+ .map(l => l.split(/[=<>!]/)[0].trim());
90
+ const hasManagePy = repo.files.some(f => f.path === 'manage.py');
91
+ const mainPy = repo.files.some(f => f.path === 'main.py' || f.path === 'app.py');
92
+ let runCommand = 'python main.py';
93
+ if (hasManagePy)
94
+ runCommand = 'python manage.py runserver';
95
+ else if (mainPy)
96
+ runCommand = 'python main.py';
97
+ else if (deps.includes('uvicorn'))
98
+ runCommand = 'uvicorn main:app --reload';
99
+ return {
100
+ packageManager: 'pip',
101
+ installCommand: 'pip install -r requirements.txt',
102
+ runCommand,
103
+ testCommand: deps.includes('pytest') ? 'pytest' : undefined,
104
+ mainDependencies: deps.slice(0, 10),
105
+ devDependencies: [],
106
+ requiresDatabase: deps.some(d => DB_PACKAGES.has(d)),
107
+ requiresEnvFile: deps.some(d => ENV_PACKAGES.has(d)),
108
+ };
109
+ }
110
+ function analyzeRustProject(repo) {
111
+ return {
112
+ packageManager: 'cargo',
113
+ installCommand: 'cargo build --release',
114
+ runCommand: 'cargo run',
115
+ buildCommand: 'cargo build --release',
116
+ testCommand: 'cargo test',
117
+ mainDependencies: [],
118
+ devDependencies: [],
119
+ requiresDatabase: false,
120
+ requiresEnvFile: false,
121
+ };
122
+ }
123
+ function analyzeGoProject(repo) {
124
+ return {
125
+ packageManager: 'go',
126
+ installCommand: 'go mod download',
127
+ runCommand: 'go run .',
128
+ buildCommand: 'go build -o app .',
129
+ testCommand: 'go test ./...',
130
+ mainDependencies: [],
131
+ devDependencies: [],
132
+ requiresDatabase: false,
133
+ requiresEnvFile: false,
134
+ };
135
+ }
136
+ async function analyzePyprojectProject(repo, pyprojectPath) {
137
+ try {
138
+ const content = await readFileContent(pyprojectPath);
139
+ const hasFastAPI = content.includes('fastapi');
140
+ const hasDjango = content.includes('django');
141
+ let runCommand = 'python main.py';
142
+ if (hasFastAPI)
143
+ runCommand = 'uvicorn main:app --reload';
144
+ if (hasDjango)
145
+ runCommand = 'python manage.py runserver';
146
+ return {
147
+ packageManager: 'pip',
148
+ installCommand: 'pip install -e .',
149
+ runCommand,
150
+ testCommand: content.includes('pytest') ? 'pytest' : undefined,
151
+ mainDependencies: [],
152
+ devDependencies: [],
153
+ requiresDatabase: false,
154
+ requiresEnvFile: false,
155
+ };
156
+ }
157
+ catch {
158
+ return {
159
+ packageManager: 'pip',
160
+ installCommand: 'pip install -e .',
161
+ runCommand: 'python main.py',
162
+ mainDependencies: [],
163
+ devDependencies: [],
164
+ requiresDatabase: false,
165
+ requiresEnvFile: false,
166
+ };
167
+ }
168
+ }
169
+ //# sourceMappingURL=dependency-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/dependency-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ScanResult } from './file-scanner.js';
2
+ import type { CodeAnalysis } from './code-analyzer.js';
3
+ import type { DependencyAnalysis } from './dependency-analyzer.js';
4
+ import type { AIProvider } from '../providers/index.js';
5
+ export interface DiagramResult {
6
+ type: 'flowchart' | 'graph' | 'sequence';
7
+ mermaidCode: string;
8
+ description: string;
9
+ }
10
+ export declare function buildDiagram(scan: ScanResult, codeAnalysis: CodeAnalysis, deps: DependencyAnalysis, provider: AIProvider): Promise<DiagramResult>;
11
+ //# sourceMappingURL=diagram-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram-builder.d.ts","sourceRoot":"","sources":["../../src/analyzers/diagram-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,aAAa,CAAC,CAOxB"}
@@ -0,0 +1,163 @@
1
+ export async function buildDiagram(scan, codeAnalysis, deps, provider) {
2
+ // Try to build a diagram from code structure first
3
+ const structureDiagram = buildFromStructure(scan, codeAnalysis, deps);
4
+ if (structureDiagram)
5
+ return structureDiagram;
6
+ // Fall back to AI-generated diagram
7
+ return buildWithAI(scan, codeAnalysis, deps, provider);
8
+ }
9
+ function buildFromStructure(scan, codeAnalysis, deps) {
10
+ const hasAPI = codeAnalysis.apiEndpoints.length > 0;
11
+ const hasCLI = codeAnalysis.cliCommands.length > 0;
12
+ const hasDB = deps.requiresDatabase;
13
+ const frameworks = scan.frameworks;
14
+ // REST API architecture
15
+ if (hasAPI) {
16
+ return buildAPIDiagram(codeAnalysis, deps, frameworks);
17
+ }
18
+ // CLI tool architecture
19
+ if (hasCLI) {
20
+ return buildCLIDiagram(codeAnalysis, deps);
21
+ }
22
+ // React/Vue/Svelte frontend
23
+ if (frameworks.some(f => ['React', 'Vue', 'Svelte', 'Angular', 'Next.js', 'Nuxt'].includes(f))) {
24
+ return buildFrontendDiagram(scan, deps, frameworks);
25
+ }
26
+ // Generic project from directory structure
27
+ return buildGenericDiagram(scan, deps);
28
+ }
29
+ function buildAPIDiagram(code, deps, frameworks) {
30
+ const nodes = [' A[Client] -->|HTTP Request| B[API Server]'];
31
+ // Middleware
32
+ nodes.push(' B --> C[Route Handlers]');
33
+ // Detect auth
34
+ if (code.envVariables.some(v => v.includes('JWT') || v.includes('AUTH') || v.includes('SECRET'))) {
35
+ nodes.push(' B --> D[Auth Middleware]');
36
+ nodes.push(' D --> C');
37
+ }
38
+ // Service layer
39
+ nodes.push(' C --> E[Service Layer]');
40
+ // Database
41
+ if (deps.requiresDatabase) {
42
+ const dbDeps = deps.mainDependencies;
43
+ let dbName = 'Database';
44
+ if (dbDeps.some(d => d.includes('pg') || d.includes('postgres')))
45
+ dbName = 'PostgreSQL';
46
+ else if (dbDeps.some(d => d.includes('mongo')))
47
+ dbName = 'MongoDB';
48
+ else if (dbDeps.some(d => d.includes('mysql')))
49
+ dbName = 'MySQL';
50
+ else if (dbDeps.some(d => d.includes('redis')))
51
+ dbName = 'Redis';
52
+ nodes.push(` E --> F[(${dbName})]`);
53
+ }
54
+ // Cache
55
+ if (deps.mainDependencies.some(d => d.includes('redis') || d.includes('ioredis'))) {
56
+ nodes.push(' E --> G[(Redis Cache)]');
57
+ }
58
+ const mermaidCode = `graph TD\n${nodes.join('\n')}`;
59
+ return {
60
+ type: 'graph',
61
+ mermaidCode,
62
+ description: 'The API follows a layered architecture with route handlers delegating to a service layer for business logic.',
63
+ };
64
+ }
65
+ function buildCLIDiagram(code, deps) {
66
+ const commands = code.cliCommands.slice(0, 5);
67
+ const nodes = [' A[CLI Input] --> B[Command Parser]'];
68
+ if (commands.length > 0) {
69
+ commands.forEach((cmd, i) => {
70
+ nodes.push(` B --> C${i}[${cmd.name}]`);
71
+ });
72
+ }
73
+ else {
74
+ nodes.push(' B --> C[Command Handler]');
75
+ nodes.push(' C --> D[Process]');
76
+ nodes.push(' D --> E[Output]');
77
+ }
78
+ const mermaidCode = `graph TD\n${nodes.join('\n')}`;
79
+ return {
80
+ type: 'flowchart',
81
+ mermaidCode,
82
+ description: 'The CLI processes user commands through a command parser that delegates to specific handlers.',
83
+ };
84
+ }
85
+ function buildFrontendDiagram(scan, deps, frameworks) {
86
+ const nodes = [];
87
+ const framework = frameworks.find(f => ['React', 'Vue', 'Svelte', 'Angular', 'Next.js', 'Nuxt'].includes(f)) || 'Frontend';
88
+ nodes.push(` A[${framework} App] --> B[Pages/Routes]`);
89
+ nodes.push(' B --> C[Components]');
90
+ nodes.push(' C --> D[State Management]');
91
+ nodes.push(' C --> E[API Client]');
92
+ nodes.push(' E --> F[Backend API]');
93
+ if (deps.mainDependencies.some(d => d.includes('redux') || d.includes('zustand') || d.includes('pinia'))) {
94
+ nodes.push(' D --> G[Store]');
95
+ }
96
+ const mermaidCode = `graph TD\n${nodes.join('\n')}`;
97
+ return {
98
+ type: 'graph',
99
+ mermaidCode,
100
+ description: `The ${framework} application uses a component-based architecture with centralized state management.`,
101
+ };
102
+ }
103
+ function buildGenericDiagram(scan, deps) {
104
+ const nodes = [];
105
+ // Group files by top-level directory
106
+ const dirs = new Map();
107
+ for (const file of scan.keyFiles) {
108
+ const topDir = file.path.split('/')[0];
109
+ dirs.set(topDir, (dirs.get(topDir) || 0) + 1);
110
+ }
111
+ const topDirs = [...dirs.entries()]
112
+ .sort((a, b) => b[1] - a[1])
113
+ .slice(0, 6);
114
+ if (topDirs.length === 0) {
115
+ return {
116
+ type: 'graph',
117
+ mermaidCode: 'graph TD\n A[Project] --> B[Source Files]',
118
+ description: 'Project structure overview.',
119
+ };
120
+ }
121
+ nodes.push(' A[Project Root]');
122
+ topDirs.forEach(([dir, count], i) => {
123
+ nodes.push(` A --> B${i}[${dir}/ - ${count} files]`);
124
+ });
125
+ const mermaidCode = `graph TD\n${nodes.join('\n')}`;
126
+ return {
127
+ type: 'graph',
128
+ mermaidCode,
129
+ description: 'High-level project structure showing the main directories and their contents.',
130
+ };
131
+ }
132
+ async function buildWithAI(scan, code, deps, provider) {
133
+ const prompt = `Generate a Mermaid architecture diagram for this project.
134
+
135
+ Project info:
136
+ - Primary language: ${scan.languages[0]?.name || 'Unknown'}
137
+ - Frameworks: ${scan.frameworks.join(', ') || 'None detected'}
138
+ - Has API endpoints: ${code.apiEndpoints.length > 0}
139
+ - Has CLI commands: ${code.cliCommands.length > 0}
140
+ - Has database: ${deps.requiresDatabase}
141
+ - Entry points: ${scan.entryPoints.join(', ')}
142
+
143
+ Directory structure:
144
+ ${scan.directoryTree}
145
+
146
+ API endpoints: ${code.apiEndpoints.map(e => `${e.method} ${e.path}`).join(', ') || 'None'}
147
+
148
+ Return ONLY valid Mermaid code starting with "graph TD" or "flowchart TD". No markdown fences, no explanation. Keep it under 15 nodes.`;
149
+ try {
150
+ const response = await provider.generate(prompt);
151
+ const mermaidCode = response.trim().replace(/^```mermaid\n?/, '').replace(/\n?```$/, '');
152
+ return {
153
+ type: 'graph',
154
+ mermaidCode,
155
+ description: 'AI-generated architecture diagram showing the main components and their relationships.',
156
+ };
157
+ }
158
+ catch {
159
+ // Fall back to generic diagram
160
+ return buildGenericDiagram(scan, deps);
161
+ }
162
+ }
163
+ //# sourceMappingURL=diagram-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram-builder.js","sourceRoot":"","sources":["../../src/analyzers/diagram-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type LanguageStat } from '../utils/language-detector.js';
2
+ import type { RepoContent, FileEntry } from './repo-fetcher.js';
3
+ export interface ScanResult {
4
+ totalFiles: number;
5
+ languages: LanguageStat[];
6
+ frameworks: string[];
7
+ hasTests: boolean;
8
+ hasDocker: boolean;
9
+ hasCICD: boolean;
10
+ hasLicense: string | null;
11
+ entryPoints: string[];
12
+ configFiles: string[];
13
+ directoryTree: string;
14
+ keyFiles: FileEntry[];
15
+ }
16
+ export declare function scanFiles(repoContent: RepoContent): Promise<ScanResult>;
17
+ //# sourceMappingURL=file-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/analyzers/file-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGhE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,wBAAsB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAgD7E"}