@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.
Files changed (117) hide show
  1. package/README.md +837 -73
  2. package/dist/adapters/aider.d.ts +11 -0
  3. package/dist/adapters/aider.d.ts.map +1 -0
  4. package/dist/adapters/aider.js +149 -0
  5. package/dist/adapters/aider.js.map +1 -0
  6. package/dist/adapters/index.d.ts +3 -1
  7. package/dist/adapters/index.d.ts.map +1 -1
  8. package/dist/adapters/index.js +5 -3
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/adapters/roo-code.d.ts +14 -0
  11. package/dist/adapters/roo-code.d.ts.map +1 -0
  12. package/dist/adapters/roo-code.js +186 -0
  13. package/dist/adapters/roo-code.js.map +1 -0
  14. package/dist/brain/accessibility-checker.d.ts +10 -0
  15. package/dist/brain/accessibility-checker.d.ts.map +1 -0
  16. package/dist/brain/accessibility-checker.js +379 -0
  17. package/dist/brain/accessibility-checker.js.map +1 -0
  18. package/dist/brain/adr-engine.d.ts +58 -0
  19. package/dist/brain/adr-engine.d.ts.map +1 -0
  20. package/dist/brain/adr-engine.js +400 -0
  21. package/dist/brain/adr-engine.js.map +1 -0
  22. package/dist/brain/api-contract-analyzer.d.ts +19 -0
  23. package/dist/brain/api-contract-analyzer.d.ts.map +1 -0
  24. package/dist/brain/api-contract-analyzer.js +251 -0
  25. package/dist/brain/api-contract-analyzer.js.map +1 -0
  26. package/dist/brain/ast-analyzer.d.ts +23 -0
  27. package/dist/brain/ast-analyzer.d.ts.map +1 -0
  28. package/dist/brain/ast-analyzer.js +462 -0
  29. package/dist/brain/ast-analyzer.js.map +1 -0
  30. package/dist/brain/code-age-analyzer.d.ts +11 -0
  31. package/dist/brain/code-age-analyzer.d.ts.map +1 -0
  32. package/dist/brain/code-age-analyzer.js +152 -0
  33. package/dist/brain/code-age-analyzer.js.map +1 -0
  34. package/dist/brain/code-similarity.d.ts +43 -0
  35. package/dist/brain/code-similarity.d.ts.map +1 -0
  36. package/dist/brain/code-similarity.js +227 -0
  37. package/dist/brain/code-similarity.js.map +1 -0
  38. package/dist/brain/config-drift-detector.d.ts +13 -0
  39. package/dist/brain/config-drift-detector.d.ts.map +1 -0
  40. package/dist/brain/config-drift-detector.js +198 -0
  41. package/dist/brain/config-drift-detector.js.map +1 -0
  42. package/dist/brain/context-completion.d.ts +39 -0
  43. package/dist/brain/context-completion.d.ts.map +1 -0
  44. package/dist/brain/context-completion.js +851 -0
  45. package/dist/brain/context-completion.js.map +1 -0
  46. package/dist/brain/dead-code-eliminator.d.ts +16 -0
  47. package/dist/brain/dead-code-eliminator.d.ts.map +1 -0
  48. package/dist/brain/dead-code-eliminator.js +359 -0
  49. package/dist/brain/dead-code-eliminator.js.map +1 -0
  50. package/dist/brain/dependency-graph.d.ts +35 -0
  51. package/dist/brain/dependency-graph.d.ts.map +1 -0
  52. package/dist/brain/dependency-graph.js +310 -0
  53. package/dist/brain/dependency-graph.js.map +1 -0
  54. package/dist/brain/env-analyzer.d.ts +13 -0
  55. package/dist/brain/env-analyzer.d.ts.map +1 -0
  56. package/dist/brain/env-analyzer.js +277 -0
  57. package/dist/brain/env-analyzer.js.map +1 -0
  58. package/dist/brain/i18n-detector.d.ts +12 -0
  59. package/dist/brain/i18n-detector.d.ts.map +1 -0
  60. package/dist/brain/i18n-detector.js +242 -0
  61. package/dist/brain/i18n-detector.js.map +1 -0
  62. package/dist/brain/learning-engine.d.ts +54 -0
  63. package/dist/brain/learning-engine.d.ts.map +1 -0
  64. package/dist/brain/learning-engine.js +855 -0
  65. package/dist/brain/learning-engine.js.map +1 -0
  66. package/dist/brain/license-compliance.d.ts +13 -0
  67. package/dist/brain/license-compliance.d.ts.map +1 -0
  68. package/dist/brain/license-compliance.js +213 -0
  69. package/dist/brain/license-compliance.js.map +1 -0
  70. package/dist/brain/llm-client.d.ts.map +1 -1
  71. package/dist/brain/llm-client.js +3 -0
  72. package/dist/brain/llm-client.js.map +1 -1
  73. package/dist/brain/mcp-server.d.ts +30 -0
  74. package/dist/brain/mcp-server.d.ts.map +1 -0
  75. package/dist/brain/mcp-server.js +408 -0
  76. package/dist/brain/mcp-server.js.map +1 -0
  77. package/dist/brain/multi-project.d.ts +13 -0
  78. package/dist/brain/multi-project.d.ts.map +1 -0
  79. package/dist/brain/multi-project.js +163 -0
  80. package/dist/brain/multi-project.js.map +1 -0
  81. package/dist/brain/mutation-advisor.d.ts +11 -0
  82. package/dist/brain/mutation-advisor.d.ts.map +1 -0
  83. package/dist/brain/mutation-advisor.js +154 -0
  84. package/dist/brain/mutation-advisor.js.map +1 -0
  85. package/dist/brain/neural-mesh.d.ts +69 -0
  86. package/dist/brain/neural-mesh.d.ts.map +1 -0
  87. package/dist/brain/neural-mesh.js +677 -0
  88. package/dist/brain/neural-mesh.js.map +1 -0
  89. package/dist/brain/orchestrator.d.ts +159 -2
  90. package/dist/brain/orchestrator.d.ts.map +1 -1
  91. package/dist/brain/orchestrator.js +478 -0
  92. package/dist/brain/orchestrator.js.map +1 -1
  93. package/dist/brain/perf-profiler.d.ts +14 -0
  94. package/dist/brain/perf-profiler.d.ts.map +1 -0
  95. package/dist/brain/perf-profiler.js +289 -0
  96. package/dist/brain/perf-profiler.js.map +1 -0
  97. package/dist/brain/semantic-analyzer.d.ts +46 -0
  98. package/dist/brain/semantic-analyzer.d.ts.map +1 -0
  99. package/dist/brain/semantic-analyzer.js +496 -0
  100. package/dist/brain/semantic-analyzer.js.map +1 -0
  101. package/dist/brain/team-mode.d.ts +27 -0
  102. package/dist/brain/team-mode.d.ts.map +1 -0
  103. package/dist/brain/team-mode.js +262 -0
  104. package/dist/brain/team-mode.js.map +1 -0
  105. package/dist/brain/type-safety.d.ts +13 -0
  106. package/dist/brain/type-safety.d.ts.map +1 -0
  107. package/dist/brain/type-safety.js +217 -0
  108. package/dist/brain/type-safety.js.map +1 -0
  109. package/dist/cli.js +998 -3
  110. package/dist/cli.js.map +1 -1
  111. package/dist/index.d.ts +25 -1
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +29 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/types.d.ts +379 -2
  116. package/dist/types.d.ts.map +1 -1
  117. package/package.json +2 -2
