pupt 1.2.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 (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +517 -0
  3. package/dist/annotations/annotation-analyzer.d.ts +17 -0
  4. package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
  5. package/dist/annotations/annotation-analyzer.js +145 -0
  6. package/dist/annotations/annotation-analyzer.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +375 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/add.d.ts +2 -0
  12. package/dist/commands/add.d.ts.map +1 -0
  13. package/dist/commands/add.js +149 -0
  14. package/dist/commands/add.js.map +1 -0
  15. package/dist/commands/annotate.d.ts +2 -0
  16. package/dist/commands/annotate.d.ts.map +1 -0
  17. package/dist/commands/annotate.js +223 -0
  18. package/dist/commands/annotate.js.map +1 -0
  19. package/dist/commands/base-command.d.ts +23 -0
  20. package/dist/commands/base-command.d.ts.map +1 -0
  21. package/dist/commands/base-command.js +41 -0
  22. package/dist/commands/base-command.js.map +1 -0
  23. package/dist/commands/edit.d.ts +2 -0
  24. package/dist/commands/edit.d.ts.map +1 -0
  25. package/dist/commands/edit.js +31 -0
  26. package/dist/commands/edit.js.map +1 -0
  27. package/dist/commands/help.d.ts +2 -0
  28. package/dist/commands/help.d.ts.map +1 -0
  29. package/dist/commands/help.js +25 -0
  30. package/dist/commands/help.js.map +1 -0
  31. package/dist/commands/history.d.ts +9 -0
  32. package/dist/commands/history.d.ts.map +1 -0
  33. package/dist/commands/history.js +232 -0
  34. package/dist/commands/history.js.map +1 -0
  35. package/dist/commands/init-refactored.d.ts +19 -0
  36. package/dist/commands/init-refactored.d.ts.map +1 -0
  37. package/dist/commands/init-refactored.js +141 -0
  38. package/dist/commands/init-refactored.js.map +1 -0
  39. package/dist/commands/init.d.ts +2 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +124 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/install.d.ts +10 -0
  44. package/dist/commands/install.d.ts.map +1 -0
  45. package/dist/commands/install.js +224 -0
  46. package/dist/commands/install.js.map +1 -0
  47. package/dist/commands/review.d.ts +3 -0
  48. package/dist/commands/review.d.ts.map +1 -0
  49. package/dist/commands/review.js +158 -0
  50. package/dist/commands/review.js.map +1 -0
  51. package/dist/commands/run.d.ts +28 -0
  52. package/dist/commands/run.d.ts.map +1 -0
  53. package/dist/commands/run.js +340 -0
  54. package/dist/commands/run.js.map +1 -0
  55. package/dist/config/config-manager.d.ts +19 -0
  56. package/dist/config/config-manager.d.ts.map +1 -0
  57. package/dist/config/config-manager.js +386 -0
  58. package/dist/config/config-manager.js.map +1 -0
  59. package/dist/config/migration.d.ts +11 -0
  60. package/dist/config/migration.d.ts.map +1 -0
  61. package/dist/config/migration.js +153 -0
  62. package/dist/config/migration.js.map +1 -0
  63. package/dist/history/enhanced-history-manager.d.ts +25 -0
  64. package/dist/history/enhanced-history-manager.d.ts.map +1 -0
  65. package/dist/history/enhanced-history-manager.js +88 -0
  66. package/dist/history/enhanced-history-manager.js.map +1 -0
  67. package/dist/history/history-manager.d.ts +33 -0
  68. package/dist/history/history-manager.d.ts.map +1 -0
  69. package/dist/history/history-manager.js +176 -0
  70. package/dist/history/history-manager.js.map +1 -0
  71. package/dist/index.d.ts +6 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +6 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/prompts/input-types/file-prompt.d.ts +12 -0
  76. package/dist/prompts/input-types/file-prompt.d.ts.map +1 -0
  77. package/dist/prompts/input-types/file-prompt.js +166 -0
  78. package/dist/prompts/input-types/file-prompt.js.map +1 -0
  79. package/dist/prompts/input-types/file-search-prompt.d.ts +12 -0
  80. package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
  81. package/dist/prompts/input-types/file-search-prompt.js +54 -0
  82. package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
  83. package/dist/prompts/input-types/review-file-prompt.d.ts +4 -0
  84. package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
  85. package/dist/prompts/input-types/review-file-prompt.js +10 -0
  86. package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
  87. package/dist/prompts/prompt-manager.d.ts +12 -0
  88. package/dist/prompts/prompt-manager.d.ts.map +1 -0
  89. package/dist/prompts/prompt-manager.js +102 -0
  90. package/dist/prompts/prompt-manager.js.map +1 -0
  91. package/dist/pupt-1.2.0.tgz +0 -0
  92. package/dist/schemas/config-schema.d.ts +1268 -0
  93. package/dist/schemas/config-schema.d.ts.map +1 -0
  94. package/dist/schemas/config-schema.js +100 -0
  95. package/dist/schemas/config-schema.js.map +1 -0
  96. package/dist/schemas/prompt-schema.d.ts +927 -0
  97. package/dist/schemas/prompt-schema.d.ts.map +1 -0
  98. package/dist/schemas/prompt-schema.js +110 -0
  99. package/dist/schemas/prompt-schema.js.map +1 -0
  100. package/dist/search/file-search-engine.d.ts +36 -0
  101. package/dist/search/file-search-engine.d.ts.map +1 -0
  102. package/dist/search/file-search-engine.js +184 -0
  103. package/dist/search/file-search-engine.js.map +1 -0
  104. package/dist/search/search-engine.d.ts +8 -0
  105. package/dist/search/search-engine.d.ts.map +1 -0
  106. package/dist/search/search-engine.js +52 -0
  107. package/dist/search/search-engine.js.map +1 -0
  108. package/dist/services/auto-annotation-service.d.ts +39 -0
  109. package/dist/services/auto-annotation-service.d.ts.map +1 -0
  110. package/dist/services/auto-annotation-service.js +203 -0
  111. package/dist/services/auto-annotation-service.js.map +1 -0
  112. package/dist/services/file-system-service.d.ts +42 -0
  113. package/dist/services/file-system-service.d.ts.map +1 -0
  114. package/dist/services/file-system-service.js +269 -0
  115. package/dist/services/file-system-service.js.map +1 -0
  116. package/dist/services/git-service.d.ts +27 -0
  117. package/dist/services/git-service.d.ts.map +1 -0
  118. package/dist/services/git-service.js +157 -0
  119. package/dist/services/git-service.js.map +1 -0
  120. package/dist/services/logging-service.d.ts +50 -0
  121. package/dist/services/logging-service.d.ts.map +1 -0
  122. package/dist/services/logging-service.js +203 -0
  123. package/dist/services/logging-service.js.map +1 -0
  124. package/dist/services/output-capture-service.d.ts +25 -0
  125. package/dist/services/output-capture-service.d.ts.map +1 -0
  126. package/dist/services/output-capture-service.js +277 -0
  127. package/dist/services/output-capture-service.js.map +1 -0
  128. package/dist/services/pattern-detector.d.ts +15 -0
  129. package/dist/services/pattern-detector.d.ts.map +1 -0
  130. package/dist/services/pattern-detector.js +219 -0
  131. package/dist/services/pattern-detector.js.map +1 -0
  132. package/dist/services/prompt-service.d.ts +30 -0
  133. package/dist/services/prompt-service.d.ts.map +1 -0
  134. package/dist/services/prompt-service.js +278 -0
  135. package/dist/services/prompt-service.js.map +1 -0
  136. package/dist/services/review-data-builder.d.ts +22 -0
  137. package/dist/services/review-data-builder.d.ts.map +1 -0
  138. package/dist/services/review-data-builder.js +263 -0
  139. package/dist/services/review-data-builder.js.map +1 -0
  140. package/dist/services/suggestion-generator.d.ts +11 -0
  141. package/dist/services/suggestion-generator.d.ts.map +1 -0
  142. package/dist/services/suggestion-generator.js +146 -0
  143. package/dist/services/suggestion-generator.js.map +1 -0
  144. package/dist/services/ui-service.d.ts +49 -0
  145. package/dist/services/ui-service.d.ts.map +1 -0
  146. package/dist/services/ui-service.js +183 -0
  147. package/dist/services/ui-service.js.map +1 -0
  148. package/dist/template/helpers/index.d.ts +4 -0
  149. package/dist/template/helpers/index.d.ts.map +1 -0
  150. package/dist/template/helpers/index.js +132 -0
  151. package/dist/template/helpers/index.js.map +1 -0
  152. package/dist/template/template-context.d.ts +26 -0
  153. package/dist/template/template-context.d.ts.map +1 -0
  154. package/dist/template/template-context.js +65 -0
  155. package/dist/template/template-context.js.map +1 -0
  156. package/dist/template/template-engine.d.ts +13 -0
  157. package/dist/template/template-engine.d.ts.map +1 -0
  158. package/dist/template/template-engine.js +83 -0
  159. package/dist/template/template-engine.js.map +1 -0
  160. package/dist/types/annotations.d.ts +49 -0
  161. package/dist/types/annotations.d.ts.map +1 -0
  162. package/dist/types/annotations.js +2 -0
  163. package/dist/types/annotations.js.map +1 -0
  164. package/dist/types/config.d.ts +49 -0
  165. package/dist/types/config.d.ts.map +1 -0
  166. package/dist/types/config.js +8 -0
  167. package/dist/types/config.js.map +1 -0
  168. package/dist/types/history.d.ts +32 -0
  169. package/dist/types/history.d.ts.map +1 -0
  170. package/dist/types/history.js +2 -0
  171. package/dist/types/history.js.map +1 -0
  172. package/dist/types/patterns.d.ts +24 -0
  173. package/dist/types/patterns.d.ts.map +1 -0
  174. package/dist/types/patterns.js +2 -0
  175. package/dist/types/patterns.js.map +1 -0
  176. package/dist/types/prompt.d.ts +23 -0
  177. package/dist/types/prompt.d.ts.map +1 -0
  178. package/dist/types/prompt.js +2 -0
  179. package/dist/types/prompt.js.map +1 -0
  180. package/dist/types/review.d.ts +76 -0
  181. package/dist/types/review.d.ts.map +1 -0
  182. package/dist/types/review.js +2 -0
  183. package/dist/types/review.js.map +1 -0
  184. package/dist/ui/console-ui.d.ts +35 -0
  185. package/dist/ui/console-ui.d.ts.map +1 -0
  186. package/dist/ui/console-ui.js +83 -0
  187. package/dist/ui/console-ui.js.map +1 -0
  188. package/dist/ui/interactive-search.d.ts +8 -0
  189. package/dist/ui/interactive-search.d.ts.map +1 -0
  190. package/dist/ui/interactive-search.js +29 -0
  191. package/dist/ui/interactive-search.js.map +1 -0
  192. package/dist/utils/date-formatter.d.ts +10 -0
  193. package/dist/utils/date-formatter.d.ts.map +1 -0
  194. package/dist/utils/date-formatter.js +43 -0
  195. package/dist/utils/date-formatter.js.map +1 -0
  196. package/dist/utils/editor.d.ts +13 -0
  197. package/dist/utils/editor.d.ts.map +1 -0
  198. package/dist/utils/editor.js +62 -0
  199. package/dist/utils/editor.js.map +1 -0
  200. package/dist/utils/errors.d.ts +55 -0
  201. package/dist/utils/errors.d.ts.map +1 -0
  202. package/dist/utils/errors.js +248 -0
  203. package/dist/utils/errors.js.map +1 -0
  204. package/dist/utils/file-utils.d.ts +18 -0
  205. package/dist/utils/file-utils.d.ts.map +1 -0
  206. package/dist/utils/file-utils.js +88 -0
  207. package/dist/utils/file-utils.js.map +1 -0
  208. package/dist/utils/git-info.d.ts +8 -0
  209. package/dist/utils/git-info.d.ts.map +1 -0
  210. package/dist/utils/git-info.js +41 -0
  211. package/dist/utils/git-info.js.map +1 -0
  212. package/dist/utils/gitignore.d.ts +10 -0
  213. package/dist/utils/gitignore.d.ts.map +1 -0
  214. package/dist/utils/gitignore.js +72 -0
  215. package/dist/utils/gitignore.js.map +1 -0
  216. package/dist/utils/handlebars-extensions.d.ts +4 -0
  217. package/dist/utils/handlebars-extensions.d.ts.map +1 -0
  218. package/dist/utils/handlebars-extensions.js +87 -0
  219. package/dist/utils/handlebars-extensions.js.map +1 -0
  220. package/dist/utils/logger.d.ts +39 -0
  221. package/dist/utils/logger.d.ts.map +1 -0
  222. package/dist/utils/logger.js +143 -0
  223. package/dist/utils/logger.js.map +1 -0
  224. package/dist/utils/platform.d.ts +9 -0
  225. package/dist/utils/platform.d.ts.map +1 -0
  226. package/dist/utils/platform.js +44 -0
  227. package/dist/utils/platform.js.map +1 -0
  228. package/dist/utils/security.d.ts +5 -0
  229. package/dist/utils/security.d.ts.map +1 -0
  230. package/dist/utils/security.js +57 -0
  231. package/dist/utils/security.js.map +1 -0
  232. package/dist/utils/tool-detection.d.ts +11 -0
  233. package/dist/utils/tool-detection.d.ts.map +1 -0
  234. package/dist/utils/tool-detection.js +32 -0
  235. package/dist/utils/tool-detection.js.map +1 -0
  236. package/dist/utils/trie.d.ts +18 -0
  237. package/dist/utils/trie.d.ts.map +1 -0
  238. package/dist/utils/trie.js +84 -0
  239. package/dist/utils/trie.js.map +1 -0
  240. package/package.json +102 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-info.js","sourceRoot":"","sources":["../../src/utils/git-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAQlC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,GAAY,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzC,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzC,sCAAsC;QACtC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,oCAAoC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAe,EAAE,OAAa;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAE9C,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,GAAG,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IAEtC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IACnF,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IAEtC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,KAAK,gBAAgB,GAAG,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { SimpleGit } from 'simple-git';
2
+ /**
3
+ * Check if current directory is a git repository
4
+ */
5
+ export declare function isGitRepository(git?: SimpleGit): Promise<boolean>;
6
+ /**
7
+ * Add entry to .gitignore file
8
+ */
9
+ export declare function addToGitignore(entry: string): Promise<void>;
10
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"AAEA,OAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,SAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAMpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DjE"}
@@ -0,0 +1,72 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import simpleGit from 'simple-git';
4
+ /**
5
+ * Check if current directory is a git repository
6
+ */
7
+ export async function isGitRepository(git = simpleGit()) {
8
+ try {
9
+ return await git.checkIsRepo();
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /**
16
+ * Add entry to .gitignore file
17
+ */
18
+ export async function addToGitignore(entry) {
19
+ const gitignorePath = path.join(process.cwd(), '.gitignore');
20
+ let gitignoreContent = '';
21
+ let exists = false;
22
+ try {
23
+ gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
24
+ exists = true;
25
+ }
26
+ catch {
27
+ // File doesn't exist, will create it
28
+ gitignoreContent = '';
29
+ }
30
+ // Check if entry already exists
31
+ const lines = gitignoreContent.split('\n');
32
+ const entryExists = lines.some(line => line.trim() === entry);
33
+ if (entryExists) {
34
+ return; // Entry already exists, nothing to do
35
+ }
36
+ // Check if Prompt Tool section exists
37
+ const promptToolSectionIndex = lines.findIndex(line => line.trim() === '# Prompt Tool');
38
+ if (promptToolSectionIndex !== -1) {
39
+ // Add to existing Prompt Tool section
40
+ // Find the end of the section (next comment or end of file)
41
+ let insertIndex = promptToolSectionIndex + 1;
42
+ while (insertIndex < lines.length &&
43
+ lines[insertIndex].trim() !== '' &&
44
+ !lines[insertIndex].trim().startsWith('#')) {
45
+ insertIndex++;
46
+ }
47
+ // Insert the new entry
48
+ lines.splice(insertIndex, 0, entry);
49
+ }
50
+ else {
51
+ // Add new Prompt Tool section
52
+ // Ensure there's a newline before the section if file has content
53
+ if (exists && gitignoreContent.trim() !== '') {
54
+ if (!gitignoreContent.endsWith('\n')) {
55
+ lines.push(''); // Add empty line
56
+ }
57
+ lines.push(''); // Add separator line
58
+ }
59
+ else if (!exists || gitignoreContent === '') {
60
+ // For new files, remove the initial empty line
61
+ if (lines.length === 1 && lines[0] === '') {
62
+ lines.pop();
63
+ }
64
+ }
65
+ lines.push('# Prompt Tool');
66
+ lines.push(entry);
67
+ }
68
+ // Write back to file
69
+ const newContent = lines.join('\n');
70
+ await fs.writeFile(gitignorePath, newContent.endsWith('\n') ? newContent : newContent + '\n', 'utf-8');
71
+ }
72
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HandlebarsExtensionConfig } from '../types/config.js';
2
+ import type Handlebars from 'handlebars';
3
+ export declare function loadHandlebarsExtensions(handlebars: typeof Handlebars, extensions: HandlebarsExtensionConfig[], configDir?: string): Promise<void>;
4
+ //# sourceMappingURL=handlebars-extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlebars-extensions.d.ts","sourceRoot":"","sources":["../../src/utils/handlebars-extensions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,UAAU,EAC7B,UAAU,EAAE,yBAAyB,EAAE,EACvC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,87 @@
1
+ import * as vm from 'node:vm';
2
+ import * as path from 'node:path';
3
+ import { promises as fs } from 'node:fs';
4
+ export async function loadHandlebarsExtensions(handlebars, extensions, configDir) {
5
+ for (const extension of extensions) {
6
+ await loadSingleExtension(handlebars, extension, configDir);
7
+ }
8
+ }
9
+ async function loadSingleExtension(handlebars, config, configDir) {
10
+ if (config.type === 'inline') {
11
+ await loadInlineExtension(handlebars, config);
12
+ }
13
+ else if (config.type === 'file') {
14
+ await loadFileExtension(handlebars, config, configDir);
15
+ }
16
+ else {
17
+ throw new Error(`Invalid extension type: ${config.type || 'unknown'}`);
18
+ }
19
+ }
20
+ async function loadInlineExtension(handlebars, config) {
21
+ if (!config.value) {
22
+ throw new Error('Inline extension value is required');
23
+ }
24
+ // Create a sandboxed context for executing the inline code
25
+ const sandbox = {
26
+ Handlebars: handlebars,
27
+ console: console, // Allow console for debugging
28
+ require: createSafeRequire()
29
+ };
30
+ try {
31
+ // Create a new context for the sandbox
32
+ const context = vm.createContext(sandbox);
33
+ // Run the code with a timeout
34
+ vm.runInContext(config.value, context, {
35
+ timeout: 5000, // 5 second timeout
36
+ displayErrors: true
37
+ });
38
+ }
39
+ catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ throw new Error(`Failed to load inline Handlebars extension: ${message}`);
42
+ }
43
+ }
44
+ // Create a safe require function that blocks dangerous modules
45
+ function createSafeRequire() {
46
+ return (id) => {
47
+ const blockedModules = ['fs', 'child_process', 'net', 'http', 'https', 'os', 'path', 'crypto'];
48
+ if (blockedModules.includes(id)) {
49
+ throw new Error(`Module '${id}' is not allowed in inline extensions`);
50
+ }
51
+ throw new Error(`require() is not available in inline extensions`);
52
+ };
53
+ }
54
+ async function loadFileExtension(handlebars, config, configDir) {
55
+ if (!config.path) {
56
+ throw new Error('File extension path is required');
57
+ }
58
+ // Resolve path relative to config directory if provided
59
+ const extensionPath = configDir
60
+ ? path.resolve(configDir, config.path)
61
+ : path.resolve(config.path);
62
+ try {
63
+ // Check if file exists
64
+ await fs.access(extensionPath);
65
+ }
66
+ catch {
67
+ throw new Error(`Extension file not found: ${extensionPath}`);
68
+ }
69
+ try {
70
+ // Use dynamic import for ESM compatibility
71
+ const extensionModule = await import(extensionPath);
72
+ const extension = extensionModule.default || extensionModule;
73
+ if (typeof extension !== 'function') {
74
+ throw new Error(`Extension file must export a function, got ${typeof extension}`);
75
+ }
76
+ // Call the extension function with Handlebars instance
77
+ await extension(handlebars);
78
+ }
79
+ catch (error) {
80
+ if (error instanceof Error && error.message.includes('Extension file must export')) {
81
+ throw error;
82
+ }
83
+ const message = error instanceof Error ? error.message : String(error);
84
+ throw new Error(`Failed to load file Handlebars extension: ${message}`);
85
+ }
86
+ }
87
+ //# sourceMappingURL=handlebars-extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlebars-extensions.js","sourceRoot":"","sources":["../../src/utils/handlebars-extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Platform-aware logger that ensures consistent line endings
3
+ * and prevents null characters in output
4
+ */
5
+ export declare class Logger {
6
+ private static instance;
7
+ private readonly lineEnding;
8
+ private constructor();
9
+ static getInstance(): Logger;
10
+ /**
11
+ * Sanitizes a string for output:
12
+ * - Removes null characters
13
+ * - Normalizes line endings to platform-specific format
14
+ * - Removes trailing newlines to prevent double spacing
15
+ */
16
+ private sanitize;
17
+ /**
18
+ * Logs a message to stdout with proper line endings
19
+ */
20
+ log(...args: unknown[]): void;
21
+ /**
22
+ * Logs an error message to stderr with proper line endings
23
+ */
24
+ error(...args: unknown[]): void;
25
+ /**
26
+ * Logs a message without adding a newline at the end
27
+ */
28
+ write(message: string): void;
29
+ /**
30
+ * Logs a warning message to stderr
31
+ */
32
+ warn(...args: unknown[]): void;
33
+ /**
34
+ * Logs a debug message (only in development/test environments)
35
+ */
36
+ debug(...args: unknown[]): void;
37
+ }
38
+ export declare const logger: Logger;
39
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO;IAqBP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAkB7B;;OAEG;IACH,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAkB/B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAe5B;;OAEG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAkB9B;;OAEG;IACH,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;CAmBhC;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
@@ -0,0 +1,143 @@
1
+ import os from 'os';
2
+ /**
3
+ * Platform-aware logger that ensures consistent line endings
4
+ * and prevents null characters in output
5
+ */
6
+ export class Logger {
7
+ static instance;
8
+ lineEnding;
9
+ constructor() {
10
+ // Use platform-specific line endings
11
+ this.lineEnding = os.platform() === 'win32' ? '\r\n' : '\n';
12
+ // Handle EPIPE errors gracefully when output is piped
13
+ // Increase max listeners to avoid warnings in tests
14
+ process.stdout.setMaxListeners(process.stdout.getMaxListeners() + 1);
15
+ process.stderr.setMaxListeners(process.stderr.getMaxListeners() + 1);
16
+ const handlePipeError = (error) => {
17
+ if (error.code === 'EPIPE') {
18
+ // Silently ignore EPIPE errors - this is normal when piping to less/head/etc
19
+ // Don't exit, just stop writing
20
+ return;
21
+ }
22
+ };
23
+ process.stdout.on('error', handlePipeError);
24
+ process.stderr.on('error', handlePipeError);
25
+ }
26
+ static getInstance() {
27
+ if (!Logger.instance) {
28
+ Logger.instance = new Logger();
29
+ }
30
+ return Logger.instance;
31
+ }
32
+ /**
33
+ * Sanitizes a string for output:
34
+ * - Removes null characters
35
+ * - Normalizes line endings to platform-specific format
36
+ * - Removes trailing newlines to prevent double spacing
37
+ */
38
+ sanitize(text) {
39
+ return text
40
+ .replace(/\0/g, '') // Remove null characters
41
+ .replace(/\r\n|\r|\n/g, this.lineEnding) // Normalize line endings
42
+ .replace(/[\r\n]+$/, ''); // Remove trailing newlines
43
+ }
44
+ /**
45
+ * Logs a message to stdout with proper line endings
46
+ */
47
+ log(...args) {
48
+ const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
49
+ const sanitized = this.sanitize(message);
50
+ try {
51
+ process.stdout.write(sanitized + this.lineEnding);
52
+ }
53
+ catch (error) {
54
+ // Handle EPIPE errors gracefully when output is piped
55
+ if (error.code === 'EPIPE') {
56
+ // Silently ignore - this is normal when piping to less/head/etc
57
+ return;
58
+ }
59
+ // Re-throw other errors
60
+ throw error;
61
+ }
62
+ }
63
+ /**
64
+ * Logs an error message to stderr with proper line endings
65
+ */
66
+ error(...args) {
67
+ const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
68
+ const sanitized = this.sanitize(message);
69
+ try {
70
+ process.stderr.write(sanitized + this.lineEnding);
71
+ }
72
+ catch (error) {
73
+ // Handle EPIPE errors gracefully when output is piped
74
+ if (error.code === 'EPIPE') {
75
+ // Silently ignore - this is normal when piping to less/head/etc
76
+ return;
77
+ }
78
+ // Re-throw other errors
79
+ throw error;
80
+ }
81
+ }
82
+ /**
83
+ * Logs a message without adding a newline at the end
84
+ */
85
+ write(message) {
86
+ const sanitized = this.sanitize(message);
87
+ try {
88
+ process.stdout.write(sanitized);
89
+ }
90
+ catch (error) {
91
+ // Handle EPIPE errors gracefully when output is piped
92
+ if (error.code === 'EPIPE') {
93
+ // Silently ignore - this is normal when piping to less/head/etc
94
+ return;
95
+ }
96
+ // Re-throw other errors
97
+ throw error;
98
+ }
99
+ }
100
+ /**
101
+ * Logs a warning message to stderr
102
+ */
103
+ warn(...args) {
104
+ const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
105
+ const sanitized = this.sanitize(message);
106
+ try {
107
+ process.stderr.write(sanitized + this.lineEnding);
108
+ }
109
+ catch (error) {
110
+ // Handle EPIPE errors gracefully when output is piped
111
+ if (error.code === 'EPIPE') {
112
+ // Silently ignore - this is normal when piping to less/head/etc
113
+ return;
114
+ }
115
+ // Re-throw other errors
116
+ throw error;
117
+ }
118
+ }
119
+ /**
120
+ * Logs a debug message (only in development/test environments)
121
+ */
122
+ debug(...args) {
123
+ if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test' || process.env.DEBUG) {
124
+ const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
125
+ const sanitized = this.sanitize(`[DEBUG] ${message}`);
126
+ try {
127
+ process.stderr.write(sanitized + this.lineEnding);
128
+ }
129
+ catch (error) {
130
+ // Handle EPIPE errors gracefully when output is piped
131
+ if (error.code === 'EPIPE') {
132
+ // Exit gracefully when pipe is closed
133
+ process.exit(0);
134
+ }
135
+ // Re-throw other errors
136
+ throw error;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ // Export singleton instance
142
+ export const logger = Logger.getInstance();
143
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function getHomePath(): string;
2
+ export declare function getConfigPaths(): string[];
3
+ export declare function getPlatform(): NodeJS.Platform;
4
+ export declare function isWindows(): boolean;
5
+ export declare function isMacOS(): boolean;
6
+ export declare function isLinux(): boolean;
7
+ export declare function normalizeLineEndings(text: string): string;
8
+ export declare function getUsername(): string;
9
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAwBzC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,QAAQ,CAE7C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,44 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ export function getHomePath() {
4
+ return os.homedir();
5
+ }
6
+ export function getConfigPaths() {
7
+ const platform = getPlatform();
8
+ const paths = [process.cwd()];
9
+ switch (platform) {
10
+ case 'win32':
11
+ if (process.env.APPDATA) {
12
+ paths.push(path.join(process.env.APPDATA, 'prompt-tool'));
13
+ }
14
+ break;
15
+ case 'darwin':
16
+ paths.push(path.join(getHomePath(), 'Library', 'Application Support', 'prompt-tool'), path.join(getHomePath(), '.config', 'prompt-tool'));
17
+ break;
18
+ case 'linux':
19
+ default:
20
+ const configHome = process.env.XDG_CONFIG_HOME || path.join(getHomePath(), '.config');
21
+ paths.push(path.join(configHome, 'prompt-tool'));
22
+ break;
23
+ }
24
+ return paths;
25
+ }
26
+ export function getPlatform() {
27
+ return process.platform;
28
+ }
29
+ export function isWindows() {
30
+ return getPlatform() === 'win32';
31
+ }
32
+ export function isMacOS() {
33
+ return getPlatform() === 'darwin';
34
+ }
35
+ export function isLinux() {
36
+ return getPlatform() === 'linux';
37
+ }
38
+ export function normalizeLineEndings(text) {
39
+ return text.replace(/\r\n|\r|\n/g, '\n');
40
+ }
41
+ export function getUsername() {
42
+ return os.userInfo().username;
43
+ }
44
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,aAAa,CAAC,EACzE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CACnD,CAAC;YACF,MAAM;QACR,KAAK,OAAO,CAAC;QACb;YACE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;YACjD,MAAM;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,WAAW,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,WAAW,EAAE,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,WAAW,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAChC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const SENSITIVE_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
2
+ export declare function isSensitiveKey(key: string): boolean;
3
+ export declare function maskSensitiveValue(key: string, value: unknown): unknown;
4
+ export declare function sanitizeObject<T extends Record<string, unknown>>(obj: T): T;
5
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,2EASrB,CAAC;AAEX,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBvE;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,GAAG,EAAE,CAAC,GACL,CAAC,CAqBH"}
@@ -0,0 +1,57 @@
1
+ export const SENSITIVE_PATTERNS = [
2
+ /api[_-]?key/i,
3
+ /password/i,
4
+ /secret/i,
5
+ /token/i,
6
+ /credential/i,
7
+ /private[_-]?key/i,
8
+ /auth/i,
9
+ /bearer/i
10
+ ];
11
+ export function isSensitiveKey(key) {
12
+ return SENSITIVE_PATTERNS.some(pattern => pattern.test(key));
13
+ }
14
+ export function maskSensitiveValue(key, value) {
15
+ if (!isSensitiveKey(key)) {
16
+ return value;
17
+ }
18
+ if (typeof value === 'string') {
19
+ return '***';
20
+ }
21
+ if (Array.isArray(value)) {
22
+ return value.map(() => '***');
23
+ }
24
+ if (typeof value === 'object' && value !== null) {
25
+ return Object.keys(value).reduce((masked, k) => ({
26
+ ...masked,
27
+ [k]: maskSensitiveValue(k, value[k])
28
+ }), {});
29
+ }
30
+ return '***';
31
+ }
32
+ export function sanitizeObject(obj) {
33
+ return Object.entries(obj).reduce((sanitized, [key, value]) => {
34
+ // Always check if the key itself is sensitive first
35
+ if (isSensitiveKey(key)) {
36
+ sanitized[key] = maskSensitiveValue(key, value);
37
+ }
38
+ else if (Array.isArray(value)) {
39
+ // Handle arrays - check if it's an array of objects
40
+ sanitized[key] = value.map(item => {
41
+ if (typeof item === 'object' && item !== null) {
42
+ return sanitizeObject(item);
43
+ }
44
+ return item;
45
+ });
46
+ }
47
+ else if (typeof value === 'object' && value !== null) {
48
+ // Recursively sanitize nested objects
49
+ sanitized[key] = sanitizeObject(value);
50
+ }
51
+ else {
52
+ sanitized[key] = value;
53
+ }
54
+ return sanitized;
55
+ }, {});
56
+ }
57
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,WAAW;IACX,SAAS;IACT,QAAQ;IACR,aAAa;IACb,kBAAkB;IAClB,OAAO;IACP,SAAS;CACD,CAAC;AAEX,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAc;IAC5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,MAAM;YACT,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAG,KAAiC,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC,EAAE,EAAE,CAAC,CAAC;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,GAAM;IAEN,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5D,oDAAoD;QACpD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,GAAc,CAAC,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAe,CAAC;QAC3E,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,oDAAoD;YACpD,SAAS,CAAC,GAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC9C,OAAO,cAAc,CAAC,IAA+B,CAAC,CAAC;gBACzD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAe,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,sCAAsC;YACtC,SAAS,CAAC,GAAc,CAAC,GAAG,cAAc,CAAC,KAAgC,CAAe,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAc,CAAC,GAAG,KAAmB,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,EAAO,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ToolConfig {
2
+ name: string;
3
+ displayName: string;
4
+ command: string;
5
+ defaultArgs: string[];
6
+ defaultOptions: Record<string, string>;
7
+ }
8
+ export declare const SUPPORTED_TOOLS: ToolConfig[];
9
+ export declare function detectInstalledTools(): ToolConfig[];
10
+ export declare function getToolByName(name: string): ToolConfig | undefined;
11
+ //# sourceMappingURL=tool-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-detection.d.ts","sourceRoot":"","sources":["../../src/utils/tool-detection.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,eAAe,EAAE,UAAU,EAiBvC,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,UAAU,EAAE,CAUnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE"}
@@ -0,0 +1,32 @@
1
+ import { sync as commandExistsSync } from 'command-exists';
2
+ export const SUPPORTED_TOOLS = [
3
+ {
4
+ name: 'claude',
5
+ displayName: 'Claude',
6
+ command: 'claude',
7
+ defaultArgs: ['--permission-mode', 'acceptEdits'],
8
+ defaultOptions: {
9
+ 'Continue with last context?': '--continue'
10
+ }
11
+ },
12
+ {
13
+ name: 'q',
14
+ displayName: 'Amazon Q',
15
+ command: 'q',
16
+ defaultArgs: [],
17
+ defaultOptions: {}
18
+ }
19
+ ];
20
+ export function detectInstalledTools() {
21
+ const installedTools = [];
22
+ for (const tool of SUPPORTED_TOOLS) {
23
+ if (commandExistsSync(tool.command)) {
24
+ installedTools.push(tool);
25
+ }
26
+ }
27
+ return installedTools;
28
+ }
29
+ export function getToolByName(name) {
30
+ return SUPPORTED_TOOLS.find(tool => tool.name === name);
31
+ }
32
+ //# sourceMappingURL=tool-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-detection.js","sourceRoot":"","sources":["../../src/utils/tool-detection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAU3D,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,CAAC,mBAAmB,EAAE,aAAa,CAAC;QACjD,cAAc,EAAE;YACd,6BAA6B,EAAE,YAAY;SAC5C;KACF;IACD;QACE,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,EAAE;QACf,cAAc,EAAE,EAAE;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB;IAClC,MAAM,cAAc,GAAiB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare class TrieNode {
2
+ children: Map<string, TrieNode>;
3
+ isEndOfPath: boolean;
4
+ fullPath: string;
5
+ }
6
+ export declare class Trie {
7
+ private root;
8
+ insert(path: string): void;
9
+ findCompletions(prefix: string): string[];
10
+ private collectPaths;
11
+ }
12
+ export declare function findCommonPrefix(strings: string[]): string;
13
+ export interface CompletionResult {
14
+ completed: string;
15
+ suggestions: string[];
16
+ }
17
+ export declare function completeFilePath(input: string, availablePaths: string[]): CompletionResult;
18
+ //# sourceMappingURL=trie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trie.d.ts","sourceRoot":"","sources":["../../src/utils/trie.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACnB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IAC5C,WAAW,EAAE,OAAO,CAAS;IAC7B,QAAQ,EAAE,MAAM,CAAM;CACvB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,IAAI,CAA4B;IAExC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc1B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBzC,OAAO,CAAC,YAAY;CASrB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAoB1D;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA2B1F"}