@pupt/cli 0.0.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -29
  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 +435 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/add.d.ts +5 -0
  12. package/dist/commands/add.d.ts.map +1 -0
  13. package/dist/commands/add.js +164 -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 +99 -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/cache.d.ts +9 -0
  24. package/dist/commands/cache.d.ts.map +1 -0
  25. package/dist/commands/cache.js +31 -0
  26. package/dist/commands/cache.js.map +1 -0
  27. package/dist/commands/config.d.ts +8 -0
  28. package/dist/commands/config.d.ts.map +1 -0
  29. package/dist/commands/config.js +93 -0
  30. package/dist/commands/config.js.map +1 -0
  31. package/dist/commands/edit.d.ts +2 -0
  32. package/dist/commands/edit.d.ts.map +1 -0
  33. package/dist/commands/edit.js +35 -0
  34. package/dist/commands/edit.js.map +1 -0
  35. package/dist/commands/help.d.ts +2 -0
  36. package/dist/commands/help.d.ts.map +1 -0
  37. package/dist/commands/help.js +26 -0
  38. package/dist/commands/help.js.map +1 -0
  39. package/dist/commands/history.d.ts +12 -0
  40. package/dist/commands/history.d.ts.map +1 -0
  41. package/dist/commands/history.js +317 -0
  42. package/dist/commands/history.js.map +1 -0
  43. package/dist/commands/init.d.ts +2 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +137 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/install.d.ts +16 -0
  48. package/dist/commands/install.d.ts.map +1 -0
  49. package/dist/commands/install.js +263 -0
  50. package/dist/commands/install.js.map +1 -0
  51. package/dist/commands/review.d.ts +3 -0
  52. package/dist/commands/review.d.ts.map +1 -0
  53. package/dist/commands/review.js +160 -0
  54. package/dist/commands/review.js.map +1 -0
  55. package/dist/commands/run.d.ts +32 -0
  56. package/dist/commands/run.d.ts.map +1 -0
  57. package/dist/commands/run.js +367 -0
  58. package/dist/commands/run.js.map +1 -0
  59. package/dist/commands/uninstall.d.ts +2 -0
  60. package/dist/commands/uninstall.d.ts.map +1 -0
  61. package/dist/commands/uninstall.js +45 -0
  62. package/dist/commands/uninstall.js.map +1 -0
  63. package/dist/commands/update.d.ts +2 -0
  64. package/dist/commands/update.d.ts.map +1 -0
  65. package/dist/commands/update.js +113 -0
  66. package/dist/commands/update.js.map +1 -0
  67. package/dist/config/config-manager.d.ts +19 -0
  68. package/dist/config/config-manager.d.ts.map +1 -0
  69. package/dist/config/config-manager.js +221 -0
  70. package/dist/config/config-manager.js.map +1 -0
  71. package/dist/config/global-paths.d.ts +5 -0
  72. package/dist/config/global-paths.d.ts.map +1 -0
  73. package/dist/config/global-paths.js +16 -0
  74. package/dist/config/global-paths.js.map +1 -0
  75. package/dist/config/migration.d.ts +12 -0
  76. package/dist/config/migration.d.ts.map +1 -0
  77. package/dist/config/migration.js +270 -0
  78. package/dist/config/migration.js.map +1 -0
  79. package/dist/history/enhanced-history-manager.d.ts +27 -0
  80. package/dist/history/enhanced-history-manager.d.ts.map +1 -0
  81. package/dist/history/enhanced-history-manager.js +116 -0
  82. package/dist/history/enhanced-history-manager.js.map +1 -0
  83. package/dist/history/history-manager.d.ts +43 -0
  84. package/dist/history/history-manager.d.ts.map +1 -0
  85. package/dist/history/history-manager.js +229 -0
  86. package/dist/history/history-manager.js.map +1 -0
  87. package/dist/index.d.ts +6 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +6 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/prompts/input-types/file-search-prompt.d.ts +11 -0
  92. package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
  93. package/dist/prompts/input-types/file-search-prompt.js +53 -0
  94. package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
  95. package/dist/prompts/input-types/review-file-prompt.d.ts +3 -0
  96. package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
  97. package/dist/prompts/input-types/review-file-prompt.js +9 -0
  98. package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
  99. package/dist/schemas/config-schema.d.ts +1637 -0
  100. package/dist/schemas/config-schema.d.ts.map +1 -0
  101. package/dist/schemas/config-schema.js +136 -0
  102. package/dist/schemas/config-schema.js.map +1 -0
  103. package/dist/search/search-engine.d.ts +8 -0
  104. package/dist/search/search-engine.d.ts.map +1 -0
  105. package/dist/search/search-engine.js +53 -0
  106. package/dist/search/search-engine.js.map +1 -0
  107. package/dist/services/git-service.d.ts +28 -0
  108. package/dist/services/git-service.d.ts.map +1 -0
  109. package/dist/services/git-service.js +157 -0
  110. package/dist/services/git-service.js.map +1 -0
  111. package/dist/services/input-collector.d.ts +9 -0
  112. package/dist/services/input-collector.d.ts.map +1 -0
  113. package/dist/services/input-collector.js +162 -0
  114. package/dist/services/input-collector.js.map +1 -0
  115. package/dist/services/logging-service.d.ts +49 -0
  116. package/dist/services/logging-service.d.ts.map +1 -0
  117. package/dist/services/logging-service.js +203 -0
  118. package/dist/services/logging-service.js.map +1 -0
  119. package/dist/services/module-cache.d.ts +42 -0
  120. package/dist/services/module-cache.d.ts.map +1 -0
  121. package/dist/services/module-cache.js +205 -0
  122. package/dist/services/module-cache.js.map +1 -0
  123. package/dist/services/module-entry-builder.d.ts +20 -0
  124. package/dist/services/module-entry-builder.d.ts.map +1 -0
  125. package/dist/services/module-entry-builder.js +71 -0
  126. package/dist/services/module-entry-builder.js.map +1 -0
  127. package/dist/services/output-capture-service.d.ts +28 -0
  128. package/dist/services/output-capture-service.d.ts.map +1 -0
  129. package/dist/services/output-capture-service.js +348 -0
  130. package/dist/services/output-capture-service.js.map +1 -0
  131. package/dist/services/package-manager.d.ts +18 -0
  132. package/dist/services/package-manager.d.ts.map +1 -0
  133. package/dist/services/package-manager.js +141 -0
  134. package/dist/services/package-manager.js.map +1 -0
  135. package/dist/services/pattern-detector.d.ts +15 -0
  136. package/dist/services/pattern-detector.d.ts.map +1 -0
  137. package/dist/services/pattern-detector.js +228 -0
  138. package/dist/services/pattern-detector.js.map +1 -0
  139. package/dist/services/prompt-resolver.d.ts +32 -0
  140. package/dist/services/prompt-resolver.d.ts.map +1 -0
  141. package/dist/services/prompt-resolver.js +73 -0
  142. package/dist/services/prompt-resolver.js.map +1 -0
  143. package/dist/services/pupt-prompt-source.d.ts +16 -0
  144. package/dist/services/pupt-prompt-source.d.ts.map +1 -0
  145. package/dist/services/pupt-prompt-source.js +74 -0
  146. package/dist/services/pupt-prompt-source.js.map +1 -0
  147. package/dist/services/pupt-service.d.ts +33 -0
  148. package/dist/services/pupt-service.d.ts.map +1 -0
  149. package/dist/services/pupt-service.js +119 -0
  150. package/dist/services/pupt-service.js.map +1 -0
  151. package/dist/services/review-data-builder.d.ts +25 -0
  152. package/dist/services/review-data-builder.d.ts.map +1 -0
  153. package/dist/services/review-data-builder.js +333 -0
  154. package/dist/services/review-data-builder.js.map +1 -0
  155. package/dist/services/suggestion-generator.d.ts +11 -0
  156. package/dist/services/suggestion-generator.d.ts.map +1 -0
  157. package/dist/services/suggestion-generator.js +158 -0
  158. package/dist/services/suggestion-generator.js.map +1 -0
  159. package/dist/services/ui-service.d.ts +49 -0
  160. package/dist/services/ui-service.d.ts.map +1 -0
  161. package/dist/services/ui-service.js +196 -0
  162. package/dist/services/ui-service.js.map +1 -0
  163. package/dist/types/annotations.d.ts +50 -0
  164. package/dist/types/annotations.d.ts.map +1 -0
  165. package/dist/types/annotations.js +2 -0
  166. package/dist/types/annotations.js.map +1 -0
  167. package/dist/types/config.d.ts +110 -0
  168. package/dist/types/config.d.ts.map +1 -0
  169. package/dist/types/config.js +12 -0
  170. package/dist/types/config.js.map +1 -0
  171. package/dist/types/history.d.ts +36 -0
  172. package/dist/types/history.d.ts.map +1 -0
  173. package/dist/types/history.js +2 -0
  174. package/dist/types/history.js.map +1 -0
  175. package/dist/types/patterns.d.ts +25 -0
  176. package/dist/types/patterns.d.ts.map +1 -0
  177. package/dist/types/patterns.js +2 -0
  178. package/dist/types/patterns.js.map +1 -0
  179. package/dist/types/prompt.d.ts +29 -0
  180. package/dist/types/prompt.d.ts.map +1 -0
  181. package/dist/types/prompt.js +24 -0
  182. package/dist/types/prompt.js.map +1 -0
  183. package/dist/types/review.d.ts +81 -0
  184. package/dist/types/review.d.ts.map +1 -0
  185. package/dist/types/review.js +2 -0
  186. package/dist/types/review.js.map +1 -0
  187. package/dist/ui/console-ui.d.ts +30 -0
  188. package/dist/ui/console-ui.d.ts.map +1 -0
  189. package/dist/ui/console-ui.js +88 -0
  190. package/dist/ui/console-ui.js.map +1 -0
  191. package/dist/ui/interactive-search.d.ts +8 -0
  192. package/dist/ui/interactive-search.d.ts.map +1 -0
  193. package/dist/ui/interactive-search.js +29 -0
  194. package/dist/ui/interactive-search.js.map +1 -0
  195. package/dist/utils/annotation-migration.d.ts +12 -0
  196. package/dist/utils/annotation-migration.d.ts.map +1 -0
  197. package/dist/utils/annotation-migration.js +88 -0
  198. package/dist/utils/annotation-migration.js.map +1 -0
  199. package/dist/utils/date-formatter.d.ts +10 -0
  200. package/dist/utils/date-formatter.d.ts.map +1 -0
  201. package/dist/utils/date-formatter.js +46 -0
  202. package/dist/utils/date-formatter.js.map +1 -0
  203. package/dist/utils/editor.d.ts +14 -0
  204. package/dist/utils/editor.d.ts.map +1 -0
  205. package/dist/utils/editor.js +52 -0
  206. package/dist/utils/editor.js.map +1 -0
  207. package/dist/utils/errors.d.ts +58 -0
  208. package/dist/utils/errors.d.ts.map +1 -0
  209. package/dist/utils/errors.js +275 -0
  210. package/dist/utils/errors.js.map +1 -0
  211. package/dist/utils/git-info.d.ts +10 -0
  212. package/dist/utils/git-info.d.ts.map +1 -0
  213. package/dist/utils/git-info.js +44 -0
  214. package/dist/utils/git-info.js.map +1 -0
  215. package/dist/utils/gitignore.d.ts +10 -0
  216. package/dist/utils/gitignore.d.ts.map +1 -0
  217. package/dist/utils/gitignore.js +72 -0
  218. package/dist/utils/gitignore.js.map +1 -0
  219. package/dist/utils/logger.d.ts +39 -0
  220. package/dist/utils/logger.d.ts.map +1 -0
  221. package/dist/utils/logger.js +143 -0
  222. package/dist/utils/logger.js.map +1 -0
  223. package/dist/utils/platform.d.ts +9 -0
  224. package/dist/utils/platform.d.ts.map +1 -0
  225. package/dist/utils/platform.js +45 -0
  226. package/dist/utils/platform.js.map +1 -0
  227. package/dist/utils/project-root.d.ts +22 -0
  228. package/dist/utils/project-root.d.ts.map +1 -0
  229. package/dist/utils/project-root.js +226 -0
  230. package/dist/utils/project-root.js.map +1 -0
  231. package/dist/utils/prompt-dir-resolver.d.ts +5 -0
  232. package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
  233. package/dist/utils/prompt-dir-resolver.js +25 -0
  234. package/dist/utils/prompt-dir-resolver.js.map +1 -0
  235. package/dist/utils/security.d.ts +5 -0
  236. package/dist/utils/security.d.ts.map +1 -0
  237. package/dist/utils/security.js +57 -0
  238. package/dist/utils/security.js.map +1 -0
  239. package/dist/utils/tool-detection.d.ts +14 -0
  240. package/dist/utils/tool-detection.d.ts.map +1 -0
  241. package/dist/utils/tool-detection.js +43 -0
  242. package/dist/utils/tool-detection.js.map +1 -0
  243. package/package.json +79 -7
  244. package/prompts/prompts/ad-hoc-long.prompt +60 -0
  245. package/prompts/prompts/ad-hoc.prompt +29 -0
  246. package/prompts/prompts/code-review.prompt +99 -0
  247. package/prompts/prompts/debugging-error-message.prompt +81 -0
  248. package/prompts/prompts/fix-github-actions.prompt +62 -0
  249. package/prompts/prompts/fix-test-errors.prompt +73 -0
  250. package/prompts/prompts/git-commit-comment.prompt +61 -0
  251. package/prompts/prompts/implementation-phase.prompt +53 -0
  252. package/prompts/prompts/implementation-plan.prompt +101 -0
  253. package/prompts/prompts/new-feature.prompt +89 -0
  254. package/prompts/prompts/new-project.prompt +9 -0
  255. package/prompts/prompts/one-shot-change.prompt +79 -0
  256. package/prompts/prompts/pupt-prompt-improvement.prompt +270 -0
  257. package/prompts/prompts/simple-test.prompt +8 -0
  258. package/prompts/prompts/update-design.prompt +71 -0
  259. package/prompts/prompts/update-documentation.prompt +6 -0
