gencode-ai 0.1.0 → 0.1.2

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 (356) hide show
  1. package/.gencode/settings.local.json +7 -0
  2. package/README.md +20 -102
  3. package/dist/agent/agent.d.ts +43 -2
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +90 -17
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/agent/types.d.ts +9 -1
  8. package/dist/agent/types.d.ts.map +1 -1
  9. package/dist/cli/components/AllModelsSelector.d.ts +11 -0
  10. package/dist/cli/components/AllModelsSelector.d.ts.map +1 -0
  11. package/dist/cli/components/AllModelsSelector.js +153 -0
  12. package/dist/cli/components/AllModelsSelector.js.map +1 -0
  13. package/dist/cli/components/App.d.ts +8 -1
  14. package/dist/cli/components/App.d.ts.map +1 -1
  15. package/dist/cli/components/App.js +276 -40
  16. package/dist/cli/components/App.js.map +1 -1
  17. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  18. package/dist/cli/components/CommandSuggestions.js +3 -0
  19. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  20. package/dist/cli/components/Header.d.ts +1 -1
  21. package/dist/cli/components/Header.d.ts.map +1 -1
  22. package/dist/cli/components/Header.js +4 -6
  23. package/dist/cli/components/Header.js.map +1 -1
  24. package/dist/cli/components/Logo.d.ts +1 -0
  25. package/dist/cli/components/Logo.d.ts.map +1 -1
  26. package/dist/cli/components/Logo.js +16 -3
  27. package/dist/cli/components/Logo.js.map +1 -1
  28. package/dist/cli/components/Messages.d.ts +17 -3
  29. package/dist/cli/components/Messages.d.ts.map +1 -1
  30. package/dist/cli/components/Messages.js +70 -18
  31. package/dist/cli/components/Messages.js.map +1 -1
  32. package/dist/cli/components/ModelSelector.d.ts +7 -7
  33. package/dist/cli/components/ModelSelector.d.ts.map +1 -1
  34. package/dist/cli/components/ModelSelector.js +116 -33
  35. package/dist/cli/components/ModelSelector.js.map +1 -1
  36. package/dist/cli/components/PermissionPrompt.d.ts +60 -0
  37. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
  38. package/dist/cli/components/PermissionPrompt.js +192 -0
  39. package/dist/cli/components/PermissionPrompt.js.map +1 -0
  40. package/dist/cli/components/ProviderManager.d.ts +8 -0
  41. package/dist/cli/components/ProviderManager.d.ts.map +1 -0
  42. package/dist/cli/components/ProviderManager.js +280 -0
  43. package/dist/cli/components/ProviderManager.js.map +1 -0
  44. package/dist/cli/components/Spinner.d.ts +7 -2
  45. package/dist/cli/components/Spinner.d.ts.map +1 -1
  46. package/dist/cli/components/Spinner.js +116 -25
  47. package/dist/cli/components/Spinner.js.map +1 -1
  48. package/dist/cli/components/TodoList.d.ts +7 -0
  49. package/dist/cli/components/TodoList.d.ts.map +1 -0
  50. package/dist/cli/components/TodoList.js +34 -0
  51. package/dist/cli/components/TodoList.js.map +1 -0
  52. package/dist/cli/components/index.d.ts +1 -0
  53. package/dist/cli/components/index.d.ts.map +1 -1
  54. package/dist/cli/components/index.js +1 -0
  55. package/dist/cli/components/index.js.map +1 -1
  56. package/dist/cli/components/markdown.d.ts +9 -0
  57. package/dist/cli/components/markdown.d.ts.map +1 -0
  58. package/dist/cli/components/markdown.js +129 -0
  59. package/dist/cli/components/markdown.js.map +1 -0
  60. package/dist/cli/components/theme.d.ts +5 -0
  61. package/dist/cli/components/theme.d.ts.map +1 -1
  62. package/dist/cli/components/theme.js +7 -0
  63. package/dist/cli/components/theme.js.map +1 -1
  64. package/dist/cli/index.js +66 -12
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/config/index.d.ts +14 -4
  67. package/dist/config/index.d.ts.map +1 -1
  68. package/dist/config/index.js +19 -3
  69. package/dist/config/index.js.map +1 -1
  70. package/dist/config/levels.d.ts +49 -0
  71. package/dist/config/levels.d.ts.map +1 -0
  72. package/dist/config/levels.js +222 -0
  73. package/dist/config/levels.js.map +1 -0
  74. package/dist/config/loader.d.ts +46 -0
  75. package/dist/config/loader.d.ts.map +1 -0
  76. package/dist/config/loader.js +153 -0
  77. package/dist/config/loader.js.map +1 -0
  78. package/dist/config/manager.d.ts +115 -15
  79. package/dist/config/manager.d.ts.map +1 -1
  80. package/dist/config/manager.js +260 -34
  81. package/dist/config/manager.js.map +1 -1
  82. package/dist/config/manager.test.d.ts +5 -0
  83. package/dist/config/manager.test.d.ts.map +1 -0
  84. package/dist/config/manager.test.js +192 -0
  85. package/dist/config/manager.test.js.map +1 -0
  86. package/dist/config/merger.d.ts +56 -0
  87. package/dist/config/merger.d.ts.map +1 -0
  88. package/dist/config/merger.js +177 -0
  89. package/dist/config/merger.js.map +1 -0
  90. package/dist/config/providers-config.d.ts +28 -0
  91. package/dist/config/providers-config.d.ts.map +1 -0
  92. package/dist/config/providers-config.js +79 -0
  93. package/dist/config/providers-config.js.map +1 -0
  94. package/dist/config/test-utils.d.ts +24 -0
  95. package/dist/config/test-utils.d.ts.map +1 -0
  96. package/dist/config/test-utils.js +55 -0
  97. package/dist/config/test-utils.js.map +1 -0
  98. package/dist/config/types.d.ts +108 -9
  99. package/dist/config/types.d.ts.map +1 -1
  100. package/dist/config/types.js +53 -2
  101. package/dist/config/types.js.map +1 -1
  102. package/dist/memory/import-resolver.d.ts +46 -0
  103. package/dist/memory/import-resolver.d.ts.map +1 -0
  104. package/dist/memory/import-resolver.js +117 -0
  105. package/dist/memory/import-resolver.js.map +1 -0
  106. package/dist/memory/index.d.ts +7 -6
  107. package/dist/memory/index.d.ts.map +1 -1
  108. package/dist/memory/index.js +7 -5
  109. package/dist/memory/index.js.map +1 -1
  110. package/dist/memory/init-prompt.d.ts +22 -0
  111. package/dist/memory/init-prompt.d.ts.map +1 -0
  112. package/dist/memory/init-prompt.js +103 -0
  113. package/dist/memory/init-prompt.js.map +1 -0
  114. package/dist/memory/memory-manager.d.ts +119 -0
  115. package/dist/memory/memory-manager.d.ts.map +1 -0
  116. package/dist/memory/memory-manager.js +587 -0
  117. package/dist/memory/memory-manager.js.map +1 -0
  118. package/dist/memory/rules-parser.d.ts +38 -0
  119. package/dist/memory/rules-parser.d.ts.map +1 -0
  120. package/dist/memory/rules-parser.js +69 -0
  121. package/dist/memory/rules-parser.js.map +1 -0
  122. package/dist/memory/test-utils.d.ts +20 -0
  123. package/dist/memory/test-utils.d.ts.map +1 -0
  124. package/dist/memory/test-utils.js +44 -0
  125. package/dist/memory/test-utils.js.map +1 -0
  126. package/dist/memory/types.d.ts +70 -63
  127. package/dist/memory/types.d.ts.map +1 -1
  128. package/dist/memory/types.js +42 -2
  129. package/dist/memory/types.js.map +1 -1
  130. package/dist/permissions/audit.d.ts +82 -0
  131. package/dist/permissions/audit.d.ts.map +1 -0
  132. package/dist/permissions/audit.js +229 -0
  133. package/dist/permissions/audit.js.map +1 -0
  134. package/dist/permissions/index.d.ts +11 -1
  135. package/dist/permissions/index.d.ts.map +1 -1
  136. package/dist/permissions/index.js +15 -0
  137. package/dist/permissions/index.js.map +1 -1
  138. package/dist/permissions/manager.d.ts +149 -13
  139. package/dist/permissions/manager.d.ts.map +1 -1
  140. package/dist/permissions/manager.js +480 -35
  141. package/dist/permissions/manager.js.map +1 -1
  142. package/dist/permissions/manager.test.d.ts +5 -0
  143. package/dist/permissions/manager.test.d.ts.map +1 -0
  144. package/dist/permissions/manager.test.js +213 -0
  145. package/dist/permissions/manager.test.js.map +1 -0
  146. package/dist/permissions/persistence.d.ts +74 -0
  147. package/dist/permissions/persistence.d.ts.map +1 -0
  148. package/dist/permissions/persistence.js +248 -0
  149. package/dist/permissions/persistence.js.map +1 -0
  150. package/dist/permissions/persistence.test.d.ts +5 -0
  151. package/dist/permissions/persistence.test.d.ts.map +1 -0
  152. package/dist/permissions/persistence.test.js +171 -0
  153. package/dist/permissions/persistence.test.js.map +1 -0
  154. package/dist/permissions/prompt-matcher.d.ts +64 -0
  155. package/dist/permissions/prompt-matcher.d.ts.map +1 -0
  156. package/dist/permissions/prompt-matcher.js +415 -0
  157. package/dist/permissions/prompt-matcher.js.map +1 -0
  158. package/dist/permissions/prompt-matcher.test.d.ts +5 -0
  159. package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
  160. package/dist/permissions/prompt-matcher.test.js +107 -0
  161. package/dist/permissions/prompt-matcher.test.js.map +1 -0
  162. package/dist/permissions/types.d.ts +157 -0
  163. package/dist/permissions/types.d.ts.map +1 -1
  164. package/dist/permissions/types.js +43 -8
  165. package/dist/permissions/types.js.map +1 -1
  166. package/dist/prompts/index.d.ts +92 -0
  167. package/dist/prompts/index.d.ts.map +1 -0
  168. package/dist/prompts/index.js +241 -0
  169. package/dist/prompts/index.js.map +1 -0
  170. package/dist/providers/gemini.d.ts.map +1 -1
  171. package/dist/providers/gemini.js +14 -3
  172. package/dist/providers/gemini.js.map +1 -1
  173. package/dist/providers/index.d.ts +5 -3
  174. package/dist/providers/index.d.ts.map +1 -1
  175. package/dist/providers/index.js +13 -1
  176. package/dist/providers/index.js.map +1 -1
  177. package/dist/providers/registry.d.ts +66 -0
  178. package/dist/providers/registry.d.ts.map +1 -0
  179. package/dist/providers/registry.js +158 -0
  180. package/dist/providers/registry.js.map +1 -0
  181. package/dist/providers/search/brave.d.ts +14 -0
  182. package/dist/providers/search/brave.d.ts.map +1 -0
  183. package/dist/providers/search/brave.js +87 -0
  184. package/dist/providers/search/brave.js.map +1 -0
  185. package/dist/providers/search/exa.d.ts +12 -0
  186. package/dist/providers/search/exa.d.ts.map +1 -0
  187. package/dist/providers/search/exa.js +158 -0
  188. package/dist/providers/search/exa.js.map +1 -0
  189. package/dist/providers/search/index.d.ts +31 -0
  190. package/dist/providers/search/index.d.ts.map +1 -0
  191. package/dist/providers/search/index.js +75 -0
  192. package/dist/providers/search/index.js.map +1 -0
  193. package/dist/providers/search/serper.d.ts +14 -0
  194. package/dist/providers/search/serper.d.ts.map +1 -0
  195. package/dist/providers/search/serper.js +87 -0
  196. package/dist/providers/search/serper.js.map +1 -0
  197. package/dist/providers/search/types.d.ts +21 -0
  198. package/dist/providers/search/types.d.ts.map +1 -0
  199. package/dist/providers/search/types.js +5 -0
  200. package/dist/providers/search/types.js.map +1 -0
  201. package/dist/providers/store.d.ts +104 -0
  202. package/dist/providers/store.d.ts.map +1 -0
  203. package/dist/providers/store.js +171 -0
  204. package/dist/providers/store.js.map +1 -0
  205. package/dist/providers/types.d.ts +7 -1
  206. package/dist/providers/types.d.ts.map +1 -1
  207. package/dist/providers/vertex-ai.d.ts +33 -0
  208. package/dist/providers/vertex-ai.d.ts.map +1 -0
  209. package/dist/providers/vertex-ai.js +407 -0
  210. package/dist/providers/vertex-ai.js.map +1 -0
  211. package/dist/tools/builtin/bash.d.ts.map +1 -1
  212. package/dist/tools/builtin/bash.js +2 -1
  213. package/dist/tools/builtin/bash.js.map +1 -1
  214. package/dist/tools/builtin/edit.d.ts.map +1 -1
  215. package/dist/tools/builtin/edit.js +2 -1
  216. package/dist/tools/builtin/edit.js.map +1 -1
  217. package/dist/tools/builtin/glob.d.ts.map +1 -1
  218. package/dist/tools/builtin/glob.js +2 -1
  219. package/dist/tools/builtin/glob.js.map +1 -1
  220. package/dist/tools/builtin/grep.d.ts.map +1 -1
  221. package/dist/tools/builtin/grep.js +2 -1
  222. package/dist/tools/builtin/grep.js.map +1 -1
  223. package/dist/tools/builtin/read.d.ts.map +1 -1
  224. package/dist/tools/builtin/read.js +2 -1
  225. package/dist/tools/builtin/read.js.map +1 -1
  226. package/dist/tools/builtin/todowrite.d.ts +15 -0
  227. package/dist/tools/builtin/todowrite.d.ts.map +1 -0
  228. package/dist/tools/builtin/todowrite.js +88 -0
  229. package/dist/tools/builtin/todowrite.js.map +1 -0
  230. package/dist/tools/builtin/webfetch.d.ts +20 -0
  231. package/dist/tools/builtin/webfetch.d.ts.map +1 -0
  232. package/dist/tools/builtin/webfetch.js +228 -0
  233. package/dist/tools/builtin/webfetch.js.map +1 -0
  234. package/dist/tools/builtin/websearch.d.ts +17 -0
  235. package/dist/tools/builtin/websearch.d.ts.map +1 -0
  236. package/dist/tools/builtin/websearch.js +87 -0
  237. package/dist/tools/builtin/websearch.js.map +1 -0
  238. package/dist/tools/builtin/write.d.ts.map +1 -1
  239. package/dist/tools/builtin/write.js +2 -1
  240. package/dist/tools/builtin/write.js.map +1 -1
  241. package/dist/tools/index.d.ts +18 -0
  242. package/dist/tools/index.d.ts.map +1 -1
  243. package/dist/tools/index.js +28 -2
  244. package/dist/tools/index.js.map +1 -1
  245. package/dist/tools/types.d.ts +41 -0
  246. package/dist/tools/types.d.ts.map +1 -1
  247. package/dist/tools/types.js +16 -0
  248. package/dist/tools/types.js.map +1 -1
  249. package/dist/tools/utils/ssrf.d.ts +18 -0
  250. package/dist/tools/utils/ssrf.d.ts.map +1 -0
  251. package/dist/tools/utils/ssrf.js +70 -0
  252. package/dist/tools/utils/ssrf.js.map +1 -0
  253. package/docs/README.md +5 -4
  254. package/docs/config-system-comparison.md +707 -0
  255. package/docs/memory-system.md +238 -0
  256. package/docs/permissions.md +368 -0
  257. package/docs/proposals/0001-web-fetch-tool.md +32 -2
  258. package/docs/proposals/0002-web-search-tool.md +59 -2
  259. package/docs/proposals/0005-todo-system.md +350 -85
  260. package/docs/proposals/0006-memory-system.md +11 -10
  261. package/docs/proposals/0012-ask-user-question.md +941 -206
  262. package/docs/proposals/0023-permission-enhancements.md +61 -2
  263. package/docs/proposals/0041-configuration-system.md +587 -0
  264. package/docs/proposals/0042-prompt-optimization.md +866 -0
  265. package/docs/proposals/README.md +8 -6
  266. package/docs/providers.md +220 -0
  267. package/jest.config.js +26 -0
  268. package/package.json +14 -3
  269. package/src/agent/agent.ts +120 -18
  270. package/src/agent/types.ts +9 -1
  271. package/src/cli/components/App.tsx +369 -47
  272. package/src/cli/components/CommandSuggestions.tsx +3 -0
  273. package/src/cli/components/Header.tsx +11 -17
  274. package/src/cli/components/Logo.tsx +76 -9
  275. package/src/cli/components/Messages.tsx +146 -38
  276. package/src/cli/components/ModelSelector.tsx +169 -52
  277. package/src/cli/components/PermissionPrompt.tsx +388 -0
  278. package/src/cli/components/ProviderManager.tsx +534 -0
  279. package/src/cli/components/Spinner.tsx +138 -25
  280. package/src/cli/components/TodoList.tsx +54 -0
  281. package/src/cli/components/index.ts +6 -0
  282. package/src/cli/components/markdown.ts +157 -0
  283. package/src/cli/components/theme.ts +7 -0
  284. package/src/cli/index.tsx +76 -13
  285. package/src/config/index.ts +79 -4
  286. package/src/config/levels.test.ts +163 -0
  287. package/src/config/levels.ts +285 -0
  288. package/src/config/loader.test.ts +120 -0
  289. package/src/config/loader.ts +178 -0
  290. package/src/config/manager.test.ts +215 -0
  291. package/src/config/manager.ts +328 -40
  292. package/src/config/merger.test.ts +360 -0
  293. package/src/config/merger.ts +221 -0
  294. package/src/config/providers-config.ts +85 -0
  295. package/src/config/test-utils.ts +79 -0
  296. package/src/config/types.ts +186 -9
  297. package/src/memory/import-resolver.test.ts +117 -0
  298. package/src/memory/import-resolver.ts +149 -0
  299. package/src/memory/index.ts +11 -0
  300. package/src/memory/init-prompt.ts +113 -0
  301. package/src/memory/memory-manager.test.ts +198 -0
  302. package/src/memory/memory-manager.ts +716 -0
  303. package/src/memory/rules-parser.test.ts +182 -0
  304. package/src/memory/rules-parser.ts +82 -0
  305. package/src/memory/test-utils.ts +60 -0
  306. package/src/memory/types.ts +119 -0
  307. package/src/permissions/audit.ts +284 -0
  308. package/src/permissions/index.ts +20 -1
  309. package/src/permissions/manager.test.ts +260 -0
  310. package/src/permissions/manager.ts +592 -40
  311. package/src/permissions/persistence.test.ts +220 -0
  312. package/src/permissions/persistence.ts +301 -0
  313. package/src/permissions/prompt-matcher.test.ts +213 -0
  314. package/src/permissions/prompt-matcher.ts +472 -0
  315. package/src/permissions/types.ts +236 -8
  316. package/src/prompts/index.test.ts +279 -0
  317. package/src/prompts/index.ts +306 -0
  318. package/src/prompts/system/anthropic.txt +29 -0
  319. package/src/prompts/system/base.txt +124 -0
  320. package/src/prompts/system/gemini.txt +35 -0
  321. package/src/prompts/system/generic.txt +128 -0
  322. package/src/prompts/system/openai.txt +29 -0
  323. package/src/prompts/tools/bash.txt +60 -0
  324. package/src/prompts/tools/edit.txt +29 -0
  325. package/src/prompts/tools/glob.txt +35 -0
  326. package/src/prompts/tools/grep.txt +43 -0
  327. package/src/prompts/tools/read.txt +22 -0
  328. package/src/prompts/tools/todowrite.txt +71 -0
  329. package/src/prompts/tools/webfetch.txt +34 -0
  330. package/src/prompts/tools/websearch.txt +41 -0
  331. package/src/prompts/tools/write.txt +23 -0
  332. package/src/providers/gemini.ts +20 -4
  333. package/src/providers/index.ts +18 -3
  334. package/src/providers/registry.ts +198 -0
  335. package/src/providers/search/brave.ts +132 -0
  336. package/src/providers/search/exa.ts +217 -0
  337. package/src/providers/search/index.ts +79 -0
  338. package/src/providers/search/serper.ts +133 -0
  339. package/src/providers/search/types.ts +24 -0
  340. package/src/providers/store.ts +216 -0
  341. package/src/providers/types.ts +9 -1
  342. package/src/providers/vertex-ai.ts +594 -0
  343. package/src/tools/builtin/bash.ts +2 -1
  344. package/src/tools/builtin/edit.ts +2 -1
  345. package/src/tools/builtin/glob.ts +2 -1
  346. package/src/tools/builtin/grep.ts +2 -1
  347. package/src/tools/builtin/read.ts +2 -1
  348. package/src/tools/builtin/todowrite.ts +102 -0
  349. package/src/tools/builtin/webfetch.ts +261 -0
  350. package/src/tools/builtin/websearch.ts +103 -0
  351. package/src/tools/builtin/write.ts +2 -1
  352. package/src/tools/index.ts +28 -2
  353. package/src/tools/types.ts +32 -0
  354. package/src/tools/utils/ssrf.ts +79 -0
  355. package/tsconfig.json +1 -1
  356. package/CLAUDE.md +0 -70
