@sdsrs/codeagent 0.2.1 → 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 -1
  12. package/dist/adapters/code-graph.d.ts.map +1 -1
  13. package/dist/adapters/code-graph.js +23 -20
  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 +12 -8
  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 +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 +17 -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 +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/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 +0 -0
  98. package/dist/hooks/stop.js.map +0 -0
  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 +0 -0
  102. package/dist/hooks/user-prompt.js.map +0 -0
  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 +12 -6
  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 +0 -0
  122. package/dist/providers/claude-sdk.js.map +0 -0
  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 +2 -1
  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 +2 -1
  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 +0 -0
  157. package/dist/utils/tokens.js +0 -0
  158. package/dist/utils/tokens.js.map +0 -0
  159. package/package.json +1 -1
  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
@@ -0,0 +1,104 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { execSafe, execQuiet, execSafeAsync, execQuietAsync } from '../exec.js';
3
+ describe('execSafe', () => {
4
+ it('runs a command and returns stdout', () => {
5
+ const result = execSafe('echo', ['hello world']);
6
+ expect(result.ok).toBe(true);
7
+ expect(result.stdout).toBe('hello world');
8
+ });
9
+ it('returns ok:false for nonexistent command', () => {
10
+ const result = execSafe('nonexistent-command-xyz', ['arg']);
11
+ expect(result.ok).toBe(false);
12
+ expect(result.stdout).toBe('');
13
+ });
14
+ it('returns ok:false for command that exits non-zero', () => {
15
+ const result = execSafe('node', ['-e', 'process.exit(1)']);
16
+ expect(result.ok).toBe(false);
17
+ });
18
+ it('returns ok:false on timeout', () => {
19
+ const result = execSafe('node', ['-e', 'setTimeout(()=>{},5000)'], { timeout: 200 });
20
+ expect(result.ok).toBe(false);
21
+ });
22
+ it('trims stdout whitespace', () => {
23
+ const result = execSafe('echo', [' trimmed ']);
24
+ expect(result.ok).toBe(true);
25
+ expect(result.stdout).toBe('trimmed');
26
+ });
27
+ it('does not interpret shell metacharacters', () => {
28
+ // With execFileSync, shell metacharacters are passed as literal args
29
+ const result = execSafe('echo', ['$(whoami)', '&&', 'echo', 'injected']);
30
+ expect(result.ok).toBe(true);
31
+ // Should output the literal string, not execute the command
32
+ expect(result.stdout).toContain('$(whoami)');
33
+ expect(result.stdout).toContain('&&');
34
+ });
35
+ it('handles args with spaces correctly', () => {
36
+ const result = execSafe('echo', ['hello world', 'foo bar']);
37
+ expect(result.ok).toBe(true);
38
+ expect(result.stdout).toBe('hello world foo bar');
39
+ });
40
+ it('respects cwd option', () => {
41
+ const result = execSafe('pwd', [], { cwd: '/tmp' });
42
+ expect(result.ok).toBe(true);
43
+ // On some systems /tmp is a symlink, so just check it resolves
44
+ expect(result.stdout).toContain('tmp');
45
+ });
46
+ });
47
+ describe('execQuiet', () => {
48
+ it('returns stdout on success', () => {
49
+ expect(execQuiet('echo', ['hi'])).toBe('hi');
50
+ });
51
+ it('returns empty string on failure', () => {
52
+ expect(execQuiet('nonexistent-xyz', [])).toBe('');
53
+ });
54
+ });
55
+ describe('execSafeAsync', () => {
56
+ it('runs a command and returns stdout', async () => {
57
+ const result = await execSafeAsync('echo', ['hello world']);
58
+ expect(result.ok).toBe(true);
59
+ expect(result.stdout).toBe('hello world');
60
+ });
61
+ it('returns ok:false for nonexistent command', async () => {
62
+ const result = await execSafeAsync('nonexistent-command-xyz', ['arg']);
63
+ expect(result.ok).toBe(false);
64
+ expect(result.stdout).toBe('');
65
+ });
66
+ it('returns ok:false for command that exits non-zero', async () => {
67
+ const result = await execSafeAsync('node', ['-e', 'process.exit(1)']);
68
+ expect(result.ok).toBe(false);
69
+ });
70
+ it('returns ok:false on timeout', async () => {
71
+ const result = await execSafeAsync('node', ['-e', 'setTimeout(()=>{},5000)'], { timeout: 200 });
72
+ expect(result.ok).toBe(false);
73
+ });
74
+ it('trims stdout whitespace', async () => {
75
+ const result = await execSafeAsync('echo', [' trimmed ']);
76
+ expect(result.ok).toBe(true);
77
+ expect(result.stdout).toBe('trimmed');
78
+ });
79
+ it('does not interpret shell metacharacters', async () => {
80
+ const result = await execSafeAsync('echo', ['$(whoami)', '&&', 'echo', 'injected']);
81
+ expect(result.ok).toBe(true);
82
+ expect(result.stdout).toContain('$(whoami)');
83
+ expect(result.stdout).toContain('&&');
84
+ });
85
+ it('handles args with spaces correctly', async () => {
86
+ const result = await execSafeAsync('echo', ['hello world', 'foo bar']);
87
+ expect(result.ok).toBe(true);
88
+ expect(result.stdout).toBe('hello world foo bar');
89
+ });
90
+ it('respects cwd option', async () => {
91
+ const result = await execSafeAsync('pwd', [], { cwd: '/tmp' });
92
+ expect(result.ok).toBe(true);
93
+ expect(result.stdout).toContain('tmp');
94
+ });
95
+ });
96
+ describe('execQuietAsync', () => {
97
+ it('returns stdout on success', async () => {
98
+ expect(await execQuietAsync('echo', ['hi'])).toBe('hi');
99
+ });
100
+ it('returns empty string on failure', async () => {
101
+ expect(await execQuietAsync('nonexistent-xyz', [])).toBe('');
102
+ });
103
+ });
104
+ //# sourceMappingURL=exec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/exec.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tokens.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/tokens.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { estimateTokens, truncateToTokenBudget } from '../tokens.js';
3
+ describe('estimateTokens', () => {
4
+ it('returns 0 for empty string', () => {
5
+ expect(estimateTokens('')).toBe(0);
6
+ });
7
+ it('estimates ASCII text at ~4 chars per token', () => {
8
+ const text = 'hello world'; // 11 chars → ~3 tokens
9
+ const tokens = estimateTokens(text);
10
+ expect(tokens).toBeGreaterThan(0);
11
+ expect(tokens).toBeLessThan(10);
12
+ });
13
+ it('estimates CJK text at ~2 chars per token', () => {
14
+ const cjk = '你好世界测试'; // 6 CJK chars → ~3 tokens
15
+ const ascii = 'abcdef'; // 6 ASCII chars → ~2 tokens
16
+ expect(estimateTokens(cjk)).toBeGreaterThan(estimateTokens(ascii));
17
+ });
18
+ it('handles mixed CJK and ASCII', () => {
19
+ const mixed = 'hello 你好 world';
20
+ const tokens = estimateTokens(mixed);
21
+ expect(tokens).toBeGreaterThan(0);
22
+ });
23
+ it('handles code with special characters', () => {
24
+ const code = 'function foo(x: string): boolean { return x.length > 0; }';
25
+ const tokens = estimateTokens(code);
26
+ expect(tokens).toBeGreaterThan(5);
27
+ expect(tokens).toBeLessThan(50);
28
+ });
29
+ });
30
+ describe('truncateToTokenBudget', () => {
31
+ it('returns text unchanged if within budget', () => {
32
+ const text = 'short text';
33
+ expect(truncateToTokenBudget(text, 100)).toBe(text);
34
+ });
35
+ it('truncates text exceeding budget', () => {
36
+ const lines = Array.from({ length: 100 }, (_, i) => `This is line number ${i} with some content`);
37
+ const text = lines.join('\n');
38
+ const truncated = truncateToTokenBudget(text, 20);
39
+ expect(truncated.length).toBeLessThan(text.length);
40
+ });
41
+ it('truncates at line boundaries', () => {
42
+ const text = 'line one\nline two\nline three\nline four\nline five';
43
+ const truncated = truncateToTokenBudget(text, 5);
44
+ // Should be shorter than original
45
+ expect(truncated.length).toBeLessThan(text.length);
46
+ // Each line should be a complete "line X" — no mid-word cuts
47
+ const lines = truncated.split('\n');
48
+ for (const line of lines) {
49
+ expect(line).toMatch(/^line \w+$/);
50
+ }
51
+ });
52
+ it('handles single very long line', () => {
53
+ const text = 'a'.repeat(10000);
54
+ const truncated = truncateToTokenBudget(text, 10);
55
+ expect(truncated.length).toBeLessThan(text.length);
56
+ expect(truncated).toContain('...');
57
+ });
58
+ it('returns empty string for zero budget', () => {
59
+ const result = truncateToTokenBudget('some text', 0);
60
+ // Zero budget → truncated to nothing or first line truncated
61
+ expect(result.length).toBeLessThanOrEqual('some text'.length);
62
+ });
63
+ });
64
+ //# sourceMappingURL=tokens.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/tokens.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export interface ExecResult {
2
2
  stdout: string;
