@sdsrs/codeagent 0.2.0 → 0.3.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 (163) 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 +83 -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 +150 -0
  10. package/dist/adapters/__tests__/memory.test.js.map +1 -0
  11. package/dist/adapters/code-graph.d.ts +3 -0
  12. package/dist/adapters/code-graph.d.ts.map +1 -1
  13. package/dist/adapters/code-graph.js +23 -19
  14. package/dist/adapters/code-graph.js.map +1 -1
  15. package/dist/adapters/memory.d.ts +1 -0
  16. package/dist/adapters/memory.d.ts.map +1 -1
  17. package/dist/adapters/memory.js +12 -7
  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 +1 -1
  30. package/dist/adapters/orchestration/superpowers.js.map +1 -1
  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 +125 -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 +145 -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 +0 -0
  44. package/dist/broker/broker.d.ts.map +1 -1
  45. package/dist/broker/broker.js +21 -14
  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 +35 -1
  50. package/dist/broker/compressor.js.map +1 -1
  51. package/dist/broker/context-pack.d.ts +0 -0
  52. package/dist/broker/context-pack.d.ts.map +0 -0
  53. package/dist/broker/context-pack.js +0 -0
  54. package/dist/broker/context-pack.js.map +0 -0
  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 +1 -1
  58. package/dist/broker/query-parser.js.map +1 -1
  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 +19 -4
  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 -4
  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 +10 -5
  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 +1 -1
  85. package/dist/cli/tui/renderer.js +4 -1
  86. package/dist/cli/tui/renderer.js.map +1 -1
  87. package/dist/hooks/post-compact.d.ts +0 -0
  88. package/dist/hooks/post-compact.d.ts.map +0 -0
  89. package/dist/hooks/post-compact.js +1 -1
  90. package/dist/hooks/post-compact.js.map +1 -1
  91. package/dist/hooks/session-start.d.ts +0 -0
  92. package/dist/hooks/session-start.d.ts.map +0 -0
  93. package/dist/hooks/session-start.js +2 -1
  94. package/dist/hooks/session-start.js.map +1 -1
  95. package/dist/hooks/stop.d.ts +0 -0
  96. package/dist/hooks/stop.d.ts.map +0 -0
  97. package/dist/hooks/stop.js +1 -1
  98. package/dist/hooks/stop.js.map +1 -1
  99. package/dist/hooks/user-prompt.d.ts +0 -0
  100. package/dist/hooks/user-prompt.d.ts.map +0 -0
  101. package/dist/hooks/user-prompt.js +1 -1
  102. package/dist/hooks/user-prompt.js.map +1 -1
  103. package/dist/providers/__tests__/anthropic-api.test.d.ts +2 -0
  104. package/dist/providers/__tests__/anthropic-api.test.d.ts.map +1 -0
  105. package/dist/providers/__tests__/anthropic-api.test.js +113 -0
  106. package/dist/providers/__tests__/anthropic-api.test.js.map +1 -0
  107. package/dist/providers/__tests__/claude-sdk.test.d.ts +2 -0
  108. package/dist/providers/__tests__/claude-sdk.test.d.ts.map +1 -0
  109. package/dist/providers/__tests__/claude-sdk.test.js +121 -0
  110. package/dist/providers/__tests__/claude-sdk.test.js.map +1 -0
  111. package/dist/providers/anthropic-api.d.ts +1 -0
  112. package/dist/providers/anthropic-api.d.ts.map +1 -1
  113. package/dist/providers/anthropic-api.js +16 -4
  114. package/dist/providers/anthropic-api.js.map +1 -1
  115. package/dist/providers/claude-cli.d.ts +0 -0
  116. package/dist/providers/claude-cli.d.ts.map +0 -0
  117. package/dist/providers/claude-cli.js +0 -0
  118. package/dist/providers/claude-cli.js.map +0 -0
  119. package/dist/providers/claude-sdk.d.ts +0 -0
  120. package/dist/providers/claude-sdk.d.ts.map +0 -0
  121. package/dist/providers/claude-sdk.js +2 -2
  122. package/dist/providers/claude-sdk.js.map +1 -1
  123. package/dist/providers/interface.d.ts +1 -0
  124. package/dist/providers/interface.d.ts.map +1 -1
  125. package/dist/providers/interface.js +0 -0
  126. package/dist/providers/interface.js.map +0 -0
  127. package/dist/scripts/install-hooks.d.ts +2 -2
  128. package/dist/scripts/install-hooks.d.ts.map +0 -0
  129. package/dist/scripts/install-hooks.js +6 -9
  130. package/dist/scripts/install-hooks.js.map +1 -1
  131. package/dist/session/__tests__/manager.test.d.ts +2 -0
  132. package/dist/session/__tests__/manager.test.d.ts.map +1 -0
  133. package/dist/session/__tests__/manager.test.js +108 -0
  134. package/dist/session/__tests__/manager.test.js.map +1 -0
  135. package/dist/session/manager.d.ts +0 -0
  136. package/dist/session/manager.d.ts.map +1 -1
  137. package/dist/session/manager.js +3 -2
  138. package/dist/session/manager.js.map +1 -1
  139. package/dist/session/schema.d.ts +0 -0
  140. package/dist/session/schema.d.ts.map +1 -1
  141. package/dist/session/schema.js +14 -6
  142. package/dist/session/schema.js.map +1 -1
  143. package/dist/utils/__tests__/exec.test.d.ts +2 -0
  144. package/dist/utils/__tests__/exec.test.d.ts.map +1 -0
  145. package/dist/utils/__tests__/exec.test.js +104 -0
  146. package/dist/utils/__tests__/exec.test.js.map +1 -0
  147. package/dist/utils/__tests__/tokens.test.d.ts +2 -0
  148. package/dist/utils/__tests__/tokens.test.d.ts.map +1 -0
  149. package/dist/utils/__tests__/tokens.test.js +64 -0
  150. package/dist/utils/__tests__/tokens.test.js.map +1 -0
  151. package/dist/utils/exec.d.ts +16 -0
  152. package/dist/utils/exec.d.ts.map +1 -1
  153. package/dist/utils/exec.js +33 -3
  154. package/dist/utils/exec.js.map +1 -1
  155. package/dist/utils/tokens.d.ts +0 -0
  156. package/dist/utils/tokens.d.ts.map +1 -1
  157. package/dist/utils/tokens.js +2 -0
  158. package/dist/utils/tokens.js.map +1 -1
  159. package/package.json +3 -2
  160. package/src/skills/brainstorm.md +0 -0
  161. package/src/skills/remember.md +0 -0
  162. package/src/skills/review.md +0 -0
  163. 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,83 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseRelevantFiles, parseSymbols } from '../code-graph.js';
