@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,348 @@
1
+ import * as pty from '@homebridge/node-pty-prebuilt-multiarch';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import stripAnsi from 'strip-ansi';
5
+ import { getDataDir } from '../config/global-paths.js';
6
+ import { logger } from '../utils/logger.js';
7
+ // Helper to get high-precision timestamp
8
+ function getHighPrecisionTimestamp() {
9
+ // Use process.hrtime.bigint() for nanosecond precision on all platforms
10
+ return process.hrtime.bigint();
11
+ }
12
+ // Convert JSON output to plain text
13
+ function _convertJsonToPlainText(jsonFile, textFile) {
14
+ return fs.readJson(jsonFile).then((chunks) => {
15
+ const textContent = chunks
16
+ .filter(chunk => chunk.direction === 'output')
17
+ .map(chunk => chunk.data)
18
+ .join('');
19
+ return fs.writeFile(textFile, textContent);
20
+ });
21
+ }
22
+ // Extract user input lines from JSON output
23
+ export function extractUserInputLines(jsonFile) {
24
+ return fs.readJson(jsonFile).then((chunks) => {
25
+ return chunks
26
+ .filter(chunk => chunk.direction === 'input')
27
+ .map(chunk => chunk.data.trim())
28
+ .filter(line => line.length > 0);
29
+ });
30
+ }
31
+ // Calculate actual execution time excluding user input wait time
32
+ export function calculateActiveExecutionTime(jsonFile, inputWaitThreshold = 100000000n) {
33
+ return fs.readJson(jsonFile).then((chunks) => {
34
+ if (chunks.length === 0) {
35
+ return 0n;
36
+ }
37
+ let totalActiveTime = 0n;
38
+ let lastOutputTime = BigInt(chunks[0].timestamp);
39
+ for (let i = 1; i < chunks.length; i++) {
40
+ const chunk = chunks[i];
41
+ const chunkTime = BigInt(chunk.timestamp);
42
+ const timeDiff = chunkTime - lastOutputTime;
43
+ // If this is output after input and the gap is large, it's likely user thinking time
44
+ if (chunk.direction === 'output' && chunks[i - 1].direction === 'input' && timeDiff > inputWaitThreshold) {
45
+ // Don't count the wait time, just add a small amount for processing
46
+ totalActiveTime += inputWaitThreshold;
47
+ }
48
+ else {
49
+ // Normal processing time
50
+ totalActiveTime += timeDiff;
51
+ }
52
+ if (chunk.direction === 'output') {
53
+ lastOutputTime = chunkTime;
54
+ }
55
+ }
56
+ return totalActiveTime;
57
+ });
58
+ }
59
+ export class OutputCaptureService {
60
+ options;
61
+ defaultMaxSize = 10 * 1024 * 1024; // 10MB default
62
+ constructor(options = {}) {
63
+ this.options = {
64
+ outputDirectory: options.outputDirectory || path.join(getDataDir(), 'output'),
65
+ maxOutputSize: options.maxOutputSize || this.defaultMaxSize
66
+ };
67
+ }
68
+ captureCommandWithHandle(command, args, prompt, outputPath) {
69
+ let ptyProcess = null;
70
+ const promise = this._captureCommandInternal(command, args, prompt, outputPath, (process) => {
71
+ ptyProcess = process;
72
+ });
73
+ return {
74
+ promise,
75
+ kill: () => {
76
+ if (ptyProcess) {
77
+ try {
78
+ ptyProcess.kill();
79
+ }
80
+ catch {
81
+ // Process might already be dead
82
+ }
83
+ }
84
+ }
85
+ };
86
+ }
87
+ async captureCommand(command, args, prompt, outputPath) {
88
+ return this._captureCommandInternal(command, args, prompt, outputPath);
89
+ }
90
+ async _captureCommandInternal(command, args, prompt, outputPath, onProcessCreated) {
91
+ // Ensure output directory exists
92
+ const outputDir = path.dirname(outputPath);
93
+ await fs.ensureDir(outputDir);
94
+ // Change extension from .txt to .json if needed
95
+ const jsonOutputPath = outputPath.endsWith('.json')
96
+ ? outputPath
97
+ : outputPath.replace(/\.txt$/, '.json');
98
+ // Create array to store chunks
99
+ const chunks = [];
100
+ let bytesWritten = 0;
101
+ let truncated = false;
102
+ // Create a wrapper to track bytes and enforce size limit
103
+ const limitedWrite = (data, direction) => {
104
+ if (truncated) {
105
+ return;
106
+ }
107
+ const cleanData = stripAnsi(data);
108
+ const dataSize = Buffer.byteLength(cleanData);
109
+ if (bytesWritten + dataSize > this.options.maxOutputSize) {
110
+ // Write only what fits
111
+ const remaining = this.options.maxOutputSize - bytesWritten;
112
+ const truncatedData = cleanData.substring(0, remaining);
113
+ chunks.push({
114
+ timestamp: getHighPrecisionTimestamp().toString(),
115
+ direction,
116
+ data: truncatedData
117
+ });
118
+ chunks.push({
119
+ timestamp: getHighPrecisionTimestamp().toString(),
120
+ direction: 'output',
121
+ data: '\n\n[OUTPUT TRUNCATED - SIZE LIMIT REACHED]'
122
+ });
123
+ bytesWritten = this.options.maxOutputSize;
124
+ truncated = true;
125
+ }
126
+ else {
127
+ chunks.push({
128
+ timestamp: getHighPrecisionTimestamp().toString(),
129
+ direction,
130
+ data: cleanData
131
+ });
132
+ bytesWritten += dataSize;
133
+ }
134
+ };
135
+ return new Promise((resolve) => {
136
+ let ptyProcess = null;
137
+ let stdinListener = null;
138
+ let resizeListener = null;
139
+ const isTTY = process.stdin.isTTY && process.stdout.isTTY;
140
+ const cleanup = () => {
141
+ // Kill PTY process if still running
142
+ if (ptyProcess) {
143
+ try {
144
+ ptyProcess.kill();
145
+ }
146
+ catch {
147
+ // Process might already be dead
148
+ }
149
+ }
150
+ // Restore terminal mode
151
+ if (isTTY) {
152
+ try {
153
+ process.stdin.setRawMode(false);
154
+ }
155
+ catch {
156
+ // Ignore errors if stdin is already closed
157
+ }
158
+ }
159
+ // Remove listeners
160
+ if (stdinListener) {
161
+ process.stdin.removeListener('data', stdinListener);
162
+ }
163
+ if (resizeListener) {
164
+ process.stdout.removeListener('resize', resizeListener);
165
+ }
166
+ process.stdin.pause();
167
+ // Write chunks to JSON file
168
+ fs.writeJsonSync(jsonOutputPath, chunks, { spaces: 2 });
169
+ };
170
+ try {
171
+ // Get terminal dimensions
172
+ const cols = process.stdout.columns || 80;
173
+ const rows = process.stdout.rows || 30;
174
+ // Spawn PTY process - always spawn directly to preserve TTY
175
+ ptyProcess = pty.spawn(command, args, {
176
+ name: 'xterm-256color',
177
+ cols,
178
+ rows,
179
+ cwd: process.cwd(),
180
+ env: process.env
181
+ });
182
+ // Notify callback if provided
183
+ if (onProcessCreated && ptyProcess) {
184
+ onProcessCreated(ptyProcess);
185
+ }
186
+ // Track Claude raw mode errors
187
+ let claudeRawModeError = false;
188
+ // Handle data from PTY
189
+ const dataHandler = (data) => {
190
+ // Pass through to terminal (preserving colors)
191
+ process.stdout.write(data);
192
+ // Capture clean version
193
+ limitedWrite(data, 'output');
194
+ // Check for Claude raw mode error
195
+ if (command === 'claude' && data.includes('Raw mode is not supported') && data.includes('Ink')) {
196
+ claudeRawModeError = true;
197
+ }
198
+ };
199
+ ptyProcess.onData(dataHandler);
200
+ // Set up bidirectional communication for TTY
201
+ if (isTTY) {
202
+ // Put stdin into raw mode for proper terminal interaction
203
+ process.stdin.setRawMode(true);
204
+ process.stdin.resume();
205
+ // Forward stdin to PTY
206
+ stdinListener = (data) => {
207
+ if (ptyProcess) {
208
+ const inputStr = data.toString('binary');
209
+ ptyProcess.write(inputStr);
210
+ // Capture user input
211
+ limitedWrite(inputStr, 'input');
212
+ }
213
+ };
214
+ process.stdin.on('data', stdinListener);
215
+ // Handle terminal resize
216
+ resizeListener = () => {
217
+ if (ptyProcess) {
218
+ ptyProcess.resize(process.stdout.columns || cols, process.stdout.rows || rows);
219
+ }
220
+ };
221
+ process.stdout.on('resize', resizeListener);
222
+ }
223
+ // If we have a prompt, write it to the process
224
+ if (prompt) {
225
+ // Write prompt in chunks to avoid blocking on large inputs
226
+ const CHUNK_SIZE = 1024; // Safe chunk size for PTY buffers
227
+ let written = 0;
228
+ // Debug logging for CI environments is intentionally disabled
229
+ // to avoid linting errors. Use environment-specific debugging instead.
230
+ let writeTimeout = null;
231
+ const maxWriteTime = 5000; // 5 second max for writing all data
232
+ const writeNextChunk = () => {
233
+ if (written < prompt.length && ptyProcess) {
234
+ const chunk = prompt.slice(written, written + CHUNK_SIZE);
235
+ try {
236
+ ptyProcess.write(chunk);
237
+ written += chunk.length;
238
+ // Progress tracking disabled for production
239
+ // For macOS CI, use a small delay to prevent buffer overflow
240
+ if (process.platform === 'darwin' && process.env.CI) {
241
+ setTimeout(writeNextChunk, 1);
242
+ }
243
+ else {
244
+ // Use setImmediate to allow PTY to process data
245
+ setImmediate(writeNextChunk);
246
+ }
247
+ }
248
+ catch {
249
+ // Write errors are expected in some environments
250
+ // Continue anyway, command might still complete
251
+ }
252
+ }
253
+ else if (ptyProcess) {
254
+ if (writeTimeout) {
255
+ clearTimeout(writeTimeout);
256
+ }
257
+ // After all data is written, send newline and EOF
258
+ if (!prompt.endsWith('\n')) {
259
+ ptyProcess.write('\n');
260
+ }
261
+ // Send EOF signal to indicate end of input
262
+ setTimeout(() => {
263
+ if (ptyProcess) {
264
+ try {
265
+ ptyProcess.write('\x04'); // EOT
266
+ }
267
+ catch {
268
+ // EOF errors are non-critical
269
+ }
270
+ }
271
+ }, 50); // Reduced delay since we're already async
272
+ }
273
+ };
274
+ // Set a timeout to prevent infinite hangs
275
+ writeTimeout = setTimeout(() => {
276
+ // Timeout reached, but process may still complete
277
+ }, maxWriteTime);
278
+ writeNextChunk();
279
+ }
280
+ // Handle process exit
281
+ ptyProcess.onExit(({ exitCode }) => {
282
+ cleanup();
283
+ // If Claude had a raw mode error AND failed, provide helpful guidance
284
+ // Only show error if Claude actually failed (non-zero exit code)
285
+ if (claudeRawModeError && exitCode !== 0) {
286
+ logger.error(`\n${'─'.repeat(60)}`);
287
+ logger.error('\x1b[31mError: Claude cannot run in interactive mode when launched from pt.\x1b[0m');
288
+ logger.error('\x1b[33m\nThis typically happens when Claude needs to ask for directory trust permissions.\x1b[0m');
289
+ logger.error('\x1b[34m\nTo fix this:\x1b[0m');
290
+ logger.error('\x1b[37m1. Run Claude directly in this directory: \x1b[36mclaude\x1b[0m');
291
+ logger.error('\x1b[37m2. When prompted, trust the directory\x1b[0m');
292
+ logger.error('\x1b[37m3. Then run your pt command again\n\x1b[0m');
293
+ logger.error('\x1b[90mAlternatively, you can use: \x1b[36mpt run claude -- --permission-mode acceptEdits\x1b[0m');
294
+ logger.error(`${'─'.repeat(60)}\n`);
295
+ }
296
+ // Write final JSON file
297
+ fs.writeJsonSync(jsonOutputPath, chunks, { spaces: 2 });
298
+ resolve({
299
+ exitCode: (claudeRawModeError && exitCode !== 0) ? 1 : exitCode,
300
+ outputFile: jsonOutputPath,
301
+ outputSize: bytesWritten,
302
+ truncated,
303
+ error: (claudeRawModeError && exitCode !== 0) ? 'Claude requires interactive trust setup. Please see instructions above.' : undefined
304
+ });
305
+ });
306
+ }
307
+ catch (error) {
308
+ cleanup();
309
+ // Write any collected chunks before error
310
+ if (chunks.length > 0) {
311
+ fs.writeJsonSync(jsonOutputPath, chunks, { spaces: 2 });
312
+ }
313
+ resolve({
314
+ exitCode: 1,
315
+ outputFile: jsonOutputPath,
316
+ outputSize: bytesWritten,
317
+ error: error instanceof Error ? error.message : String(error)
318
+ });
319
+ }
320
+ });
321
+ }
322
+ async cleanupOldOutputs(retentionDays = 30) {
323
+ if (!this.options.outputDirectory) {
324
+ return;
325
+ }
326
+ try {
327
+ await fs.ensureDir(this.options.outputDirectory);
328
+ const files = await fs.readdir(this.options.outputDirectory);
329
+ const now = Date.now();
330
+ const retentionMs = retentionDays * 24 * 60 * 60 * 1000;
331
+ for (const file of files) {
332
+ // Clean up both .txt and .json output files
333
+ if (!file.endsWith('-output.txt') && !file.endsWith('-output.json')) {
334
+ continue;
335
+ }
336
+ const filePath = path.join(this.options.outputDirectory, file);
337
+ const stats = await fs.stat(filePath);
338
+ if (now - stats.mtime.getTime() > retentionMs) {
339
+ await fs.remove(filePath);
340
+ }
341
+ }
342
+ }
343
+ catch {
344
+ // Cleanup errors are not critical - silently continue
345
+ }
346
+ }
347
+ }
348
+ //# sourceMappingURL=output-capture-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-capture-service.js","sourceRoot":"","sources":["../../src/services/output-capture-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,yCAAyC,CAAC;AAC/D,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,yCAAyC;AACzC,SAAS,yBAAyB;IAChC,wEAAwE;IACxE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,oCAAoC;AACpC,SAAS,uBAAuB,CAAC,QAAgB,EAAE,QAAgB;IACjE,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAqB,EAAE,EAAE;QAC1D,MAAM,WAAW,GAAG,MAAM;aACvB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC;aAC7C,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aACxB,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAqB,EAAE,EAAE;QAC1D,OAAO,MAAM;aACV,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC;aAC5C,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,4BAA4B,CAAC,QAAgB,EAAE,kBAAkB,GAAG,UAAY;IAC9F,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAqB,EAAE,EAAE;QAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO,EAAE,CAAC;QAAA,CAAC;QAErC,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;YAE5C,qFAAqF;YACrF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;gBACvG,oEAAoE;gBACpE,eAAe,IAAI,kBAAkB,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,eAAe,IAAI,QAAQ,CAAC;YAC9B,CAAC;YAED,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACjC,cAAc,GAAG,SAAS,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AA+BD,MAAM,OAAO,oBAAoB;IACd,OAAO,CAA+B;IAC/C,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,eAAe;IAE1D,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG;YACb,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC;YAC7E,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc;SAC5D,CAAC;IACJ,CAAC;IAED,wBAAwB,CACtB,OAAe,EACf,IAAc,EACd,MAAc,EACd,UAAkB;QAElB,IAAI,UAAU,GAAoB,IAAI,CAAC;QAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;YAC1F,UAAU,GAAG,OAAO,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,IAAI,EAAE,GAAG,EAAE;gBACT,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC;wBACH,UAAU,CAAC,IAAI,EAAE,CAAC;oBACpB,CAAC;oBAAC,MAAM,CAAC;wBACP,gCAAgC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,OAAe,EACf,IAAc,EACd,MAAc,EACd,UAAkB;QAElB,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,OAAe,EACf,IAAc,EACd,MAAc,EACd,UAAkB,EAClB,gBAA8C;QAG9C,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9B,gDAAgD;QAChD,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YACjD,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE1C,+BAA+B;QAC/B,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,yDAAyD;QACzD,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,SAA6B,EAAQ,EAAE;YACzE,IAAI,SAAS,EAAE,CAAC;gBAAA,OAAO;YAAA,CAAC;YAExB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAE9C,IAAI,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBACzD,uBAAuB;gBACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;gBAC5D,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,yBAAyB,EAAE,CAAC,QAAQ,EAAE;oBACjD,SAAS;oBACT,IAAI,EAAE,aAAa;iBACpB,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,yBAAyB,EAAE,CAAC,QAAQ,EAAE;oBACjD,SAAS,EAAE,QAAQ;oBACnB,IAAI,EAAE,6CAA6C;iBACpD,CAAC,CAAC;gBACH,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;gBAC1C,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,yBAAyB,EAAE,CAAC,QAAQ,EAAE;oBACjD,SAAS;oBACT,IAAI,EAAE,SAAS;iBAChB,CAAC,CAAC;gBACH,YAAY,IAAI,QAAQ,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,UAAU,GAAoB,IAAI,CAAC;YACvC,IAAI,aAAa,GAAoC,IAAI,CAAC;YAC1D,IAAI,cAAc,GAAwB,IAAI,CAAC;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAE1D,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,oCAAoC;gBACpC,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC;wBACH,UAAU,CAAC,IAAI,EAAE,CAAC;oBACpB,CAAC;oBAAC,MAAM,CAAC;wBACP,gCAAgC;oBAClC,CAAC;gBACH,CAAC;gBAED,wBAAwB;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC;wBACH,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClC,CAAC;oBAAC,MAAM,CAAC;wBACP,2CAA2C;oBAC7C,CAAC;gBACH,CAAC;gBAED,mBAAmB;gBACnB,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC1D,CAAC;gBAED,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAEtB,4BAA4B;gBAC5B,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,0BAA0B;gBAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBAEvC,4DAA4D;gBAC5D,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;oBACpC,IAAI,EAAE,gBAAgB;oBACtB,IAAI;oBACJ,IAAI;oBACJ,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;oBAClB,GAAG,EAAE,OAAO,CAAC,GAA6B;iBAC3C,CAAC,CAAC;gBAEH,8BAA8B;gBAC9B,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAAC;oBACnC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAC/B,CAAC;gBAED,+BAA+B;gBAC/B,IAAI,kBAAkB,GAAG,KAAK,CAAC;gBAE/B,uBAAuB;gBACvB,MAAM,WAAW,GAAG,CAAC,IAAY,EAAQ,EAAE;oBACzC,+CAA+C;oBAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3B,wBAAwB;oBACxB,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAE7B,kCAAkC;oBAClC,IAAI,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/F,kBAAkB,GAAG,IAAI,CAAC;oBAC5B,CAAC;gBACH,CAAC,CAAC;gBACF,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAE/B,6CAA6C;gBAC7C,IAAI,KAAK,EAAE,CAAC;oBACV,0DAA0D;oBAC1D,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAEvB,uBAAuB;oBACvB,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;wBAC/B,IAAI,UAAU,EAAE,CAAC;4BACf,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;4BACzC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BAC3B,qBAAqB;4BACrB,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBAClC,CAAC;oBACH,CAAC,CAAC;oBACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;oBAExC,yBAAyB;oBACzB,cAAc,GAAG,GAAG,EAAE;wBACpB,IAAI,UAAU,EAAE,CAAC;4BACf,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;wBACjF,CAAC;oBACH,CAAC,CAAC;oBACF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC9C,CAAC;gBAED,+CAA+C;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACX,2DAA2D;oBAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,kCAAkC;oBAC3D,IAAI,OAAO,GAAG,CAAC,CAAC;oBAEhB,8DAA8D;oBAC9D,uEAAuE;oBAEvE,IAAI,YAAY,GAA0B,IAAI,CAAC;oBAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,oCAAoC;oBAE/D,MAAM,cAAc,GAAG,GAAS,EAAE;wBAChC,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;4BAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;4BAE1D,IAAI,CAAC;gCACH,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gCACxB,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;gCAExB,4CAA4C;gCAE5C,6DAA6D;gCAC7D,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oCACpD,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gCAChC,CAAC;qCAAM,CAAC;oCACN,gDAAgD;oCAChD,YAAY,CAAC,cAAc,CAAC,CAAC;gCAC/B,CAAC;4BACH,CAAC;4BAAC,MAAM,CAAC;gCACP,iDAAiD;gCACjD,gDAAgD;4BAClD,CAAC;wBACH,CAAC;6BAAM,IAAI,UAAU,EAAE,CAAC;4BACtB,IAAI,YAAY,EAAE,CAAC;gCACjB,YAAY,CAAC,YAAY,CAAC,CAAC;4BAC7B,CAAC;4BAED,kDAAkD;4BAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gCAC3B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACzB,CAAC;4BAED,2CAA2C;4BAC3C,UAAU,CAAC,GAAG,EAAE;gCACd,IAAI,UAAU,EAAE,CAAC;oCACf,IAAI,CAAC;wCACH,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oCAClC,CAAC;oCAAC,MAAM,CAAC;wCACP,8BAA8B;oCAChC,CAAC;gCACH,CAAC;4BACH,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,0CAA0C;wBACpD,CAAC;oBACH,CAAC,CAAC;oBAEF,0CAA0C;oBAC1C,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC7B,kDAAkD;oBACpD,CAAC,EAAE,YAAY,CAAC,CAAC;oBAEjB,cAAc,EAAE,CAAC;gBACnB,CAAC;gBAED,sBAAsB;gBACtB,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;oBACjC,OAAO,EAAE,CAAC;oBAEV,sEAAsE;oBACtE,iEAAiE;oBACjE,IAAI,kBAAkB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;wBACzC,MAAM,CAAC,KAAK,CAAC,KAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACtC,MAAM,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;wBACnG,MAAM,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC;wBAClH,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;wBAC9C,MAAM,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;wBACxF,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;wBACrE,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;wBACnE,MAAM,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC;wBAClH,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAG,IAAI,CAAC,CAAC;oBACxC,CAAC;oBAED,wBAAwB;oBACxB,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;oBAExD,OAAO,CAAC;wBACN,QAAQ,EAAE,CAAC,kBAAkB,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;wBAC/D,UAAU,EAAE,cAAc;wBAC1B,UAAU,EAAE,YAAY;wBACxB,SAAS;wBACT,KAAK,EAAE,CAAC,kBAAkB,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yEAAyE,CAAC,CAAC,CAAC,SAAS;qBACtI,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YAGL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,0CAA0C;gBAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBAED,OAAO,CAAC;oBACN,QAAQ,EAAE,CAAC;oBACX,UAAU,EAAE,cAAc;oBAC1B,UAAU,EAAE,YAAY;oBACxB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,gBAAwB,EAAE;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,4CAA4C;gBAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBAAA,SAAS;gBAAA,CAAC;gBAEhF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;gBAC/D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEtC,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;oBAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ export interface InstalledPackageInfo {
2
+ name: string;
3
+ version: string;
4
+ promptDirs: string[];
5
+ }
6
+ export declare class GlobalPackageManager {
7
+ private packagesDir;
8
+ constructor(dataDir: string);
9
+ getPackagesDir(): string;
10
+ getNodeModulesDir(): string;
11
+ ensureInitialized(): Promise<void>;
12
+ install(packageSpec: string): Promise<InstalledPackageInfo>;
13
+ update(packageName?: string): Promise<void>;
14
+ uninstall(packageName: string): Promise<void>;
15
+ getInstalledVersion(packageName: string): Promise<string | null>;
16
+ detectPromptDirs(packageName: string): Promise<string[]>;
17
+ }
18
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/services/package-manager.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,MAAM;IAI3B,cAAc,IAAI,MAAM;IAIxB,iBAAiB,IAAI,MAAM;IAIrB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqB3D,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWhE,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAwD/D"}
@@ -0,0 +1,141 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { cosmiconfig } from 'cosmiconfig';
4
+ import { execa } from 'execa';
5
+ import fs2 from 'fs-extra';
6
+ import { logger } from '../utils/logger.js';
7
+ export class GlobalPackageManager {
8
+ packagesDir;
9
+ constructor(dataDir) {
10
+ this.packagesDir = path.join(dataDir, 'packages');
11
+ }
12
+ getPackagesDir() {
13
+ return this.packagesDir;
14
+ }
15
+ getNodeModulesDir() {
16
+ return path.join(this.packagesDir, 'node_modules');
17
+ }
18
+ async ensureInitialized() {
19
+ await fs2.ensureDir(this.packagesDir);
20
+ const pkgJsonPath = path.join(this.packagesDir, 'package.json');
21
+ if (!await fs2.pathExists(pkgJsonPath)) {
22
+ await fs2.writeJson(pkgJsonPath, {
23
+ name: 'pupt-packages',
24
+ private: true,
25
+ dependencies: {},
26
+ }, { spaces: 2 });
27
+ }
28
+ }
29
+ async install(packageSpec) {
30
+ await this.ensureInitialized();
31
+ logger.log(`Installing ${packageSpec}...`);
32
+ try {
33
+ await execa('npm', ['install', packageSpec], {
34
+ cwd: this.packagesDir,
35
+ stdio: 'inherit',
36
+ });
37
+ }
38
+ catch (error) {
39
+ const errorMessage = error instanceof Error ? error.message : String(error);
40
+ throw new Error(`Failed to install package: ${errorMessage}`);
41
+ }
42
+ const version = await this.getInstalledVersion(packageSpec) ?? 'unknown';
43
+ const promptDirs = await this.detectPromptDirs(packageSpec);
44
+ return { name: packageSpec, version, promptDirs };
45
+ }
46
+ async update(packageName) {
47
+ await this.ensureInitialized();
48
+ const args = packageName
49
+ ? ['update', packageName]
50
+ : ['update'];
51
+ try {
52
+ await execa('npm', args, {
53
+ cwd: this.packagesDir,
54
+ stdio: 'inherit',
55
+ });
56
+ }
57
+ catch (error) {
58
+ const errorMessage = error instanceof Error ? error.message : String(error);
59
+ throw new Error(`Failed to update package${packageName ? ` "${packageName}"` : 's'}: ${errorMessage}`);
60
+ }
61
+ }
62
+ async uninstall(packageName) {
63
+ await this.ensureInitialized();
64
+ try {
65
+ await execa('npm', ['uninstall', packageName], {
66
+ cwd: this.packagesDir,
67
+ stdio: 'inherit',
68
+ });
69
+ }
70
+ catch (error) {
71
+ const errorMessage = error instanceof Error ? error.message : String(error);
72
+ throw new Error(`Failed to uninstall package "${packageName}": ${errorMessage}`);
73
+ }
74
+ }
75
+ async getInstalledVersion(packageName) {
76
+ const packagePath = path.join(this.packagesDir, 'node_modules', packageName, 'package.json');
77
+ try {
78
+ const content = await fs.readFile(packagePath, 'utf-8');
79
+ const pkg = JSON.parse(content);
80
+ return pkg.version ?? null;
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ async detectPromptDirs(packageName) {
87
+ const packagePath = path.join(this.packagesDir, 'node_modules', packageName);
88
+ // 1. Check for .pt-config.json in the package
89
+ const explorer = cosmiconfig('pt', {
90
+ searchPlaces: [
91
+ '.pt-config',
92
+ '.pt-config.json',
93
+ '.pt-config.yaml',
94
+ '.pt-config.yml',
95
+ '.pt-config.js',
96
+ '.pt-config.cjs',
97
+ 'pt.config.js',
98
+ ],
99
+ stopDir: packagePath,
100
+ });
101
+ try {
102
+ const result = await explorer.load(path.join(packagePath, '.pt-config.json'));
103
+ if (result?.config?.promptDirs) {
104
+ return result.config.promptDirs;
105
+ }
106
+ }
107
+ catch {
108
+ // Try other formats
109
+ for (const configName of ['.pt-config.yaml', '.pt-config.yml', '.pt-config.js', '.pt-config.cjs', 'pt.config.js', '.pt-config']) {
110
+ try {
111
+ const result = await explorer.load(path.join(packagePath, configName));
112
+ if (result?.config?.promptDirs) {
113
+ return result.config.promptDirs;
114
+ }
115
+ }
116
+ catch {
117
+ // Continue
118
+ }
119
+ }
120
+ }
121
+ // 2. Check package.json pupt.promptDirs field
122
+ try {
123
+ const pkgJsonPath = path.join(packagePath, 'package.json');
124
+ const content = await fs.readFile(pkgJsonPath, 'utf-8');
125
+ const pkg = JSON.parse(content);
126
+ if (pkg.pupt?.promptDirs && Array.isArray(pkg.pupt.promptDirs)) {
127
+ return pkg.pupt.promptDirs;
128
+ }
129
+ }
130
+ catch {
131
+ // No package.json or no pupt field
132
+ }
133
+ // 3. Fall back to checking for prompts/ directory
134
+ const promptsDir = path.join(packagePath, 'prompts');
135
+ if (await fs2.pathExists(promptsDir)) {
136
+ return ['prompts'];
137
+ }
138
+ return [];
139
+ }
140
+ }
141
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/services/package-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ParsedAnnotation } from '../types/annotations.js';
2
+ import type { Pattern } from '../types/patterns.js';
3
+ export declare class PatternDetector {
4
+ private readonly MIN_FREQUENCY_THRESHOLD;
5
+ detectPatterns(annotations: ParsedAnnotation[]): Pattern[];
6
+ private detectVerificationGaps;
7
+ private detectIncompleteTasks;
8
+ private detectEnvironmentSpecificFailures;
9
+ private detectAmbiguousObjectives;
10
+ private calculateSeverity;
11
+ private calculateCorrelationStrength;
12
+ private getUniquePrompts;
13
+ private truncateEvidence;
14
+ }
15
+ //# sourceMappingURL=pattern-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-detector.d.ts","sourceRoot":"","sources":["../../src/services/pattern-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAE9D,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAK;IAE7C,cAAc,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE;IA8B1D,OAAO,CAAC,sBAAsB;IAuC9B,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,iCAAiC;IAsEzC,OAAO,CAAC,yBAAyB;IAkCjC,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,4BAA4B;IAgCpC,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,gBAAgB;CAMzB"}