@sdsrs/codeagent 0.2.1 → 0.4.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 (167) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +18 -6
  3. package/dist/adapters/__tests__/code-graph.test.d.ts +2 -0
  4. package/dist/adapters/__tests__/code-graph.test.d.ts.map +1 -0
  5. package/dist/adapters/__tests__/code-graph.test.js +118 -0
  6. package/dist/adapters/__tests__/code-graph.test.js.map +1 -0
  7. package/dist/adapters/__tests__/memory.test.d.ts +2 -0
  8. package/dist/adapters/__tests__/memory.test.d.ts.map +1 -0
  9. package/dist/adapters/__tests__/memory.test.js +168 -0
  10. package/dist/adapters/__tests__/memory.test.js.map +1 -0
  11. package/dist/adapters/code-graph.d.ts +7 -1
  12. package/dist/adapters/code-graph.d.ts.map +1 -1
  13. package/dist/adapters/code-graph.js +69 -33
  14. package/dist/adapters/code-graph.js.map +1 -1
  15. package/dist/adapters/memory.d.ts +1 -1
  16. package/dist/adapters/memory.d.ts.map +1 -1
  17. package/dist/adapters/memory.js +23 -14
  18. package/dist/adapters/memory.js.map +1 -1
  19. package/dist/adapters/orchestration/gsd.d.ts +0 -0
  20. package/dist/adapters/orchestration/gsd.d.ts.map +1 -1
  21. package/dist/adapters/orchestration/gsd.js +18 -1
  22. package/dist/adapters/orchestration/gsd.js.map +1 -1
  23. package/dist/adapters/orchestration/interface.d.ts +0 -0
  24. package/dist/adapters/orchestration/interface.d.ts.map +0 -0
  25. package/dist/adapters/orchestration/interface.js +0 -0
  26. package/dist/adapters/orchestration/interface.js.map +0 -0
  27. package/dist/adapters/orchestration/superpowers.d.ts +0 -0
  28. package/dist/adapters/orchestration/superpowers.d.ts.map +0 -0
  29. package/dist/adapters/orchestration/superpowers.js +0 -0
  30. package/dist/adapters/orchestration/superpowers.js.map +0 -0
  31. package/dist/broker/__tests__/broker.test.d.ts +2 -0
  32. package/dist/broker/__tests__/broker.test.d.ts.map +1 -0
  33. package/dist/broker/__tests__/broker.test.js +207 -0
  34. package/dist/broker/__tests__/broker.test.js.map +1 -0
  35. package/dist/broker/__tests__/compressor.test.d.ts +2 -0
  36. package/dist/broker/__tests__/compressor.test.d.ts.map +1 -0
  37. package/dist/broker/__tests__/compressor.test.js +278 -0
  38. package/dist/broker/__tests__/compressor.test.js.map +1 -0
  39. package/dist/broker/__tests__/query-parser.test.d.ts +2 -0
  40. package/dist/broker/__tests__/query-parser.test.d.ts.map +1 -0
  41. package/dist/broker/__tests__/query-parser.test.js +101 -0
  42. package/dist/broker/__tests__/query-parser.test.js.map +1 -0
  43. package/dist/broker/broker.d.ts +1 -1
  44. package/dist/broker/broker.d.ts.map +1 -1
  45. package/dist/broker/broker.js +45 -29
  46. package/dist/broker/broker.js.map +1 -1
  47. package/dist/broker/compressor.d.ts +0 -0
  48. package/dist/broker/compressor.d.ts.map +1 -1
  49. package/dist/broker/compressor.js +82 -2
  50. package/dist/broker/compressor.js.map +1 -1
  51. package/dist/broker/context-pack.d.ts +3 -0
  52. package/dist/broker/context-pack.d.ts.map +1 -1
  53. package/dist/broker/context-pack.js +18 -0
  54. package/dist/broker/context-pack.js.map +1 -1
  55. package/dist/broker/query-parser.d.ts +0 -0
  56. package/dist/broker/query-parser.d.ts.map +0 -0
  57. package/dist/broker/query-parser.js +0 -0
  58. package/dist/broker/query-parser.js.map +0 -0
  59. package/dist/cli/commands/chat.d.ts +0 -0
  60. package/dist/cli/commands/chat.d.ts.map +1 -1
  61. package/dist/cli/commands/chat.js +14 -1
  62. package/dist/cli/commands/chat.js.map +1 -1
  63. package/dist/cli/commands/config.d.ts +1 -2
  64. package/dist/cli/commands/config.d.ts.map +1 -1
  65. package/dist/cli/commands/config.js +0 -0
  66. package/dist/cli/commands/config.js.map +0 -0
  67. package/dist/cli/commands/memory.d.ts +0 -0
  68. package/dist/cli/commands/memory.d.ts.map +0 -0
  69. package/dist/cli/commands/memory.js +0 -0
  70. package/dist/cli/commands/memory.js.map +0 -0
  71. package/dist/cli/commands/search.d.ts +0 -0
  72. package/dist/cli/commands/search.d.ts.map +1 -1
  73. package/dist/cli/commands/search.js +6 -2
  74. package/dist/cli/commands/search.js.map +1 -1
  75. package/dist/cli/commands/session.d.ts +0 -0
  76. package/dist/cli/commands/session.d.ts.map +0 -0
  77. package/dist/cli/commands/session.js +0 -0
  78. package/dist/cli/commands/session.js.map +0 -0
  79. package/dist/cli/index.d.ts +0 -0
  80. package/dist/cli/index.d.ts.map +0 -0
  81. package/dist/cli/index.js +6 -4
  82. package/dist/cli/index.js.map +1 -1
  83. package/dist/cli/tui/renderer.d.ts +0 -0
  84. package/dist/cli/tui/renderer.d.ts.map +0 -0
  85. package/dist/cli/tui/renderer.js +0 -0
  86. package/dist/cli/tui/renderer.js.map +0 -0
  87. package/dist/hooks/__tests__/stop.test.d.ts +2 -0
  88. package/dist/hooks/__tests__/stop.test.d.ts.map +1 -0
  89. package/dist/hooks/__tests__/stop.test.js +88 -0
  90. package/dist/hooks/__tests__/stop.test.js.map +1 -0
  91. package/dist/hooks/post-compact.d.ts +0 -0
  92. package/dist/hooks/post-compact.d.ts.map +0 -0
  93. package/dist/hooks/post-compact.js +8 -7
  94. package/dist/hooks/post-compact.js.map +1 -1
  95. package/dist/hooks/session-start.d.ts +0 -0
  96. package/dist/hooks/session-start.d.ts.map +0 -0
  97. package/dist/hooks/session-start.js +6 -5
  98. package/dist/hooks/session-start.js.map +1 -1
  99. package/dist/hooks/stop.d.ts +6 -0
  100. package/dist/hooks/stop.d.ts.map +1 -1
  101. package/dist/hooks/stop.js +59 -42
  102. package/dist/hooks/stop.js.map +1 -1
  103. package/dist/hooks/user-prompt.d.ts +0 -0
  104. package/dist/hooks/user-prompt.d.ts.map +0 -0
  105. package/dist/hooks/user-prompt.js +0 -0
  106. package/dist/hooks/user-prompt.js.map +0 -0
  107. package/dist/providers/__tests__/anthropic-api.test.d.ts +2 -0
  108. package/dist/providers/__tests__/anthropic-api.test.d.ts.map +1 -0
  109. package/dist/providers/__tests__/anthropic-api.test.js +113 -0
  110. package/dist/providers/__tests__/anthropic-api.test.js.map +1 -0
  111. package/dist/providers/__tests__/claude-sdk.test.d.ts +2 -0
  112. package/dist/providers/__tests__/claude-sdk.test.d.ts.map +1 -0
  113. package/dist/providers/__tests__/claude-sdk.test.js +121 -0
  114. package/dist/providers/__tests__/claude-sdk.test.js.map +1 -0
  115. package/dist/providers/anthropic-api.d.ts +1 -0
  116. package/dist/providers/anthropic-api.d.ts.map +1 -1
  117. package/dist/providers/anthropic-api.js +18 -12
  118. package/dist/providers/anthropic-api.js.map +1 -1
  119. package/dist/providers/claude-cli.d.ts +0 -0
  120. package/dist/providers/claude-cli.d.ts.map +1 -1
  121. package/dist/providers/claude-cli.js +4 -16
  122. package/dist/providers/claude-cli.js.map +1 -1
  123. package/dist/providers/claude-sdk.d.ts +3 -2
  124. package/dist/providers/claude-sdk.d.ts.map +1 -1
  125. package/dist/providers/claude-sdk.js +12 -11
  126. package/dist/providers/claude-sdk.js.map +1 -1
  127. package/dist/providers/interface.d.ts +1 -0
  128. package/dist/providers/interface.d.ts.map +1 -1
  129. package/dist/providers/interface.js +0 -0
  130. package/dist/providers/interface.js.map +0 -0
  131. package/dist/scripts/install-hooks.d.ts +2 -2
  132. package/dist/scripts/install-hooks.d.ts.map +0 -0
  133. package/dist/scripts/install-hooks.js +6 -9
  134. package/dist/scripts/install-hooks.js.map +1 -1
  135. package/dist/session/__tests__/manager.test.d.ts +2 -0
  136. package/dist/session/__tests__/manager.test.d.ts.map +1 -0
  137. package/dist/session/__tests__/manager.test.js +108 -0
  138. package/dist/session/__tests__/manager.test.js.map +1 -0
  139. package/dist/session/manager.d.ts +0 -0
  140. package/dist/session/manager.d.ts.map +1 -1
  141. package/dist/session/manager.js +2 -1
  142. package/dist/session/manager.js.map +1 -1
  143. package/dist/session/schema.d.ts +0 -0
  144. package/dist/session/schema.d.ts.map +1 -1
  145. package/dist/session/schema.js +2 -1
  146. package/dist/session/schema.js.map +1 -1
  147. package/dist/utils/__tests__/exec.test.d.ts +2 -0
  148. package/dist/utils/__tests__/exec.test.d.ts.map +1 -0
  149. package/dist/utils/__tests__/exec.test.js +104 -0
  150. package/dist/utils/__tests__/exec.test.js.map +1 -0
  151. package/dist/utils/__tests__/tokens.test.d.ts +2 -0
  152. package/dist/utils/__tests__/tokens.test.d.ts.map +1 -0
  153. package/dist/utils/__tests__/tokens.test.js +64 -0
  154. package/dist/utils/__tests__/tokens.test.js.map +1 -0
  155. package/dist/utils/exec.d.ts +16 -0
  156. package/dist/utils/exec.d.ts.map +1 -1
  157. package/dist/utils/exec.js +33 -3
  158. package/dist/utils/exec.js.map +1 -1
  159. package/dist/utils/tokens.d.ts +0 -0
  160. package/dist/utils/tokens.d.ts.map +0 -0
  161. package/dist/utils/tokens.js +0 -0
  162. package/dist/utils/tokens.js.map +0 -0
  163. package/package.json +1 -1
  164. package/src/skills/brainstorm.md +0 -0
  165. package/src/skills/remember.md +0 -0
  166. package/src/skills/review.md +0 -0
  167. package/src/skills/spec.md +0 -0
