@ragul1233332/docpilot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +147 -0
- package/dist/ai/anthropic.provider.d.ts +9 -0
- package/dist/ai/anthropic.provider.d.ts.map +1 -0
- package/dist/ai/anthropic.provider.js +54 -0
- package/dist/ai/anthropic.provider.js.map +1 -0
- package/dist/ai/openai.provider.d.ts +9 -0
- package/dist/ai/openai.provider.d.ts.map +1 -0
- package/dist/ai/openai.provider.js +53 -0
- package/dist/ai/openai.provider.js.map +1 -0
- package/dist/ai/prompts.d.ts +4 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +199 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/provider.d.ts +4 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +13 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/template.provider.d.ts +7 -0
- package/dist/ai/template.provider.d.ts.map +1 -0
- package/dist/ai/template.provider.js +19 -0
- package/dist/ai/template.provider.js.map +1 -0
- package/dist/cli/commands/changelog.d.ts +3 -0
- package/dist/cli/commands/changelog.d.ts.map +1 -0
- package/dist/cli/commands/changelog.js +118 -0
- package/dist/cli/commands/changelog.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +109 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +82 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +140 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/score.d.ts +13 -0
- package/dist/cli/commands/score.d.ts.map +1 -0
- package/dist/cli/commands/score.js +153 -0
- package/dist/cli/commands/score.js.map +1 -0
- package/dist/cli/commands/suggest.d.ts +3 -0
- package/dist/cli/commands/suggest.d.ts.map +1 -0
- package/dist/cli/commands/suggest.js +72 -0
- package/dist/cli/commands/suggest.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +120 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +63 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +76 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/constants.d.ts +22 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +201 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +48 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/registry.d.ts +21 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +99 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/schemas.d.ts +170 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +43 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/types.d.ts +246 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/index.d.ts +9 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +181 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/sections/api-docs.d.ts +3 -0
- package/dist/generators/sections/api-docs.d.ts.map +1 -0
- package/dist/generators/sections/api-docs.js +39 -0
- package/dist/generators/sections/api-docs.js.map +1 -0
- package/dist/generators/sections/contributing.d.ts +3 -0
- package/dist/generators/sections/contributing.d.ts.map +1 -0
- package/dist/generators/sections/contributing.js +24 -0
- package/dist/generators/sections/contributing.js.map +1 -0
- package/dist/generators/sections/deployment.d.ts +3 -0
- package/dist/generators/sections/deployment.d.ts.map +1 -0
- package/dist/generators/sections/deployment.js +30 -0
- package/dist/generators/sections/deployment.js.map +1 -0
- package/dist/generators/sections/env-vars.d.ts +3 -0
- package/dist/generators/sections/env-vars.d.ts.map +1 -0
- package/dist/generators/sections/env-vars.js +18 -0
- package/dist/generators/sections/env-vars.js.map +1 -0
- package/dist/generators/sections/features.d.ts +4 -0
- package/dist/generators/sections/features.d.ts.map +1 -0
- package/dist/generators/sections/features.js +34 -0
- package/dist/generators/sections/features.js.map +1 -0
- package/dist/generators/sections/folder-tree.d.ts +3 -0
- package/dist/generators/sections/folder-tree.d.ts.map +1 -0
- package/dist/generators/sections/folder-tree.js +43 -0
- package/dist/generators/sections/folder-tree.js.map +1 -0
- package/dist/generators/sections/installation.d.ts +4 -0
- package/dist/generators/sections/installation.d.ts.map +1 -0
- package/dist/generators/sections/installation.js +33 -0
- package/dist/generators/sections/installation.js.map +1 -0
- package/dist/generators/sections/license.d.ts +3 -0
- package/dist/generators/sections/license.d.ts.map +1 -0
- package/dist/generators/sections/license.js +13 -0
- package/dist/generators/sections/license.js.map +1 -0
- package/dist/generators/sections/overview.d.ts +4 -0
- package/dist/generators/sections/overview.d.ts.map +1 -0
- package/dist/generators/sections/overview.js +39 -0
- package/dist/generators/sections/overview.js.map +1 -0
- package/dist/generators/sections/scripts.d.ts +3 -0
- package/dist/generators/sections/scripts.d.ts.map +1 -0
- package/dist/generators/sections/scripts.js +18 -0
- package/dist/generators/sections/scripts.js.map +1 -0
- package/dist/generators/sections/tech-stack.d.ts +4 -0
- package/dist/generators/sections/tech-stack.d.ts.map +1 -0
- package/dist/generators/sections/tech-stack.js +31 -0
- package/dist/generators/sections/tech-stack.js.map +1 -0
- package/dist/generators/sections/types.d.ts +13 -0
- package/dist/generators/sections/types.d.ts.map +1 -0
- package/dist/generators/sections/types.js +2 -0
- package/dist/generators/sections/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/scanners/base.d.ts +11 -0
- package/dist/scanners/base.d.ts.map +1 -0
- package/dist/scanners/base.js +7 -0
- package/dist/scanners/base.js.map +1 -0
- package/dist/scanners/config-file.scanner.d.ts +11 -0
- package/dist/scanners/config-file.scanner.d.ts.map +1 -0
- package/dist/scanners/config-file.scanner.js +94 -0
- package/dist/scanners/config-file.scanner.js.map +1 -0
- package/dist/scanners/env-var.scanner.d.ts +13 -0
- package/dist/scanners/env-var.scanner.d.ts.map +1 -0
- package/dist/scanners/env-var.scanner.js +144 -0
- package/dist/scanners/env-var.scanner.js.map +1 -0
- package/dist/scanners/folder-tree.scanner.d.ts +13 -0
- package/dist/scanners/folder-tree.scanner.d.ts.map +1 -0
- package/dist/scanners/folder-tree.scanner.js +74 -0
- package/dist/scanners/folder-tree.scanner.js.map +1 -0
- package/dist/scanners/framework.d.ts +12 -0
- package/dist/scanners/framework.d.ts.map +1 -0
- package/dist/scanners/framework.js +71 -0
- package/dist/scanners/framework.js.map +1 -0
- package/dist/scanners/git.scanner.d.ts +11 -0
- package/dist/scanners/git.scanner.d.ts.map +1 -0
- package/dist/scanners/git.scanner.js +92 -0
- package/dist/scanners/git.scanner.js.map +1 -0
- package/dist/scanners/index.d.ts +10 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +29 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/package.scanner.d.ts +11 -0
- package/dist/scanners/package.scanner.d.ts.map +1 -0
- package/dist/scanners/package.scanner.js +70 -0
- package/dist/scanners/package.scanner.js.map +1 -0
- package/dist/scanners/script.scanner.d.ts +12 -0
- package/dist/scanners/script.scanner.d.ts.map +1 -0
- package/dist/scanners/script.scanner.js +105 -0
- package/dist/scanners/script.scanner.js.map +1 -0
- package/dist/utils/files.d.ts +12 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +86 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +63 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +10 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +153 -0
- package/dist/utils/markdown.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import { loadConfig, setCachedConfig } from '../../config/index.js';
|
|
4
|
+
import { logSuccess, logWarning, createSpinner } from '../../utils/logger.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// DocPilot — `changelog` Command
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export function registerChangelogCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('changelog')
|
|
11
|
+
.description('Generate a changelog from git commit history')
|
|
12
|
+
.option('--from <tag>', 'Starting git tag or commit')
|
|
13
|
+
.option('--to <tag>', 'Ending git tag or commit')
|
|
14
|
+
.option('-o, --output <path>', 'Output path for CHANGELOG.md')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
const config = await loadConfig(cwd);
|
|
18
|
+
setCachedConfig(config);
|
|
19
|
+
const spinner = createSpinner('Generating changelog from git history...');
|
|
20
|
+
spinner.start();
|
|
21
|
+
try {
|
|
22
|
+
const changelog = await generateChangelog(cwd, options.from, options.to);
|
|
23
|
+
const outputPath = options.output
|
|
24
|
+
? path.resolve(cwd, options.output)
|
|
25
|
+
: path.resolve(cwd, 'CHANGELOG.md');
|
|
26
|
+
const fs = await import('node:fs/promises');
|
|
27
|
+
await fs.writeFile(outputPath, changelog, 'utf-8');
|
|
28
|
+
spinner.succeed();
|
|
29
|
+
logSuccess(`Changelog written to ${outputPath}`);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
spinner.fail();
|
|
33
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
34
|
+
logWarning(`Failed to generate changelog: ${message}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function generateChangelog(cwd, from, to) {
|
|
39
|
+
// Get git log
|
|
40
|
+
const range = from ? `${from}..${to || 'HEAD'}` : '';
|
|
41
|
+
const args = ['log', '--format=%H|%an|%ai|%s', '--no-merges'];
|
|
42
|
+
if (range)
|
|
43
|
+
args.push(range);
|
|
44
|
+
const { stdout } = await execa('git', args, { cwd, timeout: 10000 });
|
|
45
|
+
if (!stdout) {
|
|
46
|
+
throw new Error('No git commits found.');
|
|
47
|
+
}
|
|
48
|
+
const commits = stdout.split('\n')
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.map(line => {
|
|
51
|
+
const [hash, author, date, ...msgParts] = line.split('|');
|
|
52
|
+
const message = msgParts.join('|') || '';
|
|
53
|
+
const type = parseCommitType(message);
|
|
54
|
+
return { hash: hash?.slice(0, 7), author, date: date?.slice(0, 10), message, type };
|
|
55
|
+
});
|
|
56
|
+
// Group by type
|
|
57
|
+
const groups = {
|
|
58
|
+
'🚀 Features': [],
|
|
59
|
+
'🐛 Bug Fixes': [],
|
|
60
|
+
'📚 Documentation': [],
|
|
61
|
+
'♻️ Refactors': [],
|
|
62
|
+
'🧪 Tests': [],
|
|
63
|
+
'🔧 Chores': [],
|
|
64
|
+
'📦 Other': [],
|
|
65
|
+
};
|
|
66
|
+
for (const commit of commits) {
|
|
67
|
+
const group = commit.type ? getGroupName(commit.type) : '📦 Other';
|
|
68
|
+
if (!groups[group])
|
|
69
|
+
groups[group] = [];
|
|
70
|
+
groups[group].push({ hash: commit.hash, message: commit.message });
|
|
71
|
+
}
|
|
72
|
+
// Build changelog
|
|
73
|
+
const parts = [
|
|
74
|
+
'# Changelog',
|
|
75
|
+
'',
|
|
76
|
+
`## [${new Date().toISOString().slice(0, 10)}]`,
|
|
77
|
+
'',
|
|
78
|
+
];
|
|
79
|
+
for (const [group, items] of Object.entries(groups)) {
|
|
80
|
+
if (items.length === 0)
|
|
81
|
+
continue;
|
|
82
|
+
parts.push(`### ${group}`);
|
|
83
|
+
parts.push('');
|
|
84
|
+
for (const item of items) {
|
|
85
|
+
const cleanMsg = item.message.replace(/^(feat|fix|docs|refactor|test|chore)[:(]?\s*/i, '').trim();
|
|
86
|
+
parts.push(`- ${cleanMsg} (${item.hash})`);
|
|
87
|
+
}
|
|
88
|
+
parts.push('');
|
|
89
|
+
}
|
|
90
|
+
return parts.join('\n');
|
|
91
|
+
}
|
|
92
|
+
function parseCommitType(message) {
|
|
93
|
+
if (/^feat/i.test(message))
|
|
94
|
+
return 'feat';
|
|
95
|
+
if (/^fix/i.test(message))
|
|
96
|
+
return 'fix';
|
|
97
|
+
if (/^docs/i.test(message))
|
|
98
|
+
return 'docs';
|
|
99
|
+
if (/^refactor/i.test(message))
|
|
100
|
+
return 'refactor';
|
|
101
|
+
if (/^test/i.test(message))
|
|
102
|
+
return 'test';
|
|
103
|
+
if (/^chore/i.test(message))
|
|
104
|
+
return 'chore';
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
function getGroupName(type) {
|
|
108
|
+
const map = {
|
|
109
|
+
feat: '🚀 Features',
|
|
110
|
+
fix: '🐛 Bug Fixes',
|
|
111
|
+
docs: '📚 Documentation',
|
|
112
|
+
refactor: '♻️ Refactors',
|
|
113
|
+
test: '🧪 Tests',
|
|
114
|
+
chore: '🔧 Chores',
|
|
115
|
+
};
|
|
116
|
+
return map[type] || '📦 Other';
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=changelog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../../src/cli/commands/changelog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC5D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { loadConfig, setCachedConfig } from '../../config/index.js';
|
|
3
|
+
import { fileExists } from '../../utils/files.js';
|
|
4
|
+
import { logSection, logSuccess, logWarning, logError, formatKeyValue } from '../../utils/logger.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// DocPilot — `doctor` Command (Project Health Check)
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export function registerDoctorCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('doctor')
|
|
11
|
+
.description('Check project health — package.json, configs, Docker, CI, README')
|
|
12
|
+
.action(async () => {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const config = await loadConfig(cwd);
|
|
15
|
+
setCachedConfig(config);
|
|
16
|
+
const checks = await runHealthChecks(cwd);
|
|
17
|
+
logSection('DocPilot Doctor — Project Health Check');
|
|
18
|
+
let passCount = 0;
|
|
19
|
+
let warnCount = 0;
|
|
20
|
+
let failCount = 0;
|
|
21
|
+
for (const check of checks) {
|
|
22
|
+
const icon = check.status === 'pass' ? '✓' : check.status === 'warn' ? '⚠' : '✗';
|
|
23
|
+
const color = check.status === 'pass' ? logSuccess : check.status === 'warn' ? logWarning : logError;
|
|
24
|
+
color(`${icon} ${check.message}`);
|
|
25
|
+
if (check.status === 'pass')
|
|
26
|
+
passCount++;
|
|
27
|
+
else if (check.status === 'warn')
|
|
28
|
+
warnCount++;
|
|
29
|
+
else
|
|
30
|
+
failCount++;
|
|
31
|
+
}
|
|
32
|
+
console.log('');
|
|
33
|
+
logSection('Summary');
|
|
34
|
+
console.log(formatKeyValue('Passed', `${passCount}`));
|
|
35
|
+
if (warnCount > 0)
|
|
36
|
+
console.log(formatKeyValue('Warnings', `${warnCount}`));
|
|
37
|
+
if (failCount > 0)
|
|
38
|
+
console.log(formatKeyValue('Failed', `${failCount}`));
|
|
39
|
+
console.log('');
|
|
40
|
+
if (failCount === 0 && warnCount === 0) {
|
|
41
|
+
logSuccess('Project looks healthy!');
|
|
42
|
+
}
|
|
43
|
+
else if (failCount === 0) {
|
|
44
|
+
logSuccess('Project is in good shape (with minor warnings).');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
logWarning('Some issues found that need attention.');
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async function runHealthChecks(cwd) {
|
|
52
|
+
const checks = [];
|
|
53
|
+
// 1. package.json
|
|
54
|
+
const pkgExists = await fileExists(path.join(cwd, 'package.json'));
|
|
55
|
+
checks.push({
|
|
56
|
+
message: pkgExists ? 'package.json found' : 'Missing package.json',
|
|
57
|
+
status: pkgExists ? 'pass' : 'fail',
|
|
58
|
+
});
|
|
59
|
+
// 2. tsconfig.json (for TypeScript projects)
|
|
60
|
+
const tsConfigExists = await fileExists(path.join(cwd, 'tsconfig.json'));
|
|
61
|
+
if (tsConfigExists) {
|
|
62
|
+
checks.push({ message: 'tsconfig.json found', status: 'pass' });
|
|
63
|
+
}
|
|
64
|
+
// 3. README.md
|
|
65
|
+
const readmeExists = await fileExists(path.join(cwd, 'README.md'));
|
|
66
|
+
checks.push({
|
|
67
|
+
message: readmeExists ? 'README.md found' : 'README.md missing',
|
|
68
|
+
status: readmeExists ? 'pass' : 'fail',
|
|
69
|
+
});
|
|
70
|
+
// 4. .gitignore
|
|
71
|
+
const gitignoreExists = await fileExists(path.join(cwd, '.gitignore'));
|
|
72
|
+
checks.push({
|
|
73
|
+
message: gitignoreExists ? '.gitignore found' : '.gitignore missing (recommended)',
|
|
74
|
+
status: gitignoreExists ? 'pass' : 'warn',
|
|
75
|
+
});
|
|
76
|
+
// 5. .env.example
|
|
77
|
+
const envExampleExists = await fileExists(path.join(cwd, '.env.example'));
|
|
78
|
+
checks.push({
|
|
79
|
+
message: envExampleExists ? '.env.example found' : '.env.example missing (recommended)',
|
|
80
|
+
status: envExampleExists ? 'pass' : 'warn',
|
|
81
|
+
});
|
|
82
|
+
// 6. Docker
|
|
83
|
+
const dockerfileExists = await fileExists(path.join(cwd, 'Dockerfile'));
|
|
84
|
+
checks.push({
|
|
85
|
+
message: dockerfileExists ? 'Dockerfile found' : 'Dockerfile not detected',
|
|
86
|
+
status: dockerfileExists ? 'pass' : 'warn',
|
|
87
|
+
});
|
|
88
|
+
// 7. CI/CD
|
|
89
|
+
const githubActions = await fileExists(path.join(cwd, '.github/workflows'));
|
|
90
|
+
checks.push({
|
|
91
|
+
message: githubActions ? 'GitHub Actions workflows found' : 'CI/CD not detected',
|
|
92
|
+
status: githubActions ? 'pass' : 'warn',
|
|
93
|
+
});
|
|
94
|
+
// 8. License
|
|
95
|
+
const licenseExists = await fileExists(path.join(cwd, 'LICENSE'));
|
|
96
|
+
const licenseMdExists = await fileExists(path.join(cwd, 'LICENSE.md'));
|
|
97
|
+
checks.push({
|
|
98
|
+
message: (licenseExists || licenseMdExists) ? 'License file found' : 'License file missing',
|
|
99
|
+
status: (licenseExists || licenseMdExists) ? 'pass' : 'warn',
|
|
100
|
+
});
|
|
101
|
+
// 9. Git initialized
|
|
102
|
+
const gitDir = await fileExists(path.join(cwd, '.git'));
|
|
103
|
+
checks.push({
|
|
104
|
+
message: gitDir ? 'Git repository initialized' : 'Not a git repository',
|
|
105
|
+
status: gitDir ? 'pass' : 'warn',
|
|
106
|
+
});
|
|
107
|
+
return checks;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD9D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { loadConfig, setCachedConfig } from '../../config/index.js';
|
|
3
|
+
import { DocPilotRegistry } from '../../core/registry.js';
|
|
4
|
+
import { registerDefaultScanners } from '../../scanners/index.js';
|
|
5
|
+
import { readFileSafe } from '../../utils/files.js';
|
|
6
|
+
import { createSpinner } from '../../utils/logger.js';
|
|
7
|
+
import { generateReadme, writeReadme } from '../../generators/index.js';
|
|
8
|
+
import { resolveAIProvider } from '../../ai/provider.js';
|
|
9
|
+
import { DEFAULT_CONFIG } from '../../core/constants.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// DocPilot — `generate` Command
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export function registerGenerateCommand(program) {
|
|
14
|
+
program
|
|
15
|
+
.command('generate')
|
|
16
|
+
.alias('gen')
|
|
17
|
+
.description('Generate a README from project scan results')
|
|
18
|
+
.option('-o, --output <path>', 'Output path for README')
|
|
19
|
+
.option('--no-ai', 'Disable AI generation, use templates only')
|
|
20
|
+
.option('--sections <sections>', 'Comma-separated list of sections to include')
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
const config = await loadConfig(cwd);
|
|
24
|
+
setCachedConfig(config);
|
|
25
|
+
// Override output path if provided
|
|
26
|
+
if (options.output) {
|
|
27
|
+
config.readme.outputPath = options.output;
|
|
28
|
+
}
|
|
29
|
+
// Override sections if provided
|
|
30
|
+
if (options.sections) {
|
|
31
|
+
const sectionIds = options.sections.split(',').map(s => s.trim());
|
|
32
|
+
config.readme.sections = DEFAULT_CONFIG.readme.sections
|
|
33
|
+
.map(s => ({ ...s, enabled: sectionIds.includes(s.id) }));
|
|
34
|
+
}
|
|
35
|
+
// Resolve AI provider
|
|
36
|
+
let aiProvider = null;
|
|
37
|
+
if (options.ai !== false) {
|
|
38
|
+
aiProvider = await resolveAIProvider();
|
|
39
|
+
if (aiProvider) {
|
|
40
|
+
const sp = createSpinner(`AI provider: ${aiProvider.name}`);
|
|
41
|
+
sp.succeed();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Scan the project
|
|
45
|
+
const scanSpinner = createSpinner('Scanning project...');
|
|
46
|
+
scanSpinner.start();
|
|
47
|
+
const registry = new DocPilotRegistry();
|
|
48
|
+
registerDefaultScanners(registry);
|
|
49
|
+
const projectCtx = await buildProjectContext(cwd);
|
|
50
|
+
await registry.runScanners(projectCtx);
|
|
51
|
+
scanSpinner.succeed('Scan complete');
|
|
52
|
+
// Generate README
|
|
53
|
+
const readmeContent = await generateReadme(projectCtx, config, aiProvider);
|
|
54
|
+
await writeReadme(readmeContent, path.resolve(cwd, config.readme.outputPath));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async function buildProjectContext(rootPath) {
|
|
58
|
+
const pkgContent = await readFileSafe(path.join(rootPath, 'package.json'));
|
|
59
|
+
let packageJson = null;
|
|
60
|
+
if (pkgContent) {
|
|
61
|
+
try {
|
|
62
|
+
packageJson = JSON.parse(pkgContent);
|
|
63
|
+
}
|
|
64
|
+
catch { /* ignore */ }
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
rootPath,
|
|
68
|
+
packageJson,
|
|
69
|
+
gitInfo: null,
|
|
70
|
+
configFiles: [],
|
|
71
|
+
envVars: [],
|
|
72
|
+
folderTree: null,
|
|
73
|
+
scripts: [],
|
|
74
|
+
detectedFrameworks: [],
|
|
75
|
+
routes: [],
|
|
76
|
+
dockerInfo: null,
|
|
77
|
+
ciInfo: null,
|
|
78
|
+
rawScanResults: new Map(),
|
|
79
|
+
scanTimestamp: new Date(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC1D"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { loadConfig, setCachedConfig, } from '../../config/index.js';
|
|
4
|
+
import { DocPilotRegistry } from '../../core/registry.js';
|
|
5
|
+
import { registerDefaultScanners } from '../../scanners/index.js';
|
|
6
|
+
import { readFileSafe } from '../../utils/files.js';
|
|
7
|
+
import { createSpinner, logSuccess, logSection, formatKeyValue, formatList } from '../../utils/logger.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// DocPilot — `scan` Command
|
|
10
|
+
// ============================================================================
|
|
11
|
+
export function registerScanCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command('scan')
|
|
14
|
+
.description('Scan the project and detect technologies, dependencies, and structure')
|
|
15
|
+
.option('-o, --output <path>', 'Output scan results to file')
|
|
16
|
+
.option('--json', 'Output results as JSON', false)
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
const config = await loadConfig(cwd);
|
|
20
|
+
setCachedConfig(config);
|
|
21
|
+
const registry = new DocPilotRegistry();
|
|
22
|
+
registerDefaultScanners(registry);
|
|
23
|
+
const spinner = createSpinner('Scanning project...');
|
|
24
|
+
spinner.start();
|
|
25
|
+
const projectCtx = await buildProjectContext(cwd);
|
|
26
|
+
const results = await registry.runScanners(projectCtx);
|
|
27
|
+
spinner.succeed('Scan complete');
|
|
28
|
+
if (options.json || options.output) {
|
|
29
|
+
const output = JSON.stringify(Object.fromEntries(results), null, 2);
|
|
30
|
+
if (options.output) {
|
|
31
|
+
await fs.writeFile(options.output, output, 'utf-8');
|
|
32
|
+
logSuccess(`Results written to ${options.output}`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(output);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Pretty print the results
|
|
40
|
+
displayScanResults(projectCtx, results);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async function buildProjectContext(rootPath) {
|
|
44
|
+
const pkgContent = await readFileSafe(path.join(rootPath, 'package.json'));
|
|
45
|
+
let packageJson = null;
|
|
46
|
+
if (pkgContent) {
|
|
47
|
+
try {
|
|
48
|
+
packageJson = JSON.parse(pkgContent);
|
|
49
|
+
}
|
|
50
|
+
catch { /* ignore */ }
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
rootPath,
|
|
54
|
+
packageJson,
|
|
55
|
+
gitInfo: null,
|
|
56
|
+
configFiles: [],
|
|
57
|
+
envVars: [],
|
|
58
|
+
folderTree: null,
|
|
59
|
+
scripts: [],
|
|
60
|
+
detectedFrameworks: [],
|
|
61
|
+
routes: [],
|
|
62
|
+
dockerInfo: null,
|
|
63
|
+
ciInfo: null,
|
|
64
|
+
rawScanResults: new Map(),
|
|
65
|
+
scanTimestamp: new Date(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function displayScanResults(ctx, results) {
|
|
69
|
+
// Framework results
|
|
70
|
+
const frameworkResult = results.get('framework')?.data;
|
|
71
|
+
if (frameworkResult?.frameworks?.length > 0) {
|
|
72
|
+
const fws = frameworkResult.frameworks;
|
|
73
|
+
logSection('Detected Technologies');
|
|
74
|
+
const categories = new Map();
|
|
75
|
+
for (const fw of fws) {
|
|
76
|
+
const cat = fw.category || 'other';
|
|
77
|
+
if (!categories.has(cat))
|
|
78
|
+
categories.set(cat, []);
|
|
79
|
+
categories.get(cat).push({ name: fw.name, version: fw.version });
|
|
80
|
+
}
|
|
81
|
+
const catLabels = {
|
|
82
|
+
'meta-framework': 'Framework', 'frontend-framework': 'Frontend',
|
|
83
|
+
'backend-framework': 'Backend', 'database': 'Database',
|
|
84
|
+
'orm': 'ORM', 'auth': 'Auth', 'payments': 'Payments',
|
|
85
|
+
'styling': 'Styling', 'css-framework': 'CSS Framework',
|
|
86
|
+
'ui-library': 'UI Library', 'state-management': 'State Management',
|
|
87
|
+
'testing': 'Testing', 'linting': 'Linting', 'bundler': 'Bundler',
|
|
88
|
+
'runtime': 'Runtime', 'cloud': 'Cloud', 'messaging': 'Messaging',
|
|
89
|
+
'monitoring': 'Monitoring',
|
|
90
|
+
};
|
|
91
|
+
for (const [cat, items] of categories) {
|
|
92
|
+
const label = catLabels[cat] || cat;
|
|
93
|
+
const names = items.map(i => i.name + (i.version ? ` (${i.version})` : ''));
|
|
94
|
+
console.log(formatKeyValue(label, names.join(', ')));
|
|
95
|
+
}
|
|
96
|
+
console.log('');
|
|
97
|
+
}
|
|
98
|
+
// Package info
|
|
99
|
+
if (ctx.packageJson) {
|
|
100
|
+
logSection('Project Info');
|
|
101
|
+
console.log(formatKeyValue('Name', ctx.packageJson.name || '(unnamed)'));
|
|
102
|
+
console.log(formatKeyValue('Version', ctx.packageJson.version || '0.0.0'));
|
|
103
|
+
if (ctx.packageJson.description) {
|
|
104
|
+
console.log(formatKeyValue('Description', ctx.packageJson.description));
|
|
105
|
+
}
|
|
106
|
+
const deps = ctx.packageJson.dependencies ?? {};
|
|
107
|
+
const devDeps = ctx.packageJson.devDependencies ?? {};
|
|
108
|
+
console.log(formatKeyValue('Dependencies', `${Object.keys(deps).length} production, ${Object.keys(devDeps).length} development`));
|
|
109
|
+
console.log('');
|
|
110
|
+
}
|
|
111
|
+
// Config files
|
|
112
|
+
const configResult = results.get('config-file')?.data;
|
|
113
|
+
if (configResult?.configFiles?.length > 0) {
|
|
114
|
+
const files = configResult.configFiles;
|
|
115
|
+
logSection('Config Files');
|
|
116
|
+
console.log(formatList(files.map(f => f.path)));
|
|
117
|
+
console.log('');
|
|
118
|
+
}
|
|
119
|
+
// Env vars
|
|
120
|
+
const envResult = results.get('env-vars')?.data;
|
|
121
|
+
if (envResult?.envVars?.length > 0) {
|
|
122
|
+
const envs = envResult.envVars;
|
|
123
|
+
logSection('Environment Variables');
|
|
124
|
+
console.log(formatList(envs.map(e => e.name)));
|
|
125
|
+
console.log('');
|
|
126
|
+
}
|
|
127
|
+
// Git info
|
|
128
|
+
const gitResult = results.get('git')?.data;
|
|
129
|
+
if (gitResult?.isInitialized) {
|
|
130
|
+
logSection('Git Info');
|
|
131
|
+
console.log(formatKeyValue('Branch', gitResult.currentBranch || 'unknown'));
|
|
132
|
+
console.log(formatKeyValue('Commits', `${gitResult.totalCommits || 0} total`));
|
|
133
|
+
if (gitResult.contributors?.length) {
|
|
134
|
+
console.log(formatKeyValue('Contributors', `${gitResult.contributors.length}`));
|
|
135
|
+
}
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
logSuccess('Scan completed successfully');
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export declare function registerScoreCommand(program: Command): void;
|
|
3
|
+
export interface ReadmeScore {
|
|
4
|
+
total: number;
|
|
5
|
+
categories: Array<{
|
|
6
|
+
name: string;
|
|
7
|
+
score: number;
|
|
8
|
+
}>;
|
|
9
|
+
missing: string[];
|
|
10
|
+
suggestions: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function scoreReadme(content: string): ReadmeScore;
|
|
13
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/score.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgD3D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAgHxD"}
|