codedev-mcp 3.2.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 (229) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/LICENSE +21 -0
  3. package/README.md +760 -0
  4. package/dist/analyzers/api-contract.d.ts +46 -0
  5. package/dist/analyzers/api-contract.d.ts.map +1 -0
  6. package/dist/analyzers/api-contract.js +319 -0
  7. package/dist/analyzers/api-contract.js.map +1 -0
  8. package/dist/analyzers/architecture.d.ts +37 -0
  9. package/dist/analyzers/architecture.d.ts.map +1 -0
  10. package/dist/analyzers/architecture.js +149 -0
  11. package/dist/analyzers/architecture.js.map +1 -0
  12. package/dist/analyzers/branch-compare.d.ts +46 -0
  13. package/dist/analyzers/branch-compare.d.ts.map +1 -0
  14. package/dist/analyzers/branch-compare.js +128 -0
  15. package/dist/analyzers/branch-compare.js.map +1 -0
  16. package/dist/analyzers/cicd.d.ts +42 -0
  17. package/dist/analyzers/cicd.d.ts.map +1 -0
  18. package/dist/analyzers/cicd.js +237 -0
  19. package/dist/analyzers/cicd.js.map +1 -0
  20. package/dist/analyzers/codebase.d.ts +64 -0
  21. package/dist/analyzers/codebase.d.ts.map +1 -0
  22. package/dist/analyzers/codebase.js +354 -0
  23. package/dist/analyzers/codebase.js.map +1 -0
  24. package/dist/analyzers/complexity-heatmap.d.ts +50 -0
  25. package/dist/analyzers/complexity-heatmap.d.ts.map +1 -0
  26. package/dist/analyzers/complexity-heatmap.js +156 -0
  27. package/dist/analyzers/complexity-heatmap.js.map +1 -0
  28. package/dist/analyzers/context-pack.d.ts +43 -0
  29. package/dist/analyzers/context-pack.d.ts.map +1 -0
  30. package/dist/analyzers/context-pack.js +232 -0
  31. package/dist/analyzers/context-pack.js.map +1 -0
  32. package/dist/analyzers/coverage.d.ts +70 -0
  33. package/dist/analyzers/coverage.d.ts.map +1 -0
  34. package/dist/analyzers/coverage.js +313 -0
  35. package/dist/analyzers/coverage.js.map +1 -0
  36. package/dist/analyzers/db-schema.d.ts +55 -0
  37. package/dist/analyzers/db-schema.d.ts.map +1 -0
  38. package/dist/analyzers/db-schema.js +237 -0
  39. package/dist/analyzers/db-schema.js.map +1 -0
  40. package/dist/analyzers/dead-code.d.ts +34 -0
  41. package/dist/analyzers/dead-code.d.ts.map +1 -0
  42. package/dist/analyzers/dead-code.js +131 -0
  43. package/dist/analyzers/dead-code.js.map +1 -0
  44. package/dist/analyzers/dep-vuln.d.ts +36 -0
  45. package/dist/analyzers/dep-vuln.d.ts.map +1 -0
  46. package/dist/analyzers/dep-vuln.js +342 -0
  47. package/dist/analyzers/dep-vuln.js.map +1 -0
  48. package/dist/analyzers/docs.d.ts +47 -0
  49. package/dist/analyzers/docs.d.ts.map +1 -0
  50. package/dist/analyzers/docs.js +473 -0
  51. package/dist/analyzers/docs.js.map +1 -0
  52. package/dist/analyzers/git.d.ts +115 -0
  53. package/dist/analyzers/git.d.ts.map +1 -0
  54. package/dist/analyzers/git.js +214 -0
  55. package/dist/analyzers/git.js.map +1 -0
  56. package/dist/analyzers/iac.d.ts +39 -0
  57. package/dist/analyzers/iac.d.ts.map +1 -0
  58. package/dist/analyzers/iac.js +233 -0
  59. package/dist/analyzers/iac.js.map +1 -0
  60. package/dist/analyzers/impact.d.ts +51 -0
  61. package/dist/analyzers/impact.d.ts.map +1 -0
  62. package/dist/analyzers/impact.js +235 -0
  63. package/dist/analyzers/impact.js.map +1 -0
  64. package/dist/analyzers/monorepo.d.ts +36 -0
  65. package/dist/analyzers/monorepo.d.ts.map +1 -0
  66. package/dist/analyzers/monorepo.js +233 -0
  67. package/dist/analyzers/monorepo.js.map +1 -0
  68. package/dist/analyzers/notebook.d.ts +53 -0
  69. package/dist/analyzers/notebook.d.ts.map +1 -0
  70. package/dist/analyzers/notebook.js +149 -0
  71. package/dist/analyzers/notebook.js.map +1 -0
  72. package/dist/analyzers/perf-profile.d.ts +39 -0
  73. package/dist/analyzers/perf-profile.d.ts.map +1 -0
  74. package/dist/analyzers/perf-profile.js +222 -0
  75. package/dist/analyzers/perf-profile.js.map +1 -0
  76. package/dist/analyzers/scaffold.d.ts +46 -0
  77. package/dist/analyzers/scaffold.d.ts.map +1 -0
  78. package/dist/analyzers/scaffold.js +313 -0
  79. package/dist/analyzers/scaffold.js.map +1 -0
  80. package/dist/analyzers/security.d.ts +42 -0
  81. package/dist/analyzers/security.d.ts.map +1 -0
  82. package/dist/analyzers/security.js +281 -0
  83. package/dist/analyzers/security.js.map +1 -0
  84. package/dist/analyzers/symbols.d.ts +49 -0
  85. package/dist/analyzers/symbols.d.ts.map +1 -0
  86. package/dist/analyzers/symbols.js +212 -0
  87. package/dist/analyzers/symbols.js.map +1 -0
  88. package/dist/analyzers/tree-sitter.d.ts +71 -0
  89. package/dist/analyzers/tree-sitter.d.ts.map +1 -0
  90. package/dist/analyzers/tree-sitter.js +333 -0
  91. package/dist/analyzers/tree-sitter.js.map +1 -0
  92. package/dist/analyzers/type-flow.d.ts +39 -0
  93. package/dist/analyzers/type-flow.d.ts.map +1 -0
  94. package/dist/analyzers/type-flow.js +75 -0
  95. package/dist/analyzers/type-flow.js.map +1 -0
  96. package/dist/cache/memory-cache.d.ts +130 -0
  97. package/dist/cache/memory-cache.d.ts.map +1 -0
  98. package/dist/cache/memory-cache.js +273 -0
  99. package/dist/cache/memory-cache.js.map +1 -0
  100. package/dist/config.d.ts +32 -0
  101. package/dist/config.d.ts.map +1 -0
  102. package/dist/config.js +57 -0
  103. package/dist/config.js.map +1 -0
  104. package/dist/constants/instructions.d.ts +2 -0
  105. package/dist/constants/instructions.d.ts.map +1 -0
  106. package/dist/constants/instructions.js +82 -0
  107. package/dist/constants/instructions.js.map +1 -0
  108. package/dist/db/connection.d.ts +12 -0
  109. package/dist/db/connection.d.ts.map +1 -0
  110. package/dist/db/connection.js +34 -0
  111. package/dist/db/connection.js.map +1 -0
  112. package/dist/db/json-store.d.ts +111 -0
  113. package/dist/db/json-store.d.ts.map +1 -0
  114. package/dist/db/json-store.js +201 -0
  115. package/dist/db/json-store.js.map +1 -0
  116. package/dist/db/sqlite-store.d.ts +153 -0
  117. package/dist/db/sqlite-store.d.ts.map +1 -0
  118. package/dist/db/sqlite-store.js +388 -0
  119. package/dist/db/sqlite-store.js.map +1 -0
  120. package/dist/index.d.ts +17 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +116 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/resources/health.d.ts +35 -0
  125. package/dist/resources/health.d.ts.map +1 -0
  126. package/dist/resources/health.js +81 -0
  127. package/dist/resources/health.js.map +1 -0
  128. package/dist/schemas/output-schemas.d.ts +517 -0
  129. package/dist/schemas/output-schemas.d.ts.map +1 -0
  130. package/dist/schemas/output-schemas.js +296 -0
  131. package/dist/schemas/output-schemas.js.map +1 -0
  132. package/dist/search/fast-search.d.ts +90 -0
  133. package/dist/search/fast-search.d.ts.map +1 -0
  134. package/dist/search/fast-search.js +387 -0
  135. package/dist/search/fast-search.js.map +1 -0
  136. package/dist/search/semantic.d.ts +26 -0
  137. package/dist/search/semantic.d.ts.map +1 -0
  138. package/dist/search/semantic.js +458 -0
  139. package/dist/search/semantic.js.map +1 -0
  140. package/dist/tools/analysis.d.ts +7 -0
  141. package/dist/tools/analysis.d.ts.map +1 -0
  142. package/dist/tools/analysis.js +491 -0
  143. package/dist/tools/analysis.js.map +1 -0
  144. package/dist/tools/architecture.d.ts +7 -0
  145. package/dist/tools/architecture.d.ts.map +1 -0
  146. package/dist/tools/architecture.js +176 -0
  147. package/dist/tools/architecture.js.map +1 -0
  148. package/dist/tools/devops.d.ts +7 -0
  149. package/dist/tools/devops.d.ts.map +1 -0
  150. package/dist/tools/devops.js +179 -0
  151. package/dist/tools/devops.js.map +1 -0
  152. package/dist/tools/docs.d.ts +7 -0
  153. package/dist/tools/docs.d.ts.map +1 -0
  154. package/dist/tools/docs.js +102 -0
  155. package/dist/tools/docs.js.map +1 -0
  156. package/dist/tools/git.d.ts +7 -0
  157. package/dist/tools/git.d.ts.map +1 -0
  158. package/dist/tools/git.js +475 -0
  159. package/dist/tools/git.js.map +1 -0
  160. package/dist/tools/nav.d.ts +7 -0
  161. package/dist/tools/nav.d.ts.map +1 -0
  162. package/dist/tools/nav.js +275 -0
  163. package/dist/tools/nav.js.map +1 -0
  164. package/dist/tools/notebook.d.ts +7 -0
  165. package/dist/tools/notebook.d.ts.map +1 -0
  166. package/dist/tools/notebook.js +102 -0
  167. package/dist/tools/notebook.js.map +1 -0
  168. package/dist/tools/performance.d.ts +7 -0
  169. package/dist/tools/performance.d.ts.map +1 -0
  170. package/dist/tools/performance.js +59 -0
  171. package/dist/tools/performance.js.map +1 -0
  172. package/dist/tools/quality.d.ts +7 -0
  173. package/dist/tools/quality.d.ts.map +1 -0
  174. package/dist/tools/quality.js +279 -0
  175. package/dist/tools/quality.js.map +1 -0
  176. package/dist/tools/scaffold.d.ts +7 -0
  177. package/dist/tools/scaffold.d.ts.map +1 -0
  178. package/dist/tools/scaffold.js +80 -0
  179. package/dist/tools/scaffold.js.map +1 -0
  180. package/dist/tools/search.d.ts +7 -0
  181. package/dist/tools/search.d.ts.map +1 -0
  182. package/dist/tools/search.js +308 -0
  183. package/dist/tools/search.js.map +1 -0
  184. package/dist/tools/security.d.ts +7 -0
  185. package/dist/tools/security.d.ts.map +1 -0
  186. package/dist/tools/security.js +138 -0
  187. package/dist/tools/security.js.map +1 -0
  188. package/dist/utils/analytics.d.ts +69 -0
  189. package/dist/utils/analytics.d.ts.map +1 -0
  190. package/dist/utils/analytics.js +144 -0
  191. package/dist/utils/analytics.js.map +1 -0
  192. package/dist/utils/concurrency.d.ts +43 -0
  193. package/dist/utils/concurrency.d.ts.map +1 -0
  194. package/dist/utils/concurrency.js +78 -0
  195. package/dist/utils/concurrency.js.map +1 -0
  196. package/dist/utils/fallback.d.ts +52 -0
  197. package/dist/utils/fallback.d.ts.map +1 -0
  198. package/dist/utils/fallback.js +137 -0
  199. package/dist/utils/fallback.js.map +1 -0
  200. package/dist/utils/git-hooks.d.ts +24 -0
  201. package/dist/utils/git-hooks.d.ts.map +1 -0
  202. package/dist/utils/git-hooks.js +108 -0
  203. package/dist/utils/git-hooks.js.map +1 -0
  204. package/dist/utils/languages.d.ts +72 -0
  205. package/dist/utils/languages.d.ts.map +1 -0
  206. package/dist/utils/languages.js +463 -0
  207. package/dist/utils/languages.js.map +1 -0
  208. package/dist/utils/logger.d.ts +13 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/logger.js +34 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/plugins.d.ts +105 -0
  213. package/dist/utils/plugins.d.ts.map +1 -0
  214. package/dist/utils/plugins.js +325 -0
  215. package/dist/utils/plugins.js.map +1 -0
  216. package/dist/utils/security.d.ts +17 -0
  217. package/dist/utils/security.d.ts.map +1 -0
  218. package/dist/utils/security.js +48 -0
  219. package/dist/utils/security.js.map +1 -0
  220. package/dist/utils/streaming.d.ts +56 -0
  221. package/dist/utils/streaming.d.ts.map +1 -0
  222. package/dist/utils/streaming.js +95 -0
  223. package/dist/utils/streaming.js.map +1 -0
  224. package/dist/version.d.ts +3 -0
  225. package/dist/version.d.ts.map +1 -0
  226. package/dist/version.js +3 -0
  227. package/dist/version.js.map +1 -0
  228. package/mcp.json +100 -0
  229. package/package.json +89 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Branch Compare