3
+ describe('parseRelevantFiles', () => {
4
+ it('extracts file paths from code-graph output', () => {
5
+ const raw = `
6
+ Results for "context broker":
7
+ src/broker/broker.ts — ContextBroker class, main pipeline
8
+ src/broker/compressor.ts — budget enforcement
9
+ src/utils/exec.ts — subprocess execution
10
+ `;
11
+ const files = parseRelevantFiles(raw);
12
+ expect(files.length).toBeGreaterThanOrEqual(3);
13
+ expect(files.map(f => f.path)).toContain('src/broker/broker.ts');
14
+ expect(files.map(f => f.path)).toContain('src/broker/compressor.ts');
15
+ });
16
+ it('deduplicates file paths', () => {
17
+ const raw = `
18
+ src/broker/broker.ts — first hit
19
+ src/broker/broker.ts — second hit
20
+ `;
21
+ const files = parseRelevantFiles(raw);
22
+ const paths = files.map(f => f.path);
23
+ expect(new Set(paths).size).toBe(paths.length);
24
+ });
25
+ it('excludes version-like patterns and URLs', () => {
26
+ const raw = `
27
+ v1.2.3/something.ts should be excluded
28
+ https://example.com/file.ts should be excluded
29
+ node_modules/pkg/index.js should be excluded
30
+ src/real/file.ts should be included
31
+ `;
32
+ const files = parseRelevantFiles(raw);
33
+ const paths = files.map(f => f.path);
34
+ expect(paths).toContain('src/real/file.ts');
35
+ expect(paths.some(p => p.includes('node_modules'))).toBe(false);
36
+ });
37
+ it('returns empty array for empty input', () => {
38
+ expect(parseRelevantFiles('')).toEqual([]);
39
+ });
40
+ it('caps at 10 files', () => {
41
+ const lines = Array.from({ length: 20 }, (_, i) => ` src/file${i}/module.ts — hit`);
42
+ const files = parseRelevantFiles(lines.join('\n'));
43
+ expect(files.length).toBeLessThanOrEqual(10);
44
+ });
45
+ });
46
+ describe('parseSymbols', () => {
47
+ it('extracts function and class symbols', () => {
48
+ const raw = `
49
+ function buildContextPack() { ... }
50
+ class ContextBroker { ... }
51
+ interface AgentProvider { ... }
52
+ `;
53
+ const symbols = parseSymbols(raw);
54
+ expect(symbols.map(s => s.name)).toContain('buildContextPack');
55
+ expect(symbols.map(s => s.name)).toContain('ContextBroker');
56
+ expect(symbols.map(s => s.name)).toContain('AgentProvider');
57
+ });
58
+ it('deduplicates symbols by name', () => {
59
+ const raw = `
60
+ function foo() {}
61
+ function foo() {}
62
+ `;
63
+ const symbols = parseSymbols(raw);
64
+ expect(symbols.filter(s => s.name === 'foo').length).toBe(1);
65
+ });
66
+ it('returns empty array for empty input', () => {
67
+ expect(parseSymbols('')).toEqual([]);
68
+ });
69
+ it('caps at 15 symbols', () => {
70
+ const lines = Array.from({ length: 30 }, (_, i) => `function fn${i}() {}`);
71
+ const symbols = parseSymbols(lines.join('\n'));
72
+ expect(symbols.length).toBeLessThanOrEqual(15);
73
+ });
74
+ it('extracts kind correctly', () => {
75
+ const raw = 'class MyClass { }\nfunction myFunc() { }';
76
+ const symbols = parseSymbols(raw);
77
+ const cls = symbols.find(s => s.name === 'MyClass');
78
+ const fn = symbols.find(s => s.name === 'myFunc');
79
+ expect(cls?.kind).toBe('class');
80
+ expect(fn?.kind).toBe('function');
81
+ });
82
+ });
83
+ //# 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,150 @@
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('types cap at 2 typed searches', () => {
131
+ it('only searches first 2 types for plan stage (which has 3 types)', async () => {
132
+ mockExecSafeAsync.mockResolvedValue(okResult('#1 [decision] D\nBody'));
133
+ await queryMemory(makeParsed(), 600, 'plan');
134
+ // getSearchTypes('plan') returns ['decision', 'discovery', 'task']
135
+ // Cap at 2 typed searches: decision, discovery
136
+ // bugfix NOT in types, so extra bugfix call
137
+ // Total: 3 calls
138
+ const calls = mockExecSafeAsync.mock.calls;
139
+ expect(calls).toHaveLength(3);
140
+ expect(calls[0][1]).toContain('decision');
141
+ expect(calls[1][1]).toContain('discovery');
142
+ // Third is bugfix, NOT 'task'
143
+ expect(calls[2][1]).toContain('bugfix');
144
+ // Verify 'task' was NOT searched
145
+ const allTypeArgs = calls.flatMap((c) => c[1]);
146
+ expect(allTypeArgs).not.toContain('task');
147
+ });
148
+ });
149
+ });
150
+ //# 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,10 +9,13 @@ export interface CodeGraphResult {
9
9
  /**
10
10
  * Query Code Graph MCP via CLI.
11
11
  * Selects the right command based on intent.
12
+ * Uses async exec for truly non-blocking subprocess calls.
12
13
  */