@@ -0,0 +1,192 @@
1
+ /**
2
+ * SettingsManager Tests
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ import { SettingsManager } from './manager.js';
8
+ describe('SettingsManager', () => {
9
+ let tempDir;
10
+ let globalDir;
11
+ let projectDir;
12
+ beforeEach(async () => {
13
+ // Create temp directories for testing
14
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gencode-test-'));
15
+ globalDir = path.join(tempDir, 'global');
16
+ projectDir = path.join(tempDir, 'project');
17
+ await fs.mkdir(globalDir, { recursive: true });
18
+ await fs.mkdir(projectDir, { recursive: true });
19
+ });
20
+ afterEach(async () => {
21
+ // Cleanup temp directories
22
+ await fs.rm(tempDir, { recursive: true, force: true });
23
+ });
24
+ describe('load', () => {
25
+ it('should load settings from a single file', async () => {
26
+ const settingsPath = path.join(globalDir, 'settings.json');
27
+ await fs.writeFile(settingsPath, JSON.stringify({
28
+ model: 'gpt-4o',
29
+ provider: 'openai',
30
+ }));
31
+ const manager = new SettingsManager({
32
+ settingsDir: globalDir,
33
+ cwd: projectDir,
34
+ });
35
+ const settings = await manager.load();
36
+ expect(settings.model).toBe('gpt-4o');
37
+ expect(settings.provider).toBe('openai');
38
+ });
39
+ it('should merge settings from multiple levels', async () => {
40
+ // Global settings
41
+ const globalSettings = path.join(globalDir, 'settings.json');
42
+ await fs.writeFile(globalSettings, JSON.stringify({
43
+ model: 'gpt-4o',
44
+ provider: 'openai',
45
+ }));
46
+ // Project settings directory
47
+ const projectSettingsDir = path.join(projectDir, '.claude');
48
+ await fs.mkdir(projectSettingsDir, { recursive: true });
49
+ // Project settings
50
+ const projectSettings = path.join(projectSettingsDir, 'settings.json');
51
+ await fs.writeFile(projectSettings, JSON.stringify({
52
+ model: 'claude-sonnet',
53
+ }));
54
+ const manager = new SettingsManager({
55
+ settingsDir: globalDir,
56
+ cwd: projectDir,
57
+ });
58
+ const settings = await manager.load();
59
+ // Model should be overridden by project
60
+ expect(settings.model).toBe('claude-sonnet');
61
+ // Provider should be inherited from global
62
+ expect(settings.provider).toBe('openai');
63
+ });
64
+ it('should concatenate array fields (permissions)', async () => {
65
+ // Global settings
66
+ const globalSettings = path.join(globalDir, 'settings.json');
67
+ await fs.writeFile(globalSettings, JSON.stringify({
68
+ permissions: {
69
+ allow: ['Bash(git:*)'],
70
+ },
71
+ }));
72
+ // Project settings directory
73
+ const projectSettingsDir = path.join(projectDir, '.claude');
74
+ await fs.mkdir(projectSettingsDir, { recursive: true });
75
+ // Project local settings
76
+ const projectLocal = path.join(projectSettingsDir, 'settings.local.json');
77
+ await fs.writeFile(projectLocal, JSON.stringify({
78
+ permissions: {
79
+ allow: ['WebSearch'],
80
+ },
81
+ }));
82
+ const manager = new SettingsManager({
83
+ settingsDir: globalDir,
84
+ cwd: projectDir,
85
+ });
86
+ const settings = await manager.load();
87
+ // Arrays should be concatenated
88
+ expect(settings.permissions?.allow).toContain('Bash(git:*)');
89
+ expect(settings.permissions?.allow).toContain('WebSearch');
90
+ expect(settings.permissions?.allow?.length).toBe(2);
91
+ });
92
+ });
93
+ describe('saveToLevel', () => {
94
+ it('should save to global level', async () => {
95
+ const manager = new SettingsManager({
96
+ settingsDir: globalDir,
97
+ cwd: projectDir,
98
+ });
99
+ await manager.saveToLevel({ model: 'test-model' }, 'global');
100
+ const content = await fs.readFile(path.join(globalDir, 'settings.json'), 'utf-8');
101
+ const saved = JSON.parse(content);
102
+ expect(saved.model).toBe('test-model');
103
+ });
104
+ it('should save to project local level', async () => {
105
+ // Create project settings directory
106
+ const projectSettingsDir = path.join(projectDir, '.claude');
107
+ await fs.mkdir(projectSettingsDir, { recursive: true });
108
+ const manager = new SettingsManager({
109
+ settingsDir: globalDir,
110
+ cwd: projectDir,
111
+ });
112
+ await manager.saveToLevel({ model: 'local-model' }, 'local');
113
+ const content = await fs.readFile(path.join(projectSettingsDir, 'settings.local.json'), 'utf-8');
114
+ const saved = JSON.parse(content);
115
+ expect(saved.model).toBe('local-model');
116
+ });
117
+ });
118
+ describe('addPermissionRule', () => {
119
+ it('should add allow rule to local level', async () => {
120
+ // Create project settings directory
121
+ const projectSettingsDir = path.join(projectDir, '.claude');
122
+ await fs.mkdir(projectSettingsDir, { recursive: true });
123
+ const manager = new SettingsManager({
124
+ settingsDir: globalDir,
125
+ cwd: projectDir,
126
+ });
127
+ await manager.addPermissionRule('Bash(npm test:*)', 'allow', 'local');
128
+ const content = await fs.readFile(path.join(projectSettingsDir, 'settings.local.json'), 'utf-8');
129
+ const saved = JSON.parse(content);
130
+ expect(saved.permissions?.allow).toContain('Bash(npm test:*)');
131
+ });
132
+ it('should add deny rule', async () => {
133
+ const manager = new SettingsManager({
134
+ settingsDir: globalDir,
135
+ cwd: projectDir,
136
+ });
137
+ await manager.addPermissionRule('Bash(rm -rf:*)', 'deny', 'global');
138
+ const content = await fs.readFile(path.join(globalDir, 'settings.json'), 'utf-8');
139
+ const saved = JSON.parse(content);
140
+ expect(saved.permissions?.deny).toContain('Bash(rm -rf:*)');
141
+ });
142
+ });
143
+ describe('directory fallback', () => {
144
+ it('should use .claude as primary directory', async () => {
145
+ // Create .claude directory (primary)
146
+ const claudeDir = path.join(projectDir, '.claude');
147
+ await fs.mkdir(claudeDir, { recursive: true });
148
+ // Create settings in .claude
149
+ await fs.writeFile(path.join(claudeDir, 'settings.json'), JSON.stringify({ model: 'claude-model' }));
150
+ // Also create .gencode directory (fallback)
151
+ const gencodeDir = path.join(projectDir, '.gencode');
152
+ await fs.mkdir(gencodeDir, { recursive: true });
153
+ await fs.writeFile(path.join(gencodeDir, 'settings.json'), JSON.stringify({ model: 'gencode-model' }));
154
+ const manager = new SettingsManager({
155
+ settingsDir: globalDir,
156
+ cwd: projectDir,
157
+ });
158
+ const settings = await manager.load();
159
+ // Should use .claude (primary)
160
+ expect(settings.model).toBe('claude-model');
161
+ });
162
+ it('should use .gencode when explicitly created first', async () => {
163
+ // Create .gencode directory first, then .claude (to test priority)
164
+ const gencodeDir = path.join(projectDir, '.gencode');
165
+ await fs.mkdir(gencodeDir, { recursive: true });
166
+ await fs.writeFile(path.join(gencodeDir, 'settings.json'), JSON.stringify({ model: 'gencode-model' }));
167
+ // Now create .claude (primary) with different model
168
+ const claudeDir = path.join(projectDir, '.claude');
169
+ await fs.mkdir(claudeDir, { recursive: true });
170
+ await fs.writeFile(path.join(claudeDir, 'settings.json'), JSON.stringify({ model: 'claude-model' }));
171
+ const manager = new SettingsManager({
172
+ settingsDir: globalDir,
173
+ cwd: projectDir,
174
+ });
175
+ // .claude is primary, so it should be used
176
+ expect(manager.getProjectDir()).toContain('.claude');
177
+ const settings = await manager.load();
178
+ // Should use .claude (primary) over .gencode
179
+ expect(settings.model).toBe('claude-model');
180
+ });
181
+ });
182
+ describe('getCwd', () => {
183
+ it('should return the working directory', () => {
184
+ const manager = new SettingsManager({
185
+ settingsDir: globalDir,
186
+ cwd: projectDir,
187
+ });
188
+ expect(manager.getCwd()).toBe(projectDir);
189
+ });
190
+ });
191
+ });
192
+ //# sourceMappingURL=manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../src/config/manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Configuration Merger - Merge settings from multiple sources
3
+ *
4
+ * Implements the merge strategy:
5
+ * - Scalar values: Higher priority replaces lower
6
+ * - Arrays (permissions.allow, permissions.deny): Concatenate with deduplication
7
+ * - Objects: Deep merge recursively
8
+ * - Managed deny rules: Cannot be overridden by any level
9
+ */
10
+ import type { Settings, ConfigSource, MergedConfig } from './types.js';
11
+ /**
12
+ * Deep merge two objects
13
+ *
14
+ * - Arrays are concatenated and deduplicated
15
+ * - Objects are recursively merged
16
+ * - Scalars from override replace base
17
+ */
18
+ export declare function deepMerge<T extends Record<string, unknown>>(base: T, override: Partial<T>): T;
19
+ /**
20
+ * Merge all configuration sources into a single settings object
21
+ *
22
+ * Sources should be in priority order (lowest first).
23
+ * Each source is merged on top of the previous result.
24
+ */
25
+ export declare function mergeSettings(sources: ConfigSource[]): Settings;
26
+ /**
27
+ * Extract managed deny rules from sources
28
+ *
29
+ * These rules are extracted from managed-level sources and cannot be
30
+ * overridden by any lower-level configuration.
31
+ */
32
+ export declare function extractManagedDeny(sources: ConfigSource[]): string[];
33
+ /**
34
+ * Apply managed restrictions to the merged settings
35
+ *
36
+ * - Ensures managed deny rules are always in the deny list
37
+ * - Removes managed deny patterns from allow list
38
+ */
39
+ export declare function applyManagedRestrictions(settings: Settings, managedDeny: string[]): Settings;
40
+ /**
41
+ * Merge all configuration sources and apply restrictions
42
+ *
43
+ * This is the main entry point for configuration merging.
44
+ */
45
+ export declare function mergeAllSources(sources: ConfigSource[]): MergedConfig;
46
+ /**
47
+ * Merge settings with CLI arguments
48
+ *
49
+ * CLI arguments have the highest priority (except managed restrictions).
50
+ */
51
+ export declare function mergeWithCliArgs(merged: MergedConfig, cliArgs: Partial<Settings>): MergedConfig;
52
+ /**
53
+ * Create a debug summary of the merge process
54
+ */
55
+ export declare function createMergeSummary(merged: MergedConfig): string;
56
+ //# sourceMappingURL=merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/config/merger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;AASxF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GACnB,CAAC,CA8BH;AAoBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,QAAQ,CAQ/D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAapE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,QAAQ,CAqBV;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAerE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GACzB,YAAY,CAoBd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiB/D"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Configuration Merger - Merge settings from multiple sources
3
+ *
4
+ * Implements the merge strategy:
5
+ * - Scalar values: Higher priority replaces lower
6
+ * - Arrays (permissions.allow, permissions.deny): Concatenate with deduplication
7
+ * - Objects: Deep merge recursively
8
+ * - Managed deny rules: Cannot be overridden by any level
9
+ */
10
+ /**
11
+ * Check if a value is a plain object
12
+ */
13
+ function isPlainObject(value) {
14
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
15
+ }
16
+ /**
17
+ * Deep merge two objects
18
+ *
19
+ * - Arrays are concatenated and deduplicated
20
+ * - Objects are recursively merged
21
+ * - Scalars from override replace base
22
+ */
23
+ export function deepMerge(base, override) {
24
+ const result = { ...base };
25
+ for (const key in override) {
26
+ const baseValue = result[key];
27
+ const overrideValue = override[key];
28
+ if (overrideValue === undefined) {
29
+ continue;
30
+ }
31
+ if (isPlainObject(baseValue) && isPlainObject(overrideValue)) {
32
+ // Recursively merge objects
33
+ result[key] = deepMerge(baseValue, overrideValue);
34
+ }
35
+ else if (Array.isArray(baseValue) && Array.isArray(overrideValue)) {
36
+ // Concatenate arrays and deduplicate
37
+ result[key] = deduplicateArray([
38
+ ...baseValue,
39
+ ...overrideValue,
40
+ ]);
41
+ }
42
+ else {
43
+ // Override scalar values
44
+ result[key] = overrideValue;
45
+ }
46
+ }
47
+ return result;
48
+ }
49
+ /**
50
+ * Deduplicate an array while preserving order
51
+ */
52
+ function deduplicateArray(arr) {
53
+ const seen = new Set();
54
+ const result = [];
55
+ for (const item of arr) {
56
+ const key = typeof item === 'object' ? JSON.stringify(item) : String(item);
57
+ if (!seen.has(key)) {
58
+ seen.add(key);
59
+ result.push(item);
60
+ }
61
+ }
62
+ return result;
63
+ }
64
+ /**
65
+ * Merge all configuration sources into a single settings object
66
+ *
67
+ * Sources should be in priority order (lowest first).
68
+ * Each source is merged on top of the previous result.
69
+ */
70
+ export function mergeSettings(sources) {
71
+ let merged = {};
72
+ for (const source of sources) {
73
+ merged = deepMerge(merged, source.settings);
74
+ }
75
+ return merged;
76
+ }
77
+ /**
78
+ * Extract managed deny rules from sources
79
+ *
80
+ * These rules are extracted from managed-level sources and cannot be
81
+ * overridden by any lower-level configuration.
82
+ */
83
+ export function extractManagedDeny(sources) {
84
+ const managedDeny = [];
85
+ for (const source of sources) {
86
+ if (source.level === 'managed') {
87
+ const deny = source.settings.permissions?.deny;
88
+ if (deny) {
89
+ managedDeny.push(...deny);
90
+ }
91
+ }
92
+ }
93
+ return deduplicateArray(managedDeny);
94
+ }
95
+ /**
96
+ * Apply managed restrictions to the merged settings
97
+ *
98
+ * - Ensures managed deny rules are always in the deny list
99
+ * - Removes managed deny patterns from allow list
100
+ */
101
+ export function applyManagedRestrictions(settings, managedDeny) {
102
+ if (managedDeny.length === 0) {
103
+ return settings;
104
+ }
105
+ const result = { ...settings };
106
+ const permissions = { ...(result.permissions || {}) };
107
+ // Ensure deny list includes all managed deny rules
108
+ const currentDeny = permissions.deny || [];
109
+ permissions.deny = deduplicateArray([...currentDeny, ...managedDeny]);
110
+ // Remove managed deny patterns from allow list
111
+ if (permissions.allow) {
112
+ permissions.allow = permissions.allow.filter((pattern) => !managedDeny.includes(pattern));
113
+ }
114
+ result.permissions = permissions;
115
+ return result;
116
+ }
117
+ /**
118
+ * Merge all configuration sources and apply restrictions
119
+ *
120
+ * This is the main entry point for configuration merging.
121
+ */
122
+ export function mergeAllSources(sources) {
123
+ // Extract managed deny rules first
124
+ const managedDeny = extractManagedDeny(sources);
125
+ // Merge all settings
126
+ let settings = mergeSettings(sources);
127
+ // Apply managed restrictions
128
+ settings = applyManagedRestrictions(settings, managedDeny);
129
+ return {
130
+ settings,
131
+ sources,
132
+ managedDeny,
133
+ };
134
+ }
135
+ /**
136
+ * Merge settings with CLI arguments
137
+ *
138
+ * CLI arguments have the highest priority (except managed restrictions).
139
+ */
140
+ export function mergeWithCliArgs(merged, cliArgs) {
141
+ // Merge CLI args as a virtual source
142
+ const settings = deepMerge(merged.settings, cliArgs);
143
+ // Re-apply managed restrictions to ensure they're not overridden
144
+ const finalSettings = applyManagedRestrictions(settings, merged.managedDeny);
145
+ return {
146
+ ...merged,
147
+ settings: finalSettings,
148
+ sources: [
149
+ ...merged.sources,
150
+ {
151
+ level: 'cli',
152
+ path: '<cli>',
153
+ namespace: 'gencode',
154
+ settings: cliArgs,
155
+ },
156
+ ],
157
+ };
158
+ }
159
+ /**
160
+ * Create a debug summary of the merge process
161
+ */
162
+ export function createMergeSummary(merged) {
163
+ const lines = ['Configuration Sources (in priority order):'];
164
+ for (const source of merged.sources) {
165
+ const marker = source.level === 'managed' ? ' [enforced]' : '';
166
+ lines.push(` ${source.level}:${source.namespace} - ${source.path}${marker}`);
167
+ }
168
+ if (merged.managedDeny.length > 0) {
169
+ lines.push('');
170
+ lines.push('Managed Deny Rules (cannot be overridden):');
171
+ for (const rule of merged.managedDeny) {
172
+ lines.push(` - ${rule}`);
173
+ }
174
+ }
175
+ return lines.join('\n');
176
+ }
177
+ //# sourceMappingURL=merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/config/merger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Providers Config Manager - Reads providers.json for model-to-provider mapping
3
+ */
4
+ import type { ProvidersConfig, ProviderName } from './types.js';
5
+ export declare class ProvidersConfigManager {
6
+ private settingsDir;
7
+ private providersPath;
8
+ private config;
9
+ constructor(settingsDir?: string);
10
+ /**
11
+ * Load providers config from disk
12
+ */
13
+ load(): Promise<ProvidersConfig | null>;
14
+ /**
15
+ * Get cached config (call load() first)
16
+ */
17
+ get(): ProvidersConfig | null;
18
+ /**
19
+ * Infer provider from model ID using cached models in providers.json
20
+ * Returns undefined if model not found in any provider's cached list
21
+ */
22
+ inferProvider(modelId: string): ProviderName | undefined;
23
+ /**
24
+ * Get all model IDs for a provider
25
+ */
26
+ getModelIds(provider: string): string[];
27
+ }
28
+ //# sourceMappingURL=providers-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers-config.d.ts","sourceRoot":"","sources":["../../src/config/providers-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGhE,qBAAa,sBAAsB;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAgC;gBAElC,WAAW,CAAC,EAAE,MAAM;IAMhC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAY7C;;OAEG;IACH,GAAG,IAAI,eAAe,GAAG,IAAI;IAI7B;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IA4BxD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;CAMxC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Providers Config Manager - Reads providers.json for model-to-provider mapping
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ import { DEFAULT_SETTINGS_DIR, PROVIDERS_FILE_NAME } from './types.js';
8
+ export class ProvidersConfigManager {
9
+ settingsDir;
10
+ providersPath;
11
+ config = null;
12
+ constructor(settingsDir) {
13
+ const dir = settingsDir ?? DEFAULT_SETTINGS_DIR;
14
+ this.settingsDir = dir.replace('~', os.homedir());
15
+ this.providersPath = path.join(this.settingsDir, PROVIDERS_FILE_NAME);
16
+ }
17
+ /**
18
+ * Load providers config from disk
19
+ */
20
+ async load() {
21
+ try {
22
+ const content = await fs.readFile(this.providersPath, 'utf-8');
23
+ this.config = JSON.parse(content);
24
+ return this.config;
25
+ }
26
+ catch {
27
+ // File doesn't exist or is invalid
28
+ this.config = null;
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Get cached config (call load() first)
34
+ */
35
+ get() {
36
+ return this.config;
37
+ }
38
+ /**
39
+ * Infer provider from model ID using cached models in providers.json
40
+ * Returns undefined if model not found in any provider's cached list
41
+ */
42
+ inferProvider(modelId) {
43
+ if (!this.config?.models) {
44
+ return undefined;
45
+ }
46
+ for (const [providerKey, providerModels] of Object.entries(this.config.models)) {
47
+ const found = providerModels.list?.some((m) => m.id === modelId);
48
+ if (found) {
49
+ // Map provider key to ProviderName
50
+ // Note: 'anthropic' in providers.json might use vertex connection
51
+ if (providerKey === 'gemini') {
52
+ return 'gemini';
53
+ }
54
+ else if (providerKey === 'anthropic') {
55
+ // Check connection method to determine if vertex or direct
56
+ const connection = this.config.connections?.[providerKey];
57
+ if (connection?.method === 'vertex') {
58
+ return 'vertex-ai';
59
+ }
60
+ return 'anthropic';
61
+ }
62
+ else if (providerKey === 'openai') {
63
+ return 'openai';
64
+ }
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+ /**
70
+ * Get all model IDs for a provider
71
+ */
72
+ getModelIds(provider) {
73
+ if (!this.config?.models?.[provider]) {
74
+ return [];
75
+ }
76
+ return this.config.models[provider].list?.map((m) => m.id) ?? [];
77
+ }
78
+ }
79
+ //# sourceMappingURL=providers-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers-config.js","sourceRoot":"","sources":["../../src/config/providers-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,OAAO,sBAAsB;IACzB,WAAW,CAAS;IACpB,aAAa,CAAS;IACtB,MAAM,GAA2B,IAAI,CAAC;IAE9C,YAAY,WAAoB;QAC9B,MAAM,GAAG,GAAG,WAAW,IAAI,oBAAoB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;YACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,OAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/E,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACjE,IAAI,KAAK,EAAE,CAAC;gBACV,mCAAmC;gBACnC,kEAAkE;gBAClE,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC7B,OAAO,QAAQ,CAAC;gBAClB,CAAC;qBAAM,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;oBACvC,2DAA2D;oBAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;oBAC1D,IAAI,UAAU,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACpC,OAAO,WAAW,CAAC;oBACrB,CAAC;oBACD,OAAO,WAAW,CAAC;gBACrB,CAAC;qBAAM,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACpC,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAgB;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACnE,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared test utilities for config tests
3
+ */
4
+ export interface TestProject {
5
+ tempDir: string;
6
+ projectDir: string;
7
+ cleanup: () => Promise<void>;
8
+ }
9
+ /**
10
+ * Create a test project with temp directory and git marker
11
+ */
12
+ export declare function createTestProject(prefix?: string): Promise<TestProject>;
13
+ /**
14
+ * Write JSON settings to a config directory
15
+ */
16
+ export declare function writeSettings(projectDir: string, namespace: 'claude' | 'gencode', settings: Record<string, unknown>, local?: boolean): Promise<string>;
17
+ /**
18
+ * Write memory file to a directory
19
+ */
20
+ export declare function writeMemory(projectDir: string, namespace: 'claude' | 'gencode', content: string, options?: {
21
+ local?: boolean;
22
+ inDir?: boolean;
23
+ }): Promise<string>;
24
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../src/config/test-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,SAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAetF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,GAAG,SAAS,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,KAAK,UAAQ,GACZ,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared test utilities for config tests
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ /**
8
+ * Create a test project with temp directory and git marker
9
+ */
10
+ export async function createTestProject(prefix = 'gencode-test-') {
11
+ const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), prefix));
12
+ const projectDir = path.join(tempDir, 'project');
13
+ await fs.mkdir(projectDir, { recursive: true });
14
+ await fs.mkdir(path.join(projectDir, '.git'));
15
+ return {
16
+ tempDir,
17
+ projectDir,
18
+ cleanup: async () => {
19
+ await fs.rm(tempDir, { recursive: true, force: true });
20
+ delete process.env.GENCODE_CONFIG_DIRS;
21
+ },
22
+ };
23
+ }
24
+ /**
25
+ * Write JSON settings to a config directory
26
+ */
27
+ export async function writeSettings(projectDir, namespace, settings, local = false) {
28
+ const dir = path.join(projectDir, namespace === 'claude' ? '.claude' : '.gencode');
29
+ await fs.mkdir(dir, { recursive: true });
30
+ const filename = local ? 'settings.local.json' : 'settings.json';
31
+ const filePath = path.join(dir, filename);
32
+ await fs.writeFile(filePath, JSON.stringify(settings));
33
+ return filePath;
34
+ }
35
+ /**
36
+ * Write memory file to a directory
37
+ */
38
+ export async function writeMemory(projectDir, namespace, content, options = {}) {
39
+ const { local = false, inDir = true } = options;
40
+ const filename = namespace === 'claude'
41
+ ? (local ? 'CLAUDE.local.md' : 'CLAUDE.md')
42
+ : (local ? 'AGENT.local.md' : 'AGENT.md');
43
+ let filePath;
44
+ if (inDir) {
45
+ const dir = path.join(projectDir, namespace === 'claude' ? '.claude' : '.gencode');
46
+ await fs.mkdir(dir, { recursive: true });
47
+ filePath = path.join(dir, filename);
48
+ }
49
+ else {
50
+ filePath = path.join(projectDir, filename);
51
+ }
52
+ await fs.writeFile(filePath, content);
53
+ return filePath;
54
+ }
55
+ //# sourceMappingURL=test-utils.js.map