@theihtisham/agent-shadow-brain 4.0.3 → 5.0.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 (53) hide show
  1. package/README.md +515 -305
  2. package/dist/adapters/index.d.ts.map +1 -1
  3. package/dist/adapters/index.js +1 -0
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/brain/auto-setup.d.ts +54 -0
  6. package/dist/brain/auto-setup.d.ts.map +1 -0
  7. package/dist/brain/auto-setup.js +660 -0
  8. package/dist/brain/auto-setup.js.map +1 -0
  9. package/dist/brain/brain-portability.d.ts +81 -0
  10. package/dist/brain/brain-portability.d.ts.map +1 -0
  11. package/dist/brain/brain-portability.js +329 -0
  12. package/dist/brain/brain-portability.js.map +1 -0
  13. package/dist/brain/collective-learning.d.ts +54 -0
  14. package/dist/brain/collective-learning.d.ts.map +1 -0
  15. package/dist/brain/collective-learning.js +357 -0
  16. package/dist/brain/collective-learning.js.map +1 -0
  17. package/dist/brain/consensus-engine.d.ts +65 -0
  18. package/dist/brain/consensus-engine.d.ts.map +1 -0
  19. package/dist/brain/consensus-engine.js +385 -0
  20. package/dist/brain/consensus-engine.js.map +1 -0
  21. package/dist/brain/context-recall.d.ts +49 -0
  22. package/dist/brain/context-recall.d.ts.map +1 -0
  23. package/dist/brain/context-recall.js +502 -0
  24. package/dist/brain/context-recall.js.map +1 -0
  25. package/dist/brain/hierarchical-memory.d.ts +49 -0
  26. package/dist/brain/hierarchical-memory.d.ts.map +1 -0
  27. package/dist/brain/hierarchical-memory.js +451 -0
  28. package/dist/brain/hierarchical-memory.js.map +1 -0
  29. package/dist/brain/mcp-server.d.ts +12 -0
  30. package/dist/brain/mcp-server.d.ts.map +1 -1
  31. package/dist/brain/mcp-server.js +396 -37
  32. package/dist/brain/mcp-server.js.map +1 -1
  33. package/dist/brain/orchestrator.d.ts +34 -0
  34. package/dist/brain/orchestrator.d.ts.map +1 -1
  35. package/dist/brain/orchestrator.js +83 -1
  36. package/dist/brain/orchestrator.js.map +1 -1
  37. package/dist/brain/plugin-system.d.ts +97 -0
  38. package/dist/brain/plugin-system.d.ts.map +1 -0
  39. package/dist/brain/plugin-system.js +404 -0
  40. package/dist/brain/plugin-system.js.map +1 -0
  41. package/dist/cli.js +429 -3
  42. package/dist/cli.js.map +1 -1
  43. package/dist/dashboard/server.d.ts +4 -0
  44. package/dist/dashboard/server.d.ts.map +1 -1
  45. package/dist/dashboard/server.js +453 -330
  46. package/dist/dashboard/server.js.map +1 -1
  47. package/dist/index.d.ts +8 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +10 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/types.d.ts +201 -1
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +32 -4
@@ -0,0 +1,97 @@
1
+ import { PluginHook, PluginInstance, BrainInsight } from '../types.js';
2
+ type HookEvent = PluginHook['event'];
3
+ type HookContext = Record<string, unknown>;
4
+ interface HookResult {
5
+ insights?: BrainInsight[];
6
+ modified?: boolean;
7
+ data?: Record<string, unknown>;
8
+ error?: string;
9
+ }
10
+ /**
11
+ * PluginSystem — extensible plugin architecture.
12
+ *
13
+ * Supports:
14
+ * 1. Local plugins from project `shadow-brain-plugins/` directory
15
+ * 2. npm packages with `shadow-brain-plugin` keyword
16
+ * 3. Hookable analysis pipeline with priority ordering
17
+ * 4. Plugin isolation — errors in one plugin don't crash others
18
+ * 5. Hot-reload during development
19
+ */
20
+ export declare class PluginSystem {
21
+ private plugins;
22
+ private hooks;
23
+ private projectDir;
24
+ private pluginsDir;
25
+ constructor(projectDir?: string);
26
+ /**
27
+ * Discover and load all available plugins.
28
+ */
29
+ loadAll(): Promise<{
30
+ loaded: number;
31
+ errors: number;
32
+ }>;
33
+ /**
34
+ * Load a single plugin from its directory.
35
+ */
36
+ loadPlugin(pluginDir: string): Promise<boolean>;
37
+ /**
38
+ * Unload a plugin by name.
39
+ */
40
+ unloadPlugin(name: string): boolean;
41
+ /**
42
+ * Enable/disable a plugin.
43
+ */
44
+ setPluginEnabled(name: string, enabled: boolean): boolean;
45
+ /**
46
+ * Execute hooks for a given event, passing context to each handler.
47
+ */
48
+ executeHooks(event: HookEvent, context?: HookContext): Promise<HookResult[]>;
49
+ /**
50
+ * Execute pre-analysis hooks — can filter/modify files before analysis.
51
+ */
52
+ preAnalysis(context: {
53
+ files: string[];
54
+ projectDir: string;
55
+ }): Promise<{
56
+ files: string[];
57
+ extraInsights: BrainInsight[];
58
+ }>;
59
+ /**
60
+ * Execute post-analysis hooks — can modify/filter insights after analysis.
61
+ */
62
+ postAnalysis(context: {
63
+ insights: BrainInsight[];
64
+ healthScore: number;
65
+ }): Promise<{
66
+ insights: BrainInsight[];
67
+ }>;
68
+ /**
69
+ * Discover npm packages with the shadow-brain-plugin keyword.
70
+ */
71
+ private discoverNpmPlugins;
72
+ /**
73
+ * Execute a plugin handler function.
74
+ */
75
+ private executeHandler;
76
+ private getPluginDir;
77
+ getPlugins(): PluginInstance[];
78
+ getPlugin(name: string): PluginInstance | undefined;
79
+ getHooks(event?: HookEvent): Array<{
80
+ plugin: string;
81
+ hook: PluginHook;
82
+ }>;
83
+ getStats(): {
84
+ totalPlugins: number;
85
+ enabledPlugins: number;
86
+ disabledPlugins: number;
87
+ totalHooks: number;
88
+ hooksByEvent: Record<string, number>;
89
+ errors: number;
90
+ };
91
+ /**
92
+ * Create a template plugin in the project's plugins directory.
93
+ */
94
+ createTemplate(name: string): string;
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=plugin-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-system.d.ts","sourceRoot":"","sources":["../../src/brain/plugin-system.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AAKrB,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AACrC,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,KAAK,CAA0E;IACvF,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAO/B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B5D;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuDrD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgBnC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IASzD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA+BtF;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC3E,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,aAAa,EAAE,YAAY,EAAE,CAAC;KAC/B,CAAC;IAgBF;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QACtF,QAAQ,EAAE,YAAY,EAAE,CAAC;KAC1B,CAAC;IAsBF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsE1B;;OAEG;YACW,cAAc;IAgC5B,OAAO,CAAC,YAAY;IAcpB,UAAU,IAAI,cAAc,EAAE;IAI9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAInD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IASxE,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC;KAChB;IA4BD;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAqDrC"}
@@ -0,0 +1,404 @@
1
+ // src/brain/plugin-system.ts — Extensible Plugin Architecture
2
+ // Hookable analysis pipeline for third-party extensions
3
+ // v5.0.1 — Infinite Intelligence Edition
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ const PLUGINS_DIR_NAME = 'shadow-brain-plugins';
7
+ const NPM_PLUGIN_KEYWORD = 'shadow-brain-plugin';
8
+ /**
9
+ * PluginSystem — extensible plugin architecture.
10
+ *
11
+ * Supports:
12
+ * 1. Local plugins from project `shadow-brain-plugins/` directory
13
+ * 2. npm packages with `shadow-brain-plugin` keyword
14
+ * 3. Hookable analysis pipeline with priority ordering
15
+ * 4. Plugin isolation — errors in one plugin don't crash others
16
+ * 5. Hot-reload during development
17
+ */
18
+ export class PluginSystem {
19
+ constructor(projectDir) {
20
+ this.plugins = new Map();
21
+ this.hooks = new Map();
22
+ this.projectDir = projectDir || process.cwd();
23
+ this.pluginsDir = path.join(this.projectDir, PLUGINS_DIR_NAME);
24
+ }
25
+ // ── Plugin Management ──────────────────────────────────────────────────────
26
+ /**
27
+ * Discover and load all available plugins.
28
+ */
29
+ async loadAll() {
30
+ let loaded = 0;
31
+ let errors = 0;
32
+ // Load local plugins from project directory
33
+ if (fs.existsSync(this.pluginsDir)) {
34
+ const entries = fs.readdirSync(this.pluginsDir, { withFileTypes: true });
35
+ for (const entry of entries) {
36
+ if (!entry.isDirectory())
37
+ continue;
38
+ const pluginDir = path.join(this.pluginsDir, entry.name);
39
+ const result = await this.loadPlugin(pluginDir);
40
+ if (result)
41
+ loaded++;
42
+ else
43
+ errors++;
44
+ }
45
+ }
46
+ // Load npm plugins from node_modules
47
+ const npmPlugins = this.discoverNpmPlugins();
48
+ for (const npmPlugin of npmPlugins) {
49
+ const result = await this.loadPlugin(npmPlugin);
50
+ if (result)
51
+ loaded++;
52
+ else
53
+ errors++;
54
+ }
55
+ return { loaded, errors };
56
+ }
57
+ /**
58
+ * Load a single plugin from its directory.
59
+ */
60
+ async loadPlugin(pluginDir) {
61
+ try {
62
+ const manifestPath = path.join(pluginDir, 'manifest.json');
63
+ if (!fs.existsSync(manifestPath))
64
+ return false;
65
+ const manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
66
+ const manifest = {
67
+ name: manifestData.name,
68
+ version: manifestData.version || '1.0.0',
69
+ description: manifestData.description || '',
70
+ author: manifestData.author || 'unknown',
71
+ main: manifestData.main || 'index.js',
72
+ hooks: (manifestData.hooks || []).map((h) => ({
73
+ event: h.event,
74
+ handler: h.handler,
75
+ priority: h.priority || 50,
76
+ })),
77
+ dependencies: manifestData.dependencies || [],
78
+ };
79
+ if (!manifest.name || manifest.hooks.length === 0)
80
+ return false;
81
+ // Validate handler files exist
82
+ for (const hook of manifest.hooks) {
83
+ const handlerPath = path.join(pluginDir, hook.handler);
84
+ if (!fs.existsSync(handlerPath)) {
85
+ return false;
86
+ }
87
+ }
88
+ // Register plugin
89
+ const instance = {
90
+ manifest,
91
+ enabled: true,
92
+ loadedAt: new Date(),
93
+ errorCount: 0,
94
+ };
95
+ this.plugins.set(manifest.name, instance);
96
+ // Register hooks
97
+ for (const hook of manifest.hooks) {
98
+ const hookEntry = { plugin: manifest.name, hook };
99
+ const existing = this.hooks.get(hook.event) || [];
100
+ existing.push(hookEntry);
101
+ existing.sort((a, b) => (a.hook.priority ?? 50) - (b.hook.priority ?? 50));
102
+ this.hooks.set(hook.event, existing);
103
+ }
104
+ return true;
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ }
110
+ /**
111
+ * Unload a plugin by name.
112
+ */
113
+ unloadPlugin(name) {
114
+ const plugin = this.plugins.get(name);
115
+ if (!plugin)
116
+ return false;
117
+ // Remove hooks
118
+ for (const [event, hookList] of this.hooks.entries()) {
119
+ this.hooks.set(event, hookList.filter(h => h.plugin !== name));
120
+ }
121
+ this.plugins.delete(name);
122
+ return true;
123
+ }
124
+ /**
125
+ * Enable/disable a plugin.
126
+ */
127
+ setPluginEnabled(name, enabled) {
128
+ const plugin = this.plugins.get(name);
129
+ if (!plugin)
130
+ return false;
131
+ plugin.enabled = enabled;
132
+ return true;
133
+ }
134
+ // ── Hook Execution ─────────────────────────────────────────────────────────
135
+ /**
136
+ * Execute hooks for a given event, passing context to each handler.
137
+ */
138
+ async executeHooks(event, context = {}) {
139
+ const hookList = this.hooks.get(event) || [];
140
+ const results = [];
141
+ for (const { plugin: pluginName, hook } of hookList) {
142
+ const plugin = this.plugins.get(pluginName);
143
+ if (!plugin || !plugin.enabled)
144
+ continue;
145
+ try {
146
+ const result = await this.executeHandler(plugin, hook, context);
147
+ results.push(result);
148
+ // If handler modified context, pass updated context to next hook
149
+ if (result.modified && result.data) {
150
+ Object.assign(context, result.data);
151
+ }
152
+ }
153
+ catch (err) {
154
+ plugin.errorCount++;
155
+ plugin.lastError = err instanceof Error ? err.message : String(err);
156
+ results.push({ error: plugin.lastError });
157
+ // Disable plugin after 5 consecutive errors
158
+ if (plugin.errorCount >= 5) {
159
+ plugin.enabled = false;
160
+ }
161
+ }
162
+ }
163
+ return results;
164
+ }
165
+ /**
166
+ * Execute pre-analysis hooks — can filter/modify files before analysis.
167
+ */
168
+ async preAnalysis(context) {
169
+ const results = await this.executeHooks('pre-analysis', context);
170
+ let files = context.files;
171
+ const extraInsights = [];
172
+ for (const result of results) {
173
+ if (result.insights)
174
+ extraInsights.push(...result.insights);
175
+ if (result.data?.files && Array.isArray(result.data.files)) {
176
+ files = result.data.files;
177
+ }
178
+ }
179
+ return { files, extraInsights };
180
+ }
181
+ /**
182
+ * Execute post-analysis hooks — can modify/filter insights after analysis.
183
+ */
184
+ async postAnalysis(context) {
185
+ const results = await this.executeHooks('post-analysis', context);
186
+ let insights = context.insights;
187
+ for (const result of results) {
188
+ if (result.insights) {
189
+ insights = [...insights, ...result.insights];
190
+ }
191
+ if (result.data?.filteredInsights && Array.isArray(result.data.filteredInsights)) {
192
+ const filteredTitles = new Set(result.data.filteredInsights.map(i => i.title));
193
+ insights = insights.filter(i => !filteredTitles.has(i.title));
194
+ }
195
+ }
196
+ return { insights };
197
+ }
198
+ // ── Plugin Discovery ───────────────────────────────────────────────────────
199
+ /**
200
+ * Discover npm packages with the shadow-brain-plugin keyword.
201
+ */
202
+ discoverNpmPlugins() {
203
+ const plugins = [];
204
+ const nodeModules = path.join(this.projectDir, 'node_modules');
205
+ if (!fs.existsSync(nodeModules))
206
+ return plugins;
207
+ try {
208
+ // Check top-level packages
209
+ const packages = fs.readdirSync(nodeModules, { withFileTypes: true });
210
+ for (const pkg of packages) {
211
+ if (!pkg.isDirectory())
212
+ continue;
213
+ if (pkg.name.startsWith('.'))
214
+ continue;
215
+ const pkgPath = path.join(nodeModules, pkg.name);
216
+ const manifestPath = path.join(pkgPath, 'manifest.json');
217
+ const pkgJsonPath = path.join(pkgPath, 'package.json');
218
+ // Check if it's a shadow-brain plugin
219
+ if (fs.existsSync(manifestPath)) {
220
+ plugins.push(pkgPath);
221
+ continue;
222
+ }
223
+ // Check package.json for keyword
224
+ if (fs.existsSync(pkgJsonPath)) {
225
+ try {
226
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
227
+ if (Array.isArray(pkgJson.keywords) && pkgJson.keywords.includes(NPM_PLUGIN_KEYWORD)) {
228
+ plugins.push(pkgPath);
229
+ }
230
+ }
231
+ catch {
232
+ // Skip
233
+ }
234
+ }
235
+ }
236
+ // Check scoped packages
237
+ const scopedDirs = packages.filter(p => p.isDirectory() && p.name.startsWith('@'));
238
+ for (const scoped of scopedDirs) {
239
+ const scopedPath = path.join(nodeModules, scoped.name);
240
+ try {
241
+ const subPackages = fs.readdirSync(scopedPath, { withFileTypes: true });
242
+ for (const sub of subPackages) {
243
+ if (!sub.isDirectory())
244
+ continue;
245
+ const pkgJsonPath = path.join(scopedPath, sub.name, 'package.json');
246
+ const manifestPath = path.join(scopedPath, sub.name, 'manifest.json');
247
+ if (fs.existsSync(manifestPath)) {
248
+ plugins.push(path.join(scopedPath, sub.name));
249
+ }
250
+ else if (fs.existsSync(pkgJsonPath)) {
251
+ try {
252
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
253
+ if (Array.isArray(pkgJson.keywords) && pkgJson.keywords.includes(NPM_PLUGIN_KEYWORD)) {
254
+ plugins.push(path.join(scopedPath, sub.name));
255
+ }
256
+ }
257
+ catch {
258
+ // Skip
259
+ }
260
+ }
261
+ }
262
+ }
263
+ catch {
264
+ // Permission denied
265
+ }
266
+ }
267
+ }
268
+ catch {
269
+ // node_modules not accessible
270
+ }
271
+ return plugins;
272
+ }
273
+ /**
274
+ * Execute a plugin handler function.
275
+ */
276
+ async executeHandler(plugin, hook, context) {
277
+ const pluginDir = this.getPluginDir(plugin.manifest.name);
278
+ const handlerPath = path.join(pluginDir, hook.handler);
279
+ if (!fs.existsSync(handlerPath)) {
280
+ return { error: `Handler not found: ${hook.handler}` };
281
+ }
282
+ // Dynamic import of handler module
283
+ try {
284
+ const module = await import(`file://${handlerPath.replace(/\\/g, '/')}`);
285
+ const handler = module.default || module.handler || module[Object.keys(module)[0]];
286
+ if (typeof handler === 'function') {
287
+ const result = await handler(context);
288
+ return {
289
+ insights: result?.insights || [],
290
+ modified: result?.modified || false,
291
+ data: result?.data || {},
292
+ };
293
+ }
294
+ return { error: `No valid handler function in ${hook.handler}` };
295
+ }
296
+ catch (err) {
297
+ return { error: err instanceof Error ? err.message : String(err) };
298
+ }
299
+ }
300
+ getPluginDir(pluginName) {
301
+ // Check local plugins first
302
+ const localDir = path.join(this.pluginsDir, pluginName);
303
+ if (fs.existsSync(localDir))
304
+ return localDir;
305
+ // Check node_modules
306
+ const nodeModulesDir = path.join(this.projectDir, 'node_modules', pluginName);
307
+ if (fs.existsSync(nodeModulesDir))
308
+ return nodeModulesDir;
309
+ return localDir;
310
+ }
311
+ // ── Query & Stats ──────────────────────────────────────────────────────────
312
+ getPlugins() {
313
+ return Array.from(this.plugins.values());
314
+ }
315
+ getPlugin(name) {
316
+ return this.plugins.get(name);
317
+ }
318
+ getHooks(event) {
319
+ if (event)
320
+ return this.hooks.get(event) || [];
321
+ const all = [];
322
+ for (const [, hooks] of this.hooks) {
323
+ all.push(...hooks);
324
+ }
325
+ return all;
326
+ }
327
+ getStats() {
328
+ let enabled = 0;
329
+ let disabled = 0;
330
+ let errors = 0;
331
+ let totalHooks = 0;
332
+ const hooksByEvent = {};
333
+ for (const plugin of this.plugins.values()) {
334
+ if (plugin.enabled)
335
+ enabled++;
336
+ else
337
+ disabled++;
338
+ if (plugin.errorCount > 0)
339
+ errors++;
340
+ }
341
+ for (const [event, hooks] of this.hooks) {
342
+ hooksByEvent[event] = hooks.length;
343
+ totalHooks += hooks.length;
344
+ }
345
+ return {
346
+ totalPlugins: this.plugins.size,
347
+ enabledPlugins: enabled,
348
+ disabledPlugins: disabled,
349
+ totalHooks,
350
+ hooksByEvent,
351
+ errors,
352
+ };
353
+ }
354
+ /**
355
+ * Create a template plugin in the project's plugins directory.
356
+ */
357
+ createTemplate(name) {
358
+ const pluginDir = path.join(this.pluginsDir, name);
359
+ if (fs.existsSync(pluginDir)) {
360
+ throw new Error(`Plugin "${name}" already exists`);
361
+ }
362
+ fs.mkdirSync(pluginDir, { recursive: true });
363
+ // manifest.json
364
+ const manifest = {
365
+ name,
366
+ version: '1.0.0',
367
+ description: `Shadow Brain plugin: ${name}`,
368
+ author: 'anonymous',
369
+ main: 'index.js',
370
+ hooks: [
371
+ { event: 'post-analysis', handler: 'index.js', priority: 50 },
372
+ ],
373
+ };
374
+ fs.writeFileSync(path.join(pluginDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
375
+ // index.js template
376
+ const handlerCode = `// Shadow Brain Plugin: ${name}
377
+ // Hook: post-analysis
378
+ // Modify the context to add custom insights or filter existing ones
379
+
380
+ export default async function handler(context) {
381
+ const { insights, healthScore } = context;
382
+
383
+ // Example: Add a custom insight
384
+ const customInsight = {
385
+ priority: 'info',
386
+ type: 'custom',
387
+ title: '${name} plugin active',
388
+ content: 'This is a custom insight from the ${name} plugin.',
389
+ file: '',
390
+ line: 0,
391
+ };
392
+
393
+ return {
394
+ insights: [customInsight],
395
+ modified: true,
396
+ data: {},
397
+ };
398
+ }
399
+ `;
400
+ fs.writeFileSync(path.join(pluginDir, 'index.js'), handlerCode);
401
+ return pluginDir;
402
+ }
403
+ }
404
+ //# sourceMappingURL=plugin-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-system.js","sourceRoot":"","sources":["../../src/brain/plugin-system.ts"],"names":[],"mappings":"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"}