@thoughtflow/codebase 0.2.0 → 0.3.1

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 (222) hide show
  1. package/package.json +4 -3
  2. package/tsconfig.json +13 -2
  3. package/dist/contexts/context-decomposer.d.ts +0 -13
  4. package/dist/contexts/context-decomposer.d.ts.map +0 -1
  5. package/dist/contexts/context-decomposer.js +0 -97
  6. package/dist/contexts/context-decomposer.js.map +0 -1
  7. package/dist/contexts/context-document-manager.d.ts +0 -21
  8. package/dist/contexts/context-document-manager.d.ts.map +0 -1
  9. package/dist/contexts/context-document-manager.js +0 -69
  10. package/dist/contexts/context-document-manager.js.map +0 -1
  11. package/dist/contexts/context-router.d.ts +0 -13
  12. package/dist/contexts/context-router.d.ts.map +0 -1
  13. package/dist/contexts/context-router.js +0 -94
  14. package/dist/contexts/context-router.js.map +0 -1
  15. package/dist/index.d.ts +0 -53
  16. package/dist/index.d.ts.map +0 -1
  17. package/dist/index.js +0 -76
  18. package/dist/index.js.map +0 -1
  19. package/dist/libs/codebase/deep-analyzer.d.ts +0 -58
  20. package/dist/libs/codebase/deep-analyzer.d.ts.map +0 -1
  21. package/dist/libs/codebase/deep-analyzer.js +0 -239
  22. package/dist/libs/codebase/deep-analyzer.js.map +0 -1
  23. package/dist/libs/codebase/graph/dependency-extractor.d.ts +0 -20
  24. package/dist/libs/codebase/graph/dependency-extractor.d.ts.map +0 -1
  25. package/dist/libs/codebase/graph/dependency-extractor.js +0 -174
  26. package/dist/libs/codebase/graph/dependency-extractor.js.map +0 -1
  27. package/dist/libs/codebase/graph/graph-analysis.d.ts +0 -42
  28. package/dist/libs/codebase/graph/graph-analysis.d.ts.map +0 -1
  29. package/dist/libs/codebase/graph/graph-analysis.js +0 -222
  30. package/dist/libs/codebase/graph/graph-analysis.js.map +0 -1
  31. package/dist/libs/codebase/graph/graph-visualizer.d.ts +0 -12
  32. package/dist/libs/codebase/graph/graph-visualizer.d.ts.map +0 -1
  33. package/dist/libs/codebase/graph/graph-visualizer.js +0 -99
  34. package/dist/libs/codebase/graph/graph-visualizer.js.map +0 -1
  35. package/dist/libs/codebase/indexer/batch-processor.d.ts +0 -18
  36. package/dist/libs/codebase/indexer/batch-processor.d.ts.map +0 -1
  37. package/dist/libs/codebase/indexer/batch-processor.js +0 -39
  38. package/dist/libs/codebase/indexer/batch-processor.js.map +0 -1
  39. package/dist/libs/codebase/indexer/chunker-markdown.d.ts +0 -19
  40. package/dist/libs/codebase/indexer/chunker-markdown.d.ts.map +0 -1
  41. package/dist/libs/codebase/indexer/chunker-markdown.js +0 -138
  42. package/dist/libs/codebase/indexer/chunker-markdown.js.map +0 -1
  43. package/dist/libs/codebase/indexer/chunker.d.ts +0 -21
  44. package/dist/libs/codebase/indexer/chunker.d.ts.map +0 -1
  45. package/dist/libs/codebase/indexer/chunker.js +0 -133
  46. package/dist/libs/codebase/indexer/chunker.js.map +0 -1
  47. package/dist/libs/codebase/indexer/explorer.d.ts +0 -29
  48. package/dist/libs/codebase/indexer/explorer.d.ts.map +0 -1
  49. package/dist/libs/codebase/indexer/explorer.js +0 -278
  50. package/dist/libs/codebase/indexer/explorer.js.map +0 -1
  51. package/dist/libs/codebase/indexer/indexer.d.ts +0 -35
  52. package/dist/libs/codebase/indexer/indexer.d.ts.map +0 -1
  53. package/dist/libs/codebase/indexer/indexer.js +0 -172
  54. package/dist/libs/codebase/indexer/indexer.js.map +0 -1
  55. package/dist/libs/codebase/knowledge/cross-referencer.d.ts +0 -32
  56. package/dist/libs/codebase/knowledge/cross-referencer.d.ts.map +0 -1
  57. package/dist/libs/codebase/knowledge/cross-referencer.js +0 -132
  58. package/dist/libs/codebase/knowledge/cross-referencer.js.map +0 -1
  59. package/dist/libs/codebase/knowledge/markdown-extractor.d.ts +0 -34
  60. package/dist/libs/codebase/knowledge/markdown-extractor.d.ts.map +0 -1
  61. package/dist/libs/codebase/knowledge/markdown-extractor.js +0 -273
  62. package/dist/libs/codebase/knowledge/markdown-extractor.js.map +0 -1
  63. package/dist/libs/codebase/knowledge/summarizer.d.ts +0 -25
  64. package/dist/libs/codebase/knowledge/summarizer.d.ts.map +0 -1
  65. package/dist/libs/codebase/knowledge/summarizer.js +0 -61
  66. package/dist/libs/codebase/knowledge/summarizer.js.map +0 -1
  67. package/dist/libs/codebase/search/bm25.d.ts +0 -23
  68. package/dist/libs/codebase/search/bm25.d.ts.map +0 -1
  69. package/dist/libs/codebase/search/bm25.js +0 -93
  70. package/dist/libs/codebase/search/bm25.js.map +0 -1
  71. package/dist/libs/codebase/search/hybrid-search.d.ts +0 -22
  72. package/dist/libs/codebase/search/hybrid-search.d.ts.map +0 -1
  73. package/dist/libs/codebase/search/hybrid-search.js +0 -80
  74. package/dist/libs/codebase/search/hybrid-search.js.map +0 -1
  75. package/dist/libs/codebase-index.class.d.ts +0 -66
  76. package/dist/libs/codebase-index.class.d.ts.map +0 -1
  77. package/dist/libs/codebase-index.class.js +0 -595
  78. package/dist/libs/codebase-index.class.js.map +0 -1
  79. package/dist/tools/codebase/codebase-analyze.tool.d.ts +0 -8
  80. package/dist/tools/codebase/codebase-analyze.tool.d.ts.map +0 -1
  81. package/dist/tools/codebase/codebase-analyze.tool.js +0 -20
  82. package/dist/tools/codebase/codebase-analyze.tool.js.map +0 -1
  83. package/dist/tools/codebase/codebase-crossref.tool.d.ts +0 -8
  84. package/dist/tools/codebase/codebase-crossref.tool.d.ts.map +0 -1
  85. package/dist/tools/codebase/codebase-crossref.tool.js +0 -20
  86. package/dist/tools/codebase/codebase-crossref.tool.js.map +0 -1
  87. package/dist/tools/codebase/codebase-flow.tool.d.ts +0 -8
  88. package/dist/tools/codebase/codebase-flow.tool.d.ts.map +0 -1
  89. package/dist/tools/codebase/codebase-flow.tool.js +0 -20
  90. package/dist/tools/codebase/codebase-flow.tool.js.map +0 -1
  91. package/dist/tools/codebase/codebase-graph-circular.tool.d.ts +0 -8
  92. package/dist/tools/codebase/codebase-graph-circular.tool.d.ts.map +0 -1
  93. package/dist/tools/codebase/codebase-graph-circular.tool.js +0 -17
  94. package/dist/tools/codebase/codebase-graph-circular.tool.js.map +0 -1
  95. package/dist/tools/codebase/codebase-graph-query.tool.d.ts +0 -8
  96. package/dist/tools/codebase/codebase-graph-query.tool.d.ts.map +0 -1
  97. package/dist/tools/codebase/codebase-graph-query.tool.js +0 -21
  98. package/dist/tools/codebase/codebase-graph-query.tool.js.map +0 -1
  99. package/dist/tools/codebase/codebase-graph-stats.tool.d.ts +0 -8
  100. package/dist/tools/codebase/codebase-graph-stats.tool.d.ts.map +0 -1
  101. package/dist/tools/codebase/codebase-graph-stats.tool.js +0 -17
  102. package/dist/tools/codebase/codebase-graph-stats.tool.js.map +0 -1
  103. package/dist/tools/codebase/codebase-graph-visualize.tool.d.ts +0 -8
  104. package/dist/tools/codebase/codebase-graph-visualize.tool.d.ts.map +0 -1
  105. package/dist/tools/codebase/codebase-graph-visualize.tool.js +0 -21
  106. package/dist/tools/codebase/codebase-graph-visualize.tool.js.map +0 -1
  107. package/dist/tools/codebase/codebase-impact.tool.d.ts +0 -8
  108. package/dist/tools/codebase/codebase-impact.tool.d.ts.map +0 -1
  109. package/dist/tools/codebase/codebase-impact.tool.js +0 -21
  110. package/dist/tools/codebase/codebase-impact.tool.js.map +0 -1
  111. package/dist/tools/codebase/codebase-index.tool.d.ts +0 -8
  112. package/dist/tools/codebase/codebase-index.tool.d.ts.map +0 -1
  113. package/dist/tools/codebase/codebase-index.tool.js +0 -21
  114. package/dist/tools/codebase/codebase-index.tool.js.map +0 -1
  115. package/dist/tools/codebase/codebase-knowledge.tool.d.ts +0 -8
  116. package/dist/tools/codebase/codebase-knowledge.tool.d.ts.map +0 -1
  117. package/dist/tools/codebase/codebase-knowledge.tool.js +0 -22
  118. package/dist/tools/codebase/codebase-knowledge.tool.js.map +0 -1
  119. package/dist/tools/codebase/codebase-search.tool.d.ts +0 -8
  120. package/dist/tools/codebase/codebase-search.tool.d.ts.map +0 -1
  121. package/dist/tools/codebase/codebase-search.tool.js +0 -24
  122. package/dist/tools/codebase/codebase-search.tool.js.map +0 -1
  123. package/dist/tools/codebase/codebase-status.tool.d.ts +0 -8
  124. package/dist/tools/codebase/codebase-status.tool.d.ts.map +0 -1
  125. package/dist/tools/codebase/codebase-status.tool.js +0 -19
  126. package/dist/tools/codebase/codebase-status.tool.js.map +0 -1
  127. package/dist/tools/neural/comparative-analysis.tool.d.ts +0 -37
  128. package/dist/tools/neural/comparative-analysis.tool.d.ts.map +0 -1
  129. package/dist/tools/neural/comparative-analysis.tool.js +0 -241
  130. package/dist/tools/neural/comparative-analysis.tool.js.map +0 -1
  131. package/dist/tools/neural/index.d.ts +0 -12
  132. package/dist/tools/neural/index.d.ts.map +0 -1
  133. package/dist/tools/neural/index.js +0 -28
  134. package/dist/tools/neural/index.js.map +0 -1
  135. package/dist/tools/neural/neural-deadcode.tool.d.ts +0 -10
  136. package/dist/tools/neural/neural-deadcode.tool.d.ts.map +0 -1
  137. package/dist/tools/neural/neural-deadcode.tool.js +0 -133
  138. package/dist/tools/neural/neural-deadcode.tool.js.map +0 -1
  139. package/dist/tools/neural/neural-debug.tool.d.ts +0 -11
  140. package/dist/tools/neural/neural-debug.tool.d.ts.map +0 -1
  141. package/dist/tools/neural/neural-debug.tool.js +0 -205
  142. package/dist/tools/neural/neural-debug.tool.js.map +0 -1
  143. package/dist/tools/neural/neural-explain.tool.d.ts +0 -9
  144. package/dist/tools/neural/neural-explain.tool.d.ts.map +0 -1
  145. package/dist/tools/neural/neural-explain.tool.js +0 -100
  146. package/dist/tools/neural/neural-explain.tool.js.map +0 -1
  147. package/dist/tools/neural/neural-optimize.tool.d.ts +0 -9
  148. package/dist/tools/neural/neural-optimize.tool.d.ts.map +0 -1
  149. package/dist/tools/neural/neural-optimize.tool.js +0 -117
  150. package/dist/tools/neural/neural-optimize.tool.js.map +0 -1
  151. package/dist/tools/neural/neural-pattern.tool.d.ts +0 -10
  152. package/dist/tools/neural/neural-pattern.tool.d.ts.map +0 -1
  153. package/dist/tools/neural/neural-pattern.tool.js +0 -169
  154. package/dist/tools/neural/neural-pattern.tool.js.map +0 -1
  155. package/dist/tools/neural/neural-review.tool.d.ts +0 -11
  156. package/dist/tools/neural/neural-review.tool.d.ts.map +0 -1
  157. package/dist/tools/neural/neural-review.tool.js +0 -152
  158. package/dist/tools/neural/neural-review.tool.js.map +0 -1
  159. package/dist/tools/neural/neural-security.tool.d.ts +0 -16
  160. package/dist/tools/neural/neural-security.tool.d.ts.map +0 -1
  161. package/dist/tools/neural/neural-security.tool.js +0 -256
  162. package/dist/tools/neural/neural-security.tool.js.map +0 -1
  163. package/dist/tools/neural/neural-similar.tool.d.ts +0 -9
  164. package/dist/tools/neural/neural-similar.tool.d.ts.map +0 -1
  165. package/dist/tools/neural/neural-similar.tool.js +0 -139
  166. package/dist/tools/neural/neural-similar.tool.js.map +0 -1
  167. package/dist/tools/neural/neural-smells.tool.d.ts +0 -9
  168. package/dist/tools/neural/neural-smells.tool.d.ts.map +0 -1
  169. package/dist/tools/neural/neural-smells.tool.js +0 -123
  170. package/dist/tools/neural/neural-smells.tool.js.map +0 -1
  171. package/dist/tools/neural/neural-suggest.tool.d.ts +0 -9
  172. package/dist/tools/neural/neural-suggest.tool.d.ts.map +0 -1
  173. package/dist/tools/neural/neural-suggest.tool.js +0 -64
  174. package/dist/tools/neural/neural-suggest.tool.js.map +0 -1
  175. package/dist/tools/quality/index.d.ts +0 -8
  176. package/dist/tools/quality/index.d.ts.map +0 -1
  177. package/dist/tools/quality/index.js +0 -24
  178. package/dist/tools/quality/index.js.map +0 -1
  179. package/dist/tools/quality/quality-complexity.tool.d.ts +0 -11
  180. package/dist/tools/quality/quality-complexity.tool.d.ts.map +0 -1
  181. package/dist/tools/quality/quality-complexity.tool.js +0 -152
  182. package/dist/tools/quality/quality-complexity.tool.js.map +0 -1
  183. package/dist/tools/quality/quality-coupling.tool.d.ts +0 -9
  184. package/dist/tools/quality/quality-coupling.tool.d.ts.map +0 -1
  185. package/dist/tools/quality/quality-coupling.tool.js +0 -51
  186. package/dist/tools/quality/quality-coupling.tool.js.map +0 -1
  187. package/dist/tools/quality/quality-coverage.tool.d.ts +0 -9
  188. package/dist/tools/quality/quality-coverage.tool.d.ts.map +0 -1
  189. package/dist/tools/quality/quality-coverage.tool.js +0 -104
  190. package/dist/tools/quality/quality-coverage.tool.js.map +0 -1
  191. package/dist/tools/quality/quality-deps.tool.d.ts +0 -11
  192. package/dist/tools/quality/quality-deps.tool.d.ts.map +0 -1
  193. package/dist/tools/quality/quality-deps.tool.js +0 -119
  194. package/dist/tools/quality/quality-deps.tool.js.map +0 -1
  195. package/dist/tools/quality/quality-duplication.tool.d.ts +0 -9
  196. package/dist/tools/quality/quality-duplication.tool.d.ts.map +0 -1
  197. package/dist/tools/quality/quality-duplication.tool.js +0 -100
  198. package/dist/tools/quality/quality-duplication.tool.js.map +0 -1
  199. package/dist/tools/quality/quality-size.tool.d.ts +0 -9
  200. package/dist/tools/quality/quality-size.tool.d.ts.map +0 -1
  201. package/dist/tools/quality/quality-size.tool.js +0 -94
  202. package/dist/tools/quality/quality-size.tool.js.map +0 -1
  203. package/dist/tools/quality/quality-types.tool.d.ts +0 -9
  204. package/dist/tools/quality/quality-types.tool.d.ts.map +0 -1
  205. package/dist/tools/quality/quality-types.tool.js +0 -95
  206. package/dist/tools/quality/quality-types.tool.js.map +0 -1
  207. package/dist/tools/workspace/analyze-project.tool.d.ts +0 -36
  208. package/dist/tools/workspace/analyze-project.tool.d.ts.map +0 -1
  209. package/dist/tools/workspace/analyze-project.tool.js +0 -454
  210. package/dist/tools/workspace/analyze-project.tool.js.map +0 -1
  211. package/dist/tools/workspace/codebase-research.tool.d.ts +0 -10
  212. package/dist/tools/workspace/codebase-research.tool.d.ts.map +0 -1
  213. package/dist/tools/workspace/codebase-research.tool.js +0 -89
  214. package/dist/tools/workspace/codebase-research.tool.js.map +0 -1
  215. package/dist/tools/workspace/project-scanner.tool.d.ts +0 -55
  216. package/dist/tools/workspace/project-scanner.tool.d.ts.map +0 -1
  217. package/dist/tools/workspace/project-scanner.tool.js +0 -978
  218. package/dist/tools/workspace/project-scanner.tool.js.map +0 -1
  219. package/dist/tools/workspace/search-code.tool.d.ts +0 -14
  220. package/dist/tools/workspace/search-code.tool.d.ts.map +0 -1
  221. package/dist/tools/workspace/search-code.tool.js +0 -286
  222. package/dist/tools/workspace/search-code.tool.js.map +0 -1
