@theihtisham/agent-shadow-brain 1.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/adapters/base-adapter.d.ts +18 -0
  4. package/dist/adapters/base-adapter.d.ts.map +1 -0
  5. package/dist/adapters/base-adapter.js +110 -0
  6. package/dist/adapters/base-adapter.js.map +1 -0
  7. package/dist/adapters/claude-code.d.ts +14 -0
  8. package/dist/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/adapters/claude-code.js +125 -0
  10. package/dist/adapters/claude-code.js.map +1 -0
  11. package/dist/adapters/cline.d.ts +13 -0
  12. package/dist/adapters/cline.d.ts.map +1 -0
  13. package/dist/adapters/cline.js +119 -0
  14. package/dist/adapters/cline.js.map +1 -0
  15. package/dist/adapters/codex.d.ts +12 -0
  16. package/dist/adapters/codex.d.ts.map +1 -0
  17. package/dist/adapters/codex.js +65 -0
  18. package/dist/adapters/codex.js.map +1 -0
  19. package/dist/adapters/index.d.ts +11 -0
  20. package/dist/adapters/index.d.ts.map +1 -0
  21. package/dist/adapters/index.js +38 -0
  22. package/dist/adapters/index.js.map +1 -0
  23. package/dist/adapters/kilo-code.d.ts +12 -0
  24. package/dist/adapters/kilo-code.d.ts.map +1 -0
  25. package/dist/adapters/kilo-code.js +94 -0
  26. package/dist/adapters/kilo-code.js.map +1 -0
  27. package/dist/adapters/opencode.d.ts +12 -0
  28. package/dist/adapters/opencode.d.ts.map +1 -0
  29. package/dist/adapters/opencode.js +100 -0
  30. package/dist/adapters/opencode.js.map +1 -0
  31. package/dist/brain/analyzer.d.ts +23 -0
  32. package/dist/brain/analyzer.d.ts.map +1 -0
  33. package/dist/brain/analyzer.js +218 -0
  34. package/dist/brain/analyzer.js.map +1 -0
  35. package/dist/brain/llm-client.d.ts +30 -0
  36. package/dist/brain/llm-client.d.ts.map +1 -0
  37. package/dist/brain/llm-client.js +240 -0
  38. package/dist/brain/llm-client.js.map +1 -0
  39. package/dist/brain/orchestrator.d.ts +41 -0
  40. package/dist/brain/orchestrator.d.ts.map +1 -0
  41. package/dist/brain/orchestrator.js +289 -0
  42. package/dist/brain/orchestrator.js.map +1 -0
  43. package/dist/brain/project-context.d.ts +15 -0
  44. package/dist/brain/project-context.d.ts.map +1 -0
  45. package/dist/brain/project-context.js +225 -0
  46. package/dist/brain/project-context.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +254 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/index.d.ts +16 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +18 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/types.d.ts +87 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/ui/dashboard.d.ts +3 -0
  60. package/dist/ui/dashboard.d.ts.map +1 -0
  61. package/dist/ui/dashboard.js +110 -0
  62. package/dist/ui/dashboard.js.map +1 -0
  63. package/dist/watchers/file-watcher.d.ts +18 -0
  64. package/dist/watchers/file-watcher.d.ts.map +1 -0
  65. package/dist/watchers/file-watcher.js +132 -0
  66. package/dist/watchers/file-watcher.js.map +1 -0
  67. package/dist/watchers/git-watcher.d.ts +31 -0
  68. package/dist/watchers/git-watcher.d.ts.map +1 -0
  69. package/dist/watchers/git-watcher.js +93 -0
  70. package/dist/watchers/git-watcher.js.map +1 -0
  71. package/package.json +77 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 theihtisham
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,166 @@
1
+ # Agent Shadow Brain
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@theihtisham/agent-shadow-brain.svg)](https://www.npmjs.com/package/@theihtisham/agent-shadow-brain)
4
+ [![license](https://img.shields.io/npm/l/@theihtisham/agent-shadow-brain.svg)](https://github.com/theihtisham/agent-shadow-brain/blob/main/LICENSE)
5
+ [![node](https://img.shields.io/node/v/@theihtisham/agent-shadow-brain.svg)](https://www.npmjs.com/package/@theihtisham/agent-shadow-brain)
6
+
7
+ A shadow AI brain that runs alongside your coding agent — watching, reviewing, and injecting intelligence in real-time.
8
+
9
+ Works with **Claude Code**, **Kilo Code**, **Cline**, **OpenCode**, **Codex CLI**, and more.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install -g @theihtisham/agent-shadow-brain
15
+ ```
16
+
17
+ Or use directly:
18
+
19
+ ```bash
20
+ npx @theihtisham/agent-shadow-brain start .
21
+ ```
22
+
23
+ ## CLI Reference
24
+
25
+ ### `shadow-brain start [project-dir]`
26
+
27
+ Start watching a project in real-time with a live terminal dashboard.
28
+
29
+ ```bash
30
+ shadow-brain start . # Watch current directory
31
+ shadow-brain start . -p anthropic -k $API_KEY # Use Anthropic as LLM
32
+ shadow-brain start . --personality security # Security-focused reviews
33
+ shadow-brain start . --depth deep # Deep analysis
34
+ shadow-brain start . --agents claude-code,codex # Watch specific agents
35
+ ```
36
+
37
+ Options:
38
+ - `-p, --provider <provider>` — LLM provider: `anthropic`, `openai`, `ollama`, `openrouter`
39
+ - `-m, --model <model>` — LLM model name
40
+ - `-k, --api-key <key>` — API key
41
+ - `--personality <type>` — Brain personality (see below)
42
+ - `--depth <depth>` — Review depth: `quick`, `standard`, `deep`
43
+ - `--agents <agents>` — Comma-separated agent list
44
+ - `--no-inject` — Disable auto-injection of insights
45
+
46
+ ### `shadow-brain review [project-dir]`
47
+
48
+ One-shot project analysis without watch mode.
49
+
50
+ ```bash
51
+ shadow-brain review . # Text output
52
+ shadow-brain review . --output json # JSON output
53
+ shadow-brain review . --output markdown # Markdown output
54
+ shadow-brain review . --depth deep # Thorough analysis
55
+ ```
56
+
57
+ ### `shadow-brain inject <message>`
58
+
59
+ Manually inject a message into agent memory.
60
+
61
+ ```bash
62
+ shadow-brain inject "Always use TypeScript strict mode"
63
+ shadow-brain inject "Check for SQL injection" --type warning --priority high
64
+ shadow-brain inject "Follow REST conventions" --agent claude-code
65
+ ```
66
+
67
+ ### `shadow-brain status`
68
+
69
+ Show current configuration and detected agents.
70
+
71
+ ### `shadow-brain config`
72
+
73
+ Manage persistent configuration.
74
+
75
+ ```bash
76
+ shadow-brain config --list
77
+ shadow-brain config provider openai
78
+ shadow-brain config apiKey sk-xxx
79
+ shadow-brain config personality architect
80
+ shadow-brain config --reset
81
+ ```
82
+
83
+ ## Supported Agents
84
+
85
+ | Agent | Detection | Injection Target |
86
+ |-------|-----------|-----------------|
87
+ | **Claude Code** | `.claude/` directory, process | `.claude/memory/`, `.claude/rules/` |
88
+ | **Kilo Code** | VS Code extension data, `.kilocode/` | `.kilocode/rules/`, `.kilocode/memory/` |
89
+ | **Cline** | VS Code extension data, `.clinerules` | `.clinerules`, `.cline/memory/` |
90
+ | **OpenCode** | `.opencode/`, `opencode.json`, process | `.opencode/rules/`, `AGENTS.md` |
91
+ | **Codex CLI** | `.codex/`, `AGENTS.md`, process | `AGENTS.md` |
92
+
93
+ ## Brain Personalities
94
+
95
+ | Personality | Focus |
96
+ |------------|-------|
97
+ | `mentor` | Teaches and explains — focuses on code quality and best practices |
98
+ | `critic` | Thorough code reviews — catches bugs, logic errors, edge cases |
99
+ | `architect` | Big-picture thinking — modularity, scalability, design patterns |
100
+ | `security` | Paranoid about vulnerabilities — OWASP top 10, attack vectors |
101
+ | `performance` | Optimization focused — N+1 queries, memory leaks, bundle size |
102
+ | `balanced` | Mix of all perspectives (default) |
103
+
104
+ ## How It Works
105
+
106
+ ```
107
+ ┌─────────────────────────────────────────────────┐
108
+ │ Shadow Brain │
109
+ │ │
110
+ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
111
+ │ │ File │ │ Git │ │ Agent │ │
112
+ │ │ Watcher │ │ Watcher │ │ Adapters │ │
113
+ │ └────┬─────┘ └────┬─────┘ └──────┬────────┘ │
114
+ │ │ │ │ │
115
+ │ └──────┬───────┘ │ │
116
+ │ ▼ │ │
117
+ │ ┌──────────────┐ │ │
118
+ │ │ Orchestrator │ │ │
119
+ │ │ (debounce) │ │ │
120
+ │ └──────┬───────┘ │ │
121
+ │ ▼ │ │
122
+ │ ┌──────────────┐ │ │
123
+ │ │ Analyzer │ │ │
124
+ │ │ (LLM + rules)│ │ │
125
+ │ └──────┬───────┘ │ │
126
+ │ │ Insights │ │
127
+ │ └──────────────────────┘ │
128
+ │ ▼ │
129
+ │ Inject into agent memory │
130
+ └─────────────────────────────────────────────────┘
131
+ ```
132
+
133
+ Shadow Brain watches your project files and git activity, reads what your coding agent is doing, and uses an LLM (with rule-based fallback) to generate insights. It then injects those insights directly into the agent's memory files so the agent picks them up automatically.
134
+
135
+ ## LLM Providers
136
+
137
+ - **Ollama** (default, free) — runs locally, no API key needed
138
+ - **Anthropic** — Claude models via API
139
+ - **OpenAI** — GPT-4o via API
140
+ - **OpenRouter** — Access to many models through one API
141
+
142
+ ## Programmatic API
143
+
144
+ ```typescript
145
+ import { Orchestrator, createAdapter, LLMClient } from '@theihtisham/agent-shadow-brain';
146
+
147
+ const orchestrator = new Orchestrator({
148
+ provider: 'ollama',
149
+ projectDir: '/path/to/project',
150
+ agents: ['claude-code'],
151
+ watchMode: true,
152
+ autoInject: true,
153
+ reviewDepth: 'standard',
154
+ brainPersonality: 'balanced',
155
+ });
156
+
157
+ orchestrator.on('insights', ({ insights }) => {
158
+ console.log('Generated insights:', insights);
159
+ });
160
+
161
+ await orchestrator.start();
162
+ ```
163
+
164
+ ## License
165
+
166
+ MIT
@@ -0,0 +1,18 @@
1
+ import { AgentAdapter, AgentMemory, AgentActivity, AgentPaths, AgentTool, BrainInsight } from '../types.js';
2
+ export declare abstract class BaseAdapter implements AgentAdapter {
3
+ abstract name: AgentTool;
4
+ abstract displayName: string;
5
+ protected projectDir: string;
6
+ abstract detect(): Promise<boolean>;
7
+ abstract getConfigPaths(): AgentPaths;
8
+ abstract readActivity(): Promise<AgentActivity[]>;
9
+ getProjectDir(): Promise<string | null>;
10
+ setProjectDir(dir: string): void;
11
+ readMemory(): Promise<AgentMemory>;
12
+ injectContext(insight: BrainInsight): Promise<boolean>;
13
+ protected formatInsight(insight: BrainInsight): string;
14
+ protected appendToBrainFile(existing: string, insight: BrainInsight): string;
15
+ protected fileExists(filePath: string): boolean;
16
+ protected readFile(filePath: string): string | null;
17
+ }
18
+ //# sourceMappingURL=base-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/base-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5G,8BAAsB,WAAY,YAAW,YAAY;IACvD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAM;IAElC,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,IAAI,UAAU;IACrC,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAE3C,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1B,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAkClC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB5D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAoBtD,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM;IAmB5E,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI/C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAOpD"}
@@ -0,0 +1,110 @@
1
+ // src/adapters/base-adapter.ts — Base class for all agent adapters
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ export class BaseAdapter {
5
+ constructor() {
6
+ this.projectDir = '';
7
+ }
8
+ async getProjectDir() {
9
+ return this.projectDir || null;
10
+ }
11
+ setProjectDir(dir) {
12
+ this.projectDir = dir;
13
+ }
14
+ async readMemory() {
15
+ const paths = this.getConfigPaths();
16
+ const memory = {
17
+ rules: [],
18
+ context: [],
19
+ recentFiles: [],
20
+ projectKnowledge: {},
21
+ };
22
+ // Read rules/instructions files
23
+ if (fs.existsSync(paths.rulesDir)) {
24
+ const files = fs.readdirSync(paths.rulesDir).filter(f => f.endsWith('.md'));
25
+ for (const file of files) {
26
+ try {
27
+ const content = fs.readFileSync(path.join(paths.rulesDir, file), 'utf-8');
28
+ memory.rules.push(content);
29
+ }
30
+ catch { /* skip */ }
31
+ }
32
+ }
33
+ // Read memory files
34
+ if (fs.existsSync(paths.memoryDir)) {
35
+ const files = fs.readdirSync(paths.memoryDir).filter(f => f.endsWith('.md') || f.endsWith('.json'));
36
+ for (const file of files) {
37
+ try {
38
+ const content = fs.readFileSync(path.join(paths.memoryDir, file), 'utf-8');
39
+ memory.projectKnowledge[file] = content;
40
+ }
41
+ catch { /* skip */ }
42
+ }
43
+ }
44
+ return memory;
45
+ }
46
+ async injectContext(insight) {
47
+ const paths = this.getConfigPaths();
48
+ const injectionDir = path.join(paths.memoryDir, 'shadow-brain');
49
+ try {
50
+ fs.mkdirSync(injectionDir, { recursive: true });
51
+ const filename = `${insight.priority}-${insight.type}-${Date.now()}.md`;
52
+ const content = this.formatInsight(insight);
53
+ fs.writeFileSync(path.join(injectionDir, filename), content, 'utf-8');
54
+ // Also update the main brain file
55
+ const brainFile = path.join(injectionDir, 'BRAIN.md');
56
+ const existing = fs.existsSync(brainFile) ? fs.readFileSync(brainFile, 'utf-8') : '';
57
+ const updated = this.appendToBrainFile(existing, insight);
58
+ fs.writeFileSync(brainFile, updated, 'utf-8');
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ formatInsight(insight) {
66
+ const priorityEmoji = {
67
+ critical: '🚨',
68
+ high: '⚠️',
69
+ medium: '💡',
70
+ low: 'ℹ️',
71
+ };
72
+ return `# ${priorityEmoji[insight.priority]} ${insight.title}
73
+
74
+ **Type:** ${insight.type} | **Priority:** ${insight.priority}
75
+ **Time:** ${insight.timestamp.toISOString()}
76
+ ${insight.files?.length ? `**Files:** ${insight.files.join(', ')}` : ''}
77
+
78
+ ---
79
+
80
+ ${insight.content}
81
+ `;
82
+ }
83
+ appendToBrainFile(existing, insight) {
84
+ const header = existing
85
+ ? existing.split('\n---\n')[0] + '\n'
86
+ : `# 🧠 Shadow Brain Insights\n\n_Auto-generated by agent-shadow-brain. These are real-time reviews and suggestions._\n\n`;
87
+ // Keep last 20 insights max
88
+ const sections = existing.split('\n---\n').filter(s => s.trim());
89
+ const insights = sections.slice(1).slice(-19); // keep 19 + new one = 20
90
+ const newEntry = `
91
+ ## ${insight.priority === 'critical' ? '🚨' : insight.priority === 'high' ? '⚠️' : '💡'} [${insight.type.toUpperCase()}] ${insight.title}
92
+ _${insight.timestamp.toISOString()}_
93
+
94
+ ${insight.content}
95
+ ${insight.files?.length ? `\nFiles: \`${insight.files.join('`, `')}\`` : ''}`;
96
+ return header + '\n---\n' + [...insights, newEntry].join('\n---\n') + '\n';
97
+ }
98
+ fileExists(filePath) {
99
+ return fs.existsSync(filePath);
100
+ }
101
+ readFile(filePath) {
102
+ try {
103
+ return fs.readFileSync(filePath, 'utf-8');
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=base-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../../src/adapters/base-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BaseAdapter } from './base-adapter.js';
2
+ import { AgentTool, AgentPaths, AgentActivity, BrainInsight } from '../types.js';
3
+ export declare class ClaudeCodeAdapter extends BaseAdapter {
4
+ name: AgentTool;
5
+ displayName: string;
6
+ private getGlobalDir;
7
+ private getProjectClaudeDir;
8
+ detect(): Promise<boolean>;
9
+ getConfigPaths(): AgentPaths;
10
+ readActivity(): Promise<AgentActivity[]>;
11
+ injectContext(insight: BrainInsight): Promise<boolean>;
12
+ private mapToolToActivityType;
13
+ }
14
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjF,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,IAAI,EAAE,SAAS,CAAiB;IAChC,WAAW,SAAiB;IAE5B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,mBAAmB;IAIrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBhC,cAAc,IAAI,UAAU;IAStB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAkDxC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB5D,OAAO,CAAC,qBAAqB;CAO9B"}
@@ -0,0 +1,125 @@
1
+ // src/adapters/claude-code.ts — Adapter for Claude Code (Anthropic)
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { execSync } from 'child_process';
6
+ import { BaseAdapter } from './base-adapter.js';
7
+ export class ClaudeCodeAdapter extends BaseAdapter {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.name = 'claude-code';
11
+ this.displayName = 'Claude Code';
12
+ }
13
+ getGlobalDir() {
14
+ return path.join(os.homedir(), '.claude');
15
+ }
16
+ getProjectClaudeDir() {
17
+ return path.join(this.projectDir, '.claude');
18
+ }
19
+ async detect() {
20
+ // Check if Claude Code global config exists
21
+ const globalDir = this.getGlobalDir();
22
+ if (!fs.existsSync(globalDir))
23
+ return false;
24
+ // Check if a claude process is running
25
+ try {
26
+ const result = execSync('tasklist /FI "IMAGENAME eq claude.exe" /NH 2>NUL || ps aux | grep -i claude 2>/dev/null', {
27
+ encoding: 'utf-8',
28
+ timeout: 3000,
29
+ });
30
+ return result.toLowerCase().includes('claude');
31
+ }
32
+ catch {
33
+ // Fallback: check if .claude dir exists
34
+ return fs.existsSync(globalDir);
35
+ }
36
+ }
37
+ getConfigPaths() {
38
+ return {
39
+ memoryDir: path.join(this.getProjectClaudeDir(), 'memory'),
40
+ rulesDir: path.join(this.getProjectClaudeDir(), 'rules'),
41
+ conversationDir: path.join(this.getProjectClaudeDir(), 'projects'),
42
+ configFile: path.join(this.getProjectClaudeDir(), 'settings.json'),
43
+ };
44
+ }
45
+ async readActivity() {
46
+ const activities = [];
47
+ // Read from conversation JSONL files
48
+ const projectsDir = path.join(this.getGlobalDir(), 'projects');
49
+ if (!fs.existsSync(projectsDir))
50
+ return activities;
51
+ try {
52
+ // Find project-specific conversation dirs
53
+ const dirs = fs.readdirSync(projectsDir, { recursive: true });
54
+ const jsonlFiles = dirs
55
+ .filter((f) => f.endsWith('.jsonl'))
56
+ .map((f) => path.join(projectsDir, f));
57
+ // Read last JSONL file (most recent conversation)
58
+ const sorted = jsonlFiles
59
+ .filter((f) => fs.existsSync(f))
60
+ .sort((a, b) => {
61
+ try {
62
+ return fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs;
63
+ }
64
+ catch {
65
+ return 0;
66
+ }
67
+ });
68
+ if (sorted.length > 0) {
69
+ const content = fs.readFileSync(sorted[0], 'utf-8');
70
+ const lines = content.trim().split('\n').slice(-50); // last 50 entries
71
+ for (const line of lines) {
72
+ try {
73
+ const entry = JSON.parse(line);
74
+ if (entry.type === 'assistant' && entry.message?.content) {
75
+ for (const block of entry.message.content) {
76
+ if (block.type === 'tool_use') {
77
+ activities.push({
78
+ timestamp: new Date(entry.timestamp || Date.now()),
79
+ type: this.mapToolToActivityType(block.name),
80
+ detail: `${block.name}: ${JSON.stringify(block.input).slice(0, 200)}`,
81
+ file: block.input?.file_path || block.input?.path,
82
+ });
83
+ }
84
+ }
85
+ }
86
+ }
87
+ catch { /* skip malformed lines */ }
88
+ }
89
+ }
90
+ }
91
+ catch { /* permission errors */ }
92
+ return activities;
93
+ }
94
+ async injectContext(insight) {
95
+ // Claude Code specific: inject into .claude/memory/ and CLAUDE.md
96
+ const memoryDir = path.join(this.getProjectClaudeDir(), 'memory');
97
+ fs.mkdirSync(memoryDir, { recursive: true });
98
+ // Write brain insights file that Claude Code will pick up
99
+ const brainFile = path.join(memoryDir, 'SHADOW_BRAIN.md');
100
+ const existing = this.readFile(brainFile) || '';
101
+ const updated = this.appendToBrainFile(existing, insight);
102
+ fs.writeFileSync(brainFile, updated, 'utf-8');
103
+ // Also inject into rules if critical
104
+ if (insight.priority === 'critical') {
105
+ const rulesDir = path.join(this.getProjectClaudeDir(), 'rules');
106
+ fs.mkdirSync(rulesDir, { recursive: true });
107
+ const ruleFile = path.join(rulesDir, 'shadow-brain-alerts.md');
108
+ const ruleContent = `# Shadow Brain Critical Alerts\n\n${insight.content}\n`;
109
+ fs.writeFileSync(ruleFile, ruleContent, 'utf-8');
110
+ }
111
+ return true;
112
+ }
113
+ mapToolToActivityType(toolName) {
114
+ if (toolName.includes('Edit') || toolName.includes('Write'))
115
+ return 'file_edit';
116
+ if (toolName.includes('Read') || toolName.includes('Glob') || toolName.includes('Grep'))
117
+ return 'file_read';
118
+ if (toolName.includes('Bash'))
119
+ return 'command';
120
+ if (toolName.includes('Agent') || toolName.includes('Ask'))
121
+ return 'conversation';
122
+ return 'search';
123
+ }
124
+ }
125
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { BaseAdapter } from './base-adapter.js';
2
+ import { AgentTool, AgentPaths, AgentActivity, BrainInsight } from '../types.js';
3
+ export declare class ClineAdapter extends BaseAdapter {
4
+ name: AgentTool;
5
+ displayName: string;
6
+ private getGlobalDir;
7
+ detect(): Promise<boolean>;
8
+ getConfigPaths(): AgentPaths;
9
+ readActivity(): Promise<AgentActivity[]>;
10
+ injectContext(insight: BrainInsight): Promise<boolean>;
11
+ private mapTool;
12
+ }
13
+ //# sourceMappingURL=cline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../src/adapters/cline.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjF,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,EAAE,SAAS,CAAW;IAC1B,WAAW,SAAW;IAEtB,OAAO,CAAC,YAAY;IAUd,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAOhC,cAAc,IAAI,UAAU;IAStB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA4CxC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB5D,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,119 @@
1
+ // src/adapters/cline.ts — Adapter for Cline (VS Code extension)
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { BaseAdapter } from './base-adapter.js';
6
+ export class ClineAdapter extends BaseAdapter {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.name = 'cline';
10
+ this.displayName = 'Cline';
11
+ }
12
+ getGlobalDir() {
13
+ const platform = os.platform();
14
+ if (platform === 'win32') {
15
+ return path.join(os.homedir(), 'AppData', 'Roaming', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev');
16
+ }
17
+ else if (platform === 'darwin') {
18
+ return path.join(os.homedir(), 'Library', 'Application Support', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev');
19
+ }
20
+ return path.join(os.homedir(), '.config', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev');
21
+ }
22
+ async detect() {
23
+ const dir = this.getGlobalDir();
24
+ if (fs.existsSync(dir))
25
+ return true;
26
+ // Also check .clinerules
27
+ return fs.existsSync(path.join(this.projectDir, '.clinerules'));
28
+ }
29
+ getConfigPaths() {
30
+ return {
31
+ memoryDir: path.join(this.projectDir, '.cline', 'memory'),
32
+ rulesDir: this.projectDir, // .clinerules is in project root
33
+ conversationDir: path.join(this.getGlobalDir(), 'tasks'),
34
+ configFile: path.join(this.getGlobalDir(), 'settings.json'),
35
+ };
36
+ }
37
+ async readActivity() {
38
+ const activities = [];
39
+ const tasksDir = path.join(this.getGlobalDir(), 'tasks');
40
+ if (!fs.existsSync(tasksDir))
41
+ return activities;
42
+ try {
43
+ const taskDirs = fs.readdirSync(tasksDir)
44
+ .map(d => path.join(tasksDir, d))
45
+ .filter(d => {
46
+ try {
47
+ return fs.statSync(d).isDirectory();
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ })
53
+ .sort((a, b) => {
54
+ try {
55
+ return fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs;
56
+ }
57
+ catch {
58
+ return 0;
59
+ }
60
+ })
61
+ .slice(0, 3);
62
+ for (const taskDir of taskDirs) {
63
+ const historyFile = path.join(taskDir, 'api_conversation_history.json');
64
+ if (fs.existsSync(historyFile)) {
65
+ try {
66
+ const data = JSON.parse(fs.readFileSync(historyFile, 'utf-8'));
67
+ for (const msg of (data || []).slice(-20)) {
68
+ if (msg.role === 'assistant' && Array.isArray(msg.content)) {
69
+ for (const block of msg.content) {
70
+ if (block.type === 'tool_use') {
71
+ activities.push({
72
+ timestamp: new Date(),
73
+ type: this.mapTool(block.name),
74
+ detail: `${block.name}: ${JSON.stringify(block.input || {}).slice(0, 200)}`,
75
+ file: block.input?.path,
76
+ });
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ catch { /* skip */ }
83
+ }
84
+ }
85
+ }
86
+ catch { /* permission */ }
87
+ return activities;
88
+ }
89
+ async injectContext(insight) {
90
+ // Cline reads .clinerules file in project root
91
+ const rulesFile = path.join(this.projectDir, '.clinerules');
92
+ const memDir = path.join(this.projectDir, '.cline', 'memory');
93
+ fs.mkdirSync(memDir, { recursive: true });
94
+ // Write brain file to memory
95
+ const brainFile = path.join(memDir, 'shadow-brain.md');
96
+ const existing = this.readFile(brainFile) || '';
97
+ const updated = this.appendToBrainFile(existing, insight);
98
+ fs.writeFileSync(brainFile, updated, 'utf-8');
99
+ // For critical insights, add to .clinerules
100
+ if (insight.priority === 'critical' || insight.priority === 'high') {
101
+ const existingRules = this.readFile(rulesFile) || '';
102
+ if (!existingRules.includes('Shadow Brain')) {
103
+ const brainSection = `\n\n# Shadow Brain Alerts\n\n${insight.content}\n`;
104
+ fs.writeFileSync(rulesFile, existingRules + brainSection, 'utf-8');
105
+ }
106
+ }
107
+ return true;
108
+ }
109
+ mapTool(name) {
110
+ if (name.includes('write') || name.includes('edit') || name.includes('replace'))
111
+ return 'file_edit';
112
+ if (name.includes('read') || name.includes('list'))
113
+ return 'file_read';
114
+ if (name.includes('execute') || name.includes('command'))
115
+ return 'command';
116
+ return 'search';
117
+ }
118
+ }
119
+ //# sourceMappingURL=cline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../src/adapters/cline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseAdapter } from './base-adapter.js';
2
+ import { AgentTool, AgentPaths, AgentActivity, BrainInsight } from '../types.js';
3
+ export declare class CodexAdapter extends BaseAdapter {
4
+ name: AgentTool;
5
+ displayName: string;
6
+ private getGlobalDir;
7
+ detect(): Promise<boolean>;
8
+ getConfigPaths(): AgentPaths;
9
+ readActivity(): Promise<AgentActivity[]>;
10
+ injectContext(insight: BrainInsight): Promise<boolean>;
11
+ }
12
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjF,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,EAAE,SAAS,CAAW;IAC1B,WAAW,SAAe;IAE1B,OAAO,CAAC,YAAY;IAId,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAYhC,cAAc,IAAI,UAAU;IAStB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAKxC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;CA0B7D"}