package/LICENSE CHANGED
File without changes
package/README.md CHANGED
@@ -21,16 +21,23 @@ devx chat
21
21
  CodeAgent 的核心是 **Context Broker** —— 一个 5 步管线,在每次 LLM 调用前自动聚合精准上下文:
22
22
 
23
23
  ```
24
- UserQuery → QueryParser → 并行查询(Code Graph + Memory + Orchestration) → MergeCompress → ContextPack
24
+ UserQuery → QueryParser → 真正异步并行查询(Code Graph + Memory + Orchestration) → 去重合并智能压缩 → ContextPack
25
25
  ```
26
26
 
27
+ **关键特性:**
28
+ - 真正的异步并行 — 使用 `execSafeAsync` + `Promise.allSettled`,非假并行
29
+ - 智能 Token 预算 — 动态重分配空源预算,bugWarnings 封顶保护,跨源文件去重
30
+ - 阶段感知记忆检索 — 按 implement/debug/brainstorm 等阶段过滤记忆类型
31
+ - 全面优雅降级 — 任何外部工具缺失不阻塞,降级到空上下文
32
+ - 配置文件生效 — `config set` 的值自动成为 CLI 默认值
33
+
27
34
  它消费 3 个已有系统但不合并代码,通过 CLI 调用保持松耦合:
28
35
 
29
36
  | 系统 | 语言 | 职责 | 调用方式 |
30
37
  |------|------|------|---------|
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 目录 |
38
+ | [Code Graph MCP](https://github.com/sdsrss/code-graph-mcp) | Rust | AST 解析、混合搜索、调用图、影响分析 | CLI (`code-graph-mcp`) |
39
+ | [claude-mem-lite](https://github.com/sdsrss/claude-mem-lite) | Node.js | 类型化记忆、FTS5+向量召回 | CLI (`claude-mem-lite`) |
40
+ | [GSD-Lite](https://github.com/sdsrss/gsd-lite) / Superpowers | Node.js | 编排状态机、阶段管理 | 读 state.json / 读 skills 目录 |
34
41
 
35
42
  ## 双模式运行
36
43
 
@@ -90,6 +97,7 @@ npm run install-hooks:global
90
97
  |------|---------|------|
91
98
  | `UserPromptSubmit` | 每次用户输入 | Context Broker 生成 ContextPack → 注入到 prompt |
92
99
  | `SessionStart` | 会话开始 | 注入项目概要 + 活跃编排状态 |
100
+ | `PostCompact` | 上下文压缩后 | 重注入编排状态 + bug 警告,防止压缩丢失 |
93
101
  | `Stop` | 会话结束 | 从对话中提取关键发现 → 写入记忆 |
94
102
 
95
103
  ## 其他命令
@@ -120,7 +128,10 @@ codeagent session delete <id> # 删除会话
120
128
 
121
129
  ### 配置
122
130
 
131
+ 配置值自动成为 CLI 命令的默认值(命令行参数仍然优先):
132
+
123
133
  ```bash
134
+ codeagent config set provider api # 默认使用 API provider
124
135
  codeagent config set orchestration superpowers # 切换编排引擎
125
136
  codeagent config set model claude-opus-4-6 # 设置模型
126
137
  codeagent config set maxBudgetUsd 5.0 # 设置预算上限
@@ -193,6 +204,7 @@ src/
193
204
  ├── hooks/ # Claude Code 生命周期 hooks
194
205
  │ ├── user-prompt.ts # UserPromptSubmit → Broker → 注入
195
206
  │ ├── session-start.ts # SessionStart → 项目概要
207
+ │ ├── post-compact.ts # PostCompact → 恢复编排状态 + bug 警告
196
208
  │ └── stop.ts # Stop → 记忆写入
197
209
 
198
210
  ├── skills/ # Claude Code Skills
@@ -239,11 +251,11 @@ if (hasContent(pack)) {
239
251
  ## 开发
240
252
 
241
253
  ```bash
242
- git clone https://github.com/sdsrs/codeagent.git
254
+ git clone https://github.com/sdsrss/codeagent.git
243
255
  cd codeagent
244
256
  npm install
245
257
  npm run build
246
- npm test # 66 tests (unit + integration)
258
+ npm test # 172 tests (unit + integration)
247
259
  npm run dev # watch mode
248
260
  ```
249
261
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=code-graph.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-graph.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-graph.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseRelevantFiles, parseSymbols, getRepoMapAsync } from '../code-graph.js';
3
+ describe('getRepoMapAsync', () => {
4
+ it('returns empty string when .code-graph/index.db does not exist', async () => {
5
+ const result = await getRepoMapAsync('/tmp/nonexistent-repo-xyz');
6
+ expect(result).toBe('');
7
+ });
8
+ it('returns a string (resolves without throwing) for valid path without db', async () => {
9
+ // Even if the CLI fails, should resolve — never reject
10
+ const result = await getRepoMapAsync('/tmp');
11
+ expect(typeof result).toBe('string');
12
+ });
13
+ });
14
+ describe('parseRelevantFiles', () => {
15
+ it('extracts file paths from code-graph output', () => {
16
+ const raw = `
17
+ Results for "context broker":
18
+ src/broker/broker.ts — ContextBroker class, main pipeline
19
+ src/broker/compressor.ts — budget enforcement
20
+ src/utils/exec.ts — subprocess execution
21
+ `;
22
+ const files = parseRelevantFiles(raw);
23
+ expect(files.length).toBeGreaterThanOrEqual(3);
24
+ expect(files.map(f => f.path)).toContain('src/broker/broker.ts');
25
+ expect(files.map(f => f.path)).toContain('src/broker/compressor.ts');
26
+ });
27
+ it('deduplicates file paths', () => {
28
+ const raw = `
29
+ src/broker/broker.ts — first hit
30
+ src/broker/broker.ts — second hit
31
+ `;
32
+ const files = parseRelevantFiles(raw);
33
+ const paths = files.map(f => f.path);
34
+ expect(new Set(paths).size).toBe(paths.length);
35
+ });
36
+ it('excludes version-like patterns and URLs', () => {
37
+ const raw = `
38
+ v1.2.3/something.ts should be excluded
39
+ https://example.com/file.ts should be excluded
40
+ node_modules/pkg/index.js should be excluded
41
+ src/real/file.ts should be included
42
+ `;
43
+ const files = parseRelevantFiles(raw);
44
+ const paths = files.map(f => f.path);
45
+ expect(paths).toContain('src/real/file.ts');
46
+ expect(paths.some(p => p.includes('node_modules'))).toBe(false);
47
+ });
48
+ it('returns empty array for empty input', () => {
49
+ expect(parseRelevantFiles('')).toEqual([]);
50
+ });
51
+ it('caps at 10 files', () => {
52
+ const lines = Array.from({ length: 20 }, (_, i) => ` src/file${i}/module.ts — hit`);
53
+ const files = parseRelevantFiles(lines.join('\n'));
54
+ expect(files.length).toBeLessThanOrEqual(10);
55
+ });
56
+ it('extracts descriptive reason from structured format', () => {
57
+ const raw = `src/broker/broker.ts — ContextBroker pipeline orchestration
58
+ src/adapters/memory.ts — memory query adapter`;
59
+ const files = parseRelevantFiles(raw);
60
+ expect(files).toHaveLength(2);
61
+ expect(files[0].reason).toBe('ContextBroker pipeline orchestration');
62
+ expect(files[1].reason).toBe('memory query adapter');
63
+ });
64
+ it('falls back to static reason for unstructured paths', () => {
65
+ const raw = `Found in src/utils/exec.ts and src/utils/tokens.ts`;
66
+ const files = parseRelevantFiles(raw);
67
+ expect(files.length).toBeGreaterThan(0);
68
+ expect(files[0].reason).toBe('code-graph search hit');
69
+ });
70
+ });
71
+ describe('parseSymbols', () => {
72
+ it('extracts function and class symbols', () => {
73
+ const raw = `
74
+ function buildContextPack() { ... }
75
+ class ContextBroker { ... }
76
+ interface AgentProvider { ... }
77
+ `;
78
+ const symbols = parseSymbols(raw);
79
+ expect(symbols.map(s => s.name)).toContain('buildContextPack');
80
+ expect(symbols.map(s => s.name)).toContain('ContextBroker');
81
+ expect(symbols.map(s => s.name)).toContain('AgentProvider');
82
+ });
83
+ it('deduplicates symbols by name', () => {
84
+ const raw = `
85
+ function foo() {}
86
+ function foo() {}
87
+ `;
88
+ const symbols = parseSymbols(raw);
89
+ expect(symbols.filter(s => s.name === 'foo').length).toBe(1);
90
+ });
91
+ it('returns empty array for empty input', () => {
92
+ expect(parseSymbols('')).toEqual([]);
93
+ });
94
+ it('caps at 15 symbols', () => {
95
+ const lines = Array.from({ length: 30 }, (_, i) => `function fn${i}() {}`);
96
+ const symbols = parseSymbols(lines.join('\n'));
97
+ expect(symbols.length).toBeLessThanOrEqual(15);
98
+ });
99
+ it('extracts kind correctly', () => {
100
+ const raw = 'class MyClass { }\nfunction myFunc() { }';
101
+ const symbols = parseSymbols(raw);
102
+ const cls = symbols.find(s => s.name === 'MyClass');
103
+ const fn = symbols.find(s => s.name === 'myFunc');
104
+ expect(cls?.kind).toBe('class');
105
+ expect(fn?.kind).toBe('function');
106
+ });
107
+ it('extracts file association from structured format', () => {
108
+ const raw = `function parseQuery in src/broker/query-parser.ts
109
+ class ContextBroker in src/broker/broker.ts`;
110
+ const symbols = parseSymbols(raw);
111
+ expect(symbols).toHaveLength(2);
112
+ expect(symbols[0].name).toBe('parseQuery');
113
+ expect(symbols[0].file).toBe('src/broker/query-parser.ts');
114
+ expect(symbols[1].name).toBe('ContextBroker');
115
+ expect(symbols[1].file).toBe('src/broker/broker.ts');
116
+ });
117
+ });
118
+ //# sourceMappingURL=code-graph.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-graph.test.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-graph.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/memory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,168 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ // Mock exec functions before importing the module under test
3
+ vi.mock('../../utils/exec.js', () => ({
4
+ execSafe: vi.fn(),
5
+ execSafeAsync: vi.fn(),
6
+ }));
7
+ // Mock truncateToTokenBudget to pass-through
8
+ vi.mock('../../utils/tokens.js', () => ({
9
+ truncateToTokenBudget: vi.fn((raw, _budget) => raw),
10
+ }));
11
+ import { queryMemory } from '../memory.js';
12
+ import { execSafeAsync } from '../../utils/exec.js';
13
+ const mockExecSafeAsync = vi.mocked(execSafeAsync);
14
+ function makeParsed(overrides = {}) {
15
+ return {
16
+ filePaths: [],
17
+ symbols: ['processPayment'],
18
+ keywords: ['payment', 'refund'],
19
+ intent: 'general',
20
+ isActionOnly: false,
21
+ ...overrides,
22
+ };
23
+ }
24
+ function okResult(stdout) {
25
+ return { stdout, ok: true };
26
+ }
27
+ const EMPTY_RESULT = { stdout: '', ok: false };
28
+ describe('queryMemory', () => {
29
+ beforeEach(() => {
30
+ vi.clearAllMocks();
31
+ // Default: all execSafe calls return empty
32
+ mockExecSafeAsync.mockResolvedValue(EMPTY_RESULT);
33
+ });
34
+ describe('implement stage — searches both bugfix AND decision types', () => {
35
+ it('calls execSafe for both types when stage is implement', async () => {
36
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [bugfix] Fix timeout\nBody'));
37
+ await queryMemory(makeParsed(), 600, 'implement');
38
+ // getSearchTypes('implement') returns ['bugfix', 'decision']
39
+ // We expect two typed search calls (bugfix, decision)
40
+ // Since 'bugfix' IS in types, no extra bugfix call
41
+ const calls = mockExecSafeAsync.mock.calls;
42
+ expect(calls).toHaveLength(2);
43
+ // First call: --type bugfix
44
+ expect(calls[0][1]).toContain('--type');
45
+ expect(calls[0][1]).toContain('bugfix');
46
+ // Second call: --type decision
47
+ expect(calls[1][1]).toContain('--type');
48
+ expect(calls[1][1]).toContain('decision');
49
+ });
50
+ it('includes results from both typed searches', async () => {
51
+ mockExecSafeAsync
52
+ .mockResolvedValueOnce(okResult('#1 [bugfix] Fix timeout\nTimeout body'))
53
+ .mockResolvedValueOnce(okResult('#2 [decision] Use retry\nRetry body'));
54
+ const result = await queryMemory(makeParsed(), 600, 'implement');
55
+ // Both results should be present in raw output
56
+ expect(result.raw).toContain('Fix timeout');
57
+ expect(result.raw).toContain('Use retry');
58
+ // bugWarnings and memories should be separated correctly
59
+ expect(result.bugWarnings).toHaveLength(1);
60
+ expect(result.bugWarnings[0].title).toBe('Fix timeout');
61
+ expect(result.memories).toHaveLength(1);
62
+ expect(result.memories[0].title).toBe('Use retry');
63
+ });
64
+ });
65
+ describe('debug stage — searches both bugfix AND discovery types', () => {
66
+ it('calls execSafe for both types when stage is debug', async () => {
67
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [bugfix] Some bug\nBody'));
68
+ await queryMemory(makeParsed(), 600, 'debug');
69
+ // getSearchTypes('debug') returns ['bugfix', 'discovery']
70
+ // Since 'bugfix' IS in types, no extra bugfix call
71
+ const calls = mockExecSafeAsync.mock.calls;
72
+ expect(calls).toHaveLength(2);
73
+ expect(calls[0][1]).toContain('bugfix');
74
+ expect(calls[1][1]).toContain('discovery');
75
+ });
76
+ });
77
+ describe('brainstorm stage — bugfix search still runs even if not in types', () => {
78
+ it('searches typed searches + extra bugfix for brainstorm', async () => {
79
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [decision] Arch choice\nBody'));
80
+ await queryMemory(makeParsed(), 600, 'brainstorm');
81
+ // getSearchTypes('brainstorm') returns ['decision', 'discovery']
82
+ // bugfix NOT in types, so extra bugfix call should be made
83
+ const calls = mockExecSafeAsync.mock.calls;
84
+ expect(calls).toHaveLength(3);
85
+ // First two: typed searches for decision, discovery
86
+ expect(calls[0][1]).toContain('decision');
87
+ expect(calls[1][1]).toContain('discovery');
88
+ // Third: extra bugfix search
89
+ expect(calls[2][1]).toContain('bugfix');
90
+ expect(calls[2][1]).toContain('--limit');
91
+ expect(calls[2][1]).toContain('3');
92
+ });
93
+ });
94
+ describe('empty searchQuery returns early without calling execSafe', () => {
95
+ it('returns empty result when no symbols or keywords', async () => {
96
+ const parsed = makeParsed({ symbols: [], keywords: [] });
97
+ const result = await queryMemory(parsed, 600, 'implement');
98
+ expect(result.memories).toHaveLength(0);
99
+ expect(result.bugWarnings).toHaveLength(0);
100
+ expect(result.raw).toBe('');
101
+ expect(mockExecSafeAsync).not.toHaveBeenCalled();
102
+ });
103
+ });
104
+ describe('general stage (no types) — untyped search + bugfix', () => {
105
+ it('does untyped search when types are empty', async () => {
106
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [semantic] General info\nBody'));
107
+ await queryMemory(makeParsed(), 600, 'general');
108
+ // getSearchTypes('general') returns []
109
+ // So: 1 untyped search + 1 bugfix search = 2 calls
110
+ const calls = mockExecSafeAsync.mock.calls;
111
+ expect(calls).toHaveLength(2);
112
+ // First: untyped (no --type flag), --limit 8
113
+ expect(calls[0][1]).not.toContain('--type');
114
+ expect(calls[0][1]).toContain('--limit');
115
+ expect(calls[0][1]).toContain('8');
116
+ // Second: bugfix search
117
+ expect(calls[1][1]).toContain('--type');
118
+ expect(calls[1][1]).toContain('bugfix');
119
+ });
120
+ });
121
+ describe('timeout constraints', () => {
122
+ it('passes 800ms timeout to every execSafe call', async () => {
123
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [bugfix] X\nY'));
124
+ await queryMemory(makeParsed(), 600, 'implement');
125
+ for (const call of mockExecSafeAsync.mock.calls) {
126
+ expect(call[2]).toEqual({ timeout: 800 });
127
+ }
128
+ });
129
+ });
130
+ describe('single parallel batch — all calls issued at once', () => {
131
+ it('handles all search types in a single parallel batch', async () => {
132
+ const { queryMemory } = await import('../memory.js');
133
+ const parsed = {
134
+ symbols: ['processPayment'],
135
+ keywords: ['payment'],
136
+ filePaths: [],
137
+ intent: 'debug',
138
+ impliedStage: undefined,
139
+ isActionOnly: false,
140
+ };
141
+ // implement stage includes bugfix — no extra bugfix search needed
142
+ const result = await queryMemory(parsed, 600, 'implement');
143
+ expect(result).toBeDefined();
144
+ expect(result.memories).toBeDefined();
145
+ expect(result.bugWarnings).toBeDefined();
146
+ });
147
+ });
148
+ describe('types cap at 2 typed searches', () => {
149
+ it('only searches first 2 types for plan stage (which has 3 types)', async () => {
150
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [decision] D\nBody'));
151
+ await queryMemory(makeParsed(), 600, 'plan');
152
+ // getSearchTypes('plan') returns ['decision', 'discovery', 'task']
153
+ // Cap at 2 typed searches: decision, discovery
154
+ // bugfix NOT in types, so extra bugfix call
155
+ // Total: 3 calls
156
+ const calls = mockExecSafeAsync.mock.calls;
157
+ expect(calls).toHaveLength(3);
158
+ expect(calls[0][1]).toContain('decision');
159
+ expect(calls[1][1]).toContain('discovery');
160
+ // Third is bugfix, NOT 'task'
161
+ expect(calls[2][1]).toContain('bugfix');
162
+ // Verify 'task' was NOT searched
163
+ const allTypeArgs = calls.flatMap((c) => c[1]);
164
+ expect(allTypeArgs).not.toContain('task');
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=memory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.test.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/memory.test.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,17 @@ export interface CodeGraphResult {
9
9
  /**
10
10
  * Query Code Graph MCP via CLI.
11
11
  * Selects the right command based on intent.
12
- * Async signature retained for call-site .catch() compatibility and future async conversion.
12
+ * Uses async exec for truly non-blocking subprocess calls.
13
13
  */
14
14
  export declare function queryCodeGraph(parsed: ParsedQuery, tokenBudget: number, repoRoot: string): Promise<CodeGraphResult>;
15
15
  /**
16
16
  * Get repo map summary via code-graph-mcp map.
17
17
  */
18
18
  export declare function getRepoMap(repoRoot: string, timeout?: number): string;
19
+ /**
20
+ * Async version of getRepoMap — non-blocking.
21
+ */
22
+ export declare function getRepoMapAsync(repoRoot: string, timeout?: number): Promise<string>;
23
+ export declare function parseRelevantFiles(raw: string): RelevantFile[];
24
+ export declare function parseSymbols(raw: string): SymbolInfo[];
19
25
  //# sourceMappingURL=code-graph.d.ts.map
@@ -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;AAUD;;;;GAIG;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"}
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;;;;GAIG;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;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAKvF;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CA8B9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CA8BtD"}
@@ -1,17 +1,17 @@
1
- import { execSafe } from '../utils/exec.js';
1
+ import { execSafe, execSafeAsync } 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
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 });
6
+ /** Async CLI call — truly non-blocking, for use in Promise.allSettled. */
7
+ async function cgAsync(args, repoRoot, timeout = 2000) {
8
+ const { stdout, ok } = await execSafeAsync(CG, args, { cwd: repoRoot, timeout });
9
9
  return ok ? stdout : '';
10
10
  }
11
11
  /**
12
12
  * Query Code Graph MCP via CLI.
13
13
  * Selects the right command based on intent.
14
- * Async signature retained for call-site .catch() compatibility and future async conversion.
14
+ * Uses async exec for truly non-blocking subprocess calls.
15
15
  */
16
16
  export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
17
17
  const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
@@ -31,36 +31,36 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
31
31
  switch (intent) {
32
32
  case 'impact': {
33
33
  if (symbols.length > 0) {
34
- result.raw = cg(['impact', symbols[0]], repoRoot);
34
+ result.raw = await cgAsync(['impact', symbols[0]], repoRoot);
35
35
  }
36
36
  break;
37
37
  }
38
38
  case 'understand': {
39
39
  if (filePaths.length > 0) {
40
- const dir = filePaths[0].replace(/\/[^/]+$/, '/');
41
- result.raw = cg(['overview', dir], repoRoot);
40
+ const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
41
+ result.raw = await cgAsync(['overview', dir], repoRoot);
42
42
  }
43
43
  else if (searchQuery) {
44
- result.raw = cg(['search', searchQuery, '--limit', '8'], repoRoot);
44
+ result.raw = await cgAsync(['search', searchQuery, '--limit', '8'], repoRoot);
45
45
  }
46
46
  break;
47
47
  }
48
48
  case 'callgraph': {
49
49
  if (symbols.length > 0) {
50
- result.raw = cg(['callgraph', symbols[0], '--depth', '2'], repoRoot);
50
+ result.raw = await cgAsync(['callgraph', symbols[0], '--depth', '2'], repoRoot);
51
51
  }
52
52
  break;
53
53
  }
54
54
  case 'implement': {
55
55
  const results = [];
56
56
  if (searchQuery) {
57
- const r = cg(['search', searchQuery, '--limit', '5'], repoRoot);
57
+ const r = await cgAsync(['search', searchQuery, '--limit', '5'], repoRoot);
58
58
  if (r)
59
59
  results.push(r);
60
60
  }
61
61
  if (filePaths.length > 0) {
62
- const dir = filePaths[0].replace(/\/[^/]+$/, '/');
63
- const r = cg(['overview', dir], repoRoot);
62
+ const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
63
+ const r = await cgAsync(['overview', dir], repoRoot);
64
64
  if (r)
65
65
  results.push(r);
66
66
  }
@@ -72,11 +72,11 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
72
72
  case 'general':
73
73
  default: {
74
74
  if (searchQuery) {
75
- result.raw = cg(['search', searchQuery, '--limit', '8'], repoRoot);
75
+ result.raw = await cgAsync(['search', searchQuery, '--limit', '8'], repoRoot);
76
76
  }
77
77
  else if (filePaths.length > 0) {
78
- const dir = filePaths[0].replace(/\/[^/]+$/, '/');
79
- result.raw = cg(['overview', dir], repoRoot);
78
+ const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
79
+ result.raw = await cgAsync(['overview', dir], repoRoot);
80
80
  }
81
81
  break;
82
82
  }
@@ -98,36 +98,72 @@ export function getRepoMap(repoRoot, timeout = 3000) {
98
98
  const { stdout } = execSafe(CG, ['map'], { cwd: repoRoot, timeout });
99
99
  return stdout;
100
100
  }
101
+ /**
102
+ * Async version of getRepoMap — non-blocking.
103
+ */
104
+ export async function getRepoMapAsync(repoRoot, timeout = 3000) {
105
+ const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
106
+ if (!fs.existsSync(dbPath))
107
+ return '';
108
+ const { stdout } = await execSafeAsync(CG, ['map'], { cwd: repoRoot, timeout });
109
+ return stdout;
110
+ }
101
111
  // --- Parsers for code-graph CLI output ---
102
- function parseRelevantFiles(raw) {
112
+ export function parseRelevantFiles(raw) {
103
113
  if (!raw)
104
114
  return [];
105
115
  const files = [];
106
- const fileMatches = raw.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\.\w+)/gm) || [];
107
116
  const seen = new Set();
108
- for (const match of fileMatches) {
109
- const p = match.trim().replace(/^\.\//, '');
110
- if (seen.has(p) || !p.includes('/'))
117
+ const excludePattern = /^v?\d+\.\d+|^https?:|^node_modules\//;
118
+ for (const line of raw.split('\n')) {
119
+ // Try structured format: "path — description" or "path - description"
120
+ const structured = line.match(/^\s*(\.?\/?\w[\w/.-]*\/[\w.-]+\.\w{1,10})\s*[—–-]\s*(.+)/);
121
+ if (structured) {
122
+ const p = structured[1].replace(/^\.\//, '');
123
+ if (!seen.has(p) && !excludePattern.test(p)) {
124
+ seen.add(p);
125
+ files.push({ path: p, reason: structured[2].trim() });
126
+ }
111
127
  continue;
112
- seen.add(p);
113
- files.push({ path: p, reason: 'code-graph search hit' });
128
+ }
129
+ // Fallback: extract bare file paths from the line
130
+ const pathMatches = line.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\/[\w.-]+\.\w{1,10})/g) || [];
131
+ for (const match of pathMatches) {
132
+ const p = match.trim().replace(/^\.\//, '');
133
+ if (!seen.has(p) && !excludePattern.test(p)) {
134
+ seen.add(p);
135
+ files.push({ path: p, reason: 'code-graph search hit' });
136
+ }
137
+ }
114
138
  }
115
139
  return files.slice(0, 10);
116
140
  }
117
- function parseSymbols(raw) {
141
+ export function parseSymbols(raw) {
118
142
  if (!raw)
119
143
  return [];
120
144
  const symbols = [];
121
- const symMatches = raw.match(/(?:fn|function|struct|class|impl|trait|interface|type|const|enum)\s+(\w+)/g) || [];
122
145
  const seen = new Set();
123
- for (const match of symMatches) {
124
- const parts = match.split(/\s+/);
125
- const kind = parts[0];
126
- const name = parts[1];
127
- if (!name || seen.has(name))
128
- continue;
129
- seen.add(name);
130
- symbols.push({ name, kind, file: '' });
146
+ // Try structured: "kind name in path"
147
+ const structuredRe = /(?:fn|function|struct|class|impl|trait|interface|type|const|enum)\s+(\w+)\s+in\s+([\w/.-]+)/g;
148
+ let match;
149
+ while ((match = structuredRe.exec(raw)) !== null) {
150
+ const name = match[1];
151
+ const file = match[2] || '';
152
+ if (name && !seen.has(name)) {
153
+ seen.add(name);
154
+ const kind = match[0].split(/\s+/)[0];
155
+ symbols.push({ name, kind, file });
156
+ }
157
+ }
158
+ // Fallback: bare keyword extraction
159
+ const bareRe = /(?:fn|function|struct|class|impl|trait|interface|type|const|enum)\s+(\w+)/g;
160
+ while ((match = bareRe.exec(raw)) !== null) {
161
+ const kind = match[0].split(/\s+/)[0];
162
+ const name = match[1];
163
+ if (name && !seen.has(name)) {
164
+ seen.add(name);
165
+ symbols.push({ name, kind, file: '' });
166
+ }
131
167
  }
132
168
  return symbols.slice(0, 15);
133
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"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"}