13
14
  export declare function queryCodeGraph(parsed: ParsedQuery, tokenBudget: number, repoRoot: string): Promise<CodeGraphResult>;
14
15
  /**
15
16
  * Get repo map summary via code-graph-mcp map.
16
17
  */
17
18
  export declare function getRepoMap(repoRoot: string, timeout?: number): string;
19
+ export declare function parseRelevantFiles(raw: string): RelevantFile[];
20
+ export declare function parseSymbols(raw: string): SymbolInfo[];
18
21
  //# 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;;;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"}
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;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAe9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAetD"}
@@ -1,16 +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
+ * Uses async exec for truly non-blocking subprocess calls.
14
15
  */
15
16
  export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
16
17
  const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
@@ -30,36 +31,36 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
30
31
  switch (intent) {
31
32
  case 'impact': {
32
33
  if (symbols.length > 0) {
33
- result.raw = cg(['impact', symbols[0]], repoRoot);
34
+ result.raw = await cgAsync(['impact', symbols[0]], repoRoot);
34
35
  }
35
36
  break;
36
37
  }
37
38
  case 'understand': {
38
39
  if (filePaths.length > 0) {
39
- const dir = filePaths[0].replace(/\/[^/]+$/, '/');
40
- result.raw = cg(['overview', dir], repoRoot);
40
+ const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
41
+ result.raw = await cgAsync(['overview', dir], repoRoot);
41
42
  }
42
43
  else if (searchQuery) {
43
- result.raw = cg(['search', searchQuery, '--limit', '8'], repoRoot);
44
+ result.raw = await cgAsync(['search', searchQuery, '--limit', '8'], repoRoot);
44
45
  }
45
46
  break;
46
47
  }
47
48
  case 'callgraph': {
48
49
  if (symbols.length > 0) {
49
- result.raw = cg(['callgraph', symbols[0], '--depth', '2'], repoRoot);
50
+ result.raw = await cgAsync(['callgraph', symbols[0], '--depth', '2'], repoRoot);
50
51
  }
51
52
  break;
52
53
  }
53
54
  case 'implement': {
54
55
  const results = [];
55
56
  if (searchQuery) {
56
- const r = cg(['search', searchQuery, '--limit', '5'], repoRoot);
57
+ const r = await cgAsync(['search', searchQuery, '--limit', '5'], repoRoot);
57
58
  if (r)
58
59
  results.push(r);
59
60
  }
60
61
  if (filePaths.length > 0) {
61
- const dir = filePaths[0].replace(/\/[^/]+$/, '/');
62
- const r = cg(['overview', dir], repoRoot);
62
+ const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
63
+ const r = await cgAsync(['overview', dir], repoRoot);
63
64
  if (r)
64
65
  results.push(r);
65
66
  }
@@ -71,11 +72,11 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
71
72
  case 'general':
72
73
  default: {
73
74
  if (searchQuery) {
74
- result.raw = cg(['search', searchQuery, '--limit', '8'], repoRoot);
75
+ result.raw = await cgAsync(['search', searchQuery, '--limit', '8'], repoRoot);
75
76
  }
76
77
  else if (filePaths.length > 0) {
77
- const dir = filePaths[0].replace(/\/[^/]+$/, '/');
78
- result.raw = cg(['overview', dir], repoRoot);
78
+ const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
79
+ result.raw = await cgAsync(['overview', dir], repoRoot);
79
80
  }
80
81
  break;
81
82
  }
@@ -98,22 +99,25 @@ export function getRepoMap(repoRoot, timeout = 3000) {
98
99
  return stdout;
99
100
  }
100
101
  // --- Parsers for code-graph CLI output ---
101
- function parseRelevantFiles(raw) {
102
+ export function parseRelevantFiles(raw) {
102
103
  if (!raw)
103
104
  return [];
104
105
  const files = [];
105
- const fileMatches = raw.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\.\w+)/gm) || [];
106
+ // Match file paths with directory separators and common source extensions
107
+ const fileMatches = raw.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\/[\w.-]+\.\w{1,10})/gm) || [];
106
108
  const seen = new Set();
