genaicode 0.0.35 → 0.1.1

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 (229) hide show
  1. package/README.md +3 -0
  2. package/bin/genaicode-dev.js +11 -0
  3. package/bin/genaicode.cjs +8 -1
  4. package/dist/ai-service/ai-studio.d.ts +5 -0
  5. package/dist/ai-service/ai-studio.js +135 -0
  6. package/dist/ai-service/ai-studio.js.map +1 -0
  7. package/dist/ai-service/anthropic.d.ts +5 -0
  8. package/dist/ai-service/anthropic.js +133 -0
  9. package/dist/ai-service/anthropic.js.map +1 -0
  10. package/dist/ai-service/chat-gpt.d.ts +5 -0
  11. package/dist/ai-service/chat-gpt.js +131 -0
  12. package/dist/ai-service/chat-gpt.js.map +1 -0
  13. package/dist/ai-service/common.d.ts +57 -0
  14. package/dist/ai-service/common.js +38 -0
  15. package/dist/ai-service/common.js.map +1 -0
  16. package/dist/ai-service/common.test.d.ts +1 -0
  17. package/dist/ai-service/common.test.js +85 -0
  18. package/dist/ai-service/common.test.js.map +1 -0
  19. package/dist/ai-service/dall-e.d.ts +14 -0
  20. package/dist/ai-service/dall-e.js +47 -0
  21. package/dist/ai-service/dall-e.js.map +1 -0
  22. package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
  23. package/dist/ai-service/vertex-ai-claude.js +93 -0
  24. package/dist/ai-service/vertex-ai-claude.js.map +1 -0
  25. package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
  26. package/dist/ai-service/vertex-ai-imagen.js +74 -0
  27. package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
  28. package/dist/ai-service/vertex-ai.d.ts +7 -0
  29. package/dist/ai-service/vertex-ai.js +147 -0
  30. package/dist/ai-service/vertex-ai.js.map +1 -0
  31. package/dist/cli/cli-options.d.ts +10 -0
  32. package/dist/cli/cli-options.js +124 -0
  33. package/dist/cli/cli-options.js.map +1 -0
  34. package/dist/cli/cli-options.test.d.ts +1 -0
  35. package/dist/cli/cli-options.test.js +34 -0
  36. package/dist/cli/cli-options.test.js.map +1 -0
  37. package/dist/cli/cli-params.d.ts +29 -0
  38. package/dist/cli/cli-params.js +103 -0
  39. package/dist/cli/cli-params.js.map +1 -0
  40. package/dist/cli/cli-params.test.d.ts +1 -0
  41. package/dist/cli/cli-params.test.js +38 -0
  42. package/dist/cli/cli-params.test.js.map +1 -0
  43. package/dist/cli/service-autodetect.d.ts +2 -0
  44. package/dist/cli/service-autodetect.js +17 -0
  45. package/dist/cli/service-autodetect.js.map +1 -0
  46. package/dist/cli/service-autodetect.test.d.ts +1 -0
  47. package/dist/cli/service-autodetect.test.js +38 -0
  48. package/dist/cli/service-autodetect.test.js.map +1 -0
  49. package/dist/cli/validate-cli-params.d.ts +18 -0
  50. package/dist/cli/validate-cli-params.js +128 -0
  51. package/dist/cli/validate-cli-params.js.map +1 -0
  52. package/dist/cli/validate-cli-params.test.d.ts +1 -0
  53. package/dist/cli/validate-cli-params.test.js +106 -0
  54. package/dist/cli/validate-cli-params.test.js.map +1 -0
  55. package/dist/files/file-utils.d.ts +2 -0
  56. package/dist/files/file-utils.js +7 -0
  57. package/dist/files/file-utils.js.map +1 -0
  58. package/dist/files/file-utils.test.d.ts +1 -0
  59. package/dist/files/file-utils.test.js +18 -0
  60. package/dist/files/file-utils.test.js.map +1 -0
  61. package/dist/files/find-files.d.ts +8 -0
  62. package/dist/files/find-files.js +76 -0
  63. package/dist/files/find-files.js.map +1 -0
  64. package/dist/files/read-files.d.ts +13 -0
  65. package/dist/files/read-files.js +61 -0
  66. package/dist/files/read-files.js.map +1 -0
  67. package/dist/files/read-files.test.d.ts +1 -0
  68. package/dist/files/read-files.test.js +89 -0
  69. package/dist/files/read-files.test.js.map +1 -0
  70. package/dist/files/temp-buffer.d.ts +2 -0
  71. package/dist/files/temp-buffer.js +12 -0
  72. package/dist/files/temp-buffer.js.map +1 -0
  73. package/dist/files/update-files.d.ts +5 -0
  74. package/dist/files/update-files.js +197 -0
  75. package/dist/files/update-files.js.map +1 -0
  76. package/dist/images/ensure-alpha.d.ts +1 -0
  77. package/dist/images/ensure-alpha.js +5 -0
  78. package/dist/images/ensure-alpha.js.map +1 -0
  79. package/dist/images/imgly-remove-background.d.ts +2 -0
  80. package/dist/images/imgly-remove-background.js +21 -0
  81. package/dist/images/imgly-remove-background.js.map +1 -0
  82. package/dist/images/resize-image.d.ts +19 -0
  83. package/dist/images/resize-image.js +22 -0
  84. package/dist/images/resize-image.js.map +1 -0
  85. package/dist/images/split-image.d.ts +18 -0
  86. package/dist/images/split-image.js +25 -0
  87. package/dist/images/split-image.js.map +1 -0
  88. package/dist/main/codegen.d.ts +2 -0
  89. package/dist/main/codegen.js +101 -0
  90. package/dist/main/codegen.js.map +1 -0
  91. package/dist/main/codegen.test.d.ts +2 -0
  92. package/dist/main/codegen.test.js +259 -0
  93. package/dist/main/codegen.test.js.map +1 -0
  94. package/dist/main/config-lib.d.ts +8 -0
  95. package/dist/main/config-lib.js +28 -0
  96. package/dist/main/config-lib.js.map +1 -0
  97. package/dist/main/config-lib.test.d.ts +1 -0
  98. package/dist/main/config-lib.test.js +64 -0
  99. package/dist/main/config-lib.test.js.map +1 -0
  100. package/dist/main/config.d.ts +5 -0
  101. package/{src → dist}/main/config.js +16 -22
  102. package/dist/main/config.js.map +1 -0
  103. package/dist/prompt/function-calling-validate.d.ts +3 -0
  104. package/dist/prompt/function-calling-validate.js +27 -0
  105. package/dist/prompt/function-calling-validate.js.map +1 -0
  106. package/dist/prompt/function-calling.d.ts +5 -0
  107. package/dist/prompt/function-calling.js +48 -0
  108. package/dist/prompt/function-calling.js.map +1 -0
  109. package/dist/prompt/function-defs/ask-question.d.ts +31 -0
  110. package/dist/prompt/function-defs/ask-question.js +32 -0
  111. package/dist/prompt/function-defs/ask-question.js.map +1 -0
  112. package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
  113. package/dist/prompt/function-defs/codegen-summary.js +80 -0
  114. package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
  115. package/dist/prompt/function-defs/create-directory.d.ts +21 -0
  116. package/dist/prompt/function-defs/create-directory.js +22 -0
  117. package/dist/prompt/function-defs/create-directory.js.map +1 -0
  118. package/dist/prompt/function-defs/create-file.d.ts +25 -0
  119. package/dist/prompt/function-defs/create-file.js +26 -0
  120. package/dist/prompt/function-defs/create-file.js.map +1 -0
  121. package/dist/prompt/function-defs/delete-file.d.ts +21 -0
  122. package/dist/prompt/function-defs/delete-file.js +22 -0
  123. package/dist/prompt/function-defs/delete-file.js.map +1 -0
  124. package/dist/prompt/function-defs/download-file.d.ts +25 -0
  125. package/dist/prompt/function-defs/download-file.js +26 -0
  126. package/dist/prompt/function-defs/download-file.js.map +1 -0
  127. package/dist/prompt/function-defs/explanation.d.ts +17 -0
  128. package/dist/prompt/function-defs/explanation.js +18 -0
  129. package/dist/prompt/function-defs/explanation.js.map +1 -0
  130. package/dist/prompt/function-defs/generate-image.d.ts +48 -0
  131. package/dist/prompt/function-defs/generate-image.js +49 -0
  132. package/dist/prompt/function-defs/generate-image.js.map +1 -0
  133. package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
  134. package/dist/prompt/function-defs/get-image-assets.js +21 -0
  135. package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
  136. package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
  137. package/dist/prompt/function-defs/get-source-code.js +21 -0
  138. package/dist/prompt/function-defs/get-source-code.js.map +1 -0
  139. package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
  140. package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
  141. package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
  142. package/dist/prompt/function-defs/move-file.d.ts +25 -0
  143. package/dist/prompt/function-defs/move-file.js +26 -0
  144. package/dist/prompt/function-defs/move-file.js.map +1 -0
  145. package/dist/prompt/function-defs/patch-file.d.ts +25 -0
  146. package/dist/prompt/function-defs/patch-file.js +39 -0
  147. package/dist/prompt/function-defs/patch-file.js.map +1 -0
  148. package/dist/prompt/function-defs/resize-image.d.ts +36 -0
  149. package/dist/prompt/function-defs/resize-image.js +37 -0
  150. package/dist/prompt/function-defs/resize-image.js.map +1 -0
  151. package/dist/prompt/function-defs/split-image.d.ts +57 -0
  152. package/dist/prompt/function-defs/split-image.js +46 -0
  153. package/dist/prompt/function-defs/split-image.js.map +1 -0
  154. package/dist/prompt/function-defs/update-file.d.ts +25 -0
  155. package/dist/prompt/function-defs/update-file.js +26 -0
  156. package/dist/prompt/function-defs/update-file.js.map +1 -0
  157. package/dist/prompt/limits.d.ts +3 -0
  158. package/dist/prompt/limits.js +19 -0
  159. package/dist/prompt/limits.js.map +1 -0
  160. package/dist/prompt/limits.test.d.ts +1 -0
  161. package/dist/prompt/limits.test.js +35 -0
  162. package/dist/prompt/limits.test.js.map +1 -0
  163. package/dist/prompt/prompt-codegen.d.ts +4 -0
  164. package/dist/prompt/prompt-codegen.js +81 -0
  165. package/dist/prompt/prompt-codegen.js.map +1 -0
  166. package/dist/prompt/prompt-codegen.test.d.ts +1 -0
  167. package/dist/prompt/prompt-codegen.test.js +94 -0
  168. package/dist/prompt/prompt-codegen.test.js.map +1 -0
  169. package/dist/prompt/prompt-consts.d.ts +1 -0
  170. package/{src → dist}/prompt/prompt-consts.js +1 -0
  171. package/dist/prompt/prompt-consts.js.map +1 -0
  172. package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
  173. package/dist/prompt/prompt-service-ask-question.test.js +146 -0
  174. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
  175. package/dist/prompt/prompt-service.d.ts +13 -0
  176. package/dist/prompt/prompt-service.js +278 -0
  177. package/dist/prompt/prompt-service.js.map +1 -0
  178. package/dist/prompt/prompt-service.test.d.ts +1 -0
  179. package/dist/prompt/prompt-service.test.js +511 -0
  180. package/dist/prompt/prompt-service.test.js.map +1 -0
  181. package/dist/prompt/systemprompt.d.ts +2 -0
  182. package/dist/prompt/systemprompt.js +43 -0
  183. package/dist/prompt/systemprompt.js.map +1 -0
  184. package/dist/prompt/systemprompt.test.d.ts +2 -0
  185. package/dist/prompt/systemprompt.test.js +47 -0
  186. package/dist/prompt/systemprompt.test.js.map +1 -0
  187. package/package.json +15 -5
  188. package/bin/genaicode.js +0 -5
  189. package/src/ai-service/anthropic.js +0 -95
  190. package/src/ai-service/chat-gpt.js +0 -99
  191. package/src/ai-service/common.js +0 -40
  192. package/src/ai-service/common.test.js +0 -107
  193. package/src/ai-service/dall-e.js +0 -50
  194. package/src/ai-service/vertex-ai-claude.js +0 -99
  195. package/src/ai-service/vertex-ai-imagen.js +0 -78
  196. package/src/ai-service/vertex-ai.js +0 -156
  197. package/src/cli/cli-options.js +0 -120
  198. package/src/cli/cli-options.test.js +0 -50
  199. package/src/cli/cli-params.js +0 -99
  200. package/src/cli/cli-params.test.js +0 -43
  201. package/src/cli/service-autodetect.js +0 -11
  202. package/src/cli/service-autodetect.test.js +0 -43
  203. package/src/cli/validate-cli-params.js +0 -117
  204. package/src/cli/validate-cli-params.test.js +0 -134
  205. package/src/files/file-utils.js +0 -7
  206. package/src/files/file-utils.test.js +0 -21
  207. package/src/files/find-files.js +0 -86
  208. package/src/files/read-files.js +0 -60
  209. package/src/files/read-files.test.js +0 -102
  210. package/src/files/temp-buffer.js +0 -13
  211. package/src/files/update-files.js +0 -205
  212. package/src/images/ensure-alpha.js +0 -5
  213. package/src/images/imgly-remove-background.js +0 -23
  214. package/src/images/resize-image.js +0 -23
  215. package/src/images/split-image.js +0 -26
  216. package/src/main/codegen.js +0 -120
  217. package/src/main/codegen.test.js +0 -334
  218. package/src/main/config-lib.js +0 -33
  219. package/src/main/config-lib.test.js +0 -80
  220. package/src/prompt/function-calling-validate.js +0 -25
  221. package/src/prompt/function-calling.js +0 -454
  222. package/src/prompt/limits.js +0 -23
  223. package/src/prompt/limits.test.js +0 -40
  224. package/src/prompt/prompt-codegen.js +0 -106
  225. package/src/prompt/prompt-codegen.test.js +0 -116
  226. package/src/prompt/prompt-service.js +0 -287
  227. package/src/prompt/prompt-service.test.js +0 -601
  228. package/src/prompt/systemprompt.js +0 -32
  229. package/src/prompt/systemprompt.test.js +0 -63
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { validateCliParams, getCliParamValue, hasCliParam } from './validate-cli-params.js';
3
+ describe('validateCliParams', () => {
4
+ const originalArgv = process.argv;
5
+ beforeEach(() => {
6
+ process.argv = ['node', 'script.js'];
7
+ });
8
+ afterEach(() => {
9
+ process.argv = originalArgv;
10
+ });
11
+ it('should not throw for valid parameters', () => {
12
+ process.argv.push('--dry-run', '--consider-all-files');
13
+ expect(() => validateCliParams()).not.toThrow();
14
+ });
15
+ it('should throw for invalid parameters', () => {
16
+ process.argv.push('--invalid-param');
17
+ expect(() => validateCliParams()).toThrow();
18
+ });
19
+ it('should throw for parameters without --', () => {
20
+ process.argv.push('invalid-param');
21
+ expect(() => validateCliParams()).toThrow();
22
+ });
23
+ it('should not throw for valid --temperature parameter', () => {
24
+ process.argv.push('--temperature=0.5');
25
+ expect(() => validateCliParams()).not.toThrow();
26
+ });
27
+ it('should throw for invalid --temperature parameter', () => {
28
+ process.argv.push('--temperature=invalid');
29
+ expect(() => validateCliParams()).toThrow();
30
+ });
31
+ it('should throw an error when both vision and vertexAi flags are true', () => {
32
+ process.argv.push('--vision');
33
+ process.argv.push('--vertex-ai');
34
+ expect(() => validateCliParams()).toThrow('--vision and --vertex-ai are currently not supported together.');
35
+ });
36
+ // New tests for --imagen parameter
37
+ it('should not throw for valid --imagen parameter with vertex-ai', () => {
38
+ process.argv.push('--imagen=vertex-ai');
39
+ expect(() => validateCliParams()).not.toThrow();
40
+ });
41
+ it('should not throw for valid --imagen parameter with dall-e', () => {
42
+ process.argv.push('--imagen=dall-e');
43
+ expect(() => validateCliParams()).not.toThrow();
44
+ });
45
+ it('should throw for invalid --imagen parameter value', () => {
46
+ process.argv.push('--imagen=invalid-service');
47
+ expect(() => validateCliParams()).toThrow('Invalid --imagen value. It must be either "vertex-ai" or "dall-e".');
48
+ });
49
+ it('should throw for --imagen parameter without value', () => {
50
+ process.argv.push('--imagen=');
51
+ expect(() => validateCliParams()).toThrow('Invalid --imagen value. It must be either "vertex-ai" or "dall-e".');
52
+ });
53
+ });
54
+ describe('getCliParamValue', () => {
55
+ const originalArgv = process.argv;
56
+ beforeEach(() => {
57
+ process.argv = ['node', 'script.js'];
58
+ });
59
+ afterEach(() => {
60
+ process.argv = originalArgv;
61
+ });
62
+ it('should return the value for a parameter with a value', () => {
63
+ process.argv.push('--explicit-prompt=Test prompt');
64
+ expect(getCliParamValue('--explicit-prompt')).toBe('Test prompt');
65
+ });
66
+ it('should return null for a parameter without a value', () => {
67
+ process.argv.push('--dry-run');
68
+ expect(getCliParamValue('--dry-run')).toBeNull();
69
+ });
70
+ it('should return null for a non-existent parameter', () => {
71
+ expect(getCliParamValue('--non-existent')).toBeNull();
72
+ });
73
+ it('should return the value for --temperature parameter', () => {
74
+ process.argv.push('--temperature=0.5');
75
+ expect(getCliParamValue('--temperature')).toBe('0.5');
76
+ });
77
+ it('should return the value for --imagen parameter', () => {
78
+ process.argv.push('--imagen=vertex-ai');
79
+ expect(getCliParamValue('--imagen')).toBe('vertex-ai');
80
+ });
81
+ });
82
+ describe('hasCliParam', () => {
83
+ const originalArgv = process.argv;
84
+ beforeEach(() => {
85
+ process.argv = ['node', 'script.js'];
86
+ });
87
+ afterEach(() => {
88
+ process.argv = originalArgv;
89
+ });
90
+ it('should return true for an existing parameter', () => {
91
+ process.argv.push('--dry-run');
92
+ expect(hasCliParam('--dry-run')).toBe(true);
93
+ });
94
+ it('should return false for a non-existent parameter', () => {
95
+ expect(hasCliParam('--non-existent')).toBe(false);
96
+ });
97
+ it('should return true for --temperature parameter', () => {
98
+ process.argv.push('--temperature=0.5');
99
+ expect(hasCliParam('--temperature')).toBe(true);
100
+ });
101
+ it('should return true for --imagen parameter', () => {
102
+ process.argv.push('--imagen=dall-e');
103
+ expect(hasCliParam('--imagen')).toBe(true);
104
+ });
105
+ });
106
+ //# sourceMappingURL=validate-cli-params.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-cli-params.test.js","sourceRoot":"","sources":["../../src/cli/validate-cli-params.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Check if directory is ancestor of given directory */
2
+ export declare function isAncestorDirectory(parent: string, dir: string): boolean;
@@ -0,0 +1,7 @@
1
+ import path from 'path';
2
+ /** Check if directory is ancestor of given directory */
3
+ export function isAncestorDirectory(parent, dir) {
4
+ const relative = path.relative(parent, dir);
5
+ return parent === dir || (relative ? !relative.startsWith('..') && !path.isAbsolute(relative) : false);
6
+ }
7
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/files/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,GAAW;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,OAAO,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACzG,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { vi, describe, beforeEach, it, expect } from 'vitest';
2
+ import { isAncestorDirectory } from './file-utils.js';
3
+ // Test for isAncestorDirectory
4
+ describe('isAncestorDirectory', () => {
5
+ beforeEach(() => {
6
+ vi.resetAllMocks();
7
+ });
8
+ it('should return true if directories are the same', () => {
9
+ expect(isAncestorDirectory('/project', '/project')).toBe(true);
10
+ });
11
+ it('should return true if parent is ancestor of dir', () => {
12
+ expect(isAncestorDirectory('/project', '/project/src')).toBe(true);
13
+ });
14
+ it('should return false if parent is not ancestor of dir', () => {
15
+ expect(isAncestorDirectory('/project', '/other')).toBe(false);
16
+ });
17
+ });
18
+ //# sourceMappingURL=file-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.test.js","sourceRoot":"","sources":["../../src/files/file-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,+BAA+B;AAC/B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ type DependencyList = string[];
2
+ /** Generates a dependency list for given file */
3
+ export declare function getDependencyList(entryFile: string): DependencyList;
4
+ /** Get source files of the application */
5
+ export declare function getSourceFiles(): string[];
6
+ /** Get source files of the application */
7
+ export declare function getImageAssetFiles(): string[];
8
+ export {};
@@ -0,0 +1,76 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { rcConfig, sourceExtensions, IMAGE_ASSET_EXTENSIONS, ignorePaths } from '../main/config.js';
4
+ // List of possible extensions for dependency resolution
5
+ const POSSIBLE_DEPENDENCY_EXTENSIONS = ['.ts', '.js', '.tsx', '.jsx'];
6
+ function findFiles(dir, recursive, extensions) {
7
+ const files = [];
8
+ const items = fs.readdirSync(dir);
9
+ for (const item of items) {
10
+ const fullPath = path.join(dir, item);
11
+ if (ignorePaths.some((ignorePath) => fullPath.endsWith(ignorePath))) {
12
+ continue;
13
+ }
14
+ if (fs.statSync(fullPath).isDirectory()) {
15
+ if (recursive) {
16
+ files.push(...findFiles(fullPath, true, extensions));
17
+ }
18
+ }
19
+ else if (extensions.includes(path.extname(fullPath))) {
20
+ files.push(fullPath);
21
+ }
22
+ }
23
+ return files;
24
+ }
25
+ function getDependencies(filePath) {
26
+ const content = fs.readFileSync(filePath, 'utf-8');
27
+ const dependencyRegex = /import\s+.+?\s+from\s+['"](.+?\/?[^'"]+)['"]/g;
28
+ const dependencies = [];
29
+ let match;
30
+ while ((match = dependencyRegex.exec(content)) !== null) {
31
+ const dependencyPath = match[1];
32
+ // Resolve relative paths from the file's directory
33
+ const resolvedPath = path.resolve(path.dirname(filePath), dependencyPath);
34
+ // Only add the dependency if it's a local file and not a module
35
+ if (fs.existsSync(resolvedPath)) {
36
+ dependencies.push(resolvedPath);
37
+ }
38
+ else {
39
+ const possibleExtensions = POSSIBLE_DEPENDENCY_EXTENSIONS;
40
+ for (const ext of possibleExtensions) {
41
+ const extendedPath = resolvedPath + ext;
42
+ if (fs.existsSync(extendedPath)) {
43
+ dependencies.push(extendedPath);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ return dependencies;
49
+ }
50
+ /** Generates a dependency list for given file */
51
+ export function getDependencyList(entryFile) {
52
+ const visitedFiles = new Set();
53
+ const result = new Set();
54
+ function traverse(file) {
55
+ if (visitedFiles.has(file))
56
+ return;
57
+ visitedFiles.add(file);
58
+ const dependencies = getDependencies(file);
59
+ dependencies.forEach((dependency) => result.add(dependency));
60
+ dependencies.forEach(traverse);
61
+ }
62
+ result.add(path.resolve(entryFile));
63
+ traverse(entryFile);
64
+ return Array.from(result);
65
+ }
66
+ const sourceFiles = findFiles(rcConfig.rootDir, true, sourceExtensions);
67
+ /** Get source files of the application */
68
+ export function getSourceFiles() {
69
+ return [...sourceFiles];
70
+ }
71
+ const imageAssetFiles = findFiles(rcConfig.rootDir, true, IMAGE_ASSET_EXTENSIONS);
72
+ /** Get source files of the application */
73
+ export function getImageAssetFiles() {
74
+ return [...imageAssetFiles];
75
+ }
76
+ //# sourceMappingURL=find-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-files.js","sourceRoot":"","sources":["../../src/files/find-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ type SourceCodeMap = Record<string, {
2
+ content: string | null;
3
+ } | undefined>;
4
+ type ImageAssetsMap = Record<string, {
5
+ mimeType: string | false;
6
+ width: number;
7
+ height: number;
8
+ }>;
9
+ /** Print source code of all source files */
10
+ export declare function getSourceCode(filterPaths?: string[]): SourceCodeMap;
11
+ /** Get image asset files summary */
12
+ export declare function getImageAssets(): ImageAssetsMap;
13
+ export {};
@@ -0,0 +1,61 @@
1
+ import fs from 'fs';
2
+ import mime from 'mime-types';
3
+ import sizeOf from 'image-size';
4
+ import path from 'path';
5
+ import globRegex from 'glob-regex';
6
+ import { getSourceFiles, getImageAssetFiles } from './find-files.js';
7
+ import { rcConfig } from '../main/config.js';
8
+ import { verifySourceCodeLimit } from '../prompt/limits.js';
9
+ import { taskFile, contentMask, ignorePatterns } from '../cli/cli-params.js';
10
+ /**
11
+ * Read contents of source files and create a map with file path as key and file content as value
12
+ */
13
+ function readSourceFiles(filterPaths) {
14
+ const sourceCode = {};
15
+ for (const file of getSourceFiles()) {
16
+ if (!filterPaths || filterPaths.includes(file)) {
17
+ // Apply content mask filter if it's set
18
+ if (!filterPaths && contentMask) {
19
+ const relativePath = path.relative(rcConfig.rootDir, file);
20
+ if (!relativePath.startsWith(contentMask)) {
21
+ sourceCode[file] = { content: null }; // Include the file path but set content to null
22
+ continue;
23
+ }
24
+ }
25
+ if (ignorePatterns.some((pattern) => globRegex.default(pattern).test(file))) {
26
+ sourceCode[file] = { content: null };
27
+ }
28
+ else {
29
+ const content = fs.readFileSync(file, 'utf-8');
30
+ sourceCode[file] = { content };
31
+ }
32
+ }
33
+ }
34
+ return sourceCode;
35
+ }
36
+ /** Print source code of all source files */
37
+ export function getSourceCode(filterPaths) {
38
+ const sourceCode = readSourceFiles(filterPaths);
39
+ if (taskFile && !sourceCode[taskFile]) {
40
+ sourceCode[taskFile] = {
41
+ content: fs.readFileSync(taskFile, 'utf-8'),
42
+ };
43
+ }
44
+ verifySourceCodeLimit(JSON.stringify(sourceCode));
45
+ return sourceCode;
46
+ }
47
+ /** Get image asset files summary */
48
+ export function getImageAssets() {
49
+ const imageAssets = {};
50
+ for (const file of getImageAssetFiles()) {
51
+ const dimensions = sizeOf.default(file);
52
+ imageAssets[file] = {
53
+ mimeType: mime.lookup(file),
54
+ width: dimensions.width,
55
+ height: dimensions.height,
56
+ };
57
+ }
58
+ verifySourceCodeLimit(JSON.stringify(imageAssets));
59
+ return imageAssets;
60
+ }
61
+ //# sourceMappingURL=read-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-files.js","sourceRoot":"","sources":["../../src/files/read-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,MAAM,MAAM,YAAY,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa7E;;GAEG;AACH,SAAS,eAAe,CAAC,WAAsB;IAC7C,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,wCAAwC;YACxC,IAAI,CAAC,WAAW,IAAI,WAAW,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC3D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1C,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,gDAAgD;oBACtF,SAAS;gBACX,CAAC;YACH,CAAC;YACD,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC5E,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC/C,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,WAAsB;IAClD,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,UAAU,CAAC,QAAQ,CAAC,GAAG;YACrB,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,WAAW,CAAC,IAAI,CAAC,GAAG;YAClB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC3B,KAAK,EAAE,UAAU,CAAC,KAAM;YACxB,MAAM,EAAE,UAAU,CAAC,MAAO;SAC3B,CAAC;IACJ,CAAC;IACD,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs';
3
+ import mime from 'mime-types';
4
+ import sizeOf from 'image-size';
5
+ import { getSourceCode, getImageAssets } from './read-files.js';
6
+ import { getSourceFiles, getImageAssetFiles } from './find-files.js';
7
+ import { verifySourceCodeLimit } from '../prompt/limits.js';
8
+ import * as cliParams from '../cli/cli-params.js';
9
+ import { rcConfig } from '../main/config.js';
10
+ vi.mock('fs');
11
+ vi.mock('mime-types');
12
+ vi.mock('image-size');
13
+ vi.mock('./find-files.js', () => ({
14
+ getImageAssetFiles: vi.fn(),
15
+ getSourceFiles: vi.fn(),
16
+ }));
17
+ vi.mock('../prompt/limits.js');
18
+ vi.mock('../cli/cli-params.js', () => ({
19
+ taskFile: null,
20
+ contentMask: null,
21
+ ignorePatterns: [],
22
+ }));
23
+ vi.mock('../main/config.js', () => ({
24
+ rcConfig: { rootDir: '/home/project' },
25
+ }));
26
+ describe('read-files', () => {
27
+ beforeEach(() => {
28
+ vi.resetAllMocks();
29
+ vi.mocked(cliParams).contentMask = null;
30
+ });
31
+ afterEach(() => {
32
+ vi.clearAllMocks();
33
+ });
34
+ describe('getSourceCode', () => {
35
+ it('should return source code for all files', () => {
36
+ const mockFiles = ['/home/project/file1.js', '/home/project/file2.js'];
37
+ vi.mocked(getSourceFiles).mockReturnValue(mockFiles);
38
+ vi.mocked(fs).readFileSync.mockImplementation((file) => `Content of ${file}`);
39
+ rcConfig.rootDir = '/home/project';
40
+ const result = getSourceCode();
41
+ expect(result).toEqual({
42
+ '/home/project/file1.js': { content: 'Content of /home/project/file1.js' },
43
+ '/home/project/file2.js': { content: 'Content of /home/project/file2.js' },
44
+ });
45
+ expect(verifySourceCodeLimit).toHaveBeenCalled();
46
+ });
47
+ it('should apply content mask when specified', () => {
48
+ const mockFiles = ['/home/project/file1.js', '/home/project/subfolder/file2.js'];
49
+ vi.mocked(getSourceFiles).mockReturnValue(mockFiles);
50
+ vi.mocked(fs).readFileSync.mockImplementation((file) => `Content of ${file}`);
51
+ rcConfig.rootDir = '/home/project';
52
+ vi.mocked(cliParams).contentMask = 'subfolder';
53
+ const result = getSourceCode();
54
+ expect(result).toEqual({
55
+ '/home/project/file1.js': { content: null },
56
+ '/home/project/subfolder/file2.js': {
57
+ content: 'Content of /home/project/subfolder/file2.js',
58
+ },
59
+ });
60
+ });
61
+ it('should include task file when specified', () => {
62
+ const mockFiles = ['/home/project/file1.js'];
63
+ vi.mocked(getSourceFiles).mockReturnValue(mockFiles);
64
+ vi.mocked(fs).readFileSync.mockImplementation((file) => `Content of ${file}`);
65
+ rcConfig.rootDir = '/home/project';
66
+ vi.mocked(cliParams).taskFile = '/home/project/task.md';
67
+ const result = getSourceCode();
68
+ expect(result).toEqual({
69
+ '/home/project/file1.js': { content: 'Content of /home/project/file1.js' },
70
+ '/home/project/task.md': { content: 'Content of /home/project/task.md' },
71
+ });
72
+ });
73
+ });
74
+ describe('getImageAssets', () => {
75
+ it('should return image assets information', () => {
76
+ const mockImageFiles = ['/home/project/image1.png', '/home/project/image2.jpg'];
77
+ vi.mocked(getImageAssetFiles).mockReturnValue(mockImageFiles);
78
+ vi.mocked(mime).lookup.mockImplementation((file) => (file.endsWith('.png') ? 'image/png' : 'image/jpeg'));
79
+ vi.mocked(sizeOf).default.mockImplementation(() => ({ width: 100, height: 200 }));
80
+ const result = getImageAssets();
81
+ expect(result).toEqual({
82
+ '/home/project/image1.png': { mimeType: 'image/png', width: 100, height: 200 },
83
+ '/home/project/image2.jpg': { mimeType: 'image/jpeg', width: 100, height: 200 },
84
+ });
85
+ expect(verifySourceCodeLimit).toHaveBeenCalled();
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=read-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-files.test.js","sourceRoot":"","sources":["../../src/files/read-files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getTempBuffer(url: string): Buffer | undefined;
2
+ export declare function setTempBuffer(buffer: Buffer): string;
@@ -0,0 +1,12 @@
1
+ /** Temporary storage */
2
+ let tempId = 1;
3
+ const temp = {};
4
+ export function getTempBuffer(url) {
5
+ return temp[url];
6
+ }
7
+ export function setTempBuffer(buffer) {
8
+ const imageUrl = 'temp://' + tempId++;
9
+ temp[imageUrl] = buffer;
10
+ return imageUrl;
11
+ }
12
+ //# sourceMappingURL=temp-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-buffer.js","sourceRoot":"","sources":["../../src/files/temp-buffer.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,MAAM,IAAI,GAA8B,EAAE,CAAC;AAE3C,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { FunctionCall } from '../ai-service/common.js';
2
+ /**
3
+ * @param functionCalls Result of the code generation, a map of file paths to new content
4
+ */
5
+ export declare function updateFiles(functionCalls: FunctionCall[]): Promise<void>;