@@ -0,0 +1,116 @@
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import fs from 'fs-extra';
4
+ import { calculateActiveExecutionTime, extractUserInputLines } from '../services/output-capture-service.js';
5
+ import { DateFormats } from '../utils/date-formatter.js';
6
+ import { formatDuration, getGitInfo } from '../utils/git-info.js';
7
+ import { sanitizeObject } from '../utils/security.js';
8
+ import { HistoryManager } from './history-manager.js';
9
+ export class EnhancedHistoryManager extends HistoryManager {
10
+ enhancedHistoryDir;
11
+ constructor(enhancedHistoryDir) {
12
+ super(enhancedHistoryDir);
13
+ this.enhancedHistoryDir = enhancedHistoryDir;
14
+ }
15
+ async listHistory(limit) {
16
+ const entries = await super.listHistory(limit);
17
+ // The parent method returns HistoryEntry[], but they may actually contain enhanced fields
18
+ // TypeScript just doesn't know about them, so we cast
19
+ return entries;
20
+ }
21
+ async getHistoryEntry(index) {
22
+ const entry = await super.getHistoryEntry(index);
23
+ return entry;
24
+ }
25
+ async savePrompt(options) {
26
+ // Don't save empty prompts
27
+ if (!options.finalPrompt || !options.finalPrompt.trim()) {
28
+ return '';
29
+ }
30
+ try {
31
+ await fs.ensureDir(this.enhancedHistoryDir);
32
+ const now = options.timestamp || new Date();
33
+ const timestamp = DateFormats.UTC_DATETIME(now);
34
+ // Generate filename using local time: YYYYMMDD-HHMMSS-<random>.json
35
+ const 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
+ const timeStr = `${hours}${minutes}${seconds}`;
40
+ const random = crypto.randomBytes(4).toString('hex');
41
+ const filename = `${dateStr}-${timeStr}-${random}.json`;
42
+ // Gather environment info
43
+ const gitInfo = await getGitInfo();
44
+ const environment = {
45
+ working_directory: process.cwd(),
46
+ node_version: process.version,
47
+ os: process.platform,
48
+ ...(gitInfo.gitDir && { git_dir: gitInfo.gitDir }),
49
+ ...(gitInfo.branch && { git_branch: gitInfo.branch }),
50
+ ...(gitInfo.commit && { git_commit: gitInfo.commit }),
51
+ ...(gitInfo.isDirty !== undefined && { git_dirty: gitInfo.isDirty }),
52
+ ...(process.env.SHELL && { shell: process.env.SHELL })
53
+ };
54
+ // Build execution info if provided
55
+ let execution;
56
+ if (options.startTime) {
57
+ const endTime = options.endTime || new Date();
58
+ let duration = formatDuration(options.startTime, endTime);
59
+ let activeTime;
60
+ let userInputCount;
61
+ // If we have a JSON output file, calculate active execution time
62
+ if (options.outputFile && options.outputFile.endsWith('.json')) {
63
+ try {
64
+ const activeNanos = await calculateActiveExecutionTime(options.outputFile);
65
+ const activeMs = Number(activeNanos / 1000000n);
66
+ activeTime = `${activeMs}ms`;
67
+ // Also get user input count
68
+ const userInputs = await extractUserInputLines(options.outputFile);
69
+ userInputCount = userInputs.length;
70
+ }
71
+ catch {
72
+ // If calculation fails, just use the provided execution time
73
+ if (options.executionTime) {
74
+ activeTime = `${options.executionTime}ms`;
75
+ }
76
+ }
77
+ }
78
+ else if (options.executionTime) {
79
+ // Use the execution time from run.ts if no JSON file
80
+ duration = `${options.executionTime}ms`;
81
+ }
82
+ execution = {
83
+ start_time: options.startTime.toISOString(),
84
+ end_time: endTime.toISOString(),
85
+ duration,
86
+ exit_code: options.exitCode ?? null,
87
+ command: options.command || 'unknown',
88
+ ...(options.outputFile && { output_file: options.outputFile }),
89
+ ...(options.outputSize !== undefined && { output_size: options.outputSize }),
90
+ ...(activeTime && { active_time: activeTime }),
91
+ ...(userInputCount !== undefined && { user_input_count: userInputCount })
92
+ };
93
+ }
94
+ // Create enhanced history entry
95
+ const entry = {
96
+ timestamp,
97
+ templatePath: options.templatePath,
98
+ templateContent: options.templateContent,
99
+ variables: sanitizeObject(Object.fromEntries(options.variables)),
100
+ finalPrompt: options.finalPrompt,
101
+ title: options.title,
102
+ summary: options.summary,
103
+ environment,
104
+ ...(execution && { execution })
105
+ };
106
+ // Save to history
107
+ const filePath = path.join(this.enhancedHistoryDir, filename);
108
+ await fs.writeJson(filePath, entry, { spaces: 2 });
109
+ return filename;
110
+ }
111
+ catch (error) {
112
+ throw new Error(`Failed to save prompt to history: ${error instanceof Error ? error.message : String(error)}`);
113
+ }
114
+ }
115
+ }
116
+ //# 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,43 @@
1
+ import { AnnotationMetadata } from '../types/annotations.js';
2
+ import { EnhancedHistoryEntry, HistoryEntry } from '../types/history.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
+ rerunFrom?: string;
21
+ }
22
+ export declare class HistoryManager {
23
+ private historyDir;
24
+ private annotationDir?;
25
+ constructor(historyDir: string, annotationDir?: string | undefined);
26
+ savePrompt(options: HistorySaveOptions): Promise<string>;
27
+ listHistory(limit?: number, filterOptions?: {
28
+ gitDir?: string;
29
+ workingDir?: string;
30
+ includeLegacy?: boolean;
31
+ }): Promise<HistoryEntry[]>;
32
+ getTotalCount(filterOptions?: {
33
+ gitDir?: string;
34
+ workingDir?: string;
35
+ includeLegacy?: boolean;
36
+ }): Promise<number>;
37
+ getHistoryEntry(index: number): Promise<HistoryEntry | null>;
38
+ getAnnotationsForHistoryEntry(historyEntry: HistoryEntry): Promise<string[]>;
39
+ private maskSensitiveVariables;
40
+ saveAnnotation(historyEntry: HistoryEntry | EnhancedHistoryEntry, metadata: AnnotationMetadata, notes?: string): Promise<void>;
41
+ }
42
+ export {};
43
+ //# 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":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAC,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxE,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;IAEF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;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;IAiExD,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsEvI,aAAa,CAAC,aAAa,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBjH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA2B5D,6BAA6B,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkClF,OAAO,CAAC,sBAAsB;IAKxB,cAAc,CAClB,YAAY,EAAE,YAAY,GAAG,oBAAoB,EACjD,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;CA8BjB"}
@@ -0,0 +1,229 @@
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import fs from 'fs-extra';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ import { DateFormats } from '../utils/date-formatter.js';
6
+ import { logger } from '../utils/logger.js';
7
+ import { sanitizeObject } from '../utils/security.js';
8
+ export class HistoryManager {
9
+ historyDir;
10
+ annotationDir;
11
+ constructor(historyDir, annotationDir) {
12
+ this.historyDir = historyDir;
13
+ this.annotationDir = annotationDir;
14
+ }
15
+ async savePrompt(options) {
16
+ // Don't save empty prompts
17
+ if (!options.finalPrompt || !options.finalPrompt.trim()) {
18
+ return '';
19
+ }
20
+ try {
21
+ await fs.ensureDir(this.historyDir);
22
+ const now = options.timestamp || new Date();
23
+ const timestamp = DateFormats.UTC_DATETIME(now);
24
+ // Use provided filename components or generate new ones
25
+ let dateStr;
26
+ let timeStr;
27
+ let randomSuffix;
28
+ if (options.filenameComponents) {
29
+ // Use provided components for synchronized naming
30
+ ({ dateStr, timeStr, randomSuffix } = options.filenameComponents);
31
+ }
32
+ else {
33
+ // Generate filename using local time: YYYYMMDD-HHMMSS-<random>.json
34
+ 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
+ timeStr = `${hours}${minutes}${seconds}`;
39
+ randomSuffix = crypto.randomBytes(4).toString('hex');
40
+ }
41
+ const filename = `${dateStr}-${timeStr}-${randomSuffix}.json`;
42
+ // Create history entry
43
+ const entry = {
44
+ timestamp,
45
+ templatePath: options.templatePath,
46
+ templateContent: options.templateContent,
47
+ variables: this.maskSensitiveVariables(options.variables),
48
+ finalPrompt: options.finalPrompt,
49
+ title: options.title,
50
+ summary: options.summary,
51
+ ...(options.rerunFrom && { rerun: options.rerunFrom })
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).split(path.sep).join('/') }),
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, filterOptions) {
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
+ // Load entries (we need to load all to filter)
80
+ let entries = [];
81
+ for (const filename of historyFiles) {
82
+ try {
83
+ const filePath = path.join(this.historyDir, filename);
84
+ const entry = await fs.readJson(filePath);
85
+ entries.push({ ...entry, filename });
86
+ }
87
+ catch {
88
+ // Skip invalid files silently in tests
89
+ if (process.env.NODE_ENV !== 'test') {
90
+ logger.warn(`Skipping invalid history file: ${filename}`);
91
+ }
92
+ }
93
+ }
94
+ // Apply directory filtering if specified
95
+ if (filterOptions?.gitDir || filterOptions?.workingDir) {
96
+ entries = entries.filter(entry => {
97
+ const enhancedEntry = entry;
98
+ const env = enhancedEntry.environment;
99
+ // Backwards compatibility: entries without environment info or without git_dir
100
+ // are treated as belonging to the current directory when includeLegacy is true
101
+ if (!env || !env.git_dir) {
102
+ return filterOptions.includeLegacy === true;
103
+ }
104
+ // If gitDir filter is specified, match against git_dir
105
+ if (filterOptions.gitDir) {
106
+ if (env.git_dir === filterOptions.gitDir) {
107
+ return true;
108
+ }
109
+ }
110
+ // If workingDir filter is specified, match against working_directory
111
+ if (filterOptions.workingDir) {
112
+ if (env.working_directory === filterOptions.workingDir) {
113
+ return true;
114
+ }
115
+ }
116
+ return false;
117
+ });
118
+ }
119
+ // Apply limit if specified (get most recent entries)
120
+ const limitedEntries = limit ? entries.slice(-limit) : entries;
121
+ return limitedEntries;
122
+ }
123
+ catch (error) {
124
+ if (error?.code === 'ENOENT') {
125
+ return [];
126
+ }
127
+ throw error;
128
+ }
129
+ }
130
+ async getTotalCount(filterOptions) {
131
+ try {
132
+ // If filtering is requested, we need to load and count matching entries
133
+ if (filterOptions?.gitDir || filterOptions?.workingDir) {
134
+ const entries = await this.listHistory(undefined, filterOptions);
135
+ return entries.length;
136
+ }
137
+ await fs.ensureDir(this.historyDir);
138
+ const files = await fs.readdir(this.historyDir);
139
+ // Count JSON files with expected format
140
+ const historyFiles = files.filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/));
141
+ return historyFiles.length;
142
+ }
143
+ catch (error) {
144
+ if (error?.code === 'ENOENT') {
145
+ return 0;
146
+ }
147
+ throw error;
148
+ }
149
+ }
150
+ async getHistoryEntry(index) {
151
+ try {
152
+ // Get all history files sorted by date (oldest first)
153
+ const files = await fs.readdir(this.historyDir);
154
+ const historyFiles = files
155
+ .filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/))
156
+ .sort();
157
+ // Check if index is valid (1-based)
158
+ if (index < 1 || index > historyFiles.length) {
159
+ return null;
160
+ }
161
+ // Load the entry (convert 1-based to 0-based index)
162
+ const filename = historyFiles[index - 1];
163
+ const filePath = path.join(this.historyDir, filename);
164
+ const entry = await fs.readJson(filePath);
165
+ return { ...entry, filename };
166
+ }
167
+ catch (error) {
168
+ if (process.env.NODE_ENV !== 'test') {
169
+ logger.error(`Failed to get history entry ${index}: ${error instanceof Error ? error.message : String(error)}`);
170
+ }
171
+ return null;
172
+ }
173
+ }
174
+ async getAnnotationsForHistoryEntry(historyEntry) {
175
+ if (!this.annotationDir) {
176
+ return [];
177
+ }
178
+ try {
179
+ await fs.ensureDir(this.annotationDir);
180
+ const files = await fs.readdir(this.annotationDir);
181
+ // Extract basename from history entry
182
+ const historyBasename = path.basename(historyEntry.filename, '.json');
183
+ // Find annotation files that match this history entry (both .md and .json)
184
+ const annotationFiles = files.filter(file => file.startsWith(`${historyBasename}-annotation-`) && (file.endsWith('.md') || file.endsWith('.json')));
185
+ // Read and return the content of each annotation
186
+ const annotations = [];
187
+ for (const file of annotationFiles) {
188
+ const content = await fs.readFile(path.join(this.annotationDir, file), 'utf-8');
189
+ annotations.push(content);
190
+ }
191
+ return annotations;
192
+ }
193
+ catch (error) {
194
+ if (process.env.NODE_ENV !== 'test') {
195
+ logger.error(`Failed to get annotations: ${error instanceof Error ? error.message : String(error)}`);
196
+ }
197
+ return [];
198
+ }
199
+ }
200
+ maskSensitiveVariables(variables) {
201
+ const obj = Object.fromEntries(variables);
202
+ return sanitizeObject(obj);
203
+ }
204
+ async saveAnnotation(historyEntry, metadata, notes) {
205
+ if (!this.annotationDir) {
206
+ logger.warn('Annotation directory not configured, skipping annotation save');
207
+ return;
208
+ }
209
+ await fs.ensureDir(this.annotationDir);
210
+ // Create JSON content with all metadata and notes
211
+ const annotationData = {
212
+ ...metadata,
213
+ notes: notes || (metadata.auto_detected ? 'Auto-generated annotation' : '')
214
+ };
215
+ // Create filename based on history entry
216
+ const historyBasename = path.basename(historyEntry.filename || `${historyEntry.timestamp}.json`, '.json');
217
+ const filename = `${historyBasename}-annotation-${uuidv4()}.json`;
218
+ const filepath = path.join(this.annotationDir, filename);
219
+ try {
220
+ await fs.writeJson(filepath, annotationData, { spaces: 2 });
221
+ logger.debug(`Auto-annotation saved to ${filepath}`);
222
+ }
223
+ catch (error) {
224
+ logger.error(`Failed to save annotation: ${error instanceof Error ? error.message : String(error)}`);
225
+ throw error;
226
+ }
227
+ }
228
+ }
229
+ //# sourceMappingURL=history-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-manager.js","sourceRoot":"","sources":["../../src/history/history-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './search/search-engine.js';
2
+ export * from './services/input-collector.js';
3
+ export * from './services/pupt-service.js';
4
+ export * from './ui/interactive-search.js';
5
+ export * from './utils/platform.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,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './search/search-engine.js';
2
+ export * from './services/input-collector.js';
3
+ export * from './services/pupt-service.js';
4
+ export * from './ui/interactive-search.js';
5
+ export * from './utils/platform.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Theme } from '@inquirer/core';
2
+ import type { PartialDeep } from '@inquirer/type';
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
+ //# 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":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,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"}
@@ -0,0 +1,53 @@
1
+ import { search } from '@inquirer/prompts';
2
+ import { FileSearchEngine } from '@pupt/lib';
3
+ export async function fileSearchPrompt(config) {
4
+ const searchEngine = await FileSearchEngine.create({ basePath: config.basePath || '.', filter: 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
+ //# 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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAU7C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhH,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"}
@@ -0,0 +1,3 @@
1
+ import { type FileSearchConfig } from './file-search-prompt.js';
2
+ export declare function reviewFilePrompt(config: FileSearchConfig): Promise<string>;
3
+ //# 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,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AAEjF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhF"}
@@ -0,0 +1,9 @@
1
+ import { fileSearchPrompt } from './file-search-prompt.js';
2
+ export async function reviewFilePrompt(config) {
3
+ // For now, reviewFile behaves exactly like file input
4
+ // The review will happen after the run command completes
5
+ const selectedFile = await fileSearchPrompt(config);
6
+ // Return the selected file path
7
+ return selectedFile;
8
+ }
9
+ //# sourceMappingURL=review-file-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-file-prompt.js","sourceRoot":"","sources":["../../../src/prompts/input-types/review-file-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,sDAAsD;IACtD,yDAAyD;IACzD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEpD,gCAAgC;IAChC,OAAO,YAAY,CAAC;AACtB,CAAC"}