@theihtisham/agent-shadow-brain 1.2.0 → 3.0.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/accessibility-checker.d.ts +10 -0
- package/dist/brain/accessibility-checker.d.ts.map +1 -0
- package/dist/brain/accessibility-checker.js +379 -0
- package/dist/brain/accessibility-checker.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/api-contract-analyzer.d.ts +19 -0
- package/dist/brain/api-contract-analyzer.d.ts.map +1 -0
- package/dist/brain/api-contract-analyzer.js +251 -0
- package/dist/brain/api-contract-analyzer.js.map +1 -0
- package/dist/brain/ast-analyzer.d.ts +23 -0
- package/dist/brain/ast-analyzer.d.ts.map +1 -0
- package/dist/brain/ast-analyzer.js +462 -0
- package/dist/brain/ast-analyzer.js.map +1 -0
- package/dist/brain/code-age-analyzer.d.ts +11 -0
- package/dist/brain/code-age-analyzer.d.ts.map +1 -0
- package/dist/brain/code-age-analyzer.js +152 -0
- package/dist/brain/code-age-analyzer.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/config-drift-detector.d.ts +13 -0
- package/dist/brain/config-drift-detector.d.ts.map +1 -0
- package/dist/brain/config-drift-detector.js +198 -0
- package/dist/brain/config-drift-detector.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/dead-code-eliminator.d.ts +16 -0
- package/dist/brain/dead-code-eliminator.d.ts.map +1 -0
- package/dist/brain/dead-code-eliminator.js +359 -0
- package/dist/brain/dead-code-eliminator.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/env-analyzer.d.ts +13 -0
- package/dist/brain/env-analyzer.d.ts.map +1 -0
- package/dist/brain/env-analyzer.js +277 -0
- package/dist/brain/env-analyzer.js.map +1 -0
- package/dist/brain/i18n-detector.d.ts +12 -0
- package/dist/brain/i18n-detector.d.ts.map +1 -0
- package/dist/brain/i18n-detector.js +242 -0
- package/dist/brain/i18n-detector.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/license-compliance.d.ts +13 -0
- package/dist/brain/license-compliance.d.ts.map +1 -0
- package/dist/brain/license-compliance.js +213 -0
- package/dist/brain/license-compliance.js.map +1 -0
- package/dist/brain/llm-client.d.ts.map +1 -1
- package/dist/brain/llm-client.js +3 -0
- package/dist/brain/llm-client.js.map +1 -1
- 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/mutation-advisor.d.ts +11 -0
- package/dist/brain/mutation-advisor.d.ts.map +1 -0
- package/dist/brain/mutation-advisor.js +154 -0
- package/dist/brain/mutation-advisor.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 +159 -2
- package/dist/brain/orchestrator.d.ts.map +1 -1
- package/dist/brain/orchestrator.js +478 -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 +998 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +379 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n-detector.d.ts","sourceRoot":"","sources":["../../src/brain/i18n-detector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAoDtD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAIxB,cAAc,CAAC,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAerE,OAAO,CAAC,iBAAiB;IAgBzB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE;IAoH5D,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,YAAY;CAqBrB"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// src/brain/i18n-detector.ts — Internationalization (i18n) readiness checker
|
|
2
|
+
// v3.0.0 — Detects hardcoded strings, date/number format issues, missing RTL support
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
const IGNORE_DIRS = new Set([
|
|
6
|
+
'node_modules', '.git', 'dist', 'build', 'out', 'coverage', '.next', '.nuxt', '.cache',
|
|
7
|
+
'__tests__', '__test__', 'test', 'tests', 'spec',
|
|
8
|
+
]);
|
|
9
|
+
const CODE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.vue', '.svelte']);
|
|
10
|
+
// Common English words that suggest hardcoded UI text
|
|
11
|
+
const UI_PATTERNS = [
|
|
12
|
+
// String literals in JSX/HTML attributes that look like user-facing text
|
|
13
|
+
/placeholder\s*=\s*["']([A-Z][^"']{3,})["']/g,
|
|
14
|
+
/title\s*=\s*["']([A-Z][^"']{3,})["']/g,
|
|
15
|
+
/label\s*=\s*["']([A-Z][^"']{3,})["']/g,
|
|
16
|
+
/aria-label\s*=\s*["']([A-Z][^"']{3,})["']/g,
|
|
17
|
+
/alt\s*=\s*["']([A-Z][^"']{3,})["']/g,
|
|
18
|
+
// Button text in JSX
|
|
19
|
+
/>\s*([A-Z][a-z]+(\s+[A-Z]?[a-z]+){1,5})\s*</g,
|
|
20
|
+
// Error messages as string literals
|
|
21
|
+
/throw\s+new\s+\w+Error\s*\(\s*["']([A-Z][^"']{10,})["']/g,
|
|
22
|
+
// Alert/confirm messages
|
|
23
|
+
/\balert\s*\(\s*["']([A-Z][^"']{5,})["']/g,
|
|
24
|
+
/\bconfirm\s*\(\s*["']([A-Z][^"']{5,})["']/g,
|
|
25
|
+
// console.log with descriptive text (might be user-facing in some contexts)
|
|
26
|
+
/toast\s*\(\s*["']([A-Z][^"']{5,})["']/g,
|
|
27
|
+
/notification\s*\.\s*(success|error|warning|info)\s*\(\s*["']([A-Z][^"']{5,})["']/g,
|
|
28
|
+
];
|
|
29
|
+
// Date format patterns that aren't i18n-aware
|
|
30
|
+
const DATE_PATTERNS = [
|
|
31
|
+
{ regex: /\bnew\s+Date\(\s*\)\.to(Locale)?DateString\s*\(\s*\)/g, type: 'date-format' },
|
|
32
|
+
{ regex: /\btoLocaleDateString\s*\(\s*["']en["']/g, type: 'date-format' },
|
|
33
|
+
{ regex: /\bgetMonth\(\)\s*\+\s*1/g, type: 'date-format' },
|
|
34
|
+
{ regex: /\bgetFullYear\(\)\s*-\s*\d{2}/g, type: 'date-format' },
|
|
35
|
+
];
|
|
36
|
+
// Number format patterns
|
|
37
|
+
const NUMBER_PATTERNS = [
|
|
38
|
+
{ regex: /\btoFixed\s*\(\s*\d+\s*\)/g, type: 'number-format' },
|
|
39
|
+
{ regex: /\b\.toLocaleString\s*\(\s*\)/g, type: 'number-format' },
|
|
40
|
+
];
|
|
41
|
+
// String concatenation with variables (likely needs interpolation)
|
|
42
|
+
const CONCAT_PATTERNS = [
|
|
43
|
+
/["'][A-Za-z\s]+\s*["']\s*\+\s*\w+/g,
|
|
44
|
+
/\w+\s*\+\s*["']\s+[A-Za-z\s]+["']/g,
|
|
45
|
+
/`[^`]*\$\{[^}]+\}[^`]*[A-Za-z]{3,}[^`]*`/g, // template literals with text
|
|
46
|
+
];
|
|
47
|
+
export class I18nDetector {
|
|
48
|
+
constructor(projectDir) {
|
|
49
|
+
this.projectDir = projectDir;
|
|
50
|
+
}
|
|
51
|
+
async analyzeProject(maxFiles = 150) {
|
|
52
|
+
const files = this.collectFiles(this.projectDir, maxFiles);
|
|
53
|
+
const allIssues = [];
|
|
54
|
+
// Check if i18n library is already present
|
|
55
|
+
const hasI18n = this.detectI18nLibrary();
|
|
56
|
+
for (const filePath of files) {
|
|
57
|
+
const issues = this.analyzeFile(filePath, hasI18n);
|
|
58
|
+
allIssues.push(...issues);
|
|
59
|
+
}
|
|
60
|
+
return allIssues.map(issue => this.issueToInsight(issue, hasI18n));
|
|
61
|
+
}
|
|
62
|
+
detectI18nLibrary() {
|
|
63
|
+
const pkgPath = path.join(this.projectDir, 'package.json');
|
|
64
|
+
try {
|
|
65
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
66
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
67
|
+
return !!(allDeps['i18next'] || allDeps['react-i18next'] || allDeps['vue-i18n'] ||
|
|
68
|
+
allDeps['@angular/localize'] || allDeps['svelte-i18n'] || allDeps['next-intl'] ||
|
|
69
|
+
allDeps['next-i18next'] || allDeps['react-intl'] || allDeps['formatjs'] ||
|
|
70
|
+
allDeps['lingui'] || allDeps['@lingui/core']);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
analyzeFile(filePath, hasI18n) {
|
|
77
|
+
let content;
|
|
78
|
+
try {
|
|
79
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
const issues = [];
|
|
85
|
+
const lines = content.split('\n');
|
|
86
|
+
const relPath = path.relative(this.projectDir, filePath);
|
|
87
|
+
// Skip test files
|
|
88
|
+
if (relPath.includes('.test.') || relPath.includes('.spec.') || relPath.includes('__tests__')) {
|
|
89
|
+
return issues;
|
|
90
|
+
}
|
|
91
|
+
// Detect hardcoded UI strings
|
|
92
|
+
for (let i = 0; i < lines.length; i++) {
|
|
93
|
+
const line = lines[i];
|
|
94
|
+
const lineNum = i + 1;
|
|
95
|
+
// Check for UI text patterns
|
|
96
|
+
for (const pattern of UI_PATTERNS) {
|
|
97
|
+
pattern.lastIndex = 0;
|
|
98
|
+
const match = pattern.exec(line);
|
|
99
|
+
if (match) {
|
|
100
|
+
const text = match[1] || match[0];
|
|
101
|
+
// Skip if it looks like code, not text
|
|
102
|
+
if (this.isCodeNotText(text))
|
|
103
|
+
continue;
|
|
104
|
+
issues.push({
|
|
105
|
+
type: 'hardcoded-string',
|
|
106
|
+
file: relPath,
|
|
107
|
+
line: lineNum,
|
|
108
|
+
content: text.slice(0, 100),
|
|
109
|
+
suggestion: hasI18n
|
|
110
|
+
? `Replace with i18n translation key: t('key')`
|
|
111
|
+
: `Extract to a translations file or use an i18n library`,
|
|
112
|
+
severity: 'medium',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check for string concatenation
|
|
117
|
+
for (const concatPattern of CONCAT_PATTERNS) {
|
|
118
|
+
concatPattern.lastIndex = 0;
|
|
119
|
+
if (concatPattern.test(line)) {
|
|
120
|
+
// Avoid duplicates
|
|
121
|
+
const existing = issues.find(iss => iss.line === lineNum && iss.type === 'concatenation');
|
|
122
|
+
if (!existing) {
|
|
123
|
+
issues.push({
|
|
124
|
+
type: 'concatenation',
|
|
125
|
+
file: relPath,
|
|
126
|
+
line: lineNum,
|
|
127
|
+
content: line.trim().slice(0, 100),
|
|
128
|
+
suggestion: 'Use ICU message format or interpolation for proper i18n: `{variable}` instead of string concatenation',
|
|
129
|
+
severity: 'high',
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Check date format issues
|
|
136
|
+
for (const { regex, type } of DATE_PATTERNS) {
|
|
137
|
+
regex.lastIndex = 0;
|
|
138
|
+
let match;
|
|
139
|
+
while ((match = regex.exec(content)) !== null) {
|
|
140
|
+
const line = content.substring(0, match.index).split('\n').length;
|
|
141
|
+
issues.push({
|
|
142
|
+
type,
|
|
143
|
+
file: relPath,
|
|
144
|
+
line,
|
|
145
|
+
content: match[0],
|
|
146
|
+
suggestion: 'Use Intl.DateTimeFormat with explicit locale or i18n library date formatting',
|
|
147
|
+
severity: 'low',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Check number format issues
|
|
152
|
+
for (const { regex, type } of NUMBER_PATTERNS) {
|
|
153
|
+
regex.lastIndex = 0;
|
|
154
|
+
let match;
|
|
155
|
+
while ((match = regex.exec(content)) !== null) {
|
|
156
|
+
const line = content.substring(0, match.index).split('\n').length;
|
|
157
|
+
issues.push({
|
|
158
|
+
type,
|
|
159
|
+
file: relPath,
|
|
160
|
+
line,
|
|
161
|
+
content: match[0],
|
|
162
|
+
suggestion: 'Use Intl.NumberFormat with locale for proper number formatting (decimals, separators, currency)',
|
|
163
|
+
severity: 'low',
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Check for pluralization issues (hardcoded "s" for plural)
|
|
168
|
+
const pluralRegex = /\+\s*["']s["']\s*|\?\s*["']s["']\s*:\s*["']["']/g;
|
|
169
|
+
let pluralMatch;
|
|
170
|
+
while ((pluralMatch = pluralRegex.exec(content)) !== null) {
|
|
171
|
+
const line = content.substring(0, pluralMatch.index).split('\n').length;
|
|
172
|
+
issues.push({
|
|
173
|
+
type: 'pluralization',
|
|
174
|
+
file: relPath,
|
|
175
|
+
line,
|
|
176
|
+
content: pluralMatch[0],
|
|
177
|
+
suggestion: 'Use ICU plural format: `{count, plural, one {item} other {items}}` for proper pluralization across languages',
|
|
178
|
+
severity: 'medium',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return issues;
|
|
182
|
+
}
|
|
183
|
+
isCodeNotText(text) {
|
|
184
|
+
// Skip if it looks like code identifiers
|
|
185
|
+
if (/^[a-z_]+(\.[a-z_]+)*$/.test(text))
|
|
186
|
+
return true;
|
|
187
|
+
if (/^\d+$/.test(text))
|
|
188
|
+
return true;
|
|
189
|
+
if (/^(true|false|null|undefined|void|async|await|return|const|let|var)$/.test(text))
|
|
190
|
+
return true;
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
issueToInsight(issue, hasI18n) {
|
|
194
|
+
return {
|
|
195
|
+
type: 'i18n',
|
|
196
|
+
priority: issue.severity === 'high' ? 'high' : issue.severity === 'medium' ? 'medium' : 'low',
|
|
197
|
+
title: `[i18n] ${issue.type}: ${issue.content.slice(0, 60)}`,
|
|
198
|
+
content: `i18n issue in ${issue.file}:${issue.line}\n` +
|
|
199
|
+
` Type: ${issue.type}\n` +
|
|
200
|
+
` Content: ${issue.content}\n` +
|
|
201
|
+
` Severity: ${issue.severity}\n` +
|
|
202
|
+
` Fix: ${issue.suggestion}\n` +
|
|
203
|
+
(hasI18n ? '' : ' Note: No i18n library detected. Consider adding i18next, react-intl, or next-intl.'),
|
|
204
|
+
files: [issue.file],
|
|
205
|
+
timestamp: new Date(),
|
|
206
|
+
confidence: 0.85,
|
|
207
|
+
metadata: { i18nType: issue.type, hasI18nLibrary: hasI18n },
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
collectFiles(dir, maxFiles) {
|
|
211
|
+
const results = [];
|
|
212
|
+
const walk = (currentDir, depth) => {
|
|
213
|
+
if (results.length >= maxFiles || depth > 10)
|
|
214
|
+
return;
|
|
215
|
+
let entries;
|
|
216
|
+
try {
|
|
217
|
+
entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
for (const entry of entries) {
|
|
223
|
+
if (results.length >= maxFiles)
|
|
224
|
+
return;
|
|
225
|
+
if (entry.name.startsWith('.'))
|
|
226
|
+
continue;
|
|
227
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
228
|
+
if (entry.isDirectory()) {
|
|
229
|
+
if (IGNORE_DIRS.has(entry.name))
|
|
230
|
+
continue;
|
|
231
|
+
walk(fullPath, depth + 1);
|
|
232
|
+
}
|
|
233
|
+
else if (entry.isFile() && CODE_EXTENSIONS.has(path.extname(entry.name))) {
|
|
234
|
+
results.push(fullPath);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
walk(dir, 0);
|
|
239
|
+
return results;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=i18n-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n-detector.js","sourceRoot":"","sources":["../../src/brain/i18n-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { BrainInsight, FileChange, ProjectContext, LearnedLesson, ProjectKnowledge } from '../types.js';
|
|
2
|
+
import type { LLMClient } from './llm-client.js';
|
|
3
|
+
export declare class LearningEngine {
|
|
4
|
+
private store;
|
|
5
|
+
private storePath;
|
|
6
|
+
private saveTimer;
|
|
7
|
+
private projectDir;
|
|
8
|
+
private llmClient;
|
|
9
|
+
constructor(projectDir: string, llmClient?: LLMClient);
|
|
10
|
+
load(): Promise<void>;
|
|
11
|
+
save(): Promise<void>;
|
|
12
|
+
private scheduleSave;
|
|
13
|
+
learnFromInsights(insights: BrainInsight[], changes: FileChange[]): void;
|
|
14
|
+
learnFromFeedback(insightId: string, accepted: boolean): void;
|
|
15
|
+
learnProjectPatterns(context: ProjectContext, files: string[]): Promise<void>;
|
|
16
|
+
getRelevantLessons(changes: FileChange[]): LearnedLesson[];
|
|
17
|
+
getProjectKnowledge(projectDir: string): ProjectKnowledge | null;
|
|
18
|
+
getIntelligenceBoost(changes: FileChange[], context: ProjectContext): Promise<BrainInsight[]>;
|
|
19
|
+
getStats(): {
|
|
20
|
+
totalLessons: number;
|
|
21
|
+
totalPatterns: number;
|
|
22
|
+
avgConfidence: number;
|
|
23
|
+
projectCount: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* learnFromProject — Scan the project for patterns and extract lessons.
|
|
27
|
+
* Called by the orchestrator during a learning cycle.
|
|
28
|
+
*/
|
|
29
|
+
learnFromProject(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* getLessons — Return all learned lessons in the format the orchestrator expects.
|
|
32
|
+
*/
|
|
33
|
+
getLessons(): Promise<Array<{
|
|
34
|
+
category: string;
|
|
35
|
+
pattern: string;
|
|
36
|
+
lesson: string;
|
|
37
|
+
confidence: number;
|
|
38
|
+
}>>;
|
|
39
|
+
/**
|
|
40
|
+
* recordInsight — Record a BrainInsight as a learned lesson.
|
|
41
|
+
* Called by the orchestrator when critical/high-priority insights are generated.
|
|
42
|
+
*/
|
|
43
|
+
recordInsight(insight: BrainInsight): Promise<void>;
|
|
44
|
+
cleanup(): void;
|
|
45
|
+
private dirExists;
|
|
46
|
+
private collectSourceFiles;
|
|
47
|
+
private createLessonFromContent;
|
|
48
|
+
private enrichLessonsWithLLM;
|
|
49
|
+
private extractPattern;
|
|
50
|
+
private extractCodePattern;
|
|
51
|
+
private contentFollowsConvention;
|
|
52
|
+
private generateLLMInsights;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=learning-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-engine.d.ts","sourceRoot":"","sources":["../../src/brain/learning-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAe,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1H,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAgBjD,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAmB;gBAExB,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS;IAkB/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,OAAO,CAAC,YAAY;IAcpB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAgFxE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAwBvD,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DnF,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,aAAa,EAAE;IAuC1D,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAI1D,oBAAoB,CACxB,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC;IA0E1B,QAAQ,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAexG;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiEvC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAW7G;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CzD,OAAO,IAAI,IAAI;YAqBD,SAAS;YAST,kBAAkB;IA+ChC,OAAO,CAAC,uBAAuB;YAiGjB,oBAAoB;IAiFlC,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,wBAAwB;YAYlB,mBAAmB;CAyFlC"}
|