@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.
- package/LICENSE +21 -0
- package/README.md +309 -0
- package/dist/analyzers/badge-generator.d.ts +12 -0
- package/dist/analyzers/badge-generator.d.ts.map +1 -0
- package/dist/analyzers/badge-generator.js +139 -0
- package/dist/analyzers/badge-generator.js.map +1 -0
- package/dist/analyzers/code-analyzer.d.ts +34 -0
- package/dist/analyzers/code-analyzer.d.ts.map +1 -0
- package/dist/analyzers/code-analyzer.js +210 -0
- package/dist/analyzers/code-analyzer.js.map +1 -0
- package/dist/analyzers/dependency-analyzer.d.ts +16 -0
- package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/analyzers/dependency-analyzer.js +169 -0
- package/dist/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/analyzers/diagram-builder.d.ts +11 -0
- package/dist/analyzers/diagram-builder.d.ts.map +1 -0
- package/dist/analyzers/diagram-builder.js +163 -0
- package/dist/analyzers/diagram-builder.js.map +1 -0
- package/dist/analyzers/file-scanner.d.ts +17 -0
- package/dist/analyzers/file-scanner.d.ts.map +1 -0
- package/dist/analyzers/file-scanner.js +103 -0
- package/dist/analyzers/file-scanner.js.map +1 -0
- package/dist/analyzers/index.d.ts +7 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +7 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/repo-fetcher.d.ts +22 -0
- package/dist/analyzers/repo-fetcher.d.ts.map +1 -0
- package/dist/analyzers/repo-fetcher.js +134 -0
- package/dist/analyzers/repo-fetcher.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/generate.d.ts +17 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +189 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/generators/changelog.d.ts +7 -0
- package/dist/generators/changelog.d.ts.map +1 -0
- package/dist/generators/changelog.js +15 -0
- package/dist/generators/changelog.js.map +1 -0
- package/dist/generators/contributing.d.ts +5 -0
- package/dist/generators/contributing.d.ts.map +1 -0
- package/dist/generators/contributing.js +28 -0
- package/dist/generators/contributing.js.map +1 -0
- package/dist/generators/index.d.ts +6 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +6 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/install.d.ts +14 -0
- package/dist/generators/install.d.ts.map +1 -0
- package/dist/generators/install.js +95 -0
- package/dist/generators/install.js.map +1 -0
- package/dist/generators/overview.d.ts +20 -0
- package/dist/generators/overview.d.ts.map +1 -0
- package/dist/generators/overview.js +87 -0
- package/dist/generators/overview.js.map +1 -0
- package/dist/generators/usage.d.ts +33 -0
- package/dist/generators/usage.d.ts.map +1 -0
- package/dist/generators/usage.js +130 -0
- package/dist/generators/usage.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +47 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +3 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +28 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +24 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +3 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +46 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +40 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/themes/academic.d.ts +3 -0
- package/dist/themes/academic.d.ts.map +1 -0
- package/dist/themes/academic.js +113 -0
- package/dist/themes/academic.js.map +1 -0
- package/dist/themes/default.d.ts +3 -0
- package/dist/themes/default.d.ts.map +1 -0
- package/dist/themes/default.js +114 -0
- package/dist/themes/default.js.map +1 -0
- package/dist/themes/hacker.d.ts +3 -0
- package/dist/themes/hacker.d.ts.map +1 -0
- package/dist/themes/hacker.js +100 -0
- package/dist/themes/hacker.js.map +1 -0
- package/dist/themes/index.d.ts +26 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +23 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/minimal.d.ts +3 -0
- package/dist/themes/minimal.d.ts.map +1 -0
- package/dist/themes/minimal.js +85 -0
- package/dist/themes/minimal.js.map +1 -0
- package/dist/themes/modern.d.ts +3 -0
- package/dist/themes/modern.d.ts.map +1 -0
- package/dist/themes/modern.js +114 -0
- package/dist/themes/modern.js.map +1 -0
- package/dist/utils/file-utils.d.ts +9 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +93 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/github-api.d.ts +27 -0
- package/dist/utils/github-api.d.ts.map +1 -0
- package/dist/utils/github-api.js +68 -0
- package/dist/utils/github-api.js.map +1 -0
- package/dist/utils/language-detector.d.ts +18 -0
- package/dist/utils/language-detector.d.ts.map +1 -0
- package/dist/utils/language-detector.js +139 -0
- package/dist/utils/language-detector.js.map +1 -0
- package/dist/utils/markdown-writer.d.ts +5 -0
- package/dist/utils/markdown-writer.d.ts.map +1 -0
- package/dist/utils/markdown-writer.js +19 -0
- package/dist/utils/markdown-writer.js.map +1 -0
- package/dist/utils/template-engine.d.ts +9 -0
- package/dist/utils/template-engine.d.ts.map +1 -0
- package/dist/utils/template-engine.js +29 -0
- package/dist/utils/template-engine.js.map +1 -0
- package/package.json +60 -0
- package/templates/.readmeaiignore.example +41 -0
- 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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|