@@ -1,169 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.NeuralPatternTool = void 0;
37
- const zod_1 = require("zod");
38
- const core_1 = require("@thoughtflow/core");
39
- const fs = __importStar(require("node:fs"));
40
- const path = __importStar(require("node:path"));
41
- class NeuralPatternTool extends core_1.ToolBase {
42
- name = "neuralPattern";
43
- description = "Recognize design patterns used in the codebase using static analysis and LLM verification. Detects Singleton, Factory, Observer, Strategy, Decorator, Repository, Adapter, Builder, Command, Mediator, Chain of Responsibility, and more.";
44
- readonly = true;
45
- constructor() {
46
- super(zod_1.z.object({
47
- target: zod_1.z.string().optional().describe("File or directory to scan"),
48
- projectPath: zod_1.z.string().optional(),
49
- verifyWithLLM: zod_1.z.boolean().optional().describe("Use LLM to verify ambiguous pattern detections"),
50
- }));
51
- }
52
- async run(input, ctx) {
53
- const rootPath = input.projectPath ?? process.cwd();
54
- const target = input.target || "src";
55
- const verify = input.verifyWithLLM ?? false;
56
- const targetPath = path.join(rootPath, target);
57
- let files = [];
58
- if (fs.statSync(targetPath).isDirectory()) {
59
- const walk = (dir) => {
60
- for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
61
- if (e.name.startsWith(".") || e.name === "node_modules")
62
- continue;
63
- const fp = path.join(dir, e.name);
64
- if (e.isDirectory())
65
- walk(fp);
66
- else if (e.name.endsWith(".ts"))
67
- files.push(fp);
68
- }
69
- };
70
- walk(targetPath);
71
- }
72
- else {
73
- files = [targetPath];
74
- }
75
- const patterns = [];
76
- for (const file of files) {
77
- const content = fs.readFileSync(file, "utf8");
78
- const rel = path.relative(rootPath, file);
79
- const detections = this.detectPatterns(rel, content);
80
- for (const d of detections) {
81
- patterns.push({ ...d, file: rel });
82
- }
83
- }
84
- let llmResult = null;
85
- const callStructured = ctx.conversation?.callStructured;
86
- if (verify && callStructured && patterns.length > 0) {
87
- const ambiguous = patterns.filter((p) => p.confidence === "medium");
88
- const toVerify = ambiguous.length > 0 ? ambiguous : patterns.slice(0, 10);
89
- const patternList = toVerify.map((p) => `- ${p.file}: ${p.pattern} (${p.confidence})`).join("\n");
90
- const prompt = `Verify these design pattern detections in a codebase:\n${patternList}\n\nAre these correct? Flag any false positives. Return: { verified: boolean, corrections: string[] }`;
91
- try {
92
- llmResult = await callStructured(prompt, zod_1.z.object({ verified: zod_1.z.boolean(), corrections: zod_1.z.array(zod_1.z.string()) }));
93
- }
94
- catch {
95
- /* skip LLM verification */
96
- }
97
- }
98
- if (llmResult?.verified && patterns.length > 0) {
99
- for (const p of patterns) {
100
- if (p.confidence === "medium") {
101
- p.llmVerified = true;
102
- }
103
- }
104
- }
105
- const patternCounts = {};
106
- for (const p of patterns) {
107
- patternCounts[p.pattern] = (patternCounts[p.pattern] ?? 0) + 1;
108
- }
109
- return {
110
- success: true,
111
- output: JSON.stringify({
112
- filesScanned: files.length,
113
- patternsFound: patterns.length,
114
- byType: patternCounts,
115
- llmVerified: llmResult?.verified ?? false,
116
- llmCorrections: llmResult?.corrections,
117
- patterns: patterns.slice(0, 30),
118
- }),
119
- };
120
- }
121
- detectPatterns(rel, content) {
122
- const results = [];
123
- if (rel.toLowerCase().includes("factory")) {
124
- results.push({ pattern: "Factory", confidence: "high", evidence: "File name indicates Factory pattern" });
125
- }
126
- if (rel.toLowerCase().includes("singleton")) {
127
- results.push({ pattern: "Singleton", confidence: "high", evidence: "File name indicates Singleton" });
128
- }
129
- if (rel.toLowerCase().includes("observer") || rel.toLowerCase().includes("listener") || rel.toLowerCase().includes("subscriber")) {
130
- results.push({ pattern: "Observer", confidence: "high", evidence: "File name indicates Observer pattern" });
131
- }
132
- if (rel.toLowerCase().includes("strategy")) {
133
- results.push({ pattern: "Strategy", confidence: "high", evidence: "File name indicates Strategy pattern" });
134
- }
135
- if (rel.toLowerCase().includes("decorator")) {
136
- results.push({ pattern: "Decorator", confidence: "high", evidence: "File name indicates Decorator" });
137
- }
138
- if (rel.toLowerCase().includes("adapter") || rel.toLowerCase().includes("wrapper")) {
139
- results.push({ pattern: "Adapter", confidence: "high", evidence: "File name indicates Adapter" });
140
- }
141
- if (rel.toLowerCase().includes("repository") || rel.toLowerCase().includes("repo")) {
142
- results.push({ pattern: "Repository", confidence: "high", evidence: "File name indicates Repository" });
143
- }
144
- if (rel.toLowerCase().includes("builder")) {
145
- results.push({ pattern: "Builder", confidence: "high", evidence: "File name indicates Builder" });
146
- }
147
- if (rel.toLowerCase().includes("command") || rel.toLowerCase().includes("handler")) {
148
- results.push({ pattern: "Command", confidence: "medium", evidence: "File name suggests Command pattern" });
149
- }
150
- if (rel.toLowerCase().includes("mediator") || rel.toLowerCase().includes("coordinator") || rel.toLowerCase().includes("orchestrator")) {
151
- results.push({ pattern: "Mediator", confidence: "medium", evidence: "File name suggests Mediator/Coordinator" });
152
- }
153
- if (rel.toLowerCase().includes("middleware")) {
154
- results.push({ pattern: "Chain of Responsibility", confidence: "medium", evidence: "Middleware suggests Chain of Responsibility" });
155
- }
156
- if (content.includes("class ") && content.includes("private static") && content.includes("instance")) {
157
- results.push({ pattern: "Singleton", confidence: "medium", evidence: "private static instance field detected" });
158
- }
159
- if (content.match(/abstract\s+class\s+\w+\s*\{/)) {
160
- results.push({ pattern: "Template Method", confidence: "medium", evidence: "Abstract class found" });
161
- }
162
- if (content.match(/interface\s+\w+/)) {
163
- results.push({ pattern: "Strategy", confidence: "low", evidence: "Interface suggests potential Strategy pattern" });
164
- }
165
- return results;
166
- }
167
- }
168
- exports.NeuralPatternTool = NeuralPatternTool;
169
- //# sourceMappingURL=neural-pattern.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"neural-pattern.tool.js","sourceRoot":"","sources":["../../../src/tools/neural/neural-pattern.tool.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
2
- export declare class NeuralReviewTool extends ToolBase {
3
- readonly name = "neuralReview";
4
- readonly description = "AI-powered code review. Analyzes code for bugs, anti-patterns, style issues, type safety, and correctness. Returns issues with severity levels and fix suggestions.";
5
- readonly readonly = true;
6
- constructor();
7
- run(input: Record<string, unknown>, ctx: ToolContext): Promise<ToolExecutionResult>;
8
- private runStaticChecks;
9
- private buildResult;
10
- }
11
- //# sourceMappingURL=neural-review.tool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"neural-review.tool.d.ts","sourceRoot":"","sources":["../../../src/tools/neural/neural-review.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAoB/E,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,yKAAyK;IAC7L,SAAkB,QAAQ,QAAQ;;IAU5B,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqDzF,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,WAAW;CA0BpB"}
@@ -1,152 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.NeuralReviewTool = void 0;
37
- const zod_1 = require("zod");
38
- const core_1 = require("@thoughtflow/core");
39
- const fs = __importStar(require("node:fs"));
40
- const path = __importStar(require("node:path"));
41
- const ReviewIssueSchema = zod_1.z.object({
42
- severity: zod_1.z.enum(["critical", "high", "medium", "low", "info"]),
43
- category: zod_1.z.enum(["bug", "security", "performance", "style", "types", "architecture", "naming", "maintainability"]),
44
- line: zod_1.z.number().optional(),
45
- message: zod_1.z.string(),
46
- suggestion: zod_1.z.string(),
47
- });
48
- const ReviewResultSchema = zod_1.z.object({
49
- summary: zod_1.z.string(),
50
- issues: zod_1.z.array(ReviewIssueSchema),
51
- overallScore: zod_1.z.number().min(0).max(100),
52
- });
53
- class NeuralReviewTool extends core_1.ToolBase {
54
- name = "neuralReview";
55
- description = "AI-powered code review. Analyzes code for bugs, anti-patterns, style issues, type safety, and correctness. Returns issues with severity levels and fix suggestions.";
56
- readonly = true;
57
- constructor() {
58
- super(zod_1.z.object({
59
- target: zod_1.z.string().describe("File path or code to review"),
60
- focus: zod_1.z.enum(["all", "bugs", "security", "performance", "style", "types"]).optional(),
61
- projectPath: zod_1.z.string().optional(),
62
- }));
63
- }
64
- async run(input, ctx) {
65
- const { target, focus } = input;
66
- const rootPath = input.projectPath ?? process.cwd();
67
- const reviewFocus = focus ?? "all";
68
- let code = target;
69
- let filePath = "(inline)";
70
- const fullPath = path.join(rootPath, target);
71
- try {
72
- if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {
73
- code = fs.readFileSync(fullPath, "utf8").slice(0, 12000);
74
- filePath = target;
75
- }
76
- }
77
- catch {
78
- /* use target as-is */
79
- }
80
- const staticIssues = this.runStaticChecks(code);
81
- const callStructured = ctx.conversation?.callStructured;
82
- if (!callStructured) {
83
- return this.buildResult(filePath, staticIssues, "Static analysis only — no LLM available", 50);
84
- }
85
- const focusInstruction = reviewFocus !== "all"
86
- ? `Focus exclusively on ${reviewFocus} issues. Ignore other categories.`
87
- : "Comprehensively review all aspects.";
88
- const prompt = `You are a senior code reviewer. ${focusInstruction}
89
-
90
- File: ${filePath}
91
-
92
- \`\`\`
93
- ${code.slice(0, 8000)}
94
- \`\`\`
95
-
96
- Provide a structured review with issues ordered by severity. Consider: bugs, security vulnerabilities, performance problems, type safety gaps, code style violations, architectural issues, poor naming, and maintainability concerns. Be specific — cite exact line numbers where possible. For each issue provide a concrete, actionable fix suggestion.`;
97
- try {
98
- const result = await callStructured(prompt, ReviewResultSchema);
99
- const data = result;
100
- const allIssues = [...staticIssues, ...(data.issues ?? [])];
101
- return this.buildResult(filePath, allIssues.slice(0, 30), data.summary ?? "Review complete", data.overallScore ?? 50);
102
- }
103
- catch {
104
- return this.buildResult(filePath, staticIssues.slice(0, 20), "LLM review failed — static analysis only", 40);
105
- }
106
- }
107
- runStaticChecks(code) {
108
- const issues = [];
109
- const lines = code.split("\n");
110
- for (let i = 0; i < lines.length; i++) {
111
- const line = lines[i];
112
- if (line.includes("console.log") || line.includes("console.warn") || line.includes("console.error") || line.includes("console.debug")) {
113
- issues.push({ severity: "low", category: "style", line: i + 1, message: "Console statement in code", suggestion: "Replace with proper logger" });
114
- }
115
- if (line.match(/eval\s*\(/)) {
116
- issues.push({ severity: "critical", category: "security", line: i + 1, message: "eval() usage — code injection risk", suggestion: "Avoid eval(); use safer alternatives" });
117
- }
118
- if (line.match(/password|secret|api[_-]?key/i) && line.includes("=") && !line.includes("process.env") && !line.trim().startsWith("//")) {
119
- issues.push({ severity: "critical", category: "security", line: i + 1, message: "Potential hardcoded secret", suggestion: "Move to environment variable" });
120
- }
121
- if (line.match(/==\s*(true|false|null|undefined)/) && !line.includes("===")) {
122
- issues.push({ severity: "medium", category: "bug", line: i + 1, message: "Loose equality with boolean/null/undefined", suggestion: "Use === instead of ==" });
123
- }
124
- if (line.length > 150) {
125
- issues.push({ severity: "low", category: "style", line: i + 1, message: `Line too long (${line.length} chars)`, suggestion: "Split into multiple lines" });
126
- }
127
- }
128
- return issues;
129
- }
130
- buildResult(filePath, issues, summary, overallScore) {
131
- const severityCounts = {
132
- critical: issues.filter((i) => i.severity === "critical").length,
133
- high: issues.filter((i) => i.severity === "high").length,
134
- medium: issues.filter((i) => i.severity === "medium").length,
135
- low: issues.filter((i) => i.severity === "low").length,
136
- info: issues.filter((i) => i.severity === "info").length,
137
- };
138
- return {
139
- success: true,
140
- output: JSON.stringify({
141
- file: filePath,
142
- summary,
143
- overallScore,
144
- issueCount: issues.length,
145
- bySeverity: severityCounts,
146
- issues,
147
- }),
148
- };
149
- }
150
- }
151
- exports.NeuralReviewTool = NeuralReviewTool;
152
- //# sourceMappingURL=neural-review.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"neural-review.tool.js","sourceRoot":"","sources":["../../../src/tools/neural/neural-review.tool.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
2
- export declare class NeuralSecurityTool extends ToolBase {
3
- readonly name = "neuralSecurity";
4
- readonly description = "Scan source code for security vulnerabilities: hardcoded secrets, injection risks, unsafe crypto, XSS, CSRF, path traversal. LLM-powered deep analysis with CWE references.";
5
- readonly: boolean;
6
- constructor();
7
- run(input: Record<string, unknown>, ctx: ToolContext): Promise<ToolExecutionResult>;
8
- private scanSecrets;
9
- private scanInjection;
10
- private scanCrypto;
11
- private scanXss;
12
- private scanAuth;
13
- private countBySeverity;
14
- private computeRiskLevel;
15
- }
16
- //# sourceMappingURL=neural-security.tool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"neural-security.tool.d.ts","sourceRoot":"","sources":["../../../src/tools/neural/neural-security.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAqB/E,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,WAAW,iLAAiL;IACrM,QAAQ,UAAQ;;IAUV,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkHzF,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -1,256 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.NeuralSecurityTool = void 0;
37
- const zod_1 = require("zod");
38
- const core_1 = require("@thoughtflow/core");
39
- const explorer_1 = require("../../libs/codebase/indexer/explorer");
40
- const fs = __importStar(require("node:fs"));
41
- const SecurityIssueSchema = zod_1.z.object({
42
- severity: zod_1.z.enum(["critical", "high", "medium", "low"]),
43
- cwe: zod_1.z.string(),
44
- category: zod_1.z.string(),
45
- message: zod_1.z.string(),
46
- remediation: zod_1.z.string(),
47
- });
48
- const SecurityResultSchema = zod_1.z.object({
49
- summary: zod_1.z.string(),
50
- findings: zod_1.z.array(SecurityIssueSchema),
51
- riskLevel: zod_1.z.enum(["critical", "high", "medium", "low", "none"]),
52
- });
53
- class NeuralSecurityTool extends core_1.ToolBase {
54
- name = "neuralSecurity";
55
- description = "Scan source code for security vulnerabilities: hardcoded secrets, injection risks, unsafe crypto, XSS, CSRF, path traversal. LLM-powered deep analysis with CWE references.";
56
- readonly = true;
57
- constructor() {
58
- super(zod_1.z.object({
59
- target: zod_1.z.string().optional().describe("File or directory to scan"),
60
- scope: zod_1.z.enum(["all", "secrets", "injection", "crypto", "xss", "auth"]).optional(),
61
- projectPath: zod_1.z.string().optional(),
62
- }));
63
- }
64
- async run(input, ctx) {
65
- const rootPath = input.projectPath ?? process.cwd();
66
- const scope = input.scope ?? "all";
67
- const target = input.target || undefined;
68
- const explorer = new explorer_1.CodebaseExplorer();
69
- const files = explorer.explore({ rootPath });
70
- const scanFiles = target
71
- ? files.filter((f) => f.relativePath.includes(target) || f.absolutePath.includes(target))
72
- : files.filter((f) => f.classification === "source-code" || f.classification === "config");
73
- const staticFindings = [];
74
- for (const file of scanFiles.slice(0, 100)) {
75
- try {
76
- const content = fs.readFileSync(file.absolutePath, "utf8");
77
- const lines = content.split("\n");
78
- for (let i = 0; i < lines.length; i++) {
79
- const line = lines[i];
80
- if (scope === "all" || scope === "secrets")
81
- this.scanSecrets(line, file.relativePath, i + 1, staticFindings);
82
- if (scope === "all" || scope === "injection")
83
- this.scanInjection(line, file.relativePath, i + 1, staticFindings);
84
- if (scope === "all" || scope === "crypto")
85
- this.scanCrypto(line, file.relativePath, i + 1, staticFindings);
86
- if (scope === "all" || scope === "xss")
87
- this.scanXss(line, file.relativePath, i + 1, staticFindings);
88
- if (scope === "all" || scope === "auth")
89
- this.scanAuth(line, file.relativePath, i + 1, content, staticFindings);
90
- }
91
- }
92
- catch {
93
- continue;
94
- }
95
- }
96
- const cs = ctx.conversation?.callStructured;
97
- if (!cs) {
98
- const severityCounts = this.countBySeverity(staticFindings);
99
- return {
100
- success: true,
101
- output: JSON.stringify({
102
- summary: `Static scan: ${staticFindings.length} findings across ${scanFiles.length} files`,
103
- filesScanned: scanFiles.length,
104
- severityCounts,
105
- findings: staticFindings.slice(0, 30),
106
- riskLevel: this.computeRiskLevel(staticFindings),
107
- }),
108
- };
109
- }
110
- const suspiciousFiles = scanFiles.filter((f) => {
111
- try {
112
- const c = fs.readFileSync(f.absolutePath, "utf8");
113
- return c.includes("secret") || c.includes("token") || c.includes("password") || c.includes("eval") || c.includes("innerHTML") || c.includes("sql") || c.includes("crypto");
114
- }
115
- catch {
116
- return false;
117
- }
118
- }).slice(0, 5);
119
- if (suspiciousFiles.length === 0) {
120
- const severityCounts = this.countBySeverity(staticFindings);
121
- return {
122
- success: true,
123
- output: JSON.stringify({
124
- summary: "No suspicious files for deep scan",
125
- filesScanned: scanFiles.length,
126
- severityCounts,
127
- findings: staticFindings.slice(0, 30),
128
- riskLevel: this.computeRiskLevel(staticFindings),
129
- }),
130
- };
131
- }
132
- const codeSnippets = suspiciousFiles
133
- .map((f) => {
134
- try {
135
- return `=== ${f.relativePath} ===\n${fs.readFileSync(f.absolutePath, "utf8").slice(0, 4000)}`;
136
- }
137
- catch {
138
- return "";
139
- }
140
- })
141
- .filter(Boolean)
142
- .join("\n\n");
143
- const staticHints = staticFindings
144
- .slice(0, 20)
145
- .map((f) => `${f.severity.toUpperCase()}: ${f.cwe} - ${f.message}`)
146
- .join("\n");
147
- const prompt = `You are a security auditor specializing in OWASP Top 10 vulnerabilities. Analyze the provided source code and return structured findings with CWE references, severity ratings, and actionable remediation steps.\n\nScan the following source code for security vulnerabilities. Focus on: ${scope}.\n\nSTATIC SCAN HIGHLIGHTS (use these as hints, but perform your own deeper analysis):\n${staticHints || "No static findings"}\n\nSOURCE CODE:\n${codeSnippets.slice(0, 12000)}`;
148
- try {
149
- const result = await cs(prompt, SecurityResultSchema);
150
- const allFindings = [...staticFindings, ...(result.findings ?? [])];
151
- const severityCounts = this.countBySeverity(allFindings);
152
- return {
153
- success: true,
154
- output: JSON.stringify({
155
- summary: result.summary ?? `${allFindings.length} total findings`,
156
- filesScanned: scanFiles.length,
157
- severityCounts,
158
- findings: allFindings.slice(0, 50),
159
- riskLevel: result.riskLevel ?? this.computeRiskLevel(allFindings),
160
- }),
161
- };
162
- }
163
- catch {
164
- const severityCounts = this.countBySeverity(staticFindings);
165
- return {
166
- success: true,
167
- output: JSON.stringify({
168
- summary: "LLM scan failed — static analysis only",
169
- filesScanned: scanFiles.length,
170
- severityCounts,
171
- findings: staticFindings.slice(0, 30),
172
- riskLevel: this.computeRiskLevel(staticFindings),
173
- }),
174
- };
175
- }
176
- }
177
- scanSecrets(line, file, lineNum, findings) {
178
- if (line.match(/(api[_-]?key|secret|password|token|auth)\s*[:=]\s*['"][^$`{].{6,}['"]/i) && !line.includes("process.env") && !line.includes("import")) {
179
- if (!line.trim().startsWith("//") && !line.trim().startsWith("/*")) {
180
- findings.push({ severity: "critical", cwe: "CWE-798", category: "secrets", message: `Hardcoded credential in ${file}:${lineNum}`, remediation: "Move to environment variable or secret manager" });
181
- }
182
- }
183
- if (line.match(/['"]((?:sk-[A-Za-z0-9]{20,})|(?:ghp_[A-Za-z0-9]{20,})|(?:xox[bpras]-[A-Za-z0-9-]{10,}))['"]/)) {
184
- findings.push({ severity: "critical", cwe: "CWE-798", category: "secrets", message: `API key detected in ${file}:${lineNum}`, remediation: "Use environment variables or a secrets vault — revoke the exposed key immediately" });
185
- }
186
- }
187
- scanInjection(line, file, lineNum, findings) {
188
- if (line.match(/eval\s*\(/))
189
- findings.push({ severity: "critical", cwe: "CWE-95", category: "injection", message: `eval() usage in ${file}:${lineNum}`, remediation: "Remove eval() — use JSON.parse or safer alternatives" });
190
- if (line.match(/exec\s*\(\s*['"`][^'"]*\$\{/))
191
- findings.push({ severity: "critical", cwe: "CWE-78", category: "injection", message: `Command injection risk in ${file}:${lineNum}`, remediation: "Use execFile() with argument arrays, or sanitize inputs" });
192
- if (line.match(/(?:execute|query|run)\s*\(\s*['"`][^'"]*\$/) && !line.includes("?") && !line.includes("$1")) {
193
- findings.push({ severity: "high", cwe: "CWE-89", category: "injection", message: `Potential SQL injection in ${file}:${lineNum}`, remediation: "Use parameterized queries or an ORM with input binding" });
194
- }
195
- if (line.match(/new Function\s*\(/))
196
- findings.push({ severity: "critical", cwe: "CWE-95", category: "injection", message: `new Function() in ${file}:${lineNum}`, remediation: "Avoid new Function() — refactor to use proper logic constructs" });
197
- if (line.match(/require\s*\(\s*.+\s*\+\s*.+/) || line.match(/import\s*\(\s*.+\s*\+\s*.+\)/)) {
198
- findings.push({ severity: "high", cwe: "CWE-641", category: "injection", message: `Dynamic import with concatenation in ${file}:${lineNum}`, remediation: "Use a static import map instead of dynamic concatenation" });
199
- }
200
- }
201
- scanCrypto(line, file, lineNum, findings) {
202
- if (line.match(/Math\.random\s*\(\s*\)/) && (line.includes("token") || line.includes("password") || line.includes("secret") || line.includes("nonce"))) {
203
- findings.push({ severity: "high", cwe: "CWE-338", category: "crypto", message: `Math.random() for security in ${file}:${lineNum}`, remediation: "Use crypto.randomBytes() or crypto.randomUUID()" });
204
- }
205
- if (line.match(/md5|crc32|sha1(?!256|512)/i) && !line.includes("import") && !line.includes("type")) {
206
- findings.push({ severity: "medium", cwe: "CWE-328", category: "crypto", message: `Weak hash (MD5/SHA1/CRC32) in ${file}:${lineNum}`, remediation: "Use SHA-256, SHA-512, or bcrypt/scrypt for passwords" });
207
- }
208
- if (line.match(/crypto\.createCipher\s*\(/) || line.match(/new\s+Cipher\s*\(/)) {
209
- findings.push({ severity: "medium", cwe: "CWE-327", category: "crypto", message: `Insecure cipher usage in ${file}:${lineNum}`, remediation: "Use AES-256-GCM or ChaCha20-Poly1305 with authenticated encryption" });
210
- }
211
- }
212
- scanXss(line, file, lineNum, findings) {
213
- if (line.match(/innerHTML\s*=|dangerouslySetInnerHTML|v-html/)) {
214
- findings.push({ severity: "high", cwe: "CWE-79", category: "xss", message: `Potential XSS in ${file}:${lineNum}`, remediation: "Sanitize input with DOMPurify or use textContent instead" });
215
- }
216
- if (line.match(/document\.write\s*\(/)) {
217
- findings.push({ severity: "high", cwe: "CWE-79", category: "xss", message: `document.write() in ${file}:${lineNum}`, remediation: "Use DOM manipulation methods like appendChild or innerHTML with sanitization" });
218
- }
219
- if (line.match(/setAttribute\s*\(\s*['"]on\w+['"]/) || line.match(/\.on\w+\s*=\s*/)) {
220
- findings.push({ severity: "medium", cwe: "CWE-79", category: "xss", message: `Inline event handler in ${file}:${lineNum}`, remediation: "Use addEventListener instead of inline handlers" });
221
- }
222
- }
223
- scanAuth(line, file, lineNum, content, findings) {
224
- if (line.match(/http\.createServer|app\.listen|express\s*\(/) && !line.includes("https")) {
225
- if (!content.includes("https") && !content.includes("ssl") && !content.includes("tls") && !content.includes("secure")) {
226
- findings.push({ severity: "medium", cwe: "CWE-319", category: "auth", message: `Server without HTTPS in ${file}:${lineNum}`, remediation: "Configure TLS/SSL with a valid certificate" });
227
- }
228
- }
229
- if (line.match(/jwt\.sign\(/) || line.match(/jsonwebtoken\.sign/)) {
230
- if (!content.includes("expiresIn") && !content.includes("expires")) {
231
- findings.push({ severity: "medium", cwe: "CWE-307", category: "auth", message: `JWT without expiration in ${file}:${lineNum}`, remediation: "Set expiresIn option when signing JWTs" });
232
- }
233
- }
234
- }
235
- countBySeverity(findings) {
236
- return {
237
- critical: findings.filter((f) => f.severity === "critical").length,
238
- high: findings.filter((f) => f.severity === "high").length,
239
- medium: findings.filter((f) => f.severity === "medium").length,
240
- low: findings.filter((f) => f.severity === "low").length,
241
- };
242
- }
243
- computeRiskLevel(findings) {
244
- if (findings.some((f) => f.severity === "critical"))
245
- return "critical";
246
- if (findings.some((f) => f.severity === "high"))
247
- return "high";
248
- if (findings.some((f) => f.severity === "medium"))
249
- return "medium";
250
- if (findings.length > 0)
251
- return "low";
252
- return "none";
253
- }
254
- }
255
- exports.NeuralSecurityTool = NeuralSecurityTool;
256
- //# sourceMappingURL=neural-security.tool.js.map