@sdsrs/codeagent 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -67
- package/dist/adapters/code-graph.d.ts.map +1 -1
- package/dist/adapters/code-graph.js +53 -71
- package/dist/adapters/code-graph.js.map +1 -1
- package/dist/adapters/memory.d.ts +0 -1
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +20 -50
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/orchestration/gsd.d.ts +6 -1
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -1
- package/dist/adapters/orchestration/gsd.js +23 -20
- package/dist/adapters/orchestration/gsd.js.map +1 -1
- package/dist/broker/broker.d.ts +4 -2
- package/dist/broker/broker.d.ts.map +1 -1
- package/dist/broker/broker.js +92 -32
- package/dist/broker/broker.js.map +1 -1
- package/dist/broker/compressor.d.ts +4 -1
- package/dist/broker/compressor.d.ts.map +1 -1
- package/dist/broker/compressor.js +52 -11
- package/dist/broker/compressor.js.map +1 -1
- package/dist/cli/commands/chat.js +15 -36
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +10 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +11 -16
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/search.js +7 -7
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/hooks/post-compact.d.ts +15 -0
- package/dist/hooks/post-compact.d.ts.map +1 -0
- package/dist/hooks/post-compact.js +57 -0
- package/dist/hooks/post-compact.js.map +1 -0
- package/dist/hooks/session-start.js +1 -1
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.js +9 -12
- package/dist/hooks/stop.js.map +1 -1
- package/dist/hooks/user-prompt.js +1 -1
- package/dist/hooks/user-prompt.js.map +1 -1
- package/dist/providers/anthropic-api.d.ts +2 -1
- package/dist/providers/anthropic-api.d.ts.map +1 -1
- package/dist/providers/anthropic-api.js +14 -8
- package/dist/providers/anthropic-api.js.map +1 -1
- package/dist/providers/claude-cli.d.ts.map +1 -1
- package/dist/providers/claude-cli.js +19 -15
- package/dist/providers/claude-cli.js.map +1 -1
- package/dist/providers/claude-sdk.d.ts.map +1 -1
- package/dist/providers/claude-sdk.js +9 -2
- package/dist/providers/claude-sdk.js.map +1 -1
- package/dist/scripts/install-hooks.js +9 -3
- package/dist/scripts/install-hooks.js.map +1 -1
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +2 -1
- package/dist/session/manager.js.map +1 -1
- package/dist/utils/exec.d.ts +3 -2
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +7 -6
- package/dist/utils/exec.js.map +1 -1
- package/package.json +4 -4
- package/src/skills/remember.md +40 -0
- package/src/skills/spec.md +37 -0
package/README.md
CHANGED
|
@@ -1,115 +1,259 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @sdsrs/codeagent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
上下文感知的编程 Agent —— 将代码搜索、记忆系统、编排引擎整合为统一的 Context Broker,支持独立 CLI 和 Claude Code 增强两种运行模式。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 安装
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
#
|
|
9
|
-
npm install -g codeagent
|
|
8
|
+
# 全局安装
|
|
9
|
+
npm install -g @sdsrs/codeagent
|
|
10
10
|
|
|
11
|
-
#
|
|
12
|
-
npx codeagent
|
|
11
|
+
# 直接运行
|
|
12
|
+
npx @sdsrs/codeagent --help
|
|
13
|
+
|
|
14
|
+
# 安装后可用两个命令
|
|
15
|
+
codeagent chat
|
|
16
|
+
devx chat
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 核心概念
|
|
20
|
+
|
|
21
|
+
CodeAgent 的核心是 **Context Broker** —— 一个 5 步管线,在每次 LLM 调用前自动聚合精准上下文:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
UserQuery → QueryParser → 并行查询(Code Graph + Memory + Orchestration) → Merge → Compress → ContextPack
|
|
13
25
|
```
|
|
14
26
|
|
|
15
|
-
|
|
27
|
+
它消费 3 个已有系统但不合并代码,通过 CLI 调用保持松耦合:
|
|
28
|
+
|
|
29
|
+
| 系统 | 语言 | 职责 | 调用方式 |
|
|
30
|
+
|------|------|------|---------|
|
|
31
|
+
| [Code Graph MCP](https://github.com/sdsrs/code-graph-mcp) | Rust | AST 解析、混合搜索、调用图、影响分析 | CLI (`code-graph-mcp`) |
|
|
32
|
+
| [claude-mem-lite](https://github.com/sdsrs/claude-mem-lite) | Node.js | 类型化记忆、FTS5+向量召回 | CLI (`claude-mem-lite`) |
|
|
33
|
+
| [GSD-Lite](https://github.com/sdsrs/gsd-lite) / Superpowers | Node.js | 编排状态机、阶段管理 | 读 state.json / 读 skills 目录 |
|
|
34
|
+
|
|
35
|
+
## 双模式运行
|
|
36
|
+
|
|
37
|
+
### Mode A: 独立 CLI (`codeagent chat`)
|
|
16
38
|
|
|
17
|
-
|
|
39
|
+
完全掌控消息流的交互式 Agent,基于 Claude Agent SDK。
|
|
18
40
|
|
|
19
41
|
```bash
|
|
20
|
-
#
|
|
42
|
+
# 新会话
|
|
21
43
|
codeagent chat
|
|
22
44
|
|
|
23
|
-
#
|
|
45
|
+
# 续接会话
|
|
24
46
|
codeagent chat --resume <sessionId>
|
|
25
47
|
|
|
26
|
-
#
|
|
27
|
-
codeagent chat --provider
|
|
28
|
-
codeagent chat --provider
|
|
29
|
-
codeagent chat --provider
|
|
48
|
+
# 指定 provider
|
|
49
|
+
codeagent chat --provider sdk # Agent SDK (默认,完整工具能力)
|
|
50
|
+
codeagent chat --provider api # Anthropic API (轻量,无工具执行)
|
|
51
|
+
codeagent chat --provider cli # claude -p (批处理)
|
|
52
|
+
|
|
53
|
+
# 指定编排引擎
|
|
54
|
+
codeagent chat --orchestration gsd # GSD-Lite
|
|
55
|
+
codeagent chat --orchestration superpowers # Superpowers
|
|
56
|
+
|
|
57
|
+
# 预算控制
|
|
58
|
+
codeagent chat --max-budget 2.0
|
|
30
59
|
```
|
|
31
60
|
|
|
32
|
-
|
|
61
|
+
会话内命令:
|
|
62
|
+
|
|
63
|
+
| 命令 | 功能 |
|
|
64
|
+
|------|------|
|
|
65
|
+
| `/help` | 显示所有命令 |
|
|
66
|
+
| `/quit` | 结束会话 |
|
|
67
|
+
| `/status` | 查看会话信息 |
|
|
68
|
+
| `/stage` | 查看当前阶段 |
|
|
69
|
+
| `/cost` | 查看累计费用 |
|
|
70
|
+
| `/context` | 查看上次注入的上下文 |
|
|
71
|
+
| `/brainstorm` | 切换到 brainstorm 阶段 |
|
|
72
|
+
| `/plan` | 切换到 plan 阶段 |
|
|
73
|
+
| `/implement` | 切换到 implement 阶段 |
|
|
74
|
+
| `/review` | 切换到 review 阶段 |
|
|
75
|
+
| `/debug` | 切换到 debug 阶段 |
|
|
76
|
+
|
|
77
|
+
### Mode B: Claude Code 增强 (hooks)
|
|
78
|
+
|
|
79
|
+
通过 hooks 在 Claude Code 内自动注入上下文,零学习成本。
|
|
33
80
|
|
|
34
81
|
```bash
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
82
|
+
# 安装 hooks 到当前项目
|
|
83
|
+
npm run install-hooks
|
|
84
|
+
|
|
85
|
+
# 安装 hooks 到全局
|
|
86
|
+
npm run install-hooks:global
|
|
39
87
|
```
|
|
40
88
|
|
|
41
|
-
|
|
89
|
+
| Hook | 触发时机 | 行为 |
|
|
90
|
+
|------|---------|------|
|
|
91
|
+
| `UserPromptSubmit` | 每次用户输入 | Context Broker 生成 ContextPack → 注入到 prompt |
|
|
92
|
+
| `SessionStart` | 会话开始 | 注入项目概要 + 活跃编排状态 |
|
|
93
|
+
| `Stop` | 会话结束 | 从对话中提取关键发现 → 写入记忆 |
|
|
94
|
+
|
|
95
|
+
## 其他命令
|
|
96
|
+
|
|
97
|
+
### 代码搜索
|
|
42
98
|
|
|
43
99
|
```bash
|
|
44
|
-
codeagent
|
|
45
|
-
codeagent
|
|
100
|
+
codeagent search "payment processing" # 语义搜索
|
|
101
|
+
codeagent search "RefundService" --type impact # 影响分析
|
|
102
|
+
codeagent search "processPayment" --type callgraph # 调用图
|
|
103
|
+
codeagent search "src/payment/" --type overview # 模块概览
|
|
46
104
|
```
|
|
47
105
|
|
|
48
|
-
###
|
|
106
|
+
### 记忆管理
|
|
49
107
|
|
|
50
108
|
```bash
|
|
51
|
-
codeagent
|
|
52
|
-
codeagent
|
|
53
|
-
codeagent session delete <id>
|
|
109
|
+
codeagent memory "authentication" # 搜索记忆
|
|
110
|
+
codeagent memory --save "金额用 cents" --type decision --body "避免浮点精度问题" # 保存记忆
|
|
54
111
|
```
|
|
55
112
|
|
|
56
|
-
###
|
|
113
|
+
### 会话管理
|
|
57
114
|
|
|
58
115
|
```bash
|
|
59
|
-
codeagent
|
|
60
|
-
codeagent
|
|
61
|
-
codeagent
|
|
116
|
+
codeagent session list # 列出会话
|
|
117
|
+
codeagent session show <id> # 查看详情
|
|
118
|
+
codeagent session delete <id> # 删除会话
|
|
62
119
|
```
|
|
63
120
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
CodeAgent enhances Claude Code through hooks:
|
|
121
|
+
### 配置
|
|
67
122
|
|
|
68
123
|
```bash
|
|
69
|
-
|
|
70
|
-
codeagent
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
codeagent
|
|
124
|
+
codeagent config set orchestration superpowers # 切换编排引擎
|
|
125
|
+
codeagent config set model claude-opus-4-6 # 设置模型
|
|
126
|
+
codeagent config set maxBudgetUsd 5.0 # 设置预算上限
|
|
127
|
+
codeagent config get # 查看所有配置
|
|
128
|
+
codeagent config path # 查看配置文件路径
|
|
74
129
|
```
|
|
75
130
|
|
|
76
|
-
|
|
77
|
-
- **UserPromptSubmit** — Code search + memory + orchestration context
|
|
78
|
-
- **SessionStart** — Project overview on session start
|
|
79
|
-
- **Stop** — Extract discoveries to memory
|
|
80
|
-
|
|
81
|
-
## Architecture
|
|
131
|
+
## 架构
|
|
82
132
|
|
|
83
133
|
```
|
|
84
|
-
|
|
85
|
-
│
|
|
86
|
-
│
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
134
|
+
┌──────────────────────────────┐
|
|
135
|
+
│ 用户入口 (双模式) │
|
|
136
|
+
│ │
|
|
137
|
+
│ Mode A Mode B │
|
|
138
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
139
|
+
│ │ devx CLI │ │Claude Code│ │
|
|
140
|
+
│ │ (TUI) │ │ hooks │ │
|
|
141
|
+
│ │ Agent SDK │ │ + skills │ │
|
|
142
|
+
│ └─────┬─────┘ └─────┬────┘ │
|
|
143
|
+
└────────┼───────────────┼──────┘
|
|
144
|
+
└───────┬───────┘
|
|
90
145
|
▼
|
|
91
|
-
|
|
92
|
-
│
|
|
93
|
-
│
|
|
94
|
-
|
|
95
|
-
│ → compress │
|
|
96
|
-
└──┬────┬────┬─────┘
|
|
146
|
+
┌───────────────────┐
|
|
147
|
+
│ Context Broker │
|
|
148
|
+
│ (5-step pipeline) │
|
|
149
|
+
└──┬────┬────┬──────┘
|
|
97
150
|
│ │ │
|
|
98
151
|
┌─────┘ │ └─────┐
|
|
99
152
|
▼ ▼ ▼
|
|
100
|
-
┌────────┐ ┌───────┐
|
|
101
|
-
│ Code │ │Memory │ │
|
|
102
|
-
│ Graph │ │Engine │ │Adapter│
|
|
103
|
-
│ (Rust) │ │(Node) │ │
|
|
104
|
-
└────────┘ └───────┘
|
|
153
|
+
┌────────┐ ┌───────┐ ┌──────────┐
|
|
154
|
+
│ Code │ │Memory │ │ Orch │
|
|
155
|
+
│ Graph │ │Engine │ │ Adapter │
|
|
156
|
+
│ (Rust) │ │(Node) │ │GSD|Super │
|
|
157
|
+
└────────┘ └───────┘ └──────────┘
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 项目结构
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
src/
|
|
164
|
+
├── broker/ # Context Broker 核心
|
|
165
|
+
│ ├── broker.ts # buildContextPack() — 5 步管线主入口
|
|
166
|
+
│ ├── query-parser.ts # 意图检测 + 实体提取 (EN/ZH 双语)
|
|
167
|
+
│ ├── context-pack.ts # ContextPack 类型 + Zod schema
|
|
168
|
+
│ └── compressor.ts # Token 预算压缩 (优先级排序)
|
|
169
|
+
│
|
|
170
|
+
├── adapters/ # 外部系统适配器
|
|
171
|
+
│ ├── code-graph.ts # Code Graph MCP CLI 适配
|
|
172
|
+
│ ├── memory.ts # claude-mem-lite CLI 适配
|
|
173
|
+
│ └── orchestration/
|
|
174
|
+
│ ├── interface.ts # OrchestrationAdapter 统一接口
|
|
175
|
+
│ ├── gsd.ts # GSD-Lite (读 .gsd/state.json)
|
|
176
|
+
│ └── superpowers.ts # Superpowers (无状态, 技能发现)
|
|
177
|
+
│
|
|
178
|
+
├── providers/ # LLM Provider 抽象层
|
|
179
|
+
│ ├── interface.ts # AgentProvider 接口 + TurnEvent 类型
|
|
180
|
+
│ ├── claude-sdk.ts # Agent SDK V1 query() + resume
|
|
181
|
+
│ ├── claude-cli.ts # claude -p 批处理
|
|
182
|
+
│ └── anthropic-api.ts # 直接 API 调用 (流式)
|
|
183
|
+
│
|
|
184
|
+
├── session/ # 会话管理
|
|
185
|
+
│ ├── schema.ts # SQLite schema + 迁移
|
|
186
|
+
│ └── manager.ts # SessionManager CRUD + 事件记录
|
|
187
|
+
│
|
|
188
|
+
├── cli/ # 命令行界面
|
|
189
|
+
│ ├── index.ts # Commander.js 主入口
|
|
190
|
+
│ ├── commands/ # chat, search, memory, session, config
|
|
191
|
+
│ └── tui/renderer.ts # ANSI TUI: spinner, stage, markdown
|
|
192
|
+
│
|
|
193
|
+
├── hooks/ # Claude Code 生命周期 hooks
|
|
194
|
+
│ ├── user-prompt.ts # UserPromptSubmit → Broker → 注入
|
|
195
|
+
│ ├── session-start.ts # SessionStart → 项目概要
|
|
196
|
+
│ └── stop.ts # Stop → 记忆写入
|
|
197
|
+
│
|
|
198
|
+
├── skills/ # Claude Code Skills
|
|
199
|
+
│ ├── brainstorm.md # 强制 brainstorm 模式
|
|
200
|
+
│ └── review.md # bug memory 感知的代码审查
|
|
201
|
+
│
|
|
202
|
+
├── scripts/
|
|
203
|
+
│ └── install-hooks.ts # 一键注册 hooks 到 settings.json
|
|
204
|
+
│
|
|
205
|
+
└── utils/
|
|
206
|
+
├── exec.ts # 带超时的安全命令执行
|
|
207
|
+
└── tokens.ts # Token 估算 + 截断
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 编程接口
|
|
211
|
+
|
|
212
|
+
CodeAgent 同时导出 npm 模块,可在自己的代码中使用:
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
import { ContextBroker, formatContextPack } from '@sdsrs/codeagent';
|
|
216
|
+
import { hasContent } from '@sdsrs/codeagent/context-pack';
|
|
217
|
+
import { SessionManager } from '@sdsrs/codeagent/session';
|
|
218
|
+
|
|
219
|
+
// 构建上下文
|
|
220
|
+
const broker = new ContextBroker(process.cwd());
|
|
221
|
+
const pack = await broker.buildContextPack({
|
|
222
|
+
repoRoot: process.cwd(),
|
|
223
|
+
userQuery: 'how does the payment module work?',
|
|
224
|
+
stage: 'brainstorm',
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
if (hasContent(pack)) {
|
|
228
|
+
console.log(formatContextPack(pack));
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 环境要求
|
|
233
|
+
|
|
234
|
+
- **Node.js >= 20**
|
|
235
|
+
- **code-graph-mcp** (可选) — 代码搜索。未安装时 Broker 跳过代码上下文。
|
|
236
|
+
- **claude-mem-lite** (可选) — 记忆系统。未安装时 Broker 跳过记忆上下文。
|
|
237
|
+
- **ANTHROPIC_API_KEY** — 使用 `--provider api` 时需要。
|
|
238
|
+
|
|
239
|
+
## 开发
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
git clone https://github.com/sdsrs/codeagent.git
|
|
243
|
+
cd codeagent
|
|
244
|
+
npm install
|
|
245
|
+
npm run build
|
|
246
|
+
npm test # 66 tests (unit + integration)
|
|
247
|
+
npm run dev # watch mode
|
|
105
248
|
```
|
|
106
249
|
|
|
107
|
-
##
|
|
250
|
+
## 数据存储
|
|
108
251
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
252
|
+
| 数据 | 位置 |
|
|
253
|
+
|------|------|
|
|
254
|
+
| 会话数据库 | `~/.local/share/codeagent/codeagent.db` |
|
|
255
|
+
| 全局配置 | `~/.config/codeagent/config.json` |
|
|
256
|
+
| 项目 hooks | `.claude/settings.json` |
|
|
113
257
|
|
|
114
258
|
## License
|
|
115
259
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-graph.d.ts","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"code-graph.d.ts","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAUD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAiF1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,MAAM,CAKnE"}
|
|
@@ -2,12 +2,17 @@ import { execSafe } from '../utils/exec.js';
|
|
|
2
2
|
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
+
const CG = 'code-graph-mcp';
|
|
6
|
+
/** Safe CLI call — no shell, no injection. */
|
|
7
|
+
function cg(args, repoRoot, timeout = 2000) {
|
|
8
|
+
const { stdout, ok } = execSafe(CG, args, { cwd: repoRoot, timeout });
|
|
9
|
+
return ok ? stdout : '';
|
|
10
|
+
}
|
|
5
11
|
/**
|
|
6
12
|
* Query Code Graph MCP via CLI.
|
|
7
13
|
* Selects the right command based on intent.
|
|
8
14
|
*/
|
|
9
15
|
export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
|
|
10
|
-
// Check if index exists
|
|
11
16
|
const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
|
|
12
17
|
if (!fs.existsSync(dbPath)) {
|
|
13
18
|
return { relevantFiles: [], relatedSymbols: [], raw: '' };
|
|
@@ -22,82 +27,62 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
|
|
|
22
27
|
if (!searchQuery && filePaths.length === 0) {
|
|
23
28
|
return result;
|
|
24
29
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const { stdout, ok } = execSafe(`code-graph-mcp impact "${symbols[0]}"`, { cwd: repoRoot, timeout: 2000 });
|
|
30
|
-
if (ok)
|
|
31
|
-
result.raw = stdout;
|
|
32
|
-
}
|
|
33
|
-
break;
|
|
30
|
+
switch (intent) {
|
|
31
|
+
case 'impact': {
|
|
32
|
+
if (symbols.length > 0) {
|
|
33
|
+
result.raw = cg(['impact', symbols[0]], repoRoot);
|
|
34
34
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
else if (searchQuery) {
|
|
43
|
-
const { stdout, ok } = execSafe(`code-graph-mcp search "${searchQuery}" --limit 8`, { cwd: repoRoot, timeout: 2000 });
|
|
44
|
-
if (ok)
|
|
45
|
-
result.raw = stdout;
|
|
46
|
-
}
|
|
47
|
-
break;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'understand': {
|
|
38
|
+
if (filePaths.length > 0) {
|
|
39
|
+
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
40
|
+
result.raw = cg(['overview', dir], repoRoot);
|
|
48
41
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const { stdout, ok } = execSafe(`code-graph-mcp callgraph "${symbols[0]}" --depth 2`, { cwd: repoRoot, timeout: 2000 });
|
|
52
|
-
if (ok)
|
|
53
|
-
result.raw = stdout;
|
|
54
|
-
}
|
|
55
|
-
break;
|
|
42
|
+
else if (searchQuery) {
|
|
43
|
+
result.raw = cg(['search', searchQuery, '--limit', '8'], repoRoot);
|
|
56
44
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
result.raw = results.join('\n\n');
|
|
72
|
-
break;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case 'callgraph': {
|
|
48
|
+
if (symbols.length > 0) {
|
|
49
|
+
result.raw = cg(['callgraph', symbols[0], '--depth', '2'], repoRoot);
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'implement': {
|
|
54
|
+
const results = [];
|
|
55
|
+
if (searchQuery) {
|
|
56
|
+
const r = cg(['search', searchQuery, '--limit', '5'], repoRoot);
|
|
57
|
+
if (r)
|
|
58
|
+
results.push(r);
|
|
73
59
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const { stdout, ok } = execSafe(`code-graph-mcp search "${searchQuery}" --limit 8`, { cwd: repoRoot, timeout: 2000 });
|
|
80
|
-
if (ok)
|
|
81
|
-
result.raw = stdout;
|
|
82
|
-
}
|
|
83
|
-
else if (filePaths.length > 0) {
|
|
84
|
-
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
85
|
-
const { stdout, ok } = execSafe(`code-graph-mcp overview "${dir}"`, { cwd: repoRoot, timeout: 2000 });
|
|
86
|
-
if (ok)
|
|
87
|
-
result.raw = stdout;
|
|
88
|
-
}
|
|
89
|
-
break;
|
|
60
|
+
if (filePaths.length > 0) {
|
|
61
|
+
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
62
|
+
const r = cg(['overview', dir], repoRoot);
|
|
63
|
+
if (r)
|
|
64
|
+
results.push(r);
|
|
90
65
|
}
|
|
66
|
+
result.raw = results.join('\n\n');
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case 'debug':
|
|
70
|
+
case 'search':
|
|
71
|
+
case 'general':
|
|
72
|
+
default: {
|
|
73
|
+
if (searchQuery) {
|
|
74
|
+
result.raw = cg(['search', searchQuery, '--limit', '8'], repoRoot);
|
|
75
|
+
}
|
|
76
|
+
else if (filePaths.length > 0) {
|
|
77
|
+
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
78
|
+
result.raw = cg(['overview', dir], repoRoot);
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
91
81
|
}
|
|
92
82
|
}
|
|
93
|
-
catch {
|
|
94
|
-
// Graceful degradation — return empty
|
|
95
|
-
}
|
|
96
|
-
// Truncate to budget
|
|
97
83
|
if (result.raw) {
|
|
98
84
|
result.raw = truncateToTokenBudget(result.raw, tokenBudget);
|
|
99
85
|
}
|
|
100
|
-
// Parse raw into structured data (best-effort)
|
|
101
86
|
result.relevantFiles = parseRelevantFiles(result.raw);
|
|
102
87
|
result.relatedSymbols = parseSymbols(result.raw);
|
|
103
88
|
return result;
|
|
@@ -109,7 +94,7 @@ export function getRepoMap(repoRoot, timeout = 3000) {
|
|
|
109
94
|
const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
|
|
110
95
|
if (!fs.existsSync(dbPath))
|
|
111
96
|
return '';
|
|
112
|
-
const { stdout } = execSafe('
|
|
97
|
+
const { stdout } = execSafe(CG, ['map'], { cwd: repoRoot, timeout });
|
|
113
98
|
return stdout;
|
|
114
99
|
}
|
|
115
100
|
// --- Parsers for code-graph CLI output ---
|
|
@@ -117,7 +102,6 @@ function parseRelevantFiles(raw) {
|
|
|
117
102
|
if (!raw)
|
|
118
103
|
return [];
|
|
119
104
|
const files = [];
|
|
120
|
-
// Match file paths in output (e.g. "src/foo/bar.ts" or "./src/foo/bar.ts")
|
|
121
105
|
const fileMatches = raw.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\.\w+)/gm) || [];
|
|
122
106
|
const seen = new Set();
|
|
123
107
|
for (const match of fileMatches) {
|
|
@@ -133,8 +117,6 @@ function parseSymbols(raw) {
|
|
|
133
117
|
if (!raw)
|
|
134
118
|
return [];
|
|
135
119
|
const symbols = [];
|
|
136
|
-
// Match symbol definitions in overview/callgraph output
|
|
137
|
-
// Typical format: "fn symbol_name" or "struct SymbolName" or " function symbolName"
|
|
138
120
|
const symMatches = raw.match(/(?:fn|function|struct|class|impl|trait|interface|type|const|enum)\s+(\w+)/g) || [];
|
|
139
121
|
const seen = new Set();
|
|
140
122
|
for (const match of symMatches) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,WAAmB,EACnB,QAAgB;IAEhB,
|
|
1
|
+
{"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,6 @@ export interface MemoryResult {
|
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Query memory engine via claude-mem-lite CLI.
|
|
10
|
-
* Searches for relevant memories based on query and stage.
|
|
11
10
|
*/
|
|
12
11
|
export declare function queryMemory(parsed: ParsedQuery, tokenBudget: number, stage?: Stage): Promise<MemoryResult>;
|
|
13
12
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAeD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
|