3
+ * Structural diff between two git branches — new files, changed symbols,
4
+ * removed exports, stats summary.
5
+ */
6
+ import { execFile } from 'node:child_process';
7
+ import { promisify } from 'node:util';
8
+ const exec = promisify(execFile);
9
+ /**
10
+ * Compare two git branches and return structural diff information.
11
+ * @param cwd - The working directory of the git repository.
12
+ * @param base - The base branch name.
13
+ * @param compare - The comparison branch name.
14
+ * @param options - Configuration options.
15
+ * @param options.includeStats - Whether to include diff stats.
16
+ * @param options.showConflicts - Whether to detect potential merge conflicts.
17
+ * @returns The branch comparison result.
18
+ */
19
+ export async function compareBranches(cwd, base, compare, options) {
20
+ const compareBranch = compare || 'HEAD';
21
+ // Get file changes between branches
22
+ const { stdout: diffOutput } = await exec('git', ['diff', '--name-status', '--diff-filter=ACDMRT', `${base}...${compareBranch}`], { cwd, maxBuffer: 10 * 1024 * 1024 });
23
+ const added = [];
24
+ const modified = [];
25
+ const deleted = [];
26
+ const renamed = [];
27
+ for (const line of diffOutput.trim().split('\n')) {
28
+ if (!line.trim())
29
+ continue;
30
+ const parts = line.split('\t');
31
+ const status = parts[0];
32
+ if (status.startsWith('A'))
33
+ added.push(parts[1]);
34
+ else if (status.startsWith('M'))
35
+ modified.push(parts[1]);
36
+ else if (status.startsWith('D'))
37
+ deleted.push(parts[1]);
38
+ else if (status.startsWith('R'))
39
+ renamed.push({ from: parts[1], to: parts[2] });
40
+ // Copy
41
+ else if (status.startsWith('C'))
42
+ added.push(parts[2]);
43
+ // Type change
44
+ else if (status.startsWith('T'))
45
+ modified.push(parts[1]);
46
+ }
47
+ // Get diff stats (insertions/deletions per file)
48
+ const diffStat = [];
49
+ if (options?.includeStats !== false) {
50
+ try {
51
+ const { stdout: numstat } = await exec('git', ['diff', '--numstat', `${base}...${compareBranch}`], {
52
+ cwd,
53
+ maxBuffer: 10 * 1024 * 1024,
54
+ });
55
+ for (const line of numstat.trim().split('\n')) {
56
+ if (!line.trim())
57
+ continue;
58
+ const [ins, del, file] = line.split('\t');
59
+ if (file) {
60
+ diffStat.push({
61
+ file,
62
+ insertions: ins === '-' ? 0 : parseInt(ins, 10),
63
+ deletions: del === '-' ? 0 : parseInt(del, 10),
64
+ });
65
+ }
66
+ }
67
+ diffStat.sort((a, b) => b.insertions + b.deletions - (a.insertions + a.deletions));
68
+ }
69
+ catch {
70
+ /* numstat may fail on binary files */
71
+ }
72
+ }
73
+ // Count commits ahead/behind
74
+ let commitsAhead = 0, commitsBehind = 0;
75
+ try {
76
+ const { stdout: revCount } = await exec('git', ['rev-list', '--left-right', '--count', `${base}...${compareBranch}`], { cwd });
77
+ const [behind, ahead] = revCount.trim().split('\t').map(Number);
78
+ commitsBehind = behind || 0;
79
+ commitsAhead = ahead || 0;
80
+ }
81
+ catch {
82
+ /* ignore */
83
+ }
84
+ // Check for potential merge conflicts
85
+ const conflictFiles = [];
86
+ if (options?.showConflicts) {
87
+ try {
88
+ // Find files modified in both branches relative to merge-base
89
+ const { stdout: mergeBase } = await exec('git', ['merge-base', base, compareBranch], { cwd });
90
+ const mb = mergeBase.trim();
91
+ if (mb) {
92
+ const { stdout: baseChanges } = await exec('git', ['diff', '--name-only', `${mb}...${base}`], { cwd });
93
+ const { stdout: compareChanges } = await exec('git', ['diff', '--name-only', `${mb}...${compareBranch}`], {
94
+ cwd,
95
+ });
96
+ const baseFiles = new Set(baseChanges.trim().split('\n').filter(Boolean));
97
+ const compareFiles = compareChanges.trim().split('\n').filter(Boolean);
98
+ for (const f of compareFiles) {
99
+ if (baseFiles.has(f))
100
+ conflictFiles.push(f);
101
+ }
102
+ }
103
+ }
104
+ catch {
105
+ /* ignore */
106
+ }
107
+ }
108
+ return {
109
+ base,
110
+ compare: compareBranch,
111
+ stats: {
112
+ filesAdded: added.length,
113
+ filesModified: modified.length,
114
+ filesDeleted: deleted.length,
115
+ filesRenamed: renamed.length,
116
+ totalChanges: added.length + modified.length + deleted.length + renamed.length,
117
+ },
118
+ added,
119
+ modified,
120
+ deleted,
121
+ renamed,
122
+ diffStat: diffStat.slice(0, 50),
123
+ commitsAhead,
124
+ commitsBehind,
125
+ conflictFiles,
126
+ };
127
+ }
128
+ //# sourceMappingURL=branch-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-compare.js","sourceRoot":"","sources":["../../src/analyzers/branch-compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * CI/CD Configuration Parser
3
+ * Parses GitHub Actions, GitLab CI, Jenkins, CircleCI pipelines.
4
+ * Extracts jobs, triggers, dependencies, and potential issues.
5
+ */
6
+ export interface CICDJob {
7
+ name: string;
8
+ triggers: string[];
9
+ steps: string[];
10
+ runsOn?: string;
11
+ dependsOn?: string[];
12
+ env?: Record<string, string>;
13
+ secrets?: string[];
14
+ timeout?: string;
15
+ }
16
+ export interface CICDPipeline {
17
+ platform: 'github-actions' | 'gitlab-ci' | 'jenkins' | 'circleci' | 'unknown';
18
+ file: string;
19
+ name?: string;
20
+ triggers: string[];
21
+ jobs: CICDJob[];
22
+ issues: {
23
+ severity: 'warning' | 'error';
24
+ message: string;
25
+ line?: number;
26
+ }[];
27
+ }
28
+ export interface CICDResult {
29
+ pipelines: CICDPipeline[];
30
+ summary: {
31
+ totalPipelines: number;
32
+ totalJobs: number;
33
+ totalIssues: number;
34
+ };
35
+ }
36
+ /**
37
+ * Parse CI/CD pipeline configurations from the project directory.
38
+ * @param cwd - The working directory to scan.
39
+ * @returns The parsed CI/CD configuration result.
40
+ */
41
+ export declare function parseCICD(cwd: string): Promise<CICDResult>;
42
+ //# sourceMappingURL=cicd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cicd.d.ts","sourceRoot":"","sources":["../../src/analyzers/cicd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,MAAM,EAAE;QAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7E;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAiKD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyEhE"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * CI/CD Configuration Parser
3
+ * Parses GitHub Actions, GitLab CI, Jenkins, CircleCI pipelines.
4
+ * Extracts jobs, triggers, dependencies, and potential issues.
5
+ */
6
+ import { readFile } from 'node:fs/promises';
7
+ import { existsSync } from 'node:fs';
8
+ import { listFiles } from '../search/fast-search.js';
9
+ import path from 'node:path';
10
+ function parseGitHubActions(content, file) {
11
+ const jobs = [];
12
+ const triggers = [];
13
+ const issues = [];
14
+ let pipelineName = '';
15
+ const lines = content.split('\n');
16
+ // Extract name
17
+ const nameMatch = content.match(/^name:\s*(.+)/m);
18
+ if (nameMatch)
19
+ pipelineName = nameMatch[1].trim().replace(/['"]/g, '');
20
+ // Extract triggers (on: section)
21
+ const onMatch = content.match(/^on:\s*\n((?:\s+.+\n)*)/m);
22
+ if (onMatch) {
23
+ const triggerLines = onMatch[1].split('\n').filter((l) => l.trim() && !l.trim().startsWith('#'));
24
+ for (const tl of triggerLines) {
25
+ const trigger = tl.trim().replace(/:$/, '');
26
+ if (trigger && !trigger.startsWith('-') && !trigger.startsWith('#')) {
27
+ triggers.push(trigger);
28
+ }
29
+ }
30
+ }
31
+ // Single-line triggers: on: [push, pull_request]
32
+ const onSingleMatch = content.match(/^on:\s*\[([^\]]+)\]/m);
33
+ if (onSingleMatch) {
34
+ triggers.push(...onSingleMatch[1].split(',').map((t) => t.trim()));
35
+ }
36
+ const onSimpleMatch = content.match(/^on:\s+(\w+)/m);
37
+ if (onSimpleMatch && triggers.length === 0)
38
+ triggers.push(onSimpleMatch[1]);
39
+ // Extract jobs
40
+ const jobsSection = content.indexOf('\njobs:');
41
+ if (jobsSection >= 0) {
42
+ const jobContent = content.slice(jobsSection);
43
+ const jobMatches = jobContent.matchAll(/^ {2}(\w[\w-]*):/gm);
44
+ for (const match of jobMatches) {
45
+ const jobName = match[1];
46
+ if (jobName === 'jobs')
47
+ continue;
48
+ const job = { name: jobName, triggers: [], steps: [] };
49
+ // Find job block
50
+ const jobStart = jobContent.indexOf(` ${jobName}:`);
51
+ const nextJob = jobContent.slice(jobStart + 1).search(/^\s{2}\w/m);
52
+ const jobBlock = nextJob > 0 ? jobContent.slice(jobStart, jobStart + 1 + nextJob) : jobContent.slice(jobStart);
53
+ // runs-on
54
+ const runsOn = jobBlock.match(/runs-on:\s*(.+)/);
55
+ if (runsOn)
56
+ job.runsOn = runsOn[1].trim();
57
+ // needs (dependencies)
58
+ const needs = jobBlock.match(/needs:\s*\[?([^\]\n]+)/);
59
+ if (needs)
60
+ job.dependsOn = needs[1].split(',').map((n) => n.trim().replace(/['"]/g, ''));
61
+ // steps
62
+ const stepMatches = jobBlock.matchAll(/- (?:name:\s*(.+)|uses:\s*(.+)|run:\s*(.+))/g);
63
+ for (const step of stepMatches) {
64
+ job.steps.push(step[1] || step[2] || step[3] || 'unnamed step');
65
+ }
66
+ // secrets
67
+ const secretMatches = jobBlock.matchAll(/\$\{\{\s*secrets\.(\w+)\s*\}\}/g);
68
+ const secrets = new Set();
69
+ for (const s of secretMatches)
70
+ secrets.add(s[1]);
71
+ if (secrets.size > 0)
72
+ job.secrets = [...secrets];
73
+ jobs.push(job);
74
+ }
75
+ }
76
+ // Common issues
77
+ if (triggers.length === 0)
78
+ issues.push({ severity: 'warning', message: 'No triggers defined — workflow will never run automatically' });
79
+ for (const job of jobs) {
80
+ if (!job.runsOn)
81
+ issues.push({ severity: 'warning', message: `Job "${job.name}" has no runs-on defined` });
82
+ for (const step of job.steps) {
83
+ if (step.includes('@master') || step.includes('@main')) {
84
+ issues.push({ severity: 'warning', message: `Job "${job.name}" uses unpinned action ref: ${step}` });
85
+ }
86
+ }
87
+ }
88
+ // Check for hardcoded secrets
89
+ for (let i = 0; i < lines.length; i++) {
90
+ if (/password|secret|token|api[_-]?key/i.test(lines[i]) &&
91
+ !lines[i].includes('secrets.') &&
92
+ !lines[i].includes('${{')) {
93
+ if (lines[i].includes(':') && !lines[i].trim().startsWith('#')) {
94
+ issues.push({ severity: 'error', message: `Possible hardcoded secret at line ${i + 1}`, line: i + 1 });
95
+ }
96
+ }
97
+ }
98
+ return { platform: 'github-actions', file, name: pipelineName, triggers, jobs, issues };
99
+ }
100
+ function parseGitLabCI(content, file) {
101
+ const jobs = [];
102
+ const issues = [];
103
+ const lines = content.split('\n');
104
+ // GitLab CI: top-level keys that aren't reserved are jobs
105
+ const reserved = new Set([
106
+ 'image',
107
+ 'services',
108
+ 'stages',
109
+ 'variables',
110
+ 'before_script',
111
+ 'after_script',
112
+ 'cache',
113
+ 'include',
114
+ 'workflow',
115
+ 'default',
116
+ 'pages',
117
+ ]);
118
+ let currentJobName = '';
119
+ let currentJob = null;
120
+ for (const line of lines) {
121
+ // Top-level key (no indentation, ends with colon)
122
+ const topLevel = line.match(/^(\w[\w-]*):/);
123
+ if (topLevel && !reserved.has(topLevel[1])) {
124
+ if (currentJob)
125
+ jobs.push(currentJob);
126
+ currentJobName = topLevel[1];
127
+ currentJob = { name: currentJobName, triggers: [], steps: [] };
128
+ continue;
129
+ }
130
+ if (currentJob) {
131
+ const trimmed = line.trim();
132
+ if (/^stage:\s*(.+)/.test(trimmed)) {
133
+ currentJob.triggers.push(trimmed.match(/^stage:\s*(.+)/)[1]);
134
+ }
135
+ if (/^script:/.test(trimmed) || /^-\s+(.+)/.test(trimmed)) {
136
+ const cmd = trimmed.replace(/^-\s+/, '').replace(/^script:\s*/, '');
137
+ if (cmd && cmd !== 'script:')
138
+ currentJob.steps.push(cmd);
139
+ }
140
+ if (/^needs:/.test(trimmed)) {
141
+ const depsMatch = line.match(/needs:\s*\[([^\]]+)\]/);
142
+ if (depsMatch)
143
+ currentJob.dependsOn = depsMatch[1].split(',').map((d) => d.trim().replace(/['"]/g, ''));
144
+ }
145
+ }
146
+ }
147
+ if (currentJob)
148
+ jobs.push(currentJob);
149
+ // Extract stages for triggers
150
+ const stagesMatch = content.match(/^stages:\s*\n((?:\s+- .+\n)*)/m);
151
+ const stages = stagesMatch
152
+ ? stagesMatch[1]
153
+ .split('\n')
154
+ .map((l) => l.trim().replace(/^- /, ''))
155
+ .filter(Boolean)
156
+ : [];
157
+ return { platform: 'gitlab-ci', file, triggers: stages, jobs, issues };
158
+ }
159
+ /**
160
+ * Parse CI/CD pipeline configurations from the project directory.
161
+ * @param cwd - The working directory to scan.
162
+ * @returns The parsed CI/CD configuration result.
163
+ */
164
+ export async function parseCICD(cwd) {
165
+ const pipelines = [];
166
+ // GitHub Actions
167
+ try {
168
+ const ghDir = path.join(cwd, '.github', 'workflows');
169
+ const ghFiles = await listFiles(ghDir, { glob: '*.{yml,yaml}' }).catch(() => []);
170
+ for (const file of ghFiles) {
171
+ try {
172
+ const content = await readFile(path.resolve(ghDir, file), 'utf-8');
173
+ pipelines.push(parseGitHubActions(content, `.github/workflows/${file}`));
174
+ }
175
+ catch {
176
+ /* skip */
177
+ }
178
+ }
179
+ }
180
+ catch {
181
+ /* no github actions */
182
+ }
183
+ // GitLab CI
184
+ const gitlabFile = path.join(cwd, '.gitlab-ci.yml');
185
+ if (existsSync(gitlabFile)) {
186
+ try {
187
+ const content = await readFile(gitlabFile, 'utf-8');
188
+ pipelines.push(parseGitLabCI(content, '.gitlab-ci.yml'));
189
+ }
190
+ catch {
191
+ /* skip */
192
+ }
193
+ }
194
+ // Jenkinsfile
195
+ const jenkinsFile = path.join(cwd, 'Jenkinsfile');
196
+ if (existsSync(jenkinsFile)) {
197
+ try {
198
+ const content = await readFile(jenkinsFile, 'utf-8');
199
+ const stages = [...content.matchAll(/stage\s*\(\s*['"](.+?)['"]\s*\)/g)].map((m) => m[1]);
200
+ pipelines.push({
201
+ platform: 'jenkins',
202
+ file: 'Jenkinsfile',
203
+ triggers: [],
204
+ jobs: stages.map((s) => ({ name: s, triggers: [], steps: [] })),
205
+ issues: [],
206
+ });
207
+ }
208
+ catch {
209
+ /* skip */
210
+ }
211
+ }
212
+ // CircleCI
213
+ const circleFile = path.join(cwd, '.circleci', 'config.yml');
214
+ if (existsSync(circleFile)) {
215
+ try {
216
+ const content = await readFile(circleFile, 'utf-8');
217
+ const jobMatches = [...content.matchAll(/^ {2}(\w[\w-]*):/gm)];
218
+ pipelines.push({
219
+ platform: 'circleci',
220
+ file: '.circleci/config.yml',
221
+ triggers: [],
222
+ jobs: jobMatches.map((m) => ({ name: m[1], triggers: [], steps: [] })),
223
+ issues: [],
224
+ });
225
+ }
226
+ catch {
227
+ /* skip */
228
+ }
229
+ }
230
+ const totalJobs = pipelines.reduce((sum, p) => sum + p.jobs.length, 0);
231
+ const totalIssues = pipelines.reduce((sum, p) => sum + p.issues.length, 0);
232
+ return {
233
+ pipelines,
234
+ summary: { totalPipelines: pipelines.length, totalJobs, totalIssues },
235
+ };
236
+ }
237
+ //# sourceMappingURL=cicd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cicd.js","sourceRoot":"","sources":["../../src/analyzers/cicd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Codebase Mapper
3
+ * Generates comprehensive overview of any codebase
4
+ * Handles small to large enterprise codebases efficiently
5
+ */
6
+ import { type Symbol } from './symbols.js';
7
+ /**
8
+ * Statistics and metadata about the analyzed codebase.
9
+ */
10
+ export interface CodebaseStats {
11
+ totalFiles: number;
12
+ totalCodeFiles: number;
13
+ totalDirectories: number;
14
+ languageBreakdown: Record<string, {
15
+ files: number;
16
+ percentage: number;
17
+ }>;
18
+ topDirectories: {
19
+ path: string;
20
+ files: number;
21
+ }[];
22
+ estimatedSize: 'small' | 'medium' | 'large' | 'enterprise';
23
+ frameworks: string[];
24
+ packageManagers: string[];
25
+ hasTests: boolean;
26
+ hasCI: boolean;
27
+ hasDocs: boolean;
28
+ hasDocker: boolean;
29
+ }
30
+ /**
31
+ * Result of the codebase mapping process.
32
+ */
33
+ export interface CodebaseMapResult {
34
+ stats: CodebaseStats;
35
+ tree: string;
36
+ summary: string;
37
+ }
38
+ /**
39
+ * Generates a full overview of the codebase at the specified directory.
40
+ *
41
+ * @param cwd - The root directory of the codebase to map.
42
+ * @returns A promise resolving to the codebase statistics, tree structure, and summary string.
43
+ */
44
+ export declare function mapCodebase(cwd: string): Promise<CodebaseMapResult>;
45
+ /**
46
+ * Options for symbol mapping.
47
+ */
48
+ export interface MapSymbolsOptions {
49
+ maxFiles?: number;
50
+ language?: string;
51
+ directory?: string;
52
+ }
53
+ /**
54
+ * Maps symbols (functions, classes, etc.) for code files in the codebase.
55
+ *
56
+ * @param cwd - Root directory.
57
+ * @param options - Filtering and limit options.
58
+ * @returns List of files with their extracted symbols.
59
+ */
60
+ export declare function mapSymbols(cwd: string, options?: MapSymbolsOptions): Promise<{
61
+ file: string;
62
+ symbols: Symbol[];
63
+ }[]>;
64
+ //# sourceMappingURL=codebase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase.d.ts","sourceRoot":"","sources":["../../src/analyzers/codebase.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,aAAa,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;IAC3D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAgDD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgFzE;AA+LD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,CAAC,CAgChD"}