@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 @@
1
+ {"version":3,"file":"env-var.scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/env-var.scanner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAc,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEtG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,IAAI,mCAAmC;IAChD,QAAQ,CAAC,WAAW,qEAAqE;IACzF,QAAQ,CAAC,QAAQ,MAAM;IAEvB,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO;IAIhD,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;YA6D1C,YAAY;IAkC1B,OAAO,CAAC,mBAAmB;CA8C5B"}
@@ -0,0 +1,144 @@
1
+ import path from 'node:path';
2
+ import { readFileSafe, glob } from '../utils/files.js';
3
+ import { BaseScanner } from './base.js';
4
+ // ============================================================================
5
+ // DocPilot — Environment Variable Scanner
6
+ // ============================================================================
7
+ export class EnvVarScanner extends BaseScanner {
8
+ id = 'env-vars';
9
+ name = 'Environment Variable Detector';
10
+ description = 'Discovers environment variables from .env files and source code';
11
+ priority = 60;
12
+ isApplicable(_context) {
13
+ return true;
14
+ }
15
+ async scan(context) {
16
+ const envVars = new Map();
17
+ // 1. Check .env.example
18
+ const envExample = await this.parseEnvFile(path.join(context.rootPath, '.env.example'), 'env-file');
19
+ for (const ev of envExample) {
20
+ const existing = envVars.get(ev.name);
21
+ if (!existing || existing.source !== 'env-file') {
22
+ envVars.set(ev.name, { ...ev, source: 'env-file' });
23
+ }
24
+ }
25
+ // 2. Check .env.sample
26
+ const envSample = await this.parseEnvFile(path.join(context.rootPath, '.env.sample'), 'env-file');
27
+ for (const ev of envSample) {
28
+ if (!envVars.has(ev.name)) {
29
+ envVars.set(ev.name, ev);
30
+ }
31
+ }
32
+ // 3. Check .env (actual values, but don't commit these!)
33
+ const envActual = await this.parseEnvFile(path.join(context.rootPath, '.env'), 'env-file');
34
+ for (const ev of envActual) {
35
+ const existing = envVars.get(ev.name);
36
+ if (existing && !existing.detectedValue) {
37
+ existing.detectedValue = ev.detectedValue;
38
+ }
39
+ }
40
+ // 4. Scan source files for process.env references
41
+ const srcFiles = await glob('src/**/*.{ts,tsx,js,jsx,mjs}', {
42
+ cwd: context.rootPath,
43
+ ignore: ['**/node_modules/**'],
44
+ });
45
+ const processEnvRegex = /process\.env\.(\w+)|process\.env\['(\w+)'\]|process\.env\["(\w+)"\]/g;
46
+ for (const file of srcFiles.slice(0, 50)) { // Limit to 50 files
47
+ const content = await readFileSafe(file);
48
+ if (!content)
49
+ continue;
50
+ let match;
51
+ while ((match = processEnvRegex.exec(content)) !== null) {
52
+ const varName = match[1] ?? match[2] ?? match[3];
53
+ if (varName && !envVars.has(varName)) {
54
+ envVars.set(varName, {
55
+ name: varName,
56
+ required: true,
57
+ source: 'code-reference',
58
+ description: `Referenced in ${path.relative(context.rootPath, file)}`,
59
+ });
60
+ }
61
+ }
62
+ }
63
+ return {
64
+ scannerId: this.id,
65
+ data: { envVars: Array.from(envVars.values()) },
66
+ confidence: envVars.size > 0 ? 0.95 : 0.5,
67
+ timestamp: new Date(),
68
+ };
69
+ }
70
+ async parseEnvFile(filePath, source) {
71
+ const content = await readFileSafe(filePath);
72
+ if (!content)
73
+ return [];
74
+ const vars = [];
75
+ const lines = content.split('\n');
76
+ for (const line of lines) {
77
+ const trimmed = line.trim();
78
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('export '))
79
+ continue;
80
+ const eqIdx = trimmed.indexOf('=');
81
+ if (eqIdx === -1)
82
+ continue;
83
+ const name = trimmed.slice(0, eqIdx).trim();
84
+ const value = trimmed.slice(eqIdx + 1).trim();
85
+ if (name) {
86
+ vars.push({
87
+ name,
88
+ detectedValue: value || undefined,
89
+ required: !value || value === '' || value.startsWith('your_'),
90
+ source,
91
+ description: this.inferEnvDescription(name),
92
+ });
93
+ }
94
+ }
95
+ return vars;
96
+ }
97
+ inferEnvDescription(name) {
98
+ const descriptions = {
99
+ DATABASE_URL: 'Database connection string',
100
+ POSTGRES_URL: 'PostgreSQL connection string',
101
+ MONGODB_URI: 'MongoDB connection string',
102
+ REDIS_URL: 'Redis connection string',
103
+ REDIS_HOST: 'Redis server hostname',
104
+ REDIS_PORT: 'Redis server port',
105
+ API_KEY: 'API key for authentication',
106
+ SECRET_KEY: 'Secret key for encryption',
107
+ JWT_SECRET: 'Secret key for JWT token signing',
108
+ JWT_EXPIRES_IN: 'JWT token expiration time',
109
+ NEXTAUTH_SECRET: 'Secret key for NextAuth.js',
110
+ NEXTAUTH_URL: 'Base URL for NextAuth.js callbacks',
111
+ NODE_ENV: 'Node.js environment (development, production, test)',
112
+ PORT: 'Application server port',
113
+ HOST: 'Application server host',
114
+ STRIPE_KEY: 'Stripe API key',
115
+ STRIPE_SECRET: 'Stripe secret key',
116
+ STRIPE_WEBHOOK_SECRET: 'Stripe webhook signing secret',
117
+ OPENAI_API_KEY: 'OpenAI API key',
118
+ ANTHROPIC_API_KEY: 'Anthropic API key',
119
+ GITHUB_TOKEN: 'GitHub personal access token',
120
+ SENDGRID_API_KEY: 'SendGrid email API key',
121
+ RESEND_API_KEY: 'Resend email API key',
122
+ AWS_ACCESS_KEY_ID: 'AWS access key ID',
123
+ AWS_SECRET_ACCESS_KEY: 'AWS secret access key',
124
+ AWS_REGION: 'AWS region',
125
+ GOOGLE_CLIENT_ID: 'Google OAuth client ID',
126
+ GOOGLE_CLIENT_SECRET: 'Google OAuth client secret',
127
+ GITHUB_CLIENT_ID: 'GitHub OAuth client ID',
128
+ GITHUB_CLIENT_SECRET: 'GitHub OAuth client secret',
129
+ LOG_LEVEL: 'Logging level (debug, info, warn, error)',
130
+ CORS_ORIGIN: 'Allowed CORS origins',
131
+ SESSION_SECRET: 'Session encryption secret',
132
+ SMTP_HOST: 'SMTP server hostname',
133
+ SMTP_PORT: 'SMTP server port',
134
+ SMTP_USER: 'SMTP username',
135
+ SMTP_PASS: 'SMTP password',
136
+ S3_BUCKET: 'S3 bucket name',
137
+ CLOUDINARY_CLOUD_NAME: 'Cloudinary cloud name',
138
+ CLOUDINARY_API_KEY: 'Cloudinary API key',
139
+ CLOUDINARY_API_SECRET: 'Cloudinary API secret',
140
+ };
141
+ return descriptions[name];
142
+ }
143
+ }
144
+ //# sourceMappingURL=env-var.scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-var.scanner.js","sourceRoot":"","sources":["../../src/scanners/env-var.scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ProjectContext, ScanResult, PartialProjectContext } from '../core/types.js';
2
+ import { BaseScanner } from './base.js';
3
+ export declare class FolderTreeScanner extends BaseScanner {
4
+ readonly id = "folder-tree";
5
+ readonly name = "Folder Tree Generator";
6
+ readonly description = "Generates a tree representation of the project structure";
7
+ readonly priority = 50;
8
+ private maxDepth;
9
+ isApplicable(_context: PartialProjectContext): boolean;
10
+ scan(context: ProjectContext): Promise<ScanResult>;
11
+ private buildTree;
12
+ }
13
+ //# sourceMappingURL=folder-tree.scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-tree.scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/folder-tree.scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAkB,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE1G,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,WAAW,8DAA8D;IAClF,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAK;IAErB,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO;IAIhD,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;YAW1C,SAAS;CA8CxB"}
@@ -0,0 +1,74 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { IGNORE_DIRS } from '../core/constants.js';
4
+ import { BaseScanner } from './base.js';
5
+ // ============================================================================
6
+ // DocPilot — Folder Tree Scanner
7
+ // ============================================================================
8
+ export class FolderTreeScanner extends BaseScanner {
9
+ id = 'folder-tree';
10
+ name = 'Folder Tree Generator';
11
+ description = 'Generates a tree representation of the project structure';
12
+ priority = 50;
13
+ maxDepth = 4;
14
+ isApplicable(_context) {
15
+ return true;
16
+ }
17
+ async scan(context) {
18
+ const tree = await this.buildTree(context.rootPath, 0);
19
+ return {
20
+ scannerId: this.id,
21
+ data: { tree },
22
+ confidence: tree ? 1.0 : 0.3,
23
+ timestamp: new Date(),
24
+ };
25
+ }
26
+ async buildTree(dir, depth) {
27
+ if (depth > this.maxDepth)
28
+ return null;
29
+ const name = path.basename(dir);
30
+ if (IGNORE_DIRS.has(name))
31
+ return null;
32
+ try {
33
+ const entries = await fs.readdir(dir, { withFileTypes: true });
34
+ const children = [];
35
+ // Sort: directories first, then files, both alphabetical
36
+ const sorted = entries.sort((a, b) => {
37
+ if (a.isDirectory() && !b.isDirectory())
38
+ return -1;
39
+ if (!a.isDirectory() && b.isDirectory())
40
+ return 1;
41
+ return a.name.localeCompare(b.name);
42
+ });
43
+ for (const entry of sorted) {
44
+ const fullPath = path.join(dir, entry.name);
45
+ if (IGNORE_DIRS.has(entry.name))
46
+ continue;
47
+ if (entry.isDirectory()) {
48
+ const subtree = await this.buildTree(fullPath, depth + 1);
49
+ if (subtree)
50
+ children.push(subtree);
51
+ }
52
+ else if (entry.isFile()) {
53
+ children.push({
54
+ name: entry.name,
55
+ path: fullPath,
56
+ type: 'file',
57
+ });
58
+ }
59
+ }
60
+ // Limit children to 100 to avoid huge trees
61
+ const limited = children.slice(0, 100);
62
+ return {
63
+ name,
64
+ path: dir,
65
+ type: 'directory',
66
+ children: limited,
67
+ };
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=folder-tree.scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-tree.scanner.js","sourceRoot":"","sources":["../../src/scanners/folder-tree.scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ProjectContext, ScanResult, PartialProjectContext } from '../core/types.js';
2
+ import { BaseScanner } from './base.js';
3
+ export declare class FrameworkScanner extends BaseScanner {
4
+ readonly id = "framework";
5
+ readonly name = "Framework Detector";
6
+ readonly description = "Detects frameworks, databases, ORMs, and technologies from dependencies";
7
+ readonly priority = 30;
8
+ readonly dependencies: string[];
9
+ isApplicable(_context: PartialProjectContext): boolean;
10
+ scan(context: ProjectContext): Promise<ScanResult>;
11
+ }
12
+ //# sourceMappingURL=framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/scanners/framework.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAiB,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,EAAE,eAAe;IAC1B,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,WAAW,6EAA6E;IACjG,QAAQ,CAAC,QAAQ,MAAM;IACvB,SAAkB,YAAY,WAAe;IAEpC,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO;IAIhD,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CA8DlE"}
@@ -0,0 +1,71 @@
1
+ import { FRAMEWORK_PATTERNS } from '../core/constants.js';
2
+ import { BaseScanner } from './base.js';
3
+ // ============================================================================
4
+ // DocPilot — Framework & Technology Scanner
5
+ // ============================================================================
6
+ export class FrameworkScanner extends BaseScanner {
7
+ id = 'framework';
8
+ name = 'Framework Detector';
9
+ description = 'Detects frameworks, databases, ORMs, and technologies from dependencies';
10
+ priority = 30;
11
+ dependencies = ['package'];
12
+ isApplicable(_context) {
13
+ return true;
14
+ }
15
+ async scan(context) {
16
+ const frameworks = [];
17
+ // Scan production dependencies
18
+ const proDeps = context.packageJson?.dependencies ?? {};
19
+ const devDeps = context.packageJson?.devDependencies ?? {};
20
+ const allDeps = { ...proDeps, ...devDeps };
21
+ for (const [pkgName, version] of Object.entries(allDeps)) {
22
+ // Check exact match
23
+ let pattern = FRAMEWORK_PATTERNS[pkgName];
24
+ if (pattern) {
25
+ frameworks.push({
26
+ name: pattern.name,
27
+ version: version,
28
+ category: pattern.category,
29
+ confidence: 1.0,
30
+ evidence: [`dependencies.${pkgName}`],
31
+ });
32
+ continue;
33
+ }
34
+ // Check prefix match (e.g., @radix-ui/*, @aws-sdk/*)
35
+ // Sort by key length descending so longer prefixes match first (vitest before vite)
36
+ const sortedPatterns = Object.entries(FRAMEWORK_PATTERNS).sort(([a], [b]) => b.length - a.length);
37
+ for (const [key, val] of sortedPatterns) {
38
+ if (pkgName.startsWith(key)) {
39
+ frameworks.push({
40
+ name: val.name,
41
+ version: version,
42
+ category: val.category,
43
+ confidence: 0.9,
44
+ evidence: [`dependencies.${pkgName}`],
45
+ });
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ // Sort: frontend first, then by confidence desc
51
+ frameworks.sort((a, b) => {
52
+ const order = {
53
+ 'meta-framework': 0,
54
+ 'frontend-framework': 1,
55
+ 'backend-framework': 2,
56
+ 'language': 3,
57
+ 'runtime': 4,
58
+ };
59
+ const aOrder = order[a.category] ?? 99;
60
+ const bOrder = order[b.category] ?? 99;
61
+ return aOrder - bOrder || b.confidence - a.confidence;
62
+ });
63
+ return {
64
+ scannerId: this.id,
65
+ data: { frameworks },
66
+ confidence: frameworks.length > 0 ? 0.95 : 0.3,
67
+ timestamp: new Date(),
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/scanners/framework.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IACtC,EAAE,GAAG,WAAW,CAAC;IACjB,IAAI,GAAG,oBAAoB,CAAC;IAC5B,WAAW,GAAG,yEAAyE,CAAC;IACxF,QAAQ,GAAG,EAAE,CAAC;IACL,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC;IAEpC,YAAY,CAAC,QAA+B;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,KAAK,CAAC,IAAI,CAAC,OAAuB;QACzC,MAAM,UAAU,GAAoB,EAAE,CAAC;QAEvC,+BAA+B;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,YAAY,IAAI,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,eAAe,IAAI,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;QAE3C,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,oBAAoB;YACpB,IAAI,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,OAAO,EAAE,CAAC;gBACZ,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,OAAO,CAAC,QAAqC;oBACvD,UAAU,EAAE,GAAG;oBACf,QAAQ,EAAE,CAAC,gBAAgB,OAAO,EAAE,CAAC;iBACtC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,qDAAqD;YACrD,oFAAoF;YACpF,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAC5D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAClC,CAAC;YACF,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;gBACxC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,OAAO,EAAE,OAAO;wBAChB,QAAQ,EAAE,GAAG,CAAC,QAAqC;wBACnD,UAAU,EAAE,GAAG;wBACf,QAAQ,EAAE,CAAC,gBAAgB,OAAO,EAAE,CAAC;qBACtC,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,KAAK,GAA2B;gBACpC,gBAAgB,EAAE,CAAC;gBACnB,oBAAoB,EAAE,CAAC;gBACvB,mBAAmB,EAAE,CAAC;gBACtB,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC;aACb,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,IAAI,EAAE,EAAE,UAAU,EAAE;YACpB,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;YAC9C,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { ProjectContext, ScanResult, PartialProjectContext } from '../core/types.js';
2
+ import { BaseScanner } from './base.js';
3
+ export declare class GitScanner extends BaseScanner {
4
+ readonly id = "git";
5
+ readonly name = "Git Analyzer";
6
+ readonly description = "Analyzes git history, branches, and contributors";
7
+ readonly priority = 70;
8
+ isApplicable(_context: PartialProjectContext): boolean;
9
+ scan(context: ProjectContext): Promise<ScanResult>;
10
+ }
11
+ //# sourceMappingURL=git.scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/git.scanner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAsB,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,CAAC,EAAE,SAAS;IACpB,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,sDAAsD;IAC1E,QAAQ,CAAC,QAAQ,MAAM;IAEvB,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO;IAIhD,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CAkFzD"}
@@ -0,0 +1,92 @@
1
+ import { execa } from 'execa';
2
+ import { BaseScanner } from './base.js';
3
+ // ============================================================================
4
+ // DocPilot — Git Repository Scanner
5
+ // ============================================================================
6
+ export class GitScanner extends BaseScanner {
7
+ id = 'git';
8
+ name = 'Git Analyzer';
9
+ description = 'Analyzes git history, branches, and contributors';
10
+ priority = 70;
11
+ isApplicable(_context) {
12
+ return true;
13
+ }
14
+ async scan(context) {
15
+ try {
16
+ // Check if git is initialized
17
+ const { stdout: branch } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
18
+ cwd: context.rootPath,
19
+ timeout: 5000,
20
+ }).catch(() => ({ stdout: '' }));
21
+ if (!branch) {
22
+ return {
23
+ scannerId: this.id,
24
+ data: { isInitialized: false },
25
+ confidence: 0.3,
26
+ timestamp: new Date(),
27
+ };
28
+ }
29
+ const [commitsOutput, totalCount, remoteUrl, contributorsOutput] = await Promise.all([
30
+ execa('git', ['log', '--oneline', '-20', '--format=%h|%an|%ai|%s'], {
31
+ cwd: context.rootPath,
32
+ timeout: 5000,
33
+ }).then(r => r.stdout).catch(() => ''),
34
+ execa('git', ['rev-list', '--count', 'HEAD'], {
35
+ cwd: context.rootPath,
36
+ timeout: 5000,
37
+ }).then(r => r.stdout).catch(() => '0'),
38
+ execa('git', ['remote', 'get-url', 'origin'], {
39
+ cwd: context.rootPath,
40
+ timeout: 5000,
41
+ }).then(r => r.stdout).catch(() => ''),
42
+ execa('git', ['shortlog', '-sn', '--all', '-10'], {
43
+ cwd: context.rootPath,
44
+ timeout: 5000,
45
+ }).then(r => r.stdout).catch(() => ''),
46
+ ]);
47
+ const commits = commitsOutput
48
+ .split('\n')
49
+ .filter(Boolean)
50
+ .map(line => {
51
+ const parts = line.split('|');
52
+ return {
53
+ hash: parts[0] ?? '',
54
+ author: parts[1] ?? '',
55
+ date: new Date(parts[2] ?? Date.now()),
56
+ message: parts.slice(3).join('|') || '',
57
+ };
58
+ });
59
+ const contributors = contributorsOutput
60
+ .split('\n')
61
+ .filter(Boolean)
62
+ .map(line => line.replace(/^\s*\d+\s+/, '').trim())
63
+ .filter(Boolean);
64
+ const lastCommit = commits[0];
65
+ const gitInfo = {
66
+ currentBranch: branch,
67
+ totalCommits: parseInt(totalCount, 10) || 0,
68
+ lastCommitDate: lastCommit?.date.toISOString(),
69
+ lastCommitMessage: lastCommit?.message,
70
+ recentCommits: commits,
71
+ contributors: [...new Set(contributors)],
72
+ repositoryUrl: remoteUrl || undefined,
73
+ isInitialized: true,
74
+ };
75
+ return {
76
+ scannerId: this.id,
77
+ data: gitInfo,
78
+ confidence: 1.0,
79
+ timestamp: new Date(),
80
+ };
81
+ }
82
+ catch {
83
+ return {
84
+ scannerId: this.id,
85
+ data: { isInitialized: false },
86
+ confidence: 0.2,
87
+ timestamp: new Date(),
88
+ };
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=git.scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.scanner.js","sourceRoot":"","sources":["../../src/scanners/git.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E,MAAM,OAAO,UAAW,SAAQ,WAAW;IAChC,EAAE,GAAG,KAAK,CAAC;IACX,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,kDAAkD,CAAC;IACjE,QAAQ,GAAG,EAAE,CAAC;IAEvB,YAAY,CAAC,QAA+B;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE;gBACnF,GAAG,EAAE,OAAO,CAAC,QAAQ;gBACrB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,SAAS,EAAE,IAAI,CAAC,EAAE;oBAClB,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;oBAC9B,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACnF,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,wBAAwB,CAAC,EAAE;oBAClE,GAAG,EAAE,OAAO,CAAC,QAAQ;oBACrB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;oBAC5C,GAAG,EAAE,OAAO,CAAC,QAAQ;oBACrB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;gBACvC,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;oBAC5C,GAAG,EAAE,OAAO,CAAC,QAAQ;oBACrB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;oBAChD,GAAG,EAAE,OAAO,CAAC,QAAQ;oBACrB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;aACvC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAgB,aAAa;iBACvC,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,IAAI,CAAC,EAAE;gBACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO;oBACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;oBACpB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;oBACtB,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACtC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;iBACxC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEL,MAAM,YAAY,GAAG,kBAAkB;iBACpC,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAClD,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAY;gBACvB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC;gBAC3C,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE;gBAC9C,iBAAiB,EAAE,UAAU,EAAE,OAAO;gBACtC,aAAa,EAAE,OAAO;gBACtB,YAAY,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;gBACxC,aAAa,EAAE,SAAS,IAAI,SAAS;gBACrC,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,EAAE;gBAClB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,EAAE;gBAClB,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;gBAC9B,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { DocPilotRegistry } from '../core/registry.js';
2
+ export declare function registerDefaultScanners(registry: DocPilotRegistry): void;
3
+ export { PackageScanner } from './package.scanner.js';
4
+ export { FrameworkScanner } from './framework.js';
5
+ export { ConfigFileScanner } from './config-file.scanner.js';
6
+ export { ScriptScanner } from './script.scanner.js';
7
+ export { FolderTreeScanner } from './folder-tree.scanner.js';
8
+ export { EnvVarScanner } from './env-var.scanner.js';
9
+ export { GitScanner } from './git.scanner.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAa5D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAUxE;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { PackageScanner } from './package.scanner.js';
2
+ import { FrameworkScanner } from './framework.js';
3
+ import { ConfigFileScanner } from './config-file.scanner.js';
4
+ import { ScriptScanner } from './script.scanner.js';
5
+ import { FolderTreeScanner } from './folder-tree.scanner.js';
6
+ import { EnvVarScanner } from './env-var.scanner.js';
7
+ import { GitScanner } from './git.scanner.js';
8
+ // ============================================================================
9
+ // DocPilot — Default Scanner Registration
10
+ // ============================================================================
11
+ export function registerDefaultScanners(registry) {
12
+ registry.registerScanners([
13
+ new PackageScanner(), // priority 10 — fastest, most foundational
14
+ new ConfigFileScanner(), // priority 20 — detects config files
15
+ new FrameworkScanner(), // priority 30 — needs package results
16
+ new ScriptScanner(), // priority 40 — needs package results
17
+ new FolderTreeScanner(), // priority 50 — independent
18
+ new EnvVarScanner(), // priority 60 — code scanning
19
+ new GitScanner(), // priority 70 — may be slow (git commands)
20
+ ]);
21
+ }
22
+ export { PackageScanner } from './package.scanner.js';
23
+ export { FrameworkScanner } from './framework.js';
24
+ export { ConfigFileScanner } from './config-file.scanner.js';
25
+ export { ScriptScanner } from './script.scanner.js';
26
+ export { FolderTreeScanner } from './folder-tree.scanner.js';
27
+ export { EnvVarScanner } from './env-var.scanner.js';
28
+ export { GitScanner } from './git.scanner.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAE/E,MAAM,UAAU,uBAAuB,CAAC,QAA0B;IAChE,QAAQ,CAAC,gBAAgB,CAAC;QACxB,IAAI,cAAc,EAAE,EAAQ,2CAA2C;QACvE,IAAI,iBAAiB,EAAE,EAAK,qCAAqC;QACjE,IAAI,gBAAgB,EAAE,EAAM,sCAAsC;QAClE,IAAI,aAAa,EAAE,EAAS,sCAAsC;QAClE,IAAI,iBAAiB,EAAE,EAAK,4BAA4B;QACxD,IAAI,aAAa,EAAE,EAAS,8BAA8B;QAC1D,IAAI,UAAU,EAAE,EAAY,2CAA2C;KACxE,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProjectContext, ScanResult, PartialProjectContext } from '../core/types.js';
2
+ import { BaseScanner } from './base.js';
3
+ export declare class PackageScanner extends BaseScanner {
4
+ readonly id = "package";
5
+ readonly name = "Package Analyzer";
6
+ readonly description = "Parses package.json and analyzes dependencies";
7
+ readonly priority = 10;
8
+ isApplicable(context: PartialProjectContext): boolean;
9
+ scan(context: ProjectContext): Promise<ScanResult>;
10
+ }
11
+ //# sourceMappingURL=package.scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/package.scanner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAmB,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE3G,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,mDAAmD;IACvE,QAAQ,CAAC,QAAQ,MAAM;IAEvB,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO;IAI/C,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CA0DzD"}
@@ -0,0 +1,70 @@
1
+ import path from 'node:path';
2
+ import { readFileSafe } from '../utils/files.js';
3
+ import { BaseScanner } from './base.js';
4
+ // ============================================================================
5
+ // DocPilot — Package.json Scanner
6
+ // ============================================================================
7
+ export class PackageScanner extends BaseScanner {
8
+ id = 'package';
9
+ name = 'Package Analyzer';
10
+ description = 'Parses package.json and analyzes dependencies';
11
+ priority = 10;
12
+ isApplicable(context) {
13
+ return true; // Always checks for package.json
14
+ }
15
+ async scan(context) {
16
+ const pkgPath = path.join(context.rootPath, 'package.json');
17
+ const content = await readFileSafe(pkgPath);
18
+ if (!content) {
19
+ // Check for other package managers
20
+ const hasYarn = await readFileSafe(path.join(context.rootPath, 'yarn.lock'));
21
+ const hasPnpm = await readFileSafe(path.join(context.rootPath, 'pnpm-lock.yaml'));
22
+ return {
23
+ scannerId: this.id,
24
+ data: {
25
+ packageManager: hasYarn ? 'yarn' : hasPnpm ? 'pnpm' : 'unknown',
26
+ lockFiles: {
27
+ yarn: !!hasYarn,
28
+ pnpm: !!hasPnpm,
29
+ },
30
+ },
31
+ confidence: 0.5,
32
+ timestamp: new Date(),
33
+ };
34
+ }
35
+ let pkg;
36
+ try {
37
+ pkg = JSON.parse(content);
38
+ }
39
+ catch {
40
+ return {
41
+ scannerId: this.id,
42
+ data: { error: 'Invalid package.json' },
43
+ confidence: 0,
44
+ timestamp: new Date(),
45
+ };
46
+ }
47
+ const packageJsonInfo = {
48
+ name: pkg['name'] ?? '',
49
+ version: pkg['version'] ?? '',
50
+ description: pkg['description'],
51
+ private: pkg['private'],
52
+ dependencies: pkg['dependencies'] ?? {},
53
+ devDependencies: pkg['devDependencies'] ?? {},
54
+ peerDependencies: pkg['peerDependencies'] ?? {},
55
+ optionalDependencies: pkg['optionalDependencies'] ?? {},
56
+ scripts: pkg['scripts'] ?? {},
57
+ engines: pkg['engines'],
58
+ license: pkg['license'],
59
+ author: typeof pkg['author'] === 'string' ? pkg['author'] : undefined,
60
+ repository: typeof pkg['repository'] === 'string' ? pkg['repository'] : undefined,
61
+ };
62
+ return {
63
+ scannerId: this.id,
64
+ data: packageJsonInfo,
65
+ confidence: 1.0,
66
+ timestamp: new Date(),
67
+ };
68
+ }
69
+ }
70
+ //# sourceMappingURL=package.scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.scanner.js","sourceRoot":"","sources":["../../src/scanners/package.scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ProjectContext, ScanResult, PartialProjectContext } from '../core/types.js';
2
+ import { BaseScanner } from './base.js';
3
+ export declare class ScriptScanner extends BaseScanner {
4
+ readonly id = "scripts";
5
+ readonly name = "Script Analyzer";
6
+ readonly description = "Analyzes npm scripts and infers their purposes";
7
+ readonly priority = 40;
8
+ readonly dependencies: string[];
9
+ isApplicable(context: PartialProjectContext): boolean;
10
+ scan(context: ProjectContext): Promise<ScanResult>;
11
+ }
12
+ //# sourceMappingURL=script.scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/script.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAc,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA8CxC,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,WAAW,oDAAoD;IACxE,QAAQ,CAAC,QAAQ,MAAM;IACvB,SAAkB,YAAY,WAAe;IAEpC,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO;IAI/C,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CAqBlE"}