@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,103 @@
1
+ import { readFileContent } from '../utils/file-utils.js';
2
+ import { generateTree } from '../utils/file-utils.js';
3
+ import { calculateLanguageStats, isTestFile, FRAMEWORK_INDICATORS, } from '../utils/language-detector.js';
4
+ export async function scanFiles(repoContent) {
5
+ const { files } = repoContent;
6
+ const filePaths = files.map(f => f.path);
7
+ const languages = calculateLanguageStats(filePaths);
8
+ const frameworks = await detectFrameworks(repoContent);
9
+ const hasTests = files.some(f => f.isTest || isTestFile(f.path));
10
+ const hasDocker = files.some(f => {
11
+ const name = f.path.split('/').pop() || '';
12
+ return name === 'Dockerfile' || name.startsWith('docker-compose');
13
+ });
14
+ const hasCICD = files.some(f => f.path.includes('.github/workflows/') ||
15
+ f.path.includes('.gitlab-ci') ||
16
+ f.path.includes('.circleci/') ||
17
+ f.path.includes('Jenkinsfile'));
18
+ const hasLicense = await detectLicense(repoContent);
19
+ const entryPoints = files.filter(f => f.isEntryPoint).map(f => f.path);
20
+ const configFiles = files.filter(f => f.isConfig).map(f => f.path);
21
+ const directoryTree = generateTree(filePaths, 3);
22
+ // Key files: entry points + src/ files (non-test, non-config), limited to 30
23
+ const keyFiles = files
24
+ .filter(f => !f.isTest && !f.isConfig)
25
+ .sort((a, b) => {
26
+ if (a.isEntryPoint && !b.isEntryPoint)
27
+ return -1;
28
+ if (!a.isEntryPoint && b.isEntryPoint)
29
+ return 1;
30
+ return a.path.split('/').length - b.path.split('/').length;
31
+ })
32
+ .slice(0, 30);
33
+ return {
34
+ totalFiles: files.length,
35
+ languages,
36
+ frameworks,
37
+ hasTests,
38
+ hasDocker,
39
+ hasCICD,
40
+ hasLicense,
41
+ entryPoints,
42
+ configFiles,
43
+ directoryTree,
44
+ keyFiles,
45
+ };
46
+ }
47
+ async function detectFrameworks(repo) {
48
+ const detected = [];
49
+ const filePaths = new Set(repo.files.map(f => f.path.split('/').pop() || ''));
50
+ const allPaths = new Set(repo.files.map(f => f.path));
51
+ // Get dependencies from package.json
52
+ const deps = new Set();
53
+ if (repo.packageJson) {
54
+ const pkg = repo.packageJson;
55
+ const allDeps = {
56
+ ...(pkg.dependencies || {}),
57
+ ...(pkg.devDependencies || {}),
58
+ };
59
+ Object.keys(allDeps).forEach(d => deps.add(d));
60
+ }
61
+ for (const [framework, indicators] of Object.entries(FRAMEWORK_INDICATORS)) {
62
+ // Check dependency names
63
+ if (indicators.deps?.some(d => deps.has(d))) {
64
+ detected.push(framework);
65
+ continue;
66
+ }
67
+ // Check file existence
68
+ if (indicators.files?.some(f => filePaths.has(f) || allPaths.has(f))) {
69
+ detected.push(framework);
70
+ continue;
71
+ }
72
+ }
73
+ return detected;
74
+ }
75
+ async function detectLicense(repo) {
76
+ if (repo.githubMeta?.license) {
77
+ return repo.githubMeta.license;
78
+ }
79
+ const licenseFile = repo.files.find(f => {
80
+ const name = (f.path.split('/').pop() || '').toLowerCase();
81
+ return name === 'license' || name === 'license.md' || name === 'license.txt';
82
+ });
83
+ if (!licenseFile)
84
+ return null;
85
+ try {
86
+ const content = await readFileContent(licenseFile.absolutePath);
87
+ if (content.includes('MIT License'))
88
+ return 'MIT';
89
+ if (content.includes('Apache License'))
90
+ return 'Apache-2.0';
91
+ if (content.includes('GNU GENERAL PUBLIC LICENSE'))
92
+ return 'GPL-3.0';
93
+ if (content.includes('BSD'))
94
+ return 'BSD-3-Clause';
95
+ if (content.includes('ISC License'))
96
+ return 'ISC';
97
+ return 'Custom';
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ //# sourceMappingURL=file-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/analyzers/file-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { fetchRepo, type RepoContent, type FileEntry } from './repo-fetcher.js';
2
+ export { scanFiles, type ScanResult } from './file-scanner.js';
3
+ export { analyzeDependencies, type DependencyAnalysis } from './dependency-analyzer.js';
4
+ export { analyzeCode, type CodeAnalysis, type ExportInfo, type FunctionInfo, type Endpoint, type CLICommand } from './code-analyzer.js';
5
+ export { generateBadges, formatBadgeRow, type Badge } from './badge-generator.js';
6
+ export { buildDiagram, type DiagramResult } from './diagram-builder.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { fetchRepo } from './repo-fetcher.js';
2
+ export { scanFiles } from './file-scanner.js';
3
+ export { analyzeDependencies } from './dependency-analyzer.js';
4
+ export { analyzeCode } from './code-analyzer.js';
5
+ export { generateBadges, formatBadgeRow } from './badge-generator.js';
6
+ export { buildDiagram } from './diagram-builder.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoC,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAA2B,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,WAAW,EAAyF,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAsB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type GitHubMeta } from '../utils/github-api.js';
2
+ export interface FileEntry {
3
+ path: string;
4
+ absolutePath: string;
5
+ language: string;
6
+ size: number;
7
+ isEntryPoint: boolean;
8
+ isConfig: boolean;
9
+ isTest: boolean;
10
+ }
11
+ export interface RepoContent {
12
+ path: string;
13
+ isRemote: boolean;
14
+ files: FileEntry[];
15
+ packageJson?: Record<string, unknown>;
16
+ pythonRequirements?: string;
17
+ cargoToml?: string;
18
+ goMod?: string;
19
+ githubMeta?: GitHubMeta;
20
+ }
21
+ export declare function fetchRepo(input: string): Promise<RepoContent>;
22
+ //# sourceMappingURL=repo-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-fetcher.d.ts","sourceRoot":"","sources":["../../src/analyzers/repo-fetcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAehC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAWD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAMnE"}
@@ -0,0 +1,134 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import { parseGitHubURL, fetchGitHubMeta, fetchGitHubTree, fetchGitHubFileContent, } from '../utils/github-api.js';
5
+ import { globFiles, loadIgnorePatterns, readFileContent, fileExists, getFileExtension, } from '../utils/file-utils.js';
6
+ import { detectLanguage, isConfigFile, isTestFile, isEntryPoint, } from '../utils/language-detector.js';
7
+ const MAX_REMOTE_FILES = 100;
8
+ const SOURCE_EXTENSIONS = new Set([
9
+ 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs',
10
+ 'py', 'rs', 'go', 'java', 'kt', 'swift',
11
+ 'rb', 'php', 'cs', 'cpp', 'c', 'h',
12
+ 'vue', 'svelte', 'dart', 'ex', 'exs',
13
+ 'scala', 'lua', 'r', 'zig', 'sh',
14
+ ]);
15
+ export async function fetchRepo(input) {
16
+ const github = parseGitHubURL(input);
17
+ if (github) {
18
+ return fetchRemoteRepo(github.owner, github.repo, github.branch);
19
+ }
20
+ return fetchLocalRepo(path.resolve(input));
21
+ }
22
+ async function fetchLocalRepo(repoPath) {
23
+ const stat = await fs.stat(repoPath);
24
+ if (!stat.isDirectory()) {
25
+ throw new Error(`Not a directory: ${repoPath}`);
26
+ }
27
+ const ignores = await loadIgnorePatterns(repoPath);
28
+ const relativePaths = await globFiles(repoPath, ignores);
29
+ const files = relativePaths.map(relPath => {
30
+ const absPath = path.join(repoPath, relPath);
31
+ return {
32
+ path: relPath,
33
+ absolutePath: absPath,
34
+ language: detectLanguage(relPath),
35
+ size: 0,
36
+ isEntryPoint: isEntryPoint(relPath),
37
+ isConfig: isConfigFile(relPath),
38
+ isTest: isTestFile(relPath),
39
+ };
40
+ });
41
+ const result = { path: repoPath, isRemote: false, files };
42
+ const pkgPath = path.join(repoPath, 'package.json');
43
+ if (await fileExists(pkgPath)) {
44
+ try {
45
+ result.packageJson = JSON.parse(await readFileContent(pkgPath));
46
+ }
47
+ catch { /* ignore parse errors */ }
48
+ }
49
+ const reqPath = path.join(repoPath, 'requirements.txt');
50
+ if (await fileExists(reqPath)) {
51
+ result.pythonRequirements = await readFileContent(reqPath);
52
+ }
53
+ const cargoPath = path.join(repoPath, 'Cargo.toml');
54
+ if (await fileExists(cargoPath)) {
55
+ result.cargoToml = await readFileContent(cargoPath);
56
+ }
57
+ const goModPath = path.join(repoPath, 'go.mod');
58
+ if (await fileExists(goModPath)) {
59
+ result.goMod = await readFileContent(goModPath);
60
+ }
61
+ return result;
62
+ }
63
+ async function fetchRemoteRepo(owner, repo, branch) {
64
+ const githubMeta = await fetchGitHubMeta(owner, repo);
65
+ const treeEntries = await fetchGitHubTree(owner, repo, branch);
66
+ const tmpDir = path.join(os.tmpdir(), `readme-ai-${owner}-${repo}-${Date.now()}`);
67
+ await fs.mkdir(tmpDir, { recursive: true });
68
+ // Filter to source files and important configs, limit count
69
+ const prioritized = treeEntries
70
+ .filter(entry => {
71
+ const ext = getFileExtension(entry.path);
72
+ const name = entry.path.split('/').pop() || '';
73
+ return SOURCE_EXTENSIONS.has(ext) ||
74
+ name === 'package.json' ||
75
+ name === 'requirements.txt' ||
76
+ name === 'Cargo.toml' ||
77
+ name === 'go.mod' ||
78
+ name === 'pyproject.toml' ||
79
+ name === 'Dockerfile' ||
80
+ name === 'Makefile';
81
+ })
82
+ .sort((a, b) => {
83
+ // Prioritize entry points and configs
84
+ const aEntry = isEntryPoint(a.path) ? 0 : 1;
85
+ const bEntry = isEntryPoint(b.path) ? 0 : 1;
86
+ if (aEntry !== bEntry)
87
+ return aEntry - bEntry;
88
+ // Then by path depth (shallower first)
89
+ return a.path.split('/').length - b.path.split('/').length;
90
+ })
91
+ .slice(0, MAX_REMOTE_FILES);
92
+ // Download files in parallel batches
93
+ const batchSize = 10;
94
+ for (let i = 0; i < prioritized.length; i += batchSize) {
95
+ const batch = prioritized.slice(i, i + batchSize);
96
+ await Promise.all(batch.map(async (entry) => {
97
+ try {
98
+ const content = await fetchGitHubFileContent(owner, repo, entry.path, branch);
99
+ const filePath = path.join(tmpDir, entry.path);
100
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
101
+ await fs.writeFile(filePath, content, 'utf-8');
102
+ }
103
+ catch {
104
+ // Skip files that fail to download
105
+ }
106
+ }));
107
+ }
108
+ const files = prioritized.map(entry => ({
109
+ path: entry.path,
110
+ absolutePath: path.join(tmpDir, entry.path),
111
+ language: detectLanguage(entry.path),
112
+ size: entry.size,
113
+ isEntryPoint: isEntryPoint(entry.path),
114
+ isConfig: isConfigFile(entry.path),
115
+ isTest: isTestFile(entry.path),
116
+ }));
117
+ const result = {
118
+ path: tmpDir,
119
+ isRemote: true,
120
+ files,
121
+ githubMeta,
122
+ };
123
+ // Parse package.json if downloaded
124
+ const pkgFile = files.find(f => f.path === 'package.json');
125
+ if (pkgFile) {
126
+ try {
127
+ const content = await readFileContent(pkgFile.absolutePath);
128
+ result.packageJson = JSON.parse(content);
129
+ }
130
+ catch { /* ignore */ }
131
+ }
132
+ return result;
133
+ }
134
+ //# sourceMappingURL=repo-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-fetcher.js","sourceRoot":"","sources":["../../src/analyzers/repo-fetcher.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function runCLI(): Promise<void>;
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAIA,wBAAsB,MAAM,kBAwD3B"}
package/dist/cli.js ADDED
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import { input, select, checkbox } from '@inquirer/prompts';
3
+ import { runGenerate } from './commands/generate.js';
4
+ export async function runCLI() {
5
+ console.log(chalk.cyan.bold('\n✨ readme-ai — Let\'s generate your README\n'));
6
+ const repoPath = await input({
7
+ message: 'Path to your project (or GitHub URL):',
8
+ default: '.',
9
+ });
10
+ const provider = await select({
11
+ message: 'Choose your AI provider:',
12
+ choices: [
13
+ { name: '🟣 Claude (Anthropic) — Recommended', value: 'anthropic' },
14
+ { name: '🟢 GPT-4o-mini (OpenAI)', value: 'openai' },
15
+ { name: '🔵 Gemini Flash (Google)', value: 'gemini' },
16
+ { name: '⚪ Ollama (100% local, free)', value: 'ollama' },
17
+ ],
18
+ });
19
+ const theme = await select({
20
+ message: 'Choose README theme:',
21
+ choices: [
22
+ { name: '📄 Default — Clean & professional', value: 'default' },
23
+ { name: '⚡ Modern — Emoji-rich with colorful badges', value: 'modern' },
24
+ { name: '🖤 Hacker — Terminal/dark ASCII aesthetic', value: 'hacker' },
25
+ { name: '🪶 Minimal — No emojis, pure markdown', value: 'minimal' },
26
+ { name: '🎓 Academic — Formal, citation style', value: 'academic' },
27
+ ],
28
+ });
29
+ const options = await checkbox({
30
+ message: 'What to include:',
31
+ choices: [
32
+ { name: '🏗️ Architecture diagram (Mermaid)', value: 'diagram', checked: true },
33
+ { name: '🏷️ Auto-generated badges', value: 'badges', checked: true },
34
+ { name: '📚 API documentation', value: 'apiDocs', checked: true },
35
+ { name: '🔄 GitHub Action for auto-updates', value: 'action', checked: false },
36
+ ],
37
+ });
38
+ const context = await input({
39
+ message: 'Any additional context for the AI? (optional):',
40
+ default: '',
41
+ });
42
+ const optionsSet = new Set(options);
43
+ await runGenerate({
44
+ repo: repoPath,
45
+ provider,
46
+ theme,
47
+ context: context || undefined,
48
+ diagram: optionsSet.has('diagram'),
49
+ badges: optionsSet.has('badges'),
50
+ apiDocs: optionsSet.has('apiDocs'),
51
+ action: optionsSet.has('action'),
52
+ });
53
+ }
54
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;QAC3B,OAAO,EAAE,uCAAuC;QAChD,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,WAAW,EAAE;YACnE,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,QAAQ,EAAE;YACpD,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,QAAQ,EAAE;YACrD,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,QAAQ,EAAE;SACzD;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;QACzB,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,SAAS,EAAE;YAC/D,EAAE,IAAI,EAAE,4CAA4C,EAAE,KAAK,EAAE,QAAQ,EAAE;YACvE,EAAE,IAAI,EAAE,2CAA2C,EAAE,KAAK,EAAE,QAAQ,EAAE;YACtE,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,SAAS,EAAE;YACnE,EAAE,IAAI,EAAE,sCAAsC,EAAE,KAAK,EAAE,UAAU,EAAE;SACpE;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;QAC7B,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;YAChF,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;YACtE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;YACjE,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;SAC/E;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;QAC1B,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAEpC,MAAM,WAAW,CAAC;QAChB,IAAI,EAAE,QAAQ;QACd,QAAQ;QACR,KAAK;QACL,OAAO,EAAE,OAAO,IAAI,SAAS;QAC7B,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface GenerateOptions {
2
+ repo: string;
3
+ output?: string;
4
+ provider?: string;
5
+ model?: string;
6
+ theme?: string;
7
+ diagram?: boolean;
8
+ badges?: boolean;
9
+ apiDocs?: boolean;
10
+ interactive?: boolean;
11
+ action?: boolean;
12
+ overwrite?: boolean;
13
+ dryRun?: boolean;
14
+ context?: string;
15
+ }
16
+ export declare function runGenerate(opts: GenerateOptions): Promise<void>;
17
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,iBAiJtD"}
@@ -0,0 +1,189 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { confirm } from '@inquirer/prompts';
6
+ import { fetchRepo } from '../analyzers/repo-fetcher.js';
7
+ import { scanFiles } from '../analyzers/file-scanner.js';
8
+ import { analyzeDependencies } from '../analyzers/dependency-analyzer.js';
9
+ import { analyzeCode } from '../analyzers/code-analyzer.js';
10
+ import { generateBadges, formatBadgeRow } from '../analyzers/badge-generator.js';
11
+ import { buildDiagram } from '../analyzers/diagram-builder.js';
12
+ import { createProvider } from '../providers/index.js';
13
+ import { generateOverview } from '../generators/overview.js';
14
+ import { generateInstallSection } from '../generators/install.js';
15
+ import { generateUsageSection, generateAPIDocs } from '../generators/usage.js';
16
+ import { generateContributing, getLicense } from '../generators/contributing.js';
17
+ import { getTheme } from '../themes/index.js';
18
+ import { fileExists } from '../utils/file-utils.js';
19
+ export async function runGenerate(opts) {
20
+ const spinner = ora();
21
+ const startTime = Date.now();
22
+ try {
23
+ // ─── PHASE 1: FETCH ──────────────────────────────────────────────
24
+ spinner.start('Fetching repository...');
25
+ const repoContent = await fetchRepo(opts.repo);
26
+ spinner.succeed(`Repository loaded: ${repoContent.files.length} files`);
27
+ // ─── PHASE 2: ANALYZE ────────────────────────────────────────────
28
+ spinner.start('Scanning file structure...');
29
+ const scan = await scanFiles(repoContent);
30
+ const langInfo = scan.languages[0]?.name || 'Unknown';
31
+ const fwInfo = scan.frameworks.length > 0 ? ` with ${scan.frameworks.join(', ')}` : '';
32
+ spinner.succeed(`Detected: ${langInfo} project${fwInfo}`);
33
+ spinner.start('Analyzing code...');
34
+ const codeAnalysis = await analyzeCode(scan.keyFiles);
35
+ spinner.succeed(`Found ${codeAnalysis.apiEndpoints.length} endpoints, ` +
36
+ `${codeAnalysis.mainFunctions.length} key functions`);
37
+ spinner.start('Analyzing dependencies...');
38
+ const deps = await analyzeDependencies(repoContent);
39
+ spinner.succeed(`Package manager: ${deps.packageManager || 'None detected'}`);
40
+ // ─── PHASE 3: GENERATE WITH AI ───────────────────────────────────
41
+ const provider = await createProvider(opts.provider || 'anthropic', opts.model);
42
+ spinner.start('Generating project overview with AI...');
43
+ const existingDescription = repoContent.packageJson
44
+ ? repoContent.packageJson.description
45
+ : repoContent.githubMeta?.description || undefined;
46
+ const overview = await generateOverview({
47
+ scan,
48
+ deps,
49
+ codeAnalysis,
50
+ provider,
51
+ existingDescription,
52
+ userContext: opts.context,
53
+ });
54
+ spinner.succeed('Overview generated');
55
+ let diagram = null;
56
+ if (opts.diagram !== false) {
57
+ spinner.start('Building architecture diagram...');
58
+ diagram = await buildDiagram(scan, codeAnalysis, deps, provider);
59
+ spinner.succeed('Architecture diagram created');
60
+ }
61
+ spinner.start('Generating installation instructions...');
62
+ const installSection = generateInstallSection(deps, scan);
63
+ spinner.succeed('Installation section ready');
64
+ spinner.start('Generating usage examples...');
65
+ const usageSection = await generateUsageSection({ codeAnalysis, scan, deps, provider });
66
+ spinner.succeed(`${usageSection.examples.length} usage examples generated`);
67
+ let apiDocs = null;
68
+ if (opts.apiDocs !== false && codeAnalysis.exports.length > 0) {
69
+ spinner.start('Generating API documentation...');
70
+ apiDocs = await generateAPIDocs({ codeAnalysis, provider });
71
+ spinner.succeed(`API docs generated for ${apiDocs.entries.length} exports`);
72
+ }
73
+ // ─── PHASE 4: RENDER ─────────────────────────────────────────────
74
+ let badgeRow = '';
75
+ if (opts.badges !== false) {
76
+ spinner.start('Generating badges...');
77
+ const badges = generateBadges(scan, deps, repoContent.githubMeta);
78
+ badgeRow = formatBadgeRow(badges);
79
+ spinner.succeed(`${badges.length} badges generated`);
80
+ }
81
+ const themeName = opts.theme || 'default';
82
+ spinner.start(`Rendering ${themeName} theme...`);
83
+ const theme = getTheme(themeName);
84
+ const projectName = getProjectName(repoContent);
85
+ const readme = theme.render({
86
+ projectName,
87
+ tagline: overview.tagline,
88
+ badgeRow,
89
+ description: overview.description,
90
+ diagram,
91
+ keyFeatures: overview.keyFeatures,
92
+ useCases: overview.useCases,
93
+ installSection,
94
+ usageSection,
95
+ apiDocs,
96
+ contributingSection: generateContributing(scan, deps),
97
+ license: getLicense(scan),
98
+ directoryTree: scan.directoryTree,
99
+ });
100
+ spinner.succeed('README rendered');
101
+ // ─── PHASE 5: OUTPUT ─────────────────────────────────────────────
102
+ if (opts.dryRun) {
103
+ console.log('\n' + readme);
104
+ return;
105
+ }
106
+ const outputFile = opts.output || 'README.md';
107
+ const outputPath = path.resolve(repoContent.isRemote ? '.' : repoContent.path, outputFile);
108
+ if (await fileExists(outputPath) && !opts.overwrite) {
109
+ const shouldOverwrite = await confirm({
110
+ message: `${outputFile} already exists. Overwrite?`,
111
+ });
112
+ if (!shouldOverwrite) {
113
+ console.log(chalk.yellow('Aborted.'));
114
+ return;
115
+ }
116
+ }
117
+ await fs.writeFile(outputPath, readme, 'utf-8');
118
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
119
+ const sizeKB = (Buffer.byteLength(readme) / 1024).toFixed(1);
120
+ console.log(`
121
+ ${chalk.green('✓')} README generated successfully!
122
+
123
+ ${chalk.bold('Output:')} ${outputPath}
124
+ ${chalk.bold('Theme:')} ${themeName}
125
+ ${chalk.bold('Size:')} ${sizeKB} KB
126
+ ${chalk.bold('Time:')} ${elapsed}s
127
+
128
+ ${chalk.dim('Preview: https://markdownlivepreview.com')}
129
+ `);
130
+ // Optionally generate GitHub Action
131
+ if (opts.action) {
132
+ await generateGitHubAction(repoContent.isRemote ? '.' : repoContent.path);
133
+ console.log(`${chalk.green('✓')} GitHub Action created: .github/workflows/readme-update.yml`);
134
+ }
135
+ }
136
+ catch (error) {
137
+ spinner.fail(error.message);
138
+ process.exit(1);
139
+ }
140
+ }
141
+ function getProjectName(repo) {
142
+ if (repo.githubMeta)
143
+ return repo.githubMeta.repo;
144
+ if (repo.packageJson?.name)
145
+ return repo.packageJson.name;
146
+ return path.basename(path.resolve(repo.path));
147
+ }
148
+ async function generateGitHubAction(repoPath) {
149
+ const actionContent = `# .github/workflows/readme-update.yml
150
+ # Generated by readme-ai — https://github.com/malikasadjaved/readme-ai
151
+ # This action auto-regenerates your README on every push to main
152
+
153
+ name: Update README
154
+
155
+ on:
156
+ push:
157
+ branches: [main, master]
158
+ paths-ignore:
159
+ - 'README.md'
160
+
161
+ jobs:
162
+ update-readme:
163
+ runs-on: ubuntu-latest
164
+ permissions:
165
+ contents: write
166
+
167
+ steps:
168
+ - uses: actions/checkout@v4
169
+
170
+ - uses: actions/setup-node@v4
171
+ with:
172
+ node-version: '20'
173
+
174
+ - name: Generate README
175
+ run: npx readme-ai@latest --overwrite
176
+ env:
177
+ ANTHROPIC_API_KEY: \${{ secrets.ANTHROPIC_API_KEY }}
178
+
179
+ - name: Commit updated README
180
+ uses: stefanzweifel/git-auto-commit-action@v5
181
+ with:
182
+ commit_message: 'docs: auto-update README [skip ci]'
183
+ file_pattern: README.md
184
+ `;
185
+ const actionDir = path.join(repoPath, '.github', 'workflows');
186
+ await fs.mkdir(actionDir, { recursive: true });
187
+ await fs.writeFile(path.join(actionDir, 'readme-update.yml'), actionContent, 'utf-8');
188
+ }
189
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import Conf from 'conf';
2
+ export interface ReadmeAIConfig {
3
+ provider: 'anthropic' | 'openai' | 'gemini' | 'ollama';
4
+ model?: string;
5
+ anthropic_api_key?: string;
6
+ openai_api_key?: string;
7
+ gemini_api_key?: string;
8
+ ollama_url?: string;
9
+ github_token?: string;
10
+ default_theme?: string;
11
+ default_output?: string;
12
+ }
13
+ export declare const config: Conf<ReadmeAIConfig>;
14
+ export declare function getAPIKey(provider: string): string | undefined;
15
+ export declare function getGitHubToken(): string | undefined;
16
+ export declare function getOllamaURL(): string;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,MAAM,sBAOjB,CAAC;AAEH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW9D;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}