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,88 @@
1
+ import { HistoryManager } from './history-manager.js';
2
+ import { getGitInfo, formatDuration } from '../utils/git-info.js';
3
+ import fs from 'fs-extra';
4
+ import path from 'node:path';
5
+ import crypto from 'node:crypto';
6
+ import { sanitizeObject } from '../utils/security.js';
7
+ import { DateFormats } from '../utils/date-formatter.js';
8
+ export class EnhancedHistoryManager extends HistoryManager {
9
+ enhancedHistoryDir;
10
+ constructor(enhancedHistoryDir) {
11
+ super(enhancedHistoryDir);
12
+ this.enhancedHistoryDir = enhancedHistoryDir;
13
+ }
14
+ async listHistory(limit) {
15
+ const entries = await super.listHistory(limit);
16
+ // The parent method returns HistoryEntry[], but they may actually contain enhanced fields
17
+ // TypeScript just doesn't know about them, so we cast
18
+ return entries;
19
+ }
20
+ async getHistoryEntry(index) {
21
+ const entry = await super.getHistoryEntry(index);
22
+ return entry;
23
+ }
24
+ async savePrompt(options) {
25
+ // Don't save empty prompts
26
+ if (!options.finalPrompt || !options.finalPrompt.trim()) {
27
+ return '';
28
+ }
29
+ try {
30
+ await fs.ensureDir(this.enhancedHistoryDir);
31
+ const now = options.timestamp || new Date();
32
+ const timestamp = DateFormats.UTC_DATETIME(now);
33
+ // Generate filename using local time: YYYYMMDD-HHMMSS-<random>.json
34
+ const dateStr = DateFormats.YYYYMMDD(now);
35
+ const hours = String(now.getHours()).padStart(2, '0');
36
+ const minutes = String(now.getMinutes()).padStart(2, '0');
37
+ const seconds = String(now.getSeconds()).padStart(2, '0');
38
+ const timeStr = `${hours}${minutes}${seconds}`;
39
+ const random = crypto.randomBytes(4).toString('hex');
40
+ const filename = `${dateStr}-${timeStr}-${random}.json`;
41
+ // Gather environment info
42
+ const gitInfo = await getGitInfo();
43
+ const environment = {
44
+ working_directory: process.cwd(),
45
+ node_version: process.version,
46
+ os: process.platform,
47
+ ...(gitInfo.branch && { git_branch: gitInfo.branch }),
48
+ ...(gitInfo.commit && { git_commit: gitInfo.commit }),
49
+ ...(gitInfo.isDirty !== undefined && { git_dirty: gitInfo.isDirty }),
50
+ ...(process.env.SHELL && { shell: process.env.SHELL })
51
+ };
52
+ // Build execution info if provided
53
+ let execution;
54
+ if (options.startTime) {
55
+ const endTime = options.endTime || new Date();
56
+ execution = {
57
+ start_time: options.startTime.toISOString(),
58
+ end_time: endTime.toISOString(),
59
+ duration: formatDuration(options.startTime, endTime),
60
+ exit_code: options.exitCode ?? null,
61
+ command: options.command || 'unknown',
62
+ ...(options.outputFile && { output_file: options.outputFile }),
63
+ ...(options.outputSize !== undefined && { output_size: options.outputSize })
64
+ };
65
+ }
66
+ // Create enhanced history entry
67
+ const entry = {
68
+ timestamp,
69
+ templatePath: options.templatePath,
70
+ templateContent: options.templateContent,
71
+ variables: sanitizeObject(Object.fromEntries(options.variables)),
72
+ finalPrompt: options.finalPrompt,
73
+ title: options.title,
74
+ summary: options.summary,
75
+ environment,
76
+ ...(execution && { execution })
77
+ };
78
+ // Save to history
79
+ const filePath = path.join(this.enhancedHistoryDir, filename);
80
+ await fs.writeJson(filePath, entry, { spaces: 2 });
81
+ return filename;
82
+ }
83
+ catch (error) {
84
+ throw new Error(`Failed to save prompt to history: ${error instanceof Error ? error.message : String(error)}`);
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=enhanced-history-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-history-manager.js","sourceRoot":"","sources":["../../src/history/enhanced-history-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { HistoryEntry, EnhancedHistoryEntry } from '../types/history.js';
2
+ import { AnnotationMetadata } from '../types/annotations.js';
3
+ interface HistorySaveOptions {
4
+ templatePath: string;
5
+ templateContent: string;
6
+ variables: Map<string, unknown>;
7
+ finalPrompt: string;
8
+ title?: string;
9
+ summary?: string;
10
+ timestamp?: Date;
11
+ outputFile?: string;
12
+ outputSize?: number;
13
+ executionTime?: number;
14
+ exitCode?: number | null;
15
+ filenameComponents?: {
16
+ dateStr: string;
17
+ timeStr: string;
18
+ randomSuffix: string;
19
+ };
20
+ }
21
+ export declare class HistoryManager {
22
+ private historyDir;
23
+ private annotationDir?;
24
+ constructor(historyDir: string, annotationDir?: string | undefined);
25
+ savePrompt(options: HistorySaveOptions): Promise<string>;
26
+ listHistory(limit?: number): Promise<HistoryEntry[]>;
27
+ getTotalCount(): Promise<number>;
28
+ getHistoryEntry(index: number): Promise<HistoryEntry | null>;
29
+ private maskSensitiveVariables;
30
+ saveAnnotation(historyEntry: HistoryEntry | EnhancedHistoryEntry, metadata: AnnotationMetadata): Promise<void>;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=history-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-manager.d.ts","sourceRoot":"","sources":["../../src/history/history-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK7D,UAAU,kBAAkB;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,kBAAkB,CAAC,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAGD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa,CAAC;gBADd,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,YAAA;IAG1B,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgExD,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwCpD,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAmBhC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA4BlE,OAAO,CAAC,sBAAsB;IAKxB,cAAc,CAClB,YAAY,EAAE,YAAY,GAAG,oBAAoB,EACjD,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC;CAiCjB"}
@@ -0,0 +1,176 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import crypto from 'node:crypto';
4
+ import yaml from 'js-yaml';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ import { sanitizeObject } from '../utils/security.js';
7
+ import { DateFormats } from '../utils/date-formatter.js';
8
+ import { logger } from '../utils/logger.js';
9
+ export class HistoryManager {
10
+ historyDir;
11
+ annotationDir;
12
+ constructor(historyDir, annotationDir) {
13
+ this.historyDir = historyDir;
14
+ this.annotationDir = annotationDir;
15
+ }
16
+ async savePrompt(options) {
17
+ // Don't save empty prompts
18
+ if (!options.finalPrompt || !options.finalPrompt.trim()) {
19
+ return '';
20
+ }
21
+ try {
22
+ await fs.ensureDir(this.historyDir);
23
+ const now = options.timestamp || new Date();
24
+ const timestamp = DateFormats.UTC_DATETIME(now);
25
+ // Use provided filename components or generate new ones
26
+ let dateStr;
27
+ let timeStr;
28
+ let randomSuffix;
29
+ if (options.filenameComponents) {
30
+ // Use provided components for synchronized naming
31
+ ({ dateStr, timeStr, randomSuffix } = options.filenameComponents);
32
+ }
33
+ else {
34
+ // Generate filename using local time: YYYYMMDD-HHMMSS-<random>.json
35
+ dateStr = DateFormats.YYYYMMDD(now);
36
+ const hours = String(now.getHours()).padStart(2, '0');
37
+ const minutes = String(now.getMinutes()).padStart(2, '0');
38
+ const seconds = String(now.getSeconds()).padStart(2, '0');
39
+ timeStr = `${hours}${minutes}${seconds}`;
40
+ randomSuffix = crypto.randomBytes(4).toString('hex');
41
+ }
42
+ const filename = `${dateStr}-${timeStr}-${randomSuffix}.json`;
43
+ // Create history entry
44
+ const entry = {
45
+ timestamp,
46
+ templatePath: options.templatePath,
47
+ templateContent: options.templateContent,
48
+ variables: this.maskSensitiveVariables(options.variables),
49
+ finalPrompt: options.finalPrompt,
50
+ title: options.title,
51
+ summary: options.summary
52
+ };
53
+ // Add execution metadata if provided (for output capture)
54
+ if (options.outputFile || options.executionTime || options.exitCode !== undefined) {
55
+ entry.execution = {
56
+ ...(options.outputFile && { output_file: path.relative(this.historyDir, options.outputFile) }),
57
+ ...(options.outputSize !== undefined && { output_size: options.outputSize }),
58
+ ...(options.executionTime !== undefined && { duration_ms: options.executionTime }),
59
+ ...(options.exitCode !== undefined && { exit_code: options.exitCode })
60
+ };
61
+ }
62
+ // Save to history
63
+ const filePath = path.join(this.historyDir, filename);
64
+ await fs.writeJson(filePath, entry, { spaces: 2 });
65
+ return filename;
66
+ }
67
+ catch (error) {
68
+ throw new Error(`Failed to save prompt to history: ${error instanceof Error ? error.message : String(error)}`);
69
+ }
70
+ }
71
+ async listHistory(limit) {
72
+ try {
73
+ await fs.ensureDir(this.historyDir);
74
+ const files = await fs.readdir(this.historyDir);
75
+ // Filter for JSON files with expected format
76
+ const historyFiles = files.filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/));
77
+ // Sort by date (oldest first)
78
+ historyFiles.sort();
79
+ // Apply limit if specified (get most recent entries)
80
+ const filesToLoad = limit ? historyFiles.slice(-limit) : historyFiles;
81
+ // Load entries
82
+ const entries = [];
83
+ for (const filename of filesToLoad) {
84
+ try {
85
+ const filePath = path.join(this.historyDir, filename);
86
+ const entry = await fs.readJson(filePath);
87
+ entries.push({ ...entry, filename });
88
+ }
89
+ catch {
90
+ // Skip invalid files silently in tests
91
+ if (process.env.NODE_ENV !== 'test') {
92
+ logger.warn(`Skipping invalid history file: ${filename}`);
93
+ }
94
+ }
95
+ }
96
+ return entries;
97
+ }
98
+ catch (error) {
99
+ if (error?.code === 'ENOENT') {
100
+ return [];
101
+ }
102
+ throw error;
103
+ }
104
+ }
105
+ async getTotalCount() {
106
+ try {
107
+ await fs.ensureDir(this.historyDir);
108
+ const files = await fs.readdir(this.historyDir);
109
+ // Count JSON files with expected format
110
+ const historyFiles = files.filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/));
111
+ return historyFiles.length;
112
+ }
113
+ catch (error) {
114
+ if (error?.code === 'ENOENT') {
115
+ return 0;
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ async getHistoryEntry(index) {
121
+ try {
122
+ // Get all history files sorted by date (oldest first)
123
+ const files = await fs.readdir(this.historyDir);
124
+ const historyFiles = files
125
+ .filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/))
126
+ .sort();
127
+ // Check if index is valid (1-based)
128
+ if (index < 1 || index > historyFiles.length) {
129
+ return null;
130
+ }
131
+ // Load the entry (convert 1-based to 0-based index)
132
+ const filename = historyFiles[index - 1];
133
+ const filePath = path.join(this.historyDir, filename);
134
+ const entry = await fs.readJson(filePath);
135
+ return { ...entry, filename };
136
+ }
137
+ catch (error) {
138
+ if (process.env.NODE_ENV !== 'test') {
139
+ logger.error(`Failed to get history entry ${index}: ${error}`);
140
+ }
141
+ return null;
142
+ }
143
+ }
144
+ maskSensitiveVariables(variables) {
145
+ const obj = Object.fromEntries(variables);
146
+ return sanitizeObject(obj);
147
+ }
148
+ async saveAnnotation(historyEntry, metadata) {
149
+ if (!this.annotationDir) {
150
+ logger.warn('Annotation directory not configured, skipping annotation save');
151
+ return;
152
+ }
153
+ await fs.ensureDir(this.annotationDir);
154
+ // Generate annotation content
155
+ const content = `---
156
+ ${yaml.dump(metadata)}---
157
+
158
+ ## Notes
159
+
160
+ ${metadata.auto_detected ? 'Auto-generated annotation' : ''}
161
+ `;
162
+ // Create filename based on history entry
163
+ const historyBasename = path.basename(historyEntry.filename || `${historyEntry.timestamp}.json`, '.json');
164
+ const filename = `${historyBasename}-annotation-${uuidv4()}.md`;
165
+ const filepath = path.join(this.annotationDir, filename);
166
+ try {
167
+ await fs.writeFile(filepath, content);
168
+ logger.debug(`Auto-annotation saved to ${filepath}`);
169
+ }
170
+ catch (error) {
171
+ logger.error(`Failed to save annotation: ${error}`);
172
+ throw error;
173
+ }
174
+ }
175
+ }
176
+ //# sourceMappingURL=history-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-manager.js","sourceRoot":"","sources":["../../src/history/history-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAwB5C,MAAM,OAAO,cAAc;IAEf;IACA;IAFV,YACU,UAAkB,EAClB,aAAsB;QADtB,eAAU,GAAV,UAAU,CAAQ;QAClB,kBAAa,GAAb,aAAa,CAAS;IAC7B,CAAC;IAEJ,KAAK,CAAC,UAAU,CAAC,OAA2B;QAC1C,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAEhD,wDAAwD;YACxD,IAAI,OAAe,CAAC;YACpB,IAAI,OAAe,CAAC;YACpB,IAAI,YAAoB,CAAC;YAEzB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC/B,kDAAkD;gBAClD,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,oEAAoE;gBACpE,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAE1D,OAAO,GAAG,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,EAAE,CAAC;gBACzC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,OAAO,IAAI,YAAY,OAAO,CAAC;YAE9D,uBAAuB;YACvB,MAAM,KAAK,GAA6E;gBACtF,SAAS;gBACT,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC;gBACzD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC;YAEF,0DAA0D;YAC1D,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClF,KAAK,CAAC,SAAS,GAAG;oBAChB,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9F,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC5E,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;oBAClF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;iBACvE,CAAC;YACJ,CAAC;YAED,kBAAkB;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAEnD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAc;QAC9B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEhD,6CAA6C;YAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAC3C,CAAC;YAEF,8BAA8B;YAC9B,YAAY,CAAC,IAAI,EAAE,CAAC;YAEpB,qDAAqD;YACrD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAEtE,eAAe;YACf,MAAM,OAAO,GAAmB,EAAE,CAAC;YACnC,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACtD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAmC,CAAC;oBAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,uCAAuC;oBACvC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;wBACpC,MAAM,CAAC,IAAI,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEhD,wCAAwC;YACxC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAC3C,CAAC;YAEF,OAAO,YAAY,CAAC,MAAM,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,IAAI,CAAC;YACH,sDAAsD;YACtD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,KAAK;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;iBACvD,IAAI,EAAE,CAAC;YAEV,oCAAoC;YACpC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,oDAAoD;YACpD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAmC,CAAC;YAE5E,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAGO,sBAAsB,CAAC,SAA+B;QAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,YAAiD,EACjD,QAA4B;QAE5B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvC,8BAA8B;QAC9B,MAAM,OAAO,GAAG;EAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;EAInB,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE;CAC1D,CAAC;QAEE,yCAAyC;QACzC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CACnC,YAAY,CAAC,QAAQ,IAAI,GAAG,YAAY,CAAC,SAAS,OAAO,EACzD,OAAO,CACR,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,eAAe,eAAe,MAAM,EAAE,KAAK,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export * from './utils/platform.js';
2
+ export * from './search/search-engine.js';
3
+ export * from './ui/interactive-search.js';
4
+ export * from './template/template-engine.js';
5
+ export * from './template/template-context.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './utils/platform.js';
2
+ export * from './search/search-engine.js';
3
+ export * from './ui/interactive-search.js';
4
+ export * from './template/template-engine.js';
5
+ export * from './template/template-context.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type Theme } from '@inquirer/core';
2
+ import type { PartialDeep } from '@inquirer/type';
3
+ export interface FilePromptConfig {
4
+ message: string;
5
+ basePath?: string;
6
+ filter?: string;
7
+ default?: string;
8
+ theme?: PartialDeep<Theme>;
9
+ }
10
+ export declare const filePrompt: import("@inquirer/type").Prompt<string, FilePromptConfig>;
11
+ export default filePrompt;
12
+ //# sourceMappingURL=file-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/input-types/file-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,KAAK,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAYlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;CAC5B;AAED,eAAO,MAAM,UAAU,2DAmKrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,166 @@
1
+ import { createPrompt, useState, useKeypress, usePrefix, isEnterKey, isBackspaceKey, makeTheme, } from '@inquirer/core';
2
+ import chalk from 'chalk';
3
+ import path from 'node:path';
4
+ import { listFilesWithCache, sortFilesByModTime, filterFilesByPattern, expandPath, resolveFilePath, } from '../../utils/file-utils.js';
5
+ import { Trie, completeFilePath } from '../../utils/trie.js';
6
+ export const filePrompt = createPrompt((config, done) => {
7
+ const { message, basePath = './', filter = '', default: defaultValue = '' } = config;
8
+ const theme = makeTheme(config.theme);
9
+ const prefix = usePrefix({ theme });
10
+ const [input, setInput] = useState(defaultValue);
11
+ const [cursorPosition, setCursorPosition] = useState(defaultValue.length);
12
+ const [suggestions, setSuggestions] = useState([]);
13
+ const [selectedSuggestion, setSelectedSuggestion] = useState(0);
14
+ const [error, setError] = useState(null);
15
+ const getCurrentPath = () => {
16
+ const expandedInput = expandPath(input);
17
+ const resolvedPath = resolveFilePath(expandedInput, basePath);
18
+ // If input ends with a separator, it's a directory
19
+ if (input.endsWith(path.sep)) {
20
+ return resolvedPath;
21
+ }
22
+ // Otherwise, use the directory part of the path
23
+ const dirPath = path.dirname(resolvedPath);
24
+ // Ensure we have a valid path
25
+ return dirPath || basePath;
26
+ };
27
+ const getBaseName = () => {
28
+ if (input.endsWith(path.sep)) {
29
+ return '';
30
+ }
31
+ return path.basename(input);
32
+ };
33
+ useKeypress((key) => {
34
+ if (isEnterKey(key)) {
35
+ if (suggestions.length > 0 && selectedSuggestion >= 0) {
36
+ // Use selected suggestion
37
+ const selected = suggestions[selectedSuggestion];
38
+ let newPath;
39
+ // If input ends with a separator, we're in a directory
40
+ if (input.endsWith(path.sep)) {
41
+ newPath = input + selected;
42
+ }
43
+ else {
44
+ const currentDir = path.dirname(input);
45
+ newPath = currentDir === '.' ? selected : path.join(currentDir, selected);
46
+ }
47
+ const expandedPath = expandPath(newPath);
48
+ const finalPath = resolveFilePath(expandedPath, basePath);
49
+ done(finalPath);
50
+ }
51
+ else {
52
+ // Submit current input
53
+ const expandedInput = expandPath(input);
54
+ const finalPath = resolveFilePath(expandedInput, basePath);
55
+ done(finalPath);
56
+ }
57
+ }
58
+ else if (key.name === 'tab') {
59
+ // Tab completion
60
+ try {
61
+ const currentPath = getCurrentPath();
62
+ if (!currentPath) {
63
+ throw new Error('Invalid path');
64
+ }
65
+ const files = listFilesWithCache(currentPath);
66
+ const sortedFiles = sortFilesByModTime(files);
67
+ const filteredFiles = filter ? filterFilesByPattern(sortedFiles, filter) : sortedFiles;
68
+ // Build trie with file names
69
+ const trie = new Trie();
70
+ const fileNames = filteredFiles.map(f => f.isDirectory ? f.name + path.sep : f.name);
71
+ fileNames.forEach(name => trie.insert(name));
72
+ // Complete based on current input
73
+ const baseName = getBaseName();
74
+ const result = completeFilePath(baseName, fileNames);
75
+ if (result.suggestions.length === 0 && result.completed !== baseName) {
76
+ // Single match - complete it
77
+ const currentDir = path.dirname(input);
78
+ const completed = currentDir === '.' ? result.completed : path.join(currentDir, result.completed);
79
+ setInput(completed);
80
+ setCursorPosition(completed.length);
81
+ setSuggestions([]);
82
+ }
83
+ else if (result.suggestions.length > 0) {
84
+ // Multiple matches - show suggestions
85
+ setSuggestions(result.suggestions);
86
+ setSelectedSuggestion(0);
87
+ // Complete to common prefix
88
+ if (result.completed !== baseName) {
89
+ const currentDir = path.dirname(input);
90
+ const completed = currentDir === '.' ? result.completed : path.join(currentDir, result.completed);
91
+ setInput(completed);
92
+ setCursorPosition(completed.length);
93
+ }
94
+ }
95
+ setError(null);
96
+ }
97
+ catch (err) {
98
+ setError(err instanceof Error ? err.message : 'Error listing files');
99
+ }
100
+ }
101
+ else if (key.name === 'up' && suggestions.length > 0) {
102
+ setSelectedSuggestion(Math.max(0, selectedSuggestion - 1));
103
+ }
104
+ else if (key.name === 'down' && suggestions.length > 0) {
105
+ setSelectedSuggestion(Math.min(suggestions.length - 1, selectedSuggestion + 1));
106
+ }
107
+ else if (key.name === 'escape') {
108
+ setSuggestions([]);
109
+ setSelectedSuggestion(0);
110
+ }
111
+ else if (isBackspaceKey(key)) {
112
+ if (cursorPosition > 0) {
113
+ const newInput = input.slice(0, cursorPosition - 1) + input.slice(cursorPosition);
114
+ setInput(newInput);
115
+ setCursorPosition(cursorPosition - 1);
116
+ setSuggestions([]);
117
+ setSelectedSuggestion(0);
118
+ }
119
+ }
120
+ else if (key.name === 'left') {
121
+ setCursorPosition(Math.max(0, cursorPosition - 1));
122
+ }
123
+ else if (key.name === 'right') {
124
+ setCursorPosition(Math.min(input.length, cursorPosition + 1));
125
+ }
126
+ else if (key.name === 'home') {
127
+ setCursorPosition(0);
128
+ }
129
+ else if (key.name === 'end') {
130
+ setCursorPosition(input.length);
131
+ }
132
+ else if (key.name && !key.ctrl && key.name.length === 1) {
133
+ // Regular character input
134
+ const newInput = input.slice(0, cursorPosition) + key.name + input.slice(cursorPosition);
135
+ setInput(newInput);
136
+ setCursorPosition(cursorPosition + 1);
137
+ setSuggestions([]);
138
+ setSelectedSuggestion(0);
139
+ }
140
+ });
141
+ // Build display
142
+ let display = `${prefix} ${theme.style.message(message, 'idle')} `;
143
+ // Show input with cursor
144
+ const beforeCursor = input.slice(0, cursorPosition);
145
+ const afterCursor = input.slice(cursorPosition);
146
+ const inputDisplay = theme.style.answer(beforeCursor + '│' + afterCursor);
147
+ display += inputDisplay;
148
+ if (error) {
149
+ display += '\n' + theme.style.error(` ! ${error}`);
150
+ }
151
+ if (suggestions.length > 0) {
152
+ display += '\n' + chalk.dim(' Suggestions:');
153
+ suggestions.forEach((suggestion, index) => {
154
+ const isSelected = index === selectedSuggestion;
155
+ const marker = isSelected ? '❯' : ' ';
156
+ const text = isSelected
157
+ ? theme.style.highlight(suggestion)
158
+ : chalk.dim(suggestion);
159
+ display += '\n ' + marker + ' ' + text;
160
+ });
161
+ display += '\n' + chalk.dim(' (Use ↑↓ to navigate, Tab to complete, Enter to select)');
162
+ }
163
+ return display;
164
+ });
165
+ export default filePrompt;
166
+ //# sourceMappingURL=file-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-prompt.js","sourceRoot":"","sources":["../../../src/prompts/input-types/file-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { PartialDeep } from '@inquirer/type';
2
+ import type { Theme } from '@inquirer/core';
3
+ export interface FileSearchConfig {
4
+ message: string;
5
+ basePath?: string;
6
+ filter?: string;
7
+ default?: string;
8
+ theme?: PartialDeep<Theme>;
9
+ }
10
+ export declare function fileSearchPrompt(config: FileSearchConfig): Promise<string>;
11
+ export default fileSearchPrompt;
12
+ //# sourceMappingURL=file-search-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-search-prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/input-types/file-search-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;CAC5B;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDhF;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { search } from '@inquirer/prompts';
2
+ import { FileSearchEngine } from '../../search/file-search-engine.js';
3
+ export async function fileSearchPrompt(config) {
4
+ const searchEngine = new FileSearchEngine(config.basePath || '.', config.filter);
5
+ return await search({
6
+ message: config.message,
7
+ source: async (input, { signal }) => {
8
+ // CRITICAL: This function is called on EVERY keystroke
9
+ // ensuring real-time updates as the user types
10
+ // If no input, show contents of current directory
11
+ if (!input) {
12
+ const currentDirFiles = await searchEngine.listDirectory(config.basePath || '.');
13
+ return currentDirFiles.map(file => {
14
+ const formatted = searchEngine.formatFileInfo(file);
15
+ return {
16
+ name: formatted.display,
17
+ value: formatted.value,
18
+ description: formatted.description,
19
+ };
20
+ });
21
+ }
22
+ // Always return results, even for partial input
23
+ // Example: "des" should immediately return ["design/", "desktop.ini", etc.]
24
+ const results = await searchEngine.search(input, signal);
25
+ const choices = results.map(file => {
26
+ const formatted = searchEngine.formatFileInfo(file);
27
+ return {
28
+ name: formatted.display,
29
+ value: formatted.value,
30
+ description: formatted.description,
31
+ };
32
+ });
33
+ // Add option to use the manually typed path if it doesn't exist in results
34
+ // Only add this option if the input looks like a valid path
35
+ if (input && input.trim() !== '') {
36
+ const normalizedInput = searchEngine.normalizePathInput(input);
37
+ const absolutePath = searchEngine.resolveToAbsolutePath(normalizedInput);
38
+ // Check if this exact path is already in the results
39
+ const pathAlreadyInResults = choices.some(choice => choice.value === absolutePath);
40
+ if (!pathAlreadyInResults) {
41
+ // Add the manual input option at the end
42
+ choices.push({
43
+ name: `📝 Use typed path: ${input}`,
44
+ value: absolutePath,
45
+ description: 'Create or use non-existent file',
46
+ });
47
+ }
48
+ }
49
+ return choices;
50
+ },
51
+ });
52
+ }
53
+ export default fileSearchPrompt;
54
+ //# sourceMappingURL=file-search-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-search-prompt.js","sourceRoot":"","sources":["../../../src/prompts/input-types/file-search-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAYtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjF,OAAO,MAAM,MAAM,CAAS;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE,MAAM,EAA2B,EAAE,EAAE;YAC/E,uDAAuD;YACvD,+CAA+C;YAE/C,kDAAkD;YAClD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;gBACjF,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAChC,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBACpD,OAAO;wBACL,IAAI,EAAE,SAAS,CAAC,OAAO;wBACvB,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,WAAW,EAAE,SAAS,CAAC,WAAW;qBACnC,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YAED,gDAAgD;YAChD,4EAA4E;YAC5E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACjC,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACpD,OAAO;oBACL,IAAI,EAAE,SAAS,CAAC,OAAO;oBACvB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,WAAW,EAAE,SAAS,CAAC,WAAW;iBACnC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,2EAA2E;YAC3E,4DAA4D;YAC5D,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjC,MAAM,eAAe,GAAG,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/D,MAAM,YAAY,GAAG,YAAY,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAEzE,qDAAqD;gBACrD,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;gBAEnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,yCAAyC;oBACzC,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,sBAAsB,KAAK,EAAE;wBACnC,KAAK,EAAE,YAAY;wBACnB,WAAW,EAAE,iCAAiC;qBAC/C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type FileSearchConfig } from './file-search-prompt.js';
2
+ export declare function reviewFilePrompt(config: FileSearchConfig): Promise<string>;
3
+ export default reviewFilePrompt;
4
+ //# sourceMappingURL=review-file-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-file-prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/input-types/review-file-prompt.ts"],"names":[],"mappings":"AAAA,OAAyB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAElF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhF;AAED,eAAe,gBAAgB,CAAC"}