3
3
  ok: boolean;
4
+ stderr?: string;
4
5
  }
5
6
  /**
6
7
  * Execute a command with timeout and error handling.
@@ -18,4 +19,19 @@ export declare function execQuiet(cmd: string, args: string[], opts?: {
18
19
  cwd?: string;
19
20
  timeout?: number;
20
21
  }): string;
22
+ /**
23
+ * Async version of execSafe — truly non-blocking.
24
+ * Uses child_process.execFile (no shell) to prevent injection.
25
+ */
26
+ export declare function execSafeAsync(cmd: string, args: string[], opts?: {
27
+ cwd?: string;
28
+ timeout?: number;
29
+ }): Promise<ExecResult>;
30
+ /**
31
+ * Async version of execQuiet.
32
+ */
33
+ export declare function execQuietAsync(cmd: string, args: string[], opts?: {
34
+ cwd?: string;
35
+ timeout?: number;
36
+ }): Promise<string>;
21
37
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,UAAU,CAcZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,MAAM,CAER"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,UAAU,CAeZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -1,4 +1,4 @@
1
- import { execFileSync } from 'node:child_process';
1
+ import { execFile, execFileSync } from 'node:child_process';
2
2
  /**
3
3
  * Execute a command with timeout and error handling.
4
4
  * Uses execFileSync (no shell) to prevent command injection.
@@ -16,8 +16,9 @@ export function execSafe(cmd, args, opts = {}) {
16
16
  });
17
17
  return { stdout: stdout.trim(), ok: true };
18
18
  }
19
- catch {
20
- return { stdout: '', ok: false };
19
+ catch (err) {
20
+ const stderr = err?.stderr;
21
+ return { stdout: '', ok: false, stderr: stderr ? String(stderr).trim() : undefined };
21
22
  }
22
23
  }
23
24
  /**
@@ -26,4 +27,33 @@ export function execSafe(cmd, args, opts = {}) {
26
27
  export function execQuiet(cmd, args, opts = {}) {
27
28
  return execSafe(cmd, args, opts).stdout;
28
29
  }
30
+ /**
31
+ * Async version of execSafe — truly non-blocking.
32
+ * Uses child_process.execFile (no shell) to prevent injection.
33
+ */
34
+ export function execSafeAsync(cmd, args, opts = {}) {
35
+ const { cwd = process.cwd(), timeout = 3000 } = opts;
36
+ return new Promise((resolve) => {
37
+ execFile(cmd, args, {
38
+ cwd,
39
+ timeout,
40
+ encoding: 'utf8',
41
+ maxBuffer: 1024 * 1024,
42
+ }, (err, stdout, stderr) => {
43
+ if (err) {
44
+ resolve({ stdout: '', ok: false, stderr: stderr ? String(stderr).trim() : undefined });
45
+ }
46
+ else {
47
+ resolve({ stdout: String(stdout).trim(), ok: true });
48
+ }
49
+ });
50
+ });
51
+ }
52
+ /**
53
+ * Async version of execQuiet.
54
+ */
55
+ export async function execQuietAsync(cmd, args, opts = {}) {
56
+ const result = await execSafeAsync(cmd, args, opts);
57
+ return result.stdout;
58
+ }
29
59
  //# sourceMappingURL=exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOlD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAW,EACX,IAAc,EACd,OAA2C,EAAE;IAE7C,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE;YACrC,GAAG;YACH,OAAO;YACP,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,SAAS,EAAE,IAAI,GAAG,IAAI;SACvB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,GAAW,EACX,IAAc,EACd,OAA2C,EAAE;IAE7C,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQ5D;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAW,EACX,IAAc,EACd,OAA2C,EAAE;IAE7C,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE;YACrC,GAAG;YACH,OAAO;YACP,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,SAAS,EAAE,IAAI,GAAG,IAAI;SACvB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,MAAM,GAAI,GAAoC,EAAE,MAAM,CAAC;QAC7D,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACvF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,GAAW,EACX,IAAc,EACd,OAA2C,EAAE;IAE7C,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,IAAc,EACd,OAA2C,EAAE;IAE7C,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,GAAG,EACH,IAAI,EACJ;YACE,GAAG;YACH,OAAO;YACP,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,IAAI,GAAG,IAAI;SACvB,EACD,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtB,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACzF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,IAAc,EACd,OAA2C,EAAE;IAE7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
File without changes
File without changes
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sdsrs/codeagent",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "CodeAgent — Context Broker + CLI for intelligent coding assistance. Integrates code search, memory, and orchestration.",
5
5
  "type": "module",
6
6
  "main": "dist/broker/broker.js",
File without changes
File without changes
File without changes
File without changes