@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.
Files changed (186) hide show
  1. package/README.md +147 -0
  2. package/dist/ai/anthropic.provider.d.ts +9 -0
  3. package/dist/ai/anthropic.provider.d.ts.map +1 -0
  4. package/dist/ai/anthropic.provider.js +54 -0
  5. package/dist/ai/anthropic.provider.js.map +1 -0
  6. package/dist/ai/openai.provider.d.ts +9 -0
  7. package/dist/ai/openai.provider.d.ts.map +1 -0
  8. package/dist/ai/openai.provider.js +53 -0
  9. package/dist/ai/openai.provider.js.map +1 -0
  10. package/dist/ai/prompts.d.ts +4 -0
  11. package/dist/ai/prompts.d.ts.map +1 -0
  12. package/dist/ai/prompts.js +199 -0
  13. package/dist/ai/prompts.js.map +1 -0
  14. package/dist/ai/provider.d.ts +4 -0
  15. package/dist/ai/provider.d.ts.map +1 -0
  16. package/dist/ai/provider.js +13 -0
  17. package/dist/ai/provider.js.map +1 -0
  18. package/dist/ai/template.provider.d.ts +7 -0
  19. package/dist/ai/template.provider.d.ts.map +1 -0
  20. package/dist/ai/template.provider.js +19 -0
  21. package/dist/ai/template.provider.js.map +1 -0
  22. package/dist/cli/commands/changelog.d.ts +3 -0
  23. package/dist/cli/commands/changelog.d.ts.map +1 -0
  24. package/dist/cli/commands/changelog.js +118 -0
  25. package/dist/cli/commands/changelog.js.map +1 -0
  26. package/dist/cli/commands/doctor.d.ts +3 -0
  27. package/dist/cli/commands/doctor.d.ts.map +1 -0
  28. package/dist/cli/commands/doctor.js +109 -0
  29. package/dist/cli/commands/doctor.js.map +1 -0
  30. package/dist/cli/commands/generate.d.ts +3 -0
  31. package/dist/cli/commands/generate.d.ts.map +1 -0
  32. package/dist/cli/commands/generate.js +82 -0
  33. package/dist/cli/commands/generate.js.map +1 -0
  34. package/dist/cli/commands/scan.d.ts +3 -0
  35. package/dist/cli/commands/scan.d.ts.map +1 -0
  36. package/dist/cli/commands/scan.js +140 -0
  37. package/dist/cli/commands/scan.js.map +1 -0
  38. package/dist/cli/commands/score.d.ts +13 -0
  39. package/dist/cli/commands/score.d.ts.map +1 -0
  40. package/dist/cli/commands/score.js +153 -0
  41. package/dist/cli/commands/score.js.map +1 -0
  42. package/dist/cli/commands/suggest.d.ts +3 -0
  43. package/dist/cli/commands/suggest.d.ts.map +1 -0
  44. package/dist/cli/commands/suggest.js +72 -0
  45. package/dist/cli/commands/suggest.js.map +1 -0
  46. package/dist/cli/commands/sync.d.ts +3 -0
  47. package/dist/cli/commands/sync.d.ts.map +1 -0
  48. package/dist/cli/commands/sync.js +120 -0
  49. package/dist/cli/commands/sync.js.map +1 -0
  50. package/dist/cli/commands/watch.d.ts +3 -0
  51. package/dist/cli/commands/watch.d.ts.map +1 -0
  52. package/dist/cli/commands/watch.js +63 -0
  53. package/dist/cli/commands/watch.js.map +1 -0
  54. package/dist/cli/index.d.ts +2 -0
  55. package/dist/cli/index.d.ts.map +1 -0
  56. package/dist/cli/index.js +35 -0
  57. package/dist/cli/index.js.map +1 -0
  58. package/dist/config/index.d.ts +7 -0
  59. package/dist/config/index.d.ts.map +1 -0
  60. package/dist/config/index.js +76 -0
  61. package/dist/config/index.js.map +1 -0
  62. package/dist/core/constants.d.ts +22 -0
  63. package/dist/core/constants.d.ts.map +1 -0
  64. package/dist/core/constants.js +201 -0
  65. package/dist/core/constants.js.map +1 -0
  66. package/dist/core/errors.d.ts +26 -0
  67. package/dist/core/errors.d.ts.map +1 -0
  68. package/dist/core/errors.js +48 -0
  69. package/dist/core/errors.js.map +1 -0
  70. package/dist/core/registry.d.ts +21 -0
  71. package/dist/core/registry.d.ts.map +1 -0
  72. package/dist/core/registry.js +99 -0
  73. package/dist/core/registry.js.map +1 -0
  74. package/dist/core/schemas.d.ts +170 -0
  75. package/dist/core/schemas.d.ts.map +1 -0
  76. package/dist/core/schemas.js +43 -0
  77. package/dist/core/schemas.js.map +1 -0
  78. package/dist/core/types.d.ts +246 -0
  79. package/dist/core/types.d.ts.map +1 -0
  80. package/dist/core/types.js +5 -0
  81. package/dist/core/types.js.map +1 -0
  82. package/dist/generators/index.d.ts +9 -0
  83. package/dist/generators/index.d.ts.map +1 -0
  84. package/dist/generators/index.js +181 -0
  85. package/dist/generators/index.js.map +1 -0
  86. package/dist/generators/sections/api-docs.d.ts +3 -0
  87. package/dist/generators/sections/api-docs.d.ts.map +1 -0
  88. package/dist/generators/sections/api-docs.js +39 -0
  89. package/dist/generators/sections/api-docs.js.map +1 -0
  90. package/dist/generators/sections/contributing.d.ts +3 -0
  91. package/dist/generators/sections/contributing.d.ts.map +1 -0
  92. package/dist/generators/sections/contributing.js +24 -0
  93. package/dist/generators/sections/contributing.js.map +1 -0
  94. package/dist/generators/sections/deployment.d.ts +3 -0
  95. package/dist/generators/sections/deployment.d.ts.map +1 -0
  96. package/dist/generators/sections/deployment.js +30 -0
  97. package/dist/generators/sections/deployment.js.map +1 -0
  98. package/dist/generators/sections/env-vars.d.ts +3 -0
  99. package/dist/generators/sections/env-vars.d.ts.map +1 -0
  100. package/dist/generators/sections/env-vars.js +18 -0
  101. package/dist/generators/sections/env-vars.js.map +1 -0
  102. package/dist/generators/sections/features.d.ts +4 -0
  103. package/dist/generators/sections/features.d.ts.map +1 -0
  104. package/dist/generators/sections/features.js +34 -0
  105. package/dist/generators/sections/features.js.map +1 -0
  106. package/dist/generators/sections/folder-tree.d.ts +3 -0
  107. package/dist/generators/sections/folder-tree.d.ts.map +1 -0
  108. package/dist/generators/sections/folder-tree.js +43 -0
  109. package/dist/generators/sections/folder-tree.js.map +1 -0
  110. package/dist/generators/sections/installation.d.ts +4 -0
  111. package/dist/generators/sections/installation.d.ts.map +1 -0
  112. package/dist/generators/sections/installation.js +33 -0
  113. package/dist/generators/sections/installation.js.map +1 -0
  114. package/dist/generators/sections/license.d.ts +3 -0
  115. package/dist/generators/sections/license.d.ts.map +1 -0
  116. package/dist/generators/sections/license.js +13 -0
  117. package/dist/generators/sections/license.js.map +1 -0
  118. package/dist/generators/sections/overview.d.ts +4 -0
  119. package/dist/generators/sections/overview.d.ts.map +1 -0
  120. package/dist/generators/sections/overview.js +39 -0
  121. package/dist/generators/sections/overview.js.map +1 -0
  122. package/dist/generators/sections/scripts.d.ts +3 -0
  123. package/dist/generators/sections/scripts.d.ts.map +1 -0
  124. package/dist/generators/sections/scripts.js +18 -0
  125. package/dist/generators/sections/scripts.js.map +1 -0
  126. package/dist/generators/sections/tech-stack.d.ts +4 -0
  127. package/dist/generators/sections/tech-stack.d.ts.map +1 -0
  128. package/dist/generators/sections/tech-stack.js +31 -0
  129. package/dist/generators/sections/tech-stack.js.map +1 -0
  130. package/dist/generators/sections/types.d.ts +13 -0
  131. package/dist/generators/sections/types.d.ts.map +1 -0
  132. package/dist/generators/sections/types.js +2 -0
  133. package/dist/generators/sections/types.js.map +1 -0
  134. package/dist/index.d.ts +3 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +11 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/scanners/base.d.ts +11 -0
  139. package/dist/scanners/base.d.ts.map +1 -0
  140. package/dist/scanners/base.js +7 -0
  141. package/dist/scanners/base.js.map +1 -0
  142. package/dist/scanners/config-file.scanner.d.ts +11 -0
  143. package/dist/scanners/config-file.scanner.d.ts.map +1 -0
  144. package/dist/scanners/config-file.scanner.js +94 -0
  145. package/dist/scanners/config-file.scanner.js.map +1 -0
  146. package/dist/scanners/env-var.scanner.d.ts +13 -0
  147. package/dist/scanners/env-var.scanner.d.ts.map +1 -0
  148. package/dist/scanners/env-var.scanner.js +144 -0
  149. package/dist/scanners/env-var.scanner.js.map +1 -0
  150. package/dist/scanners/folder-tree.scanner.d.ts +13 -0
  151. package/dist/scanners/folder-tree.scanner.d.ts.map +1 -0
  152. package/dist/scanners/folder-tree.scanner.js +74 -0
  153. package/dist/scanners/folder-tree.scanner.js.map +1 -0
  154. package/dist/scanners/framework.d.ts +12 -0
  155. package/dist/scanners/framework.d.ts.map +1 -0
  156. package/dist/scanners/framework.js +71 -0
  157. package/dist/scanners/framework.js.map +1 -0
  158. package/dist/scanners/git.scanner.d.ts +11 -0
  159. package/dist/scanners/git.scanner.d.ts.map +1 -0
  160. package/dist/scanners/git.scanner.js +92 -0
  161. package/dist/scanners/git.scanner.js.map +1 -0
  162. package/dist/scanners/index.d.ts +10 -0
  163. package/dist/scanners/index.d.ts.map +1 -0
  164. package/dist/scanners/index.js +29 -0
  165. package/dist/scanners/index.js.map +1 -0
  166. package/dist/scanners/package.scanner.d.ts +11 -0
  167. package/dist/scanners/package.scanner.d.ts.map +1 -0
  168. package/dist/scanners/package.scanner.js +70 -0
  169. package/dist/scanners/package.scanner.js.map +1 -0
  170. package/dist/scanners/script.scanner.d.ts +12 -0
  171. package/dist/scanners/script.scanner.d.ts.map +1 -0
  172. package/dist/scanners/script.scanner.js +105 -0
  173. package/dist/scanners/script.scanner.js.map +1 -0
  174. package/dist/utils/files.d.ts +12 -0
  175. package/dist/utils/files.d.ts.map +1 -0
  176. package/dist/utils/files.js +86 -0
  177. package/dist/utils/files.js.map +1 -0
  178. package/dist/utils/logger.d.ts +16 -0
  179. package/dist/utils/logger.d.ts.map +1 -0
  180. package/dist/utils/logger.js +63 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/utils/markdown.d.ts +10 -0
  183. package/dist/utils/markdown.d.ts.map +1 -0
  184. package/dist/utils/markdown.js +153 -0
  185. package/dist/utils/markdown.js.map +1 -0
  186. 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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSuggestCommand(program: Command): void;
3
+ //# sourceMappingURL=suggest.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSyncCommand(program: Command): void;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerWatchCommand(program: Command): void;
3
+ //# sourceMappingURL=watch.d.ts.map
@@ -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,2 @@
1
+ export declare function runCLI(): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
@@ -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