@theihtisham/agent-shadow-brain 1.2.0 → 2.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.
- package/README.md +837 -73
- package/dist/adapters/aider.d.ts +11 -0
- package/dist/adapters/aider.d.ts.map +1 -0
- package/dist/adapters/aider.js +149 -0
- package/dist/adapters/aider.js.map +1 -0
- package/dist/adapters/index.d.ts +3 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +5 -3
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/roo-code.d.ts +14 -0
- package/dist/adapters/roo-code.d.ts.map +1 -0
- package/dist/adapters/roo-code.js +186 -0
- package/dist/adapters/roo-code.js.map +1 -0
- package/dist/brain/adr-engine.d.ts +58 -0
- package/dist/brain/adr-engine.d.ts.map +1 -0
- package/dist/brain/adr-engine.js +400 -0
- package/dist/brain/adr-engine.js.map +1 -0
- package/dist/brain/code-similarity.d.ts +43 -0
- package/dist/brain/code-similarity.d.ts.map +1 -0
- package/dist/brain/code-similarity.js +227 -0
- package/dist/brain/code-similarity.js.map +1 -0
- package/dist/brain/context-completion.d.ts +39 -0
- package/dist/brain/context-completion.d.ts.map +1 -0
- package/dist/brain/context-completion.js +851 -0
- package/dist/brain/context-completion.js.map +1 -0
- package/dist/brain/dependency-graph.d.ts +35 -0
- package/dist/brain/dependency-graph.d.ts.map +1 -0
- package/dist/brain/dependency-graph.js +310 -0
- package/dist/brain/dependency-graph.js.map +1 -0
- package/dist/brain/learning-engine.d.ts +54 -0
- package/dist/brain/learning-engine.d.ts.map +1 -0
- package/dist/brain/learning-engine.js +855 -0
- package/dist/brain/learning-engine.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +30 -0
- package/dist/brain/mcp-server.d.ts.map +1 -0
- package/dist/brain/mcp-server.js +408 -0
- package/dist/brain/mcp-server.js.map +1 -0
- package/dist/brain/multi-project.d.ts +13 -0
- package/dist/brain/multi-project.d.ts.map +1 -0
- package/dist/brain/multi-project.js +163 -0
- package/dist/brain/multi-project.js.map +1 -0
- package/dist/brain/neural-mesh.d.ts +69 -0
- package/dist/brain/neural-mesh.d.ts.map +1 -0
- package/dist/brain/neural-mesh.js +677 -0
- package/dist/brain/neural-mesh.js.map +1 -0
- package/dist/brain/orchestrator.d.ts +111 -1
- package/dist/brain/orchestrator.d.ts.map +1 -1
- package/dist/brain/orchestrator.js +302 -0
- package/dist/brain/orchestrator.js.map +1 -1
- package/dist/brain/perf-profiler.d.ts +14 -0
- package/dist/brain/perf-profiler.d.ts.map +1 -0
- package/dist/brain/perf-profiler.js +289 -0
- package/dist/brain/perf-profiler.js.map +1 -0
- package/dist/brain/semantic-analyzer.d.ts +46 -0
- package/dist/brain/semantic-analyzer.d.ts.map +1 -0
- package/dist/brain/semantic-analyzer.js +496 -0
- package/dist/brain/semantic-analyzer.js.map +1 -0
- package/dist/brain/team-mode.d.ts +27 -0
- package/dist/brain/team-mode.d.ts.map +1 -0
- package/dist/brain/team-mode.js +262 -0
- package/dist/brain/team-mode.js.map +1 -0
- package/dist/brain/type-safety.d.ts +13 -0
- package/dist/brain/type-safety.d.ts.map +1 -0
- package/dist/brain/type-safety.js +217 -0
- package/dist/brain/type-safety.js.map +1 -0
- package/dist/cli.js +593 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +228 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// src/brain/code-similarity.ts — Detect duplicate/near-duplicate code blocks across a project
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
|
|
5
|
+
const IGNORE_DIRS = new Set([
|
|
6
|
+
'node_modules', '.git', 'dist', 'build', 'out', 'coverage',
|
|
7
|
+
'.cache', '.next', '.nuxt', 'vendor', '__pycache__',
|
|
8
|
+
]);
|
|
9
|
+
export class CodeSimilarityDetector {
|
|
10
|
+
constructor(projectDir) {
|
|
11
|
+
this.projectDir = projectDir;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scan all source files for duplicate code blocks.
|
|
15
|
+
* Returns groups of blocks whose pairwise similarity >= minSimilarity.
|
|
16
|
+
*/
|
|
17
|
+
async detectDuplicates(minSimilarity = 0.8) {
|
|
18
|
+
const allBlocks = this.collectAllBlocks();
|
|
19
|
+
const groups = [];
|
|
20
|
+
// Only consider blocks with 6+ lines
|
|
21
|
+
const eligible = allBlocks.filter(b => (b.endLine - b.startLine + 1) >= 6);
|
|
22
|
+
// Track which blocks have already been grouped to avoid duplicates
|
|
23
|
+
const assigned = new Set();
|
|
24
|
+
for (let i = 0; i < eligible.length; i++) {
|
|
25
|
+
const keyA = this.blockKey(eligible[i]);
|
|
26
|
+
if (assigned.has(keyA))
|
|
27
|
+
continue;
|
|
28
|
+
const similar = [eligible[i]];
|
|
29
|
+
for (let j = i + 1; j < eligible.length; j++) {
|
|
30
|
+
const keyB = this.blockKey(eligible[j]);
|
|
31
|
+
if (assigned.has(keyB))
|
|
32
|
+
continue;
|
|
33
|
+
// Skip self-comparison (same file + same line range)
|
|
34
|
+
if (keyA === keyB)
|
|
35
|
+
continue;
|
|
36
|
+
const sim = this.computeSimilarity(eligible[i], eligible[j]);
|
|
37
|
+
if (sim >= minSimilarity) {
|
|
38
|
+
similar.push(eligible[j]);
|
|
39
|
+
assigned.add(keyB);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (similar.length > 1) {
|
|
43
|
+
assigned.add(keyA);
|
|
44
|
+
groups.push({
|
|
45
|
+
blocks: similar,
|
|
46
|
+
similarity: minSimilarity,
|
|
47
|
+
suggestedRefactor: this.suggestRefactor(similar),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return groups;
|
|
52
|
+
}
|
|
53
|
+
// ── Private Helpers ────────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Walk the project tree, read each source file, and extract code blocks.
|
|
56
|
+
*/
|
|
57
|
+
collectAllBlocks() {
|
|
58
|
+
const files = this.walkDir(this.projectDir);
|
|
59
|
+
const blocks = [];
|
|
60
|
+
for (const filePath of files) {
|
|
61
|
+
try {
|
|
62
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
63
|
+
const extracted = this.extractBlocks(filePath, content);
|
|
64
|
+
blocks.push(...extracted);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// unreadable file — skip
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return blocks;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Split a single file into code blocks by tracking brace depth.
|
|
74
|
+
* Recognises the block type (function, method, class, generic block).
|
|
75
|
+
* Only returns blocks with >= 6 lines.
|
|
76
|
+
*/
|
|
77
|
+
extractBlocks(filePath, content) {
|
|
78
|
+
const blocks = [];
|
|
79
|
+
const lines = content.split('\n');
|
|
80
|
+
let depth = 0;
|
|
81
|
+
let blockStart = -1;
|
|
82
|
+
let blockType = 'block';
|
|
83
|
+
let pendingType = 'block';
|
|
84
|
+
for (let i = 0; i < lines.length; i++) {
|
|
85
|
+
const line = lines[i];
|
|
86
|
+
// Detect what kind of block is about to open
|
|
87
|
+
if (depth === 0) {
|
|
88
|
+
const trimmed = line.trim();
|
|
89
|
+
if (/\bclass\b/.test(trimmed) && /\{/.test(trimmed)) {
|
|
90
|
+
pendingType = 'class';
|
|
91
|
+
}
|
|
92
|
+
else if (/\b(function\b|=>\s*\{|async\s+function\b|\*\s*\w+\s*\()/.test(trimmed) &&
|
|
93
|
+
/\{/.test(trimmed)) {
|
|
94
|
+
pendingType = 'function';
|
|
95
|
+
}
|
|
96
|
+
else if (/^\s*(public|private|protected|static|async|get|set|readonly)\s.*\{/.test(trimmed) ||
|
|
97
|
+
/^\s*\*?\s*\w+\s*\([^)]*\)\s*(?::\s*\w[^{]*)?\{/.test(trimmed)) {
|
|
98
|
+
pendingType = 'method';
|
|
99
|
+
}
|
|
100
|
+
else if (/\{/.test(trimmed)) {
|
|
101
|
+
pendingType = 'block';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Track brace depth
|
|
105
|
+
const opens = (line.match(/\{/g) || []).length;
|
|
106
|
+
const closes = (line.match(/\}/g) || []).length;
|
|
107
|
+
const prevDepth = depth;
|
|
108
|
+
depth += opens - closes;
|
|
109
|
+
if (opens > 0 && prevDepth === 0) {
|
|
110
|
+
// Entering a top-level block
|
|
111
|
+
blockStart = i;
|
|
112
|
+
blockType = pendingType;
|
|
113
|
+
}
|
|
114
|
+
if (prevDepth > 0 && depth === 0 && blockStart >= 0) {
|
|
115
|
+
// Exiting a block
|
|
116
|
+
const endLine = i;
|
|
117
|
+
const lineCount = endLine - blockStart + 1;
|
|
118
|
+
if (lineCount >= 6) {
|
|
119
|
+
blocks.push({
|
|
120
|
+
file: filePath,
|
|
121
|
+
startLine: blockStart + 1, // 1-based
|
|
122
|
+
endLine: endLine + 1,
|
|
123
|
+
content: lines.slice(blockStart, endLine + 1).join('\n'),
|
|
124
|
+
type: blockType,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
blockStart = -1;
|
|
128
|
+
blockType = 'block';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return blocks;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Compute Jaccard similarity between two code blocks.
|
|
135
|
+
* Tokenises content into word tokens, then calculates |intersection| / |union|.
|
|
136
|
+
*/
|
|
137
|
+
computeSimilarity(a, b) {
|
|
138
|
+
const tokensA = this.tokenize(a.content);
|
|
139
|
+
const tokensB = this.tokenize(b.content);
|
|
140
|
+
if (tokensA.size === 0 && tokensB.size === 0)
|
|
141
|
+
return 1.0;
|
|
142
|
+
if (tokensA.size === 0 || tokensB.size === 0)
|
|
143
|
+
return 0.0;
|
|
144
|
+
let intersectionSize = 0;
|
|
145
|
+
for (const token of tokensA) {
|
|
146
|
+
if (tokensB.has(token))
|
|
147
|
+
intersectionSize++;
|
|
148
|
+
}
|
|
149
|
+
const unionSize = tokensA.size + tokensB.size - intersectionSize;
|
|
150
|
+
return unionSize === 0 ? 0 : intersectionSize / unionSize;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Split content into individual word tokens and return as a Set.
|
|
154
|
+
* Strips punctuation and normalises to lowercase for comparison.
|
|
155
|
+
*/
|
|
156
|
+
tokenize(content) {
|
|
157
|
+
const words = content
|
|
158
|
+
.replace(/[^\w\s]/g, ' ')
|
|
159
|
+
.split(/\s+/)
|
|
160
|
+
.filter(w => w.length > 0)
|
|
161
|
+
.map(w => w.toLowerCase());
|
|
162
|
+
return new Set(words);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate a refactoring suggestion based on the types of the duplicate blocks.
|
|
166
|
+
*/
|
|
167
|
+
suggestRefactor(blocks) {
|
|
168
|
+
const types = new Set(blocks.map(b => b.type));
|
|
169
|
+
const files = new Set(blocks.map(b => b.file));
|
|
170
|
+
if (types.has('class')) {
|
|
171
|
+
return 'Extract a shared base class or compose common behaviour into a mixin/trait';
|
|
172
|
+
}
|
|
173
|
+
if (types.has('method')) {
|
|
174
|
+
if (files.size > 1) {
|
|
175
|
+
return 'Extract shared method logic into a utility module and import it where needed';
|
|
176
|
+
}
|
|
177
|
+
return 'Extract shared method logic into a private helper method within the same class';
|
|
178
|
+
}
|
|
179
|
+
if (types.has('function')) {
|
|
180
|
+
if (files.size > 1) {
|
|
181
|
+
return 'Extract shared logic into a utility function in a common module and import it where needed';
|
|
182
|
+
}
|
|
183
|
+
return 'Extract shared logic into a utility function within the same module';
|
|
184
|
+
}
|
|
185
|
+
// Generic block
|
|
186
|
+
if (files.size > 1) {
|
|
187
|
+
return 'Extract shared logic into a utility function in a shared module';
|
|
188
|
+
}
|
|
189
|
+
return 'Extract shared logic into a utility function to reduce duplication';
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Walk a directory tree, returning full paths of source files.
|
|
193
|
+
*/
|
|
194
|
+
walkDir(dir) {
|
|
195
|
+
const results = [];
|
|
196
|
+
try {
|
|
197
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
198
|
+
for (const entry of entries) {
|
|
199
|
+
if (entry.name.startsWith('.'))
|
|
200
|
+
continue;
|
|
201
|
+
const fullPath = path.join(dir, entry.name);
|
|
202
|
+
if (entry.isDirectory()) {
|
|
203
|
+
if (IGNORE_DIRS.has(entry.name))
|
|
204
|
+
continue;
|
|
205
|
+
results.push(...this.walkDir(fullPath));
|
|
206
|
+
}
|
|
207
|
+
else if (entry.isFile()) {
|
|
208
|
+
const ext = path.extname(entry.name);
|
|
209
|
+
if (SOURCE_EXTENSIONS.has(ext)) {
|
|
210
|
+
results.push(fullPath);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// permission or access error — skip
|
|
217
|
+
}
|
|
218
|
+
return results;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Produce a unique key for a block (file path + line range).
|
|
222
|
+
*/
|
|
223
|
+
blockKey(block) {
|
|
224
|
+
return `${block.file}:${block.startLine}-${block.endLine}`;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=code-similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-similarity.js","sourceRoot":"","sources":["../../src/brain/code-similarity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ProjectKnowledge, BrainInsight } from '../types.js';
|
|
2
|
+
export declare class ContextCompletionEngine {
|
|
3
|
+
private projectDir;
|
|
4
|
+
constructor(projectDir: string);
|
|
5
|
+
/**
|
|
6
|
+
* Analyze the project directory to build a comprehensive ProjectKnowledge
|
|
7
|
+
* object containing name, conventions, architecture, patterns, and deps.
|
|
8
|
+
*/
|
|
9
|
+
buildKnowledge(): Promise<ProjectKnowledge>;
|
|
10
|
+
/**
|
|
11
|
+
* Persist the knowledge object to `.shadow-brain/knowledge.json` inside
|
|
12
|
+
* the project directory.
|
|
13
|
+
*/
|
|
14
|
+
saveKnowledge(knowledge: ProjectKnowledge): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Identify missing project context items (README, .gitignore, tsconfig,
|
|
17
|
+
* CI/CD configs, etc.) and return them as prioritised BrainInsight array.
|
|
18
|
+
*/
|
|
19
|
+
getContextGaps(knowledge: ProjectKnowledge): Promise<BrainInsight[]>;
|
|
20
|
+
private detectProjectName;
|
|
21
|
+
private detectConventions;
|
|
22
|
+
private summarizeEslint;
|
|
23
|
+
private summarizePrettier;
|
|
24
|
+
private summarizeEditorConfig;
|
|
25
|
+
private summarizeTsconfig;
|
|
26
|
+
private detectArchitecture;
|
|
27
|
+
private hasFileExtensionSync;
|
|
28
|
+
private detectPatterns;
|
|
29
|
+
private detectDependencies;
|
|
30
|
+
private parseCargoDeps;
|
|
31
|
+
private hasFile;
|
|
32
|
+
private hasFileExtension;
|
|
33
|
+
/**
|
|
34
|
+
* Recursively collect source files up to a limit.
|
|
35
|
+
* Skips node_modules, .git, dist, build, coverage, and hidden directories.
|
|
36
|
+
*/
|
|
37
|
+
private collectSourceFiles;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=context-completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-completion.d.ts","sourceRoot":"","sources":["../../src/brain/context-completion.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuDlE,qBAAa,uBAAuB;IAClC,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAM9B;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAoBjD;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/D;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAwM5D,iBAAiB;YAqBjB,iBAAiB;IA0E/B,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,iBAAiB;YA6BX,kBAAkB;IA0GhC,OAAO,CAAC,oBAAoB;YAMd,cAAc;YAoId,kBAAkB;IAsChC,OAAO,CAAC,cAAc;YAyBR,OAAO;YAIP,gBAAgB;IA8B9B;;;OAGG;YACW,kBAAkB;CA8CjC"}
|