@@ -0,0 +1,379 @@
1
+ // src/brain/accessibility-checker.ts — Web Accessibility (a11y) issue detection
2
+ // v3.0.0 — Scans HTML/JSX/Vue/Svelte templates for WCAG compliance issues
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
+ ]);
8
+ const TEMPLATE_EXTENSIONS = new Set(['.html', '.jsx', '.tsx', '.vue', '.svelte']);
9
+ const RULES = [
10
+ {
11
+ name: 'img-alt',
12
+ wcagLevel: 'A',
13
+ wcagCriterion: '1.1.1',
14
+ check: (content, lines, filePath) => {
15
+ const issues = [];
16
+ // Match <img> without alt attribute
17
+ const imgRegex = /<img\b[^>]*>/g;
18
+ let match;
19
+ while ((match = imgRegex.exec(content)) !== null) {
20
+ const tag = match[0];
21
+ if (!/\balt\s*=/.test(tag)) {
22
+ const line = lines.findIndex((_, i, arr) => arr.slice(0, i + 1).join('\n').length > match.index) + 1;
23
+ issues.push({
24
+ rule: 'img-alt',
25
+ severity: 'critical',
26
+ element: tag.slice(0, 80),
27
+ file: filePath,
28
+ line: Math.max(1, line),
29
+ message: 'Image missing alt attribute',
30
+ suggestion: 'Add descriptive alt text: alt="Description of image" or alt="" for decorative images',
31
+ wcagLevel: 'A',
32
+ wcagCriterion: '1.1.1',
33
+ });
34
+ }
35
+ else if (/alt\s*=\s*["']\s*["']/.test(tag) && !/role\s*=\s*["']presentation["']/.test(tag)) {
36
+ // Empty alt without presentation role — only flag if it's not clearly decorative
37
+ const line = lines.findIndex((_, i, arr) => arr.slice(0, i + 1).join('\n').length > match.index) + 1;
38
+ issues.push({
39
+ rule: 'img-alt',
40
+ severity: 'moderate',
41
+ element: tag.slice(0, 80),
42
+ file: filePath,
43
+ line: Math.max(1, line),
44
+ message: 'Image has empty alt text — ensure it is decorative',
45
+ suggestion: 'If decorative, add role="presentation". If meaningful, add descriptive alt text.',
46
+ wcagLevel: 'A',
47
+ wcagCriterion: '1.1.1',
48
+ });
49
+ }
50
+ }
51
+ return issues;
52
+ },
53
+ },
54
+ {
55
+ name: 'button-label',
56
+ wcagLevel: 'A',
57
+ wcagCriterion: '4.1.2',
58
+ check: (content, lines, filePath) => {
59
+ const issues = [];
60
+ // <button> with no text content and no aria-label
61
+ const btnRegex = /<button\b([^>]*)>([\s\S]*?)<\/button>/g;
62
+ let match;
63
+ while ((match = btnRegex.exec(content)) !== null) {
64
+ const attrs = match[1];
65
+ const innerContent = match[2].trim();
66
+ const hasAriaLabel = /\baria-label\s*=/.test(attrs);
67
+ const hasAriaLabelledBy = /\baria-labelledby\s*=/.test(attrs);
68
+ const hasTitle = /\btitle\s*=/.test(attrs);
69
+ const hasTextContent = innerContent.length > 0 && !/^<[^>]+>$/.test(innerContent);
70
+ const hasImgAlt = /<img\b[^>]*\balt\s*=\s*["'][^"']+["']/.test(innerContent);
71
+ if (!hasTextContent && !hasAriaLabel && !hasAriaLabelledBy && !hasTitle && !hasImgAlt) {
72
+ const line = content.substring(0, match.index).split('\n').length;
73
+ issues.push({
74
+ rule: 'button-label',
75
+ severity: 'critical',
76
+ element: match[0].slice(0, 80),
77
+ file: filePath,
78
+ line,
79
+ message: 'Button has no accessible label',
80
+ suggestion: 'Add text content, aria-label, or aria-labelledby to provide an accessible name',
81
+ wcagLevel: 'A',
82
+ wcagCriterion: '4.1.2',
83
+ });
84
+ }
85
+ }
86
+ return issues;
87
+ },
88
+ },
89
+ {
90
+ name: 'input-label',
91
+ wcagLevel: 'A',
92
+ wcagCriterion: '1.3.1',
93
+ check: (content, lines, filePath) => {
94
+ const issues = [];
95
+ // <input> without associated label, aria-label, or aria-labelledby
96
+ const inputRegex = /<input\b([^>]*)>/g;
97
+ let match;
98
+ while ((match = inputRegex.exec(content)) !== null) {
99
+ const attrs = match[1];
100
+ const type = /type\s*=\s*["']([^"']+)["']/.exec(attrs)?.[1] || 'text';
101
+ const hiddenTypes = ['hidden', 'submit', 'reset', 'button', 'image'];
102
+ if (hiddenTypes.includes(type))
103
+ continue;
104
+ const hasAriaLabel = /\baria-label\s*=/.test(attrs);
105
+ const hasAriaLabelledBy = /\baria-labelledby\s*=/.test(attrs);
106
+ const hasTitle = /\btitle\s*=/.test(attrs);
107
+ const hasId = /\bid\s*=/.test(attrs);
108
+ if (!hasAriaLabel && !hasAriaLabelledBy && !hasTitle) {
109
+ if (hasId) {
110
+ // Check if there's a matching <label for="id">
111
+ const id = /id\s*=\s*["']([^"']+)["']/.exec(attrs)?.[1];
112
+ if (id && new RegExp(`<label[^>]*\\bfor\\s*=\\s*["']${id}["']`).test(content)) {
113
+ continue; // has associated label
114
+ }
115
+ }
116
+ const line = content.substring(0, match.index).split('\n').length;
117
+ issues.push({
118
+ rule: 'input-label',
119
+ severity: 'critical',
120
+ element: match[0].slice(0, 80),
121
+ file: filePath,
122
+ line,
123
+ message: `Input (type="${type}") missing label association`,
124
+ suggestion: 'Add a <label for="id">, aria-label, or aria-labelledby attribute',
125
+ wcagLevel: 'A',
126
+ wcagCriterion: '1.3.1',
127
+ });
128
+ }
129
+ }
130
+ return issues;
131
+ },
132
+ },
133
+ {
134
+ name: 'heading-order',
135
+ wcagLevel: 'AA',
136
+ wcagCriterion: '1.3.1',
137
+ check: (content, lines, filePath) => {
138
+ const issues = [];
139
+ const headingRegex = /<h([1-6])\b/g;
140
+ let lastLevel = 0;
141
+ let match;
142
+ while ((match = headingRegex.exec(content)) !== null) {
143
+ const level = parseInt(match[1]);
144
+ if (lastLevel > 0 && level > lastLevel + 1) {
145
+ const line = content.substring(0, match.index).split('\n').length;
146
+ issues.push({
147
+ rule: 'heading-order',
148
+ severity: 'moderate',
149
+ element: match[0],
150
+ file: filePath,
151
+ line,
152
+ message: `Heading level skipped: h${lastLevel} to h${level}`,
153
+ suggestion: `Headings should not skip levels. Use h${lastLevel + 1} or restructure heading hierarchy.`,
154
+ wcagLevel: 'AA',
155
+ wcagCriterion: '1.3.1',
156
+ });
157
+ }
158
+ lastLevel = level;
159
+ }
160
+ return issues;
161
+ },
162
+ },
163
+ {
164
+ name: 'color-contrast',
165
+ wcagLevel: 'AA',
166
+ wcagCriterion: '1.4.3',
167
+ check: (content, lines, filePath) => {
168
+ const issues = [];
169
+ // Check for inline styles with low-contrast colors (heuristic)
170
+ const styleRegex = /style\s*=\s*["']([^"']*color\s*:[^"']*)["']/gi;
171
+ let match;
172
+ while ((match = styleRegex.exec(content)) !== null) {
173
+ const styleContent = match[1];
174
+ // Flag if only color is set without background-color or vice versa
175
+ const hasColor = /(?:^|;)\s*color\s*:/.test(styleContent);
176
+ const hasBgColor = /background(-color)?\s*:/.test(styleContent);
177
+ if (hasColor && !hasBgColor) {
178
+ const line = content.substring(0, match.index).split('\n').length;
179
+ issues.push({
180
+ rule: 'color-contrast',
181
+ severity: 'serious',
182
+ element: match[0].slice(0, 80),
183
+ file: filePath,
184
+ line,
185
+ message: 'Inline color without matching background-color — contrast cannot be verified',
186
+ suggestion: 'Ensure sufficient color contrast (4.5:1 for normal text, 3:1 for large text). Prefer CSS classes over inline styles.',
187
+ wcagLevel: 'AA',
188
+ wcagCriterion: '1.4.3',
189
+ });
190
+ }
191
+ }
192
+ return issues;
193
+ },
194
+ },
195
+ {
196
+ name: 'aria-valid',
197
+ wcagLevel: 'A',
198
+ wcagCriterion: '4.1.2',
199
+ check: (content, lines, filePath) => {
200
+ const issues = [];
201
+ // Check for common invalid aria usage
202
+ const ariaRoleRegex = /role\s*=\s*["']([^"']+)["']/gi;
203
+ const validRoles = new Set([
204
+ 'alert', 'alertdialog', 'application', 'article', 'banner', 'button',
205
+ 'cell', 'checkbox', 'columnheader', 'combobox', 'complementary', 'contentinfo',
206
+ 'definition', 'dialog', 'directory', 'document', 'feed', 'figure', 'form',
207
+ 'grid', 'gridcell', 'group', 'heading', 'img', 'link', 'list', 'listbox',
208
+ 'listitem', 'log', 'main', 'marquee', 'math', 'menu', 'menubar', 'menuitem',
209
+ 'menuitemcheckbox', 'menuitemradio', 'navigation', 'none', 'note', 'option',
210
+ 'presentation', 'progressbar', 'radio', 'radiogroup', 'region', 'row',
211
+ 'rowgroup', 'rowheader', 'scrollbar', 'search', 'searchbox', 'separator',
212
+ 'slider', 'spinbutton', 'status', 'switch', 'tab', 'table', 'tablist',
213
+ 'tabpanel', 'term', 'textbox', 'timer', 'toolbar', 'tooltip', 'tree',
214
+ 'treegrid', 'treeitem',
215
+ ]);
216
+ let match;
217
+ while ((match = ariaRoleRegex.exec(content)) !== null) {
218
+ const role = match[1].toLowerCase();
219
+ if (!validRoles.has(role)) {
220
+ const line = content.substring(0, match.index).split('\n').length;
221
+ issues.push({
222
+ rule: 'aria-valid',
223
+ severity: 'serious',
224
+ element: match[0],
225
+ file: filePath,
226
+ line,
227
+ message: `Invalid ARIA role: "${role}"`,
228
+ suggestion: `Use a valid WAI-ARIA role. See https://www.w3.org/TR/wai-aria-1.2/#role_definitions`,
229
+ wcagLevel: 'A',
230
+ wcagCriterion: '4.1.2',
231
+ });
232
+ }
233
+ }
234
+ return issues;
235
+ },
236
+ },
237
+ {
238
+ name: 'link-purpose',
239
+ wcagLevel: 'AA',
240
+ wcagCriterion: '2.4.4',
241
+ check: (content, lines, filePath) => {
242
+ const issues = [];
243
+ // Links with non-descriptive text
244
+ const vagueTexts = ['click here', 'here', 'read more', 'more', 'link', 'this', 'go', 'learn more'];
245
+ const linkRegex = /<a\b[^>]*>([\s\S]*?)<\/a>/gi;
246
+ let match;
247
+ while ((match = linkRegex.exec(content)) !== null) {
248
+ const text = match[1].replace(/<[^>]+>/g, '').trim().toLowerCase();
249
+ if (vagueTexts.includes(text)) {
250
+ const line = content.substring(0, match.index).split('\n').length;
251
+ issues.push({
252
+ rule: 'link-purpose',
253
+ severity: 'serious',
254
+ element: match[0].slice(0, 80),
255
+ file: filePath,
256
+ line,
257
+ message: `Link text "${text}" is not descriptive`,
258
+ suggestion: 'Use descriptive link text that makes sense out of context, e.g., "Read the accessibility guide"',
259
+ wcagLevel: 'AA',
260
+ wcagCriterion: '2.4.4',
261
+ });
262
+ }
263
+ }
264
+ return issues;
265
+ },
266
+ },
267
+ {
268
+ name: 'form-submit',
269
+ wcagLevel: 'A',
270
+ wcagCriterion: '3.3.2',
271
+ check: (content, lines, filePath) => {
272
+ const issues = [];
273
+ // Forms without submit buttons
274
+ const formRegex = /<form\b[^>]*>([\s\S]*?)<\/form>/gi;
275
+ let match;
276
+ while ((match = formRegex.exec(content)) !== null) {
277
+ const formContent = match[1];
278
+ const hasSubmit = /<button[^>]*type\s*=\s*["']submit["']/i.test(formContent) ||
279
+ /<input[^>]*type\s*=\s*["']submit["']/i.test(formContent) ||
280
+ /<input[^>]*type\s*=\s*["']image["']/i.test(formContent);
281
+ if (!hasSubmit) {
282
+ const line = content.substring(0, match.index).split('\n').length;
283
+ issues.push({
284
+ rule: 'form-submit',
285
+ severity: 'moderate',
286
+ element: '<form>...</form>',
287
+ file: filePath,
288
+ line,
289
+ message: 'Form missing submit button',
290
+ suggestion: 'Add a submit button (<button type="submit">) or ensure JS-based submission has accessible alternative',
291
+ wcagLevel: 'A',
292
+ wcagCriterion: '3.3.2',
293
+ });
294
+ }
295
+ }
296
+ return issues;
297
+ },
298
+ },
299
+ ];
300
+ export class AccessibilityChecker {
301
+ constructor(projectDir) {
302
+ this.projectDir = projectDir;
303
+ }
304
+ async analyzeProject(maxFiles = 200) {
305
+ const files = this.collectTemplateFiles(this.projectDir, maxFiles);
306
+ const allIssues = [];
307
+ for (const filePath of files) {
308
+ const issues = this.analyzeFile(filePath);
309
+ allIssues.push(...issues);
310
+ }
311
+ return allIssues.map(issue => this.issueToInsight(issue));
312
+ }
313
+ analyzeFile(filePath) {
314
+ let content;
315
+ try {
316
+ content = fs.readFileSync(filePath, 'utf-8');
317
+ }
318
+ catch {
319
+ return [];
320
+ }
321
+ const lines = content.split('\n');
322
+ const relPath = path.relative(this.projectDir, filePath);
323
+ const issues = [];
324
+ for (const rule of RULES) {
325
+ const ruleIssues = rule.check(content, lines, relPath);
326
+ issues.push(...ruleIssues);
327
+ }
328
+ return issues;
329
+ }
330
+ issueToInsight(issue) {
331
+ return {
332
+ type: 'a11y',
333
+ priority: issue.severity === 'critical' ? 'critical' :
334
+ issue.severity === 'serious' ? 'high' :
335
+ issue.severity === 'moderate' ? 'medium' : 'low',
336
+ title: `[a11y] ${issue.rule}: ${issue.message}`,
337
+ content: `WCAG ${issue.wcagLevel} (${issue.wcagCriterion}) violation in ${issue.file}:${issue.line}\n` +
338
+ ` Element: ${issue.element}\n` +
339
+ ` Severity: ${issue.severity}\n` +
340
+ ` Fix: ${issue.suggestion}`,
341
+ files: [issue.file],
342
+ timestamp: new Date(),
343
+ confidence: 0.9,
344
+ metadata: { rule: issue.rule, wcag: `${issue.wcagLevel} ${issue.wcagCriterion}` },
345
+ };
346
+ }
347
+ collectTemplateFiles(dir, maxFiles) {
348
+ const results = [];
349
+ const walk = (currentDir, depth) => {
350
+ if (results.length >= maxFiles || depth > 10)
351
+ return;
352
+ let entries;
353
+ try {
354
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
355
+ }
356
+ catch {
357
+ return;
358
+ }
359
+ for (const entry of entries) {
360
+ if (results.length >= maxFiles)
361
+ return;
362
+ if (entry.name.startsWith('.'))
363
+ continue;
364
+ const fullPath = path.join(currentDir, entry.name);
365
+ if (entry.isDirectory()) {
366
+ if (IGNORE_DIRS.has(entry.name))
367
+ continue;
368
+ walk(fullPath, depth + 1);
369
+ }
370
+ else if (entry.isFile() && TEMPLATE_EXTENSIONS.has(path.extname(entry.name))) {
371
+ results.push(fullPath);
372
+ }
373
+ }
374
+ };
375
+ walk(dir, 0);
376
+ return results;
377
+ }
378
+ }
379
+ //# sourceMappingURL=accessibility-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility-checker.js","sourceRoot":"","sources":["../../src/brain/accessibility-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { ADRDecision } from '../types.js';
2
+ export declare class ADREngine {
3
+ private projectDir;
4
+ private llmClient;
5
+ private adrDir;
6
+ constructor(projectDir: string, llmClient: any);
7
+ /**
8
+ * Load all ADR markdown files from the ADR directory.
9
+ * Returns parsed ADRDecision objects sorted by ID.
10
+ */
11
+ loadADRs(): Promise<ADRDecision[]>;
12
+ /**
13
+ * Write an ADR to the docs/adr/ directory in standard markdown format.
14
+ * Filename pattern: NNNN-kebab-case-title.md
15
+ */
16
+ saveADR(adr: ADRDecision): Promise<void>;
17
+ /**
18
+ * Analyse file changes to detect architectural decisions.
19
+ * Uses heuristic rules, and optionally an LLM client for deeper analysis.
20
+ */
21
+ detectDecisions(changes: Array<{
22
+ path: string;
23
+ diff?: string;
24
+ }>): Promise<ADRDecision[]>;
25
+ /**
26
+ * Format an ADRDecision as a standard ADR markdown document.
27
+ */
28
+ private formatADRMd;
29
+ /**
30
+ * Parse a markdown ADR file into an ADRDecision object.
31
+ */
32
+ private parseADR;
33
+ /**
34
+ * Get the next sequence number for ADR filenames.
35
+ */
36
+ private getNextNumber;
37
+ /**
38
+ * Heuristic: detect framework or core library changes.
39
+ */
40
+ private looksLikeFrameworkChange;
41
+ /**
42
+ * Heuristic: detect introduction of new architectural patterns.
43
+ */
44
+ private looksLikeNewPattern;
45
+ /**
46
+ * Heuristic: detect significant refactoring (large diffs with structural changes).
47
+ */
48
+ private looksLikeSignificantRefactor;
49
+ /**
50
+ * Use the LLM client to analyse diffs and detect architectural decisions.
51
+ */
52
+ private detectWithLLM;
53
+ /**
54
+ * Convert a title string to a kebab-case slug for filenames.
55
+ */
56
+ private slugify;
57
+ }
58
+ //# sourceMappingURL=adr-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr-engine.d.ts","sourceRoot":"","sources":["../../src/brain/adr-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;IAkB9C;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAyBxC;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C;;;OAGG;IACG,eAAe,CACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAC9C,OAAO,CAAC,WAAW,EAAE,CAAC;IA8EzB;;OAEG;IACH,OAAO,CAAC,WAAW;IA4BnB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAwEhB;;OAEG;YACW,aAAa;IAiB3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsChC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA+BpC;;OAEG;YACW,aAAa;IA2C3B;;OAEG;IACH,OAAO,CAAC,OAAO;CAShB"}