@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.
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/adapters/base-adapter.d.ts +18 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +110 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +14 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +125 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/cline.d.ts +13 -0
- package/dist/adapters/cline.d.ts.map +1 -0
- package/dist/adapters/cline.js +119 -0
- package/dist/adapters/cline.js.map +1 -0
- package/dist/adapters/codex.d.ts +12 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +65 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +38 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/kilo-code.d.ts +12 -0
- package/dist/adapters/kilo-code.d.ts.map +1 -0
- package/dist/adapters/kilo-code.js +94 -0
- package/dist/adapters/kilo-code.js.map +1 -0
- package/dist/adapters/opencode.d.ts +12 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +100 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/brain/analyzer.d.ts +23 -0
- package/dist/brain/analyzer.d.ts.map +1 -0
- package/dist/brain/analyzer.js +218 -0
- package/dist/brain/analyzer.js.map +1 -0
- package/dist/brain/llm-client.d.ts +30 -0
- package/dist/brain/llm-client.d.ts.map +1 -0
- package/dist/brain/llm-client.js +240 -0
- package/dist/brain/llm-client.js.map +1 -0
- package/dist/brain/orchestrator.d.ts +41 -0
- package/dist/brain/orchestrator.d.ts.map +1 -0
- package/dist/brain/orchestrator.js +289 -0
- package/dist/brain/orchestrator.js.map +1 -0
- package/dist/brain/project-context.d.ts +15 -0
- package/dist/brain/project-context.d.ts.map +1 -0
- package/dist/brain/project-context.js +225 -0
- package/dist/brain/project-context.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +254 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +87 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/dashboard.d.ts +3 -0
- package/dist/ui/dashboard.d.ts.map +1 -0
- package/dist/ui/dashboard.js +110 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/watchers/file-watcher.d.ts +18 -0
- package/dist/watchers/file-watcher.d.ts.map +1 -0
- package/dist/watchers/file-watcher.js +132 -0
- package/dist/watchers/file-watcher.js.map +1 -0
- package/dist/watchers/git-watcher.d.ts +31 -0
- package/dist/watchers/git-watcher.d.ts.map +1 -0
- package/dist/watchers/git-watcher.js +93 -0
- package/dist/watchers/git-watcher.js.map +1 -0
- 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
|
+
[](https://www.npmjs.com/package/@theihtisham/agent-shadow-brain)
|
|
4
|
+
[](https://github.com/theihtisham/agent-shadow-brain/blob/main/LICENSE)
|
|
5
|
+
[](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":"AAAA,mEAAmE;AAEnE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,OAAgB,WAAW;IAAjC;QAIY,eAAU,GAAW,EAAE,CAAC;IA0HpC,CAAC;IApHC,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACjC,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAgB;YAC1B,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,EAAE;SACrB,CAAC;QAEF,gCAAgC;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC1E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACpG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3E,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAqB;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEhD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;YACxE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE5C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEtE,kCAAkC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE9C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAES,aAAa,CAAC,OAAqB;QAC3C,MAAM,aAAa,GAA2B;YAC5C,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,IAAI;SACV,CAAC;QAEF,OAAO,KAAK,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK;;YAEpD,OAAO,CAAC,IAAI,oBAAoB,OAAO,CAAC,QAAQ;YAChD,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;EACzC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;;;EAIrE,OAAO,CAAC,OAAO;CAChB,CAAC;IACA,CAAC;IAES,iBAAiB,CAAC,QAAgB,EAAE,OAAqB;QACjE,MAAM,MAAM,GAAG,QAAQ;YACrB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YACrC,CAAC,CAAC,wHAAwH,CAAC;QAE7H,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB;QAExE,MAAM,QAAQ,GAAG;KAChB,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,KAAK;GACrI,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;;EAEhC,OAAO,CAAC,OAAO;EACf,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAE1E,OAAO,MAAM,GAAG,SAAS,GAAG,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAC7E,CAAC;IAES,UAAU,CAAC,QAAgB;QACnC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAES,QAAQ,CAAC,QAAgB;QACjC,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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"}
|