@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,105 @@
1
+ import { BaseScanner } from './base.js';
2
+ // ============================================================================
3
+ // DocPilot — Script Scanner (analyzes npm scripts)
4
+ // ============================================================================
5
+ const SCRIPT_DESCRIPTIONS = {
6
+ dev: 'Start development server',
7
+ start: 'Start the application',
8
+ build: 'Build the project for production',
9
+ test: 'Run tests',
10
+ lint: 'Lint the codebase',
11
+ format: 'Format code',
12
+ preview: 'Preview the production build',
13
+ typecheck: 'Run TypeScript type checking',
14
+ 'test:watch': 'Run tests in watch mode',
15
+ 'test:coverage': 'Run tests with coverage report',
16
+ 'test:e2e': 'Run end-to-end tests',
17
+ 'build:prod': 'Build for production',
18
+ 'build:dev': 'Build for development',
19
+ storybook: 'Start Storybook',
20
+ 'build-storybook': 'Build Storybook',
21
+ analyze: 'Analyze bundle',
22
+ clean: 'Clean build artifacts',
23
+ deploy: 'Deploy the application',
24
+ prerelease: 'Run checks before release',
25
+ release: 'Create a release',
26
+ prepare: 'Prepare the package (e.g., Husky install)',
27
+ postinstall: 'Post-installation script',
28
+ 'db:migrate': 'Run database migrations',
29
+ 'db:push': 'Push schema to database',
30
+ 'db:seed': 'Seed the database',
31
+ 'db:generate': 'Generate database client',
32
+ 'db:studio': 'Open database studio',
33
+ 'prisma:generate': 'Generate Prisma client',
34
+ 'prisma:studio': 'Open Prisma Studio',
35
+ 'prisma:migrate': 'Run Prisma migrations',
36
+ 'prisma:seed': 'Seed database with Prisma',
37
+ docker: 'Run Docker commands',
38
+ 'docker:build': 'Build Docker image',
39
+ 'docker:up': 'Start Docker containers',
40
+ 'docker:down': 'Stop Docker containers',
41
+ api: 'Start API server',
42
+ client: 'Start client application',
43
+ };
44
+ export class ScriptScanner extends BaseScanner {
45
+ id = 'scripts';
46
+ name = 'Script Analyzer';
47
+ description = 'Analyzes npm scripts and infers their purposes';
48
+ priority = 40;
49
+ dependencies = ['package'];
50
+ isApplicable(context) {
51
+ return !!context.packageJson;
52
+ }
53
+ async scan(context) {
54
+ const scripts = context.packageJson?.scripts ?? {};
55
+ const scriptInfos = [];
56
+ for (const [name, command] of Object.entries(scripts)) {
57
+ const info = {
58
+ name,
59
+ command: command ?? '',
60
+ type: 'npm',
61
+ description: SCRIPT_DESCRIPTIONS[name] ?? inferDescription(name, command ?? ''),
62
+ };
63
+ scriptInfos.push(info);
64
+ }
65
+ return {
66
+ scannerId: this.id,
67
+ data: { scripts: scriptInfos },
68
+ confidence: scriptInfos.length > 0 ? 1.0 : 0.5,
69
+ timestamp: new Date(),
70
+ };
71
+ }
72
+ }
73
+ function inferDescription(name, command) {
74
+ // Try to infer from command keywords
75
+ if (command.includes('node'))
76
+ return 'Run Node.js script';
77
+ if (command.includes('tsx') || command.includes('ts-node'))
78
+ return 'Run TypeScript script';
79
+ if (command.includes('next dev'))
80
+ return 'Start Next.js development server';
81
+ if (command.includes('next build'))
82
+ return 'Build Next.js for production';
83
+ if (command.includes('next start'))
84
+ return 'Start Next.js production server';
85
+ if (command.includes('vite'))
86
+ return 'Run Vite commands';
87
+ if (command.includes('nodemon'))
88
+ return 'Run with auto-restart';
89
+ if (command.includes('tsc'))
90
+ return 'Compile TypeScript';
91
+ if (command.includes('eslint'))
92
+ return 'Lint with ESLint';
93
+ if (command.includes('prettier'))
94
+ return 'Format with Prettier';
95
+ if (command.includes('vitest') || command.includes('jest') || command.includes('mocha'))
96
+ return 'Run tests';
97
+ if (command.includes('playwright'))
98
+ return 'Run Playwright tests';
99
+ if (command.includes('cypress'))
100
+ return 'Run Cypress tests';
101
+ if (command.includes('husky'))
102
+ return 'Install Git hooks';
103
+ return undefined;
104
+ }
105
+ //# sourceMappingURL=script.scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.scanner.js","sourceRoot":"","sources":["../../src/scanners/script.scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare function readFileSafe(filePath: string): Promise<string | null>;
2
+ export declare function writeFileSafe(filePath: string, content: string): Promise<void>;
3
+ export declare function fileExists(filePath: string): Promise<boolean>;
4
+ export declare function findUp(filename: string, cwd: string): Promise<string | null>;
5
+ export declare function findConfigFile(cwd: string): Promise<string | null>;
6
+ export declare function glob(pattern: string | string[], options?: {
7
+ cwd?: string;
8
+ ignore?: string[];
9
+ }): Promise<string[]>;
10
+ export declare function readJsonSafe<T>(filePath: string): Promise<T | null>;
11
+ export declare function listDirectory(dir: string, depth?: number): Promise<string[]>;
12
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAQA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAM3E;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASlF;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxE;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOvH;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQzE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB7E"}
@@ -0,0 +1,86 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import fg from 'fast-glob';
4
+ // ============================================================================
5
+ // DocPilot — File System Helpers
6
+ // ============================================================================
7
+ export async function readFileSafe(filePath) {
8
+ try {
9
+ return await fs.readFile(filePath, 'utf-8');
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ export async function writeFileSafe(filePath, content) {
16
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
17
+ await fs.writeFile(filePath, content, 'utf-8');
18
+ }
19
+ export async function fileExists(filePath) {
20
+ try {
21
+ await fs.access(filePath);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export async function findUp(filename, cwd) {
29
+ let dir = path.resolve(cwd);
30
+ const { root } = path.parse(dir);
31
+ while (dir !== root) {
32
+ const fullPath = path.join(dir, filename);
33
+ if (await fileExists(fullPath))
34
+ return fullPath;
35
+ dir = path.dirname(dir);
36
+ }
37
+ return null;
38
+ }
39
+ export async function findConfigFile(cwd) {
40
+ for (const name of ['.docpilotrc.json', 'docpilot.config.json', '.docpilot/config.json']) {
41
+ const found = await findUp(name, cwd);
42
+ if (found)
43
+ return found;
44
+ }
45
+ return null;
46
+ }
47
+ export async function glob(pattern, options) {
48
+ return fg(pattern, {
49
+ cwd: options?.cwd,
50
+ ignore: options?.ignore ?? ['**/node_modules/**', '**/.git/**', '**/dist/**'],
51
+ dot: false,
52
+ absolute: true,
53
+ });
54
+ }
55
+ export async function readJsonSafe(filePath) {
56
+ const content = await readFileSafe(filePath);
57
+ if (!content)
58
+ return null;
59
+ try {
60
+ return JSON.parse(content);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ export async function listDirectory(dir, depth = 1) {
67
+ const entries = [];
68
+ const readDir = async (current, remaining) => {
69
+ try {
70
+ const items = await fs.readdir(current, { withFileTypes: true });
71
+ for (const item of items) {
72
+ const fullPath = path.join(current, item.name);
73
+ entries.push(fullPath);
74
+ if (item.isDirectory() && remaining > 0) {
75
+ await readDir(fullPath, remaining - 1);
76
+ }
77
+ }
78
+ }
79
+ catch {
80
+ // skip unreadable directories
81
+ }
82
+ };
83
+ await readDir(dir, depth);
84
+ return entries;
85
+ }
86
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Ora } from 'ora';
2
+ export declare function logInfo(message: string): void;
3
+ export declare function logSuccess(message: string): void;
4
+ export declare function logWarning(message: string): void;
5
+ export declare function logError(message: string): void;
6
+ export declare function logSection(title: string): void;
7
+ export declare function createSpinner(text: string): Ora;
8
+ export declare function formatList(items: string[]): string;
9
+ export declare function formatKeyValue(key: string, value: string): string;
10
+ export declare function formatTable(rows: Array<Record<string, string>>, columns: string[]): string;
11
+ export declare function formatTree(name: string, children: Array<{
12
+ name: string;
13
+ isDir: boolean;
14
+ children?: unknown;
15
+ }>, prefix?: string): string;
16
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAM/B,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI9C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAE/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAe1F;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACrE,MAAM,SAAK,GACV,MAAM,CAuBR"}
@@ -0,0 +1,63 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ // ============================================================================
4
+ // DocPilot — Terminal UI Helpers
5
+ // ============================================================================
6
+ export function logInfo(message) {
7
+ console.log(chalk.blue('ℹ'), message);
8
+ }
9
+ export function logSuccess(message) {
10
+ console.log(chalk.green('✔'), message);
11
+ }
12
+ export function logWarning(message) {
13
+ console.log(chalk.yellow('⚠'), message);
14
+ }
15
+ export function logError(message) {
16
+ console.error(chalk.red('✖'), message);
17
+ }
18
+ export function logSection(title) {
19
+ console.log('');
20
+ console.log(chalk.bold.cyan(title));
21
+ console.log(chalk.dim('─'.repeat(title.length)));
22
+ }
23
+ export function createSpinner(text) {
24
+ return ora({ text, color: 'cyan' });
25
+ }
26
+ export function formatList(items) {
27
+ return items.map(item => ` ${chalk.dim('•')} ${item}`).join('\n');
28
+ }
29
+ export function formatKeyValue(key, value) {
30
+ return `${chalk.bold(key)}: ${value}`;
31
+ }
32
+ export function formatTable(rows, columns) {
33
+ if (rows.length === 0)
34
+ return '';
35
+ const colWidths = columns.map(col => Math.max(col.length, ...rows.map(r => (r[col] ?? '').length)));
36
+ const sep = (c, i) => c.padEnd(colWidths[i] ?? 0);
37
+ const header = columns.map((c, i) => chalk.bold(sep(c, i))).join(' │ ');
38
+ const divider = colWidths.map(w => '─'.repeat(w)).join('─┼─');
39
+ const body = rows.map(r => columns.map((c, i) => sep(r[c] ?? '', i)).join(' │ ')).join('\n');
40
+ return `${header}\n${divider}\n${body}`;
41
+ }
42
+ export function formatTree(name, children, prefix = '') {
43
+ let result = prefix + chalk.cyan(name) + '\n';
44
+ for (let i = 0; i < children.length; i++) {
45
+ const child = children[i];
46
+ const isLast = i === children.length - 1;
47
+ const connector = isLast ? '└── ' : '├── ';
48
+ const childPrefix = prefix + (isLast ? ' ' : '│ ');
49
+ result += prefix + connector + (child.isDir ? chalk.cyan(child.name) : child.name);
50
+ if (child.children && Array.isArray(child.children)) {
51
+ result += '\n' + formatTree(child.name, child.children, childPrefix);
52
+ }
53
+ else {
54
+ result += '\n';
55
+ if (child.isDir) {
56
+ const nextPrefix = prefix + (isLast ? ' ' : '│ ');
57
+ result += prefix + connector.replace('├──', '│ ').replace('└──', ' ') + '\n';
58
+ }
59
+ }
60
+ }
61
+ return '\n' + result + '\n';
62
+ }
63
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ReadmeSection, ReadmeDocument } from '../core/types.js';
2
+ export declare function parseReadme(content: string): ReadmeDocument;
3
+ export declare function assembleReadme(doc: ReadmeDocument): string;
4
+ export declare function createSection(id: string, title: string, content: string, level?: number): ReadmeSection;
5
+ export declare function updateSectionInReadme(readmeContent: string, sectionId: string, newContent: string): string;
6
+ export declare function generateBadges(frameworks: Array<{
7
+ name: string;
8
+ category: string;
9
+ }>): string;
10
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAetE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA0F3D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAwB1D;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,SAAI,GACR,aAAa,CAcf;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CAmBR;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAK5F"}
@@ -0,0 +1,153 @@
1
+ import { MARKER_PREFIX } from '../core/constants.js';
2
+ // ============================================================================
3
+ // DocPilot — Markdown Parsing & Section Management
4
+ // ============================================================================
5
+ function markerStart(sectionId) {
6
+ return `<!-- ${MARKER_PREFIX}:start:${sectionId} -->`;
7
+ }
8
+ function markerEnd(sectionId) {
9
+ return `<!-- ${MARKER_PREFIX}:end:${sectionId} -->`;
10
+ }
11
+ export function parseReadme(content) {
12
+ const sections = [];
13
+ let preamble = '';
14
+ let postamble = '';
15
+ let hasDocpilotMarkers = false;
16
+ // Try marker-based parsing first
17
+ const markerRegex = new RegExp(`<!--\\s*${MARKER_PREFIX}:start:(\\w[\\w-]*)\\s*-->([\\s\\S]*?)<!--\\s*${MARKER_PREFIX}:end:\\1\\s*-->`, 'g');
18
+ const parts = content.split(markerRegex);
19
+ if (parts.length > 1) {
20
+ hasDocpilotMarkers = true;
21
+ // parts: [before, id1, content1, before2, id2, content2, ..., after]
22
+ preamble = parts[0] ?? '';
23
+ for (let i = 1; i + 2 < parts.length; i += 3) {
24
+ const id = parts[i];
25
+ const body = (parts[i + 1] ?? '').trim();
26
+ // Try to extract heading from the line just before the marker
27
+ const beforeSegment = parts[i - 1] ?? '';
28
+ const headingMatch = beforeSegment.match(/(#{1,6})\s+(.+)$/m);
29
+ const title = headingMatch?.[2]?.trim() ?? id;
30
+ const level = headingMatch?.[1]?.length ?? 2;
31
+ sections.push({
32
+ id,
33
+ title,
34
+ headingLevel: level,
35
+ content: body,
36
+ raw: `## ${title}\n\n${markerStart(id)}\n${body}\n${markerEnd(id)}`,
37
+ startMarker: markerStart(id),
38
+ endMarker: markerEnd(id),
39
+ hasMarkers: true,
40
+ order: sections.length,
41
+ status: 'existing',
42
+ });
43
+ }
44
+ const lastEndIdx = content.lastIndexOf(`<!-- ${MARKER_PREFIX}:end:`);
45
+ if (lastEndIdx >= 0) {
46
+ const endOfMarker = content.indexOf('-->', lastEndIdx) + 3;
47
+ postamble = content.slice(endOfMarker).trim();
48
+ }
49
+ }
50
+ else {
51
+ // Heading-based fallback
52
+ const headingRegex = /^(#{1,6})\s+(.+)$/gm;
53
+ let lastIndex = 0;
54
+ let match;
55
+ while ((match = headingRegex.exec(content)) !== null) {
56
+ const startIdx = match.index;
57
+ if (lastIndex === 0 && startIdx > 0) {
58
+ preamble = content.slice(0, startIdx).trim();
59
+ }
60
+ const prevEnd = match.index + match[0].length;
61
+ const nextMatch = headingRegex.exec(content);
62
+ headingRegex.lastIndex = match.index + match[0].length;
63
+ const endIdx = nextMatch ? nextMatch.index : content.length;
64
+ const body = content.slice(prevEnd, endIdx).trim();
65
+ const id = (match[2] ?? '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'section';
66
+ const level = (match[1] ?? '').length;
67
+ sections.push({
68
+ id,
69
+ title: match[2] ?? '',
70
+ headingLevel: level,
71
+ content: body,
72
+ raw: content.slice(startIdx, endIdx).trim(),
73
+ startMarker: markerStart(id),
74
+ endMarker: markerEnd(id),
75
+ hasMarkers: false,
76
+ order: sections.length,
77
+ status: 'existing',
78
+ });
79
+ lastIndex = endIdx;
80
+ }
81
+ if (lastIndex < content.length) {
82
+ postamble = content.slice(lastIndex).trim();
83
+ }
84
+ }
85
+ return {
86
+ preamble,
87
+ sections,
88
+ postamble,
89
+ rawContent: content,
90
+ hasDocpilotMarkers,
91
+ };
92
+ }
93
+ export function assembleReadme(doc) {
94
+ const parts = [];
95
+ if (doc.preamble)
96
+ parts.push(doc.preamble);
97
+ for (const section of doc.sections) {
98
+ if (doc.hasDocpilotMarkers || section.hasMarkers) {
99
+ parts.push('');
100
+ parts.push(`${'#'.repeat(section.headingLevel)} ${section.title}`);
101
+ parts.push('');
102
+ parts.push(section.startMarker);
103
+ parts.push(section.content);
104
+ parts.push(section.endMarker);
105
+ }
106
+ else {
107
+ parts.push('');
108
+ parts.push(`${'#'.repeat(section.headingLevel)} ${section.title}`);
109
+ parts.push('');
110
+ parts.push(section.content);
111
+ }
112
+ }
113
+ if (doc.postamble)
114
+ parts.push(doc.postamble);
115
+ return parts.join('\n').trim() + '\n';
116
+ }
117
+ export function createSection(id, title, content, level = 2) {
118
+ const heading = '#'.repeat(level);
119
+ return {
120
+ id,
121
+ title,
122
+ headingLevel: level,
123
+ content,
124
+ raw: `${heading} ${title}\n\n${markerStart(id)}\n${content}\n${markerEnd(id)}`,
125
+ startMarker: markerStart(id),
126
+ endMarker: markerEnd(id),
127
+ hasMarkers: true,
128
+ order: 0,
129
+ status: 'new',
130
+ };
131
+ }
132
+ export function updateSectionInReadme(readmeContent, sectionId, newContent) {
133
+ const startTag = markerStart(sectionId);
134
+ const endTag = markerEnd(sectionId);
135
+ const startIdx = readmeContent.indexOf(startTag);
136
+ const endIdx = readmeContent.indexOf(endTag);
137
+ if (startIdx === -1 || endIdx === -1)
138
+ return readmeContent;
139
+ const contentStart = startIdx + startTag.length;
140
+ const contentEnd = endIdx;
141
+ return (readmeContent.slice(0, contentStart) +
142
+ '\n' +
143
+ newContent.trim() +
144
+ '\n' +
145
+ readmeContent.slice(contentEnd));
146
+ }
147
+ export function generateBadges(frameworks) {
148
+ if (!frameworks.length)
149
+ return '';
150
+ const badge = (label) => `![${label}](https://img.shields.io/badge/${encodeURIComponent(label)}-blue?style=flat-square)`;
151
+ return frameworks.map(f => badge(f.name)).join(' ');
152
+ }
153
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@ragul1233332/docpilot",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "0.1.0",
7
+ "description": "AI-powered README Engineering Toolkit — scan, generate, sync, and maintain project documentation automatically",
8
+ "type": "module",
9
+ "bin": {
10
+ "docp": "./dist/index.js",
11
+ "docpilot": "./dist/index.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "src/generators/templates"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "start": "node dist/index.js",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "test:coverage": "vitest run --coverage",
24
+ "typecheck": "tsc --noEmit",
25
+ "prepublishOnly": "npm run build"
26
+ },
27
+ "dependencies": {
28
+ "commander": "^13.0.0",
29
+ "chalk": "^5.4.0",
30
+ "ora": "^8.1.0",
31
+ "execa": "^9.5.0",
32
+ "fast-glob": "^3.3.0",
33
+ "chokidar": "^4.0.0",
34
+ "zod": "^3.23.0",
35
+ "gray-matter": "^4.0.3",
36
+ "handlebars": "^4.7.8"
37
+ },
38
+ "optionalDependencies": {
39
+ "@anthropic-ai/sdk": "^0.32.0",
40
+ "openai": "^4.73.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.10.0",
44
+ "ts-morph": "^23.0.0",
45
+ "typescript": "^5.6.0",
46
+ "vitest": "^2.1.0",
47
+ "playwright": "^1.61.0"
48
+ },
49
+ "engines": {
50
+ "node": ">=20.0.0"
51
+ },
52
+ "keywords": [
53
+ "readme",
54
+ "documentation",
55
+ "generator",
56
+ "cli",
57
+ "ai",
58
+ "developer-tools"
59
+ ],
60
+ "license": "MIT"
61
+ }