109
+ // Exclude version-like patterns (e.g., releases/v1.2.3) and URLs
110
+ const excludePattern = /^v?\d+\.\d+|^https?:|^node_modules\//;
107
111
  for (const match of fileMatches) {
108
112
  const p = match.trim().replace(/^\.\//, '');
109
- if (seen.has(p) || !p.includes('/'))
113
+ if (seen.has(p) || excludePattern.test(p))
110
114
  continue;
111
115
  seen.add(p);
112
116
  files.push({ path: p, reason: 'code-graph search hit' });
113
117
  }
114
118
  return files.slice(0, 10);
115
119
  }
116
- function parseSymbols(raw) {
120
+ export function parseSymbols(raw) {
117
121
  if (!raw)
118
122
  return [];
119
123
  const symbols = [];
@@ -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,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAE5B,8CAA8C;AAC9C,SAAS,EAAE,CAAC,IAAc,EAAE,QAAgB,EAAE,OAAO,GAAG,IAAI;IAC1D,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,WAAmB,EACnB,QAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAoB;QAC9B,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,EAAE;QAClB,GAAG,EAAE,EAAE;KACR,CAAC;IAEF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACxD,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpE,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACpD,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAClD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACrE,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACvE,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAChE,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAClD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,OAAO,CAAC,CAAC,CAAC;YACR,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACrE,CAAC;iBAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAClD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEjD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAO,GAAG,IAAI;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4CAA4C;AAE5C,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,IAAI,EAAE,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,UAAU,GACd,GAAG,CAAC,KAAK,CAAC,4EAA4E,CAAC,IAAI,EAAE,CAAC;IAChG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export interface MemoryResult {
7
7
  }
8
8
  /**
9
9
  * Query memory engine via claude-mem-lite CLI.
10
+ * Uses async exec for truly non-blocking subprocess calls.
10
11
  */
11
12
  export declare function queryMemory(parsed: ParsedQuery, tokenBudget: number, stage?: Stage): Promise<MemoryResult>;
12
13
  //# 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;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"}
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;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,YAAY,CAAC,CA0CvB"}
@@ -1,4 +1,4 @@
1
- import { execSafe } from '../utils/exec.js';
1
+ import { execSafeAsync } from '../utils/exec.js';
2
2
  import { truncateToTokenBudget } from '../utils/tokens.js';
3
3
  const MEM = 'claude-mem-lite';
4
4
  function getSearchTypes(stage) {
@@ -13,6 +13,7 @@ function getSearchTypes(stage) {
13
13
  }
14
14
  /**
15
15
  * Query memory engine via claude-mem-lite CLI.
16
+ * Uses async exec for truly non-blocking subprocess calls.
16
17
  */
17
18
  export async function queryMemory(parsed, tokenBudget, stage) {
18
19
  const result = { memories: [], bugWarnings: [], raw: '' };
@@ -21,20 +22,24 @@ export async function queryMemory(parsed, tokenBudget, stage) {
21
22
  return result;
22
23
  const types = getSearchTypes(stage);
23
24
  const allRaw = [];
25
+ // Timeouts kept tight (800ms each, max 3 calls) to stay within 3s hook budget
24
26
  if (types.length === 0) {
25
- const { stdout, ok } = execSafe(MEM, ['search', searchQuery, '--limit', '8'], { timeout: 2000 });
27
+ const { stdout, ok } = await execSafeAsync(MEM, ['search', searchQuery, '--limit', '8'], { timeout: 800 });
26
28
  if (ok && stdout)
27
29
  allRaw.push(stdout);
28
30
  }
29
31
  else {
30
- for (const type of types.slice(0, 2)) {
31
- const { stdout, ok } = execSafe(MEM, ['search', searchQuery, '--type', type, '--limit', '5'], { timeout: 2000 });
32
- if (ok && stdout)
33
- allRaw.push(stdout);
32
+ // Search types in parallel (cap at 2 typed searches to stay within budget)
33
+ const typeResults = await Promise.allSettled(types.slice(0, 2).map(type => execSafeAsync(MEM, ['search', searchQuery, '--type', type, '--limit', '5'], { timeout: 800 })));
34
+ for (const r of typeResults) {
35
+ if (r.status === 'fulfilled' && r.value.ok && r.value.stdout) {
36
+ allRaw.push(r.value.stdout);
37
+ }
34
38
  }
35
39
  }
40
+ // Always ensure bugfix search runs (if not already in types)
36
41
  if (!types.includes('bugfix')) {
37
- const { stdout, ok } = execSafe(MEM, ['search', searchQuery, '--type', 'bugfix', '--limit', '3'], { timeout: 2000 });
42
+ const { stdout, ok } = await execSafeAsync(MEM, ['search', searchQuery, '--type', 'bugfix', '--limit', '3'], { timeout: 800 });
38
43
  if (ok && stdout)
39
44
  allRaw.push(stdout);
40
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"gsd.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/gsd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA2BtF;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,oBAAoB;IACrD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAO;gBAE/B,QAAQ,EAAE,MAAM;IAI5B,OAAO,CAAC,YAAY;YAIN,SAAS;IAiBjB,eAAe,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMxC,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAU5C,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAQxC,YAAY,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAIlE,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,IAAI,MAAM;IAIvB,kBAAkB,IAAI,KAAK,EAAE;CAG9B"}
1
+ {"version":3,"file":"gsd.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/gsd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA2BtF;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,oBAAoB;IACrD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAO;gBAE/B,QAAQ,EAAE,MAAM;IAI5B,OAAO,CAAC,YAAY;YAIN,SAAS;IAuBjB,eAAe,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMxC,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAU5C,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAQxC,YAAY,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAIlE,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,IAAI,MAAM;IAIvB,kBAAkB,IAAI,KAAK,EAAE;CAG9B"}
@@ -31,7 +31,13 @@ export class GsdAdapter {
31
31
  }
32
32
  try {
33
33
  const raw = await fs.readFile(this.getStatePath(), 'utf8');
34
- this.cachedState = JSON.parse(raw);
34
+ const parsed = JSON.parse(raw);
35
+ if (!isValidGsdState(parsed)) {
36
+ this.cachedState = null;
37
+ this.cacheTime = Date.now();
38
+ return null;
39
+ }
40
+ this.cachedState = parsed;
35
41
  this.cacheTime = Date.now();
36
42
  return this.cachedState;
37
43
  }
@@ -78,4 +84,15 @@ export class GsdAdapter {
78
84
  return ['brainstorm', 'plan', 'implement', 'review', 'debug'];
79
85
  }
80
86
  }
87
+ /** Basic shape guard — rejects obviously malformed state.json */
88
+ function isValidGsdState(val) {
89
+ if (typeof val !== 'object' || val === null || Array.isArray(val))
90
+ return false;
91
+ const obj = val;
92
+ if (obj.phase !== undefined && typeof obj.phase !== 'string')
93
+ return false;
94
+ if (obj.tasks !== undefined && !Array.isArray(obj.tasks))
95
+ return false;
96
+ return true;
97
+ }
81
98
  //# sourceMappingURL=gsd.js.map