@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,153 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { loadConfig, setCachedConfig } from '../../config/index.js';
|
|
3
|
+
import { readFileSafe } from '../../utils/files.js';
|
|
4
|
+
import { logSection, logWarning, logInfo, formatKeyValue } from '../../utils/logger.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// DocPilot — `score` Command (README Quality Scoring)
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export function registerScoreCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('score')
|
|
11
|
+
.description('Score README quality (0-100) and identify missing sections')
|
|
12
|
+
.action(async () => {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const config = await loadConfig(cwd);
|
|
15
|
+
setCachedConfig(config);
|
|
16
|
+
const readmePath = path.resolve(cwd, config.readme.outputPath);
|
|
17
|
+
const content = await readFileSafe(readmePath);
|
|
18
|
+
if (!content) {
|
|
19
|
+
logWarning('No README found to score.');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const score = scoreReadme(content);
|
|
23
|
+
logSection('README Score');
|
|
24
|
+
const grade = score.total >= 90 ? 'A' : score.total >= 80 ? 'B' : score.total >= 70 ? 'C' : score.total >= 60 ? 'D' : 'F';
|
|
25
|
+
console.log(formatKeyValue('Overall Score', `${score.total}/100 (Grade: ${grade})`));
|
|
26
|
+
console.log('');
|
|
27
|
+
// Category scores
|
|
28
|
+
for (const category of score.categories) {
|
|
29
|
+
const icon = category.score >= 80 ? '✓' : category.score >= 50 ? '⚠' : '✗';
|
|
30
|
+
console.log(` ${icon} ${category.name}: ${category.score}/100`);
|
|
31
|
+
}
|
|
32
|
+
// Missing sections
|
|
33
|
+
if (score.missing.length > 0) {
|
|
34
|
+
console.log('');
|
|
35
|
+
logWarning('Missing or incomplete:');
|
|
36
|
+
for (const item of score.missing) {
|
|
37
|
+
console.log(` • ${item}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (score.suggestions.length > 0) {
|
|
41
|
+
console.log('');
|
|
42
|
+
logInfo('Suggestions:');
|
|
43
|
+
for (const s of score.suggestions) {
|
|
44
|
+
console.log(` • ${s}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function scoreReadme(content) {
|
|
50
|
+
const categories = [];
|
|
51
|
+
const missing = [];
|
|
52
|
+
const suggestions = [];
|
|
53
|
+
const checks = [
|
|
54
|
+
{
|
|
55
|
+
name: 'Project Name & Description',
|
|
56
|
+
check: (c) => ({
|
|
57
|
+
score: c.includes('# ') ? 100 : 0,
|
|
58
|
+
missing: c.includes('# ') ? [] : ['Project title (#)'],
|
|
59
|
+
suggestions: [],
|
|
60
|
+
}),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'Installation Guide',
|
|
64
|
+
check: (c) => ({
|
|
65
|
+
score: /install/i.test(c) ? 100 : 0,
|
|
66
|
+
missing: /install/i.test(c) ? [] : ['Installation section'],
|
|
67
|
+
suggestions: ['Add installation steps'],
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'Usage Example',
|
|
72
|
+
check: (c) => ({
|
|
73
|
+
score: /usage|example|quick start|getting started/i.test(c) ? 100 : 0,
|
|
74
|
+
missing: /usage|example|quick start|getting started/i.test(c) ? [] : ['Usage examples'],
|
|
75
|
+
suggestions: ['Add usage examples or quick start guide'],
|
|
76
|
+
}),
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'API Documentation',
|
|
80
|
+
check: (c) => ({
|
|
81
|
+
score: /api|endpoint|route/i.test(c) ? 100 : 50,
|
|
82
|
+
missing: /api|endpoint|route/i.test(c) ? [] : ['API documentation'],
|
|
83
|
+
suggestions: ['Document API endpoints if applicable'],
|
|
84
|
+
}),
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'Environment Variables',
|
|
88
|
+
check: (c) => ({
|
|
89
|
+
score: /environment|env|\.env/i.test(c) ? 100 : 50,
|
|
90
|
+
missing: /environment|env|\.env/i.test(c) ? [] : ['Environment variables documentation'],
|
|
91
|
+
suggestions: ['Document required environment variables'],
|
|
92
|
+
}),
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Contributing Guide',
|
|
96
|
+
check: (c) => ({
|
|
97
|
+
score: /contributing|contribute/i.test(c) ? 100 : 50,
|
|
98
|
+
missing: /contributing|contribute/i.test(c) ? [] : ['Contributing section'],
|
|
99
|
+
suggestions: ['Add a contributing guide'],
|
|
100
|
+
}),
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'License',
|
|
104
|
+
check: (c) => ({
|
|
105
|
+
score: /license|mit|apache|gpl/i.test(c) ? 100 : 50,
|
|
106
|
+
missing: /license|mit|apache|gpl/i.test(c) ? [] : ['License information'],
|
|
107
|
+
suggestions: ['Add license information'],
|
|
108
|
+
}),
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'Badges',
|
|
112
|
+
check: (c) => ({
|
|
113
|
+
score: /https:\/\/img\.shields\.io|badge/i.test(c) ? 100 : 50,
|
|
114
|
+
missing: /https:\/\/img\.shields\.io|badge/i.test(c) ? [] : ['Project badges'],
|
|
115
|
+
suggestions: ['Add badges (build status, version, license)'],
|
|
116
|
+
}),
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'Code Blocks',
|
|
120
|
+
check: (c) => {
|
|
121
|
+
const codeBlocks = (c.match(/```/g) || []).length / 2;
|
|
122
|
+
return {
|
|
123
|
+
score: codeBlocks >= 2 ? 100 : codeBlocks >= 1 ? 60 : 0,
|
|
124
|
+
missing: codeBlocks >= 1 ? [] : ['Code examples'],
|
|
125
|
+
suggestions: ['Add code examples to illustrate usage'],
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'Table of Contents',
|
|
131
|
+
check: (c) => ({
|
|
132
|
+
score: /table of contents|toc|## .+[\s\S]*## /i.test(c) ? 100 : 50,
|
|
133
|
+
missing: /table of contents|toc/i.test(c) ? [] : ['Table of Contents (optional)'],
|
|
134
|
+
suggestions: ['Consider adding a table of contents for longer READMEs'],
|
|
135
|
+
}),
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
for (const check of checks) {
|
|
139
|
+
const result = check.check(content);
|
|
140
|
+
const weight = 10; // each category contributes up to 10 points
|
|
141
|
+
categories.push({ name: check.name, score: result.score });
|
|
142
|
+
missing.push(...result.missing);
|
|
143
|
+
suggestions.push(...result.suggestions);
|
|
144
|
+
}
|
|
145
|
+
const total = Math.round(categories.reduce((sum, c) => sum + c.score, 0) / categories.length);
|
|
146
|
+
return {
|
|
147
|
+
total,
|
|
148
|
+
categories,
|
|
149
|
+
missing: [...new Set(missing)],
|
|
150
|
+
suggestions: [...new Set(suggestions)],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../../../src/cli/commands/score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC7D"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { loadConfig, setCachedConfig } from '../../config/index.js';
|
|
3
|
+
import { readFileSafe } from '../../utils/files.js';
|
|
4
|
+
import { logSection, logInfo, formatKeyValue } from '../../utils/logger.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// DocPilot — `suggest` Command (AI Improvement Suggestions)
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export function registerSuggestCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('suggest')
|
|
11
|
+
.description('Get AI-powered improvement suggestions for your README')
|
|
12
|
+
.action(async () => {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const config = await loadConfig(cwd);
|
|
15
|
+
setCachedConfig(config);
|
|
16
|
+
const readmePath = path.resolve(cwd, config.readme.outputPath);
|
|
17
|
+
const content = await readFileSafe(readmePath);
|
|
18
|
+
if (!content) {
|
|
19
|
+
logInfo('No README found to analyze.');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
logSection('README Improvement Suggestions');
|
|
23
|
+
const suggestions = analyzeReadme(content);
|
|
24
|
+
if (suggestions.length === 0) {
|
|
25
|
+
logInfo('Your README looks great! No major suggestions.');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
for (const suggestion of suggestions) {
|
|
29
|
+
console.log(formatKeyValue(suggestion.category, suggestion.suggestion));
|
|
30
|
+
}
|
|
31
|
+
console.log('');
|
|
32
|
+
logInfo('Tip: Use `docp generate --sections <section> --no-ai` to regenerate specific sections.');
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function analyzeReadme(content) {
|
|
36
|
+
const suggestions = [];
|
|
37
|
+
if (!content.match(/#\s.+/)) {
|
|
38
|
+
suggestions.push({ category: 'Title', suggestion: 'Add a project title using # heading' });
|
|
39
|
+
}
|
|
40
|
+
if (!content.match(/##\s+(overview|introduction|about)/i)) {
|
|
41
|
+
suggestions.push({ category: 'Overview', suggestion: 'Add an Overview section explaining what the project does' });
|
|
42
|
+
}
|
|
43
|
+
if (!content.match(/##\s+(installation|setup|getting started)/i)) {
|
|
44
|
+
suggestions.push({ category: 'Installation', suggestion: 'Add Installation instructions for developers' });
|
|
45
|
+
}
|
|
46
|
+
if (!content.match(/##\s+(usage|examples|quick start)/i)) {
|
|
47
|
+
suggestions.push({ category: 'Usage', suggestion: 'Add Usage examples to help users get started quickly' });
|
|
48
|
+
}
|
|
49
|
+
if (!content.match(/##\s+(api|endpoints|reference)/i)) {
|
|
50
|
+
suggestions.push({ category: 'API Reference', suggestion: 'Document your API endpoints with request/response examples' });
|
|
51
|
+
}
|
|
52
|
+
if (!content.match(/##\s+(env|environment|configuration)/i)) {
|
|
53
|
+
suggestions.push({ category: 'Configuration', suggestion: 'List required environment variables and configuration options' });
|
|
54
|
+
}
|
|
55
|
+
if (!content.match(/##\s+(contributing|contribute)/i)) {
|
|
56
|
+
suggestions.push({ category: 'Contributing', suggestion: 'Add a Contributing guide to attract contributors' });
|
|
57
|
+
}
|
|
58
|
+
if (!content.match(/##\s+(license|mit|apache)/i)) {
|
|
59
|
+
suggestions.push({ category: 'License', suggestion: 'Specify the project license' });
|
|
60
|
+
}
|
|
61
|
+
if (!content.match(/https:\/\/img\.shields\.io|badge/i)) {
|
|
62
|
+
suggestions.push({ category: 'Badges', suggestion: 'Add status badges (CI, version, coverage) for credibility' });
|
|
63
|
+
}
|
|
64
|
+
if (!content.match(/```/)) {
|
|
65
|
+
suggestions.push({ category: 'Code Blocks', suggestion: 'Use code blocks (```) for commands and code examples' });
|
|
66
|
+
}
|
|
67
|
+
if (content.length < 300) {
|
|
68
|
+
suggestions.push({ category: 'Length', suggestion: 'Your README is very short. Consider adding more detail.' });
|
|
69
|
+
}
|
|
70
|
+
return suggestions;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqF1D"}
|
|
@@ -0,0 +1,120 @@
|
|
|
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, logSuccess, logInfo } from '../../utils/logger.js';
|
|
7
|
+
import { generateTechStack } from '../../generators/sections/tech-stack.js';
|
|
8
|
+
import { generateEnvVars } from '../../generators/sections/env-vars.js';
|
|
9
|
+
import { writeFileSafe } from '../../utils/files.js';
|
|
10
|
+
import { resolveAIProvider } from '../../ai/provider.js';
|
|
11
|
+
import { parseReadme, updateSectionInReadme } from '../../utils/markdown.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// DocPilot — `sync` Command
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export function registerSyncCommand(program) {
|
|
16
|
+
program
|
|
17
|
+
.command('sync')
|
|
18
|
+
.description('Sync README with current project state (update sections that changed)')
|
|
19
|
+
.option('--dry-run', 'Show what would change without making changes', false)
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
const config = await loadConfig(cwd);
|
|
23
|
+
setCachedConfig(config);
|
|
24
|
+
const aiProvider = await resolveAIProvider();
|
|
25
|
+
// Scan project
|
|
26
|
+
const spinner = createSpinner('Scanning project...');
|
|
27
|
+
spinner.start();
|
|
28
|
+
const registry = new DocPilotRegistry();
|
|
29
|
+
registerDefaultScanners(registry);
|
|
30
|
+
const projectCtx = await buildProjectContext(cwd);
|
|
31
|
+
await registry.runScanners(projectCtx);
|
|
32
|
+
spinner.succeed('Scan complete');
|
|
33
|
+
// Read existing README
|
|
34
|
+
const readmePath = path.resolve(cwd, config.readme.outputPath);
|
|
35
|
+
const existingContent = await readFileSafe(readmePath);
|
|
36
|
+
if (!existingContent) {
|
|
37
|
+
logInfo('No existing README found. Run `docp generate` to create one.');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Parse existing README into sections
|
|
41
|
+
const doc = parseReadme(existingContent);
|
|
42
|
+
const scanResult = aggregateForSync(projectCtx);
|
|
43
|
+
if (!doc.hasDocpilotMarkers) {
|
|
44
|
+
logInfo('README does not have DocPilot markers. Run `docp generate` to add them.');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Find sections that need updating
|
|
48
|
+
const sectionsToUpdate = [];
|
|
49
|
+
const techStackSection = doc.sections.find(s => s.id === 'tech-stack');
|
|
50
|
+
if (techStackSection) {
|
|
51
|
+
const newContent = await generateTechStack({ scanResult, aiProvider, config: config }, projectCtx);
|
|
52
|
+
sectionsToUpdate.push({ id: 'tech-stack', content: newContent.content, title: 'Tech Stack' });
|
|
53
|
+
}
|
|
54
|
+
const envSection = doc.sections.find(s => s.id === 'env-vars');
|
|
55
|
+
if (envSection) {
|
|
56
|
+
const newContent = await generateEnvVars({ scanResult, aiProvider, config: config }, projectCtx);
|
|
57
|
+
sectionsToUpdate.push({ id: 'env-vars', content: newContent.content, title: 'Environment Variables' });
|
|
58
|
+
}
|
|
59
|
+
if (sectionsToUpdate.length === 0) {
|
|
60
|
+
logInfo('No sections need updating. README is up to date.');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Apply updates
|
|
64
|
+
let updatedContent = existingContent;
|
|
65
|
+
for (const update of sectionsToUpdate) {
|
|
66
|
+
updatedContent = updateSectionInReadme(updatedContent, update.id, update.content);
|
|
67
|
+
}
|
|
68
|
+
if (options.dryRun) {
|
|
69
|
+
logInfo('Dry run — changes would be:');
|
|
70
|
+
for (const update of sectionsToUpdate) {
|
|
71
|
+
logInfo(` Update "${update.id}" section`);
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await writeFileSafe(readmePath, updatedContent);
|
|
76
|
+
logSuccess(`README synced — ${sectionsToUpdate.length} section(s) updated`);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async function buildProjectContext(rootPath) {
|
|
80
|
+
const pkgContent = await readFileSafe(path.join(rootPath, 'package.json'));
|
|
81
|
+
let packageJson = null;
|
|
82
|
+
if (pkgContent) {
|
|
83
|
+
try {
|
|
84
|
+
packageJson = JSON.parse(pkgContent);
|
|
85
|
+
}
|
|
86
|
+
catch { /* ignore */ }
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
rootPath,
|
|
90
|
+
packageJson,
|
|
91
|
+
gitInfo: null,
|
|
92
|
+
configFiles: [],
|
|
93
|
+
envVars: [],
|
|
94
|
+
folderTree: null,
|
|
95
|
+
scripts: [],
|
|
96
|
+
detectedFrameworks: [],
|
|
97
|
+
routes: [],
|
|
98
|
+
dockerInfo: null,
|
|
99
|
+
ciInfo: null,
|
|
100
|
+
rawScanResults: new Map(),
|
|
101
|
+
scanTimestamp: new Date(),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function aggregateForSync(ctx) {
|
|
105
|
+
const frameworkData = ctx.rawScanResults.get('framework')?.data ?? { frameworks: [] };
|
|
106
|
+
return {
|
|
107
|
+
projectType: 'Unknown',
|
|
108
|
+
frameworks: frameworkData.frameworks ?? [],
|
|
109
|
+
dependencies: { production: [], development: [], peer: [], optional: [] },
|
|
110
|
+
envVars: [],
|
|
111
|
+
scripts: [],
|
|
112
|
+
folderTree: null,
|
|
113
|
+
routes: [],
|
|
114
|
+
git: null,
|
|
115
|
+
configFiles: [],
|
|
116
|
+
docker: null,
|
|
117
|
+
ci: null,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4D3D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import chokidar from 'chokidar';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import { loadConfig, setCachedConfig } from '../../config/index.js';
|
|
5
|
+
import { logInfo, logSection } from '../../utils/logger.js';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// DocPilot — `watch` Command
|
|
8
|
+
// ============================================================================
|
|
9
|
+
export function registerWatchCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('watch')
|
|
12
|
+
.description('Watch project for changes and auto-update README')
|
|
13
|
+
.option('--debounce <ms>', 'Debounce interval in milliseconds', (v) => parseInt(v), 2000)
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
const cwd = process.cwd();
|
|
16
|
+
const config = await loadConfig(cwd);
|
|
17
|
+
setCachedConfig(config);
|
|
18
|
+
const debounceMs = options.debounce ?? config.sync.debounceMs;
|
|
19
|
+
const watchPaths = config.sync.watchPaths.map(p => path.resolve(cwd, p));
|
|
20
|
+
const ignorePaths = config.sync.ignorePaths.map(p => `**/${p}/**`);
|
|
21
|
+
logSection('DocPilot Watch Mode');
|
|
22
|
+
logInfo(`Watching for changes in ${cwd}`);
|
|
23
|
+
logInfo(`Debounce: ${debounceMs}ms`);
|
|
24
|
+
logInfo('Press Ctrl+C to stop');
|
|
25
|
+
console.log('');
|
|
26
|
+
// Debounce mechanism
|
|
27
|
+
let timeoutId = null;
|
|
28
|
+
const watcher = chokidar.watch(watchPaths, {
|
|
29
|
+
ignored: [...ignorePaths, '**/node_modules/**', '**/.git/**', '**/dist/**'],
|
|
30
|
+
persistent: true,
|
|
31
|
+
ignoreInitial: true,
|
|
32
|
+
});
|
|
33
|
+
watcher.on('change', async (filePath) => {
|
|
34
|
+
const relativePath = path.relative(cwd, filePath);
|
|
35
|
+
logInfo(`Change detected: ${relativePath}`);
|
|
36
|
+
if (timeoutId)
|
|
37
|
+
clearTimeout(timeoutId);
|
|
38
|
+
timeoutId = setTimeout(async () => {
|
|
39
|
+
logInfo('Syncing README...');
|
|
40
|
+
try {
|
|
41
|
+
await execa('npx', ['docp', 'sync'], { cwd, stdio: 'inherit' });
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
45
|
+
logInfo(`Sync error: ${message}`);
|
|
46
|
+
}
|
|
47
|
+
}, debounceMs);
|
|
48
|
+
});
|
|
49
|
+
watcher.on('error', (error) => {
|
|
50
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
51
|
+
logInfo(`Watch error: ${msg}`);
|
|
52
|
+
});
|
|
53
|
+
// Handle process exit
|
|
54
|
+
process.on('SIGINT', () => {
|
|
55
|
+
logInfo('Stopping watch mode...');
|
|
56
|
+
watcher.close();
|
|
57
|
+
process.exit(0);
|
|
58
|
+
});
|
|
59
|
+
// Keep the process alive
|
|
60
|
+
await new Promise(() => { });
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAeA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB5C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// DocPilot — CLI Program Definition
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { registerScanCommand } from './commands/scan.js';
|
|
6
|
+
import { registerGenerateCommand } from './commands/generate.js';
|
|
7
|
+
import { registerSyncCommand } from './commands/sync.js';
|
|
8
|
+
import { registerDoctorCommand } from './commands/doctor.js';
|
|
9
|
+
import { registerScoreCommand } from './commands/score.js';
|
|
10
|
+
import { registerSuggestCommand } from './commands/suggest.js';
|
|
11
|
+
import { registerChangelogCommand } from './commands/changelog.js';
|
|
12
|
+
import { registerWatchCommand } from './commands/watch.js';
|
|
13
|
+
export async function runCLI() {
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name('docp')
|
|
17
|
+
.description('AI-powered README Engineering Toolkit')
|
|
18
|
+
.version('0.1.0')
|
|
19
|
+
.option('--debug', 'Enable debug output', false);
|
|
20
|
+
// Register all commands
|
|
21
|
+
registerScanCommand(program);
|
|
22
|
+
registerGenerateCommand(program);
|
|
23
|
+
registerSyncCommand(program);
|
|
24
|
+
registerDoctorCommand(program);
|
|
25
|
+
registerScoreCommand(program);
|
|
26
|
+
registerSuggestCommand(program);
|
|
27
|
+
registerChangelogCommand(program);
|
|
28
|
+
registerWatchCommand(program);
|
|
29
|
+
// Show help if no command given
|
|
30
|
+
if (process.argv.length < 3) {
|
|
31
|
+
program.help();
|
|
32
|
+
}
|
|
33
|
+
await program.parseAsync(process.argv);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,uCAAuC,CAAC;SACpD,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,SAAS,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAEnD,wBAAwB;IACxB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,gCAAgC;IAChC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DocPilotConfig } from '../core/types.js';
|
|
2
|
+
export declare function loadConfig(cwd: string): Promise<DocPilotConfig>;
|
|
3
|
+
export declare function getCachedConfig(): DocPilotConfig;
|
|
4
|
+
export declare function setCachedConfig(config: DocPilotConfig): void;
|
|
5
|
+
export declare function initConfig(cwd: string): Promise<string>;
|
|
6
|
+
export declare function resolveAIProviderFromEnv(): 'openai' | 'anthropic' | 'template' | 'auto';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAUvD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAarE;AAED,wBAAgB,eAAe,IAAI,cAAc,CAGhD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAE5D;AA0BD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa7D;AAED,wBAAgB,wBAAwB,IAAI,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAOvF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { DEFAULT_CONFIG } from '../core/constants.js';
|
|
3
|
+
import { DocPilotConfigSchema } from '../core/schemas.js';
|
|
4
|
+
import { ConfigError } from '../core/errors.js';
|
|
5
|
+
import { findConfigFile, readJsonSafe, writeFileSafe } from '../utils/files.js';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// DocPilot — Configuration Management
|
|
8
|
+
// ============================================================================
|
|
9
|
+
let cachedConfig = null;
|
|
10
|
+
export async function loadConfig(cwd) {
|
|
11
|
+
const configPath = await findConfigFile(cwd);
|
|
12
|
+
if (!configPath) {
|
|
13
|
+
return mergeConfig(DEFAULT_CONFIG, {});
|
|
14
|
+
}
|
|
15
|
+
const rawConfig = await readJsonSafe(configPath);
|
|
16
|
+
if (!rawConfig) {
|
|
17
|
+
throw new ConfigError(`Invalid config file at ${configPath}`);
|
|
18
|
+
}
|
|
19
|
+
return mergeConfig(DEFAULT_CONFIG, rawConfig);
|
|
20
|
+
}
|
|
21
|
+
export function getCachedConfig() {
|
|
22
|
+
if (!cachedConfig)
|
|
23
|
+
throw new ConfigError('Config not loaded. Call loadConfig() first.');
|
|
24
|
+
return cachedConfig;
|
|
25
|
+
}
|
|
26
|
+
export function setCachedConfig(config) {
|
|
27
|
+
cachedConfig = config;
|
|
28
|
+
}
|
|
29
|
+
function mergeConfig(defaults, overrides) {
|
|
30
|
+
const merged = {
|
|
31
|
+
...defaults,
|
|
32
|
+
...overrides,
|
|
33
|
+
project: { ...defaults.project, ...(overrides.project ?? {}) },
|
|
34
|
+
ai: { ...defaults.ai, ...(overrides.ai ?? {}) },
|
|
35
|
+
readme: {
|
|
36
|
+
...defaults.readme,
|
|
37
|
+
...(overrides.readme ?? {}),
|
|
38
|
+
sections: overrides.readme?.sections
|
|
39
|
+
? overrides.readme.sections
|
|
40
|
+
: defaults.readme.sections,
|
|
41
|
+
},
|
|
42
|
+
sync: { ...defaults.sync, ...(overrides.sync ?? {}) },
|
|
43
|
+
};
|
|
44
|
+
const parsed = DocPilotConfigSchema.safeParse(merged);
|
|
45
|
+
if (!parsed.success) {
|
|
46
|
+
throw new ConfigError(`Config validation failed: ${parsed.error.message}`);
|
|
47
|
+
}
|
|
48
|
+
return parsed.data;
|
|
49
|
+
}
|
|
50
|
+
export async function initConfig(cwd) {
|
|
51
|
+
const configPath = path.join(cwd, '.docpilotrc.json');
|
|
52
|
+
const config = {
|
|
53
|
+
...DEFAULT_CONFIG,
|
|
54
|
+
project: {
|
|
55
|
+
name: path.basename(cwd),
|
|
56
|
+
description: '',
|
|
57
|
+
type: 'auto',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
await writeFileSafe(configPath, JSON.stringify(config, null, 2));
|
|
61
|
+
return configPath;
|
|
62
|
+
}
|
|
63
|
+
export function resolveAIProviderFromEnv() {
|
|
64
|
+
if (process.env.DOCPILOT_AI_PROVIDER === 'anthropic')
|
|
65
|
+
return 'anthropic';
|
|
66
|
+
if (process.env.DOCPILOT_AI_PROVIDER === 'openai')
|
|
67
|
+
return 'openai';
|
|
68
|
+
if (process.env.DOCPILOT_AI_PROVIDER === 'template')
|
|
69
|
+
return 'template';
|
|
70
|
+
if (process.env.ANTHROPIC_API_KEY || process.env.DOCPILOT_ANTHROPIC_API_KEY)
|
|
71
|
+
return 'anthropic';
|
|
72
|
+
if (process.env.OPENAI_API_KEY || process.env.DOCPILOT_OPENAI_API_KEY)
|
|
73
|
+
return 'openai';
|
|
74
|
+
return 'template';
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAwB,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhF,+EAA+E;AAC/E,sCAAsC;AACtC,+EAA+E;AAE/E,IAAI,YAAY,GAA0B,IAAI,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAA0B,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,WAAW,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,WAAW,CAAC,6CAA6C,CAAC,CAAC;IACxF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,QAAwB,EAAE,SAAkC;IAC/E,MAAM,MAAM,GAAG;QACb,GAAG,QAAQ;QACX,GAAG,SAAS;QACZ,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,OAAkC,IAAI,EAAE,CAAC,EAAE;QACzF,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,EAA6B,IAAI,EAAE,CAAC,EAAE;QAC1E,MAAM,EAAE;YACN,GAAG,QAAQ,CAAC,MAAM;YAClB,GAAG,CAAC,SAAS,CAAC,MAAiC,IAAI,EAAE,CAAC;YACtD,QAAQ,EAAG,SAAS,CAAC,MAAkC,EAAE,QAAQ;gBAC/D,CAAC,CAAE,SAAS,CAAC,MAAkC,CAAC,QAA2C;gBAC3F,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;SAC7B;QACD,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,IAA+B,IAAI,EAAE,CAAC,EAAE;KACjF,CAAC;IAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CAAC,6BAA6B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,MAAM,CAAC,IAAiC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG;QACb,GAAG,cAAc;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,WAAW,EAAE,EAAE;YACf,IAAI,EAAE,MAAM;SACb;KACF,CAAC;IAEF,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACzE,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACnE,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACvE,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAAE,OAAO,WAAW,CAAC;IAChG,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAAE,OAAO,QAAQ,CAAC;IACvF,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SectionConfig, DocPilotConfig } from './types.js';
|
|
2
|
+
export declare const CLI_NAME = "docp";
|
|
3
|
+
export declare const CLI_FULL_NAME = "docpilot";
|
|
4
|
+
export declare const MARKER_PREFIX = "docpilot";
|
|
5
|
+
export declare const DEFAULT_OUTPUT_PATH = "README.md";
|
|
6
|
+
export declare const SECTION_DEFINITIONS: SectionDefinition[];
|
|
7
|
+
export interface SectionDefinition {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
level: number;
|
|
11
|
+
order: number;
|
|
12
|
+
defaultEnabled: boolean;
|
|
13
|
+
aiGenerated: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare const DEFAULT_SECTIONS: SectionConfig[];
|
|
16
|
+
export declare const DEFAULT_CONFIG: DocPilotConfig;
|
|
17
|
+
export declare const IGNORE_DIRS: Set<string>;
|
|
18
|
+
export declare const FRAMEWORK_PATTERNS: Record<string, {
|
|
19
|
+
category: string;
|
|
20
|
+
name: string;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=constants.d.ts.map
|